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); |
