From 05a5759674e8e7124984579c67b7bea40b8e3352 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Fr=C3=A9d=C3=A9ric=20Perrin?= Date: Wed, 1 Apr 2015 17:16:47 +0100 Subject: [PATCH] Keep track of lost packets as reported by pcap_stats On my machine, if I generate the following IPv6 flood: ip -6 neigh add fe80::1234 dev eth0 lladdr 00:11:22:33:44:55 nc -6 -u fe80::1234%eth0 1234 < /dev/zero The traffic reported by iftop is much less than the reality, as iftop can't read packets off pcap fast enough. This patch only demonstrate the problem, I haven't started to dig into the cause yet. --- iftop.c | 5 +++++ iftop.h | 1 + tui.c | 5 +++++ ui.c | 4 +++- 4 files changed, 14 insertions(+), 1 deletion(-) diff --git a/iftop.c b/iftop.c index 1640b11..562a45b 100644 --- a/iftop.c +++ b/iftop.c @@ -109,6 +109,8 @@ history_type* history_create() { void history_rotate() { hash_node_type* n = NULL; + struct pcap_stat ps; + history_pos = (history_pos + 1) % HISTORY_LENGTH; hash_next_item(history, &n); while(n != NULL) { @@ -134,6 +136,9 @@ void history_rotate() { if(history_len < HISTORY_LENGTH) { history_len++; } + + pcap_stats(pd, &ps); + history_totals.lost_packets = ps.ps_drop + ps.ps_ifdrop; } diff --git a/iftop.h b/iftop.h index f273c0f..e5279d1 100644 --- a/iftop.h +++ b/iftop.h @@ -28,6 +28,7 @@ typedef struct { long sent[HISTORY_LENGTH]; double long total_sent; double long total_recv; + long lost_packets; int last_write; } history_type; diff --git a/tui.c b/tui.c index 75c6e08..ebf7b4f 100644 --- a/tui.c +++ b/tui.c @@ -153,6 +153,11 @@ void tui_print() { readable_size(history_totals.total_recv + history_totals.total_sent, buf2_10, 10, 1024, 1); printf("%s %10s %10s %10s\n", labellong, buf0_10, buf1_10, buf2_10); + /* Dropped packets */ + snprintf(labellong, PRINT_WIDTH + 9, "%-*s", PRINT_WIDTH + 9, "Dropped packets:"); + readable_size(history_totals.lost_packets, buf0_10, 10, 1024, options.bandwidth_unit); + printf("%s %10s\n", labellong, buf0_10, buf1_10, buf2_10); + /* Double divider line */ for (j = 0; j < PRINT_WIDTH + 52; j++) { printf("="); diff --git a/ui.c b/ui.c index 771be31..37bf3d5 100644 --- a/ui.c +++ b/ui.c @@ -400,7 +400,9 @@ void ui_print() { readable_size(peakrecv / RESOLUTION, line, 10, 1024, options.bandwidth_unit); mvaddstr(y+1, 39, line); - readable_size(peaktotal / RESOLUTION, line, 10, 1024, options.bandwidth_unit); + /* lost packets */ + mvaddstr(y+2, 32, "lost: "); + readable_size(history_totals.lost_packets, line, 10, 1000, OPTION_BW_PKTS); mvaddstr(y+2, 39, line); mvaddstr(y, COLS - 8 * HISTORY_DIVISIONS - 8, "rates:"); -- 2.43.0