Dropped packets are packets which were handled by an interface,
but were not handled by our packet capturing interface. These drops are
caused by e.g. packet bursts which overflow socket buffers or by
excessive packet count which iptraf-ng cannot handle on given hardware.
Show this counter on each screen.
Signed-off-by: Vitezslav Samel <vitezslav(a)samel.cz>
---
src/deskman.c | 6 ++++++
src/deskman.h | 1 +
src/detstats.c | 5 +++++
src/hostmon.c | 7 ++++---
src/ifstats.c | 7 ++++---
src/itrafmon.c | 5 +++++
src/packet.c | 13 +++++++++++++
src/packet.h | 1 +
src/pktsize.c | 4 ++++
src/serv.c | 4 ++++
10 files changed, 47 insertions(+), 6 deletions(-)
diff --git a/src/deskman.c b/src/deskman.c
index ba73796..58c3c8d 100644
--- a/src/deskman.c
+++ b/src/deskman.c
@@ -190,6 +190,12 @@ void printlargenum(unsigned long long i, WINDOW * win)
wprintw(win, "%8lluT", i / 1000000000000ULL);
}
+void print_packet_drops(unsigned long count, WINDOW *win, int y, int x)
+{
+ wattrset(win, BOXATTR);
+ mvwprintw(win, y, x, " Dropped packets: %lu ", count);
+}
+
int screen_update_needed(const struct timeval *now, const struct timeval *last)
{
unsigned long msecs = timeval_diff_msec(now, last);
diff --git a/src/deskman.h b/src/deskman.h
index 7536459..7f6a72f 100644
--- a/src/deskman.h
+++ b/src/deskman.h
@@ -17,6 +17,7 @@ void scrollkeyhelp(void);
void stdexitkeyhelp(void);
void indicate(char *message);
void printlargenum(unsigned long long i, WINDOW * win);
+void print_packet_drops(unsigned long count, WINDOW *win, int y, int x);
int screen_update_needed(const struct timeval *now, const struct timeval *last);
void infobox(char *text, char *prompt);
void standardcolors(int color);
diff --git a/src/detstats.c b/src/detstats.c
index 6d8ca07..62d77c8 100644
--- a/src/detstats.c
+++ b/src/detstats.c
@@ -292,6 +292,8 @@ void detstats(char *iface, time_t facilitytime)
struct pkt_hdr pkt;
+ unsigned long dropped = 0UL;
+
if (!dev_up(iface)) {
err_iface_down();
return;
@@ -401,6 +403,9 @@ void detstats(char *iface, time_t facilitytime)
wattrset(statwin, BOXATTR);
printelapsedtime(statbegin, now, LINES - 3, 1, statwin);
+ dropped += packet_get_dropped(fd);
+ print_packet_drops(dropped, statwin, LINES - 3, 49);
+
msecs = timeval_diff_msec(&tv, &start_tv);
rate_add_rate(&rate, span.proto_total.pc_bytes, msecs);
diff --git a/src/hostmon.c b/src/hostmon.c
index 71a1836..f780621 100644
--- a/src/hostmon.c
+++ b/src/hostmon.c
@@ -172,9 +172,6 @@ static void initethtab(struct ethtab *table)
mvwprintw(table->borderwin, 0, 61 * COLS / 80, " BytesOut ");
mvwprintw(table->borderwin, 0, 70 * COLS / 80, " OutRate ");
- mvwprintw(table->borderwin, LINES - 3, 40,
- " InRate and OutRate are in %s ", dispmode(options.actmode));
-
wattrset(table->tabwin, STDATTR);
tx_colorwin(table->tabwin);
tx_stdwinset(table->tabwin);
@@ -760,6 +757,8 @@ void hostmon(time_t facilitytime, char *ifptr)
struct pkt_hdr pkt;
+ unsigned long dropped = 0UL;
+
if (ifptr && !dev_up(ifptr)) {
err_iface_down();
return;
@@ -834,6 +833,8 @@ void hostmon(time_t facilitytime, char *ifptr)
printelapsedtime(statbegin, now, LINES - 3, 15,
table.borderwin);
updateethrates(&table, msecs, idx);
+ dropped += packet_get_dropped(fd);
+ print_packet_drops(dropped, table.borderwin, LINES - 3, 49);
tv_rate = tv;
}
if (logging) {
diff --git a/src/ifstats.c b/src/ifstats.c
index 097fde1..7c5df73 100644
--- a/src/ifstats.c
+++ b/src/ifstats.c
@@ -363,9 +363,6 @@ static void initiftab(struct iftab *table)
wtimeout(table->statwin, -1);
wattrset(table->statwin, STDATTR);
tx_colorwin(table->statwin);
- wattrset(table->statwin, BOXATTR);
- mvwprintw(table->borderwin, LINES - 3, 32 * COLS / 80,
- " Total, IP, NonIP, and BadIP are packet counts ");
}
/*
@@ -429,6 +426,8 @@ void ifstats(time_t facilitytime)
struct pkt_hdr pkt;
+ unsigned long dropped = 0UL;
+
struct timeval tv;
time_t starttime = 0;
time_t statbegin = 0;
@@ -507,6 +506,8 @@ void ifstats(time_t facilitytime)
showrates(&table);
printelapsedtime(statbegin, now, LINES - 3, 1,
table.borderwin);
+ dropped += packet_get_dropped(fd);
+ print_packet_drops(dropped, table.borderwin, LINES - 3, 49);
starttime = now;
start_tv = tv;
}
diff --git a/src/itrafmon.c b/src/itrafmon.c
index 5882dea..b7afd25 100644
--- a/src/itrafmon.c
+++ b/src/itrafmon.c
@@ -590,6 +590,8 @@ void ipmon(time_t facilitytime, char *ifptr)
struct pkt_hdr pkt;
+ unsigned long dropped = 0UL;
+
int ch;
int keymode = 0;
char msgstring[80];
@@ -751,6 +753,9 @@ void ipmon(time_t facilitytime, char *ifptr)
"No TCP entries ");
}
tv_rate = tv;
+
+ dropped += packet_get_dropped(fd);
+ print_packet_drops(dropped, othptbl.borderwin, othptbl.obmaxy - 1, 49);
}
/*
diff --git a/src/packet.c b/src/packet.c
index 331da82..96e6492 100644
--- a/src/packet.c
+++ b/src/packet.c
@@ -356,3 +356,16 @@ void packet_destroy(struct pkt_hdr *pkt)
destroyfraglist();
}
+
+unsigned int packet_get_dropped(int fd)
+{
+ struct tpacket_stats stats;
+ socklen_t len = sizeof(stats);
+
+ memset(&stats, 0, len);
+ int err = getsockopt(fd, SOL_PACKET, PACKET_STATISTICS, &stats, &len);
+ if (err < 0)
+ die_errno("%s(): getsockopt(PACKET_STATISTICS)", __func__);
+
+ return stats.tp_drops;
+}
diff --git a/src/packet.h b/src/packet.h
index 8027760..d23c831 100644
--- a/src/packet.h
+++ b/src/packet.h
@@ -67,5 +67,6 @@ int packet_process(struct pkt_hdr *pkt, unsigned int *total_br,
int match_opposite, int v6inv4asv6);
int packet_init(struct pkt_hdr *pkt);
void packet_destroy(struct pkt_hdr *pkt);
+unsigned int packet_get_dropped(int fd);
#endif /* IPTRAF_NG_PACKET_H */
diff --git a/src/pktsize.c b/src/pktsize.c
index 413d768..668b103 100644
--- a/src/pktsize.c
+++ b/src/pktsize.c
@@ -166,6 +166,8 @@ void packet_size_breakdown(char *ifname, time_t facilitytime)
struct pkt_hdr pkt;
+ unsigned long dropped = 0UL;
+
if (!dev_up(ifname)) {
err_iface_down();
goto err_unmark;
@@ -268,6 +270,8 @@ void packet_size_breakdown(char *ifname, time_t facilitytime)
if (now - timeint >= 5) {
printelapsedtime(starttime, now, LINES - 3, 1,
borderwin);
+ dropped += packet_get_dropped(fd);
+ print_packet_drops(dropped, borderwin, LINES - 3, 49);
timeint = now;
}
if (logging) {
diff --git a/src/serv.c b/src/serv.c
index 9e57220..04bdaea 100644
--- a/src/serv.c
+++ b/src/serv.c
@@ -767,6 +767,8 @@ void servmon(char *ifname, time_t facilitytime)
int fd;
+ unsigned long dropped = 0UL;
+
struct porttab *ports;
struct pkt_hdr pkt;
@@ -873,6 +875,8 @@ void servmon(char *ifname, time_t facilitytime)
if (list.barptr != NULL)
print_serv_rates(list.barptr, statwin);
+ dropped += packet_get_dropped(fd);
+ print_packet_drops(dropped, list.borderwin, LINES - 4, 49);
tv_rate = tv;
}
--
1.9.1