Changes in / [67fdca0:b9af56e]
- Location:
- lib
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
lib/libtrace.h.in
r58c226e r58c226e 576 576 TRACE_ETHERTYPE_RARP = 0x8035, /**< Reverse ARP */ 577 577 TRACE_ETHERTYPE_8021Q = 0x8100, /**< 802.1q VLAN Extended Header */ 578 TRACE_ETHERTYPE_8021QS = 0x88A8, /**< 802.1q Service VLAN tag */ 578 579 TRACE_ETHERTYPE_IPV6 = 0x86DD, /**< IPv6 */ 579 580 TRACE_ETHERTYPE_MPLS = 0x8847, /**< MPLS Unicast traffic */ … … 582 583 TRACE_ETHERTYPE_PPP_SES = 0x8864 /**< PPPoE Session Messages */ 583 584 } libtrace_ethertype_t; 585 586 /** constant to check if a vlan was found */ 587 #define VLAN_NOT_FOUND 0xFF 588 589 /** constant to check if a mpls label was found */ 590 #define MPLS_NOT_FOUND 0xFFFF 591 592 typedef struct libtrace_layer2_header { 593 uint16_t ethertype; /**< Ethertype of the header */ 594 void *data; /**< Pointer to the header */ 595 } libtrace_layer2_header_t; 596 typedef struct libtrace_layer2_headers { 597 uint64_t bitmask; /**< Bitmask of found headers */ 598 int num; /**< The number of header */ 599 libtrace_layer2_header_t *header; /**< Array of all found layer2 headers */ 600 } libtrace_layer2_headers_t; 601 /** Enumeration of bitmask layer2 headers within libtrace_layer2_headers_t */ 602 enum { 603 TRACE_BITMASK_LOOPBACK = 1, 604 TRACE_BITMASK_IP = 2, 605 TRACE_BITMASK_ARP = 4, 606 TRACE_BITMASK_RARP = 8, 607 TRACE_BITMASK_8021Q = 16, 608 TRACE_BITMASK_IPV6 = 32, 609 TRACE_BITMASK_8021QS = 64, 610 TRACE_BITMASK_MPLS = 128, 611 TRACE_BITMASK_MPLS_MC = 256, 612 TRACE_BITMASK_PPP_DISC = 512, 613 TRACE_BITMASK_PPP_SES = 1024, 614 }; 584 615 585 616 /** Enumeration of datatype returned inside libtrace_meta_item_t structure */ … … 2445 2476 void *vlan, uint16_t *type, uint32_t *remaining); 2446 2477 2478 /** Get the outermost VLAN ID from a packet. 2479 * @param packet A pointer to the packet 2480 * @param[out] vlanptr A pointer to the VLAN header 2481 * @param[out] remaining Updated with the number of captured bytes remaining 2482 * 2483 * @return The outermost VLAN id if found or VLAN_NOT_FOUND 2484 * 2485 * vlanptr will be set to the start of the VLAN header found (or NULL if no 2486 * VLAN tags are present). 2487 * 2488 * remaining will be set to the number of captured bytes in the packet, 2489 * starting from the returned VLAN header. 2490 */ 2491 DLLEXPORT uint16_t trace_get_outermost_vlan( 2492 libtrace_packet_t *packet, uint8_t **vlanptr, uint32_t *remaining); 2493 2494 /** Get all layer2 headers from a packet. 2495 * @param packet A pointer to the packet 2496 * 2497 * @return A libtrace_layer2_headers_t structure containing all found layer2 2498 * headers (or NULL if no layer2 headers are found). This structure must be 2499 * destroyed with trace_destroy_layer2_headers(). 2500 */ 2501 DLLEXPORT libtrace_layer2_headers_t *trace_get_layer2_headers(libtrace_packet_t *packet); 2502 2503 /** Destroys a libtrace_layer2_headers_t structure. 2504 * @param headers A pointer to the libtrace_layer2_headers_t structure 2505 * 2506 * @returns 1 on successful deletion. 2507 */ 2508 DLLEXPORT int trace_destroy_layer2_headers(libtrace_layer2_headers_t *headers); 2509 2510 /** Get the outermost MPLS label from a packet. 2511 * @param packet A pointer to the packet 2512 * @param[out] mplsptr A pointer to the mpls header 2513 * @param[out] remaining Updated with the number of captured bytes remaining 2514 * 2515 * @return The outmost MPLS label if found or MPLS_NOT_FOUND 2516 * 2517 * mplsptr will be set to the start of the MPLS header (or NULL if no 2518 * MPLS header is found) 2519 * 2520 * remaining will be set to the number of captured bytes in the packet, 2521 * starting from the MPLS header. 2522 */ 2523 DLLEXPORT uint32_t trace_get_outermost_mpls( 2524 libtrace_packet_t *packet, uint8_t **mplsptr, uint32_t *remaining); 2525 2447 2526 /** Gets a pointer to the payload following an MPLS header. 2448 2527 * @param mpls A pointer to the MPLS header -
lib/protocols_l2.c
r385678b r5e5b6ca 90 90 return (void*)((char *)ethernet + sizeof(*vlanhdr)); 91 91 92 } 93 94 int trace_destroy_layer2_headers(libtrace_layer2_headers_t *headers) { 95 if (headers == NULL) { 96 fprintf(stderr, "NULL libtrace_layer2_headers_t passed into " 97 "trace_destroy_layer2_headers()\n"); 98 return -1; 99 } 100 101 if (headers->header != NULL) { 102 free(headers->header); 103 } 104 free(headers); 105 return 1; 106 } 107 libtrace_layer2_headers_t *trace_get_layer2_headers(libtrace_packet_t *packet) { 108 109 char *ptr; 110 libtrace_linktype_t linktype; 111 uint32_t remaining; 112 uint16_t ethertype; 113 libtrace_layer2_headers_t *r; 114 int allocated_headers = 0; 115 116 if (packet == NULL) { 117 fprintf(stderr, "NULL packet passed into trace_get_layer2_headers()\n"); 118 return NULL; 119 } 120 if (packet->trace == NULL) { 121 fprintf(stderr, "Packet contains a NULL trace in trace_get_layer2_headers()\n"); 122 return NULL; 123 } 124 125 /* jump to layer 2 */ 126 ptr = trace_get_layer2(packet, &linktype, &remaining); 127 /* packet does not contain layer2 */ 128 if (ptr == NULL) { 129 return NULL; 130 } 131 132 /* allocate memory for the result */ 133 r = calloc(1, sizeof(libtrace_layer2_headers_t)); 134 if (r == NULL) { 135 trace_set_err(packet->trace, TRACE_ERR_OUT_OF_MEMORY, 136 "Unable to allocate memory in trace_get_layer2_headers()\n"); 137 return NULL; 138 } 139 /* Alloc enough space for 10 headers */ 140 r->header = calloc(1, sizeof(libtrace_layer2_header_t)*10); 141 if (r->header == NULL) { 142 trace_set_err(packet->trace, TRACE_ERR_OUT_OF_MEMORY, 143 "Unable to allocate memory in trace_get_layer2_headers()\n"); 144 free(r); 145 return NULL; 146 } 147 allocated_headers = 10; 148 149 /* get the first layer2 header */ 150 ptr = trace_get_payload_from_layer2(ptr, linktype, ðertype, &remaining); 151 152 while (remaining != 0 && ptr != NULL) { 153 154 if (ethertype == TRACE_ETHERTYPE_LOOPBACK || 155 ethertype == TRACE_ETHERTYPE_IP || 156 ethertype == TRACE_ETHERTYPE_ARP || 157 ethertype == TRACE_ETHERTYPE_RARP || 158 ethertype == TRACE_ETHERTYPE_8021Q || 159 ethertype == TRACE_ETHERTYPE_IPV6 || 160 ethertype == TRACE_ETHERTYPE_8021QS || 161 ethertype == TRACE_ETHERTYPE_MPLS || 162 ethertype == TRACE_ETHERTYPE_MPLS_MC || 163 ethertype == TRACE_ETHERTYPE_PPP_DISC || 164 ethertype == TRACE_ETHERTYPE_PPP_SES) { 165 166 /* Set the bitmask */ 167 switch (ethertype) { 168 case (TRACE_ETHERTYPE_LOOPBACK): 169 r->bitmask |= TRACE_BITMASK_LOOPBACK; 170 break; 171 case (TRACE_ETHERTYPE_IP): 172 r->bitmask |= TRACE_BITMASK_IP; 173 break; 174 case (TRACE_ETHERTYPE_ARP): 175 r->bitmask |= TRACE_BITMASK_ARP; 176 break; 177 case (TRACE_ETHERTYPE_RARP): 178 r->bitmask |= TRACE_BITMASK_RARP; 179 break; 180 case (TRACE_ETHERTYPE_8021Q): 181 r->bitmask |= TRACE_BITMASK_8021Q; 182 break; 183 case (TRACE_ETHERTYPE_IPV6): 184 r->bitmask |= TRACE_BITMASK_IPV6; 185 break; 186 case (TRACE_ETHERTYPE_8021QS): 187 r->bitmask |= TRACE_BITMASK_8021QS; 188 break; 189 case (TRACE_ETHERTYPE_MPLS): 190 r->bitmask |= TRACE_BITMASK_MPLS; 191 break; 192 case (TRACE_ETHERTYPE_MPLS_MC): 193 r->bitmask |= TRACE_BITMASK_MPLS_MC; 194 break; 195 case (TRACE_ETHERTYPE_PPP_DISC): 196 r->bitmask |= TRACE_BITMASK_PPP_DISC; 197 break; 198 case (TRACE_ETHERTYPE_PPP_SES): 199 r->bitmask |= TRACE_BITMASK_PPP_SES; 200 break; 201 } 202 203 if ((r->num+1) >= allocated_headers) { 204 allocated_headers += 10; 205 r->header = realloc(r->header, 206 sizeof(libtrace_layer2_header_t)*allocated_headers); 207 208 if (r->header == NULL) { 209 trace_set_err(packet->trace, TRACE_ERR_OUT_OF_MEMORY, 210 "Unable to allocate memory in trace_get_layer2_headers()"); 211 free(r); 212 return NULL; 213 } 214 } 215 216 r->header[r->num].ethertype = ethertype; 217 r->header[r->num++].data = ptr; 218 } 219 220 /* if the last ethertype was IP stop */ 221 if (ethertype == TRACE_ETHERTYPE_IP || ethertype == TRACE_ETHERTYPE_IPV6) { 222 break; 223 } 224 225 /* get the next header */ 226 ptr = trace_get_payload_from_layer2(ptr, linktype, ðertype, &remaining); 227 } 228 229 /* If no results were found free memory now and just return NULL */ 230 if (r->num == 0) { 231 free(r->header); 232 free(r); 233 return NULL; 234 } 235 236 return r; 237 } 238 239 uint16_t trace_get_outermost_vlan(libtrace_packet_t *packet, uint8_t **vlanptr, 240 uint32_t *remaining) { 241 242 uint8_t *ptr; 243 libtrace_linktype_t linktype; 244 uint32_t rem; 245 uint16_t vlanid = VLAN_NOT_FOUND; 246 uint16_t ethertype = 0; 247 248 if (!packet) { 249 fprintf(stderr, "NULL packet passed into trace_get_outermost_vlan()\n"); 250 *vlanptr = NULL; 251 *remaining = 0; 252 return vlanid; 253 } 254 255 ptr = trace_get_layer2(packet, &linktype, &rem); 256 /* No layer 2 */ 257 if (ptr == NULL) { 258 *vlanptr = NULL; 259 *remaining = 0; 260 return vlanid; 261 } 262 263 while (ethertype != TRACE_ETHERTYPE_8021Q && ethertype != TRACE_ETHERTYPE_8021QS) { 264 265 if (rem == 0 || ptr == NULL || ethertype == TRACE_ETHERTYPE_IP || 266 ethertype == TRACE_ETHERTYPE_IPV6) { 267 268 *vlanptr = NULL; 269 *remaining = 0; 270 return vlanid; 271 } 272 273 /* get the next layer 2 header */ 274 ptr = trace_get_payload_from_layer2(ptr, linktype, ðertype, &rem); 275 } 276 277 /* found a vlan header */ 278 uint32_t val = ntohl(*(uint32_t *)ptr); 279 /* the id portion is only 12 bits */ 280 vlanid = (((val >> 16) << 4) >> 4); 281 282 *remaining = rem; 283 *vlanptr = ptr; 284 return vlanid; 285 } 286 287 uint32_t trace_get_outermost_mpls(libtrace_packet_t *packet, uint8_t **mplsptr, 288 uint32_t *remaining) { 289 290 uint8_t *ptr; 291 uint32_t mplslabel = MPLS_NOT_FOUND; 292 libtrace_linktype_t linktype; 293 uint32_t rem; 294 uint16_t ethertype = 0; 295 296 if (!packet) { 297 fprintf(stderr, "NULL packet passed into trace_get_outermost_mpls()\n"); 298 *remaining = 0; 299 *mplsptr = NULL; 300 return mplslabel; 301 } 302 303 ptr = trace_get_layer2(packet, &linktype, &rem); 304 /* No layer2 */ 305 if (ptr == NULL) { 306 *remaining = 0; 307 *mplsptr = NULL; 308 return mplslabel; 309 } 310 311 /* loop over the packet until we find a mpls label */ 312 while (ethertype != TRACE_ETHERTYPE_MPLS) { 313 if (rem == 0 || ptr == NULL) { 314 315 *remaining = 0; 316 *mplsptr = NULL; 317 return mplslabel; 318 } 319 320 /* get next layer2 header */ 321 ptr = trace_get_payload_from_layer2(ptr, linktype, ðertype, &rem); 322 } 323 324 uint32_t val = ntohl(*(uint32_t *)ptr); 325 mplslabel = val >> 12; 326 327 *remaining = rem; 328 *mplsptr = ptr; 329 return mplslabel; 92 330 } 93 331
Note: See TracChangeset
for help on using the changeset viewer.