Changeset 50bbce8 for lib/format_linux.c


Ignore:
Timestamp:
11/30/07 08:57:55 (14 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:
25a9201
Parents:
b282cf8
Message:

First pass implementation of loss recording framework.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • lib/format_linux.c

    rf2fae49 r50bbce8  
    5353#include <assert.h>
    5454
     55struct tpacket_stats {
     56        unsigned int tp_packets;
     57        unsigned int tp_drops;
     58};
     59
    5560struct libtrace_format_data_t {
    5661        int fd;
     
    5863        int promisc;
    5964        libtrace_filter_t *filter;
     65        struct tpacket_stats stats;
     66        int stats_valid;
    6067};
    6168
     
    8289        FORMAT(libtrace->format_data)->snaplen = 65536;
    8390        FORMAT(libtrace->format_data)->filter = NULL;
     91        FORMAT(libtrace->format_data)->stats_valid = 0;
    8492
    8593        return 0;
     
    187195                }
    188196        }
     197
     198        FORMAT(libtrace->format_data)->stats_valid=0;
    189199                                       
    190200        return 0;
     
    199209                return -1;
    200210        }
     211        FORMAT(libtrace->format_data)->stats_valid=0;
    201212
    202213        return 0;
     
    480491static int linuxnative_get_fd(const libtrace_t *trace) {
    481492        return FORMAT(trace->format_data)->fd;
     493}
     494
     495static uint64_t linuxnative_get_captured_packets(libtrace_t *trace) {
     496        if (FORMAT(trace->format_data)->stats_valid != 2) {
     497                socklen_t len = sizeof(FORMAT(trace->format_data)->stats);
     498                getsockopt(FORMAT(trace->format_data)->fd,
     499                                SOL_PACKET,
     500                                PACKET_STATISTICS,
     501                                &FORMAT(trace->format_data)->stats,
     502                                &len);
     503                FORMAT(trace->format_data)->stats_valid = 1;
     504        }
     505
     506        return FORMAT(trace->format_data)->stats.tp_packets;
     507}
     508
     509static uint64_t linuxnative_get_dropped_packets(libtrace_t *trace) {
     510        if (FORMAT(trace->format_data)->stats_valid != 1) {
     511                socklen_t len = sizeof(FORMAT(trace->format_data)->stats);
     512                getsockopt(FORMAT(trace->format_data)->fd,
     513                                SOL_PACKET,
     514                                PACKET_STATISTICS,
     515                                &FORMAT(trace->format_data)->stats,
     516                                &len);
     517                FORMAT(trace->format_data)->stats_valid = 2;
     518        }
     519
     520        return FORMAT(trace->format_data)->stats.tp_drops;
    482521}
    483522
     
    523562        NULL,                           /* get_received_packets */
    524563        NULL,                           /* get_filtered_packets */
    525         NULL,                           /* get_dropped_packets */
    526         NULL,                           /* get_captured_packets */
     564        linuxnative_get_dropped_packets,/* get_dropped_packets */
     565        linuxnative_get_captured_packets,/* get_captured_packets */
    527566        linuxnative_get_fd,             /* get_fd */
    528567        trace_event_device,             /* trace_event */
Note: See TracChangeset for help on using the changeset viewer.