Blame view

include/linux/if_packet.h 6.64 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
  #ifndef __LINUX_IF_PACKET_H
  #define __LINUX_IF_PACKET_H
0e11c91e1   Al Viro   [AF_PACKET]: anno...
3
  #include <linux/types.h>
d94d9fee9   Eric Dumazet   net: cleanup incl...
4
  struct sockaddr_pkt {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5
6
  	unsigned short spkt_family;
  	unsigned char spkt_device[14];
0e11c91e1   Al Viro   [AF_PACKET]: anno...
7
  	__be16 spkt_protocol;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
8
  };
d94d9fee9   Eric Dumazet   net: cleanup incl...
9
  struct sockaddr_ll {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
10
  	unsigned short	sll_family;
0e11c91e1   Al Viro   [AF_PACKET]: anno...
11
  	__be16		sll_protocol;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
  	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
8dc419447   Herbert Xu   [PACKET]: Add opt...
39
  #define PACKET_AUXDATA			8
80feaacb8   Peter P. Waskiewicz Jr   [AF_PACKET]: Add ...
40
  #define PACKET_ORIGDEV			9
bbd6ef87c   Patrick McHardy   packet: support e...
41
42
  #define PACKET_VERSION			10
  #define PACKET_HDRLEN			11
8913336a7   Patrick McHardy   packet: add PACKE...
43
  #define PACKET_RESERVE			12
69e3c75f4   Johann Baudy   net: TX_RING and ...
44
45
  #define PACKET_TX_RING			13
  #define PACKET_LOSS			14
bfd5f4a3d   Sridhar Samudrala   packet: Add GSO/c...
46
  #define PACKET_VNET_HDR			15
ed85b565b   Richard Cochran   packet: support f...
47
  #define PACKET_TX_TIMESTAMP		16
614f60fa9   Scott McMillan   packet_mmap: expo...
48
  #define PACKET_TIMESTAMP		17
dc99f6006   David S. Miller   packet: Add fanou...
49
50
51
52
  #define PACKET_FANOUT			18
  
  #define PACKET_FANOUT_HASH		0
  #define PACKET_FANOUT_LB		1
95ec3eb41   David S. Miller   packet: Add 'cpu'...
53
  #define PACKET_FANOUT_CPU		2
7736d33f4   David S. Miller   packet: Add pre-d...
54
  #define PACKET_FANOUT_FLAG_DEFRAG	0x8000
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
55

d94d9fee9   Eric Dumazet   net: cleanup incl...
56
  struct tpacket_stats {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
57
58
59
  	unsigned int	tp_packets;
  	unsigned int	tp_drops;
  };
0d4691ce1   chetan loke   af-packet: Added ...
60
61
62
63
64
65
66
67
68
69
  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;
  };
d94d9fee9   Eric Dumazet   net: cleanup incl...
70
  struct tpacket_auxdata {
8dc419447   Herbert Xu   [PACKET]: Add opt...
71
72
73
74
75
  	__u32		tp_status;
  	__u32		tp_len;
  	__u32		tp_snaplen;
  	__u16		tp_mac;
  	__u16		tp_net;
393e52e33   Patrick McHardy   packet: deliver V...
76
  	__u16		tp_vlan_tci;
13fcb7bd3   Eric Dumazet   af_packet: preven...
77
  	__u16		tp_padding;
8dc419447   Herbert Xu   [PACKET]: Add opt...
78
  };
69e3c75f4   Johann Baudy   net: TX_RING and ...
79
80
81
82
83
84
  /* Rx ring - header status */
  #define TP_STATUS_KERNEL	0x0
  #define TP_STATUS_USER		0x1
  #define TP_STATUS_COPY		0x2
  #define TP_STATUS_LOSING	0x4
  #define TP_STATUS_CSUMNOTREADY	0x8
a3bcc23e8   Ben Greear   af-packet: Add fl...
85
  #define TP_STATUS_VLAN_VALID   0x10 /* auxdata has valid tp_vlan_tci */
0d4691ce1   chetan loke   af-packet: Added ...
86
  #define TP_STATUS_BLK_TMO	0x20
69e3c75f4   Johann Baudy   net: TX_RING and ...
87
88
89
90
91
92
  
  /* Tx ring - header status */
  #define TP_STATUS_AVAILABLE	0x0
  #define TP_STATUS_SEND_REQUEST	0x1
  #define TP_STATUS_SENDING	0x2
  #define TP_STATUS_WRONG_FORMAT	0x4
0d4691ce1   chetan loke   af-packet: Added ...
93
94
  /* Rx ring - feature request bits */
  #define TP_FT_REQ_FILL_RXHASH	0x1
d94d9fee9   Eric Dumazet   net: cleanup incl...
95
  struct tpacket_hdr {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
96
  	unsigned long	tp_status;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
97
98
99
100
101
102
103
104
105
106
107
  	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))
d94d9fee9   Eric Dumazet   net: cleanup incl...
108
  struct tpacket2_hdr {
bbd6ef87c   Patrick McHardy   packet: support e...
109
110
111
112
113
114
115
  	__u32		tp_status;
  	__u32		tp_len;
  	__u32		tp_snaplen;
  	__u16		tp_mac;
  	__u16		tp_net;
  	__u32		tp_sec;
  	__u32		tp_nsec;
393e52e33   Patrick McHardy   packet: deliver V...
116
  	__u16		tp_vlan_tci;
13fcb7bd3   Eric Dumazet   af_packet: preven...
117
  	__u16		tp_padding;
bbd6ef87c   Patrick McHardy   packet: support e...
118
  };
bc59ba399   chetan loke   af_packet: Prefix...
119
  struct tpacket_hdr_variant1 {
0d4691ce1   chetan loke   af-packet: Added ...
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
  	__u32	tp_rxhash;
  	__u32	tp_vlan_tci;
  };
  
  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 {
bc59ba399   chetan loke   af_packet: Prefix...
135
  		struct tpacket_hdr_variant1 hv1;
0d4691ce1   chetan loke   af-packet: Added ...
136
137
  	};
  };
bc59ba399   chetan loke   af_packet: Prefix...
138
  struct tpacket_bd_ts {
0d4691ce1   chetan loke   af-packet: Added ...
139
140
141
142
143
144
  	unsigned int ts_sec;
  	union {
  		unsigned int ts_usec;
  		unsigned int ts_nsec;
  	};
  };
bc59ba399   chetan loke   af_packet: Prefix...
145
  struct tpacket_hdr_v1 {
0d4691ce1   chetan loke   af-packet: Added ...
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
  	__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.
  	 */
96c131842   Jiří Župka   Repair wrong name...
164
  	__aligned_u64	seq_num;
0d4691ce1   chetan loke   af-packet: Added ...
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
  
  	/*
  	 * 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.
  	 *
  	 */
bc59ba399   chetan loke   af_packet: Prefix...
191
  	struct tpacket_bd_ts	ts_first_pkt, ts_last_pkt;
0d4691ce1   chetan loke   af-packet: Added ...
192
  };
bc59ba399   chetan loke   af_packet: Prefix...
193
194
  union tpacket_bd_header_u {
  	struct tpacket_hdr_v1 bh1;
0d4691ce1   chetan loke   af-packet: Added ...
195
  };
bc59ba399   chetan loke   af_packet: Prefix...
196
  struct tpacket_block_desc {
0d4691ce1   chetan loke   af-packet: Added ...
197
198
  	__u32 version;
  	__u32 offset_to_priv;
bc59ba399   chetan loke   af_packet: Prefix...
199
  	union tpacket_bd_header_u hdr;
0d4691ce1   chetan loke   af-packet: Added ...
200
  };
bbd6ef87c   Patrick McHardy   packet: support e...
201
  #define TPACKET2_HDRLEN		(TPACKET_ALIGN(sizeof(struct tpacket2_hdr)) + sizeof(struct sockaddr_ll))
0d4691ce1   chetan loke   af-packet: Added ...
202
  #define TPACKET3_HDRLEN		(TPACKET_ALIGN(sizeof(struct tpacket3_hdr)) + sizeof(struct sockaddr_ll))
bbd6ef87c   Patrick McHardy   packet: support e...
203

d94d9fee9   Eric Dumazet   net: cleanup incl...
204
  enum tpacket_versions {
bbd6ef87c   Patrick McHardy   packet: support e...
205
206
  	TPACKET_V1,
  	TPACKET_V2,
0d4691ce1   chetan loke   af-packet: Added ...
207
  	TPACKET_V3
bbd6ef87c   Patrick McHardy   packet: support e...
208
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
209
210
211
212
213
214
215
216
217
218
219
220
  /*
     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
   */
d94d9fee9   Eric Dumazet   net: cleanup incl...
221
  struct tpacket_req {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
222
223
224
225
226
  	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 */
  };
0d4691ce1   chetan loke   af-packet: Added ...
227
228
229
230
231
232
233
234
235
236
237
238
239
240
  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;
  };
d94d9fee9   Eric Dumazet   net: cleanup incl...
241
  struct packet_mreq {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
242
243
244
245
246
247
248
249
250
  	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
d95ed9275   Eric W. Biederman   af_packet: Teach ...
251
  #define PACKET_MR_UNICAST	3
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
252
253
  
  #endif