diff options
Diffstat (limited to 'include/linux/skbuff.h')
-rw-r--r-- | include/linux/skbuff.h | 73 |
1 files changed, 58 insertions, 15 deletions
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index 5fd389162f01..b47b3f039d14 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h | |||
@@ -15,6 +15,7 @@ | |||
15 | #define _LINUX_SKBUFF_H | 15 | #define _LINUX_SKBUFF_H |
16 | 16 | ||
17 | #include <linux/kernel.h> | 17 | #include <linux/kernel.h> |
18 | #include <linux/kmemcheck.h> | ||
18 | #include <linux/compiler.h> | 19 | #include <linux/compiler.h> |
19 | #include <linux/time.h> | 20 | #include <linux/time.h> |
20 | #include <linux/cache.h> | 21 | #include <linux/cache.h> |
@@ -189,20 +190,23 @@ struct skb_shared_info { | |||
189 | atomic_t dataref; | 190 | atomic_t dataref; |
190 | unsigned short nr_frags; | 191 | unsigned short nr_frags; |
191 | unsigned short gso_size; | 192 | unsigned short gso_size; |
193 | #ifdef CONFIG_HAS_DMA | ||
194 | dma_addr_t dma_head; | ||
195 | #endif | ||
192 | /* Warning: this field is not always filled in (UFO)! */ | 196 | /* Warning: this field is not always filled in (UFO)! */ |
193 | unsigned short gso_segs; | 197 | unsigned short gso_segs; |
194 | unsigned short gso_type; | 198 | unsigned short gso_type; |
195 | __be32 ip6_frag_id; | 199 | __be32 ip6_frag_id; |
196 | union skb_shared_tx tx_flags; | 200 | union skb_shared_tx tx_flags; |
197 | #ifdef CONFIG_HAS_DMA | ||
198 | unsigned int num_dma_maps; | ||
199 | #endif | ||
200 | struct sk_buff *frag_list; | 201 | struct sk_buff *frag_list; |
201 | struct skb_shared_hwtstamps hwtstamps; | 202 | struct skb_shared_hwtstamps hwtstamps; |
202 | skb_frag_t frags[MAX_SKB_FRAGS]; | 203 | skb_frag_t frags[MAX_SKB_FRAGS]; |
203 | #ifdef CONFIG_HAS_DMA | 204 | #ifdef CONFIG_HAS_DMA |
204 | dma_addr_t dma_maps[MAX_SKB_FRAGS + 1]; | 205 | dma_addr_t dma_maps[MAX_SKB_FRAGS]; |
205 | #endif | 206 | #endif |
207 | /* Intermediate layers must ensure that destructor_arg | ||
208 | * remains valid until skb destructor */ | ||
209 | void * destructor_arg; | ||
206 | }; | 210 | }; |
207 | 211 | ||
208 | /* We divide dataref into two halves. The higher 16 bits hold references | 212 | /* We divide dataref into two halves. The higher 16 bits hold references |
@@ -261,7 +265,7 @@ typedef unsigned char *sk_buff_data_t; | |||
261 | * @transport_header: Transport layer header | 265 | * @transport_header: Transport layer header |
262 | * @network_header: Network layer header | 266 | * @network_header: Network layer header |
263 | * @mac_header: Link layer header | 267 | * @mac_header: Link layer header |
264 | * @dst: destination entry | 268 | * @_skb_dst: destination entry |
265 | * @sp: the security path, used for xfrm | 269 | * @sp: the security path, used for xfrm |
266 | * @cb: Control buffer. Free for use by every layer. Put private vars here | 270 | * @cb: Control buffer. Free for use by every layer. Put private vars here |
267 | * @len: Length of actual data | 271 | * @len: Length of actual data |
@@ -301,9 +305,6 @@ typedef unsigned char *sk_buff_data_t; | |||
301 | * @tc_verd: traffic control verdict | 305 | * @tc_verd: traffic control verdict |
302 | * @ndisc_nodetype: router type (from link layer) | 306 | * @ndisc_nodetype: router type (from link layer) |
303 | * @do_not_encrypt: set to prevent encryption of this frame | 307 | * @do_not_encrypt: set to prevent encryption of this frame |
304 | * @requeue: set to indicate that the wireless core should attempt | ||
305 | * a software retry on this frame if we failed to | ||
306 | * receive an ACK for it | ||
307 | * @dma_cookie: a cookie to one of several possible DMA operations | 308 | * @dma_cookie: a cookie to one of several possible DMA operations |
308 | * done by skb DMA functions | 309 | * done by skb DMA functions |
309 | * @secmark: security marking | 310 | * @secmark: security marking |
@@ -319,10 +320,7 @@ struct sk_buff { | |||
319 | ktime_t tstamp; | 320 | ktime_t tstamp; |
320 | struct net_device *dev; | 321 | struct net_device *dev; |
321 | 322 | ||
322 | union { | 323 | unsigned long _skb_dst; |
323 | struct dst_entry *dst; | ||
324 | struct rtable *rtable; | ||
325 | }; | ||
326 | #ifdef CONFIG_XFRM | 324 | #ifdef CONFIG_XFRM |
327 | struct sec_path *sp; | 325 | struct sec_path *sp; |
328 | #endif | 326 | #endif |
@@ -346,6 +344,7 @@ struct sk_buff { | |||
346 | }; | 344 | }; |
347 | }; | 345 | }; |
348 | __u32 priority; | 346 | __u32 priority; |
347 | kmemcheck_bitfield_begin(flags1); | ||
349 | __u8 local_df:1, | 348 | __u8 local_df:1, |
350 | cloned:1, | 349 | cloned:1, |
351 | ip_summed:2, | 350 | ip_summed:2, |
@@ -356,6 +355,7 @@ struct sk_buff { | |||
356 | ipvs_property:1, | 355 | ipvs_property:1, |
357 | peeked:1, | 356 | peeked:1, |
358 | nf_trace:1; | 357 | nf_trace:1; |
358 | kmemcheck_bitfield_end(flags1); | ||
359 | __be16 protocol; | 359 | __be16 protocol; |
360 | 360 | ||
361 | void (*destructor)(struct sk_buff *skb); | 361 | void (*destructor)(struct sk_buff *skb); |
@@ -375,13 +375,16 @@ struct sk_buff { | |||
375 | __u16 tc_verd; /* traffic control verdict */ | 375 | __u16 tc_verd; /* traffic control verdict */ |
376 | #endif | 376 | #endif |
377 | #endif | 377 | #endif |
378 | |||
379 | kmemcheck_bitfield_begin(flags2); | ||
378 | #ifdef CONFIG_IPV6_NDISC_NODETYPE | 380 | #ifdef CONFIG_IPV6_NDISC_NODETYPE |
379 | __u8 ndisc_nodetype:2; | 381 | __u8 ndisc_nodetype:2; |
380 | #endif | 382 | #endif |
381 | #if defined(CONFIG_MAC80211) || defined(CONFIG_MAC80211_MODULE) | 383 | #if defined(CONFIG_MAC80211) || defined(CONFIG_MAC80211_MODULE) |
382 | __u8 do_not_encrypt:1; | 384 | __u8 do_not_encrypt:1; |
383 | __u8 requeue:1; | ||
384 | #endif | 385 | #endif |
386 | kmemcheck_bitfield_end(flags2); | ||
387 | |||
385 | /* 0/13/14 bit hole */ | 388 | /* 0/13/14 bit hole */ |
386 | 389 | ||
387 | #ifdef CONFIG_NET_DMA | 390 | #ifdef CONFIG_NET_DMA |
@@ -423,6 +426,21 @@ extern void skb_dma_unmap(struct device *dev, struct sk_buff *skb, | |||
423 | enum dma_data_direction dir); | 426 | enum dma_data_direction dir); |
424 | #endif | 427 | #endif |
425 | 428 | ||
429 | static inline struct dst_entry *skb_dst(const struct sk_buff *skb) | ||
430 | { | ||
431 | return (struct dst_entry *)skb->_skb_dst; | ||
432 | } | ||
433 | |||
434 | static inline void skb_dst_set(struct sk_buff *skb, struct dst_entry *dst) | ||
435 | { | ||
436 | skb->_skb_dst = (unsigned long)dst; | ||
437 | } | ||
438 | |||
439 | static inline struct rtable *skb_rtable(const struct sk_buff *skb) | ||
440 | { | ||
441 | return (struct rtable *)skb_dst(skb); | ||
442 | } | ||
443 | |||
426 | extern void kfree_skb(struct sk_buff *skb); | 444 | extern void kfree_skb(struct sk_buff *skb); |
427 | extern void consume_skb(struct sk_buff *skb); | 445 | extern void consume_skb(struct sk_buff *skb); |
428 | extern void __kfree_skb(struct sk_buff *skb); | 446 | extern void __kfree_skb(struct sk_buff *skb); |
@@ -1062,7 +1080,7 @@ extern void skb_add_rx_frag(struct sk_buff *skb, int i, struct page *page, | |||
1062 | int off, int size); | 1080 | int off, int size); |
1063 | 1081 | ||
1064 | #define SKB_PAGE_ASSERT(skb) BUG_ON(skb_shinfo(skb)->nr_frags) | 1082 | #define SKB_PAGE_ASSERT(skb) BUG_ON(skb_shinfo(skb)->nr_frags) |
1065 | #define SKB_FRAG_ASSERT(skb) BUG_ON(skb_shinfo(skb)->frag_list) | 1083 | #define SKB_FRAG_ASSERT(skb) BUG_ON(skb_has_frags(skb)) |
1066 | #define SKB_LINEAR_ASSERT(skb) BUG_ON(skb_is_nonlinear(skb)) | 1084 | #define SKB_LINEAR_ASSERT(skb) BUG_ON(skb_is_nonlinear(skb)) |
1067 | 1085 | ||
1068 | #ifdef NET_SKBUFF_DATA_USES_OFFSET | 1086 | #ifdef NET_SKBUFF_DATA_USES_OFFSET |
@@ -1701,6 +1719,25 @@ static inline int pskb_trim_rcsum(struct sk_buff *skb, unsigned int len) | |||
1701 | skb = skb->prev) | 1719 | skb = skb->prev) |
1702 | 1720 | ||
1703 | 1721 | ||
1722 | static inline bool skb_has_frags(const struct sk_buff *skb) | ||
1723 | { | ||
1724 | return skb_shinfo(skb)->frag_list != NULL; | ||
1725 | } | ||
1726 | |||
1727 | static inline void skb_frag_list_init(struct sk_buff *skb) | ||
1728 | { | ||
1729 | skb_shinfo(skb)->frag_list = NULL; | ||
1730 | } | ||
1731 | |||
1732 | static inline void skb_frag_add_head(struct sk_buff *skb, struct sk_buff *frag) | ||
1733 | { | ||
1734 | frag->next = skb_shinfo(skb)->frag_list; | ||
1735 | skb_shinfo(skb)->frag_list = frag; | ||
1736 | } | ||
1737 | |||
1738 | #define skb_walk_frags(skb, iter) \ | ||
1739 | for (iter = skb_shinfo(skb)->frag_list; iter; iter = iter->next) | ||
1740 | |||
1704 | extern struct sk_buff *__skb_recv_datagram(struct sock *sk, unsigned flags, | 1741 | extern struct sk_buff *__skb_recv_datagram(struct sock *sk, unsigned flags, |
1705 | int *peeked, int *err); | 1742 | int *peeked, int *err); |
1706 | extern struct sk_buff *skb_recv_datagram(struct sock *sk, unsigned flags, | 1743 | extern struct sk_buff *skb_recv_datagram(struct sock *sk, unsigned flags, |
@@ -1715,8 +1752,14 @@ extern int skb_copy_and_csum_datagram_iovec(struct sk_buff *skb, | |||
1715 | struct iovec *iov); | 1752 | struct iovec *iov); |
1716 | extern int skb_copy_datagram_from_iovec(struct sk_buff *skb, | 1753 | extern int skb_copy_datagram_from_iovec(struct sk_buff *skb, |
1717 | int offset, | 1754 | int offset, |
1718 | struct iovec *from, | 1755 | const struct iovec *from, |
1756 | int from_offset, | ||
1719 | int len); | 1757 | int len); |
1758 | extern int skb_copy_datagram_const_iovec(const struct sk_buff *from, | ||
1759 | int offset, | ||
1760 | const struct iovec *to, | ||
1761 | int to_offset, | ||
1762 | int size); | ||
1720 | extern void skb_free_datagram(struct sock *sk, struct sk_buff *skb); | 1763 | extern void skb_free_datagram(struct sock *sk, struct sk_buff *skb); |
1721 | extern int skb_kill_datagram(struct sock *sk, struct sk_buff *skb, | 1764 | extern int skb_kill_datagram(struct sock *sk, struct sk_buff *skb, |
1722 | unsigned int flags); | 1765 | unsigned int flags); |