Changeset 81f9b6e for lib/linktypes.c


Ignore:
Timestamp:
05/03/06 00:38:02 (15 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:
e5f1431
Parents:
ef69a05
Message:

Commit experimental direction tagging for pcap, such that it is.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • lib/linktypes.c

    rda22687 r81f9b6e  
    77#include "rt_protocol.h"
    88#include <assert.h>
     9#include "libtrace_int.h"
     10#include <stdlib.h>
     11#include <net/if_arp.h>
     12#include <string.h>
    913
    1014/* This file maps libtrace types to/from pcap DLT and erf types
     
    2529                case TRACE_DLT_PFLOG: return TRACE_TYPE_PFLOG;
    2630        }
    27         return -1;
     31        return ~0;
    2832}
    2933
    30 int libtrace_to_pcap_dlt(libtrace_linktype_t type)
     34libtrace_dlt_t libtrace_to_pcap_dlt(libtrace_linktype_t type)
    3135{
    3236        switch(type) {
     
    3842                case TRACE_TYPE_PFLOG: return TRACE_DLT_PFLOG;
    3943        }
    40         return -1;
     44        return ~0;
    4145}
    4246
    43 enum rt_field_t pcap_dlt_to_rt(int dlt)
     47enum rt_field_t pcap_dlt_to_rt(libtrace_dlt_t dlt)
    4448{
    4549        /* For pcap the rt type is just the dlt + a fixed value */
     
    4751}
    4852
    49 int rt_to_pcap_dlt(enum rt_field_t rt_type)
     53libtrace_dlt_t rt_to_pcap_dlt(enum rt_field_t rt_type)
    5054{
    5155        assert(rt_type >= RT_DATA_PCAP);
     
    6165                case TYPE_AAL5:         return TRACE_TYPE_AAL5;
    6266        }
    63         return -1;
     67        return ~0;
    6468}
    6569
     
    7478        return -1;
    7579}
     80
     81/** Tinker with a packet
     82 * packets that don't support direction tagging are annoying, especially
     83 * when we have direction tagging information!  So this converts the packet
     84 * to TRACE_TYPE_LINUX_SLL which does support direction tagging.  This is a
     85 * pcap style packet for the reason that it means it works with bpf filters.
     86 *
     87 * @note this will copy the packet, so use sparingly if possible.
     88 */
     89void promote_packet(libtrace_packet_t *packet)
     90{
     91        if (packet->trace->format->type == TRACE_FORMAT_PCAP) {
     92                char *tmpbuffer;
     93                libtrace_sll_header_t *hdr;
     94
     95                switch(pcap_dlt_to_libtrace(rt_to_pcap_dlt(packet->type))) {
     96                        case TRACE_TYPE_LINUX_SLL:
     97                                return; /* Unnecessary */
     98
     99                        case TRACE_TYPE_ETH:
     100                                /* This should be easy, just prepend the header */
     101                                tmpbuffer= malloc(sizeof(libtrace_sll_header_t)
     102                                                +trace_get_capture_length(packet)
     103                                                +trace_get_framing_length(packet)
     104                                                );
     105
     106                                hdr=(void*)((char*)tmpbuffer
     107                                        +trace_get_framing_length(packet));
     108
     109                                hdr->pkttype=0; /* "outgoing" */
     110                                hdr->hatype = ARPHRD_ETHER;
     111                                break;
     112                        default:
     113                                /* failed */
     114                                return;
     115                }
     116                memcpy(tmpbuffer,packet->header,
     117                                trace_get_framing_length(packet));
     118                memcpy(tmpbuffer
     119                                +sizeof(libtrace_sll_header_t)
     120                                +trace_get_framing_length(packet),
     121                                packet->payload,
     122                                trace_get_capture_length(packet));
     123                if (packet->buf_control == TRACE_CTRL_EXTERNAL) {
     124                        packet->buf_control=TRACE_CTRL_PACKET;
     125                }
     126                else {
     127                        free(packet->buffer);
     128                }
     129                packet->buffer=tmpbuffer;
     130                packet->header=tmpbuffer;
     131                packet->payload=tmpbuffer+trace_get_framing_length(packet);
     132                packet->type=TRACE_TYPE_LINUX_SLL;
     133                return;
     134        }
     135}
Note: See TracChangeset for help on using the changeset viewer.