- Timestamp:
- 10/11/06 16:09:21 (16 years ago)
- Branches:
- 4.0.1-hotfixes, cachetimestamps, develop, dpdk-ndag, etsilive, getfragoff, help, libtrace4, master, ndag_format, pfring, rc-4.0.1, rc-4.0.2, rc-4.0.3, rc-4.0.4, ringdecrementfix, ringperformance, ringtimestampfixes
- Children:
- 1ab9849
- Parents:
- a21af3d
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
lib/protocols.c
ra21af3d r30d4bd3 67 67 68 68 return ethernet; 69 } 70 71 /* skip any MPLS headers if necessary, guessing what the next type is 72 * type is input/output 73 */ 74 void *trace_get_mpls_payload_from_ethernet_payload(void *ethernet, 75 uint16_t *type, uint32_t *remaining) 76 { 77 assert(type && "You must pass a type in!"); 78 79 if (*type == 0x8847) { 80 if ((((char*)ethernet)[2]&0x01)==0) { 81 *type = 0x8847; 82 } 83 else { 84 if (!remaining || *remaining>=5) { 85 switch (((char*)ethernet)[4]&0xF0) { 86 case 0x40: 87 *type = 0x0800; 88 break; 89 case 0x60: 90 *type = 0x86DD; 91 break; 92 default: 93 /* Ethernet */ 94 *type = 0; 95 } 96 } 97 } 98 ethernet=(char*)ethernet+4; 99 if (remaining) { 100 if (*remaining<4) 101 return NULL; 102 else 103 *remaining-=4; 104 } 105 106 107 return ethernet; 108 } 109 else 110 return NULL; 69 111 } 70 112 … … 286 328 return NULL; 287 329 288 ret=trace_get_vlan_payload_from_ethernet_payload(ret,&type,NULL); 330 for(;;) { 331 switch(type) { 332 case 0x8100: 333 ret=trace_get_vlan_payload_from_ethernet_payload(ret,&type,NULL); 334 continue; 335 case 0x8847: 336 ret=trace_get_mpls_payload_from_ethernet_payload(ret,&type,NULL); 337 338 if (ret && type == 0x0) { 339 ret=trace_get_payload_from_ethernet(ret,&type,NULL); 340 } 341 continue; 342 default: 343 break; 344 } 345 346 break; 347 } 289 348 290 349 if (!ret || type!=0x0800) … … 315 374 return NULL; 316 375 317 ret=trace_get_vlan_payload_from_ethernet_payload(ret,&type,NULL); 376 for(;;) { 377 switch(type) { 378 case 0x8100: 379 ret=trace_get_vlan_payload_from_ethernet_payload(ret,&type,NULL); 380 continue; 381 case 0x8847: 382 ret=trace_get_mpls_payload_from_ethernet_payload(ret,&type,NULL); 383 384 if (ret && type == 0x0) { 385 ret=trace_get_payload_from_ethernet(ret,&type,NULL); 386 } 387 continue; 388 default: 389 break; 390 } 391 392 break; 393 } 318 394 319 395 if (!ret || type!=0x86DD) … … 422 498 return NULL; 423 499 424 transport = trace_get_vlan_payload_from_ethernet_payload(transport, 425 ðertype, 426 remaining); 500 for(;;) { 501 switch(ethertype) { 502 case 0x8100: 503 transport=trace_get_vlan_payload_from_ethernet_payload( 504 transport,ðertype,NULL); 505 continue; 506 case 0x8847: 507 transport=trace_get_mpls_payload_from_ethernet_payload( 508 transport,ðertype,NULL); 509 510 if (transport && ethertype == 0x0) { 511 transport=trace_get_payload_from_ethernet( 512 transport,ðertype,NULL); 513 } 514 continue; 515 default: 516 break; 517 } 518 519 break; 520 } 427 521 428 522 if (!transport) … … 677 771 return false; 678 772 679 l3 = trace_get_vlan_payload_from_ethernet_payload(l3, 680 &proto, 681 &remaining); 773 for(;;) { 774 switch(proto) { 775 case 0x8100: 776 l3=trace_get_vlan_payload_from_ethernet_payload( 777 l3,&proto,NULL); 778 continue; 779 case 0x8847: 780 l3=trace_get_mpls_payload_from_ethernet_payload( 781 l3,&proto,NULL); 782 783 if (l3 && proto == 0x0) { 784 l3=trace_get_payload_from_ethernet( 785 l3,&proto,NULL); 786 } 787 continue; 788 default: 789 break; 790 } 791 792 break; 793 } 682 794 683 795 if (!l3) … … 740 852 if (!transport) 741 853 return false; 742 743 transport = trace_get_vlan_payload_from_ethernet_payload(transport, 744 &proto, 745 &remaining); 854 for(;;) { 855 switch(proto) { 856 case 0x8100: 857 transport=trace_get_vlan_payload_from_ethernet_payload(transport,&proto,NULL); 858 continue; 859 case 0x8847: 860 transport=trace_get_mpls_payload_from_ethernet_payload(transport,&proto,NULL); 861 862 if (transport && proto == 0x0) { 863 transport=trace_get_payload_from_ethernet( 864 transport,&proto,NULL); 865 } 866 continue; 867 default: 868 break; 869 } 870 871 break; 872 } 746 873 747 874 if (!transport)
Note: See TracChangeset
for help on using the changeset viewer.