summaryrefslogtreecommitdiff
path: root/ring_rx.c
diff options
context:
space:
mode:
authorDaniel Borkmann <dborkman@redhat.com>2013-06-03 23:24:18 +0200
committerDaniel Borkmann <dborkman@redhat.com>2013-06-03 23:26:45 +0200
commit3e071a78f2a5c7424340b4c8b446d51e82413c13 (patch)
tree2a411f35daeae48be99a8d325f88dcbd63bb0f2a /ring_rx.c
parentdc5f7a04f2b446b5224be356c2fc79e88a5d3e8f (diff)
netsniff-ng: v3: fix packet accounting on --num
We need to carry frame_count through multiple calls of walk function to account correctly for --num <pkts>. Also, move socket stats printing into rx ring, since it belongs there. Todo: the kernel socket seems to have a different count that what we see. This needs to be fixed one way or the other. Not yet sure what's causing this. Signed-off-by: Daniel Borkmann <dborkman@redhat.com>
Diffstat (limited to 'ring_rx.c')
-rw-r--r--ring_rx.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/ring_rx.c b/ring_rx.c
index 28ecaf4..c674332 100644
--- a/ring_rx.c
+++ b/ring_rx.c
@@ -130,3 +130,28 @@ void bind_rx_ring(int sock, struct ring *ring, int ifindex)
{
bind_ring_generic(sock, ring, ifindex);
}
+
+void sock_rx_net_stats(int sock)
+{
+ int ret;
+ bool v3 = get_sockopt_tpacket(sock) == TPACKET_V3;
+ union {
+ struct tpacket_stats k2;
+ struct tpacket_stats_v3 k3;
+ } stats;
+ socklen_t slen = v3 ? sizeof(stats.k3) : sizeof(stats.k2);
+
+ 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;
+
+ printf("\r%12ld packets incoming\n", packets);
+ printf("\r%12ld packets passed filter\n", packets - drops);
+ printf("\r%12ld packets failed filter (out of space)\n", drops);
+ if (stats.k3.tp_packets > 0)
+ printf("\r%12.4lf%\% packet droprate\n",
+ (1.0 * drops / packets) * 100.0);
+ }
+}