Changeset e4e95499 for lib/format_pcap.c


Ignore:
Timestamp:
04/23/06 17:55:09 (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:
12778c2
Parents:
698a217
Message:

Added support for writing onto an interface to pcap and linuxnative

File:
1 edited

Legend:

Unmodified
Added
Removed
  • lib/format_pcap.c

    r114b8d6 re4e95499  
    155155}
    156156
    157 static int pcap_init_output(struct libtrace_out_t *libtrace) {
     157static int pcap_init_output(libtrace_out_t *libtrace) {
    158158        libtrace->format_data = malloc(sizeof(struct pcap_format_data_out_t));
    159159        OUTPUT.trace.pcap = NULL;
    160160        OUTPUT.trace.dump = NULL;
    161161        return 0;
     162}
     163
     164static int pcapint_init_output(libtrace_out_t *libtrace) {
     165#ifdef HAVE_PCAP_INJECT
     166        libtrace->format_data = malloc(sizeof(struct pcap_format_data_out_t));
     167        OUTPUT.trace.pcap = NULL;
     168        OUTPUT.trace.dump = NULL;
     169        return 0;
     170#else
     171#ifdef HAVE_PCAP_SENDPACKET
     172        libtrace->format_data = malloc(sizeof(struct pcap_format_data_out_t));
     173        OUTPUT.trace.pcap = NULL;
     174        OUTPUT.trace.dump = NULL;
     175        return 0;
     176#else
     177        trace_set_err_out(libtrace,TRACE_ERR_NO_INIT_OUT,
     178                        "writing not supported by this version of pcap");
     179        return -1;
     180#endif
     181#endif
    162182}
    163183
     
    237257}
    238258
     259static int pcapint_fin_output(libtrace_out_t *libtrace)
     260{
     261        pcap_close(OUTPUT.trace.pcap);
     262        free(libtrace->format_data);
     263        return 0;
     264}
     265
    239266static void trace_pcap_handler(u_char *user, const struct pcap_pkthdr *pcaphdr, const u_char *pcappkt) {
    240267        struct libtrace_packet_t *packet = (struct libtrace_packet_t *)user;   
     
    260287}
    261288
     289/* TODO: use pcap_next_ex() if available */
    262290static int pcap_read_packet(struct libtrace_t *libtrace, struct libtrace_packet_t *packet) {
    263291        int pcapbytes = 0;
     
    315343        }
    316344        return 0;
     345}
     346
     347static int pcapint_write_packet(libtrace_out_t *libtrace, const libtrace_packet_t *packet) {
     348        int err;
     349
     350        if (!OUTPUT.trace.pcap) {
     351                OUTPUT.trace.pcap = (pcap_t *)pcap_open_live(
     352                        libtrace->uridata,65536,0,0,NULL);
     353        }
     354#if HAVE_PCAP_INJECT
     355        err=pcap_inject(OUTPUT.trace.pcap,
     356                        packet->payload,
     357                        trace_get_capture_length(packet));
     358        if (err!=trace_get_capture_length(packet))
     359                err=-1;
     360#else
     361#if HAVE_PCAP_SENDPACKET
     362        err=pcap_sendpacket(OUTPUT.trace.pcap,
     363                        packet->payload,
     364                        trace_get_capture_length(packet));
     365#endif
     366#endif
     367        return err;
    317368}
    318369
     
    504555        pcapint_start_input,            /* start_input */
    505556        pcapint_pause_input,            /* pause_input */
    506         NULL,                           /* init_output */
     557        pcapint_init_output,            /* init_output */
    507558        NULL,                           /* config_output */
    508559        NULL,                           /* start_output */
    509560        pcap_fin_input,                 /* fin_input */
    510         NULL,                           /* fin_output */
     561        pcapint_fin_output,             /* fin_output */
    511562        pcap_read_packet,               /* read_packet */
    512563        NULL,                           /* fin_packet */
    513         NULL,                           /* write_packet */
     564        pcapint_write_packet,           /* write_packet */
    514565        pcap_get_link_type,             /* get_link_type */
    515566        pcap_get_direction,             /* get_direction */
Note: See TracChangeset for help on using the changeset viewer.