Changeset 30d4bd3


Ignore:
Timestamp:
10/11/06 16:09:21 (14 years ago)
Author:
Perry Lorier <perry@…>
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
Message:

Add support for decoding inside MPLS packets

File:
1 edited

Legend:

Unmodified
Added
Removed
  • lib/protocols.c

    ra21af3d r30d4bd3  
    6767
    6868        return ethernet;
     69}
     70
     71/* skip any MPLS headers if necessary, guessing what the next type is
     72 * type is input/output
     73 */
     74void *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;
    69111}
    70112
     
    286328                return NULL;
    287329
    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        }
    289348
    290349        if (!ret || type!=0x0800)
     
    315374                return NULL;
    316375
    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        }
    318394
    319395        if (!ret || type!=0x86DD)
     
    422498                return NULL;
    423499
    424         transport = trace_get_vlan_payload_from_ethernet_payload(transport,
    425                         &ethertype,
    426                         remaining);
     500        for(;;) {
     501                switch(ethertype) {
     502                case 0x8100:
     503                        transport=trace_get_vlan_payload_from_ethernet_payload(
     504                                          transport,&ethertype,NULL);
     505                        continue;
     506                case 0x8847:
     507                        transport=trace_get_mpls_payload_from_ethernet_payload(
     508                                          transport,&ethertype,NULL);
     509
     510                        if (transport && ethertype == 0x0) {
     511                                transport=trace_get_payload_from_ethernet(
     512                                                transport,&ethertype,NULL);
     513                        }
     514                        continue;
     515                default:
     516                        break;
     517                }
     518
     519                break;
     520        }
    427521
    428522        if (!transport)
     
    677771                return false;
    678772
    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        }
    682794
    683795        if (!l3)
     
    740852        if (!transport)
    741853                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        }
    746873
    747874        if (!transport)
Note: See TracChangeset for help on using the changeset viewer.