Changeset 729


Ignore:
Timestamp:
04/23/06 17:55:09 (7 years ago)
Author:
perry
Message:

Added support for writing onto an interface to pcap and linuxnative

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/configure.in

    r724 r729  
    154154                AC_REPLACE_FUNCS(pcap_dump_flush) 
    155155        fi 
     156 
     157        AC_CHECK_LIB(pcap,pcap_inject, 
     158                        AC_DEFINE(HAVE_PCAP_INJECT,1,[pcap has pcap_inject]), 
     159                        have_pcap_inject=false) 
     160 
     161        AC_CHECK_LIB(pcap,pcap_sendpacket, 
     162                        AC_DEFINE(HAVE_PCAP_SENDPACKET,1,[pcap has pcap_sendpacket]), 
     163                        have_pcap_sendpacket=false) 
    156164fi 
    157165 
  • trunk/lib/format_linux.c

    r725 r729  
    6565}; 
    6666 
     67struct libtrace_linuxnative_format_data_t { 
     68        int fd; 
     69}; 
     70 
    6771#define FORMAT(x) ((struct libtrace_format_data_t*)(x)) 
     72#define DATAOUT(x) ((struct libtrace_linuxnative_format_data_t*)((x)->format_data)) 
    6873 
    6974static int linuxnative_init_input(libtrace_t *libtrace)  
     
    7479        FORMAT(libtrace->format_data)->promisc = 0; 
    7580        FORMAT(libtrace->format_data)->snaplen = 65536; 
     81 
     82        return 0; 
     83} 
     84 
     85static int linuxnative_init_output(libtrace_out_t *libtrace) 
     86{ 
     87        libtrace->format_data = (struct libtrace_linuxnative_format_data_t*) 
     88                malloc(sizeof(struct libtrace_linuxnative_format_data_t)); 
     89        DATAOUT(libtrace)->fd = -1; 
    7690 
    7791        return 0; 
     
    122136} 
    123137 
     138static int linuxnative_start_output(libtrace_out_t *libtrace) 
     139{ 
     140        FORMAT(libtrace->format_data)->fd =  
     141                                socket(PF_PACKET, SOCK_RAW, 0); 
     142        if (FORMAT(libtrace->format_data)->fd==-1) { 
     143                free(libtrace->format_data); 
     144                return -1; 
     145        } 
     146 
     147        return 0; 
     148} 
     149 
    124150static int linuxnative_pause_input(libtrace_t *libtrace) 
    125151{ 
     
    132158static int linuxnative_fin_input(libtrace_t *libtrace)  
    133159{ 
     160        free(libtrace->format_data); 
     161        return 0; 
     162} 
     163 
     164static int linuxnative_fin_output(libtrace_out_t *libtrace) 
     165{ 
     166        close(DATAOUT(libtrace)->fd); 
     167        DATAOUT(libtrace)->fd=-1; 
    134168        free(libtrace->format_data); 
    135169        return 0; 
     
    165199#define LIBTRACE_MIN(a,b) ((a)<(b) ? (a) : (b)) 
    166200 
    167 static int linuxnative_read_packet(libtrace_t *libtrace, libtrace_packet_t *packet) { 
     201static int linuxnative_read_packet(libtrace_t *libtrace, libtrace_packet_t *packet)  
     202{ 
    168203        struct libtrace_linuxnative_header *hdr; 
    169204        socklen_t socklen; 
     
    201236} 
    202237 
     238static int linuxnative_write_packet(libtrace_out_t *trace,  
     239                const libtrace_packet_t *packet)  
     240{ 
     241        struct sockaddr_ll hdr; 
     242 
     243        hdr.sll_family = AF_PACKET; 
     244        hdr.sll_protocol = 0; 
     245        hdr.sll_ifindex = if_nametoindex(packet->trace->uridata); 
     246        hdr.sll_hatype = 0; 
     247        hdr.sll_pkttype = 0; 
     248        hdr.sll_halen = 6; /* FIXME */ 
     249        memcpy(hdr.sll_addr,packet->payload,hdr.sll_halen); 
     250 
     251        return sendto(DATAOUT(trace)->fd, 
     252                        packet->payload, 
     253                        trace_get_capture_length(packet), 
     254                        0, 
     255                        (struct sockaddr*)&hdr, sizeof(hdr)); 
     256 
     257} 
     258 
    203259static libtrace_linktype_t linuxnative_get_link_type(const struct libtrace_packet_t *packet) { 
    204260        switch (htons((((struct libtrace_linuxnative_header*)(packet->buffer))->hdr.sll_protocol))) { 
     
    264320        linuxnative_start_input,        /* start_input */ 
    265321        linuxnative_pause_input,        /* pause_input */ 
    266         NULL,                           /* init_output */ 
     322        linuxnative_init_output,        /* init_output */ 
    267323        NULL,                           /* config_output */ 
    268         NULL,                           /* start_ouput */ 
     324        linuxnative_start_output,       /* start_ouput */ 
    269325        linuxnative_fin_input,          /* fin_input */ 
    270         NULL,                           /* fin_output */ 
     326        linuxnative_fin_output,         /* fin_output */ 
    271327        linuxnative_read_packet,        /* read_packet */ 
    272328        NULL,                           /* fin_packet */ 
    273         NULL,                           /* write_packet */ 
     329        linuxnative_write_packet,       /* write_packet */ 
    274330        linuxnative_get_link_type,      /* get_link_type */ 
    275331        linuxnative_get_direction,      /* get_direction */ 
  • trunk/lib/format_pcap.c

    r722 r729  
    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 */ 
  • trunk/lib/trace.c

    r725 r729  
    131131         * format module is sane. 
    132132         */  
    133 #if 0 
     133#if 1 
    134134        if (f->init_input) { 
    135135#define REQUIRE(x) \ 
Note: See TracChangeset for help on using the changeset viewer.