From d040e1715d0afb74a474bcf1552e250cbceb8966 Mon Sep 17 00:00:00 2001 From: Daniel Borkmann Date: Sat, 16 Mar 2013 14:25:20 +0100 Subject: netsniff-ng trafgen: check return value of pull_and_flush_ring Let us check the return value when the timer triggers a TX flush request to the kernel. However, ignore the case of BADFS and NOBUFS. The socket could already have been closed before the timer triggers in the first case, and in the second, we just let the next timer continue processing if currently the buffer space is exhausted. Signed-off-by: Daniel Borkmann --- netsniff-ng.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'netsniff-ng.c') diff --git a/netsniff-ng.c b/netsniff-ng.c index 94fb313..6f7c4c2 100644 --- a/netsniff-ng.c +++ b/netsniff-ng.c @@ -115,8 +115,19 @@ static void signal_handler(int number) static void timer_elapsed(int unused) { + int ret; + set_itimer_interval_value(&itimer, 0, interval); - pull_and_flush_tx_ring(tx_sock); + + ret = pull_and_flush_tx_ring(tx_sock); + if (unlikely(ret < 0)) { + /* We could hit EBADF if the socket has been closed before + * the timer was triggered. + */ + if (errno != EBADF && errno != ENOBUFS) + panic("Flushing TX_RING failed: %s!\n", strerror(errno)); + } + setitimer(ITIMER_REAL, &itimer, NULL); } -- cgit v1.2.3-54-g00ecf