diff options
Diffstat (limited to 'include/linux/skbuff.h')
-rw-r--r-- | include/linux/skbuff.h | 186 |
1 files changed, 121 insertions, 65 deletions
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index 77eb60d2b496..c0a4f3ab0cc0 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h | |||
@@ -122,15 +122,26 @@ struct sk_buff_head { | |||
122 | 122 | ||
123 | struct sk_buff; | 123 | struct sk_buff; |
124 | 124 | ||
125 | /* To allow 64K frame to be packed as single skb without frag_list */ | 125 | /* To allow 64K frame to be packed as single skb without frag_list. Since |
126 | * GRO uses frags we allocate at least 16 regardless of page size. | ||
127 | */ | ||
128 | #if (65536/PAGE_SIZE + 2) < 16 | ||
129 | #define MAX_SKB_FRAGS 16UL | ||
130 | #else | ||
126 | #define MAX_SKB_FRAGS (65536/PAGE_SIZE + 2) | 131 | #define MAX_SKB_FRAGS (65536/PAGE_SIZE + 2) |
132 | #endif | ||
127 | 133 | ||
128 | typedef struct skb_frag_struct skb_frag_t; | 134 | typedef struct skb_frag_struct skb_frag_t; |
129 | 135 | ||
130 | struct skb_frag_struct { | 136 | struct skb_frag_struct { |
131 | struct page *page; | 137 | struct page *page; |
138 | #if (BITS_PER_LONG > 32) || (PAGE_SIZE >= 65536) | ||
132 | __u32 page_offset; | 139 | __u32 page_offset; |
133 | __u32 size; | 140 | __u32 size; |
141 | #else | ||
142 | __u16 page_offset; | ||
143 | __u16 size; | ||
144 | #endif | ||
134 | }; | 145 | }; |
135 | 146 | ||
136 | #define HAVE_HW_TIME_STAMP | 147 | #define HAVE_HW_TIME_STAMP |
@@ -163,26 +174,19 @@ struct skb_shared_hwtstamps { | |||
163 | ktime_t syststamp; | 174 | ktime_t syststamp; |
164 | }; | 175 | }; |
165 | 176 | ||
166 | /** | 177 | /* Definitions for tx_flags in struct skb_shared_info */ |
167 | * struct skb_shared_tx - instructions for time stamping of outgoing packets | 178 | enum { |
168 | * @hardware: generate hardware time stamp | 179 | /* generate hardware time stamp */ |
169 | * @software: generate software time stamp | 180 | SKBTX_HW_TSTAMP = 1 << 0, |
170 | * @in_progress: device driver is going to provide | 181 | |
171 | * hardware time stamp | 182 | /* generate software time stamp */ |
172 | * @prevent_sk_orphan: make sk reference available on driver level | 183 | SKBTX_SW_TSTAMP = 1 << 1, |
173 | * @flags: all shared_tx flags | 184 | |
174 | * | 185 | /* device driver is going to provide hardware time stamp */ |
175 | * These flags are attached to packets as part of the | 186 | SKBTX_IN_PROGRESS = 1 << 2, |
176 | * &skb_shared_info. Use skb_tx() to get a pointer. | 187 | |
177 | */ | 188 | /* ensure the originating sk reference is available on driver level */ |
178 | union skb_shared_tx { | 189 | SKBTX_DRV_NEEDS_SK_REF = 1 << 3, |
179 | struct { | ||
180 | __u8 hardware:1, | ||
181 | software:1, | ||
182 | in_progress:1, | ||
183 | prevent_sk_orphan:1; | ||
184 | }; | ||
185 | __u8 flags; | ||
186 | }; | 190 | }; |
187 | 191 | ||
188 | /* This data is invariant across clones and lives at | 192 | /* This data is invariant across clones and lives at |
@@ -195,7 +199,7 @@ struct skb_shared_info { | |||
195 | unsigned short gso_segs; | 199 | unsigned short gso_segs; |
196 | unsigned short gso_type; | 200 | unsigned short gso_type; |
197 | __be32 ip6_frag_id; | 201 | __be32 ip6_frag_id; |
198 | union skb_shared_tx tx_flags; | 202 | __u8 tx_flags; |
199 | struct sk_buff *frag_list; | 203 | struct sk_buff *frag_list; |
200 | struct skb_shared_hwtstamps hwtstamps; | 204 | struct skb_shared_hwtstamps hwtstamps; |
201 | 205 | ||
@@ -257,6 +261,11 @@ typedef unsigned int sk_buff_data_t; | |||
257 | typedef unsigned char *sk_buff_data_t; | 261 | typedef unsigned char *sk_buff_data_t; |
258 | #endif | 262 | #endif |
259 | 263 | ||
264 | #if defined(CONFIG_NF_DEFRAG_IPV4) || defined(CONFIG_NF_DEFRAG_IPV4_MODULE) || \ | ||
265 | defined(CONFIG_NF_DEFRAG_IPV6) || defined(CONFIG_NF_DEFRAG_IPV6_MODULE) | ||
266 | #define NET_SKBUFF_NF_DEFRAG_NEEDED 1 | ||
267 | #endif | ||
268 | |||
260 | /** | 269 | /** |
261 | * struct sk_buff - socket buffer | 270 | * struct sk_buff - socket buffer |
262 | * @next: Next buffer in list | 271 | * @next: Next buffer in list |
@@ -364,6 +373,8 @@ struct sk_buff { | |||
364 | void (*destructor)(struct sk_buff *skb); | 373 | void (*destructor)(struct sk_buff *skb); |
365 | #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE) | 374 | #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE) |
366 | struct nf_conntrack *nfct; | 375 | struct nf_conntrack *nfct; |
376 | #endif | ||
377 | #ifdef NET_SKBUFF_NF_DEFRAG_NEEDED | ||
367 | struct sk_buff *nfct_reasm; | 378 | struct sk_buff *nfct_reasm; |
368 | #endif | 379 | #endif |
369 | #ifdef CONFIG_BRIDGE_NETFILTER | 380 | #ifdef CONFIG_BRIDGE_NETFILTER |
@@ -380,17 +391,15 @@ struct sk_buff { | |||
380 | 391 | ||
381 | __u32 rxhash; | 392 | __u32 rxhash; |
382 | 393 | ||
394 | __u16 queue_mapping; | ||
383 | kmemcheck_bitfield_begin(flags2); | 395 | kmemcheck_bitfield_begin(flags2); |
384 | __u16 queue_mapping:16; | ||
385 | #ifdef CONFIG_IPV6_NDISC_NODETYPE | 396 | #ifdef CONFIG_IPV6_NDISC_NODETYPE |
386 | __u8 ndisc_nodetype:2, | 397 | __u8 ndisc_nodetype:2; |
387 | deliver_no_wcard:1; | ||
388 | #else | ||
389 | __u8 deliver_no_wcard:1; | ||
390 | #endif | 398 | #endif |
399 | __u8 ooo_okay:1; | ||
391 | kmemcheck_bitfield_end(flags2); | 400 | kmemcheck_bitfield_end(flags2); |
392 | 401 | ||
393 | /* 0/14 bit hole */ | 402 | /* 0/13 bit hole */ |
394 | 403 | ||
395 | #ifdef CONFIG_NET_DMA | 404 | #ifdef CONFIG_NET_DMA |
396 | dma_cookie_t dma_cookie; | 405 | dma_cookie_t dma_cookie; |
@@ -462,22 +471,10 @@ static inline void skb_dst_set(struct sk_buff *skb, struct dst_entry *dst) | |||
462 | skb->_skb_refdst = (unsigned long)dst; | 471 | skb->_skb_refdst = (unsigned long)dst; |
463 | } | 472 | } |
464 | 473 | ||
465 | /** | 474 | extern void skb_dst_set_noref(struct sk_buff *skb, struct dst_entry *dst); |
466 | * skb_dst_set_noref - sets skb dst, without a reference | ||
467 | * @skb: buffer | ||
468 | * @dst: dst entry | ||
469 | * | ||
470 | * Sets skb dst, assuming a reference was not taken on dst | ||
471 | * skb_dst_drop() should not dst_release() this dst | ||
472 | */ | ||
473 | static inline void skb_dst_set_noref(struct sk_buff *skb, struct dst_entry *dst) | ||
474 | { | ||
475 | WARN_ON(!rcu_read_lock_held() && !rcu_read_lock_bh_held()); | ||
476 | skb->_skb_refdst = (unsigned long)dst | SKB_DST_NOREF; | ||
477 | } | ||
478 | 475 | ||
479 | /** | 476 | /** |
480 | * skb_dst_is_noref - Test if skb dst isnt refcounted | 477 | * skb_dst_is_noref - Test if skb dst isn't refcounted |
481 | * @skb: buffer | 478 | * @skb: buffer |
482 | */ | 479 | */ |
483 | static inline bool skb_dst_is_noref(const struct sk_buff *skb) | 480 | static inline bool skb_dst_is_noref(const struct sk_buff *skb) |
@@ -498,13 +495,13 @@ extern struct sk_buff *__alloc_skb(unsigned int size, | |||
498 | static inline struct sk_buff *alloc_skb(unsigned int size, | 495 | static inline struct sk_buff *alloc_skb(unsigned int size, |
499 | gfp_t priority) | 496 | gfp_t priority) |
500 | { | 497 | { |
501 | return __alloc_skb(size, priority, 0, -1); | 498 | return __alloc_skb(size, priority, 0, NUMA_NO_NODE); |
502 | } | 499 | } |
503 | 500 | ||
504 | static inline struct sk_buff *alloc_skb_fclone(unsigned int size, | 501 | static inline struct sk_buff *alloc_skb_fclone(unsigned int size, |
505 | gfp_t priority) | 502 | gfp_t priority) |
506 | { | 503 | { |
507 | return __alloc_skb(size, priority, 1, -1); | 504 | return __alloc_skb(size, priority, 1, NUMA_NO_NODE); |
508 | } | 505 | } |
509 | 506 | ||
510 | extern bool skb_recycle_check(struct sk_buff *skb, int skb_size); | 507 | extern bool skb_recycle_check(struct sk_buff *skb, int skb_size); |
@@ -558,6 +555,15 @@ extern unsigned int skb_find_text(struct sk_buff *skb, unsigned int from, | |||
558 | unsigned int to, struct ts_config *config, | 555 | unsigned int to, struct ts_config *config, |
559 | struct ts_state *state); | 556 | struct ts_state *state); |
560 | 557 | ||
558 | extern __u32 __skb_get_rxhash(struct sk_buff *skb); | ||
559 | static inline __u32 skb_get_rxhash(struct sk_buff *skb) | ||
560 | { | ||
561 | if (!skb->rxhash) | ||
562 | skb->rxhash = __skb_get_rxhash(skb); | ||
563 | |||
564 | return skb->rxhash; | ||
565 | } | ||
566 | |||
561 | #ifdef NET_SKBUFF_DATA_USES_OFFSET | 567 | #ifdef NET_SKBUFF_DATA_USES_OFFSET |
562 | static inline unsigned char *skb_end_pointer(const struct sk_buff *skb) | 568 | static inline unsigned char *skb_end_pointer(const struct sk_buff *skb) |
563 | { | 569 | { |
@@ -578,11 +584,6 @@ static inline struct skb_shared_hwtstamps *skb_hwtstamps(struct sk_buff *skb) | |||
578 | return &skb_shinfo(skb)->hwtstamps; | 584 | return &skb_shinfo(skb)->hwtstamps; |
579 | } | 585 | } |
580 | 586 | ||
581 | static inline union skb_shared_tx *skb_tx(struct sk_buff *skb) | ||
582 | { | ||
583 | return &skb_shinfo(skb)->tx_flags; | ||
584 | } | ||
585 | |||
586 | /** | 587 | /** |
587 | * skb_queue_empty - check if a queue is empty | 588 | * skb_queue_empty - check if a queue is empty |
588 | * @list: queue head | 589 | * @list: queue head |
@@ -604,7 +605,7 @@ static inline int skb_queue_empty(const struct sk_buff_head *list) | |||
604 | static inline bool skb_queue_is_last(const struct sk_buff_head *list, | 605 | static inline bool skb_queue_is_last(const struct sk_buff_head *list, |
605 | const struct sk_buff *skb) | 606 | const struct sk_buff *skb) |
606 | { | 607 | { |
607 | return (skb->next == (struct sk_buff *) list); | 608 | return skb->next == (struct sk_buff *)list; |
608 | } | 609 | } |
609 | 610 | ||
610 | /** | 611 | /** |
@@ -617,7 +618,7 @@ static inline bool skb_queue_is_last(const struct sk_buff_head *list, | |||
617 | static inline bool skb_queue_is_first(const struct sk_buff_head *list, | 618 | static inline bool skb_queue_is_first(const struct sk_buff_head *list, |
618 | const struct sk_buff *skb) | 619 | const struct sk_buff *skb) |
619 | { | 620 | { |
620 | return (skb->prev == (struct sk_buff *) list); | 621 | return skb->prev == (struct sk_buff *)list; |
621 | } | 622 | } |
622 | 623 | ||
623 | /** | 624 | /** |
@@ -1123,7 +1124,7 @@ extern void skb_add_rx_frag(struct sk_buff *skb, int i, struct page *page, | |||
1123 | int off, int size); | 1124 | int off, int size); |
1124 | 1125 | ||
1125 | #define SKB_PAGE_ASSERT(skb) BUG_ON(skb_shinfo(skb)->nr_frags) | 1126 | #define SKB_PAGE_ASSERT(skb) BUG_ON(skb_shinfo(skb)->nr_frags) |
1126 | #define SKB_FRAG_ASSERT(skb) BUG_ON(skb_has_frags(skb)) | 1127 | #define SKB_FRAG_ASSERT(skb) BUG_ON(skb_has_frag_list(skb)) |
1127 | #define SKB_LINEAR_ASSERT(skb) BUG_ON(skb_is_nonlinear(skb)) | 1128 | #define SKB_LINEAR_ASSERT(skb) BUG_ON(skb_is_nonlinear(skb)) |
1128 | 1129 | ||
1129 | #ifdef NET_SKBUFF_DATA_USES_OFFSET | 1130 | #ifdef NET_SKBUFF_DATA_USES_OFFSET |
@@ -1255,6 +1256,11 @@ static inline void skb_reserve(struct sk_buff *skb, int len) | |||
1255 | skb->tail += len; | 1256 | skb->tail += len; |
1256 | } | 1257 | } |
1257 | 1258 | ||
1259 | static inline void skb_reset_mac_len(struct sk_buff *skb) | ||
1260 | { | ||
1261 | skb->mac_len = skb->network_header - skb->mac_header; | ||
1262 | } | ||
1263 | |||
1258 | #ifdef NET_SKBUFF_DATA_USES_OFFSET | 1264 | #ifdef NET_SKBUFF_DATA_USES_OFFSET |
1259 | static inline unsigned char *skb_transport_header(const struct sk_buff *skb) | 1265 | static inline unsigned char *skb_transport_header(const struct sk_buff *skb) |
1260 | { | 1266 | { |
@@ -1364,6 +1370,11 @@ static inline void skb_set_mac_header(struct sk_buff *skb, const int offset) | |||
1364 | } | 1370 | } |
1365 | #endif /* NET_SKBUFF_DATA_USES_OFFSET */ | 1371 | #endif /* NET_SKBUFF_DATA_USES_OFFSET */ |
1366 | 1372 | ||
1373 | static inline int skb_checksum_start_offset(const struct sk_buff *skb) | ||
1374 | { | ||
1375 | return skb->csum_start - skb_headroom(skb); | ||
1376 | } | ||
1377 | |||
1367 | static inline int skb_transport_offset(const struct sk_buff *skb) | 1378 | static inline int skb_transport_offset(const struct sk_buff *skb) |
1368 | { | 1379 | { |
1369 | return skb_transport_header(skb) - skb->data; | 1380 | return skb_transport_header(skb) - skb->data; |
@@ -1436,7 +1447,7 @@ extern int ___pskb_trim(struct sk_buff *skb, unsigned int len); | |||
1436 | 1447 | ||
1437 | static inline void __skb_trim(struct sk_buff *skb, unsigned int len) | 1448 | static inline void __skb_trim(struct sk_buff *skb, unsigned int len) |
1438 | { | 1449 | { |
1439 | if (unlikely(skb->data_len)) { | 1450 | if (unlikely(skb_is_nonlinear(skb))) { |
1440 | WARN_ON(1); | 1451 | WARN_ON(1); |
1441 | return; | 1452 | return; |
1442 | } | 1453 | } |
@@ -1561,13 +1572,25 @@ static inline struct sk_buff *netdev_alloc_skb_ip_align(struct net_device *dev, | |||
1561 | return skb; | 1572 | return skb; |
1562 | } | 1573 | } |
1563 | 1574 | ||
1564 | extern struct page *__netdev_alloc_page(struct net_device *dev, gfp_t gfp_mask); | 1575 | /** |
1576 | * __netdev_alloc_page - allocate a page for ps-rx on a specific device | ||
1577 | * @dev: network device to receive on | ||
1578 | * @gfp_mask: alloc_pages_node mask | ||
1579 | * | ||
1580 | * Allocate a new page. dev currently unused. | ||
1581 | * | ||
1582 | * %NULL is returned if there is no free memory. | ||
1583 | */ | ||
1584 | static inline struct page *__netdev_alloc_page(struct net_device *dev, gfp_t gfp_mask) | ||
1585 | { | ||
1586 | return alloc_pages_node(NUMA_NO_NODE, gfp_mask, 0); | ||
1587 | } | ||
1565 | 1588 | ||
1566 | /** | 1589 | /** |
1567 | * netdev_alloc_page - allocate a page for ps-rx on a specific device | 1590 | * netdev_alloc_page - allocate a page for ps-rx on a specific device |
1568 | * @dev: network device to receive on | 1591 | * @dev: network device to receive on |
1569 | * | 1592 | * |
1570 | * Allocate a new page node local to the specified device. | 1593 | * Allocate a new page. dev currently unused. |
1571 | * | 1594 | * |
1572 | * %NULL is returned if there is no free memory. | 1595 | * %NULL is returned if there is no free memory. |
1573 | */ | 1596 | */ |
@@ -1764,7 +1787,7 @@ static inline int pskb_trim_rcsum(struct sk_buff *skb, unsigned int len) | |||
1764 | 1787 | ||
1765 | #define skb_queue_walk(queue, skb) \ | 1788 | #define skb_queue_walk(queue, skb) \ |
1766 | for (skb = (queue)->next; \ | 1789 | for (skb = (queue)->next; \ |
1767 | prefetch(skb->next), (skb != (struct sk_buff *)(queue)); \ | 1790 | skb != (struct sk_buff *)(queue); \ |
1768 | skb = skb->next) | 1791 | skb = skb->next) |
1769 | 1792 | ||
1770 | #define skb_queue_walk_safe(queue, skb, tmp) \ | 1793 | #define skb_queue_walk_safe(queue, skb, tmp) \ |
@@ -1773,7 +1796,7 @@ static inline int pskb_trim_rcsum(struct sk_buff *skb, unsigned int len) | |||
1773 | skb = tmp, tmp = skb->next) | 1796 | skb = tmp, tmp = skb->next) |
1774 | 1797 | ||
1775 | #define skb_queue_walk_from(queue, skb) \ | 1798 | #define skb_queue_walk_from(queue, skb) \ |
1776 | for (; prefetch(skb->next), (skb != (struct sk_buff *)(queue)); \ | 1799 | for (; skb != (struct sk_buff *)(queue); \ |
1777 | skb = skb->next) | 1800 | skb = skb->next) |
1778 | 1801 | ||
1779 | #define skb_queue_walk_from_safe(queue, skb, tmp) \ | 1802 | #define skb_queue_walk_from_safe(queue, skb, tmp) \ |
@@ -1783,11 +1806,20 @@ static inline int pskb_trim_rcsum(struct sk_buff *skb, unsigned int len) | |||
1783 | 1806 | ||
1784 | #define skb_queue_reverse_walk(queue, skb) \ | 1807 | #define skb_queue_reverse_walk(queue, skb) \ |
1785 | for (skb = (queue)->prev; \ | 1808 | for (skb = (queue)->prev; \ |
1786 | prefetch(skb->prev), (skb != (struct sk_buff *)(queue)); \ | 1809 | skb != (struct sk_buff *)(queue); \ |
1787 | skb = skb->prev) | 1810 | skb = skb->prev) |
1788 | 1811 | ||
1812 | #define skb_queue_reverse_walk_safe(queue, skb, tmp) \ | ||
1813 | for (skb = (queue)->prev, tmp = skb->prev; \ | ||
1814 | skb != (struct sk_buff *)(queue); \ | ||
1815 | skb = tmp, tmp = skb->prev) | ||
1816 | |||
1817 | #define skb_queue_reverse_walk_from_safe(queue, skb, tmp) \ | ||
1818 | for (tmp = skb->prev; \ | ||
1819 | skb != (struct sk_buff *)(queue); \ | ||
1820 | skb = tmp, tmp = skb->prev) | ||
1789 | 1821 | ||
1790 | static inline bool skb_has_frags(const struct sk_buff *skb) | 1822 | static inline bool skb_has_frag_list(const struct sk_buff *skb) |
1791 | { | 1823 | { |
1792 | return skb_shinfo(skb)->frag_list != NULL; | 1824 | return skb_shinfo(skb)->frag_list != NULL; |
1793 | } | 1825 | } |
@@ -1853,7 +1885,7 @@ extern void skb_split(struct sk_buff *skb, | |||
1853 | extern int skb_shift(struct sk_buff *tgt, struct sk_buff *skb, | 1885 | extern int skb_shift(struct sk_buff *tgt, struct sk_buff *skb, |
1854 | int shiftlen); | 1886 | int shiftlen); |
1855 | 1887 | ||
1856 | extern struct sk_buff *skb_segment(struct sk_buff *skb, int features); | 1888 | extern struct sk_buff *skb_segment(struct sk_buff *skb, u32 features); |
1857 | 1889 | ||
1858 | static inline void *skb_header_pointer(const struct sk_buff *skb, int offset, | 1890 | static inline void *skb_header_pointer(const struct sk_buff *skb, int offset, |
1859 | int len, void *buffer) | 1891 | int len, void *buffer) |
@@ -1987,8 +2019,8 @@ extern void skb_tstamp_tx(struct sk_buff *orig_skb, | |||
1987 | 2019 | ||
1988 | static inline void sw_tx_timestamp(struct sk_buff *skb) | 2020 | static inline void sw_tx_timestamp(struct sk_buff *skb) |
1989 | { | 2021 | { |
1990 | union skb_shared_tx *shtx = skb_tx(skb); | 2022 | if (skb_shinfo(skb)->tx_flags & SKBTX_SW_TSTAMP && |
1991 | if (shtx->software && !shtx->in_progress) | 2023 | !(skb_shinfo(skb)->tx_flags & SKBTX_IN_PROGRESS)) |
1992 | skb_tstamp_tx(skb, NULL); | 2024 | skb_tstamp_tx(skb, NULL); |
1993 | } | 2025 | } |
1994 | 2026 | ||
@@ -2049,6 +2081,8 @@ static inline void nf_conntrack_get(struct nf_conntrack *nfct) | |||
2049 | if (nfct) | 2081 | if (nfct) |
2050 | atomic_inc(&nfct->use); | 2082 | atomic_inc(&nfct->use); |
2051 | } | 2083 | } |
2084 | #endif | ||
2085 | #ifdef NET_SKBUFF_NF_DEFRAG_NEEDED | ||
2052 | static inline void nf_conntrack_get_reasm(struct sk_buff *skb) | 2086 | static inline void nf_conntrack_get_reasm(struct sk_buff *skb) |
2053 | { | 2087 | { |
2054 | if (skb) | 2088 | if (skb) |
@@ -2077,6 +2111,8 @@ static inline void nf_reset(struct sk_buff *skb) | |||
2077 | #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE) | 2111 | #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE) |
2078 | nf_conntrack_put(skb->nfct); | 2112 | nf_conntrack_put(skb->nfct); |
2079 | skb->nfct = NULL; | 2113 | skb->nfct = NULL; |
2114 | #endif | ||
2115 | #ifdef NET_SKBUFF_NF_DEFRAG_NEEDED | ||
2080 | nf_conntrack_put_reasm(skb->nfct_reasm); | 2116 | nf_conntrack_put_reasm(skb->nfct_reasm); |
2081 | skb->nfct_reasm = NULL; | 2117 | skb->nfct_reasm = NULL; |
2082 | #endif | 2118 | #endif |
@@ -2093,6 +2129,8 @@ static inline void __nf_copy(struct sk_buff *dst, const struct sk_buff *src) | |||
2093 | dst->nfct = src->nfct; | 2129 | dst->nfct = src->nfct; |
2094 | nf_conntrack_get(src->nfct); | 2130 | nf_conntrack_get(src->nfct); |
2095 | dst->nfctinfo = src->nfctinfo; | 2131 | dst->nfctinfo = src->nfctinfo; |
2132 | #endif | ||
2133 | #ifdef NET_SKBUFF_NF_DEFRAG_NEEDED | ||
2096 | dst->nfct_reasm = src->nfct_reasm; | 2134 | dst->nfct_reasm = src->nfct_reasm; |
2097 | nf_conntrack_get_reasm(src->nfct_reasm); | 2135 | nf_conntrack_get_reasm(src->nfct_reasm); |
2098 | #endif | 2136 | #endif |
@@ -2106,6 +2144,8 @@ static inline void nf_copy(struct sk_buff *dst, const struct sk_buff *src) | |||
2106 | { | 2144 | { |
2107 | #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE) | 2145 | #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE) |
2108 | nf_conntrack_put(dst->nfct); | 2146 | nf_conntrack_put(dst->nfct); |
2147 | #endif | ||
2148 | #ifdef NET_SKBUFF_NF_DEFRAG_NEEDED | ||
2109 | nf_conntrack_put_reasm(dst->nfct_reasm); | 2149 | nf_conntrack_put_reasm(dst->nfct_reasm); |
2110 | #endif | 2150 | #endif |
2111 | #ifdef CONFIG_BRIDGE_NETFILTER | 2151 | #ifdef CONFIG_BRIDGE_NETFILTER |
@@ -2159,11 +2199,12 @@ static inline u16 skb_get_rx_queue(const struct sk_buff *skb) | |||
2159 | 2199 | ||
2160 | static inline bool skb_rx_queue_recorded(const struct sk_buff *skb) | 2200 | static inline bool skb_rx_queue_recorded(const struct sk_buff *skb) |
2161 | { | 2201 | { |
2162 | return (skb->queue_mapping != 0); | 2202 | return skb->queue_mapping != 0; |
2163 | } | 2203 | } |
2164 | 2204 | ||
2165 | extern u16 skb_tx_hash(const struct net_device *dev, | 2205 | extern u16 __skb_tx_hash(const struct net_device *dev, |
2166 | const struct sk_buff *skb); | 2206 | const struct sk_buff *skb, |
2207 | unsigned int num_tx_queues); | ||
2167 | 2208 | ||
2168 | #ifdef CONFIG_XFRM | 2209 | #ifdef CONFIG_XFRM |
2169 | static inline struct sec_path *skb_sec_path(struct sk_buff *skb) | 2210 | static inline struct sec_path *skb_sec_path(struct sk_buff *skb) |
@@ -2209,6 +2250,21 @@ static inline void skb_forward_csum(struct sk_buff *skb) | |||
2209 | skb->ip_summed = CHECKSUM_NONE; | 2250 | skb->ip_summed = CHECKSUM_NONE; |
2210 | } | 2251 | } |
2211 | 2252 | ||
2253 | /** | ||
2254 | * skb_checksum_none_assert - make sure skb ip_summed is CHECKSUM_NONE | ||
2255 | * @skb: skb to check | ||
2256 | * | ||
2257 | * fresh skbs have their ip_summed set to CHECKSUM_NONE. | ||
2258 | * Instead of forcing ip_summed to CHECKSUM_NONE, we can | ||
2259 | * use this helper, to document places where we make this assertion. | ||
2260 | */ | ||
2261 | static inline void skb_checksum_none_assert(struct sk_buff *skb) | ||
2262 | { | ||
2263 | #ifdef DEBUG | ||
2264 | BUG_ON(skb->ip_summed != CHECKSUM_NONE); | ||
2265 | #endif | ||
2266 | } | ||
2267 | |||
2212 | bool skb_partial_csum_set(struct sk_buff *skb, u16 start, u16 off); | 2268 | bool skb_partial_csum_set(struct sk_buff *skb, u16 start, u16 off); |
2213 | #endif /* __KERNEL__ */ | 2269 | #endif /* __KERNEL__ */ |
2214 | #endif /* _LINUX_SKBUFF_H */ | 2270 | #endif /* _LINUX_SKBUFF_H */ |