trafgen: speedup TX only path by avoiding kernel packet_rcv() call

The tool trafgen is used in a pktgen style transmit only scenario.

We discovered a performance bottleneck in the kernel, when
running trafgen, where the kernel stalled on a lock in
packet_rcv().  This call is unnecessary for trafgen given its
transmit only nature.

This packet_rcv() call can, easily be avoided by instructing the
RAW/PF_PACKET socket, to not listen to any protocols (by passing
protocol argument zero, when creating the socket).

The performance gain is huge, increasing performance from approx
max 2Mpps to 12Mpps, basically causing trafgen to scale with
the number of CPUs.

Following tests were run on a 2xCPU E5-2650 with Intel 10Gbit/s ixgbe:

Trafgen using sendto() syscall via parameter -t0:
 *  # CPUs --  *with*    --  *without* packet_rcv() call
 *  1 CPU  ==  1,232,244 --  1,236,144 pkts/sec
 *  2 CPUs ==  1,592,720 --  2,593,620 pkts/sec
 *  3 CPUs ==  1,635,623 --  3,692,216 pkts/sec
 *  4 CPUs ==  1,567,768 --  4,102,866 pkts/sec
 *  5 CPUs ==  1,700,270 --  5,151,489 pkts/sec
 *  6 CPUs ==  1,762,392 --  6,124,512 pkts/sec
 *  7 CPUs ==  1,850,139 --  7,120,496 pkts/sec
 *  8 CPUs ==  1,770,909 --  8,058,710 pkts/sec
 *  9 CPUs ==  1,721,072 --  8,963,192 pkts/sec
 * 10 CPUs ==  1,359,157 --  9,584,535 pkts/sec
 * 11 CPUs ==  1,175,520 -- 10,498,038 pkts/sec
 * 12 CPUs ==  1,075,867 -- 11,189,292 pkts/sec
 * 13 CPUs ==  1,012,602 -- 12,048,836 pkts/sec
 * [...]
 * 20 CPUs ==  1,030,446 -- 11,202,449 pkts/sec

Trafgen using mmap() TX tpacket_v2 (default)
 *  # CPUs --  *with*    --  *without* packet_rcv() call
 *  1 CPU  ==    920,682 --    927,984 pkts/sec
 *  2 CPUs ==  1,607,940 --  2,061,406 pkts/sec
 *  3 CPUs ==  1,668,488 --  2,979,463 pkts/sec
 *  4 CPUs ==  1,423,066 --  3,169,565 pkts/sec
 *  5 CPUs ==  1,507,708 --  3,910,756 pkts/sec
 *  6 CPUs ==  1,555,616 --  4,625,844 pkts/sec
 *  7 CPUs ==  1,560,961 --  5,298,441 pkts/sec
 *  8 CPUs ==  1,596,092 --  6,000,465 pkts/sec
 *  9 CPUs ==  1,575,139 --  6,722,130 pkts/sec
 * 10 CPUs ==  1,311,676 --  7,114,202 pkts/sec
 * 11 CPUs ==  1,157,650 --  7,859,399 pkts/sec
 * 12 CPUs ==  1,060,366 --  8,491,004 pkts/sec
 * 13 CPUs ==  1,012,956 --  9,269,761 pkts/sec
 * [...]
 * 20 CPUs ==    955,716 --  8,653,947 pkts/sec

It is fairly strange that the mmap() version runs slower than the
sendto() version.  This is likely another performance problem related
to mmap() which seems worth fixing.

Note, that the mmap() version speed can be improved by reducing the
default --ring-size to around 1-2 MiB.  But this does not fix general
trend with mmap() performance.

Signed-off-by: Jesper Dangaard Brouer <brouer@redhat.com>
trafgen: take advantage of PACKET_QDISC_BYPASS sock option

Since Linux 3.14, the kernel supports a socket option PACKET_QDISC_BYPASS,
which trafgen enables by default. That allow us to bypass the kernels
normal qdisc (traffic control) layer.

An option -q, --qdisc-path is added to allow enabling the qdisc path
explicity, useful for testing purposes.

This will be avail in kernels >= 3.14 via
 commit d346a3fae3 (packet: introduce PACKET_QDISC_BYPASS socket option).

Signed-off-by: Jesper Dangaard Brouer <brouer@redhat.com>
debian: define SPEED_UNKNOWN if missing in linux/ethtool.h

Debian's version of linux/ethtool.h seems to be outdated
and does not contain define SPEED_UNKNOWN, fix this by a
manual define.

Signed-off-by: Jesper Dangaard Brouer <brouer@redhat.com>
debian: compile fix for programs using ncurses

For some reason the Debian ncurses version does not
contain a ncurses.pc pkg-config file.

Fix this by echoing "-lncurses" if the command fails:
 pkg-config --libs ncurses

This fix will make ifpps compile on Debian Squeeze 6.0.8.

Signed-off-by: Jesper Dangaard Brouer <brouer@redhat.com>
netsniff-ng 0.5.8-rc5

Signed-off-by: Tobias Klauser <tklauser@distanz.ch>
trafgen: Don't modify optarg/argv

Follow commit bed9b6bb ("netsniff-ng: Don't modify optarg/argv").

We shouldn't modify optarg (and thus argv) since it's e.g. used to
display the commandline string in `ps'. Since strtoul() reads until it
encounters the first non-numeric character and ignores the rest, we can
just revert from setting a NULL byte after the numeric part of the
string.

Signed-off-by: Tobias Klauser <tklauser@distanz.ch>
docs: update credits for former maintainership

Emma was former also one of the maintainer in the old days.

Signed-off-by: Daniel Borkmann <dborkman@redhat.com>
build: Use new git repo URL in release announcement message template

Signed-off-by: Tobias Klauser <tklauser@distanz.ch>
netsniff-ng: Exit gracefully for all possible termination signals

Handle all termination signals that we're allowed to handle (SIGKILL
can't be handled) in order to exit gracefully in any regular termination
case. Without this fix, pcap files written by netsniff-ng might be
corrupted.

Reported-by: Mike Westmacott <mikewestmacott@googlemail.com>
Signed-off-by: Tobias Klauser <tklauser@distanz.ch>
trafgen: Exit gracefully for all possible termination signals

Handle all termination signals that we're allowed to handle (SIGKILL
can't be handled) in order to exit gracefully in any regular termination
case.

Signed-off-by: Tobias Klauser <tklauser@distanz.ch>
astraceroute: Exit gracefully for all possible termination signals

Handle all termination signals that we're allowed to handle (SIGKILL
can't be handled) in order to exit gracefully in any regular termination
case.

Signed-off-by: Tobias Klauser <tklauser@distanz.ch>
flowtop: Exit gracefully for all possible termination signals

Handle all termination signals that we're allowed to handle (SIGKILL
can't be handled) in order to exit gracefully in any regular termination
case.

Signed-off-by: Tobias Klauser <tklauser@distanz.ch>
ifpps: Exit gracefully for all possible termination signals

Handle all termination signals that we're allowed to handle (SIGKILL
can't be handled) in order to exit gracefully in any regular termination
case.

Signed-off-by: Tobias Klauser <tklauser@distanz.ch>
build: Set SHELL make variable to bash if possible

On Debian/Ubuntu systems, /bin/sh is /bin/dash which doesn't understand
the -e option to the `echo' builtin. Thus the build output looks
something like the following:

Building netsniff-ng toolkit (0.5.8-rc5+) for x86_64-linux-gnu:
Building netsniff-ng:
-e   CC	dissector.c
-e   CC	dissector_eth.c
-e   CC	dissector_80211.c
...

Prevent this by setting SHELL to /bin/bash if it exists on the system,
otherwise stick to /bin/sh.

Signed-off-by: Tobias Klauser <tklauser@distanz.ch>
ring: Get rid of unnecessary wrapper for get_sockopt_tpacket

get_sockopt_tpacket is never used in the "raw" version and the wrapper
does no additional checking anyway, so get rid of it.

Signed-off-by: Tobias Klauser <tklauser@distanz.ch>
dissectors: Get rid of unecessary includes of protos.h

This header is actually only needed in dissector_eth and
dissector_80211, so remove the other users accordingly.

Signed-off-by: Tobias Klauser <tklauser@distanz.ch>
conf: oui: update oui.conf

Update OUI entries using oui-update.py

Signed-off-by: Tobias Klauser <tklauser@distanz.ch>
ifpps: Reorder buffer allocation and file opening in stats_proc_interrupts

We don't need the file open to allocate the buffer so open it just
before it's used for the first time.

Signed-off-by: Tobias Klauser <tklauser@distanz.ch>
dissectors: ethernet: Handle multicast/broadcast addresses properly

Until now, we just looked up the vendor string based on the OUI for each
MAC address. Thus, multicast and broadcast addresses were just printed
as "Unknown" which is a bit misleading.

Improve this situation by checking bit 0 of the 1st octet of the address
and by checking for the broadcast address if it is set. If a
multicast/broadcast address is found, the respective string is returned.
In all other cases, the existing OUI lookup is done.

In the future we might extend this mechanism to look up well-known
multicast addresses.

Signed-off-by: Tobias Klauser <tklauser@distanz.ch>
build: fix syntax error when detecting SHELL make variable

Fix the shell syntax error, introduced in:
 commit 11c34c86ca4 (build: Set SHELL make variable to bash if possible)

Signed-off-by: Jesper Dangaard Brouer <brouer@redhat.com>