From 44280f571c8dd65cfb48930cdabe0151e6f90bcd Mon Sep 17 00:00:00 2001 From: Daniel Borkmann Date: Thu, 18 Oct 2012 13:28:32 +0200 Subject: [PATCH] src: switch from tpacketv1 to tpacketv2 Signed-off-by: Daniel Borkmann --- src/dissector.h | 8 ++++---- src/netsniff-ng.c | 6 +++--- src/pcap.h | 8 ++++---- src/ring.h | 17 +++++++++++++---- src/ring_rx.c | 2 ++ src/ring_rx.h | 4 ++-- src/ring_tx.c | 2 ++ src/ring_tx.h | 4 ++-- src/trafgen.c | 2 +- 9 files changed, 33 insertions(+), 20 deletions(-) diff --git a/src/dissector.h b/src/dissector.h index e776066b..9f07c615 100644 --- a/src/dissector.h +++ b/src/dissector.h @@ -70,13 +70,13 @@ static inline void show_frame_hdr(struct frame_map *hdr, int mode, case FNTTYPE_PRINT_HEX_ASCII: default: if (rmode == RING_MODE_INGRESS) { - tprintf("%s %u %u %u.%06u\n", + tprintf("%s %u %u %us.%uns\n", packet_types[hdr->s_ll.sll_pkttype], hdr->s_ll.sll_ifindex, hdr->tp_h.tp_len, - hdr->tp_h.tp_sec, hdr->tp_h.tp_usec); + hdr->tp_h.tp_sec, hdr->tp_h.tp_nsec); } else { - tprintf("%u %u.%06u\n", hdr->tp_h.tp_len, - hdr->tp_h.tp_sec, hdr->tp_h.tp_usec); + tprintf("%u %us.%uns\n", hdr->tp_h.tp_len, + hdr->tp_h.tp_sec, hdr->tp_h.tp_nsec); } break; } diff --git a/src/netsniff-ng.c b/src/netsniff-ng.c index 70b1de10..efee30b0 100644 --- a/src/netsniff-ng.c +++ b/src/netsniff-ng.c @@ -250,7 +250,7 @@ static void enter_mode_pcap_to_tx(struct mode *mode) hdr = tx_ring.frames[it].iov_base; /* Kernel assumes: data = ph.raw + po->tp_hdrlen - * sizeof(struct sockaddr_ll); */ - out = ((uint8_t *) hdr) + TPACKET_HDRLEN - + out = ((uint8_t *) hdr) + TPACKET2_HDRLEN - sizeof(struct sockaddr_ll); do { @@ -394,7 +394,7 @@ static void enter_mode_rx_to_tx(struct mode *mode) goto next; hdr_out = tx_ring.frames[it_out].iov_base; - out = ((uint8_t *) hdr_out) + TPACKET_HDRLEN - + out = ((uint8_t *) hdr_out) + TPACKET2_HDRLEN - sizeof(struct sockaddr_ll); for (; !user_may_pull_from_tx(tx_ring.frames[it_out].iov_base) && @@ -404,7 +404,7 @@ static void enter_mode_rx_to_tx(struct mode *mode) else next_slot(&it_out, &tx_ring); hdr_out = tx_ring.frames[it_out].iov_base; - out = ((uint8_t *) hdr_out) + TPACKET_HDRLEN - + out = ((uint8_t *) hdr_out) + TPACKET2_HDRLEN - sizeof(struct sockaddr_ll); } diff --git a/src/pcap.h b/src/pcap.h index d9e1bceb..0a7b0d63 100644 --- a/src/pcap.h +++ b/src/pcap.h @@ -63,11 +63,11 @@ struct pcap_pkthdr { uint32_t len; }; -static inline void tpacket_hdr_to_pcap_pkthdr(struct tpacket_hdr *thdr, +static inline void tpacket_hdr_to_pcap_pkthdr(struct tpacket2_hdr *thdr, struct pcap_pkthdr *phdr) { phdr->ts.tv_sec = thdr->tp_sec; - phdr->ts.tv_usec = thdr->tp_usec; + phdr->ts.tv_usec = (thdr->tp_nsec / 1000); phdr->caplen = thdr->tp_snaplen; /* FIXME */ /* phdr->len = thdr->tp_len; */ @@ -75,10 +75,10 @@ static inline void tpacket_hdr_to_pcap_pkthdr(struct tpacket_hdr *thdr, } static inline void pcap_pkthdr_to_tpacket_hdr(struct pcap_pkthdr *phdr, - struct tpacket_hdr *thdr) + struct tpacket2_hdr *thdr) { thdr->tp_sec = phdr->ts.tv_sec; - thdr->tp_usec = phdr->ts.tv_usec; + thdr->tp_nsec = phdr->ts.tv_usec * 1000; thdr->tp_snaplen = phdr->caplen; thdr->tp_len = phdr->len; } diff --git a/src/ring.h b/src/ring.h index 914e7885..3415dc6e 100644 --- a/src/ring.h +++ b/src/ring.h @@ -36,7 +36,7 @@ #endif struct frame_map { - struct tpacket_hdr tp_h __aligned_tpacket; + struct tpacket2_hdr tp_h __aligned_tpacket; struct sockaddr_ll s_ll __aligned_tpacket; }; @@ -108,11 +108,11 @@ static inline unsigned int ring_frame_size(struct ring *ring) return ring->layout.tp_frame_size; } -static inline void tpacket_hdr_clone(struct tpacket_hdr *thdrd, - struct tpacket_hdr *thdrs) +static inline void tpacket_hdr_clone(struct tpacket2_hdr *thdrd, + struct tpacket2_hdr *thdrs) { thdrd->tp_sec = thdrs->tp_sec; - thdrd->tp_usec = thdrs->tp_usec; + thdrd->tp_nsec = thdrs->tp_nsec; thdrd->tp_snaplen = thdrs->tp_snaplen; thdrd->tp_len = thdrs->tp_len; } @@ -148,6 +148,15 @@ static inline void set_sockopt_fanout(int sock, unsigned int fanout_id, panic("No packet fanout support!\n"); } +static inline void set_sockopt_tpacket(int sock) +{ + int ret, val = TPACKET_V2; + + ret = setsockopt(sock, SOL_PACKET, PACKET_VERSION, &val, sizeof(val)); + if (ret) + panic("Cannot set tpacketv2!\n"); +} + #if defined(__WITH_HARDWARE_TIMESTAMPING) # include diff --git a/src/ring_rx.c b/src/ring_rx.c index d05a5050..58d99629 100644 --- a/src/ring_rx.c +++ b/src/ring_rx.c @@ -56,6 +56,8 @@ void setup_rx_ring_layout(int sock, struct ring *ring, unsigned int size, void create_rx_ring(int sock, struct ring *ring) { int ret; + + set_sockopt_tpacket(sock); retry: ret = setsockopt(sock, SOL_PACKET, PACKET_RX_RING, &ring->layout, sizeof(ring->layout)); diff --git a/src/ring_rx.h b/src/ring_rx.h index 1b064acb..f1268e99 100644 --- a/src/ring_rx.h +++ b/src/ring_rx.h @@ -19,12 +19,12 @@ extern void bind_rx_ring(int sock, struct ring *ring, int ifindex); extern void setup_rx_ring_layout(int sock, struct ring *ring, unsigned int size, int jumbo_support); -static inline int user_may_pull_from_rx(struct tpacket_hdr *hdr) +static inline int user_may_pull_from_rx(struct tpacket2_hdr *hdr) { return ((hdr->tp_status & TP_STATUS_USER) == TP_STATUS_USER); } -static inline void kernel_may_pull_from_rx(struct tpacket_hdr *hdr) +static inline void kernel_may_pull_from_rx(struct tpacket2_hdr *hdr) { hdr->tp_status = TP_STATUS_KERNEL; } diff --git a/src/ring_tx.c b/src/ring_tx.c index f04d118c..bccfc0d7 100644 --- a/src/ring_tx.c +++ b/src/ring_tx.c @@ -66,6 +66,8 @@ void setup_tx_ring_layout(int sock, struct ring *ring, unsigned int size, void create_tx_ring(int sock, struct ring *ring) { int ret; + + set_sockopt_tpacket(sock); retry: ret = setsockopt(sock, SOL_PACKET, PACKET_TX_RING, &ring->layout, sizeof(ring->layout)); diff --git a/src/ring_tx.h b/src/ring_tx.h index a816c383..041b690d 100644 --- a/src/ring_tx.h +++ b/src/ring_tx.h @@ -23,12 +23,12 @@ extern void setup_tx_ring_layout(int sock, struct ring *ring, unsigned int size, int jumbo_support); extern void set_packet_loss_discard(int sock); -static inline int user_may_pull_from_tx(struct tpacket_hdr *hdr) +static inline int user_may_pull_from_tx(struct tpacket2_hdr *hdr) { return ((hdr->tp_status & TP_STATUS_AVAILABLE) == TP_STATUS_AVAILABLE); } -static inline void kernel_may_pull_from_tx(struct tpacket_hdr *hdr) +static inline void kernel_may_pull_from_tx(struct tpacket2_hdr *hdr) { hdr->tp_status = TP_STATUS_SEND_REQUEST; } diff --git a/src/trafgen.c b/src/trafgen.c index c5f40160..e441ce9d 100644 --- a/src/trafgen.c +++ b/src/trafgen.c @@ -413,7 +413,7 @@ static void tx_fastpath_or_die(struct mode *mode) /* Kernel assumes: data = ph.raw + po->tp_hdrlen - * sizeof(struct sockaddr_ll); */ - out = ((uint8_t *) hdr) + TPACKET_HDRLEN - + out = ((uint8_t *) hdr) + TPACKET2_HDRLEN - sizeof(struct sockaddr_ll); hdr->tp_h.tp_snaplen = packets[i].len; -- 2.11.4.GIT