2 * trace_util.h -- Trace Profile Utility header
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:
9 * http://www.apache.org/licenses/LICENSE-2.0
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.
18 #ifndef include_vnet_trace_util_h
19 #define include_vnet_trace_util_h
21 #define debug_ioam debug_ioam_fn
27 * On any node that participates in iOAM Trace.
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:
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
41 typedef struct trace_profile_
46 /* Configured node-id */
54 /* Name of the default profile list in use */
55 trace_profile profile;
57 /* API message ID base */
61 vlib_main_t *vlib_main;
62 vnet_main_t *vnet_main;
67 * Initialize Trace profile
69 int trace_util_init (void);
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);
76 void clear_trace_profiles (void);
78 typedef CLIB_PACKED (struct
81 u8 data_list_elts_left;
82 u32 elts[0]; /* Variable type. So keep it generic */
87 #define BIT_TTL_NODEID (1<<0)
88 #define BIT_ING_INTERFACE (1<<1)
89 #define BIT_EGR_INTERFACE (1<<2)
90 #define BIT_TIMESTAMP (1<<3)
91 #define BIT_APPDATA (1<<4)
92 #define BIT_LOOPBACK (1<<5)
93 #define BIT_LOOPBACK_REPLY (1<<6)
94 #define TRACE_TYPE_MASK 0x7F /* Mask of all above bits */
96 #define TRACE_TYPE_IF_TS_APP_LOOP 0x3F
99 0x00011111 iOAM-trace-type is 0x00011111 then the format of node
102 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
103 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
104 | Hop_Lim | node_id |
105 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
106 | ingress_if_id | egress_if_id |
107 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
109 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
111 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
114 #define TRACE_TYPE_IF_TS_APP 0x1f
122 } ioam_trace_if_ts_app_t;
125 0x00000111 iOAM-trace-type is 0x00000111 then the format is:
127 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
128 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
129 | Hop_Lim | node_id |
130 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
131 | ingress_if_id | egress_if_id |
132 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
136 #define TRACE_TYPE_IF 0x03
145 0x00001001 iOAM-trace-type is 0x00001001 then the format is:
147 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
148 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
149 | Hop_Lim | node_id |
150 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
152 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
156 #define TRACE_TYPE_TS 0x09
164 0x00010001 iOAM-trace-type is 0x00010001 then the format is:
167 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
168 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
169 | Hop_Lim | node_id |
170 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
172 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
177 #define TRACE_TYPE_APP 0x11
186 0x00011001 iOAM-trace-type is 0x00011001 then the format is:
188 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
189 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
190 | Hop_Lim | node_id |
191 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
193 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
195 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
198 #define TRACE_TYPE_TS_APP 0x19
204 } ioam_trace_ts_app_t;
207 fetch_trace_data_size (u16 trace_type)
209 u8 trace_data_size = 0;
211 if ((trace_type & TRACE_TYPE_IF_TS_APP) == TRACE_TYPE_IF_TS_APP)
212 trace_data_size = sizeof (ioam_trace_if_ts_app_t);
213 else if ((trace_type & TRACE_TYPE_IF) == TRACE_TYPE_IF)
214 trace_data_size = sizeof (ioam_trace_if_t);
215 else if ((trace_type & TRACE_TYPE_TS) == TRACE_TYPE_TS)
216 trace_data_size = sizeof (ioam_trace_ts_t);
217 else if ((trace_type & TRACE_TYPE_APP) == TRACE_TYPE_APP)
218 trace_data_size = sizeof (ioam_trace_app_t);
219 else if ((trace_type & TRACE_TYPE_TS_APP) == TRACE_TYPE_TS_APP)
220 trace_data_size = sizeof (ioam_trace_ts_app_t);
222 return trace_data_size;
226 ioam_trace_set_bit (ioam_trace_hdr_t * trace_hdr, u8 trace_bit)
228 trace_hdr->ioam_trace_type |= trace_bit;
232 ioam_trace_reset_bit (ioam_trace_hdr_t * trace_hdr, u8 trace_bit)
234 trace_hdr->ioam_trace_type &= (~trace_bit);
237 int ioam_trace_get_sizeof_handler (u32 * result);
238 int ip6_trace_profile_setup (void);
239 int ip6_trace_profile_cleanup (void);
241 #define TSP_SECONDS 0
242 #define TSP_MILLISECONDS 1
243 #define TSP_MICROSECONDS 2
244 #define TSP_NANOSECONDS 3
249 * fd.io coding-style-patch-verification: ON
252 * eval: (c-set-style "gnu")