From f5bf1c56b98126c4f09aabf8e4c17900a43795ea Mon Sep 17 00:00:00 2001 From: Eric Garver Date: Tue, 2 Aug 2016 15:32:00 -0400 Subject: [PATCH] netsniff-ng: Account skipped packets as 'seen' and 'dropped' Similar to upstream da6e1d1108ad ("netsniff-ng: Account skipped packets as 'seen' and 'dropped'") Signed-off-by: Eric Garver --- netsniff-ng.c | 13 ++++++++----- ring_rx.c | 6 ++++-- ring_rx.h | 2 +- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/netsniff-ng.c b/netsniff-ng.c index 75b5ca0f7444..302a52fbc0f4 100644 --- a/netsniff-ng.c +++ b/netsniff-ng.c @@ -500,7 +500,7 @@ static void receive_to_xmit(struct ctx *ctx) timer_purge(); - sock_rx_net_stats(rx_sock, 0); + sock_rx_net_stats(rx_sock, 0, 0); bpf_release(&bpf_ops); @@ -832,7 +832,7 @@ static void print_pcap_file_stats(int sock, struct ctx *ctx) } static void walk_t3_block(struct block_desc *pbd, struct ctx *ctx, - int sock, int *fd, unsigned long *frame_count) + int sock, int *fd, unsigned long *frame_count, unsigned long *skip_count) { uint8_t *packet; int num_pkts = pbd->h1.num_pkts, i, ret; @@ -847,8 +847,10 @@ static void walk_t3_block(struct block_desc *pbd, struct ctx *ctx, __label__ next; packet = ((uint8_t *) hdr + hdr->tp_mac); - if (skip_packet(ctx, sll)) + if (skip_packet(ctx, sll)) { + (*skip_count)++; goto next; + } (*frame_count)++; @@ -908,6 +910,7 @@ static void recv_only_or_dump(struct ctx *ctx) struct timeval start, end, diff; struct block_desc *pbd; unsigned long frame_count = 0; + unsigned long skip_count = 0; sock = pf_socket(); @@ -993,7 +996,7 @@ static void recv_only_or_dump(struct ctx *ctx) while (likely(sigint == 0)) { while (user_may_pull_from_rx_block((pbd = (void *) rx_ring.frames[it].iov_base))) { - walk_t3_block(pbd, ctx, sock, &fd, &frame_count); + walk_t3_block(pbd, ctx, sock, &fd, &frame_count, &skip_count); kernel_may_pull_from_rx_block(pbd); it = (it + 1) % rx_ring.layout3.tp_block_nr; @@ -1009,7 +1012,7 @@ static void recv_only_or_dump(struct ctx *ctx) timersub(&end, &start, &diff); if (!(ctx->dump_dir && ctx->print_mode == PRINT_NONE)) { - sock_rx_net_stats(sock, frame_count); + sock_rx_net_stats(sock, frame_count, skip_count); printf("\r%12lu sec, %lu usec in total\n", diff.tv_sec, diff.tv_usec); diff --git a/ring_rx.c b/ring_rx.c index 24a8c6d038e9..95df4bc5def5 100644 --- a/ring_rx.c +++ b/ring_rx.c @@ -147,7 +147,7 @@ void join_fanout_group(int sock, uint32_t fanout_group, uint32_t fanout_type) panic("Cannot set fanout ring mode!\n"); } -void sock_rx_net_stats(int sock, unsigned long seen) +void sock_rx_net_stats(int sock, unsigned long seen, unsigned long skip) { int ret; bool v3 = get_sockopt_tpacket(sock) == TPACKET_V3; @@ -157,11 +157,13 @@ void sock_rx_net_stats(int sock, unsigned long seen) } stats; socklen_t slen = v3 ? sizeof(stats.k3) : sizeof(stats.k2); + seen += skip; + memset(&stats, 0, sizeof(stats)); ret = getsockopt(sock, SOL_PACKET, PACKET_STATISTICS, &stats, &slen); if (ret > -1) { uint64_t packets = stats.k3.tp_packets; - uint64_t drops = stats.k3.tp_drops; + uint64_t drops = stats.k3.tp_drops + skip; printf("\r%12ld packets incoming (%ld unread on exit)\n", v3 ? seen : packets, v3 ? packets - seen : 0); diff --git a/ring_rx.h b/ring_rx.h index 17912fd2b0e9..77fc64c79267 100644 --- a/ring_rx.h +++ b/ring_rx.h @@ -21,7 +21,7 @@ extern void setup_rx_ring_layout(int sock, struct ring *ring, unsigned int size, bool jumbo_support, bool v3); extern void join_fanout_group(int sock, uint32_t fanout_group, uint32_t fanout_type); -extern void sock_rx_net_stats(int sock, unsigned long seen); +extern void sock_rx_net_stats(int sock, unsigned long seen, unsigned long skip); static inline int user_may_pull_from_rx(struct tpacket2_hdr *hdr) { -- 2.5.5