Line data Source code
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 0 : fetch_trace_data_size (u16 trace_type) 210 : { 211 0 : u8 trace_data_size = 0; 212 : 213 0 : if ((trace_type & TRACE_TYPE_IF_TS_APP) == TRACE_TYPE_IF_TS_APP) 214 0 : trace_data_size = sizeof (ioam_trace_if_ts_app_t); 215 0 : else if ((trace_type & TRACE_TYPE_IF) == TRACE_TYPE_IF) 216 0 : trace_data_size = sizeof (ioam_trace_if_t); 217 0 : else if ((trace_type & TRACE_TYPE_TS) == TRACE_TYPE_TS) 218 0 : trace_data_size = sizeof (ioam_trace_ts_t); 219 0 : else if ((trace_type & TRACE_TYPE_APP) == TRACE_TYPE_APP) 220 0 : trace_data_size = sizeof (ioam_trace_app_t); 221 0 : else if ((trace_type & TRACE_TYPE_TS_APP) == TRACE_TYPE_TS_APP) 222 0 : trace_data_size = sizeof (ioam_trace_ts_app_t); 223 : 224 0 : return trace_data_size; 225 : } 226 : 227 : always_inline void 228 0 : ioam_trace_set_bit (ioam_trace_hdr_t * trace_hdr, u8 trace_bit) 229 : { 230 0 : trace_hdr->ioam_trace_type |= trace_bit; 231 0 : } 232 : 233 : always_inline void 234 0 : ioam_trace_reset_bit (ioam_trace_hdr_t * trace_hdr, u8 trace_bit) 235 : { 236 0 : trace_hdr->ioam_trace_type &= (~trace_bit); 237 0 : } 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 : */