Changeset 9bc4689 for lib/protocols.c


Ignore:
Timestamp:
09/06/07 01:07:07 (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:
fbc4342
Parents:
180f095
Message:

Move everything over to using the newer API's

File:
1 edited

Legend:

Unmodified
Added
Removed
  • lib/protocols.c

    r180f095 r9bc4689  
    156156
    157157/* NB: type is returned as an ARPHRD_ type for SLL*/
    158 void *trace_get_payload_from_linux_sll(void *link,
     158void *trace_get_payload_from_linux_sll(const void *link,
    159159                uint16_t *type, uint32_t *remaining)
    160160{
     
    257257
    258258/* Returns the 'payload' of the prism header, which is the 802.11 frame */
    259 static void *trace_get_payload_from_prism (void *link,
    260                 uint16_t *type, uint32_t *remaining)
     259static void *trace_get_payload_from_prism (const void *link,
     260                libtrace_linktype_t *type, uint32_t *remaining)
    261261{
    262262        if (remaining) {
     
    272272
    273273/* Returns the 'payload' of the radiotap header, which is the 802.11 frame */
    274 static void *trace_get_payload_from_radiotap (void *link,
    275                 uint16_t *type, uint32_t *remaining)
     274static void *trace_get_payload_from_radiotap (const void *link,
     275                libtrace_linktype_t *type, uint32_t *remaining)
    276276{
    277277        struct libtrace_radiotap_t *rtap = (struct libtrace_radiotap_t*)link;
     
    296296        switch(linktype) {
    297297                case TRACE_TYPE_80211_PRISM:
    298                         l = trace_get_payload_from_prism(link,type,remaining);
     298                        l = trace_get_payload_from_prism(link,&linktype,remaining);
    299299                        return (l ? trace_get_payload_from_link(l, TRACE_TYPE_80211, type, remaining) : NULL);
    300300                case TRACE_TYPE_80211_RADIO:
    301                         l = trace_get_payload_from_radiotap(link,type,remaining);
     301                        l = trace_get_payload_from_radiotap(link,&linktype,remaining);
    302302                        return (l ? trace_get_payload_from_link(l, TRACE_TYPE_80211, type, remaining) : NULL);
    303303                case TRACE_TYPE_80211:
     
    446446                uint32_t *remaining)
    447447{
    448         uint32_t dummyrem = trace_get_capture_length(packet);
     448        uint32_t dummyrem;
    449449
    450450        assert(packet != NULL);
     
    474474                        return NULL;
    475475        }
     476
     477        /* Shouldn't get here */
     478        return NULL;
    476479}
    477480
     
    519522                        return NULL;
    520523        }
     524        /* Shouldn't get here */
     525        return NULL;
    521526}
    522527
     
    553558}
    554559
    555 DLLEXPORT void *trace_get_layer3(libtrace_packet_t *packet,
     560DLLEXPORT void *trace_get_payload_from_layer2(void *link,
     561                libtrace_linktype_t linktype,
     562                uint16_t *ethertype,
     563                uint32_t *remaining)
     564{
     565        void *l;
     566        switch(linktype) {
     567                /* Packet Metadata headers, not layer2 headers */
     568                case TRACE_TYPE_80211_PRISM:
     569                case TRACE_TYPE_80211_RADIO:
     570                case TRACE_TYPE_LINUX_SLL:
     571                        return NULL;
     572
     573                /* duck packets have no payload! */
     574                case TRACE_TYPE_DUCK:
     575                        return NULL;
     576
     577                /* The payload is in these packets does
     578                   not correspond to a genuine link-layer
     579                   */
     580                case TRACE_TYPE_METADATA:
     581                        return NULL;
     582
     583                case TRACE_TYPE_80211:
     584                        return trace_get_payload_from_80211(link,ethertype,remaining);
     585                case TRACE_TYPE_ETH:
     586                        return trace_get_payload_from_ethernet(link,ethertype,remaining);
     587                case TRACE_TYPE_NONE:
     588                        if ((*(char*)link&0xF0) == 0x40)
     589                                *ethertype=0x0800;
     590                        else if ((*(char*)link&0xF0) == 0x60)
     591                                *ethertype=0x86DD;
     592                        return link; /* I love the simplicity */
     593                case TRACE_TYPE_PFLOG:
     594                        return trace_get_payload_from_pflog(link,ethertype,remaining);
     595                case TRACE_TYPE_PPP:
     596                        return trace_get_payload_from_ppp(link,ethertype,remaining);
     597                case TRACE_TYPE_ATM:
     598                        l=trace_get_payload_from_atm(link,NULL,remaining);
     599                        /* FIXME: We shouldn't skip llcsnap here, we should return
     600                         * an ethertype for it (somehow)
     601                         */
     602                        return (l ? trace_get_payload_from_llcsnap(l,
     603                                                ethertype, remaining):NULL);
     604                case TRACE_TYPE_LLCSNAP:
     605                        return trace_get_payload_from_llcsnap(link,ethertype,remaining);
     606
     607                /* TODO: Unsupported */
     608                case TRACE_TYPE_HDLC_POS:
     609                case TRACE_TYPE_POS:
     610                case TRACE_TYPE_AAL5:
     611                        return NULL;
     612        }
     613        return NULL;
     614
     615}
     616
     617DLLEXPORT void *trace_get_layer3(const libtrace_packet_t *packet,
    556618                uint16_t *ethertype,
    557619                uint32_t *remaining)
     
    561623        void *link;
    562624        uint32_t dummy_remaining;
     625        libtrace_linktype_t linktype;
     626
     627        if (!ethertype) ethertype=&dummy_ethertype;
     628
     629        if (!remaining) remaining=&dummy_remaining;
    563630
    564631        /* use l3 cache */
    565632        if (packet->l3_header)
    566633        {
     634                link = trace_get_packet_buffer(packet,&linktype,remaining);
     635
     636                if (!link)
     637                        return NULL;
     638
    567639                *ethertype = packet->l3_ethertype;
    568                 *remaining -= (packet->l3_header - trace_get_link(packet));
     640                *remaining -= (packet->l3_header - link);
     641
    569642                return packet->l3_header;
    570643        }
    571644
    572         if (!ethertype) ethertype=&dummy_ethertype;
    573 
    574         if (!remaining) remaining=&dummy_remaining;
    575 
    576         *remaining = trace_get_capture_length(packet);
    577 
    578         link=trace_get_link(packet);
    579 
    580         if (!link)
    581                 return NULL;
    582 
    583         iphdr = trace_get_payload_from_link(
     645        link = trace_get_layer2(packet,&linktype,remaining);
     646
     647        iphdr = trace_get_payload_from_layer2(
    584648                        link,
    585                         trace_get_link_type(packet),
     649                        linktype,
    586650                        ethertype,
    587651                        remaining);
     
    613677
    614678        /* Store values in the cache for later */
    615         packet->l3_ethertype = *ethertype;
    616         packet->l3_header = iphdr;
     679        /* Cast away constness, nasty, but this is just a cache */
     680        ((libtrace_packet_t*)packet)->l3_ethertype = *ethertype;
     681        ((libtrace_packet_t*)packet)->l3_header = iphdr;
    617682
    618683        return iphdr;
    619684}
    620685
    621 DLLEXPORT void *trace_get_transport(libtrace_packet_t *packet,
     686DLLEXPORT void *trace_get_transport(const libtrace_packet_t *packet,
    622687                uint8_t *proto,
    623688                uint32_t *remaining
     
    632697
    633698        if (!remaining) remaining=&dummy_remaining;
    634 
    635         *remaining = trace_get_capture_length(packet);
    636699
    637700        transport = trace_get_layer3(packet,&ethertype,remaining);
     
    829892}
    830893
    831 static
    832 uint8_t *__trace_get_source_mac(void *link, libtrace_linktype_t *linktype, uint32_t *rem) {
    833         libtrace_ether_t *ethptr = (libtrace_ether_t *) link;
    834         uint16_t arphrd;
     894DLLEXPORT uint8_t *trace_get_source_mac(libtrace_packet_t *packet) {
     895        void *link;
     896        uint32_t remaining;
     897        libtrace_linktype_t linktype;
     898        assert(packet);
     899        link = trace_get_layer2(packet,&linktype,&remaining);
     900
    835901        if (!link)
    836902                return NULL;
    837903       
    838         switch (*linktype) {
     904        switch (linktype) {
    839905                case TRACE_TYPE_ETH:
    840                         return (uint8_t *)&ethptr->ether_shost;
     906                        return (uint8_t *)&(((libtrace_ether_t*)link)->ether_shost);
    841907                case TRACE_TYPE_80211:
    842908                        return get_source_mac_from_wifi(link);
    843                 case TRACE_TYPE_80211_RADIO:
    844                         link = trace_get_payload_from_radiotap(
    845                                         link, linktype, rem);
    846                         return __trace_get_source_mac(link, linktype, rem);
    847                 case TRACE_TYPE_80211_PRISM:
    848                         link = trace_get_payload_from_prism(
    849                                         link, linktype, rem);
    850                         return __trace_get_source_mac(link, linktype, rem);
    851                 case TRACE_TYPE_LINUX_SLL:
    852                         link = trace_get_payload_from_linux_sll(
    853                                         link, &arphrd, rem);
    854                         *linktype = arphrd_type_to_libtrace(arphrd);
    855                         return __trace_get_source_mac(link, linktype, rem);
     909                /* These packets don't have MAC addresses */
    856910                case TRACE_TYPE_POS:
    857911                case TRACE_TYPE_NONE:
     
    861915                case TRACE_TYPE_DUCK:
    862916                case TRACE_TYPE_METADATA:
    863                         return NULL;
    864                 default:
     917                case TRACE_TYPE_AAL5:
     918                case TRACE_TYPE_LLCSNAP:
     919                case TRACE_TYPE_PPP:
     920                        return NULL;
     921
     922                /* Metadata headers should already be skipped */
     923                case TRACE_TYPE_LINUX_SLL:
     924                case TRACE_TYPE_80211_PRISM:
     925                case TRACE_TYPE_80211_RADIO:
     926                        assert(!"Metadata headers should already be skipped");
    865927                        break;
    866928        }
    867         fprintf(stderr,"%s not implemented for linktype %i\n", __func__, *linktype);
     929        fprintf(stderr,"%s not implemented for linktype %i\n", __func__, linktype);
    868930        assert(0);
    869931        return NULL;
    870932}
    871933
    872 DLLEXPORT uint8_t *trace_get_source_mac(libtrace_packet_t *packet) {
    873         if (packet == NULL)
    874                 return NULL;
    875         void *link = trace_get_link(packet);
    876         uint32_t len = trace_get_capture_length(packet);
    877         libtrace_linktype_t lt = trace_get_link_type(packet);
    878         return __trace_get_source_mac(link, &lt, &len);
    879 }
    880 
    881 DLLEXPORT uint8_t *trace_get_destination_mac(libtrace_packet_t *packet) {
    882         void *link = trace_get_link(packet);
     934DLLEXPORT uint8_t *trace_get_destination_mac(libtrace_packet_t *packet)
     935{
     936        void *link;
     937        libtrace_linktype_t linktype;
     938        uint32_t remaining;
     939
     940        link = trace_get_layer2(packet,&linktype,&remaining);
     941
    883942        libtrace_80211_t *wifi;
    884943        libtrace_ether_t *ethptr = (libtrace_ether_t*)link;
     944
     945
    885946        if (!link)
    886947                return NULL;
    887         switch (trace_get_link_type(packet)) {
     948
     949        switch (linktype) {
    888950                case TRACE_TYPE_80211:
    889951                        wifi=(libtrace_80211_t*)link;
     
    928990                addr=(struct sockaddr*)&dummy;
    929991
    930         remaining = trace_get_capture_length(packet);
    931 
    932992        l3 = trace_get_layer3(packet,&ethertype,&remaining);
    933993
     
    9811041        if (!addr)
    9821042                addr=(struct sockaddr*)&dummy;
    983 
    984         remaining = trace_get_capture_length(packet);
    9851043
    9861044        l3 = trace_get_layer3(packet,&ethertype,&remaining);
Note: See TracChangeset for help on using the changeset viewer.