Changeset 3073c04 for lib/format_pcap.c


Ignore:
Timestamp:
08/24/05 15:34:32 (16 years ago)
Author:
Daniel Lawson <dlawson@…>
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:
1974620
Parents:
e01bfa8
Message:

code tidyups in format_erf.c
writer functionality for format_pcap and format_wag

File:
1 edited

Legend:

Unmodified
Added
Removed
  • lib/format_pcap.c

    rffc8c8d r3073c04  
    6464#if HAVE_PCAP
    6565
     66static struct libtrace_format_t *pcap_ptr = 0;
     67static struct libtrace_format_t *pcapint_ptr = 0;
     68
    6669#define CONNINFO libtrace->format_data->conn_info
    6770#define INPUT libtrace->format_data->input
    68 
     71#define OUTPUT libtrace->format_data->output
    6972struct libtrace_format_data_t {
    7073        union {
     
    7578        /** Information about the current state of the input device */
    7679        union {
    77                 int fd;
    78                 FILE *file;
    7980                pcap_t *pcap;
    8081        } input;
    8182};
     83
     84struct libtrace_format_data_out_t {
     85        union {
     86                char *path;
     87                char *interface;
     88        } conn_info;
     89        struct {
     90                pcap_t *pcap;
     91                pcap_dumper_t *dump;
     92        } output;
     93};
     94
     95static int linktype_to_dlt(libtrace_linktype_t t) {
     96        static int table[] = {
     97                -1, /* LEGACY */
     98                -1, /* HDLC over POS */
     99                DLT_EN10MB, /* Ethernet */
     100                -1, /* ATM */
     101                DLT_IEEE802_11, /* 802.11 */
     102                -1 /* END OF TABLE */
     103        };
     104        if (t>sizeof(table)/sizeof(*table)) {
     105                return -1;
     106        }
     107        return table[t];
     108}
    82109
    83110static int pcap_init_input(struct libtrace_t *libtrace) {
     
    126153}
    127154
     155static int pcap_init_output(struct libtrace_out_t *libtrace) {
     156        char errbuf[PCAP_ERRBUF_SIZE];
     157        struct stat buf;
     158        libtrace->format_data = (struct libtrace_format_data_out_t *)
     159                malloc(sizeof(struct libtrace_format_data_out_t));
     160        CONNINFO.path = libtrace->uridata;
     161        OUTPUT.pcap = NULL;
     162        OUTPUT.dump = NULL;
     163}
     164
    128165static int pcapint_init_input(struct libtrace_t *libtrace) {
    129166        char errbuf[PCAP_ERRBUF_SIZE];
     
    145182
    146183static int pcap_fin_input(struct libtrace_t *libtrace) {
    147         return -1;
     184        pcap_close(INPUT.pcap);
     185        free(libtrace->format_data);
     186        return 0;
     187}
     188
     189static int pcap_fin_output(struct libtrace_out_t *libtrace) {
     190        pcap_dump_flush(OUTPUT.dump);
     191        pcap_dump_close(OUTPUT.dump);
     192        return 0;
    148193}
    149194
     
    173218        }
    174219        return (packet->size - sizeof(struct pcap_pkthdr));
     220}
     221
     222static int pcap_write_packet(struct libtrace_out_t *libtrace, struct libtrace_packet_t *packet) {
     223        struct pcap_pkthdr pcap_pkt_hdr;
     224        void *link = trace_get_link(packet);
     225
     226        if (!OUTPUT.pcap) {
     227                OUTPUT.pcap = pcap_open_dead(
     228                                linktype_to_dlt(trace_get_link_type(packet)),
     229                                65536);
     230                OUTPUT.dump = pcap_dump_open(OUTPUT.pcap,CONNINFO.path);
     231                fflush((FILE *)OUTPUT.dump);
     232        }
     233        if (packet->trace->format == pcap_ptr ||
     234                        packet->trace->format == pcapint_ptr) {
     235        //if (!strncasecmp(packet->trace->format->name,"pcap",4)) {
     236                // this is a pcap trace anyway
     237               
     238                pcap_dump((u_char*)OUTPUT.dump,(struct pcap_pkthdr *)packet->buffer,link);
     239        } else {
     240                pcap_pkt_hdr.ts = trace_get_timeval(packet);
     241                pcap_pkt_hdr.caplen = trace_get_capture_length(packet);
     242                pcap_pkt_hdr.len = trace_get_wire_length(packet);
     243
     244                pcap_dump((u_char*)OUTPUT.pcap, &pcap_pkt_hdr, link);
     245        }
     246        return 0;
    175247}
    176248
     
    322394        "$Id$",
    323395        pcap_init_input,                /* init_input */
    324         NULL,                           /* init_output */
     396        pcap_init_output,               /* init_output */
    325397        NULL,                           /* config_output */
    326398        pcap_fin_input,                 /* fin_input */
    327         NULL,                           /* fin_output */
     399        pcap_fin_output,                /* fin_output */
    328400        pcap_read_packet,               /* read_packet */
    329         NULL,                           /* write_packet */
     401        pcap_write_packet,              /* write_packet */
    330402        pcap_get_link,                  /* get_link */
    331403        pcap_get_link_type,             /* get_link_type */
     
    368440};
    369441
     442//pcap_ptr = &pcap;
     443//pcapint_ptr = &pcapint;
     444
    370445void __attribute__((constructor)) pcap_constructor() {
    371         register_format(&pcap);
    372         register_format(&pcapint);
     446        pcap_ptr = &pcap;
     447        pcapint_ptr = &pcapint;
     448        register_format(pcap_ptr);
     449        register_format(pcapint_ptr);
    373450}
    374451
Note: See TracChangeset for help on using the changeset viewer.