if_packet.h 7.2 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3
#ifndef __LINUX_IF_PACKET_H
#define __LINUX_IF_PACKET_H

A
Al Viro 已提交
4 5
#include <linux/types.h>

E
Eric Dumazet 已提交
6
struct sockaddr_pkt {
L
Linus Torvalds 已提交
7 8
	unsigned short spkt_family;
	unsigned char spkt_device[14];
A
Al Viro 已提交
9
	__be16 spkt_protocol;
L
Linus Torvalds 已提交
10 11
};

E
Eric Dumazet 已提交
12
struct sockaddr_ll {
L
Linus Torvalds 已提交
13
	unsigned short	sll_family;
A
Al Viro 已提交
14
	__be16		sll_protocol;
L
Linus Torvalds 已提交
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
	int		sll_ifindex;
	unsigned short	sll_hatype;
	unsigned char	sll_pkttype;
	unsigned char	sll_halen;
	unsigned char	sll_addr[8];
};

/* Packet types */

#define PACKET_HOST		0		/* To us		*/
#define PACKET_BROADCAST	1		/* To all		*/
#define PACKET_MULTICAST	2		/* To group		*/
#define PACKET_OTHERHOST	3		/* To someone else 	*/
#define PACKET_OUTGOING		4		/* Outgoing of any type */
/* These ones are invisible by user level */
#define PACKET_LOOPBACK		5		/* MC/BRD frame looped back */
#define PACKET_FASTROUTE	6		/* Fastrouted frame	*/

/* Packet socket options */

#define PACKET_ADD_MEMBERSHIP		1
#define PACKET_DROP_MEMBERSHIP		2
#define PACKET_RECV_OUTPUT		3
/* Value 4 is still used by obsolete turbo-packet. */
#define PACKET_RX_RING			5
#define PACKET_STATISTICS		6
#define PACKET_COPY_THRESH		7
42
#define PACKET_AUXDATA			8
43
#define PACKET_ORIGDEV			9
44 45
#define PACKET_VERSION			10
#define PACKET_HDRLEN			11
46
#define PACKET_RESERVE			12
J
Johann Baudy 已提交
47 48
#define PACKET_TX_RING			13
#define PACKET_LOSS			14
49
#define PACKET_VNET_HDR			15
50
#define PACKET_TX_TIMESTAMP		16
51
#define PACKET_TIMESTAMP		17
D
David S. Miller 已提交
52
#define PACKET_FANOUT			18
53
#define PACKET_TX_HAS_OFF		19
54
#define PACKET_QDISC_BYPASS		20
D
David S. Miller 已提交
55 56 57

#define PACKET_FANOUT_HASH		0
#define PACKET_FANOUT_LB		1
58
#define PACKET_FANOUT_CPU		2
59
#define PACKET_FANOUT_ROLLOVER		3
60
#define PACKET_FANOUT_RND		4
61
#define PACKET_FANOUT_FLAG_ROLLOVER	0x1000
62
#define PACKET_FANOUT_FLAG_DEFRAG	0x8000
L
Linus Torvalds 已提交
63

E
Eric Dumazet 已提交
64
struct tpacket_stats {
L
Linus Torvalds 已提交
65 66 67 68
	unsigned int	tp_packets;
	unsigned int	tp_drops;
};

69 70 71 72 73 74 75 76 77 78 79
struct tpacket_stats_v3 {
	unsigned int	tp_packets;
	unsigned int	tp_drops;
	unsigned int	tp_freeze_q_cnt;
};

union tpacket_stats_u {
	struct tpacket_stats stats1;
	struct tpacket_stats_v3 stats3;
};

E
Eric Dumazet 已提交
80
struct tpacket_auxdata {
81 82 83 84 85
	__u32		tp_status;
	__u32		tp_len;
	__u32		tp_snaplen;
	__u16		tp_mac;
	__u16		tp_net;
86
	__u16		tp_vlan_tci;
87
	__u16		tp_vlan_tpid;
88 89
};

J
Johann Baudy 已提交
90
/* Rx ring - header status */
91 92 93 94 95 96 97 98
#define TP_STATUS_KERNEL		      0
#define TP_STATUS_USER			(1 << 0)
#define TP_STATUS_COPY			(1 << 1)
#define TP_STATUS_LOSING		(1 << 2)
#define TP_STATUS_CSUMNOTREADY		(1 << 3)
#define TP_STATUS_VLAN_VALID		(1 << 4) /* auxdata has valid tp_vlan_tci */
#define TP_STATUS_BLK_TMO		(1 << 5)
#define TP_STATUS_VLAN_TPID_VALID	(1 << 6) /* auxdata has valid tp_vlan_tpid */
J
Johann Baudy 已提交
99 100

/* Tx ring - header status */
101 102 103 104
#define TP_STATUS_AVAILABLE	      0
#define TP_STATUS_SEND_REQUEST	(1 << 0)
#define TP_STATUS_SENDING	(1 << 1)
#define TP_STATUS_WRONG_FORMAT	(1 << 2)
J
Johann Baudy 已提交
105

106 107 108 109 110
/* Rx and Tx ring - header status */
#define TP_STATUS_TS_SOFTWARE		(1 << 29)
#define TP_STATUS_TS_SYS_HARDWARE	(1 << 30)
#define TP_STATUS_TS_RAW_HARDWARE	(1 << 31)

111 112 113
/* Rx ring - feature request bits */
#define TP_FT_REQ_FILL_RXHASH	0x1

E
Eric Dumazet 已提交
114
struct tpacket_hdr {
L
Linus Torvalds 已提交
115 116 117 118 119 120 121 122 123 124 125 126 127
	unsigned long	tp_status;
	unsigned int	tp_len;
	unsigned int	tp_snaplen;
	unsigned short	tp_mac;
	unsigned short	tp_net;
	unsigned int	tp_sec;
	unsigned int	tp_usec;
};

#define TPACKET_ALIGNMENT	16
#define TPACKET_ALIGN(x)	(((x)+TPACKET_ALIGNMENT-1)&~(TPACKET_ALIGNMENT-1))
#define TPACKET_HDRLEN		(TPACKET_ALIGN(sizeof(struct tpacket_hdr)) + sizeof(struct sockaddr_ll))

E
Eric Dumazet 已提交
128
struct tpacket2_hdr {
129 130 131 132 133 134 135
	__u32		tp_status;
	__u32		tp_len;
	__u32		tp_snaplen;
	__u16		tp_mac;
	__u16		tp_net;
	__u32		tp_sec;
	__u32		tp_nsec;
136
	__u16		tp_vlan_tci;
137 138
	__u16		tp_vlan_tpid;
	__u8		tp_padding[4];
139 140
};

141
struct tpacket_hdr_variant1 {
142 143
	__u32	tp_rxhash;
	__u32	tp_vlan_tci;
144 145
	__u16	tp_vlan_tpid;
	__u16	tp_padding;
146 147 148 149 150 151 152 153 154 155 156 157 158
};

struct tpacket3_hdr {
	__u32		tp_next_offset;
	__u32		tp_sec;
	__u32		tp_nsec;
	__u32		tp_snaplen;
	__u32		tp_len;
	__u32		tp_status;
	__u16		tp_mac;
	__u16		tp_net;
	/* pkt_hdr variants */
	union {
159
		struct tpacket_hdr_variant1 hv1;
160
	};
161
	__u8		tp_padding[8];
162 163
};

164
struct tpacket_bd_ts {
165 166 167 168 169 170 171
	unsigned int ts_sec;
	union {
		unsigned int ts_usec;
		unsigned int ts_nsec;
	};
};

172
struct tpacket_hdr_v1 {
173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190
	__u32	block_status;
	__u32	num_pkts;
	__u32	offset_to_first_pkt;

	/* Number of valid bytes (including padding)
	 * blk_len <= tp_block_size
	 */
	__u32	blk_len;

	/*
	 * Quite a few uses of sequence number:
	 * 1. Make sure cache flush etc worked.
	 *    Well, one can argue - why not use the increasing ts below?
	 *    But look at 2. below first.
	 * 2. When you pass around blocks to other user space decoders,
	 *    you can see which blk[s] is[are] outstanding etc.
	 * 3. Validate kernel code.
	 */
191
	__aligned_u64	seq_num;
192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217

	/*
	 * ts_last_pkt:
	 *
	 * Case 1.	Block has 'N'(N >=1) packets and TMO'd(timed out)
	 *		ts_last_pkt == 'time-stamp of last packet' and NOT the
	 *		time when the timer fired and the block was closed.
	 *		By providing the ts of the last packet we can absolutely
	 *		guarantee that time-stamp wise, the first packet in the
	 *		next block will never precede the last packet of the
	 *		previous block.
	 * Case 2.	Block has zero packets and TMO'd
	 *		ts_last_pkt = time when the timer fired and the block
	 *		was closed.
	 * Case 3.	Block has 'N' packets and NO TMO.
	 *		ts_last_pkt = time-stamp of the last pkt in the block.
	 *
	 * ts_first_pkt:
	 *		Is always the time-stamp when the block was opened.
	 *		Case a)	ZERO packets
	 *			No packets to deal with but atleast you know the
	 *			time-interval of this block.
	 *		Case b) Non-zero packets
	 *			Use the ts of the first packet in the block.
	 *
	 */
218
	struct tpacket_bd_ts	ts_first_pkt, ts_last_pkt;
219 220
};

221 222
union tpacket_bd_header_u {
	struct tpacket_hdr_v1 bh1;
223 224
};

225
struct tpacket_block_desc {
226 227
	__u32 version;
	__u32 offset_to_priv;
228
	union tpacket_bd_header_u hdr;
229 230
};

231
#define TPACKET2_HDRLEN		(TPACKET_ALIGN(sizeof(struct tpacket2_hdr)) + sizeof(struct sockaddr_ll))
232
#define TPACKET3_HDRLEN		(TPACKET_ALIGN(sizeof(struct tpacket3_hdr)) + sizeof(struct sockaddr_ll))
233

E
Eric Dumazet 已提交
234
enum tpacket_versions {
235 236
	TPACKET_V1,
	TPACKET_V2,
237
	TPACKET_V3
238 239
};

L
Linus Torvalds 已提交
240 241 242 243 244 245 246 247 248 249 250 251 252
/*
   Frame structure:

   - Start. Frame must be aligned to TPACKET_ALIGNMENT=16
   - struct tpacket_hdr
   - pad to TPACKET_ALIGNMENT=16
   - struct sockaddr_ll
   - Gap, chosen so that packet data (Start+tp_net) alignes to TPACKET_ALIGNMENT=16
   - Start+tp_mac: [ Optional MAC header ]
   - Start+tp_net: Packet data, aligned to TPACKET_ALIGNMENT=16.
   - Pad to align to TPACKET_ALIGNMENT=16
 */

E
Eric Dumazet 已提交
253
struct tpacket_req {
L
Linus Torvalds 已提交
254 255 256 257 258 259
	unsigned int	tp_block_size;	/* Minimal size of contiguous block */
	unsigned int	tp_block_nr;	/* Number of blocks */
	unsigned int	tp_frame_size;	/* Size of frame */
	unsigned int	tp_frame_nr;	/* Total number of frames */
};

260 261 262 263 264 265 266 267 268 269 270 271 272 273 274
struct tpacket_req3 {
	unsigned int	tp_block_size;	/* Minimal size of contiguous block */
	unsigned int	tp_block_nr;	/* Number of blocks */
	unsigned int	tp_frame_size;	/* Size of frame */
	unsigned int	tp_frame_nr;	/* Total number of frames */
	unsigned int	tp_retire_blk_tov; /* timeout in msecs */
	unsigned int	tp_sizeof_priv; /* offset to private data area */
	unsigned int	tp_feature_req_word;
};

union tpacket_req_u {
	struct tpacket_req	req;
	struct tpacket_req3	req3;
};

E
Eric Dumazet 已提交
275
struct packet_mreq {
L
Linus Torvalds 已提交
276 277 278 279 280 281 282 283 284
	int		mr_ifindex;
	unsigned short	mr_type;
	unsigned short	mr_alen;
	unsigned char	mr_address[8];
};

#define PACKET_MR_MULTICAST	0
#define PACKET_MR_PROMISC	1
#define PACKET_MR_ALLMULTI	2
285
#define PACKET_MR_UNICAST	3
L
Linus Torvalds 已提交
286 287

#endif