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_linux.c

    r411f3c7 re4e95499  
    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 */
Note: See TracChangeset for help on using the changeset viewer.