Changeset 411f3c7 for lib/format_linux.c


Ignore:
Timestamp:
04/23/06 13:48:20 (16 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:
e337363
Parents:
7b2a39b
Message:

Fixed the format module auditing code in trace.c to work with the new linked
list.
Did some more tidyups on format_linux, it now supports get_capture_length()
properly, does snapping and configurable promisc.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • lib/format_linux.c

    rdd2eaee r411f3c7  
    5454struct libtrace_format_data_t {
    5555        int fd;
     56        int snaplen;
     57        int promisc;
    5658};
    5759
     
    5961        struct timeval ts;
    6062        int wirelen;
     63        int caplen;
    6164        struct sockaddr_ll hdr;
    6265};
     
    6467#define FORMAT(x) ((struct libtrace_format_data_t*)(x))
    6568
    66 static int linuxnative_init_input(struct libtrace_t *libtrace) {
    67         struct sockaddr_ll addr;
     69static int linuxnative_init_input(libtrace_t *libtrace)
     70{
    6871        libtrace->format_data = (struct libtrace_format_data_t *)
    6972                malloc(sizeof(struct libtrace_format_data_t));
     73        FORMAT(libtrace->format_data)->fd = -1;
     74        FORMAT(libtrace->format_data)->promisc = 0;
     75        FORMAT(libtrace->format_data)->snaplen = 65536;
     76
     77        return 0;
     78}
     79
     80static int linuxnative_start_input(libtrace_t *libtrace)
     81{
     82        struct sockaddr_ll addr;
    7083        FORMAT(libtrace->format_data)->fd =
    7184                                socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
     
    109122}
    110123
    111 static int linuxnative_fin_input(struct libtrace_t *libtrace) {
     124static int linuxnative_pause_input(libtrace_t *libtrace)
     125{
    112126        close(FORMAT(libtrace->format_data)->fd);
     127        FORMAT(libtrace->format_data)->fd=-1;
     128
     129        return 0;
     130}
     131
     132static int linuxnative_fin_input(libtrace_t *libtrace)
     133{
    113134        free(libtrace->format_data);
    114135        return 0;
    115136}
    116137
    117 static int linuxnative_read_packet(struct libtrace_t *libtrace, struct libtrace_packet_t *packet) {
     138static int linuxnative_config_input(libtrace_t *libtrace,
     139                trace_option_t option,
     140                void *data)
     141{
     142        switch(option) {
     143                case TRACE_OPTION_SNAPLEN:
     144                        FORMAT(libtrace->format_data)->snaplen=*(int*)data;
     145                        return 0;
     146                case TRACE_OPTION_PROMISC:
     147                        FORMAT(libtrace->format_data)->promisc=*(int*)data;
     148                        return 0;
     149                case TRACE_OPTION_FILTER:
     150                        /* We don't support bpf filters in any special way
     151                         * so return an error and let libtrace deal with
     152                         * emulating it
     153                         */
     154                        break;
     155                /* Avoid default: so that future options will cause a warning
     156                 * here to remind us to implement it, or flag it as
     157                 * unimplementable
     158                 */
     159        }
     160        trace_set_err(libtrace,TRACE_ERR_UNKNOWN_OPTION,
     161                        "Unknown option %i", option);
     162        return -1;
     163}
     164
     165#define LIBTRACE_MIN(a,b) ((a)<(b) ? (a) : (b))
     166
     167static int linuxnative_read_packet(libtrace_t *libtrace, libtrace_packet_t *packet) {
    118168        struct libtrace_linuxnative_header *hdr;
    119169        socklen_t socklen;
     170        int snaplen;
    120171        if (!packet->buffer || packet->buf_control == TRACE_CTRL_EXTERNAL) {
    121172                packet->buffer = malloc(LIBTRACE_PACKET_BUFSIZE);
     
    129180        hdr=(void*)packet->buffer;
    130181        socklen=sizeof(hdr->hdr);
     182        snaplen=LIBTRACE_MIN(
     183                        (int)LIBTRACE_PACKET_BUFSIZE-(int)sizeof(*hdr),
     184                        (int)FORMAT(libtrace->format_data)->snaplen);
    131185        hdr->wirelen = recvfrom(FORMAT(libtrace->format_data)->fd,
    132186                        (void*)packet->payload,
    133                         LIBTRACE_PACKET_BUFSIZE-sizeof(*hdr),
     187                        snaplen,
    134188                        MSG_TRUNC,
    135189                        (void *)&hdr->hdr,
     
    138192        if (hdr->wirelen==-1)
    139193                return -1;
     194
     195        hdr->caplen=LIBTRACE_MIN(snaplen,hdr->wirelen);
    140196
    141197        if (ioctl(FORMAT(libtrace->format_data)->fd,SIOCGSTAMP,&hdr->ts)==-1)
     
    166222}
    167223
    168 static struct timeval linuxnative_get_timeval(const struct libtrace_packet_t *packet) {
     224static struct timeval linuxnative_get_timeval(const libtrace_packet_t *packet)
     225{
    169226        return ((struct libtrace_linuxnative_header*)(packet->buffer))->ts;
    170227}
    171228
    172 static int linuxnative_get_wire_length(const struct libtrace_packet_t *packet) {
     229static int linuxnative_get_capture_length(const libtrace_packet_t *packet)
     230{
     231        return ((struct libtrace_linuxnative_header*)(packet->buffer))->caplen;
     232}
     233
     234static int linuxnative_get_wire_length(const libtrace_packet_t *packet)
     235{
    173236        return ((struct libtrace_linuxnative_header*)(packet->buffer))->wirelen;
    174237}
    175238
    176 static int linuxnative_get_framing_length(const struct libtrace_packet_t *packet) {
     239static int linuxnative_get_framing_length(const libtrace_packet_t *packet)
     240{
    177241        return sizeof(struct libtrace_linuxnative_header);
    178242}
     
    197261        TRACE_FORMAT_LINUX_NATIVE,
    198262        linuxnative_init_input,         /* init_input */
    199         NULL,                           /* config_input */
    200         NULL,                           /* start_input */
    201         NULL,                           /* pause_input */
     263        linuxnative_config_input,       /* config_input */
     264        linuxnative_start_input,        /* start_input */
     265        linuxnative_pause_input,        /* pause_input */
    202266        NULL,                           /* init_output */
    203267        NULL,                           /* config_output */
     
    217281        NULL,                           /* seek_timeval */
    218282        NULL,                           /* seek_seconds */
    219         NULL,                           /* get_capture_length */
     283        linuxnative_get_capture_length, /* get_capture_length */
    220284        linuxnative_get_wire_length,    /* get_wire_length */
    221285        linuxnative_get_framing_length, /* get_framing_length */
    222286        NULL,                           /* set_capture_length */
    223287        linuxnative_get_fd,             /* get_fd */
    224         trace_event_trace,              /* trace_event */
     288        trace_event_device,             /* trace_event */
    225289        linuxnative_help,               /* help */
    226290        NULL
Note: See TracChangeset for help on using the changeset viewer.