VPP-632 : InBand OAM Analyser
[vpp.git] / src / plugins / ioam / lib-trace / trace_util.h
1 /*
2  * trace_util.h -- Trace Profile Utility header
3  *
4  * Copyright (c) 2016 Cisco and/or its affiliates.
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at:
8  *
9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17
18 #ifndef include_vnet_trace_util_h
19 #define include_vnet_trace_util_h
20
21 #define debug_ioam debug_ioam_fn
22
23
24 /**
25  * Usage:
26  *
27  * On any node that participates in iOAM Trace.
28  *
29  * Step 1: Initialize this library by calling trace_init()
30  * Step 2: Setup a trace  profile that contains all the parameters needed to compute cumulative:
31  *         Call these functions:
32  *         trace_profile_find
33  *         trace_profile_create
34  * Step 2a: On initial node enable the profile to be used:
35  *          trace_profile_set_active / trace_profile_get_active will return the profile
36  * Step 4: TBD
37  *         trace_validate
38  *
39  */
40
41 typedef struct trace_profile_
42 {
43   u8 valid:1;
44   u8 trace_type;
45   u8 num_elts;
46   /* Configured node-id */
47   u32 node_id;
48   u32 app_data;
49   u32 trace_tsp;
50 } trace_profile;
51
52 typedef struct
53 {
54   /* Name of the default profile list in use */
55   trace_profile profile;
56
57   /* API message ID base */
58   u16 msg_id_base;
59
60   /* convenience */
61   vlib_main_t *vlib_main;
62   vnet_main_t *vnet_main;
63 } trace_main_t;
64
65 extern trace_main_t trace_main;
66
67 /*
68  * Initialize Trace profile
69  */
70 int trace_util_init (void);
71
72
73 /*
74  * Find a trace profile
75  */
76
77 always_inline trace_profile *
78 trace_profile_find (void)
79 {
80   trace_main_t *sm = &trace_main;
81
82   return (&(sm->profile));
83 }
84
85
86 /* setup and clean up profile */
87 int trace_profile_create (trace_profile * profile, u8 trace_type, u8 num_elts,
88                           u32 trace_tsp, u32 node_id, u32 app_data);
89
90 void clear_trace_profiles (void);
91
92 /* *INDENT-OFF* */
93 typedef CLIB_PACKED (struct
94 {
95   u8 ioam_trace_type;
96   u8 data_list_elts_left;
97   u32 elts[0];  /* Variable type. So keep it generic */
98 }) ioam_trace_hdr_t;
99 /* *INDENT-ON* */
100
101 #define    BIT_TTL_NODEID       (1<<0)
102 #define    BIT_ING_INTERFACE    (1<<1)
103 #define    BIT_EGR_INTERFACE    (1<<2)
104 #define    BIT_TIMESTAMP        (1<<3)
105 #define    BIT_APPDATA          (1<<4)
106 #define    TRACE_TYPE_MASK      0x1F    /* Mask of all above bits */
107
108 /*
109      0x00011111  iOAM-trace-type is 0x00011111 then the format of node
110         data is:
111
112           0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
113          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
114          |   Hop_Lim     |              node_id                          |
115          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
116          |     ingress_if_id             |         egress_if_id          |
117          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
118          +                           timestamp                           +
119          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
120          |                            app_data                           |
121          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
122
123 */
124 #define   TRACE_TYPE_IF_TS_APP   0x1f
125 typedef struct
126 {
127   u32 ttl_node_id;
128   u16 ingress_if;
129   u16 egress_if;
130   u32 timestamp;
131   u32 app_data;
132 } ioam_trace_if_ts_app_t;
133
134 /*
135      0x00000111  iOAM-trace-type is 0x00000111 then the format is:
136
137           0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
138          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
139          |   Hop_Lim     |              node_id                          |
140          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
141          |     ingress_if_id             |         egress_if_id          |
142          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
143
144 */
145
146 #define   TRACE_TYPE_IF   0x03
147 typedef struct
148 {
149   u32 ttl_node_id;
150   u16 ingress_if;
151   u16 egress_if;
152 } ioam_trace_if_t;
153
154 /*
155      0x00001001  iOAM-trace-type is 0x00001001 then the format is:
156
157           0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
158          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
159          |   Hop_Lim     |              node_id                          |
160          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
161          +                           timestamp                           +
162          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
163
164 */
165
166 #define   TRACE_TYPE_TS   0x09
167 typedef struct
168 {
169   u32 ttl_node_id;
170   u32 timestamp;
171 } ioam_trace_ts_t;
172
173 /*
174      0x00010001  iOAM-trace-type is 0x00010001 then the format is:
175
176
177           0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
178          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
179          |   Hop_Lim     |              node_id                          |
180          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
181          |                            app_data                           |
182          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
183
184 */
185
186
187 #define   TRACE_TYPE_APP   0x11
188 typedef struct
189 {
190   u32 ttl_node_id;
191   u32 app_data;
192 } ioam_trace_app_t;
193
194 /*
195
196      0x00011001  iOAM-trace-type is 0x00011001 then the format is:
197
198           0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
199          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
200          |   Hop_Lim     |              node_id                          |
201          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
202          +                           timestamp                           +
203          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
204          |                            app_data                           |
205          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
206 */
207
208 #define   TRACE_TYPE_TS_APP   0x19
209 typedef struct
210 {
211   u32 ttl_node_id;
212   u32 timestamp;
213   u32 app_data;
214 } ioam_trace_ts_app_t;
215
216
217
218 static inline u8
219 fetch_trace_data_size (u8 trace_type)
220 {
221   u8 trace_data_size = 0;
222
223   if (trace_type == TRACE_TYPE_IF_TS_APP)
224     trace_data_size = sizeof (ioam_trace_if_ts_app_t);
225   else if (trace_type == TRACE_TYPE_IF)
226     trace_data_size = sizeof (ioam_trace_if_t);
227   else if (trace_type == TRACE_TYPE_TS)
228     trace_data_size = sizeof (ioam_trace_ts_t);
229   else if (trace_type == TRACE_TYPE_APP)
230     trace_data_size = sizeof (ioam_trace_app_t);
231   else if (trace_type == TRACE_TYPE_TS_APP)
232     trace_data_size = sizeof (ioam_trace_ts_app_t);
233
234   return trace_data_size;
235 }
236
237 int ioam_trace_get_sizeof_handler (u32 * result);
238 int ip6_trace_profile_setup (void);
239 int ip6_trace_profile_cleanup (void);
240
241 #define TSP_SECONDS              0
242 #define TSP_MILLISECONDS         1
243 #define TSP_MICROSECONDS         2
244 #define TSP_NANOSECONDS          3
245
246 #endif
247
248 /*
249  * fd.io coding-style-patch-verification: ON
250  *
251  * Local Variables:
252  * eval: (c-set-style "gnu")
253  * End:
254  */