Blame view

include/linux/skbuff.h 60.9 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  /*
   *	Definitions for the 'struct sk_buff' memory handlers.
   *
   *	Authors:
   *		Alan Cox, <gw4pts@gw4pts.ampr.org>
   *		Florian La Roche, <rzsfl@rz.uni-sb.de>
   *
   *	This program is free software; you can redistribute it and/or
   *	modify it under the terms of the GNU General Public License
   *	as published by the Free Software Foundation; either version
   *	2 of the License, or (at your option) any later version.
   */
  
  #ifndef _LINUX_SKBUFF_H
  #define _LINUX_SKBUFF_H
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
16
  #include <linux/kernel.h>
fe55f6d5c   Vegard Nossum   net: use kmemchec...
17
  #include <linux/kmemcheck.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
18
19
20
21
22
23
24
  #include <linux/compiler.h>
  #include <linux/time.h>
  #include <linux/cache.h>
  
  #include <asm/atomic.h>
  #include <asm/types.h>
  #include <linux/spinlock.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
25
  #include <linux/net.h>
3fc7e8a6d   Thomas Graf   [NET]: skb_find_t...
26
  #include <linux/textsearch.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
27
  #include <net/checksum.h>
a80958f48   Al Viro   [PATCH] fix fallo...
28
  #include <linux/rcupdate.h>
97fc2f084   Chris Leech   [I/OAT]: Structur...
29
  #include <linux/dmaengine.h>
b7aa0bf70   Eric Dumazet   [NET]: convert ne...
30
  #include <linux/hrtimer.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
31

604763722   Herbert Xu   [NET]: Treat CHEC...
32
  /* Don't change this without changing skb_csum_unnecessary! */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
33
  #define CHECKSUM_NONE 0
604763722   Herbert Xu   [NET]: Treat CHEC...
34
35
36
  #define CHECKSUM_UNNECESSARY 1
  #define CHECKSUM_COMPLETE 2
  #define CHECKSUM_PARTIAL 3
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
37
38
39
  
  #define SKB_DATA_ALIGN(X)	(((X) + (SMP_CACHE_BYTES - 1)) & \
  				 ~(SMP_CACHE_BYTES - 1))
fc910a278   David S. Miller   [NETLINK]: Limit ...
40
  #define SKB_WITH_OVERHEAD(X)	\
deea84b0a   Herbert Xu   [NET]: Fix SKB_WI...
41
  	((X) - SKB_DATA_ALIGN(sizeof(struct skb_shared_info)))
fc910a278   David S. Miller   [NETLINK]: Limit ...
42
43
  #define SKB_MAX_ORDER(X, ORDER) \
  	SKB_WITH_OVERHEAD((PAGE_SIZE << (ORDER)) - (X))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
44
45
46
47
48
49
50
51
52
53
54
55
56
57
  #define SKB_MAX_HEAD(X)		(SKB_MAX_ORDER((X), 0))
  #define SKB_MAX_ALLOC		(SKB_MAX_ORDER(0, 2))
  
  /* A. Checksumming of received packets by device.
   *
   *	NONE: device failed to checksum this packet.
   *		skb->csum is undefined.
   *
   *	UNNECESSARY: device parsed packet and wouldbe verified checksum.
   *		skb->csum is undefined.
   *	      It is bad option, but, unfortunately, many of vendors do this.
   *	      Apparently with secret goal to sell you new device, when you
   *	      will add new protocol to your host. F.e. IPv6. 8)
   *
84fa7933a   Patrick McHardy   [NET]: Replace CH...
58
   *	COMPLETE: the most generic way. Device supplied checksum of _all_
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
59
60
   *	    the packet as seen by netif_rx in skb->csum.
   *	    NOTE: Even if device supports only some protocols, but
84fa7933a   Patrick McHardy   [NET]: Replace CH...
61
   *	    is able to produce some skb->csum, it MUST use COMPLETE,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
62
63
   *	    not UNNECESSARY.
   *
c6c6e3e05   Herbert Xu   [NET]: Update com...
64
65
66
67
68
69
70
   *	PARTIAL: identical to the case for output below.  This may occur
   *	    on a packet received directly from another Linux OS, e.g.,
   *	    a virtualised Linux kernel on the same host.  The packet can
   *	    be treated in the same way as UNNECESSARY except that on
   *	    output (i.e., forwarding) the checksum must be filled in
   *	    by the OS or the hardware.
   *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
71
72
73
74
   * B. Checksumming on output.
   *
   *	NONE: skb is checksummed by protocol or csum is not required.
   *
84fa7933a   Patrick McHardy   [NET]: Replace CH...
75
   *	PARTIAL: device is required to csum packet as seen by hard_start_xmit
c6c6e3e05   Herbert Xu   [NET]: Update com...
76
77
   *	from skb->csum_start to the end and to record the checksum
   *	at skb->csum_start + skb->csum_offset.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
78
79
80
81
82
83
84
85
86
87
   *
   *	Device must show its capabilities in dev->features, set
   *	at device setup time.
   *	NETIF_F_HW_CSUM	- it is clever device, it is able to checksum
   *			  everything.
   *	NETIF_F_NO_CSUM - loopback or reliable single hop media.
   *	NETIF_F_IP_CSUM - device is dumb. It is able to csum only
   *			  TCP/UDP over IPv4. Sigh. Vendors like this
   *			  way by an unknown reason. Though, see comment above
   *			  about CHECKSUM_UNNECESSARY. 8)
c6c6e3e05   Herbert Xu   [NET]: Update com...
88
   *	NETIF_F_IPV6_CSUM about as dumb as the last one but does IPv6 instead.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
89
90
91
   *
   *	Any questions? No questions, good. 		--ANK
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
92
  struct net_device;
716ea3a7a   David Howells   [NET]: Move gener...
93
  struct scatterlist;
9c55e01c0   Jens Axboe   [TCP]: Splice rec...
94
  struct pipe_inode_info;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
95

5f79e0f91   Yasuyuki Kozakai   [NETFILTER]: nf_c...
96
  #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
97
98
  struct nf_conntrack {
  	atomic_t use;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
99
  };
5f79e0f91   Yasuyuki Kozakai   [NETFILTER]: nf_c...
100
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
101
102
103
104
105
106
  
  #ifdef CONFIG_BRIDGE_NETFILTER
  struct nf_bridge_info {
  	atomic_t use;
  	struct net_device *physindev;
  	struct net_device *physoutdev;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
107
108
109
110
  	unsigned int mask;
  	unsigned long data[32 / sizeof(unsigned long)];
  };
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
  struct sk_buff_head {
  	/* These two members must be first. */
  	struct sk_buff	*next;
  	struct sk_buff	*prev;
  
  	__u32		qlen;
  	spinlock_t	lock;
  };
  
  struct sk_buff;
  
  /* To allow 64K frame to be packed as single skb without frag_list */
  #define MAX_SKB_FRAGS (65536/PAGE_SIZE + 2)
  
  typedef struct skb_frag_struct skb_frag_t;
  
  struct skb_frag_struct {
  	struct page *page;
a309bb072   David S. Miller   [NET]: Page offse...
129
130
  	__u32 page_offset;
  	__u32 size;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
131
  };
ac45f602e   Patrick Ohly   net: infrastructu...
132
133
134
  #define HAVE_HW_TIME_STAMP
  
  /**
d3a21be86   Randy Dunlap   skbuff.h: fix tim...
135
   * struct skb_shared_hwtstamps - hardware time stamps
ac45f602e   Patrick Ohly   net: infrastructu...
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
   * @hwtstamp:	hardware time stamp transformed into duration
   *		since arbitrary point in time
   * @syststamp:	hwtstamp transformed to system time base
   *
   * Software time stamps generated by ktime_get_real() are stored in
   * skb->tstamp. The relation between the different kinds of time
   * stamps is as follows:
   *
   * syststamp and tstamp can be compared against each other in
   * arbitrary combinations.  The accuracy of a
   * syststamp/tstamp/"syststamp from other device" comparison is
   * limited by the accuracy of the transformation into system time
   * base. This depends on the device driver and its underlying
   * hardware.
   *
   * hwtstamps can only be compared against other hwtstamps from
   * the same device.
   *
   * This structure is attached to packets as part of the
   * &skb_shared_info. Use skb_hwtstamps() to get a pointer.
   */
  struct skb_shared_hwtstamps {
  	ktime_t	hwtstamp;
  	ktime_t	syststamp;
  };
  
  /**
d3a21be86   Randy Dunlap   skbuff.h: fix tim...
163
   * struct skb_shared_tx - instructions for time stamping of outgoing packets
ac45f602e   Patrick Ohly   net: infrastructu...
164
165
166
167
   * @hardware:		generate hardware time stamp
   * @software:		generate software time stamp
   * @in_progress:	device driver is going to provide
   *			hardware time stamp
cff0d6e6e   Oliver Hartkopp   can-raw: Fix skb_...
168
   * @prevent_sk_orphan:	make sk reference available on driver level
4b21cd4ee   Randy Dunlap   skbuff.h: fix mis...
169
   * @flags:		all shared_tx flags
ac45f602e   Patrick Ohly   net: infrastructu...
170
171
172
173
174
175
176
177
   *
   * These flags are attached to packets as part of the
   * &skb_shared_info. Use skb_tx() to get a pointer.
   */
  union skb_shared_tx {
  	struct {
  		__u8	hardware:1,
  			software:1,
cff0d6e6e   Oliver Hartkopp   can-raw: Fix skb_...
178
179
  			in_progress:1,
  			prevent_sk_orphan:1;
ac45f602e   Patrick Ohly   net: infrastructu...
180
181
182
  	};
  	__u8 flags;
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
183
184
185
186
  /* This data is invariant across clones and lives at
   * the end of the header data, ie. at skb->end.
   */
  struct skb_shared_info {
4947d3ef8   Benjamin LaHaise   [NET]: Speed up _...
187
  	unsigned short	nr_frags;
7967168ce   Herbert Xu   [NET]: Merge TSO/...
188
189
190
191
  	unsigned short	gso_size;
  	/* Warning: this field is not always filled in (UFO)! */
  	unsigned short	gso_segs;
  	unsigned short  gso_type;
ae08e1f09   Al Viro   [IPV6]: ip6_outpu...
192
  	__be32          ip6_frag_id;
ac45f602e   Patrick Ohly   net: infrastructu...
193
  	union skb_shared_tx tx_flags;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
194
  	struct sk_buff	*frag_list;
ac45f602e   Patrick Ohly   net: infrastructu...
195
  	struct skb_shared_hwtstamps hwtstamps;
ec7d2f2cf   Eric Dumazet   net: __alloc_skb(...
196
197
198
199
200
  
  	/*
  	 * Warning : all fields before dataref are cleared in __alloc_skb()
  	 */
  	atomic_t	dataref;
69e3c75f4   Johann Baudy   net: TX_RING and ...
201
202
203
  	/* Intermediate layers must ensure that destructor_arg
  	 * remains valid until skb destructor */
  	void *		destructor_arg;
fed66381d   Eric Dumazet   net: pskb_expand_...
204
205
  	/* must be last field, see pskb_expand_head() */
  	skb_frag_t	frags[MAX_SKB_FRAGS];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
206
207
208
209
  };
  
  /* We divide dataref into two halves.  The higher 16 bits hold references
   * to the payload part of skb->data.  The lower 16 bits hold references to
334a8132d   Patrick McHardy   [SKBUFF]: Keep tr...
210
211
   * the entire skb->data.  A clone of a headerless skb holds the length of
   * the header in skb->hdr_len.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
212
213
214
215
216
217
218
219
220
   *
   * All users must obey the rule that the skb->data reference count must be
   * greater than or equal to the payload reference count.
   *
   * Holding a reference to the payload part means that the user does not
   * care about modifications to the header part of skb->data.
   */
  #define SKB_DATAREF_SHIFT 16
  #define SKB_DATAREF_MASK ((1 << SKB_DATAREF_SHIFT) - 1)
d179cd129   David S. Miller   [NET]: Implement ...
221
222
223
224
225
226
  
  enum {
  	SKB_FCLONE_UNAVAILABLE,
  	SKB_FCLONE_ORIG,
  	SKB_FCLONE_CLONE,
  };
7967168ce   Herbert Xu   [NET]: Merge TSO/...
227
228
  enum {
  	SKB_GSO_TCPV4 = 1 << 0,
f83ef8c0b   Herbert Xu   [IPV6]: Added GSO...
229
  	SKB_GSO_UDP = 1 << 1,
576a30eb6   Herbert Xu   [NET]: Added GSO ...
230
231
232
  
  	/* This indicates the skb is from an untrusted source. */
  	SKB_GSO_DODGY = 1 << 2,
b0da85370   Michael Chan   [NET]: Add ECN su...
233
234
  
  	/* This indicates the tcp segment has CWR set. */
f83ef8c0b   Herbert Xu   [IPV6]: Added GSO...
235
236
237
  	SKB_GSO_TCP_ECN = 1 << 3,
  
  	SKB_GSO_TCPV6 = 1 << 4,
01d5b2fca   Chris Leech   [SCSI] net: defin...
238
239
  
  	SKB_GSO_FCOE = 1 << 5,
7967168ce   Herbert Xu   [NET]: Merge TSO/...
240
  };
2e07fa9cd   Arnaldo Carvalho de Melo   [SK_BUFF]: Use of...
241
242
243
244
245
246
247
248
249
  #if BITS_PER_LONG > 32
  #define NET_SKBUFF_DATA_USES_OFFSET 1
  #endif
  
  #ifdef NET_SKBUFF_DATA_USES_OFFSET
  typedef unsigned int sk_buff_data_t;
  #else
  typedef unsigned char *sk_buff_data_t;
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
250
251
252
253
  /** 
   *	struct sk_buff - socket buffer
   *	@next: Next buffer in list
   *	@prev: Previous buffer in list
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
254
   *	@sk: Socket we are owned by
325ed8239   Herbert Xu   [NET]: Fix packet...
255
   *	@tstamp: Time we arrived
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
256
   *	@dev: Device we arrived on/are leaving by
be52178b9   Randy Dunlap   [NET] skbuff: fix...
257
   *	@transport_header: Transport layer header
b0e380b1d   Arnaldo Carvalho de Melo   [SK_BUFF]: unions...
258
259
   *	@network_header: Network layer header
   *	@mac_header: Link layer header
7fee226ad   Eric Dumazet   net: add a noref ...
260
   *	@_skb_refdst: destination entry (with norefcount bit)
67be2dd1b   Martin Waitz   [PATCH] DocBook: ...
261
   *	@sp: the security path, used for xfrm
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
262
263
264
265
   *	@cb: Control buffer. Free for use by every layer. Put private vars here
   *	@len: Length of actual data
   *	@data_len: Data length
   *	@mac_len: Length of link layer header
334a8132d   Patrick McHardy   [SKBUFF]: Keep tr...
266
   *	@hdr_len: writable header length of cloned skb
663ead3bb   Herbert Xu   [NET]: Use csum_s...
267
268
269
   *	@csum: Checksum (must include start/offset pair)
   *	@csum_start: Offset from skb->head where checksumming should start
   *	@csum_offset: Offset from csum_start where checksum should be stored
67be2dd1b   Martin Waitz   [PATCH] DocBook: ...
270
   *	@local_df: allow local fragmentation
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
271
272
273
   *	@cloned: Head may be cloned (check refcnt to be sure)
   *	@nohdr: Payload reference only, must not modify header
   *	@pkt_type: Packet class
c83c24861   Randy Dunlap   [SK_BUFF] kernel-...
274
   *	@fclone: skbuff clone status
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
275
276
277
278
   *	@ip_summed: Driver fed us an IP checksum
   *	@priority: Packet queueing priority
   *	@users: User count - see {datagram,tcp}.c
   *	@protocol: Packet protocol from driver
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
279
280
281
282
283
284
   *	@truesize: Buffer size 
   *	@head: Head of buffer
   *	@data: Data head pointer
   *	@tail: Tail pointer
   *	@end: End pointer
   *	@destructor: Destruct function
82e91ffef   Thomas Graf   [NET]: Turn nfmar...
285
   *	@mark: Generic packet mark
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
286
   *	@nfct: Associated connection, if any
c83c24861   Randy Dunlap   [SK_BUFF] kernel-...
287
   *	@ipvs_property: skbuff is owned by ipvs
317293634   Randy Dunlap   net: fix kernel-d...
288
289
   *	@peeked: this packet has been seen already, so stats have been
   *		done for it, don't do them again
ba9dda3ab   Jozsef Kadlecsik   [NETFILTER]: x_ta...
290
   *	@nf_trace: netfilter packet trace flag
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
291
   *	@nfctinfo: Relationship of this skb to the connection
461ddf3b9   Randy Dunlap   [NET]: kernel-doc...
292
   *	@nfct_reasm: netfilter conntrack re-assembly pointer
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
293
   *	@nf_bridge: Saved data about a bridged frame - see br_netfilter.c
8964be4a9   Eric Dumazet   net: rename skb->...
294
   *	@skb_iif: ifindex of device we arrived on
0a9627f26   Tom Herbert   rps: Receive Pack...
295
   *	@rxhash: the packet hash computed on receive
f25f4e448   Peter P Waskiewicz Jr   [CORE] Stack chan...
296
   *	@queue_mapping: Queue mapping for multiqueue devices
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
297
298
   *	@tc_index: Traffic control index
   *	@tc_verd: traffic control verdict
553a56726   Randy Dunlap   skbuff: fix missi...
299
   *	@ndisc_nodetype: router type (from link layer)
f4b8ea784   Randy Dunlap   [NET]: fix net-co...
300
301
   *	@dma_cookie: a cookie to one of several possible DMA operations
   *		done by skb DMA functions
984bc16cc   James Morris   [SECMARK]: Add se...
302
   *	@secmark: security marking
6aa895b04   Patrick McHardy   vlan: Don't store...
303
   *	@vlan_tci: vlan tag control information
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
304
305
306
307
308
309
   */
  
  struct sk_buff {
  	/* These two members must be first. */
  	struct sk_buff		*next;
  	struct sk_buff		*prev;
b7aa0bf70   Eric Dumazet   [NET]: convert ne...
310
  	ktime_t			tstamp;
da3f5cf1f   Felix Fietkau   skbuff: align sk_...
311
312
  
  	struct sock		*sk;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
313
  	struct net_device	*dev;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
314

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
315
316
317
318
319
320
  	/*
  	 * This is the control buffer. It is free to use for every
  	 * layer. Please put your private variables there. If you
  	 * want to keep them across layers you have to do a skb_clone()
  	 * first. This is owned by whoever has the skb queued ATM.
  	 */
da3f5cf1f   Felix Fietkau   skbuff: align sk_...
321
  	char			cb[48] __aligned(8);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
322

7fee226ad   Eric Dumazet   net: add a noref ...
323
  	unsigned long		_skb_refdst;
da3f5cf1f   Felix Fietkau   skbuff: align sk_...
324
325
326
  #ifdef CONFIG_XFRM
  	struct	sec_path	*sp;
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
327
  	unsigned int		len,
334a8132d   Patrick McHardy   [SKBUFF]: Keep tr...
328
329
330
  				data_len;
  	__u16			mac_len,
  				hdr_len;
ff1dcadb1   Al Viro   [NET]: Split skb-...
331
332
  	union {
  		__wsum		csum;
663ead3bb   Herbert Xu   [NET]: Use csum_s...
333
334
335
336
  		struct {
  			__u16	csum_start;
  			__u16	csum_offset;
  		};
ff1dcadb1   Al Viro   [NET]: Split skb-...
337
  	};
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
338
  	__u32			priority;
fe55f6d5c   Vegard Nossum   net: use kmemchec...
339
  	kmemcheck_bitfield_begin(flags1);
1cbb3380e   Thomas Graf   [NET]: Reduce siz...
340
341
342
  	__u8			local_df:1,
  				cloned:1,
  				ip_summed:2,
6869c4d8e   Harald Welte   [NETFILTER]: redu...
343
344
  				nohdr:1,
  				nfctinfo:3;
d179cd129   David S. Miller   [NET]: Implement ...
345
  	__u8			pkt_type:3,
b84f4cc97   Patrick McHardy   [NET]: Use unused...
346
  				fclone:2,
ba9dda3ab   Jozsef Kadlecsik   [NETFILTER]: x_ta...
347
  				ipvs_property:1,
a59322be0   Herbert Xu   [UDP]: Only incre...
348
  				peeked:1,
ba9dda3ab   Jozsef Kadlecsik   [NETFILTER]: x_ta...
349
  				nf_trace:1;
fe55f6d5c   Vegard Nossum   net: use kmemchec...
350
  	kmemcheck_bitfield_end(flags1);
4ab408dea   Eric Dumazet   net: fix protocol...
351
  	__be16			protocol;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
352
353
  
  	void			(*destructor)(struct sk_buff *skb);
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
354
  #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
5f79e0f91   Yasuyuki Kozakai   [NETFILTER]: nf_c...
355
  	struct nf_conntrack	*nfct;
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
356
357
  	struct sk_buff		*nfct_reasm;
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
358
359
360
  #ifdef CONFIG_BRIDGE_NETFILTER
  	struct nf_bridge_info	*nf_bridge;
  #endif
f25f4e448   Peter P Waskiewicz Jr   [CORE] Stack chan...
361

8964be4a9   Eric Dumazet   net: rename skb->...
362
  	int			skb_iif;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
363
  #ifdef CONFIG_NET_SCHED
b6b99eb54   Patrick McHardy   [NET]: Reduce tc_...
364
  	__u16			tc_index;	/* traffic control index */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
365
  #ifdef CONFIG_NET_CLS_ACT
b6b99eb54   Patrick McHardy   [NET]: Reduce tc_...
366
  	__u16			tc_verd;	/* traffic control verdict */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
367
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
368
  #endif
fe55f6d5c   Vegard Nossum   net: use kmemchec...
369

0a9627f26   Tom Herbert   rps: Receive Pack...
370
  	__u32			rxhash;
fe55f6d5c   Vegard Nossum   net: use kmemchec...
371
  	kmemcheck_bitfield_begin(flags2);
14d18a81b   Eric Dumazet   net: fix kmemchec...
372
  	__u16			queue_mapping:16;
de357cc01   YOSHIFUJI Hideaki   [IPV6] NDISC: Don...
373
  #ifdef CONFIG_IPV6_NDISC_NODETYPE
597a264b1   John Fastabend   net: deliver skbs...
374
375
376
377
  	__u8			ndisc_nodetype:2,
  				deliver_no_wcard:1;
  #else
  	__u8			deliver_no_wcard:1;
de357cc01   YOSHIFUJI Hideaki   [IPV6] NDISC: Don...
378
  #endif
fe55f6d5c   Vegard Nossum   net: use kmemchec...
379
  	kmemcheck_bitfield_end(flags2);
72bce6277   Johannes Berg   net: remove unuse...
380
  	/* 0/14 bit hole */
f25f4e448   Peter P Waskiewicz Jr   [CORE] Stack chan...
381

97fc2f084   Chris Leech   [I/OAT]: Structur...
382
383
384
  #ifdef CONFIG_NET_DMA
  	dma_cookie_t		dma_cookie;
  #endif
984bc16cc   James Morris   [SECMARK]: Add se...
385
386
387
  #ifdef CONFIG_NETWORK_SECMARK
  	__u32			secmark;
  #endif
3b885787e   Neil Horman   net: Generalize s...
388
389
390
391
  	union {
  		__u32		mark;
  		__u32		dropcount;
  	};
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
392

6aa895b04   Patrick McHardy   vlan: Don't store...
393
  	__u16			vlan_tci;
27a884dc3   Arnaldo Carvalho de Melo   [SK_BUFF]: Conver...
394
395
396
  	sk_buff_data_t		transport_header;
  	sk_buff_data_t		network_header;
  	sk_buff_data_t		mac_header;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
397
  	/* These elements must be at the end, see alloc_skb() for details.  */
27a884dc3   Arnaldo Carvalho de Melo   [SK_BUFF]: Conver...
398
  	sk_buff_data_t		tail;
4305b5413   Arnaldo Carvalho de Melo   [SK_BUFF]: Conver...
399
  	sk_buff_data_t		end;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
400
  	unsigned char		*head,
4305b5413   Arnaldo Carvalho de Melo   [SK_BUFF]: Conver...
401
  				*data;
27a884dc3   Arnaldo Carvalho de Melo   [SK_BUFF]: Conver...
402
403
  	unsigned int		truesize;
  	atomic_t		users;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
404
405
406
407
408
409
410
411
412
  };
  
  #ifdef __KERNEL__
  /*
   *	Handling routines are only of interest to the kernel
   */
  #include <linux/slab.h>
  
  #include <asm/system.h>
7fee226ad   Eric Dumazet   net: add a noref ...
413
414
415
416
417
418
419
420
421
422
423
424
425
  /*
   * skb might have a dst pointer attached, refcounted or not.
   * _skb_refdst low order bit is set if refcount was _not_ taken
   */
  #define SKB_DST_NOREF	1UL
  #define SKB_DST_PTRMASK	~(SKB_DST_NOREF)
  
  /**
   * skb_dst - returns skb dst_entry
   * @skb: buffer
   *
   * Returns skb dst_entry, regardless of reference taken or not.
   */
adf30907d   Eric Dumazet   net: skb->dst acc...
426
427
  static inline struct dst_entry *skb_dst(const struct sk_buff *skb)
  {
7fee226ad   Eric Dumazet   net: add a noref ...
428
429
430
431
432
433
434
  	/* If refdst was not refcounted, check we still are in a 
  	 * rcu_read_lock section
  	 */
  	WARN_ON((skb->_skb_refdst & SKB_DST_NOREF) &&
  		!rcu_read_lock_held() &&
  		!rcu_read_lock_bh_held());
  	return (struct dst_entry *)(skb->_skb_refdst & SKB_DST_PTRMASK);
adf30907d   Eric Dumazet   net: skb->dst acc...
435
  }
7fee226ad   Eric Dumazet   net: add a noref ...
436
437
438
439
440
441
442
443
  /**
   * skb_dst_set - sets skb dst
   * @skb: buffer
   * @dst: dst entry
   *
   * Sets skb dst, assuming a reference was taken on dst and should
   * be released by skb_dst_drop()
   */
adf30907d   Eric Dumazet   net: skb->dst acc...
444
445
  static inline void skb_dst_set(struct sk_buff *skb, struct dst_entry *dst)
  {
7fee226ad   Eric Dumazet   net: add a noref ...
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
  	skb->_skb_refdst = (unsigned long)dst;
  }
  
  /**
   * skb_dst_set_noref - sets skb dst, without a reference
   * @skb: buffer
   * @dst: dst entry
   *
   * Sets skb dst, assuming a reference was not taken on dst
   * skb_dst_drop() should not dst_release() this dst
   */
  static inline void skb_dst_set_noref(struct sk_buff *skb, struct dst_entry *dst)
  {
  	WARN_ON(!rcu_read_lock_held() && !rcu_read_lock_bh_held());
  	skb->_skb_refdst = (unsigned long)dst | SKB_DST_NOREF;
  }
  
  /**
   * skb_dst_is_noref - Test if skb dst isnt refcounted
   * @skb: buffer
   */
  static inline bool skb_dst_is_noref(const struct sk_buff *skb)
  {
  	return (skb->_skb_refdst & SKB_DST_NOREF) && skb_dst(skb);
adf30907d   Eric Dumazet   net: skb->dst acc...
470
  }
511c3f92a   Eric Dumazet   net: skb->rtable ...
471
472
  static inline struct rtable *skb_rtable(const struct sk_buff *skb)
  {
adf30907d   Eric Dumazet   net: skb->dst acc...
473
  	return (struct rtable *)skb_dst(skb);
511c3f92a   Eric Dumazet   net: skb->rtable ...
474
  }
231d06ae8   Jörn Engel   [NET]: Uninline k...
475
  extern void kfree_skb(struct sk_buff *skb);
ead2ceb0e   Neil Horman   Network Drop Moni...
476
  extern void consume_skb(struct sk_buff *skb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
477
  extern void	       __kfree_skb(struct sk_buff *skb);
d179cd129   David S. Miller   [NET]: Implement ...
478
  extern struct sk_buff *__alloc_skb(unsigned int size,
b30973f87   Christoph Hellwig   [PATCH] node-awar...
479
  				   gfp_t priority, int fclone, int node);
d179cd129   David S. Miller   [NET]: Implement ...
480
  static inline struct sk_buff *alloc_skb(unsigned int size,
dd0fc66fb   Al Viro   [PATCH] gfp flags...
481
  					gfp_t priority)
d179cd129   David S. Miller   [NET]: Implement ...
482
  {
b30973f87   Christoph Hellwig   [PATCH] node-awar...
483
  	return __alloc_skb(size, priority, 0, -1);
d179cd129   David S. Miller   [NET]: Implement ...
484
485
486
  }
  
  static inline struct sk_buff *alloc_skb_fclone(unsigned int size,
dd0fc66fb   Al Viro   [PATCH] gfp flags...
487
  					       gfp_t priority)
d179cd129   David S. Miller   [NET]: Implement ...
488
  {
b30973f87   Christoph Hellwig   [PATCH] node-awar...
489
  	return __alloc_skb(size, priority, 1, -1);
d179cd129   David S. Miller   [NET]: Implement ...
490
  }
5b0daa347   Changli Gao   skb: make skb_rec...
491
  extern bool skb_recycle_check(struct sk_buff *skb, int skb_size);
04a4bb55b   Lennert Buytenhek   net: add skb_recy...
492

e0053ec07   Herbert Xu   [SKBUFF]: Add skb...
493
  extern struct sk_buff *skb_morph(struct sk_buff *dst, struct sk_buff *src);
86a76caf8   Victor Fusco   [NET]: Fix sparse...
494
  extern struct sk_buff *skb_clone(struct sk_buff *skb,
dd0fc66fb   Al Viro   [PATCH] gfp flags...
495
  				 gfp_t priority);
86a76caf8   Victor Fusco   [NET]: Fix sparse...
496
  extern struct sk_buff *skb_copy(const struct sk_buff *skb,
dd0fc66fb   Al Viro   [PATCH] gfp flags...
497
  				gfp_t priority);
86a76caf8   Victor Fusco   [NET]: Fix sparse...
498
  extern struct sk_buff *pskb_copy(struct sk_buff *skb,
dd0fc66fb   Al Viro   [PATCH] gfp flags...
499
  				 gfp_t gfp_mask);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
500
  extern int	       pskb_expand_head(struct sk_buff *skb,
86a76caf8   Victor Fusco   [NET]: Fix sparse...
501
  					int nhead, int ntail,
dd0fc66fb   Al Viro   [PATCH] gfp flags...
502
  					gfp_t gfp_mask);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
503
504
505
506
  extern struct sk_buff *skb_realloc_headroom(struct sk_buff *skb,
  					    unsigned int headroom);
  extern struct sk_buff *skb_copy_expand(const struct sk_buff *skb,
  				       int newheadroom, int newtailroom,
dd0fc66fb   Al Viro   [PATCH] gfp flags...
507
  				       gfp_t priority);
716ea3a7a   David Howells   [NET]: Move gener...
508
509
510
511
512
  extern int	       skb_to_sgvec(struct sk_buff *skb,
  				    struct scatterlist *sg, int offset,
  				    int len);
  extern int	       skb_cow_data(struct sk_buff *skb, int tailbits,
  				    struct sk_buff **trailer);
5b057c6b1   Herbert Xu   [NET]: Avoid allo...
513
  extern int	       skb_pad(struct sk_buff *skb, int pad);
ead2ceb0e   Neil Horman   Network Drop Moni...
514
  #define dev_kfree_skb(a)	consume_skb(a)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
515

e89e9cf53   Ananda Raju   [IPv4/IPv6]: UFO ...
516
517
518
519
  extern int skb_append_datato_frags(struct sock *sk, struct sk_buff *skb,
  			int getfrag(void *from, char *to, int offset,
  			int len,int odd, struct sk_buff *skb),
  			void *from, int length);
d94d9fee9   Eric Dumazet   net: cleanup incl...
520
  struct skb_seq_state {
677e90eda   Thomas Graf   [NET]: Zerocopy s...
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
  	__u32		lower_offset;
  	__u32		upper_offset;
  	__u32		frag_idx;
  	__u32		stepped_offset;
  	struct sk_buff	*root_skb;
  	struct sk_buff	*cur_skb;
  	__u8		*frag_data;
  };
  
  extern void	      skb_prepare_seq_read(struct sk_buff *skb,
  					   unsigned int from, unsigned int to,
  					   struct skb_seq_state *st);
  extern unsigned int   skb_seq_read(unsigned int consumed, const u8 **data,
  				   struct skb_seq_state *st);
  extern void	      skb_abort_seq_read(struct skb_seq_state *st);
3fc7e8a6d   Thomas Graf   [NET]: skb_find_t...
536
537
538
  extern unsigned int   skb_find_text(struct sk_buff *skb, unsigned int from,
  				    unsigned int to, struct ts_config *config,
  				    struct ts_state *state);
4305b5413   Arnaldo Carvalho de Melo   [SK_BUFF]: Conver...
539
540
541
542
543
544
545
546
547
548
549
  #ifdef NET_SKBUFF_DATA_USES_OFFSET
  static inline unsigned char *skb_end_pointer(const struct sk_buff *skb)
  {
  	return skb->head + skb->end;
  }
  #else
  static inline unsigned char *skb_end_pointer(const struct sk_buff *skb)
  {
  	return skb->end;
  }
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
550
  /* Internal */
4305b5413   Arnaldo Carvalho de Melo   [SK_BUFF]: Conver...
551
  #define skb_shinfo(SKB)	((struct skb_shared_info *)(skb_end_pointer(SKB)))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
552

ac45f602e   Patrick Ohly   net: infrastructu...
553
554
555
556
557
558
559
560
561
  static inline struct skb_shared_hwtstamps *skb_hwtstamps(struct sk_buff *skb)
  {
  	return &skb_shinfo(skb)->hwtstamps;
  }
  
  static inline union skb_shared_tx *skb_tx(struct sk_buff *skb)
  {
  	return &skb_shinfo(skb)->tx_flags;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
562
563
564
565
566
567
568
569
570
571
572
573
  /**
   *	skb_queue_empty - check if a queue is empty
   *	@list: queue head
   *
   *	Returns true if the queue is empty, false otherwise.
   */
  static inline int skb_queue_empty(const struct sk_buff_head *list)
  {
  	return list->next == (struct sk_buff *)list;
  }
  
  /**
fc7ebb212   David S. Miller   net: Add skb_queu...
574
575
576
577
578
579
580
581
582
583
584
585
586
   *	skb_queue_is_last - check if skb is the last entry in the queue
   *	@list: queue head
   *	@skb: buffer
   *
   *	Returns true if @skb is the last buffer on the list.
   */
  static inline bool skb_queue_is_last(const struct sk_buff_head *list,
  				     const struct sk_buff *skb)
  {
  	return (skb->next == (struct sk_buff *) list);
  }
  
  /**
832d11c5c   Ilpo Järvinen   tcp: Try to resto...
587
588
589
590
591
592
593
594
595
596
597
598
599
   *	skb_queue_is_first - check if skb is the first entry in the queue
   *	@list: queue head
   *	@skb: buffer
   *
   *	Returns true if @skb is the first buffer on the list.
   */
  static inline bool skb_queue_is_first(const struct sk_buff_head *list,
  				      const struct sk_buff *skb)
  {
  	return (skb->prev == (struct sk_buff *) list);
  }
  
  /**
249c8b42c   David S. Miller   net: Add skb_queu...
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
   *	skb_queue_next - return the next packet in the queue
   *	@list: queue head
   *	@skb: current buffer
   *
   *	Return the next packet in @list after @skb.  It is only valid to
   *	call this if skb_queue_is_last() evaluates to false.
   */
  static inline struct sk_buff *skb_queue_next(const struct sk_buff_head *list,
  					     const struct sk_buff *skb)
  {
  	/* This BUG_ON may seem severe, but if we just return then we
  	 * are going to dereference garbage.
  	 */
  	BUG_ON(skb_queue_is_last(list, skb));
  	return skb->next;
  }
  
  /**
832d11c5c   Ilpo Järvinen   tcp: Try to resto...
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
   *	skb_queue_prev - return the prev packet in the queue
   *	@list: queue head
   *	@skb: current buffer
   *
   *	Return the prev packet in @list before @skb.  It is only valid to
   *	call this if skb_queue_is_first() evaluates to false.
   */
  static inline struct sk_buff *skb_queue_prev(const struct sk_buff_head *list,
  					     const struct sk_buff *skb)
  {
  	/* This BUG_ON may seem severe, but if we just return then we
  	 * are going to dereference garbage.
  	 */
  	BUG_ON(skb_queue_is_first(list, skb));
  	return skb->prev;
  }
  
  /**
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
   *	skb_get - reference buffer
   *	@skb: buffer to reference
   *
   *	Makes another reference to a socket buffer and returns a pointer
   *	to the buffer.
   */
  static inline struct sk_buff *skb_get(struct sk_buff *skb)
  {
  	atomic_inc(&skb->users);
  	return skb;
  }
  
  /*
   * If users == 1, we are the only owner and are can avoid redundant
   * atomic change.
   */
  
  /**
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
   *	skb_cloned - is the buffer a clone
   *	@skb: buffer to check
   *
   *	Returns true if the buffer was generated with skb_clone() and is
   *	one of multiple shared copies of the buffer. Cloned buffers are
   *	shared data so must not be written to under normal circumstances.
   */
  static inline int skb_cloned(const struct sk_buff *skb)
  {
  	return skb->cloned &&
  	       (atomic_read(&skb_shinfo(skb)->dataref) & SKB_DATAREF_MASK) != 1;
  }
  
  /**
   *	skb_header_cloned - is the header a clone
   *	@skb: buffer to check
   *
   *	Returns true if modifying the header part of the buffer requires
   *	the data to be copied.
   */
  static inline int skb_header_cloned(const struct sk_buff *skb)
  {
  	int dataref;
  
  	if (!skb->cloned)
  		return 0;
  
  	dataref = atomic_read(&skb_shinfo(skb)->dataref);
  	dataref = (dataref & SKB_DATAREF_MASK) - (dataref >> SKB_DATAREF_SHIFT);
  	return dataref != 1;
  }
  
  /**
   *	skb_header_release - release reference to header
   *	@skb: buffer to operate on
   *
   *	Drop a reference to the header part of the buffer.  This is done
   *	by acquiring a payload reference.  You must not read from the header
   *	part of skb->data after this.
   */
  static inline void skb_header_release(struct sk_buff *skb)
  {
  	BUG_ON(skb->nohdr);
  	skb->nohdr = 1;
  	atomic_add(1 << SKB_DATAREF_SHIFT, &skb_shinfo(skb)->dataref);
  }
  
  /**
   *	skb_shared - is the buffer shared
   *	@skb: buffer to check
   *
   *	Returns true if more than one person has a reference to this
   *	buffer.
   */
  static inline int skb_shared(const struct sk_buff *skb)
  {
  	return atomic_read(&skb->users) != 1;
  }
  
  /**
   *	skb_share_check - check if buffer is shared and if so clone it
   *	@skb: buffer to check
   *	@pri: priority for memory allocation
   *
   *	If the buffer is shared the buffer is cloned and the old copy
   *	drops a reference. A new clone with a single reference is returned.
   *	If the buffer is not shared the original buffer is returned. When
   *	being called from interrupt status or with spinlocks held pri must
   *	be GFP_ATOMIC.
   *
   *	NULL is returned on a memory allocation failure.
   */
86a76caf8   Victor Fusco   [NET]: Fix sparse...
726
  static inline struct sk_buff *skb_share_check(struct sk_buff *skb,
dd0fc66fb   Al Viro   [PATCH] gfp flags...
727
  					      gfp_t pri)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
  {
  	might_sleep_if(pri & __GFP_WAIT);
  	if (skb_shared(skb)) {
  		struct sk_buff *nskb = skb_clone(skb, pri);
  		kfree_skb(skb);
  		skb = nskb;
  	}
  	return skb;
  }
  
  /*
   *	Copy shared buffers into a new sk_buff. We effectively do COW on
   *	packets to handle cases where we have a local reader and forward
   *	and a couple of other messy ones. The normal one is tcpdumping
   *	a packet thats being forwarded.
   */
  
  /**
   *	skb_unshare - make a copy of a shared buffer
   *	@skb: buffer to check
   *	@pri: priority for memory allocation
   *
   *	If the socket buffer is a clone then this function creates a new
   *	copy of the data, drops a reference count on the old copy and returns
   *	the new copy with the reference count at 1. If the buffer is not a clone
   *	the original buffer is returned. When called with a spinlock held or
   *	from interrupt state @pri must be %GFP_ATOMIC
   *
   *	%NULL is returned on a memory allocation failure.
   */
e2bf521d9   Victor Fusco   [NET]: Fix "nocas...
758
  static inline struct sk_buff *skb_unshare(struct sk_buff *skb,
dd0fc66fb   Al Viro   [PATCH] gfp flags...
759
  					  gfp_t pri)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
760
761
762
763
764
765
766
767
768
769
770
  {
  	might_sleep_if(pri & __GFP_WAIT);
  	if (skb_cloned(skb)) {
  		struct sk_buff *nskb = skb_copy(skb, pri);
  		kfree_skb(skb);	/* Free our shared copy */
  		skb = nskb;
  	}
  	return skb;
  }
  
  /**
1a5778aa0   Ben Hutchings   net: Fix first li...
771
   *	skb_peek - peek at the head of an &sk_buff_head
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
   *	@list_: list to peek at
   *
   *	Peek an &sk_buff. Unlike most other operations you _MUST_
   *	be careful with this one. A peek leaves the buffer on the
   *	list and someone else may run off with it. You must hold
   *	the appropriate locks or have a private queue to do this.
   *
   *	Returns %NULL for an empty list or a pointer to the head element.
   *	The reference count is not incremented and the reference is therefore
   *	volatile. Use with caution.
   */
  static inline struct sk_buff *skb_peek(struct sk_buff_head *list_)
  {
  	struct sk_buff *list = ((struct sk_buff *)list_)->next;
  	if (list == (struct sk_buff *)list_)
  		list = NULL;
  	return list;
  }
  
  /**
1a5778aa0   Ben Hutchings   net: Fix first li...
792
   *	skb_peek_tail - peek at the tail of an &sk_buff_head
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
   *	@list_: list to peek at
   *
   *	Peek an &sk_buff. Unlike most other operations you _MUST_
   *	be careful with this one. A peek leaves the buffer on the
   *	list and someone else may run off with it. You must hold
   *	the appropriate locks or have a private queue to do this.
   *
   *	Returns %NULL for an empty list or a pointer to the tail element.
   *	The reference count is not incremented and the reference is therefore
   *	volatile. Use with caution.
   */
  static inline struct sk_buff *skb_peek_tail(struct sk_buff_head *list_)
  {
  	struct sk_buff *list = ((struct sk_buff *)list_)->prev;
  	if (list == (struct sk_buff *)list_)
  		list = NULL;
  	return list;
  }
  
  /**
   *	skb_queue_len	- get queue length
   *	@list_: list to measure
   *
   *	Return the length of an &sk_buff queue.
   */
  static inline __u32 skb_queue_len(const struct sk_buff_head *list_)
  {
  	return list_->qlen;
  }
67fed4593   David S. Miller   net: Add new inte...
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
  /**
   *	__skb_queue_head_init - initialize non-spinlock portions of sk_buff_head
   *	@list: queue to initialize
   *
   *	This initializes only the list and queue length aspects of
   *	an sk_buff_head object.  This allows to initialize the list
   *	aspects of an sk_buff_head without reinitializing things like
   *	the spinlock.  It can also be used for on-stack sk_buff_head
   *	objects where the spinlock is known to not be used.
   */
  static inline void __skb_queue_head_init(struct sk_buff_head *list)
  {
  	list->prev = list->next = (struct sk_buff *)list;
  	list->qlen = 0;
  }
76f10ad0e   Arjan van de Ven   [NET]: Remove loc...
837
838
839
840
841
842
843
844
  /*
   * This function creates a split out lock class for each invocation;
   * this is needed for now since a whole lot of users of the skb-queue
   * infrastructure in drivers have different locking usage (in hardirq)
   * than the networking core (in softirq only). In the long run either the
   * network layer or drivers should need annotation to consolidate the
   * main types of usage into 3 classes.
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
845
846
847
  static inline void skb_queue_head_init(struct sk_buff_head *list)
  {
  	spin_lock_init(&list->lock);
67fed4593   David S. Miller   net: Add new inte...
848
  	__skb_queue_head_init(list);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
849
  }
c2ecba717   Pavel Emelianov   [NET]: Set a sepa...
850
851
852
853
854
855
  static inline void skb_queue_head_init_class(struct sk_buff_head *list,
  		struct lock_class_key *class)
  {
  	skb_queue_head_init(list);
  	lockdep_set_class(&list->lock, class);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
856
  /*
bf2992758   Gerrit Renker   [SKB]: __skb_queu...
857
   *	Insert an sk_buff on a list.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
858
859
860
861
   *
   *	The "__skb_xxxx()" functions are the non-atomic ones that
   *	can only be called with interrupts disabled.
   */
bf2992758   Gerrit Renker   [SKB]: __skb_queu...
862
863
864
865
866
867
868
869
870
871
  extern void        skb_insert(struct sk_buff *old, struct sk_buff *newsk, struct sk_buff_head *list);
  static inline void __skb_insert(struct sk_buff *newsk,
  				struct sk_buff *prev, struct sk_buff *next,
  				struct sk_buff_head *list)
  {
  	newsk->next = next;
  	newsk->prev = prev;
  	next->prev  = prev->next = newsk;
  	list->qlen++;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
872

67fed4593   David S. Miller   net: Add new inte...
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
  static inline void __skb_queue_splice(const struct sk_buff_head *list,
  				      struct sk_buff *prev,
  				      struct sk_buff *next)
  {
  	struct sk_buff *first = list->next;
  	struct sk_buff *last = list->prev;
  
  	first->prev = prev;
  	prev->next = first;
  
  	last->next = next;
  	next->prev = last;
  }
  
  /**
   *	skb_queue_splice - join two skb lists, this is designed for stacks
   *	@list: the new list to add
   *	@head: the place to add it in the first list
   */
  static inline void skb_queue_splice(const struct sk_buff_head *list,
  				    struct sk_buff_head *head)
  {
  	if (!skb_queue_empty(list)) {
  		__skb_queue_splice(list, (struct sk_buff *) head, head->next);
1d4a31dde   David S. Miller   net: Fix bus in S...
897
  		head->qlen += list->qlen;
67fed4593   David S. Miller   net: Add new inte...
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
  	}
  }
  
  /**
   *	skb_queue_splice - join two skb lists and reinitialise the emptied list
   *	@list: the new list to add
   *	@head: the place to add it in the first list
   *
   *	The list at @list is reinitialised
   */
  static inline void skb_queue_splice_init(struct sk_buff_head *list,
  					 struct sk_buff_head *head)
  {
  	if (!skb_queue_empty(list)) {
  		__skb_queue_splice(list, (struct sk_buff *) head, head->next);
1d4a31dde   David S. Miller   net: Fix bus in S...
913
  		head->qlen += list->qlen;
67fed4593   David S. Miller   net: Add new inte...
914
915
916
917
918
919
920
921
922
923
924
925
926
927
  		__skb_queue_head_init(list);
  	}
  }
  
  /**
   *	skb_queue_splice_tail - join two skb lists, each list being a queue
   *	@list: the new list to add
   *	@head: the place to add it in the first list
   */
  static inline void skb_queue_splice_tail(const struct sk_buff_head *list,
  					 struct sk_buff_head *head)
  {
  	if (!skb_queue_empty(list)) {
  		__skb_queue_splice(list, head->prev, (struct sk_buff *) head);
1d4a31dde   David S. Miller   net: Fix bus in S...
928
  		head->qlen += list->qlen;
67fed4593   David S. Miller   net: Add new inte...
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
  	}
  }
  
  /**
   *	skb_queue_splice_tail - join two skb lists and reinitialise the emptied list
   *	@list: the new list to add
   *	@head: the place to add it in the first list
   *
   *	Each of the lists is a queue.
   *	The list at @list is reinitialised
   */
  static inline void skb_queue_splice_tail_init(struct sk_buff_head *list,
  					      struct sk_buff_head *head)
  {
  	if (!skb_queue_empty(list)) {
  		__skb_queue_splice(list, head->prev, (struct sk_buff *) head);
1d4a31dde   David S. Miller   net: Fix bus in S...
945
  		head->qlen += list->qlen;
67fed4593   David S. Miller   net: Add new inte...
946
947
948
  		__skb_queue_head_init(list);
  	}
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
949
  /**
300ce174e   Stephen Hemminger   [NETEM]: Support ...
950
   *	__skb_queue_after - queue a buffer at the list head
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
951
   *	@list: list to use
300ce174e   Stephen Hemminger   [NETEM]: Support ...
952
   *	@prev: place after this buffer
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
953
954
   *	@newsk: buffer to queue
   *
300ce174e   Stephen Hemminger   [NETEM]: Support ...
955
   *	Queue a buffer int the middle of a list. This function takes no locks
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
956
957
958
959
   *	and you must therefore hold required locks before calling it.
   *
   *	A buffer cannot be placed on two lists at the same time.
   */
300ce174e   Stephen Hemminger   [NETEM]: Support ...
960
961
962
  static inline void __skb_queue_after(struct sk_buff_head *list,
  				     struct sk_buff *prev,
  				     struct sk_buff *newsk)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
963
  {
bf2992758   Gerrit Renker   [SKB]: __skb_queu...
964
  	__skb_insert(newsk, prev, prev->next, list);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
965
  }
7de6c0333   Gerrit Renker   [SKB]: __skb_appe...
966
967
  extern void skb_append(struct sk_buff *old, struct sk_buff *newsk,
  		       struct sk_buff_head *list);
f5572855e   Gerrit Renker   [SKB]: __skb_queu...
968
969
970
971
972
973
  static inline void __skb_queue_before(struct sk_buff_head *list,
  				      struct sk_buff *next,
  				      struct sk_buff *newsk)
  {
  	__skb_insert(newsk, next->prev, next, list);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
974
  /**
300ce174e   Stephen Hemminger   [NETEM]: Support ...
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
   *	__skb_queue_head - queue a buffer at the list head
   *	@list: list to use
   *	@newsk: buffer to queue
   *
   *	Queue a buffer at the start of a list. This function takes no locks
   *	and you must therefore hold required locks before calling it.
   *
   *	A buffer cannot be placed on two lists at the same time.
   */
  extern void skb_queue_head(struct sk_buff_head *list, struct sk_buff *newsk);
  static inline void __skb_queue_head(struct sk_buff_head *list,
  				    struct sk_buff *newsk)
  {
  	__skb_queue_after(list, (struct sk_buff *)list, newsk);
  }
  
  /**
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
   *	__skb_queue_tail - queue a buffer at the list tail
   *	@list: list to use
   *	@newsk: buffer to queue
   *
   *	Queue a buffer at the end of a list. This function takes no locks
   *	and you must therefore hold required locks before calling it.
   *
   *	A buffer cannot be placed on two lists at the same time.
   */
  extern void skb_queue_tail(struct sk_buff_head *list, struct sk_buff *newsk);
  static inline void __skb_queue_tail(struct sk_buff_head *list,
  				   struct sk_buff *newsk)
  {
f5572855e   Gerrit Renker   [SKB]: __skb_queu...
1005
  	__skb_queue_before(list, (struct sk_buff *)list, newsk);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1006
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1007
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1008
1009
1010
   * remove sk_buff from list. _Must_ be called atomically, and with
   * the list known..
   */
8728b834b   David S. Miller   [NET]: Kill skb->...
1011
  extern void	   skb_unlink(struct sk_buff *skb, struct sk_buff_head *list);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1012
1013
1014
1015
1016
1017
1018
1019
  static inline void __skb_unlink(struct sk_buff *skb, struct sk_buff_head *list)
  {
  	struct sk_buff *next, *prev;
  
  	list->qlen--;
  	next	   = skb->next;
  	prev	   = skb->prev;
  	skb->next  = skb->prev = NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1020
1021
1022
  	next->prev = prev;
  	prev->next = next;
  }
f525c06d1   Gerrit Renker   [SKB]: __skb_dequ...
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
  /**
   *	__skb_dequeue - remove from the head of the queue
   *	@list: list to dequeue from
   *
   *	Remove the head of the list. This function does not take any locks
   *	so must be used with appropriate locks held only. The head item is
   *	returned or %NULL if the list is empty.
   */
  extern struct sk_buff *skb_dequeue(struct sk_buff_head *list);
  static inline struct sk_buff *__skb_dequeue(struct sk_buff_head *list)
  {
  	struct sk_buff *skb = skb_peek(list);
  	if (skb)
  		__skb_unlink(skb, list);
  	return skb;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
  
  /**
   *	__skb_dequeue_tail - remove from the tail of the queue
   *	@list: list to dequeue from
   *
   *	Remove the tail of the list. This function does not take any locks
   *	so must be used with appropriate locks held only. The tail item is
   *	returned or %NULL if the list is empty.
   */
  extern struct sk_buff *skb_dequeue_tail(struct sk_buff_head *list);
  static inline struct sk_buff *__skb_dequeue_tail(struct sk_buff_head *list)
  {
  	struct sk_buff *skb = skb_peek_tail(list);
  	if (skb)
  		__skb_unlink(skb, list);
  	return skb;
  }
  
  
  static inline int skb_is_nonlinear(const struct sk_buff *skb)
  {
  	return skb->data_len;
  }
  
  static inline unsigned int skb_headlen(const struct sk_buff *skb)
  {
  	return skb->len - skb->data_len;
  }
  
  static inline int skb_pagelen(const struct sk_buff *skb)
  {
  	int i, len = 0;
  
  	for (i = (int)skb_shinfo(skb)->nr_frags - 1; i >= 0; i--)
  		len += skb_shinfo(skb)->frags[i].size;
  	return len + skb_headlen(skb);
  }
  
  static inline void skb_fill_page_desc(struct sk_buff *skb, int i,
  				      struct page *page, int off, int size)
  {
  	skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
  
  	frag->page		  = page;
  	frag->page_offset	  = off;
  	frag->size		  = size;
  	skb_shinfo(skb)->nr_frags = i + 1;
  }
654bed16c   Peter Zijlstra   net: packet split...
1087
1088
  extern void skb_add_rx_frag(struct sk_buff *skb, int i, struct page *page,
  			    int off, int size);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1089
  #define SKB_PAGE_ASSERT(skb) 	BUG_ON(skb_shinfo(skb)->nr_frags)
ee0398717   David S. Miller   skbuff: Add frag ...
1090
  #define SKB_FRAG_ASSERT(skb) 	BUG_ON(skb_has_frags(skb))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1091
  #define SKB_LINEAR_ASSERT(skb)  BUG_ON(skb_is_nonlinear(skb))
27a884dc3   Arnaldo Carvalho de Melo   [SK_BUFF]: Conver...
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
  #ifdef NET_SKBUFF_DATA_USES_OFFSET
  static inline unsigned char *skb_tail_pointer(const struct sk_buff *skb)
  {
  	return skb->head + skb->tail;
  }
  
  static inline void skb_reset_tail_pointer(struct sk_buff *skb)
  {
  	skb->tail = skb->data - skb->head;
  }
  
  static inline void skb_set_tail_pointer(struct sk_buff *skb, const int offset)
  {
  	skb_reset_tail_pointer(skb);
  	skb->tail += offset;
  }
  #else /* NET_SKBUFF_DATA_USES_OFFSET */
  static inline unsigned char *skb_tail_pointer(const struct sk_buff *skb)
  {
  	return skb->tail;
  }
  
  static inline void skb_reset_tail_pointer(struct sk_buff *skb)
  {
  	skb->tail = skb->data;
  }
  
  static inline void skb_set_tail_pointer(struct sk_buff *skb, const int offset)
  {
  	skb->tail = skb->data + offset;
  }
4305b5413   Arnaldo Carvalho de Melo   [SK_BUFF]: Conver...
1123

27a884dc3   Arnaldo Carvalho de Melo   [SK_BUFF]: Conver...
1124
  #endif /* NET_SKBUFF_DATA_USES_OFFSET */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1125
1126
1127
  /*
   *	Add data to an sk_buff
   */
0dde3e164   Ilpo Järvinen   [NET]: uninline s...
1128
  extern unsigned char *skb_put(struct sk_buff *skb, unsigned int len);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1129
1130
  static inline unsigned char *__skb_put(struct sk_buff *skb, unsigned int len)
  {
27a884dc3   Arnaldo Carvalho de Melo   [SK_BUFF]: Conver...
1131
  	unsigned char *tmp = skb_tail_pointer(skb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1132
1133
1134
1135
1136
  	SKB_LINEAR_ASSERT(skb);
  	skb->tail += len;
  	skb->len  += len;
  	return tmp;
  }
c2aa270ad   Ilpo Järvinen   [NET]: uninline s...
1137
  extern unsigned char *skb_push(struct sk_buff *skb, unsigned int len);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1138
1139
1140
1141
1142
1143
  static inline unsigned char *__skb_push(struct sk_buff *skb, unsigned int len)
  {
  	skb->data -= len;
  	skb->len  += len;
  	return skb->data;
  }
6be8ac2fd   Ilpo Järvinen   [NET]: uninline s...
1144
  extern unsigned char *skb_pull(struct sk_buff *skb, unsigned int len);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1145
1146
1147
1148
1149
1150
  static inline unsigned char *__skb_pull(struct sk_buff *skb, unsigned int len)
  {
  	skb->len -= len;
  	BUG_ON(skb->len < skb->data_len);
  	return skb->data += len;
  }
47d29646a   David S. Miller   net: Inline skb_p...
1151
1152
1153
1154
  static inline unsigned char *skb_pull_inline(struct sk_buff *skb, unsigned int len)
  {
  	return unlikely(len > skb->len) ? NULL : __skb_pull(skb, len);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1155
1156
1157
1158
1159
  extern unsigned char *__pskb_pull_tail(struct sk_buff *skb, int delta);
  
  static inline unsigned char *__pskb_pull(struct sk_buff *skb, unsigned int len)
  {
  	if (len > skb_headlen(skb) &&
987c402ac   Gerrit Renker   skbuff: Code read...
1160
  	    !__pskb_pull_tail(skb, len - skb_headlen(skb)))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
  		return NULL;
  	skb->len -= len;
  	return skb->data += len;
  }
  
  static inline unsigned char *pskb_pull(struct sk_buff *skb, unsigned int len)
  {
  	return unlikely(len > skb->len) ? NULL : __pskb_pull(skb, len);
  }
  
  static inline int pskb_may_pull(struct sk_buff *skb, unsigned int len)
  {
  	if (likely(len <= skb_headlen(skb)))
  		return 1;
  	if (unlikely(len > skb->len))
  		return 0;
987c402ac   Gerrit Renker   skbuff: Code read...
1177
  	return __pskb_pull_tail(skb, len - skb_headlen(skb)) != NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1178
1179
1180
1181
1182
1183
1184
1185
  }
  
  /**
   *	skb_headroom - bytes at buffer head
   *	@skb: buffer to check
   *
   *	Return the number of bytes of free space at the head of an &sk_buff.
   */
c2636b4d9   Chuck Lever   [NET]: Treat the ...
1186
  static inline unsigned int skb_headroom(const struct sk_buff *skb)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
  {
  	return skb->data - skb->head;
  }
  
  /**
   *	skb_tailroom - bytes at buffer end
   *	@skb: buffer to check
   *
   *	Return the number of bytes of free space at the tail of an sk_buff
   */
  static inline int skb_tailroom(const struct sk_buff *skb)
  {
4305b5413   Arnaldo Carvalho de Melo   [SK_BUFF]: Conver...
1199
  	return skb_is_nonlinear(skb) ? 0 : skb->end - skb->tail;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
  }
  
  /**
   *	skb_reserve - adjust headroom
   *	@skb: buffer to alter
   *	@len: bytes to move
   *
   *	Increase the headroom of an empty &sk_buff by reducing the tail
   *	room. This is only allowed for an empty buffer.
   */
8243126c5   David S. Miller   [NET]: Make secon...
1210
  static inline void skb_reserve(struct sk_buff *skb, int len)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1211
1212
1213
1214
  {
  	skb->data += len;
  	skb->tail += len;
  }
2e07fa9cd   Arnaldo Carvalho de Melo   [SK_BUFF]: Use of...
1215
  #ifdef NET_SKBUFF_DATA_USES_OFFSET
9c70220b7   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
1216
1217
  static inline unsigned char *skb_transport_header(const struct sk_buff *skb)
  {
2e07fa9cd   Arnaldo Carvalho de Melo   [SK_BUFF]: Use of...
1218
  	return skb->head + skb->transport_header;
9c70220b7   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
1219
  }
badff6d01   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
1220
1221
  static inline void skb_reset_transport_header(struct sk_buff *skb)
  {
2e07fa9cd   Arnaldo Carvalho de Melo   [SK_BUFF]: Use of...
1222
  	skb->transport_header = skb->data - skb->head;
badff6d01   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
1223
  }
967b05f64   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
1224
1225
1226
  static inline void skb_set_transport_header(struct sk_buff *skb,
  					    const int offset)
  {
2e07fa9cd   Arnaldo Carvalho de Melo   [SK_BUFF]: Use of...
1227
1228
  	skb_reset_transport_header(skb);
  	skb->transport_header += offset;
ea2ae17d6   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
1229
  }
d56f90a7c   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
1230
1231
  static inline unsigned char *skb_network_header(const struct sk_buff *skb)
  {
2e07fa9cd   Arnaldo Carvalho de Melo   [SK_BUFF]: Use of...
1232
  	return skb->head + skb->network_header;
d56f90a7c   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
1233
  }
c1d2bbe1c   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
1234
1235
  static inline void skb_reset_network_header(struct sk_buff *skb)
  {
2e07fa9cd   Arnaldo Carvalho de Melo   [SK_BUFF]: Use of...
1236
  	skb->network_header = skb->data - skb->head;
c1d2bbe1c   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
1237
  }
c14d2450c   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
1238
1239
  static inline void skb_set_network_header(struct sk_buff *skb, const int offset)
  {
2e07fa9cd   Arnaldo Carvalho de Melo   [SK_BUFF]: Use of...
1240
1241
  	skb_reset_network_header(skb);
  	skb->network_header += offset;
c14d2450c   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
1242
  }
2e07fa9cd   Arnaldo Carvalho de Melo   [SK_BUFF]: Use of...
1243
  static inline unsigned char *skb_mac_header(const struct sk_buff *skb)
bbe735e42   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
1244
  {
2e07fa9cd   Arnaldo Carvalho de Melo   [SK_BUFF]: Use of...
1245
  	return skb->head + skb->mac_header;
bbe735e42   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
1246
  }
2e07fa9cd   Arnaldo Carvalho de Melo   [SK_BUFF]: Use of...
1247
  static inline int skb_mac_header_was_set(const struct sk_buff *skb)
cfe1fc775   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
1248
  {
2e07fa9cd   Arnaldo Carvalho de Melo   [SK_BUFF]: Use of...
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
  	return skb->mac_header != ~0U;
  }
  
  static inline void skb_reset_mac_header(struct sk_buff *skb)
  {
  	skb->mac_header = skb->data - skb->head;
  }
  
  static inline void skb_set_mac_header(struct sk_buff *skb, const int offset)
  {
  	skb_reset_mac_header(skb);
  	skb->mac_header += offset;
  }
  
  #else /* NET_SKBUFF_DATA_USES_OFFSET */
  
  static inline unsigned char *skb_transport_header(const struct sk_buff *skb)
  {
  	return skb->transport_header;
  }
  
  static inline void skb_reset_transport_header(struct sk_buff *skb)
  {
  	skb->transport_header = skb->data;
  }
  
  static inline void skb_set_transport_header(struct sk_buff *skb,
  					    const int offset)
  {
  	skb->transport_header = skb->data + offset;
  }
  
  static inline unsigned char *skb_network_header(const struct sk_buff *skb)
  {
  	return skb->network_header;
  }
  
  static inline void skb_reset_network_header(struct sk_buff *skb)
  {
  	skb->network_header = skb->data;
  }
  
  static inline void skb_set_network_header(struct sk_buff *skb, const int offset)
  {
  	skb->network_header = skb->data + offset;
cfe1fc775   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
1294
  }
98e399f82   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
1295
1296
  static inline unsigned char *skb_mac_header(const struct sk_buff *skb)
  {
b0e380b1d   Arnaldo Carvalho de Melo   [SK_BUFF]: unions...
1297
  	return skb->mac_header;
98e399f82   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
1298
1299
1300
1301
  }
  
  static inline int skb_mac_header_was_set(const struct sk_buff *skb)
  {
b0e380b1d   Arnaldo Carvalho de Melo   [SK_BUFF]: unions...
1302
  	return skb->mac_header != NULL;
98e399f82   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
1303
  }
459a98ed8   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
1304
1305
  static inline void skb_reset_mac_header(struct sk_buff *skb)
  {
b0e380b1d   Arnaldo Carvalho de Melo   [SK_BUFF]: unions...
1306
  	skb->mac_header = skb->data;
459a98ed8   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
1307
  }
48d49d0cc   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
1308
1309
  static inline void skb_set_mac_header(struct sk_buff *skb, const int offset)
  {
b0e380b1d   Arnaldo Carvalho de Melo   [SK_BUFF]: unions...
1310
  	skb->mac_header = skb->data + offset;
48d49d0cc   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
1311
  }
2e07fa9cd   Arnaldo Carvalho de Melo   [SK_BUFF]: Use of...
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
  #endif /* NET_SKBUFF_DATA_USES_OFFSET */
  
  static inline int skb_transport_offset(const struct sk_buff *skb)
  {
  	return skb_transport_header(skb) - skb->data;
  }
  
  static inline u32 skb_network_header_len(const struct sk_buff *skb)
  {
  	return skb->transport_header - skb->network_header;
  }
  
  static inline int skb_network_offset(const struct sk_buff *skb)
  {
  	return skb_network_header(skb) - skb->data;
  }
48d49d0cc   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
1328

f9599ce11   Changli Gao   sk_buff: introduc...
1329
1330
1331
1332
  static inline int pskb_network_may_pull(struct sk_buff *skb, unsigned int len)
  {
  	return pskb_may_pull(skb, skb_network_offset(skb) + len);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
  /*
   * CPUs often take a performance hit when accessing unaligned memory
   * locations. The actual performance hit varies, it can be small if the
   * hardware handles it or large if we have to take an exception and fix it
   * in software.
   *
   * Since an ethernet header is 14 bytes network drivers often end up with
   * the IP header at an unaligned offset. The IP header can be aligned by
   * shifting the start of the packet by 2 bytes. Drivers should do this
   * with:
   *
8660c1240   Tobias Klauser   skbuff.h: Fix com...
1344
   * skb_reserve(skb, NET_IP_ALIGN);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1345
1346
1347
1348
   *
   * The downside to this alignment of the IP header is that the DMA is now
   * unaligned. On some architectures the cost of an unaligned DMA is high
   * and this cost outweighs the gains made by aligning the IP header.
8660c1240   Tobias Klauser   skbuff.h: Fix com...
1349
   *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1350
1351
1352
1353
1354
1355
   * Since this trade off varies between architectures, we allow NET_IP_ALIGN
   * to be overridden.
   */
  #ifndef NET_IP_ALIGN
  #define NET_IP_ALIGN	2
  #endif
025be81e8   Anton Blanchard   [NET]: Allow skb ...
1356
1357
1358
1359
  /*
   * The networking layer reserves some headroom in skb data (via
   * dev_alloc_skb). This is used to avoid having to reallocate skb data when
   * the header has to grow. In the default case, if the header has to grow
d6301d3dd   David S. Miller   net: Increase def...
1360
   * 32 bytes or less we avoid the reallocation.
025be81e8   Anton Blanchard   [NET]: Allow skb ...
1361
1362
1363
1364
1365
1366
1367
   *
   * Unfortunately this headroom changes the DMA alignment of the resulting
   * network packet. As for NET_IP_ALIGN, this unaligned DMA is expensive
   * on some architectures. An architecture can override this value,
   * perhaps setting it to a cacheline in size (since that will maintain
   * cacheline alignment of the DMA). It must be a power of 2.
   *
d6301d3dd   David S. Miller   net: Increase def...
1368
   * Various parts of the networking layer expect at least 32 bytes of
025be81e8   Anton Blanchard   [NET]: Allow skb ...
1369
   * headroom, you should not reduce this.
5933dd2f0   Eric Dumazet   net: NET_SKB_PAD ...
1370
1371
1372
1373
   *
   * Using max(32, L1_CACHE_BYTES) makes sense (especially with RPS)
   * to reduce average number of cache lines per packet.
   * get_rps_cpus() for example only access one 64 bytes aligned block :
18e8c134f   Eric Dumazet   net: Increase NET...
1374
   * NET_IP_ALIGN(2) + ethernet_header(14) + IP_header(20/40) + ports(8)
025be81e8   Anton Blanchard   [NET]: Allow skb ...
1375
1376
   */
  #ifndef NET_SKB_PAD
5933dd2f0   Eric Dumazet   net: NET_SKB_PAD ...
1377
  #define NET_SKB_PAD	max(32, L1_CACHE_BYTES)
025be81e8   Anton Blanchard   [NET]: Allow skb ...
1378
  #endif
3cc0e8739   Herbert Xu   [NET]: Warn in __...
1379
  extern int ___pskb_trim(struct sk_buff *skb, unsigned int len);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1380
1381
1382
  
  static inline void __skb_trim(struct sk_buff *skb, unsigned int len)
  {
3cc0e8739   Herbert Xu   [NET]: Warn in __...
1383
1384
1385
1386
  	if (unlikely(skb->data_len)) {
  		WARN_ON(1);
  		return;
  	}
27a884dc3   Arnaldo Carvalho de Melo   [SK_BUFF]: Conver...
1387
1388
  	skb->len = len;
  	skb_set_tail_pointer(skb, len);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1389
  }
419ae74ec   Ilpo Järvinen   [NET]: uninline s...
1390
  extern void skb_trim(struct sk_buff *skb, unsigned int len);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1391
1392
1393
  
  static inline int __pskb_trim(struct sk_buff *skb, unsigned int len)
  {
3cc0e8739   Herbert Xu   [NET]: Warn in __...
1394
1395
1396
1397
  	if (skb->data_len)
  		return ___pskb_trim(skb, len);
  	__skb_trim(skb, len);
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1398
1399
1400
1401
1402
1403
1404
1405
  }
  
  static inline int pskb_trim(struct sk_buff *skb, unsigned int len)
  {
  	return (len < skb->len) ? __pskb_trim(skb, len) : 0;
  }
  
  /**
e9fa4f7bd   Herbert Xu   [INET]: Use pskb_...
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
   *	pskb_trim_unique - remove end from a paged unique (not cloned) buffer
   *	@skb: buffer to alter
   *	@len: new length
   *
   *	This is identical to pskb_trim except that the caller knows that
   *	the skb is not cloned so we should never get an error due to out-
   *	of-memory.
   */
  static inline void pskb_trim_unique(struct sk_buff *skb, unsigned int len)
  {
  	int err = pskb_trim(skb, len);
  	BUG_ON(err);
  }
  
  /**
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
   *	skb_orphan - orphan a buffer
   *	@skb: buffer to orphan
   *
   *	If a buffer currently has an owner then we call the owner's
   *	destructor function and make the @skb unowned. The buffer continues
   *	to exist but is no longer charged to its former owner.
   */
  static inline void skb_orphan(struct sk_buff *skb)
  {
  	if (skb->destructor)
  		skb->destructor(skb);
  	skb->destructor = NULL;
  	skb->sk		= NULL;
  }
  
  /**
   *	__skb_queue_purge - empty a list
   *	@list: list to empty
   *
   *	Delete all buffers on an &sk_buff list. Each buffer is removed from
   *	the list and one reference dropped. This function does not take the
   *	list lock and the caller must hold the relevant locks to use it.
   */
  extern void skb_queue_purge(struct sk_buff_head *list);
  static inline void __skb_queue_purge(struct sk_buff_head *list)
  {
  	struct sk_buff *skb;
  	while ((skb = __skb_dequeue(list)) != NULL)
  		kfree_skb(skb);
  }
  
  /**
b4e54de8d   Christoph Hellwig   [NET]: Correct de...
1453
   *	__dev_alloc_skb - allocate an skbuff for receiving
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1454
1455
1456
1457
1458
1459
1460
1461
   *	@length: length to allocate
   *	@gfp_mask: get_free_pages mask, passed to alloc_skb
   *
   *	Allocate a new &sk_buff and assign it a usage count of one. The
   *	buffer has unspecified headroom built in. Users should allocate
   *	the headroom they think they need without accounting for the
   *	built in space. The built in space is used for optimisations.
   *
766ea8cce   Christoph Hellwig   [NET]: Fix alloc_...
1462
   *	%NULL is returned if there is no free memory.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1463
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1464
  static inline struct sk_buff *__dev_alloc_skb(unsigned int length,
dd0fc66fb   Al Viro   [PATCH] gfp flags...
1465
  					      gfp_t gfp_mask)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1466
  {
025be81e8   Anton Blanchard   [NET]: Allow skb ...
1467
  	struct sk_buff *skb = alloc_skb(length + NET_SKB_PAD, gfp_mask);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1468
  	if (likely(skb))
025be81e8   Anton Blanchard   [NET]: Allow skb ...
1469
  		skb_reserve(skb, NET_SKB_PAD);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1470
1471
  	return skb;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1472

f58518e67   Ilpo Järvinen   [NET]: uninline d...
1473
  extern struct sk_buff *dev_alloc_skb(unsigned int length);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1474

8af274564   Christoph Hellwig   [NET]: Add netdev...
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
  extern struct sk_buff *__netdev_alloc_skb(struct net_device *dev,
  		unsigned int length, gfp_t gfp_mask);
  
  /**
   *	netdev_alloc_skb - allocate an skbuff for rx on a specific device
   *	@dev: network device to receive on
   *	@length: length to allocate
   *
   *	Allocate a new &sk_buff and assign it a usage count of one. The
   *	buffer has unspecified headroom built in. Users should allocate
   *	the headroom they think they need without accounting for the
   *	built in space. The built in space is used for optimisations.
   *
   *	%NULL is returned if there is no free memory. Although this function
   *	allocates memory it can be called from an interrupt.
   */
  static inline struct sk_buff *netdev_alloc_skb(struct net_device *dev,
  		unsigned int length)
  {
  	return __netdev_alloc_skb(dev, length, GFP_ATOMIC);
  }
61321bbd6   Eric Dumazet   net: Add netdev_a...
1496
1497
1498
1499
1500
1501
1502
1503
1504
  static inline struct sk_buff *netdev_alloc_skb_ip_align(struct net_device *dev,
  		unsigned int length)
  {
  	struct sk_buff *skb = netdev_alloc_skb(dev, length + NET_IP_ALIGN);
  
  	if (NET_IP_ALIGN && skb)
  		skb_reserve(skb, NET_IP_ALIGN);
  	return skb;
  }
654bed16c   Peter Zijlstra   net: packet split...
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
  extern struct page *__netdev_alloc_page(struct net_device *dev, gfp_t gfp_mask);
  
  /**
   *	netdev_alloc_page - allocate a page for ps-rx on a specific device
   *	@dev: network device to receive on
   *
   * 	Allocate a new page node local to the specified device.
   *
   * 	%NULL is returned if there is no free memory.
   */
  static inline struct page *netdev_alloc_page(struct net_device *dev)
  {
  	return __netdev_alloc_page(dev, GFP_ATOMIC);
  }
  
  static inline void netdev_free_page(struct net_device *dev, struct page *page)
  {
  	__free_page(page);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1524
  /**
334a8132d   Patrick McHardy   [SKBUFF]: Keep tr...
1525
1526
1527
1528
1529
1530
1531
   *	skb_clone_writable - is the header of a clone writable
   *	@skb: buffer to check
   *	@len: length up to which to write
   *
   *	Returns true if modifying the header part of the cloned buffer
   *	does not requires the data to be copied.
   */
c2636b4d9   Chuck Lever   [NET]: Treat the ...
1532
  static inline int skb_clone_writable(struct sk_buff *skb, unsigned int len)
334a8132d   Patrick McHardy   [SKBUFF]: Keep tr...
1533
1534
1535
1536
  {
  	return !skb_header_cloned(skb) &&
  	       skb_headroom(skb) + len <= skb->hdr_len;
  }
d9cc20484   Herbert Xu   [NET] skbuff: Add...
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
  static inline int __skb_cow(struct sk_buff *skb, unsigned int headroom,
  			    int cloned)
  {
  	int delta = 0;
  
  	if (headroom < NET_SKB_PAD)
  		headroom = NET_SKB_PAD;
  	if (headroom > skb_headroom(skb))
  		delta = headroom - skb_headroom(skb);
  
  	if (delta || cloned)
  		return pskb_expand_head(skb, ALIGN(delta, NET_SKB_PAD), 0,
  					GFP_ATOMIC);
  	return 0;
  }
334a8132d   Patrick McHardy   [SKBUFF]: Keep tr...
1552
  /**
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
   *	skb_cow - copy header of skb when it is required
   *	@skb: buffer to cow
   *	@headroom: needed headroom
   *
   *	If the skb passed lacks sufficient headroom or its data part
   *	is shared, data is reallocated. If reallocation fails, an error
   *	is returned and original skb is not changed.
   *
   *	The result is skb with writable area skb->head...skb->tail
   *	and at least @headroom of space at head.
   */
  static inline int skb_cow(struct sk_buff *skb, unsigned int headroom)
  {
d9cc20484   Herbert Xu   [NET] skbuff: Add...
1566
1567
  	return __skb_cow(skb, headroom, skb_cloned(skb));
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1568

d9cc20484   Herbert Xu   [NET] skbuff: Add...
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
  /**
   *	skb_cow_head - skb_cow but only making the head writable
   *	@skb: buffer to cow
   *	@headroom: needed headroom
   *
   *	This function is identical to skb_cow except that we replace the
   *	skb_cloned check by skb_header_cloned.  It should be used when
   *	you only need to push on some header and do not need to modify
   *	the data.
   */
  static inline int skb_cow_head(struct sk_buff *skb, unsigned int headroom)
  {
  	return __skb_cow(skb, headroom, skb_header_cloned(skb));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1582
1583
1584
1585
1586
1587
1588
1589
1590
  }
  
  /**
   *	skb_padto	- pad an skbuff up to a minimal size
   *	@skb: buffer to pad
   *	@len: minimal length
   *
   *	Pads up a buffer to ensure the trailing bytes exist and are
   *	blanked. If the buffer already contains sufficient data it
5b057c6b1   Herbert Xu   [NET]: Avoid allo...
1591
1592
   *	is untouched. Otherwise it is extended. Returns zero on
   *	success. The skb is freed on error.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1593
1594
   */
   
5b057c6b1   Herbert Xu   [NET]: Avoid allo...
1595
  static inline int skb_padto(struct sk_buff *skb, unsigned int len)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1596
1597
1598
  {
  	unsigned int size = skb->len;
  	if (likely(size >= len))
5b057c6b1   Herbert Xu   [NET]: Avoid allo...
1599
  		return 0;
987c402ac   Gerrit Renker   skbuff: Code read...
1600
  	return skb_pad(skb, len - size);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1601
1602
1603
1604
1605
1606
1607
1608
1609
  }
  
  static inline int skb_add_data(struct sk_buff *skb,
  			       char __user *from, int copy)
  {
  	const int off = skb->len;
  
  	if (skb->ip_summed == CHECKSUM_NONE) {
  		int err = 0;
5084205fa   Al Viro   [NET]: Annotate c...
1610
  		__wsum csum = csum_and_copy_from_user(from, skb_put(skb, copy),
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
  							    copy, 0, &err);
  		if (!err) {
  			skb->csum = csum_block_add(skb->csum, csum, off);
  			return 0;
  		}
  	} else if (!copy_from_user(skb_put(skb, copy), from, copy))
  		return 0;
  
  	__skb_trim(skb, off);
  	return -EFAULT;
  }
  
  static inline int skb_can_coalesce(struct sk_buff *skb, int i,
  				   struct page *page, int off)
  {
  	if (i) {
  		struct skb_frag_struct *frag = &skb_shinfo(skb)->frags[i - 1];
  
  		return page == frag->page &&
  		       off == frag->page_offset + frag->size;
  	}
  	return 0;
  }
364c6badd   Herbert Xu   [NET]: Clean up s...
1634
1635
1636
1637
  static inline int __skb_linearize(struct sk_buff *skb)
  {
  	return __pskb_pull_tail(skb, skb->data_len) ? 0 : -ENOMEM;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1638
1639
1640
  /**
   *	skb_linearize - convert paged skb to linear one
   *	@skb: buffer to linarize
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1641
1642
1643
1644
   *
   *	If there is no free memory -ENOMEM is returned, otherwise zero
   *	is returned and the old skb data released.
   */
364c6badd   Herbert Xu   [NET]: Clean up s...
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
  static inline int skb_linearize(struct sk_buff *skb)
  {
  	return skb_is_nonlinear(skb) ? __skb_linearize(skb) : 0;
  }
  
  /**
   *	skb_linearize_cow - make sure skb is linear and writable
   *	@skb: buffer to process
   *
   *	If there is no free memory -ENOMEM is returned, otherwise zero
   *	is returned and the old skb data released.
   */
  static inline int skb_linearize_cow(struct sk_buff *skb)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1658
  {
364c6badd   Herbert Xu   [NET]: Clean up s...
1659
1660
  	return skb_is_nonlinear(skb) || skb_cloned(skb) ?
  	       __skb_linearize(skb) : 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1661
1662
1663
1664
1665
1666
1667
1668
1669
  }
  
  /**
   *	skb_postpull_rcsum - update checksum for received skb after pull
   *	@skb: buffer to update
   *	@start: start of data before pull
   *	@len: length of data pulled
   *
   *	After doing a pull on a received packet, you need to call this to
84fa7933a   Patrick McHardy   [NET]: Replace CH...
1670
1671
   *	update the CHECKSUM_COMPLETE checksum, or set ip_summed to
   *	CHECKSUM_NONE so that it can be recomputed from scratch.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1672
1673
1674
   */
  
  static inline void skb_postpull_rcsum(struct sk_buff *skb,
cbb042f9e   Herbert Xu   [NET]: Replace sk...
1675
  				      const void *start, unsigned int len)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1676
  {
84fa7933a   Patrick McHardy   [NET]: Replace CH...
1677
  	if (skb->ip_summed == CHECKSUM_COMPLETE)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1678
1679
  		skb->csum = csum_sub(skb->csum, csum_partial(start, len, 0));
  }
cbb042f9e   Herbert Xu   [NET]: Replace sk...
1680
  unsigned char *skb_pull_rcsum(struct sk_buff *skb, unsigned int len);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
  /**
   *	pskb_trim_rcsum - trim received skb and update checksum
   *	@skb: buffer to trim
   *	@len: new length
   *
   *	This is exactly the same as pskb_trim except that it ensures the
   *	checksum of received packets are still valid after the operation.
   */
  
  static inline int pskb_trim_rcsum(struct sk_buff *skb, unsigned int len)
  {
0e4e4220f   Stephen Hemminger   [NET]: Optimize p...
1692
  	if (likely(len >= skb->len))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1693
  		return 0;
84fa7933a   Patrick McHardy   [NET]: Replace CH...
1694
  	if (skb->ip_summed == CHECKSUM_COMPLETE)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1695
1696
1697
  		skb->ip_summed = CHECKSUM_NONE;
  	return __pskb_trim(skb, len);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1698
1699
1700
1701
  #define skb_queue_walk(queue, skb) \
  		for (skb = (queue)->next;					\
  		     prefetch(skb->next), (skb != (struct sk_buff *)(queue));	\
  		     skb = skb->next)
46f8914e5   James Chapman   [SKB]: Introduce ...
1702
1703
1704
1705
  #define skb_queue_walk_safe(queue, skb, tmp)					\
  		for (skb = (queue)->next, tmp = skb->next;			\
  		     skb != (struct sk_buff *)(queue);				\
  		     skb = tmp, tmp = skb->next)
1164f52a2   David S. Miller   net: Add skb_queu...
1706
1707
1708
1709
1710
1711
1712
1713
  #define skb_queue_walk_from(queue, skb)						\
  		for (; prefetch(skb->next), (skb != (struct sk_buff *)(queue));	\
  		     skb = skb->next)
  
  #define skb_queue_walk_from_safe(queue, skb, tmp)				\
  		for (tmp = skb->next;						\
  		     skb != (struct sk_buff *)(queue);				\
  		     skb = tmp, tmp = skb->next)
300ce174e   Stephen Hemminger   [NETEM]: Support ...
1714
1715
1716
1717
  #define skb_queue_reverse_walk(queue, skb) \
  		for (skb = (queue)->prev;					\
  		     prefetch(skb->prev), (skb != (struct sk_buff *)(queue));	\
  		     skb = skb->prev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1718

ee0398717   David S. Miller   skbuff: Add frag ...
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
  static inline bool skb_has_frags(const struct sk_buff *skb)
  {
  	return skb_shinfo(skb)->frag_list != NULL;
  }
  
  static inline void skb_frag_list_init(struct sk_buff *skb)
  {
  	skb_shinfo(skb)->frag_list = NULL;
  }
  
  static inline void skb_frag_add_head(struct sk_buff *skb, struct sk_buff *frag)
  {
  	frag->next = skb_shinfo(skb)->frag_list;
  	skb_shinfo(skb)->frag_list = frag;
  }
  
  #define skb_walk_frags(skb, iter)	\
  	for (iter = skb_shinfo(skb)->frag_list; iter; iter = iter->next)
a59322be0   Herbert Xu   [UDP]: Only incre...
1737
1738
  extern struct sk_buff *__skb_recv_datagram(struct sock *sk, unsigned flags,
  					   int *peeked, int *err);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1739
1740
1741
1742
1743
1744
1745
  extern struct sk_buff *skb_recv_datagram(struct sock *sk, unsigned flags,
  					 int noblock, int *err);
  extern unsigned int    datagram_poll(struct file *file, struct socket *sock,
  				     struct poll_table_struct *wait);
  extern int	       skb_copy_datagram_iovec(const struct sk_buff *from,
  					       int offset, struct iovec *to,
  					       int size);
fb286bb29   Herbert Xu   [NET]: Detect har...
1746
  extern int	       skb_copy_and_csum_datagram_iovec(struct sk_buff *skb,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1747
1748
  							int hlen,
  							struct iovec *iov);
db543c1f9   Rusty Russell   net: skb_copy_dat...
1749
1750
  extern int	       skb_copy_datagram_from_iovec(struct sk_buff *skb,
  						    int offset,
6f26c9a75   Michael S. Tsirkin   tun: fix tun_chr_...
1751
1752
  						    const struct iovec *from,
  						    int from_offset,
db543c1f9   Rusty Russell   net: skb_copy_dat...
1753
  						    int len);
0a1ec07a6   Michael S. Tsirkin   net: skb_copy_dat...
1754
1755
1756
1757
1758
  extern int	       skb_copy_datagram_const_iovec(const struct sk_buff *from,
  						     int offset,
  						     const struct iovec *to,
  						     int to_offset,
  						     int size);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1759
  extern void	       skb_free_datagram(struct sock *sk, struct sk_buff *skb);
9d410c796   Eric Dumazet   net: fix sk_forwa...
1760
1761
  extern void	       skb_free_datagram_locked(struct sock *sk,
  						struct sk_buff *skb);
27ab25686   Herbert Xu   [UDP]: Avoid repe...
1762
  extern int	       skb_kill_datagram(struct sock *sk, struct sk_buff *skb,
3305b80c2   Herbert Xu   [IP]: Simplify an...
1763
  					 unsigned int flags);
2bbbc8689   Al Viro   [NET]: Annotate s...
1764
1765
  extern __wsum	       skb_checksum(const struct sk_buff *skb, int offset,
  				    int len, __wsum csum);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1766
1767
  extern int	       skb_copy_bits(const struct sk_buff *skb, int offset,
  				     void *to, int len);
0c6fcc8a8   Stephen Hemminger   [NET] skbuff: skb...
1768
1769
  extern int	       skb_store_bits(struct sk_buff *skb, int offset,
  				      const void *from, int len);
81d776627   Al Viro   [NET]: Annotate s...
1770
  extern __wsum	       skb_copy_and_csum_bits(const struct sk_buff *skb,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1771
  					      int offset, u8 *to, int len,
81d776627   Al Viro   [NET]: Annotate s...
1772
  					      __wsum csum);
9c55e01c0   Jens Axboe   [TCP]: Splice rec...
1773
1774
1775
1776
1777
  extern int             skb_splice_bits(struct sk_buff *skb,
  						unsigned int offset,
  						struct pipe_inode_info *pipe,
  						unsigned int len,
  						unsigned int flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1778
1779
1780
  extern void	       skb_copy_and_csum_dev(const struct sk_buff *skb, u8 *to);
  extern void	       skb_split(struct sk_buff *skb,
  				 struct sk_buff *skb1, const u32 len);
832d11c5c   Ilpo Järvinen   tcp: Try to resto...
1781
1782
  extern int	       skb_shift(struct sk_buff *tgt, struct sk_buff *skb,
  				 int shiftlen);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1783

576a30eb6   Herbert Xu   [NET]: Added GSO ...
1784
  extern struct sk_buff *skb_segment(struct sk_buff *skb, int features);
20380731b   Arnaldo Carvalho de Melo   [NET]: Fix sparse...
1785

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1786
1787
1788
1789
  static inline void *skb_header_pointer(const struct sk_buff *skb, int offset,
  				       int len, void *buffer)
  {
  	int hlen = skb_headlen(skb);
55820ee2f   Patrick McHardy   [NET]: Fix signed...
1790
  	if (hlen - offset >= len)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1791
1792
1793
1794
1795
1796
1797
  		return skb->data + offset;
  
  	if (skb_copy_bits(skb, offset, buffer, len) < 0)
  		return NULL;
  
  	return buffer;
  }
d626f62b1   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
  static inline void skb_copy_from_linear_data(const struct sk_buff *skb,
  					     void *to,
  					     const unsigned int len)
  {
  	memcpy(to, skb->data, len);
  }
  
  static inline void skb_copy_from_linear_data_offset(const struct sk_buff *skb,
  						    const int offset, void *to,
  						    const unsigned int len)
  {
  	memcpy(to, skb->data + offset, len);
  }
27d7ff46a   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
  static inline void skb_copy_to_linear_data(struct sk_buff *skb,
  					   const void *from,
  					   const unsigned int len)
  {
  	memcpy(skb->data, from, len);
  }
  
  static inline void skb_copy_to_linear_data_offset(struct sk_buff *skb,
  						  const int offset,
  						  const void *from,
  						  const unsigned int len)
  {
  	memcpy(skb->data + offset, from, len);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1825
  extern void skb_init(void);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1826

ac45f602e   Patrick Ohly   net: infrastructu...
1827
1828
1829
1830
  static inline ktime_t skb_get_ktime(const struct sk_buff *skb)
  {
  	return skb->tstamp;
  }
a61bbcf28   Patrick McHardy   [NET]: Store skb-...
1831
1832
1833
1834
1835
1836
1837
1838
1839
  /**
   *	skb_get_timestamp - get timestamp from a skb
   *	@skb: skb to get stamp from
   *	@stamp: pointer to struct timeval to store stamp in
   *
   *	Timestamps are stored in the skb as offsets to a base timestamp.
   *	This function converts the offset back to a struct timeval and stores
   *	it in stamp.
   */
ac45f602e   Patrick Ohly   net: infrastructu...
1840
1841
  static inline void skb_get_timestamp(const struct sk_buff *skb,
  				     struct timeval *stamp)
a61bbcf28   Patrick McHardy   [NET]: Store skb-...
1842
  {
b7aa0bf70   Eric Dumazet   [NET]: convert ne...
1843
  	*stamp = ktime_to_timeval(skb->tstamp);
a61bbcf28   Patrick McHardy   [NET]: Store skb-...
1844
  }
ac45f602e   Patrick Ohly   net: infrastructu...
1845
1846
1847
1848
1849
  static inline void skb_get_timestampns(const struct sk_buff *skb,
  				       struct timespec *stamp)
  {
  	*stamp = ktime_to_timespec(skb->tstamp);
  }
b7aa0bf70   Eric Dumazet   [NET]: convert ne...
1850
  static inline void __net_timestamp(struct sk_buff *skb)
a61bbcf28   Patrick McHardy   [NET]: Store skb-...
1851
  {
b7aa0bf70   Eric Dumazet   [NET]: convert ne...
1852
  	skb->tstamp = ktime_get_real();
a61bbcf28   Patrick McHardy   [NET]: Store skb-...
1853
  }
164891aad   Stephen Hemminger   [TCP]: Congestion...
1854
1855
1856
1857
  static inline ktime_t net_timedelta(ktime_t t)
  {
  	return ktime_sub(ktime_get_real(), t);
  }
b9ce204f0   Ilpo Järvinen   [TCP]: Congestion...
1858
1859
1860
1861
  static inline ktime_t net_invalid_timestamp(void)
  {
  	return ktime_set(0, 0);
  }
a61bbcf28   Patrick McHardy   [NET]: Store skb-...
1862

c1f19b51d   Richard Cochran   net: support time...
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
  extern void skb_timestamping_init(void);
  
  #ifdef CONFIG_NETWORK_PHY_TIMESTAMPING
  
  extern void skb_clone_tx_timestamp(struct sk_buff *skb);
  extern bool skb_defer_rx_timestamp(struct sk_buff *skb);
  
  #else /* CONFIG_NETWORK_PHY_TIMESTAMPING */
  
  static inline void skb_clone_tx_timestamp(struct sk_buff *skb)
  {
  }
  
  static inline bool skb_defer_rx_timestamp(struct sk_buff *skb)
  {
  	return false;
  }
  
  #endif /* !CONFIG_NETWORK_PHY_TIMESTAMPING */
  
  /**
   * skb_complete_tx_timestamp() - deliver cloned skb with tx timestamps
   *
   * @skb: clone of the the original outgoing packet
   * @hwtstamps: hardware time stamps
   *
   */
  void skb_complete_tx_timestamp(struct sk_buff *skb,
  			       struct skb_shared_hwtstamps *hwtstamps);
ac45f602e   Patrick Ohly   net: infrastructu...
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
  /**
   * skb_tstamp_tx - queue clone of skb with send time stamps
   * @orig_skb:	the original outgoing packet
   * @hwtstamps:	hardware time stamps, may be NULL if not available
   *
   * If the skb has a socket associated, then this function clones the
   * skb (thus sharing the actual data and optional structures), stores
   * the optional hardware time stamping information (if non NULL) or
   * generates a software time stamp (otherwise), then queues the clone
   * to the error queue of the socket.  Errors are silently ignored.
   */
  extern void skb_tstamp_tx(struct sk_buff *orig_skb,
  			struct skb_shared_hwtstamps *hwtstamps);
4507a7150   Richard Cochran   net: add driver h...
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
  static inline void sw_tx_timestamp(struct sk_buff *skb)
  {
  	union skb_shared_tx *shtx = skb_tx(skb);
  	if (shtx->software && !shtx->in_progress)
  		skb_tstamp_tx(skb, NULL);
  }
  
  /**
   * skb_tx_timestamp() - Driver hook for transmit timestamping
   *
   * Ethernet MAC Drivers should call this function in their hard_xmit()
   * function as soon as possible after giving the sk_buff to the MAC
   * hardware, but before freeing the sk_buff.
   *
   * @skb: A socket buffer.
   */
  static inline void skb_tx_timestamp(struct sk_buff *skb)
  {
c1f19b51d   Richard Cochran   net: support time...
1923
  	skb_clone_tx_timestamp(skb);
4507a7150   Richard Cochran   net: add driver h...
1924
1925
  	sw_tx_timestamp(skb);
  }
759e5d006   Herbert Xu   [UDP]: Clean up U...
1926
  extern __sum16 __skb_checksum_complete_head(struct sk_buff *skb, int len);
b51655b95   Al Viro   [NET]: Annotate _...
1927
  extern __sum16 __skb_checksum_complete(struct sk_buff *skb);
fb286bb29   Herbert Xu   [NET]: Detect har...
1928

604763722   Herbert Xu   [NET]: Treat CHEC...
1929
1930
1931
1932
  static inline int skb_csum_unnecessary(const struct sk_buff *skb)
  {
  	return skb->ip_summed & CHECKSUM_UNNECESSARY;
  }
fb286bb29   Herbert Xu   [NET]: Detect har...
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
  /**
   *	skb_checksum_complete - Calculate checksum of an entire packet
   *	@skb: packet to process
   *
   *	This function calculates the checksum over the entire packet plus
   *	the value of skb->csum.  The latter can be used to supply the
   *	checksum of a pseudo header as used by TCP/UDP.  It returns the
   *	checksum.
   *
   *	For protocols that contain complete checksums such as ICMP/TCP/UDP,
   *	this function can be used to verify that checksum on received
   *	packets.  In that case the function should return zero if the
   *	checksum is correct.  In particular, this function will return zero
   *	if skb->ip_summed is CHECKSUM_UNNECESSARY which indicates that the
   *	hardware has already verified the correctness of the checksum.
   */
4381ca3c2   Al Viro   fix return type o...
1949
  static inline __sum16 skb_checksum_complete(struct sk_buff *skb)
fb286bb29   Herbert Xu   [NET]: Detect har...
1950
  {
604763722   Herbert Xu   [NET]: Treat CHEC...
1951
1952
  	return skb_csum_unnecessary(skb) ?
  	       0 : __skb_checksum_complete(skb);
fb286bb29   Herbert Xu   [NET]: Detect har...
1953
  }
5f79e0f91   Yasuyuki Kozakai   [NETFILTER]: nf_c...
1954
  #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
de6e05c49   Yasuyuki Kozakai   [NETFILTER]: nf_c...
1955
  extern void nf_conntrack_destroy(struct nf_conntrack *nfct);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1956
1957
1958
  static inline void nf_conntrack_put(struct nf_conntrack *nfct)
  {
  	if (nfct && atomic_dec_and_test(&nfct->use))
de6e05c49   Yasuyuki Kozakai   [NETFILTER]: nf_c...
1959
  		nf_conntrack_destroy(nfct);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1960
1961
1962
1963
1964
1965
  }
  static inline void nf_conntrack_get(struct nf_conntrack *nfct)
  {
  	if (nfct)
  		atomic_inc(&nfct->use);
  }
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
  static inline void nf_conntrack_get_reasm(struct sk_buff *skb)
  {
  	if (skb)
  		atomic_inc(&skb->users);
  }
  static inline void nf_conntrack_put_reasm(struct sk_buff *skb)
  {
  	if (skb)
  		kfree_skb(skb);
  }
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
  #ifdef CONFIG_BRIDGE_NETFILTER
  static inline void nf_bridge_put(struct nf_bridge_info *nf_bridge)
  {
  	if (nf_bridge && atomic_dec_and_test(&nf_bridge->use))
  		kfree(nf_bridge);
  }
  static inline void nf_bridge_get(struct nf_bridge_info *nf_bridge)
  {
  	if (nf_bridge)
  		atomic_inc(&nf_bridge->use);
  }
  #endif /* CONFIG_BRIDGE_NETFILTER */
a193a4abd   Patrick McHardy   [NETFILTER]: Fix ...
1989
1990
  static inline void nf_reset(struct sk_buff *skb)
  {
5f79e0f91   Yasuyuki Kozakai   [NETFILTER]: nf_c...
1991
  #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
a193a4abd   Patrick McHardy   [NETFILTER]: Fix ...
1992
1993
  	nf_conntrack_put(skb->nfct);
  	skb->nfct = NULL;
a193a4abd   Patrick McHardy   [NETFILTER]: Fix ...
1994
1995
1996
1997
1998
1999
2000
2001
  	nf_conntrack_put_reasm(skb->nfct_reasm);
  	skb->nfct_reasm = NULL;
  #endif
  #ifdef CONFIG_BRIDGE_NETFILTER
  	nf_bridge_put(skb->nf_bridge);
  	skb->nf_bridge = NULL;
  #endif
  }
edda553c3   Yasuyuki Kozakai   [NETFILTER]: nf_c...
2002
2003
2004
  /* Note: This doesn't put any conntrack and bridge info in dst. */
  static inline void __nf_copy(struct sk_buff *dst, const struct sk_buff *src)
  {
5f79e0f91   Yasuyuki Kozakai   [NETFILTER]: nf_c...
2005
  #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
edda553c3   Yasuyuki Kozakai   [NETFILTER]: nf_c...
2006
2007
2008
  	dst->nfct = src->nfct;
  	nf_conntrack_get(src->nfct);
  	dst->nfctinfo = src->nfctinfo;
edda553c3   Yasuyuki Kozakai   [NETFILTER]: nf_c...
2009
2010
2011
2012
2013
2014
2015
2016
  	dst->nfct_reasm = src->nfct_reasm;
  	nf_conntrack_get_reasm(src->nfct_reasm);
  #endif
  #ifdef CONFIG_BRIDGE_NETFILTER
  	dst->nf_bridge  = src->nf_bridge;
  	nf_bridge_get(src->nf_bridge);
  #endif
  }
e7ac05f34   Yasuyuki Kozakai   [NETFILTER]: nf_c...
2017
2018
  static inline void nf_copy(struct sk_buff *dst, const struct sk_buff *src)
  {
e7ac05f34   Yasuyuki Kozakai   [NETFILTER]: nf_c...
2019
  #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
5f79e0f91   Yasuyuki Kozakai   [NETFILTER]: nf_c...
2020
  	nf_conntrack_put(dst->nfct);
e7ac05f34   Yasuyuki Kozakai   [NETFILTER]: nf_c...
2021
2022
2023
2024
2025
2026
2027
  	nf_conntrack_put_reasm(dst->nfct_reasm);
  #endif
  #ifdef CONFIG_BRIDGE_NETFILTER
  	nf_bridge_put(dst->nf_bridge);
  #endif
  	__nf_copy(dst, src);
  }
984bc16cc   James Morris   [SECMARK]: Add se...
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
  #ifdef CONFIG_NETWORK_SECMARK
  static inline void skb_copy_secmark(struct sk_buff *to, const struct sk_buff *from)
  {
  	to->secmark = from->secmark;
  }
  
  static inline void skb_init_secmark(struct sk_buff *skb)
  {
  	skb->secmark = 0;
  }
  #else
  static inline void skb_copy_secmark(struct sk_buff *to, const struct sk_buff *from)
  { }
  
  static inline void skb_init_secmark(struct sk_buff *skb)
  { }
  #endif
f25f4e448   Peter P Waskiewicz Jr   [CORE] Stack chan...
2045
2046
  static inline void skb_set_queue_mapping(struct sk_buff *skb, u16 queue_mapping)
  {
f25f4e448   Peter P Waskiewicz Jr   [CORE] Stack chan...
2047
  	skb->queue_mapping = queue_mapping;
f25f4e448   Peter P Waskiewicz Jr   [CORE] Stack chan...
2048
  }
9247744e5   Stephen Hemminger   skb: expose and c...
2049
  static inline u16 skb_get_queue_mapping(const struct sk_buff *skb)
4e3ab47a5   Pavel Emelyanov   [NET]: Make and u...
2050
  {
4e3ab47a5   Pavel Emelyanov   [NET]: Make and u...
2051
  	return skb->queue_mapping;
4e3ab47a5   Pavel Emelyanov   [NET]: Make and u...
2052
  }
f25f4e448   Peter P Waskiewicz Jr   [CORE] Stack chan...
2053
2054
  static inline void skb_copy_queue_mapping(struct sk_buff *to, const struct sk_buff *from)
  {
f25f4e448   Peter P Waskiewicz Jr   [CORE] Stack chan...
2055
  	to->queue_mapping = from->queue_mapping;
f25f4e448   Peter P Waskiewicz Jr   [CORE] Stack chan...
2056
  }
d5a9e24af   David S. Miller   net: Allow RX que...
2057
2058
2059
2060
  static inline void skb_record_rx_queue(struct sk_buff *skb, u16 rx_queue)
  {
  	skb->queue_mapping = rx_queue + 1;
  }
9247744e5   Stephen Hemminger   skb: expose and c...
2061
  static inline u16 skb_get_rx_queue(const struct sk_buff *skb)
d5a9e24af   David S. Miller   net: Allow RX que...
2062
2063
2064
  {
  	return skb->queue_mapping - 1;
  }
9247744e5   Stephen Hemminger   skb: expose and c...
2065
  static inline bool skb_rx_queue_recorded(const struct sk_buff *skb)
d5a9e24af   David S. Miller   net: Allow RX que...
2066
2067
2068
  {
  	return (skb->queue_mapping != 0);
  }
9247744e5   Stephen Hemminger   skb: expose and c...
2069
2070
  extern u16 skb_tx_hash(const struct net_device *dev,
  		       const struct sk_buff *skb);
def8b4faf   Alexey Dobriyan   net: reduce struc...
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
  #ifdef CONFIG_XFRM
  static inline struct sec_path *skb_sec_path(struct sk_buff *skb)
  {
  	return skb->sp;
  }
  #else
  static inline struct sec_path *skb_sec_path(struct sk_buff *skb)
  {
  	return NULL;
  }
  #endif
89114afd4   Herbert Xu   [NET] gso: Add sk...
2082
2083
2084
2085
  static inline int skb_is_gso(const struct sk_buff *skb)
  {
  	return skb_shinfo(skb)->gso_size;
  }
eabd7e35c   Brice Goglin   Add skb_is_gso_v6
2086
2087
2088
2089
  static inline int skb_is_gso_v6(const struct sk_buff *skb)
  {
  	return skb_shinfo(skb)->gso_type & SKB_GSO_TCPV6;
  }
4497b0763   Ben Hutchings   net: Discard and ...
2090
2091
2092
2093
2094
2095
2096
  extern void __skb_warn_lro_forwarding(const struct sk_buff *skb);
  
  static inline bool skb_warn_if_lro(const struct sk_buff *skb)
  {
  	/* LRO sets gso_size but not gso_type, whereas if GSO is really
  	 * wanted then gso_type will be set. */
  	struct skb_shared_info *shinfo = skb_shinfo(skb);
b78462ebc   Alexander Duyck   skbuff: add check...
2097
2098
  	if (skb_is_nonlinear(skb) && shinfo->gso_size != 0 &&
  	    unlikely(shinfo->gso_type == 0)) {
4497b0763   Ben Hutchings   net: Discard and ...
2099
2100
2101
2102
2103
  		__skb_warn_lro_forwarding(skb);
  		return true;
  	}
  	return false;
  }
35fc92a9d   Herbert Xu   [NET]: Allow forw...
2104
2105
2106
2107
2108
2109
  static inline void skb_forward_csum(struct sk_buff *skb)
  {
  	/* Unfortunately we don't support this one.  Any brave souls? */
  	if (skb->ip_summed == CHECKSUM_COMPLETE)
  		skb->ip_summed = CHECKSUM_NONE;
  }
f35d9d8aa   Rusty Russell   virtio: Implement...
2110
  bool skb_partial_csum_set(struct sk_buff *skb, u16 start, u16 off);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2111
2112
  #endif	/* __KERNEL__ */
  #endif	/* _LINUX_SKBUFF_H */