VPPAPIGEN: vppapigen replacement in Python PLY.
[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
66 /*
67  * Initialize Trace profile
68  */
69 int trace_util_init (void);
70
71
72 /* setup and clean up profile */
73 int trace_profile_create (trace_profile * profile, u8 trace_type, u8 num_elts,
74                           u32 trace_tsp, u32 node_id, u32 app_data);
75
76 void clear_trace_profiles (void);
77
78 /* *INDENT-OFF* */
79 typedef CLIB_PACKED (struct
80 {
81   u8 ioam_trace_type;
82   u8 data_list_elts_left;
83   u32 elts[0]; /* Variable type. So keep it generic */
84 }) ioam_trace_hdr_t;
85 /* *INDENT-ON* */
86
87
88
89 #define    BIT_TTL_NODEID       (1<<0)
90 #define    BIT_ING_INTERFACE    (1<<1)
91 #define    BIT_EGR_INTERFACE    (1<<2)
92 #define    BIT_TIMESTAMP        (1<<3)
93 #define    BIT_APPDATA          (1<<4)
94 #define    BIT_LOOPBACK         (1<<5)
95 #define    BIT_LOOPBACK_REPLY   (1<<6)
96 #define    TRACE_TYPE_MASK      0x7F    /* Mask of all above bits */
97
98 #define    TRACE_TYPE_IF_TS_APP_LOOP    0x3F
99
100 /*
101      0x00011111  iOAM-trace-type is 0x00011111 then the format of node
102         data is:
103
104           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
105          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
106          |   Hop_Lim     |              node_id                          |
107          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
108          |     ingress_if_id             |         egress_if_id          |
109          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
110          +                           timestamp                           +
111          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
112          |                            app_data                           |
113          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
114
115 */
116 #define   TRACE_TYPE_IF_TS_APP   0x1f
117 typedef struct
118 {
119   u32 ttl_node_id;
120   u16 ingress_if;
121   u16 egress_if;
122   u32 timestamp;
123   u32 app_data;
124 } ioam_trace_if_ts_app_t;
125
126 /*
127      0x00000111  iOAM-trace-type is 0x00000111 then the format is:
128
129           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
130          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
131          |   Hop_Lim     |              node_id                          |
132          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
133          |     ingress_if_id             |         egress_if_id          |
134          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
135
136 */
137
138 #define   TRACE_TYPE_IF   0x03
139 typedef struct
140 {
141   u32 ttl_node_id;
142   u16 ingress_if;
143   u16 egress_if;
144 } ioam_trace_if_t;
145
146 /*
147      0x00001001  iOAM-trace-type is 0x00001001 then the format is:
148
149           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
150          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
151          |   Hop_Lim     |              node_id                          |
152          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
153          +                           timestamp                           +
154          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
155
156 */
157
158 #define   TRACE_TYPE_TS   0x09
159 typedef struct
160 {
161   u32 ttl_node_id;
162   u32 timestamp;
163 } ioam_trace_ts_t;
164
165 /*
166      0x00010001  iOAM-trace-type is 0x00010001 then the format is:
167
168
169           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
170          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
171          |   Hop_Lim     |              node_id                          |
172          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
173          |                            app_data                           |
174          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
175
176 */
177
178
179 #define   TRACE_TYPE_APP   0x11
180 typedef struct
181 {
182   u32 ttl_node_id;
183   u32 app_data;
184 } ioam_trace_app_t;
185
186 /*
187
188      0x00011001  iOAM-trace-type is 0x00011001 then the format is:
189
190           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
191          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
192          |   Hop_Lim     |              node_id                          |
193          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
194          +                           timestamp                           +
195          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
196          |                            app_data                           |
197          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
198 */
199
200 #define   TRACE_TYPE_TS_APP   0x19
201 typedef struct
202 {
203   u32 ttl_node_id;
204   u32 timestamp;
205   u32 app_data;
206 } ioam_trace_ts_app_t;
207
208 static inline u8
209 fetch_trace_data_size (u16 trace_type)
210 {
211   u8 trace_data_size = 0;
212
213   if ((trace_type & TRACE_TYPE_IF_TS_APP) == TRACE_TYPE_IF_TS_APP)
214     trace_data_size = sizeof (ioam_trace_if_ts_app_t);
215   else if ((trace_type & TRACE_TYPE_IF) == TRACE_TYPE_IF)
216     trace_data_size = sizeof (ioam_trace_if_t);
217   else if ((trace_type & TRACE_TYPE_TS) == TRACE_TYPE_TS)
218     trace_data_size = sizeof (ioam_trace_ts_t);
219   else if ((trace_type & TRACE_TYPE_APP) == TRACE_TYPE_APP)
220     trace_data_size = sizeof (ioam_trace_app_t);
221   else if ((trace_type & TRACE_TYPE_TS_APP) == TRACE_TYPE_TS_APP)
222     trace_data_size = sizeof (ioam_trace_ts_app_t);
223
224   return trace_data_size;
225 }
226
227 always_inline void
228 ioam_trace_set_bit (ioam_trace_hdr_t * trace_hdr, u8 trace_bit)
229 {
230   trace_hdr->ioam_trace_type |= trace_bit;
231 }
232
233 always_inline void
234 ioam_trace_reset_bit (ioam_trace_hdr_t * trace_hdr, u8 trace_bit)
235 {
236   trace_hdr->ioam_trace_type &= (~trace_bit);
237 }
238
239 int ioam_trace_get_sizeof_handler (u32 * result);
240 int ip6_trace_profile_setup (void);
241 int ip6_trace_profile_cleanup (void);
242
243 #define TSP_SECONDS              0
244 #define TSP_MILLISECONDS         1
245 #define TSP_MICROSECONDS         2
246 #define TSP_NANOSECONDS          3
247
248 #endif
249
250 /*
251  * fd.io coding-style-patch-verification: ON
252  *
253  * Local Variables:
254  * eval: (c-set-style "gnu")
255  * End:
256  */