From 6c62b8a8b9d6a8e25c26757b18ba05c63ab4224b Mon Sep 17 00:00:00 2001 From: Daniel Borkmann Date: Mon, 14 May 2012 17:30:47 +0200 Subject: [PATCH] ring: add hw support for mmaped timestamping Signed-off-by: Daniel Borkmann --- src/netsniff-ng.c | 2 ++ src/ring.h | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) diff --git a/src/netsniff-ng.c b/src/netsniff-ng.c index 858996e..1c640bd 100644 --- a/src/netsniff-ng.c +++ b/src/netsniff-ng.c @@ -365,6 +365,7 @@ static void enter_mode_pcap_to_tx(struct mode *mode) bpf_parse_rules(mode->filter, &bpf_ops); set_packet_loss_discard(tx_sock); + set_sockopt_hwtimestamp(tx_sock, mode->device_out); setup_tx_ring_layout(tx_sock, &tx_ring, size, mode->jumbo_support); create_tx_ring(tx_sock, &tx_ring); mmap_tx_ring(tx_sock, &tx_ring); @@ -862,6 +863,7 @@ try_file: bpf_parse_rules(mode->filter, &bpf_ops); bpf_attach_to_sock(sock, &bpf_ops); + set_sockopt_hwtimestamp(sock, mode->device_in); setup_rx_ring_layout(sock, &rx_ring, size, mode->jumbo_support); create_rx_ring(sock, &rx_ring); mmap_rx_ring(sock, &rx_ring); diff --git a/src/ring.h b/src/ring.h index a6f0bc0..777e84e 100644 --- a/src/ring.h +++ b/src/ring.h @@ -16,6 +16,9 @@ #include #include #include +#include +#include +#include #include #include #include @@ -23,6 +26,7 @@ #include "xsys.h" #include "built_in.h" #include "mtrand.h" +#include "xstring.h" #include "die.h" #ifndef PACKET_FANOUT @@ -145,4 +149,66 @@ static inline void set_sockopt_fanout(int sock, unsigned int fanout_id, panic("No packet fanout support!\n"); } +#ifndef PACKET_TIMESTAMP +enum { + SOF_TIMESTAMPING_TX_HARDWARE = (1<<0), + SOF_TIMESTAMPING_TX_SOFTWARE = (1<<1), + SOF_TIMESTAMPING_RX_HARDWARE = (1<<2), + SOF_TIMESTAMPING_RX_SOFTWARE = (1<<3), + SOF_TIMESTAMPING_SOFTWARE = (1<<4), + SOF_TIMESTAMPING_SYS_HARDWARE = (1<<5), + SOF_TIMESTAMPING_RAW_HARDWARE = (1<<6), + SOF_TIMESTAMPING_MASK = + (SOF_TIMESTAMPING_RAW_HARDWARE - 1) | + SOF_TIMESTAMPING_RAW_HARDWARE +}; + +struct hwtstamp_config { + int flags; + int tx_type; + int rx_filter; +}; + +enum hwtstamp_tx_types { + HWTSTAMP_TX_OFF, + HWTSTAMP_TX_ON, + HWTSTAMP_TX_ONESTEP_SYNC, +}; + +enum hwtstamp_rx_filters { + HWTSTAMP_FILTER_NONE, + HWTSTAMP_FILTER_ALL, +}; + +# define PACKET_TIMESTAMP 17 +#else +# include +#endif /* PACKET_TIMESTAMP */ + +static inline void set_sockopt_hwtimestamp(int sock, char *dev) +{ + int timesource, ret; + struct hwtstamp_config hwconfig; + struct ifreq ifr; + + memset(&hwconfig, 0, sizeof(hwconfig)); + hwconfig.tx_type = HWTSTAMP_TX_ON; + hwconfig.rx_filter = HWTSTAMP_FILTER_ALL; + + memset(&ifr, 0, sizeof(ifr)); + strlcpy(ifr.ifr_name, dev, sizeof(ifr.ifr_name)); + ifr.ifr_data = &hwconfig; + + ret = ioctl(sock, SIOCSHWTSTAMP, &ifr); + if (ret < 0) + return; + + timesource = SOF_TIMESTAMPING_RAW_HARDWARE; + + ret = setsockopt(sock, SOL_PACKET, PACKET_TIMESTAMP, ×ource, + sizeof(timesource)); + if (ret) + panic("Cannot set timestamping!\n"); +} + #endif /* RING_H */ -- 2.11.4.GIT