Changeset 180f095 for lib/protocols.c


Ignore:
Timestamp:
09/05/07 23:52:26 (14 years ago)
Author:
Scott Raynel <smr26@…>
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:
9bc4689
Parents:
e8a6c52
Message:
  • Deprecate the use of trace_get_link()
  • Replace trace_get_link() with trace_get_packet_buffer()
  • Introduce new API for dealing with metadata headers such as Radiotap or Linux SLL
  • Introduce trace_get_layer2() which returns the start of the layer 2 header, which is usually the start of the packet as it was seen on the wire.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • lib/protocols.c

    re8a6c52 r180f095  
    442442}
    443443
     444DLLEXPORT void *trace_get_packet_meta(const libtrace_packet_t *packet,
     445                libtrace_linktype_t *linktype,
     446                uint32_t *remaining)
     447{
     448        uint32_t dummyrem = trace_get_capture_length(packet);
     449
     450        assert(packet != NULL);
     451        assert(linktype != NULL);
     452       
     453        if (remaining == NULL)
     454                remaining = &dummyrem;
     455       
     456        void *pktbuf = trace_get_packet_buffer(packet, linktype, remaining);
     457        switch (*linktype) {
     458                case TRACE_TYPE_LINUX_SLL:
     459                case TRACE_TYPE_80211_RADIO:
     460                case TRACE_TYPE_80211_PRISM:
     461                        return pktbuf;
     462                case TRACE_TYPE_HDLC_POS:
     463                case TRACE_TYPE_ETH:
     464                case TRACE_TYPE_ATM:
     465                case TRACE_TYPE_80211:
     466                case TRACE_TYPE_NONE:
     467                case TRACE_TYPE_PFLOG:
     468                case TRACE_TYPE_POS:
     469                case TRACE_TYPE_AAL5:
     470                case TRACE_TYPE_DUCK:
     471                case TRACE_TYPE_LLCSNAP:
     472                case TRACE_TYPE_PPP:
     473                case TRACE_TYPE_METADATA:
     474                        return NULL;
     475        }
     476}
     477
     478DLLEXPORT void *trace_get_payload_from_meta(const void *meta,
     479                libtrace_linktype_t *linktype,
     480                uint32_t *remaining)
     481{
     482        void *nexthdr;
     483        uint16_t arphrd;
     484       
     485        assert(meta != NULL);
     486        assert(linktype != NULL);
     487        assert(remaining != NULL);
     488       
     489        switch(*linktype) {
     490                case TRACE_TYPE_LINUX_SLL:
     491                        nexthdr = trace_get_payload_from_linux_sll(meta,
     492                                        &arphrd, remaining);
     493                        *linktype = arphrd_type_to_libtrace(arphrd);
     494                        return nexthdr;
     495                case TRACE_TYPE_80211_RADIO:
     496                        nexthdr = trace_get_payload_from_radiotap(meta,
     497                                        linktype, remaining);
     498                        return nexthdr;
     499                case TRACE_TYPE_80211_PRISM:
     500                        nexthdr = trace_get_payload_from_prism(meta,
     501                                        linktype, remaining);
     502                        return nexthdr;
     503                case TRACE_TYPE_HDLC_POS:
     504                case TRACE_TYPE_ETH:
     505                case TRACE_TYPE_ATM:
     506                case TRACE_TYPE_80211:
     507                case TRACE_TYPE_NONE:
     508                case TRACE_TYPE_PFLOG:
     509                case TRACE_TYPE_POS:
     510                case TRACE_TYPE_AAL5:
     511                case TRACE_TYPE_DUCK:
     512                case TRACE_TYPE_LLCSNAP:
     513                case TRACE_TYPE_PPP:
     514                case TRACE_TYPE_METADATA:
     515                        /* In this case, the pointer passed in does not point
     516                         * to a metadata header and so we cannot get the
     517                         * payload.
     518                         */
     519                        return NULL;
     520        }
     521}
     522
     523DLLEXPORT void *trace_get_layer2(const libtrace_packet_t *packet,
     524                libtrace_linktype_t *linktype,
     525                uint32_t *remaining)
     526{
     527        uint32_t dummyrem;
     528       
     529        assert(packet != NULL);
     530        assert(linktype != NULL);
     531
     532        if (remaining == NULL)
     533                remaining = &dummyrem;
     534       
     535        void *meta = trace_get_packet_meta(packet, linktype, remaining);
     536
     537        /* If there are no meta-data headers, we just return the start of the
     538         * packet buffer, along with the linktype, etc.
     539         */
     540        if (meta == NULL)
     541                return trace_get_packet_buffer(packet, linktype, remaining);
     542       
     543        /* If there are meta-data headers, we need to skip over them until we
     544         * find a non-meta data header and return that.
     545         */
     546        for(;;) {
     547                void *nexthdr = trace_get_payload_from_meta(meta,
     548                                linktype, remaining);
     549                if (nexthdr == NULL)
     550                        return meta;
     551                meta = nexthdr;
     552        }
     553}
     554
    444555DLLEXPORT void *trace_get_layer3(libtrace_packet_t *packet,
    445556                uint16_t *ethertype,
Note: See TracChangeset for help on using the changeset viewer.