ring: add set_sockopt_tpacket_v3 and refactor others
[netsniff-ng.git] / ring.h
blob0ef42d1a0dc0dd9110c889d27902fc1c496266e2
1 /*
2 * netsniff-ng - the packet sniffing beast
3 * Copyright 2009, 2010 Daniel Borkmann.
4 * Subject to the GPL, version 2.
5 */
7 #ifndef RING_H
8 #define RING_H
11 * "I love the smell of 10GbE in the morning. Smells like ... victory."
12 * - W. Richard Stevens, "Secret Teachings of the UNIX Environment"
15 #include <stdio.h>
16 #include <stdint.h>
17 #include <linux/if_packet.h>
18 #include <linux/socket.h>
19 #include <linux/sockios.h>
20 #include <sys/ioctl.h>
21 #include <string.h>
22 #include <poll.h>
23 #include <sys/poll.h>
25 #include "xutils.h"
26 #include "built_in.h"
27 #include "die.h"
29 struct frame_map {
30 struct tpacket2_hdr tp_h __aligned_tpacket;
31 struct sockaddr_ll s_ll __align_tpacket(sizeof(struct tpacket2_hdr));
34 struct ring {
35 struct iovec *frames;
36 uint8_t *mm_space;
37 size_t mm_len;
38 struct tpacket_req layout;
39 struct sockaddr_ll s_ll;
42 static inline void next_rnd_slot(unsigned int *it, struct ring *ring)
44 *it = rand() % ring->layout.tp_frame_nr;
47 #define RING_SIZE_FALLBACK (1 << 26)
49 static inline unsigned int ring_size(char *ifname, unsigned int size)
51 if (size > 0)
52 return size;
55 * Device bitrate in bytes times two as ring size.
56 * Fallback => ~ 64,00 MB
57 * 10 MBit => ~ 2,38 MB
58 * 54 MBit => ~ 12,88 MB
59 * 100 MBit => ~ 23,84 MB
60 * 300 MBit => ~ 71,52 MB
61 * 1.000 MBit => ~ 238,42 MB
62 * 10.000 MBit => ~ 2.384.18 MB
64 size = device_bitrate(ifname);
65 size = (size * 1000000) / 8;
66 size = size * 2;
67 if (size == 0)
68 size = RING_SIZE_FALLBACK;
70 return round_up_cacheline(size);
73 static inline unsigned int ring_frame_size(struct ring *ring)
75 return ring->layout.tp_frame_size;
78 static inline void tpacket_hdr_clone(struct tpacket2_hdr *thdrd,
79 struct tpacket2_hdr *thdrs)
81 thdrd->tp_sec = thdrs->tp_sec;
82 thdrd->tp_nsec = thdrs->tp_nsec;
83 thdrd->tp_snaplen = thdrs->tp_snaplen;
84 thdrd->tp_len = thdrs->tp_len;
87 #ifndef POLLRDNORM
88 # define POLLRDNORM 0x0040
89 #endif
90 #ifndef POLLWRNORM
91 # define POLLWRNORM 0x0100
92 #endif
93 #ifndef POLLRDHUP
94 # define POLLRDHUP 0x2000
95 #endif
97 static inline void prepare_polling(int sock, struct pollfd *pfd)
99 memset(pfd, 0, sizeof(*pfd));
100 pfd->fd = sock;
101 pfd->revents = 0;
102 pfd->events = POLLIN | POLLRDNORM | POLLERR;
105 static inline void __set_sockopt_tpacket(int sock, int val)
107 int ret = setsockopt(sock, SOL_PACKET, PACKET_VERSION, &val, sizeof(val));
108 if (ret)
109 panic("Cannot set tpacketv2!\n");
112 static inline void set_sockopt_tpacket_v2(int sock)
114 __set_sockopt_tpacket(sock, TPACKET_V2);
117 static inline void set_sockopt_tpacket_v3(int sock)
119 __set_sockopt_tpacket(sock, TPACKET_V3);
122 #endif /* RING_H */