FD.io VPP  v17.01-9-ge7dcee4
Vector Packet Processing
trace_util.h
Go to the documentation of this file.
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;
46  /* Configured node-id */
51 
52 typedef struct
53 {
54  /* Name of the default profile list in use */
56 
57  /* API message ID base */
59 
60  /* convenience */
63 } trace_main_t;
64 
66 
67 /*
68  * Initialize Trace profile
69  */
70 int trace_util_init (void);
71 
72 
73 /*
74  * Find a trace profile
75  */
76 
79 {
80  trace_main_t *sm = &trace_main;
81 
82  return (&(sm->profile));
83 }
84 
85 
86 /* setup and clean up profile */
89 
90 void clear_trace_profiles (void);
91 
92 
93 
94 #define BIT_TTL_NODEID (1<<0)
95 #define BIT_ING_INTERFACE (1<<1)
96 #define BIT_EGR_INTERFACE (1<<2)
97 #define BIT_TIMESTAMP (1<<3)
98 #define BIT_APPDATA (1<<4)
99 #define TRACE_TYPE_MASK 0x1F /* Mask of all above bits */
100 
101 /*
102  0x00011111 iOAM-trace-type is 0x00011111 then the format of node
103  data is:
104 
105  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
106  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
107  | Hop_Lim | node_id |
108  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
109  | ingress_if_id | egress_if_id |
110  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
111  + timestamp +
112  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
113  | app_data |
114  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
115 
116 */
117 #define TRACE_TYPE_IF_TS_APP 0x1f
118 typedef struct
119 {
126 
127 /*
128  0x00000111 iOAM-trace-type is 0x00000111 then the format is:
129 
130  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
131  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
132  | Hop_Lim | node_id |
133  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
134  | ingress_if_id | egress_if_id |
135  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
136 
137 */
138 
139 #define TRACE_TYPE_IF 0x03
140 typedef struct
141 {
146 
147 /*
148  0x00001001 iOAM-trace-type is 0x00001001 then the format is:
149 
150  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
151  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
152  | Hop_Lim | node_id |
153  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
154  + timestamp +
155  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
156 
157 */
158 
159 #define TRACE_TYPE_TS 0x09
160 typedef struct
161 {
165 
166 /*
167  0x00010001 iOAM-trace-type is 0x00010001 then the format is:
168 
169 
170  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
171  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
172  | Hop_Lim | node_id |
173  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
174  | app_data |
175  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
176 
177 */
178 
179 
180 #define TRACE_TYPE_APP 0x11
181 typedef struct
182 {
186 
187 /*
188 
189  0x00011001 iOAM-trace-type is 0x00011001 then the format is:
190 
191  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
192  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
193  | Hop_Lim | node_id |
194  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
195  + timestamp +
196  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
197  | app_data |
198  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
199 */
200 
201 #define TRACE_TYPE_TS_APP 0x19
202 typedef struct
203 {
208 
209 
210 
211 static inline u8
213 {
214  u8 trace_data_size = 0;
215 
216  if (trace_type == TRACE_TYPE_IF_TS_APP)
217  trace_data_size = sizeof (ioam_trace_if_ts_app_t);
218  else if (trace_type == TRACE_TYPE_IF)
219  trace_data_size = sizeof (ioam_trace_if_t);
220  else if (trace_type == TRACE_TYPE_TS)
221  trace_data_size = sizeof (ioam_trace_ts_t);
222  else if (trace_type == TRACE_TYPE_APP)
223  trace_data_size = sizeof (ioam_trace_app_t);
224  else if (trace_type == TRACE_TYPE_TS_APP)
225  trace_data_size = sizeof (ioam_trace_ts_app_t);
226 
227  return trace_data_size;
228 }
229 
230 int ioam_trace_get_sizeof_handler (u32 * result);
231 int ip6_trace_profile_setup (void);
232 int ip6_trace_profile_cleanup (void);
233 
234 #define TSP_SECONDS 0
235 #define TSP_MILLISECONDS 1
236 #define TSP_MICROSECONDS 2
237 #define TSP_NANOSECONDS 3
238 
239 #endif
240 
241 /*
242  * fd.io coding-style-patch-verification: ON
243  *
244  * Local Variables:
245  * eval: (c-set-style "gnu")
246  * End:
247  */
#define TRACE_TYPE_IF_TS_APP
Definition: trace_util.h:117
int trace_util_init(void)
Definition: trace_util.c:46
int ip6_trace_profile_cleanup(void)
vnet_main_t * vnet_main
Definition: trace_util.h:62
trace_profile profile
Definition: trace_util.h:55
#define always_inline
Definition: clib.h:84
int ioam_trace_get_sizeof_handler(u32 *result)
#define TRACE_TYPE_IF
Definition: trace_util.h:139
static u8 fetch_trace_data_size(u8 trace_type)
Definition: trace_util.h:212
u16 msg_id_base
Definition: trace_util.h:58
#define TRACE_TYPE_TS_APP
Definition: trace_util.h:201
#define TRACE_TYPE_TS
Definition: trace_util.h:159
unsigned int u32
Definition: types.h:88
unsigned short u16
Definition: types.h:57
unsigned char u8
Definition: types.h:56
trace_main_t trace_main
Definition: trace_util.c:22
void clear_trace_profiles(void)
Definition: trace_util.c:95
int ip6_trace_profile_setup(void)
static trace_profile * trace_profile_find(void)
Definition: trace_util.h:78
#define TRACE_TYPE_APP
Definition: trace_util.h:180
int trace_profile_create(trace_profile *profile, u8 trace_type, u8 num_elts, u32 trace_tsp, u32 node_id, u32 app_data)
Definition: trace_util.c:56
struct trace_profile_ trace_profile
Usage:
vlib_main_t * vlib_main
Definition: trace_util.h:61