Blame view

include/linux/skbuff.h 61.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;
cb4dfe562   Eric Dumazet   net: skb_frag_t c...
129
  #if (BITS_PER_LONG > 32) || (PAGE_SIZE >= 65536)
a309bb072   David S. Miller   [NET]: Page offse...
130
131
  	__u32 page_offset;
  	__u32 size;
cb4dfe562   Eric Dumazet   net: skb_frag_t c...
132
133
134
135
  #else
  	__u16 page_offset;
  	__u16 size;
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
136
  };
ac45f602e   Patrick Ohly   net: infrastructu...
137
138
139
  #define HAVE_HW_TIME_STAMP
  
  /**
d3a21be86   Randy Dunlap   skbuff.h: fix tim...
140
   * struct skb_shared_hwtstamps - hardware time stamps
ac45f602e   Patrick Ohly   net: infrastructu...
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
   * @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;
  };
2244d07bf   Oliver Hartkopp   net: simplify fla...
166
167
168
169
170
171
172
173
174
175
176
177
178
  /* Definitions for tx_flags in struct skb_shared_info */
  enum {
  	/* generate hardware time stamp */
  	SKBTX_HW_TSTAMP = 1 << 0,
  
  	/* generate software time stamp */
  	SKBTX_SW_TSTAMP = 1 << 1,
  
  	/* device driver is going to provide hardware time stamp */
  	SKBTX_IN_PROGRESS = 1 << 2,
  
  	/* ensure the originating sk reference is available on driver level */
  	SKBTX_DRV_NEEDS_SK_REF = 1 << 3,
ac45f602e   Patrick Ohly   net: infrastructu...
179
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
180
181
182
183
  /* 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 _...
184
  	unsigned short	nr_frags;
7967168ce   Herbert Xu   [NET]: Merge TSO/...
185
186
187
188
  	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...
189
  	__be32          ip6_frag_id;
2244d07bf   Oliver Hartkopp   net: simplify fla...
190
  	__u8		tx_flags;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
191
  	struct sk_buff	*frag_list;
ac45f602e   Patrick Ohly   net: infrastructu...
192
  	struct skb_shared_hwtstamps hwtstamps;
ec7d2f2cf   Eric Dumazet   net: __alloc_skb(...
193
194
195
196
197
  
  	/*
  	 * Warning : all fields before dataref are cleared in __alloc_skb()
  	 */
  	atomic_t	dataref;
69e3c75f4   Johann Baudy   net: TX_RING and ...
198
199
200
  	/* Intermediate layers must ensure that destructor_arg
  	 * remains valid until skb destructor */
  	void *		destructor_arg;
fed66381d   Eric Dumazet   net: pskb_expand_...
201
202
  	/* must be last field, see pskb_expand_head() */
  	skb_frag_t	frags[MAX_SKB_FRAGS];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
203
204
205
206
  };
  
  /* 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...
207
208
   * 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
209
210
211
212
213
214
215
216
217
   *
   * 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 ...
218
219
220
221
222
223
  
  enum {
  	SKB_FCLONE_UNAVAILABLE,
  	SKB_FCLONE_ORIG,
  	SKB_FCLONE_CLONE,
  };
7967168ce   Herbert Xu   [NET]: Merge TSO/...
224
225
  enum {
  	SKB_GSO_TCPV4 = 1 << 0,
f83ef8c0b   Herbert Xu   [IPV6]: Added GSO...
226
  	SKB_GSO_UDP = 1 << 1,
576a30eb6   Herbert Xu   [NET]: Added GSO ...
227
228
229
  
  	/* This indicates the skb is from an untrusted source. */
  	SKB_GSO_DODGY = 1 << 2,
b0da85370   Michael Chan   [NET]: Add ECN su...
230
231
  
  	/* This indicates the tcp segment has CWR set. */
f83ef8c0b   Herbert Xu   [IPV6]: Added GSO...
232
233
234
  	SKB_GSO_TCP_ECN = 1 << 3,
  
  	SKB_GSO_TCPV6 = 1 << 4,
01d5b2fca   Chris Leech   [SCSI] net: defin...
235
236
  
  	SKB_GSO_FCOE = 1 << 5,
7967168ce   Herbert Xu   [NET]: Merge TSO/...
237
  };
2e07fa9cd   Arnaldo Carvalho de Melo   [SK_BUFF]: Use of...
238
239
240
241
242
243
244
245
246
  #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
2fc72c7b8   KOVACS Krisztian   netfilter: fix co...
247
248
249
250
  #if defined(CONFIG_NF_DEFRAG_IPV4) || defined(CONFIG_NF_DEFRAG_IPV4_MODULE) || \
      defined(CONFIG_NF_DEFRAG_IPV6) || defined(CONFIG_NF_DEFRAG_IPV6_MODULE)
  #define NET_SKBUFF_NF_DEFRAG_NEEDED 1
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
251
252
253
254
  /** 
   *	struct sk_buff - socket buffer
   *	@next: Next buffer in list
   *	@prev: Previous buffer in list
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
255
   *	@sk: Socket we are owned by
325ed8239   Herbert Xu   [NET]: Fix packet...
256
   *	@tstamp: Time we arrived
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
257
   *	@dev: Device we arrived on/are leaving by
be52178b9   Randy Dunlap   [NET] skbuff: fix...
258
   *	@transport_header: Transport layer header
b0e380b1d   Arnaldo Carvalho de Melo   [SK_BUFF]: unions...
259
260
   *	@network_header: Network layer header
   *	@mac_header: Link layer header
7fee226ad   Eric Dumazet   net: add a noref ...
261
   *	@_skb_refdst: destination entry (with norefcount bit)
67be2dd1b   Martin Waitz   [PATCH] DocBook: ...
262
   *	@sp: the security path, used for xfrm
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
263
264
265
266
   *	@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...
267
   *	@hdr_len: writable header length of cloned skb
663ead3bb   Herbert Xu   [NET]: Use csum_s...
268
269
270
   *	@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: ...
271
   *	@local_df: allow local fragmentation
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
272
273
274
   *	@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-...
275
   *	@fclone: skbuff clone status
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
276
277
278
279
   *	@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
280
281
282
283
284
285
   *	@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...
286
   *	@mark: Generic packet mark
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
287
   *	@nfct: Associated connection, if any
c83c24861   Randy Dunlap   [SK_BUFF] kernel-...
288
   *	@ipvs_property: skbuff is owned by ipvs
317293634   Randy Dunlap   net: fix kernel-d...
289
290
   *	@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...
291
   *	@nf_trace: netfilter packet trace flag
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
292
   *	@nfctinfo: Relationship of this skb to the connection
461ddf3b9   Randy Dunlap   [NET]: kernel-doc...
293
   *	@nfct_reasm: netfilter conntrack re-assembly pointer
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
294
   *	@nf_bridge: Saved data about a bridged frame - see br_netfilter.c
8964be4a9   Eric Dumazet   net: rename skb->...
295
   *	@skb_iif: ifindex of device we arrived on
0a9627f26   Tom Herbert   rps: Receive Pack...
296
   *	@rxhash: the packet hash computed on receive
f25f4e448   Peter P Waskiewicz Jr   [CORE] Stack chan...
297
   *	@queue_mapping: Queue mapping for multiqueue devices
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
298
299
   *	@tc_index: Traffic control index
   *	@tc_verd: traffic control verdict
553a56726   Randy Dunlap   skbuff: fix missi...
300
   *	@ndisc_nodetype: router type (from link layer)
f4b8ea784   Randy Dunlap   [NET]: fix net-co...
301
302
   *	@dma_cookie: a cookie to one of several possible DMA operations
   *		done by skb DMA functions
984bc16cc   James Morris   [SECMARK]: Add se...
303
   *	@secmark: security marking
6aa895b04   Patrick McHardy   vlan: Don't store...
304
   *	@vlan_tci: vlan tag control information
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
305
306
307
308
309
310
   */
  
  struct sk_buff {
  	/* These two members must be first. */
  	struct sk_buff		*next;
  	struct sk_buff		*prev;
b7aa0bf70   Eric Dumazet   [NET]: convert ne...
311
  	ktime_t			tstamp;
da3f5cf1f   Felix Fietkau   skbuff: align sk_...
312
313
  
  	struct sock		*sk;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
314
  	struct net_device	*dev;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
315

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
316
317
318
319
320
321
  	/*
  	 * 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_...
322
  	char			cb[48] __aligned(8);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
323

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

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

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

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

6aa895b04   Patrick McHardy   vlan: Don't store...
397
  	__u16			vlan_tci;
27a884dc3   Arnaldo Carvalho de Melo   [SK_BUFF]: Conver...
398
399
400
  	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
401
  	/* These elements must be at the end, see alloc_skb() for details.  */
27a884dc3   Arnaldo Carvalho de Melo   [SK_BUFF]: Conver...
402
  	sk_buff_data_t		tail;
4305b5413   Arnaldo Carvalho de Melo   [SK_BUFF]: Conver...
403
  	sk_buff_data_t		end;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
404
  	unsigned char		*head,
4305b5413   Arnaldo Carvalho de Melo   [SK_BUFF]: Conver...
405
  				*data;
27a884dc3   Arnaldo Carvalho de Melo   [SK_BUFF]: Conver...
406
407
  	unsigned int		truesize;
  	atomic_t		users;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
408
409
410
411
412
413
414
415
416
  };
  
  #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 ...
417
418
419
420
421
422
423
424
425
426
427
428
429
  /*
   * 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...
430
431
  static inline struct dst_entry *skb_dst(const struct sk_buff *skb)
  {
7fee226ad   Eric Dumazet   net: add a noref ...
432
433
434
435
436
437
438
  	/* 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...
439
  }
7fee226ad   Eric Dumazet   net: add a noref ...
440
441
442
443
444
445
446
447
  /**
   * 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...
448
449
  static inline void skb_dst_set(struct sk_buff *skb, struct dst_entry *dst)
  {
7fee226ad   Eric Dumazet   net: add a noref ...
450
451
  	skb->_skb_refdst = (unsigned long)dst;
  }
27b75c95f   Eric Dumazet   net: avoid RCU fo...
452
  extern void skb_dst_set_noref(struct sk_buff *skb, struct dst_entry *dst);
7fee226ad   Eric Dumazet   net: add a noref ...
453
454
455
456
457
458
459
460
  
  /**
   * 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...
461
  }
511c3f92a   Eric Dumazet   net: skb->rtable ...
462
463
  static inline struct rtable *skb_rtable(const struct sk_buff *skb)
  {
adf30907d   Eric Dumazet   net: skb->dst acc...
464
  	return (struct rtable *)skb_dst(skb);
511c3f92a   Eric Dumazet   net: skb->rtable ...
465
  }
231d06ae8   Jörn Engel   [NET]: Uninline k...
466
  extern void kfree_skb(struct sk_buff *skb);
ead2ceb0e   Neil Horman   Network Drop Moni...
467
  extern void consume_skb(struct sk_buff *skb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
468
  extern void	       __kfree_skb(struct sk_buff *skb);
d179cd129   David S. Miller   [NET]: Implement ...
469
  extern struct sk_buff *__alloc_skb(unsigned int size,
b30973f87   Christoph Hellwig   [PATCH] node-awar...
470
  				   gfp_t priority, int fclone, int node);
d179cd129   David S. Miller   [NET]: Implement ...
471
  static inline struct sk_buff *alloc_skb(unsigned int size,
dd0fc66fb   Al Viro   [PATCH] gfp flags...
472
  					gfp_t priority)
d179cd129   David S. Miller   [NET]: Implement ...
473
  {
564824b0c   Eric Dumazet   net: allocate skb...
474
  	return __alloc_skb(size, priority, 0, NUMA_NO_NODE);
d179cd129   David S. Miller   [NET]: Implement ...
475
476
477
  }
  
  static inline struct sk_buff *alloc_skb_fclone(unsigned int size,
dd0fc66fb   Al Viro   [PATCH] gfp flags...
478
  					       gfp_t priority)
d179cd129   David S. Miller   [NET]: Implement ...
479
  {
564824b0c   Eric Dumazet   net: allocate skb...
480
  	return __alloc_skb(size, priority, 1, NUMA_NO_NODE);
d179cd129   David S. Miller   [NET]: Implement ...
481
  }
5b0daa347   Changli Gao   skb: make skb_rec...
482
  extern bool skb_recycle_check(struct sk_buff *skb, int skb_size);
04a4bb55b   Lennert Buytenhek   net: add skb_recy...
483

e0053ec07   Herbert Xu   [SKBUFF]: Add skb...
484
  extern struct sk_buff *skb_morph(struct sk_buff *dst, struct sk_buff *src);
86a76caf8   Victor Fusco   [NET]: Fix sparse...
485
  extern struct sk_buff *skb_clone(struct sk_buff *skb,
dd0fc66fb   Al Viro   [PATCH] gfp flags...
486
  				 gfp_t priority);
86a76caf8   Victor Fusco   [NET]: Fix sparse...
487
  extern struct sk_buff *skb_copy(const struct sk_buff *skb,
dd0fc66fb   Al Viro   [PATCH] gfp flags...
488
  				gfp_t priority);
86a76caf8   Victor Fusco   [NET]: Fix sparse...
489
  extern struct sk_buff *pskb_copy(struct sk_buff *skb,
dd0fc66fb   Al Viro   [PATCH] gfp flags...
490
  				 gfp_t gfp_mask);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
491
  extern int	       pskb_expand_head(struct sk_buff *skb,
86a76caf8   Victor Fusco   [NET]: Fix sparse...
492
  					int nhead, int ntail,
dd0fc66fb   Al Viro   [PATCH] gfp flags...
493
  					gfp_t gfp_mask);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
494
495
496
497
  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...
498
  				       gfp_t priority);
716ea3a7a   David Howells   [NET]: Move gener...
499
500
501
502
503
  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...
504
  extern int	       skb_pad(struct sk_buff *skb, int pad);
ead2ceb0e   Neil Horman   Network Drop Moni...
505
  #define dev_kfree_skb(a)	consume_skb(a)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
506

e89e9cf53   Ananda Raju   [IPv4/IPv6]: UFO ...
507
508
509
510
  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...
511
  struct skb_seq_state {
677e90eda   Thomas Graf   [NET]: Zerocopy s...
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
  	__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...
527
528
529
  extern unsigned int   skb_find_text(struct sk_buff *skb, unsigned int from,
  				    unsigned int to, struct ts_config *config,
  				    struct ts_state *state);
bfb564e73   Krishna Kumar   core: Factor out ...
530
531
532
533
534
535
536
537
  extern __u32 __skb_get_rxhash(struct sk_buff *skb);
  static inline __u32 skb_get_rxhash(struct sk_buff *skb)
  {
  	if (!skb->rxhash)
  		skb->rxhash = __skb_get_rxhash(skb);
  
  	return skb->rxhash;
  }
4305b5413   Arnaldo Carvalho de Melo   [SK_BUFF]: Conver...
538
539
540
541
542
543
544
545
546
547
548
  #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
549
  /* Internal */
4305b5413   Arnaldo Carvalho de Melo   [SK_BUFF]: Conver...
550
  #define skb_shinfo(SKB)	((struct skb_shared_info *)(skb_end_pointer(SKB)))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
551

ac45f602e   Patrick Ohly   net: infrastructu...
552
553
554
555
  static inline struct skb_shared_hwtstamps *skb_hwtstamps(struct sk_buff *skb)
  {
  	return &skb_shinfo(skb)->hwtstamps;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
556
557
558
559
560
561
562
563
564
565
566
567
  /**
   *	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...
568
569
570
571
572
573
574
575
576
   *	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)
  {
a02cec215   Eric Dumazet   net: return opera...
577
  	return skb->next == (struct sk_buff *)list;
fc7ebb212   David S. Miller   net: Add skb_queu...
578
579
580
  }
  
  /**
832d11c5c   Ilpo Järvinen   tcp: Try to resto...
581
582
583
584
585
586
587
588
589
   *	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)
  {
a02cec215   Eric Dumazet   net: return opera...
590
  	return skb->prev == (struct sk_buff *)list;
832d11c5c   Ilpo Järvinen   tcp: Try to resto...
591
592
593
  }
  
  /**
249c8b42c   David S. Miller   net: Add skb_queu...
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
   *	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...
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
   *	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
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
   *	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
648
649
650
651
652
653
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
   *	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...
720
  static inline struct sk_buff *skb_share_check(struct sk_buff *skb,
dd0fc66fb   Al Viro   [PATCH] gfp flags...
721
  					      gfp_t pri)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
  {
  	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...
752
  static inline struct sk_buff *skb_unshare(struct sk_buff *skb,
dd0fc66fb   Al Viro   [PATCH] gfp flags...
753
  					  gfp_t pri)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
754
755
756
757
758
759
760
761
762
763
764
  {
  	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...
765
   *	skb_peek - peek at the head of an &sk_buff_head
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
   *	@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...
786
   *	skb_peek_tail - peek at the tail of an &sk_buff_head
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
   *	@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...
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
  /**
   *	__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...
831
832
833
834
835
836
837
838
  /*
   * 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
839
840
841
  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...
842
  	__skb_queue_head_init(list);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
843
  }
c2ecba717   Pavel Emelianov   [NET]: Set a sepa...
844
845
846
847
848
849
  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
850
  /*
bf2992758   Gerrit Renker   [SKB]: __skb_queu...
851
   *	Insert an sk_buff on a list.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
852
853
854
855
   *
   *	The "__skb_xxxx()" functions are the non-atomic ones that
   *	can only be called with interrupts disabled.
   */
bf2992758   Gerrit Renker   [SKB]: __skb_queu...
856
857
858
859
860
861
862
863
864
865
  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
866

67fed4593   David S. Miller   net: Add new inte...
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
  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...
891
  		head->qlen += list->qlen;
67fed4593   David S. Miller   net: Add new inte...
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
  	}
  }
  
  /**
   *	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...
907
  		head->qlen += list->qlen;
67fed4593   David S. Miller   net: Add new inte...
908
909
910
911
912
913
914
915
916
917
918
919
920
921
  		__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...
922
  		head->qlen += list->qlen;
67fed4593   David S. Miller   net: Add new inte...
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
  	}
  }
  
  /**
   *	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...
939
  		head->qlen += list->qlen;
67fed4593   David S. Miller   net: Add new inte...
940
941
942
  		__skb_queue_head_init(list);
  	}
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
943
  /**
300ce174e   Stephen Hemminger   [NETEM]: Support ...
944
   *	__skb_queue_after - queue a buffer at the list head
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
945
   *	@list: list to use
300ce174e   Stephen Hemminger   [NETEM]: Support ...
946
   *	@prev: place after this buffer
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
947
948
   *	@newsk: buffer to queue
   *
300ce174e   Stephen Hemminger   [NETEM]: Support ...
949
   *	Queue a buffer int the middle of a list. This function takes no locks
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
950
951
952
953
   *	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 ...
954
955
956
  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
957
  {
bf2992758   Gerrit Renker   [SKB]: __skb_queu...
958
  	__skb_insert(newsk, prev, prev->next, list);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
959
  }
7de6c0333   Gerrit Renker   [SKB]: __skb_appe...
960
961
  extern void skb_append(struct sk_buff *old, struct sk_buff *newsk,
  		       struct sk_buff_head *list);
f5572855e   Gerrit Renker   [SKB]: __skb_queu...
962
963
964
965
966
967
  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
968
  /**
300ce174e   Stephen Hemminger   [NETEM]: Support ...
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
   *	__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
986
987
988
989
990
991
992
993
994
995
996
997
998
   *	__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...
999
  	__skb_queue_before(list, (struct sk_buff *)list, newsk);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1000
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1001
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1002
1003
1004
   * remove sk_buff from list. _Must_ be called atomically, and with
   * the list known..
   */
8728b834b   David S. Miller   [NET]: Kill skb->...
1005
  extern void	   skb_unlink(struct sk_buff *skb, struct sk_buff_head *list);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1006
1007
1008
1009
1010
1011
1012
1013
  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
1014
1015
1016
  	next->prev = prev;
  	prev->next = next;
  }
f525c06d1   Gerrit Renker   [SKB]: __skb_dequ...
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
  /**
   *	__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
1033
1034
1035
1036
1037
1038
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
  
  /**
   *	__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...
1081
1082
  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
1083
  #define SKB_PAGE_ASSERT(skb) 	BUG_ON(skb_shinfo(skb)->nr_frags)
21dc33015   David S. Miller   net: Rename skb_h...
1084
  #define SKB_FRAG_ASSERT(skb) 	BUG_ON(skb_has_frag_list(skb))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1085
  #define SKB_LINEAR_ASSERT(skb)  BUG_ON(skb_is_nonlinear(skb))
27a884dc3   Arnaldo Carvalho de Melo   [SK_BUFF]: Conver...
1086
1087
1088
1089
1090
1091
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
  #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...
1117

27a884dc3   Arnaldo Carvalho de Melo   [SK_BUFF]: Conver...
1118
  #endif /* NET_SKBUFF_DATA_USES_OFFSET */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1119
1120
1121
  /*
   *	Add data to an sk_buff
   */
0dde3e164   Ilpo Järvinen   [NET]: uninline s...
1122
  extern unsigned char *skb_put(struct sk_buff *skb, unsigned int len);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1123
1124
  static inline unsigned char *__skb_put(struct sk_buff *skb, unsigned int len)
  {
27a884dc3   Arnaldo Carvalho de Melo   [SK_BUFF]: Conver...
1125
  	unsigned char *tmp = skb_tail_pointer(skb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1126
1127
1128
1129
1130
  	SKB_LINEAR_ASSERT(skb);
  	skb->tail += len;
  	skb->len  += len;
  	return tmp;
  }
c2aa270ad   Ilpo Järvinen   [NET]: uninline s...
1131
  extern unsigned char *skb_push(struct sk_buff *skb, unsigned int len);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1132
1133
1134
1135
1136
1137
  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...
1138
  extern unsigned char *skb_pull(struct sk_buff *skb, unsigned int len);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1139
1140
1141
1142
1143
1144
  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...
1145
1146
1147
1148
  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
1149
1150
1151
1152
1153
  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...
1154
  	    !__pskb_pull_tail(skb, len - skb_headlen(skb)))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
  		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...
1171
  	return __pskb_pull_tail(skb, len - skb_headlen(skb)) != NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1172
1173
1174
1175
1176
1177
1178
1179
  }
  
  /**
   *	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 ...
1180
  static inline unsigned int skb_headroom(const struct sk_buff *skb)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
  {
  	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...
1193
  	return skb_is_nonlinear(skb) ? 0 : skb->end - skb->tail;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
  }
  
  /**
   *	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...
1204
  static inline void skb_reserve(struct sk_buff *skb, int len)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1205
1206
1207
1208
  {
  	skb->data += len;
  	skb->tail += len;
  }
2e07fa9cd   Arnaldo Carvalho de Melo   [SK_BUFF]: Use of...
1209
  #ifdef NET_SKBUFF_DATA_USES_OFFSET
9c70220b7   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
1210
1211
  static inline unsigned char *skb_transport_header(const struct sk_buff *skb)
  {
2e07fa9cd   Arnaldo Carvalho de Melo   [SK_BUFF]: Use of...
1212
  	return skb->head + skb->transport_header;
9c70220b7   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
1213
  }
badff6d01   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
1214
1215
  static inline void skb_reset_transport_header(struct sk_buff *skb)
  {
2e07fa9cd   Arnaldo Carvalho de Melo   [SK_BUFF]: Use of...
1216
  	skb->transport_header = skb->data - skb->head;
badff6d01   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
1217
  }
967b05f64   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
1218
1219
1220
  static inline void skb_set_transport_header(struct sk_buff *skb,
  					    const int offset)
  {
2e07fa9cd   Arnaldo Carvalho de Melo   [SK_BUFF]: Use of...
1221
1222
  	skb_reset_transport_header(skb);
  	skb->transport_header += offset;
ea2ae17d6   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
1223
  }
d56f90a7c   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
1224
1225
  static inline unsigned char *skb_network_header(const struct sk_buff *skb)
  {
2e07fa9cd   Arnaldo Carvalho de Melo   [SK_BUFF]: Use of...
1226
  	return skb->head + skb->network_header;
d56f90a7c   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
1227
  }
c1d2bbe1c   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
1228
1229
  static inline void skb_reset_network_header(struct sk_buff *skb)
  {
2e07fa9cd   Arnaldo Carvalho de Melo   [SK_BUFF]: Use of...
1230
  	skb->network_header = skb->data - skb->head;
c1d2bbe1c   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
1231
  }
c14d2450c   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
1232
1233
  static inline void skb_set_network_header(struct sk_buff *skb, const int offset)
  {
2e07fa9cd   Arnaldo Carvalho de Melo   [SK_BUFF]: Use of...
1234
1235
  	skb_reset_network_header(skb);
  	skb->network_header += offset;
c14d2450c   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
1236
  }
2e07fa9cd   Arnaldo Carvalho de Melo   [SK_BUFF]: Use of...
1237
  static inline unsigned char *skb_mac_header(const struct sk_buff *skb)
bbe735e42   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
1238
  {
2e07fa9cd   Arnaldo Carvalho de Melo   [SK_BUFF]: Use of...
1239
  	return skb->head + skb->mac_header;
bbe735e42   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
1240
  }
2e07fa9cd   Arnaldo Carvalho de Melo   [SK_BUFF]: Use of...
1241
  static inline int skb_mac_header_was_set(const struct sk_buff *skb)
cfe1fc775   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
1242
  {
2e07fa9cd   Arnaldo Carvalho de Melo   [SK_BUFF]: Use of...
1243
1244
1245
1246
1247
1248
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
  	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...
1288
  }
98e399f82   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
1289
1290
  static inline unsigned char *skb_mac_header(const struct sk_buff *skb)
  {
b0e380b1d   Arnaldo Carvalho de Melo   [SK_BUFF]: unions...
1291
  	return skb->mac_header;
98e399f82   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
1292
1293
1294
1295
  }
  
  static inline int skb_mac_header_was_set(const struct sk_buff *skb)
  {
b0e380b1d   Arnaldo Carvalho de Melo   [SK_BUFF]: unions...
1296
  	return skb->mac_header != NULL;
98e399f82   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
1297
  }
459a98ed8   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
1298
1299
  static inline void skb_reset_mac_header(struct sk_buff *skb)
  {
b0e380b1d   Arnaldo Carvalho de Melo   [SK_BUFF]: unions...
1300
  	skb->mac_header = skb->data;
459a98ed8   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
1301
  }
48d49d0cc   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
1302
1303
  static inline void skb_set_mac_header(struct sk_buff *skb, const int offset)
  {
b0e380b1d   Arnaldo Carvalho de Melo   [SK_BUFF]: unions...
1304
  	skb->mac_header = skb->data + offset;
48d49d0cc   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
1305
  }
2e07fa9cd   Arnaldo Carvalho de Melo   [SK_BUFF]: Use of...
1306
  #endif /* NET_SKBUFF_DATA_USES_OFFSET */
04fb451ef   Michał Mirosław   net: Introduce sk...
1307
1308
1309
1310
  static inline int skb_checksum_start_offset(const struct sk_buff *skb)
  {
  	return skb->csum_start - skb_headroom(skb);
  }
2e07fa9cd   Arnaldo Carvalho de Melo   [SK_BUFF]: Use of...
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
  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...
1325

f9599ce11   Changli Gao   sk_buff: introduc...
1326
1327
1328
1329
  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
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
  /*
   * 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...
1341
   * skb_reserve(skb, NET_IP_ALIGN);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1342
1343
1344
1345
   *
   * 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...
1346
   *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1347
1348
1349
1350
1351
1352
   * 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 ...
1353
1354
1355
1356
  /*
   * 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...
1357
   * 32 bytes or less we avoid the reallocation.
025be81e8   Anton Blanchard   [NET]: Allow skb ...
1358
1359
1360
1361
1362
1363
1364
   *
   * 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...
1365
   * Various parts of the networking layer expect at least 32 bytes of
025be81e8   Anton Blanchard   [NET]: Allow skb ...
1366
   * headroom, you should not reduce this.
5933dd2f0   Eric Dumazet   net: NET_SKB_PAD ...
1367
1368
1369
1370
   *
   * 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...
1371
   * NET_IP_ALIGN(2) + ethernet_header(14) + IP_header(20/40) + ports(8)
025be81e8   Anton Blanchard   [NET]: Allow skb ...
1372
1373
   */
  #ifndef NET_SKB_PAD
5933dd2f0   Eric Dumazet   net: NET_SKB_PAD ...
1374
  #define NET_SKB_PAD	max(32, L1_CACHE_BYTES)
025be81e8   Anton Blanchard   [NET]: Allow skb ...
1375
  #endif
3cc0e8739   Herbert Xu   [NET]: Warn in __...
1376
  extern int ___pskb_trim(struct sk_buff *skb, unsigned int len);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1377
1378
1379
  
  static inline void __skb_trim(struct sk_buff *skb, unsigned int len)
  {
3cc0e8739   Herbert Xu   [NET]: Warn in __...
1380
1381
1382
1383
  	if (unlikely(skb->data_len)) {
  		WARN_ON(1);
  		return;
  	}
27a884dc3   Arnaldo Carvalho de Melo   [SK_BUFF]: Conver...
1384
1385
  	skb->len = len;
  	skb_set_tail_pointer(skb, len);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1386
  }
419ae74ec   Ilpo Järvinen   [NET]: uninline s...
1387
  extern void skb_trim(struct sk_buff *skb, unsigned int len);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1388
1389
1390
  
  static inline int __pskb_trim(struct sk_buff *skb, unsigned int len)
  {
3cc0e8739   Herbert Xu   [NET]: Warn in __...
1391
1392
1393
1394
  	if (skb->data_len)
  		return ___pskb_trim(skb, len);
  	__skb_trim(skb, len);
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1395
1396
1397
1398
1399
1400
1401
1402
  }
  
  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_...
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
   *	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
1418
1419
1420
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
   *	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...
1450
   *	__dev_alloc_skb - allocate an skbuff for receiving
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1451
1452
1453
1454
1455
1456
1457
1458
   *	@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_...
1459
   *	%NULL is returned if there is no free memory.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1460
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1461
  static inline struct sk_buff *__dev_alloc_skb(unsigned int length,
dd0fc66fb   Al Viro   [PATCH] gfp flags...
1462
  					      gfp_t gfp_mask)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1463
  {
025be81e8   Anton Blanchard   [NET]: Allow skb ...
1464
  	struct sk_buff *skb = alloc_skb(length + NET_SKB_PAD, gfp_mask);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1465
  	if (likely(skb))
025be81e8   Anton Blanchard   [NET]: Allow skb ...
1466
  		skb_reserve(skb, NET_SKB_PAD);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1467
1468
  	return skb;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1469

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

8af274564   Christoph Hellwig   [NET]: Add netdev...
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
  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...
1493
1494
1495
1496
1497
1498
1499
1500
1501
  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;
  }
564824b0c   Eric Dumazet   net: allocate skb...
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
  /**
   *	__netdev_alloc_page - allocate a page for ps-rx on a specific device
   *	@dev: network device to receive on
   *	@gfp_mask: alloc_pages_node mask
   *
   * 	Allocate a new page. dev currently unused.
   *
   * 	%NULL is returned if there is no free memory.
   */
  static inline struct page *__netdev_alloc_page(struct net_device *dev, gfp_t gfp_mask)
  {
  	return alloc_pages_node(NUMA_NO_NODE, gfp_mask, 0);
  }
654bed16c   Peter Zijlstra   net: packet split...
1515
1516
1517
1518
1519
  
  /**
   *	netdev_alloc_page - allocate a page for ps-rx on a specific device
   *	@dev: network device to receive on
   *
564824b0c   Eric Dumazet   net: allocate skb...
1520
   * 	Allocate a new page. dev currently unused.
654bed16c   Peter Zijlstra   net: packet split...
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
   *
   * 	%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
1533
  /**
334a8132d   Patrick McHardy   [SKBUFF]: Keep tr...
1534
1535
1536
1537
1538
1539
1540
   *	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 ...
1541
  static inline int skb_clone_writable(struct sk_buff *skb, unsigned int len)
334a8132d   Patrick McHardy   [SKBUFF]: Keep tr...
1542
1543
1544
1545
  {
  	return !skb_header_cloned(skb) &&
  	       skb_headroom(skb) + len <= skb->hdr_len;
  }
d9cc20484   Herbert Xu   [NET] skbuff: Add...
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
  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...
1561
  /**
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
   *	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...
1575
1576
  	return __skb_cow(skb, headroom, skb_cloned(skb));
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1577

d9cc20484   Herbert Xu   [NET] skbuff: Add...
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
  /**
   *	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
1591
1592
1593
1594
1595
1596
1597
1598
1599
  }
  
  /**
   *	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...
1600
1601
   *	is untouched. Otherwise it is extended. Returns zero on
   *	success. The skb is freed on error.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1602
1603
   */
   
5b057c6b1   Herbert Xu   [NET]: Avoid allo...
1604
  static inline int skb_padto(struct sk_buff *skb, unsigned int len)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1605
1606
1607
  {
  	unsigned int size = skb->len;
  	if (likely(size >= len))
5b057c6b1   Herbert Xu   [NET]: Avoid allo...
1608
  		return 0;
987c402ac   Gerrit Renker   skbuff: Code read...
1609
  	return skb_pad(skb, len - size);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1610
1611
1612
1613
1614
1615
1616
1617
1618
  }
  
  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...
1619
  		__wsum csum = csum_and_copy_from_user(from, skb_put(skb, copy),
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
  							    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...
1643
1644
1645
1646
  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
1647
1648
1649
  /**
   *	skb_linearize - convert paged skb to linear one
   *	@skb: buffer to linarize
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1650
1651
1652
1653
   *
   *	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...
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
  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
1667
  {
364c6badd   Herbert Xu   [NET]: Clean up s...
1668
1669
  	return skb_is_nonlinear(skb) || skb_cloned(skb) ?
  	       __skb_linearize(skb) : 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1670
1671
1672
1673
1674
1675
1676
1677
1678
  }
  
  /**
   *	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...
1679
1680
   *	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
1681
1682
1683
   */
  
  static inline void skb_postpull_rcsum(struct sk_buff *skb,
cbb042f9e   Herbert Xu   [NET]: Replace sk...
1684
  				      const void *start, unsigned int len)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1685
  {
84fa7933a   Patrick McHardy   [NET]: Replace CH...
1686
  	if (skb->ip_summed == CHECKSUM_COMPLETE)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1687
1688
  		skb->csum = csum_sub(skb->csum, csum_partial(start, len, 0));
  }
cbb042f9e   Herbert Xu   [NET]: Replace sk...
1689
  unsigned char *skb_pull_rcsum(struct sk_buff *skb, unsigned int len);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
  /**
   *	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...
1701
  	if (likely(len >= skb->len))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1702
  		return 0;
84fa7933a   Patrick McHardy   [NET]: Replace CH...
1703
  	if (skb->ip_summed == CHECKSUM_COMPLETE)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1704
1705
1706
  		skb->ip_summed = CHECKSUM_NONE;
  	return __pskb_trim(skb, len);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1707
1708
1709
1710
  #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 ...
1711
1712
1713
1714
  #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...
1715
1716
1717
1718
1719
1720
1721
1722
  #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 ...
1723
1724
1725
1726
  #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
1727

21dc33015   David S. Miller   net: Rename skb_h...
1728
  static inline bool skb_has_frag_list(const struct sk_buff *skb)
ee0398717   David S. Miller   skbuff: Add frag ...
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
  {
  	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...
1746
1747
  extern struct sk_buff *__skb_recv_datagram(struct sock *sk, unsigned flags,
  					   int *peeked, int *err);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1748
1749
1750
1751
1752
1753
1754
  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...
1755
  extern int	       skb_copy_and_csum_datagram_iovec(struct sk_buff *skb,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1756
1757
  							int hlen,
  							struct iovec *iov);
db543c1f9   Rusty Russell   net: skb_copy_dat...
1758
1759
  extern int	       skb_copy_datagram_from_iovec(struct sk_buff *skb,
  						    int offset,
6f26c9a75   Michael S. Tsirkin   tun: fix tun_chr_...
1760
1761
  						    const struct iovec *from,
  						    int from_offset,
db543c1f9   Rusty Russell   net: skb_copy_dat...
1762
  						    int len);
0a1ec07a6   Michael S. Tsirkin   net: skb_copy_dat...
1763
1764
1765
1766
1767
  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
1768
  extern void	       skb_free_datagram(struct sock *sk, struct sk_buff *skb);
9d410c796   Eric Dumazet   net: fix sk_forwa...
1769
1770
  extern void	       skb_free_datagram_locked(struct sock *sk,
  						struct sk_buff *skb);
27ab25686   Herbert Xu   [UDP]: Avoid repe...
1771
  extern int	       skb_kill_datagram(struct sock *sk, struct sk_buff *skb,
3305b80c2   Herbert Xu   [IP]: Simplify an...
1772
  					 unsigned int flags);
2bbbc8689   Al Viro   [NET]: Annotate s...
1773
1774
  extern __wsum	       skb_checksum(const struct sk_buff *skb, int offset,
  				    int len, __wsum csum);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1775
1776
  extern int	       skb_copy_bits(const struct sk_buff *skb, int offset,
  				     void *to, int len);
0c6fcc8a8   Stephen Hemminger   [NET] skbuff: skb...
1777
1778
  extern int	       skb_store_bits(struct sk_buff *skb, int offset,
  				      const void *from, int len);
81d776627   Al Viro   [NET]: Annotate s...
1779
  extern __wsum	       skb_copy_and_csum_bits(const struct sk_buff *skb,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1780
  					      int offset, u8 *to, int len,
81d776627   Al Viro   [NET]: Annotate s...
1781
  					      __wsum csum);
9c55e01c0   Jens Axboe   [TCP]: Splice rec...
1782
1783
1784
1785
1786
  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
1787
1788
1789
  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...
1790
1791
  extern int	       skb_shift(struct sk_buff *tgt, struct sk_buff *skb,
  				 int shiftlen);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1792

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

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1795
1796
1797
1798
  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...
1799
  	if (hlen - offset >= len)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1800
1801
1802
1803
1804
1805
1806
  		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...
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
  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...
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
  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
1834
  extern void skb_init(void);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1835

ac45f602e   Patrick Ohly   net: infrastructu...
1836
1837
1838
1839
  static inline ktime_t skb_get_ktime(const struct sk_buff *skb)
  {
  	return skb->tstamp;
  }
a61bbcf28   Patrick McHardy   [NET]: Store skb-...
1840
1841
1842
1843
1844
1845
1846
1847
1848
  /**
   *	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...
1849
1850
  static inline void skb_get_timestamp(const struct sk_buff *skb,
  				     struct timeval *stamp)
a61bbcf28   Patrick McHardy   [NET]: Store skb-...
1851
  {
b7aa0bf70   Eric Dumazet   [NET]: convert ne...
1852
  	*stamp = ktime_to_timeval(skb->tstamp);
a61bbcf28   Patrick McHardy   [NET]: Store skb-...
1853
  }
ac45f602e   Patrick Ohly   net: infrastructu...
1854
1855
1856
1857
1858
  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...
1859
  static inline void __net_timestamp(struct sk_buff *skb)
a61bbcf28   Patrick McHardy   [NET]: Store skb-...
1860
  {
b7aa0bf70   Eric Dumazet   [NET]: convert ne...
1861
  	skb->tstamp = ktime_get_real();
a61bbcf28   Patrick McHardy   [NET]: Store skb-...
1862
  }
164891aad   Stephen Hemminger   [TCP]: Congestion...
1863
1864
1865
1866
  static inline ktime_t net_timedelta(ktime_t t)
  {
  	return ktime_sub(ktime_get_real(), t);
  }
b9ce204f0   Ilpo Järvinen   [TCP]: Congestion...
1867
1868
1869
1870
  static inline ktime_t net_invalid_timestamp(void)
  {
  	return ktime_set(0, 0);
  }
a61bbcf28   Patrick McHardy   [NET]: Store skb-...
1871

c1f19b51d   Richard Cochran   net: support time...
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
  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...
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
  /**
   * 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...
1914
1915
  static inline void sw_tx_timestamp(struct sk_buff *skb)
  {
2244d07bf   Oliver Hartkopp   net: simplify fla...
1916
1917
  	if (skb_shinfo(skb)->tx_flags & SKBTX_SW_TSTAMP &&
  	    !(skb_shinfo(skb)->tx_flags & SKBTX_IN_PROGRESS))
4507a7150   Richard Cochran   net: add driver h...
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
  		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...
1932
  	skb_clone_tx_timestamp(skb);
4507a7150   Richard Cochran   net: add driver h...
1933
1934
  	sw_tx_timestamp(skb);
  }
759e5d006   Herbert Xu   [UDP]: Clean up U...
1935
  extern __sum16 __skb_checksum_complete_head(struct sk_buff *skb, int len);
b51655b95   Al Viro   [NET]: Annotate _...
1936
  extern __sum16 __skb_checksum_complete(struct sk_buff *skb);
fb286bb29   Herbert Xu   [NET]: Detect har...
1937

604763722   Herbert Xu   [NET]: Treat CHEC...
1938
1939
1940
1941
  static inline int skb_csum_unnecessary(const struct sk_buff *skb)
  {
  	return skb->ip_summed & CHECKSUM_UNNECESSARY;
  }
fb286bb29   Herbert Xu   [NET]: Detect har...
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
  /**
   *	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...
1958
  static inline __sum16 skb_checksum_complete(struct sk_buff *skb)
fb286bb29   Herbert Xu   [NET]: Detect har...
1959
  {
604763722   Herbert Xu   [NET]: Treat CHEC...
1960
1961
  	return skb_csum_unnecessary(skb) ?
  	       0 : __skb_checksum_complete(skb);
fb286bb29   Herbert Xu   [NET]: Detect har...
1962
  }
5f79e0f91   Yasuyuki Kozakai   [NETFILTER]: nf_c...
1963
  #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
de6e05c49   Yasuyuki Kozakai   [NETFILTER]: nf_c...
1964
  extern void nf_conntrack_destroy(struct nf_conntrack *nfct);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1965
1966
1967
  static inline void nf_conntrack_put(struct nf_conntrack *nfct)
  {
  	if (nfct && atomic_dec_and_test(&nfct->use))
de6e05c49   Yasuyuki Kozakai   [NETFILTER]: nf_c...
1968
  		nf_conntrack_destroy(nfct);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1969
1970
1971
1972
1973
1974
  }
  static inline void nf_conntrack_get(struct nf_conntrack *nfct)
  {
  	if (nfct)
  		atomic_inc(&nfct->use);
  }
2fc72c7b8   KOVACS Krisztian   netfilter: fix co...
1975
1976
  #endif
  #ifdef NET_SKBUFF_NF_DEFRAG_NEEDED
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
  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
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
  #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 ...
2000
2001
  static inline void nf_reset(struct sk_buff *skb)
  {
5f79e0f91   Yasuyuki Kozakai   [NETFILTER]: nf_c...
2002
  #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
a193a4abd   Patrick McHardy   [NETFILTER]: Fix ...
2003
2004
  	nf_conntrack_put(skb->nfct);
  	skb->nfct = NULL;
2fc72c7b8   KOVACS Krisztian   netfilter: fix co...
2005
2006
  #endif
  #ifdef NET_SKBUFF_NF_DEFRAG_NEEDED
a193a4abd   Patrick McHardy   [NETFILTER]: Fix ...
2007
2008
2009
2010
2011
2012
2013
2014
  	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...
2015
2016
2017
  /* 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...
2018
  #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
edda553c3   Yasuyuki Kozakai   [NETFILTER]: nf_c...
2019
2020
2021
  	dst->nfct = src->nfct;
  	nf_conntrack_get(src->nfct);
  	dst->nfctinfo = src->nfctinfo;
2fc72c7b8   KOVACS Krisztian   netfilter: fix co...
2022
2023
  #endif
  #ifdef NET_SKBUFF_NF_DEFRAG_NEEDED
edda553c3   Yasuyuki Kozakai   [NETFILTER]: nf_c...
2024
2025
2026
2027
2028
2029
2030
2031
  	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...
2032
2033
  static inline void nf_copy(struct sk_buff *dst, const struct sk_buff *src)
  {
e7ac05f34   Yasuyuki Kozakai   [NETFILTER]: nf_c...
2034
  #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
5f79e0f91   Yasuyuki Kozakai   [NETFILTER]: nf_c...
2035
  	nf_conntrack_put(dst->nfct);
2fc72c7b8   KOVACS Krisztian   netfilter: fix co...
2036
2037
  #endif
  #ifdef NET_SKBUFF_NF_DEFRAG_NEEDED
e7ac05f34   Yasuyuki Kozakai   [NETFILTER]: nf_c...
2038
2039
2040
2041
2042
2043
2044
  	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...
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
  #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...
2062
2063
  static inline void skb_set_queue_mapping(struct sk_buff *skb, u16 queue_mapping)
  {
f25f4e448   Peter P Waskiewicz Jr   [CORE] Stack chan...
2064
  	skb->queue_mapping = queue_mapping;
f25f4e448   Peter P Waskiewicz Jr   [CORE] Stack chan...
2065
  }
9247744e5   Stephen Hemminger   skb: expose and c...
2066
  static inline u16 skb_get_queue_mapping(const struct sk_buff *skb)
4e3ab47a5   Pavel Emelyanov   [NET]: Make and u...
2067
  {
4e3ab47a5   Pavel Emelyanov   [NET]: Make and u...
2068
  	return skb->queue_mapping;
4e3ab47a5   Pavel Emelyanov   [NET]: Make and u...
2069
  }
f25f4e448   Peter P Waskiewicz Jr   [CORE] Stack chan...
2070
2071
  static inline void skb_copy_queue_mapping(struct sk_buff *to, const struct sk_buff *from)
  {
f25f4e448   Peter P Waskiewicz Jr   [CORE] Stack chan...
2072
  	to->queue_mapping = from->queue_mapping;
f25f4e448   Peter P Waskiewicz Jr   [CORE] Stack chan...
2073
  }
d5a9e24af   David S. Miller   net: Allow RX que...
2074
2075
2076
2077
  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...
2078
  static inline u16 skb_get_rx_queue(const struct sk_buff *skb)
d5a9e24af   David S. Miller   net: Allow RX que...
2079
2080
2081
  {
  	return skb->queue_mapping - 1;
  }
9247744e5   Stephen Hemminger   skb: expose and c...
2082
  static inline bool skb_rx_queue_recorded(const struct sk_buff *skb)
d5a9e24af   David S. Miller   net: Allow RX que...
2083
  {
a02cec215   Eric Dumazet   net: return opera...
2084
  	return skb->queue_mapping != 0;
d5a9e24af   David S. Miller   net: Allow RX que...
2085
  }
a3d22a68d   Vladislav Zolotarov   bnx2x: Take the d...
2086
2087
2088
  extern u16 __skb_tx_hash(const struct net_device *dev,
  			 const struct sk_buff *skb,
  			 unsigned int num_tx_queues);
9247744e5   Stephen Hemminger   skb: expose and c...
2089

def8b4faf   Alexey Dobriyan   net: reduce struc...
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
  #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...
2101
2102
2103
2104
  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
2105
2106
2107
2108
  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 ...
2109
2110
2111
2112
2113
2114
2115
  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...
2116
2117
  	if (skb_is_nonlinear(skb) && shinfo->gso_size != 0 &&
  	    unlikely(shinfo->gso_type == 0)) {
4497b0763   Ben Hutchings   net: Discard and ...
2118
2119
2120
2121
2122
  		__skb_warn_lro_forwarding(skb);
  		return true;
  	}
  	return false;
  }
35fc92a9d   Herbert Xu   [NET]: Allow forw...
2123
2124
2125
2126
2127
2128
  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;
  }
bc8acf2c8   Eric Dumazet   drivers/net: avoi...
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
  /**
   * skb_checksum_none_assert - make sure skb ip_summed is CHECKSUM_NONE
   * @skb: skb to check
   *
   * fresh skbs have their ip_summed set to CHECKSUM_NONE.
   * Instead of forcing ip_summed to CHECKSUM_NONE, we can
   * use this helper, to document places where we make this assertion.
   */
  static inline void skb_checksum_none_assert(struct sk_buff *skb)
  {
  #ifdef DEBUG
  	BUG_ON(skb->ip_summed != CHECKSUM_NONE);
  #endif
  }
f35d9d8aa   Rusty Russell   virtio: Implement...
2143
  bool skb_partial_csum_set(struct sk_buff *skb, u16 start, u16 off);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2144
2145
  #endif	/* __KERNEL__ */
  #endif	/* _LINUX_SKBUFF_H */