diff options
Diffstat (limited to 'include/linux/skbuff.h')
-rw-r--r-- | include/linux/skbuff.h | 64 |
1 files changed, 50 insertions, 14 deletions
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index 5fd389162f01..fa51293f2708 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h | |||
@@ -189,20 +189,23 @@ struct skb_shared_info { | |||
189 | atomic_t dataref; | 189 | atomic_t dataref; |
190 | unsigned short nr_frags; | 190 | unsigned short nr_frags; |
191 | unsigned short gso_size; | 191 | unsigned short gso_size; |
192 | #ifdef CONFIG_HAS_DMA | ||
193 | dma_addr_t dma_head; | ||
194 | #endif | ||
192 | /* Warning: this field is not always filled in (UFO)! */ | 195 | /* Warning: this field is not always filled in (UFO)! */ |
193 | unsigned short gso_segs; | 196 | unsigned short gso_segs; |
194 | unsigned short gso_type; | 197 | unsigned short gso_type; |
195 | __be32 ip6_frag_id; | 198 | __be32 ip6_frag_id; |
196 | union skb_shared_tx tx_flags; | 199 | 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; | 200 | struct sk_buff *frag_list; |
201 | struct skb_shared_hwtstamps hwtstamps; | 201 | struct skb_shared_hwtstamps hwtstamps; |
202 | skb_frag_t frags[MAX_SKB_FRAGS]; | 202 | skb_frag_t frags[MAX_SKB_FRAGS]; |
203 | #ifdef CONFIG_HAS_DMA | 203 | #ifdef CONFIG_HAS_DMA |
204 | dma_addr_t dma_maps[MAX_SKB_FRAGS + 1]; | 204 | dma_addr_t dma_maps[MAX_SKB_FRAGS]; |
205 | #endif | 205 | #endif |
206 | /* Intermediate layers must ensure that destructor_arg | ||
207 | * remains valid until skb destructor */ | ||
208 | void * destructor_arg; | ||
206 | }; | 209 | }; |
207 | 210 | ||
208 | /* We divide dataref into two halves. The higher 16 bits hold references | 211 | /* We divide dataref into two halves. The higher 16 bits hold references |
@@ -301,9 +304,6 @@ typedef unsigned char *sk_buff_data_t; | |||
301 | * @tc_verd: traffic control verdict | 304 | * @tc_verd: traffic control verdict |
302 | * @ndisc_nodetype: router type (from link layer) | 305 | * @ndisc_nodetype: router type (from link layer) |
303 | * @do_not_encrypt: set to prevent encryption of this frame | 306 | * @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 | 307 | * @dma_cookie: a cookie to one of several possible DMA operations |
308 | * done by skb DMA functions | 308 | * done by skb DMA functions |
309 | * @secmark: security marking | 309 | * @secmark: security marking |
@@ -319,10 +319,7 @@ struct sk_buff { | |||
319 | ktime_t tstamp; | 319 | ktime_t tstamp; |
320 | struct net_device *dev; | 320 | struct net_device *dev; |
321 | 321 | ||
322 | union { | 322 | unsigned long _skb_dst; |
323 | struct dst_entry *dst; | ||
324 | struct rtable *rtable; | ||
325 | }; | ||
326 | #ifdef CONFIG_XFRM | 323 | #ifdef CONFIG_XFRM |
327 | struct sec_path *sp; | 324 | struct sec_path *sp; |
328 | #endif | 325 | #endif |
@@ -380,7 +377,6 @@ struct sk_buff { | |||
380 | #endif | 377 | #endif |
381 | #if defined(CONFIG_MAC80211) || defined(CONFIG_MAC80211_MODULE) | 378 | #if defined(CONFIG_MAC80211) || defined(CONFIG_MAC80211_MODULE) |
382 | __u8 do_not_encrypt:1; | 379 | __u8 do_not_encrypt:1; |
383 | __u8 requeue:1; | ||
384 | #endif | 380 | #endif |
385 | /* 0/13/14 bit hole */ | 381 | /* 0/13/14 bit hole */ |
386 | 382 | ||
@@ -423,6 +419,21 @@ extern void skb_dma_unmap(struct device *dev, struct sk_buff *skb, | |||
423 | enum dma_data_direction dir); | 419 | enum dma_data_direction dir); |
424 | #endif | 420 | #endif |
425 | 421 | ||
422 | static inline struct dst_entry *skb_dst(const struct sk_buff *skb) | ||
423 | { | ||
424 | return (struct dst_entry *)skb->_skb_dst; | ||
425 | } | ||
426 | |||
427 | static inline void skb_dst_set(struct sk_buff *skb, struct dst_entry *dst) | ||
428 | { | ||
429 | skb->_skb_dst = (unsigned long)dst; | ||
430 | } | ||
431 | |||
432 | static inline struct rtable *skb_rtable(const struct sk_buff *skb) | ||
433 | { | ||
434 | return (struct rtable *)skb_dst(skb); | ||
435 | } | ||
436 | |||
426 | extern void kfree_skb(struct sk_buff *skb); | 437 | extern void kfree_skb(struct sk_buff *skb); |
427 | extern void consume_skb(struct sk_buff *skb); | 438 | extern void consume_skb(struct sk_buff *skb); |
428 | extern void __kfree_skb(struct sk_buff *skb); | 439 | extern void __kfree_skb(struct sk_buff *skb); |
@@ -1062,7 +1073,7 @@ extern void skb_add_rx_frag(struct sk_buff *skb, int i, struct page *page, | |||
1062 | int off, int size); | 1073 | int off, int size); |
1063 | 1074 | ||
1064 | #define SKB_PAGE_ASSERT(skb) BUG_ON(skb_shinfo(skb)->nr_frags) | 1075 | #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) | 1076 | #define SKB_FRAG_ASSERT(skb) BUG_ON(skb_has_frags(skb)) |
1066 | #define SKB_LINEAR_ASSERT(skb) BUG_ON(skb_is_nonlinear(skb)) | 1077 | #define SKB_LINEAR_ASSERT(skb) BUG_ON(skb_is_nonlinear(skb)) |
1067 | 1078 | ||
1068 | #ifdef NET_SKBUFF_DATA_USES_OFFSET | 1079 | #ifdef NET_SKBUFF_DATA_USES_OFFSET |
@@ -1701,6 +1712,25 @@ static inline int pskb_trim_rcsum(struct sk_buff *skb, unsigned int len) | |||
1701 | skb = skb->prev) | 1712 | skb = skb->prev) |
1702 | 1713 | ||
1703 | 1714 | ||
1715 | static inline bool skb_has_frags(const struct sk_buff *skb) | ||
1716 | { | ||
1717 | return skb_shinfo(skb)->frag_list != NULL; | ||
1718 | } | ||
1719 | |||
1720 | static inline void skb_frag_list_init(struct sk_buff *skb) | ||
1721 | { | ||
1722 | skb_shinfo(skb)->frag_list = NULL; | ||
1723 | } | ||
1724 | |||
1725 | static inline void skb_frag_add_head(struct sk_buff *skb, struct sk_buff *frag) | ||
1726 | { | ||
1727 | frag->next = skb_shinfo(skb)->frag_list; | ||
1728 | skb_shinfo(skb)->frag_list = frag; | ||
1729 | } | ||
1730 | |||
1731 | #define skb_walk_frags(skb, iter) \ | ||
1732 | for (iter = skb_shinfo(skb)->frag_list; iter; iter = iter->next) | ||
1733 | |||
1704 | extern struct sk_buff *__skb_recv_datagram(struct sock *sk, unsigned flags, | 1734 | extern struct sk_buff *__skb_recv_datagram(struct sock *sk, unsigned flags, |
1705 | int *peeked, int *err); | 1735 | int *peeked, int *err); |
1706 | extern struct sk_buff *skb_recv_datagram(struct sock *sk, unsigned flags, | 1736 | extern struct sk_buff *skb_recv_datagram(struct sock *sk, unsigned flags, |
@@ -1715,8 +1745,14 @@ extern int skb_copy_and_csum_datagram_iovec(struct sk_buff *skb, | |||
1715 | struct iovec *iov); | 1745 | struct iovec *iov); |
1716 | extern int skb_copy_datagram_from_iovec(struct sk_buff *skb, | 1746 | extern int skb_copy_datagram_from_iovec(struct sk_buff *skb, |
1717 | int offset, | 1747 | int offset, |
1718 | struct iovec *from, | 1748 | const struct iovec *from, |
1749 | int from_offset, | ||
1719 | int len); | 1750 | int len); |
1751 | extern int skb_copy_datagram_const_iovec(const struct sk_buff *from, | ||
1752 | int offset, | ||
1753 | const struct iovec *to, | ||
1754 | int to_offset, | ||
1755 | int size); | ||
1720 | extern void skb_free_datagram(struct sock *sk, struct sk_buff *skb); | 1756 | 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, | 1757 | extern int skb_kill_datagram(struct sock *sk, struct sk_buff *skb, |
1722 | unsigned int flags); | 1758 | unsigned int flags); |