diff options
Diffstat (limited to 'include/linux/skbuff.h')
-rw-r--r-- | include/linux/skbuff.h | 102 |
1 files changed, 99 insertions, 3 deletions
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index 6a2c34e6d962..320e976d5ab8 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h | |||
@@ -235,11 +235,13 @@ enum { | |||
235 | /* | 235 | /* |
236 | * The callback notifies userspace to release buffers when skb DMA is done in | 236 | * The callback notifies userspace to release buffers when skb DMA is done in |
237 | * lower device, the skb last reference should be 0 when calling this. | 237 | * lower device, the skb last reference should be 0 when calling this. |
238 | * The zerocopy_success argument is true if zero copy transmit occurred, | ||
239 | * false on data copy or out of memory error caused by data copy attempt. | ||
238 | * The ctx field is used to track device context. | 240 | * The ctx field is used to track device context. |
239 | * The desc field is used to track userspace buffer index. | 241 | * The desc field is used to track userspace buffer index. |
240 | */ | 242 | */ |
241 | struct ubuf_info { | 243 | struct ubuf_info { |
242 | void (*callback)(struct ubuf_info *); | 244 | void (*callback)(struct ubuf_info *, bool zerocopy_success); |
243 | void *ctx; | 245 | void *ctx; |
244 | unsigned long desc; | 246 | unsigned long desc; |
245 | }; | 247 | }; |
@@ -374,6 +376,8 @@ typedef unsigned char *sk_buff_data_t; | |||
374 | * @mark: Generic packet mark | 376 | * @mark: Generic packet mark |
375 | * @dropcount: total number of sk_receive_queue overflows | 377 | * @dropcount: total number of sk_receive_queue overflows |
376 | * @vlan_tci: vlan tag control information | 378 | * @vlan_tci: vlan tag control information |
379 | * @inner_transport_header: Inner transport layer header (encapsulation) | ||
380 | * @inner_network_header: Network layer header (encapsulation) | ||
377 | * @transport_header: Transport layer header | 381 | * @transport_header: Transport layer header |
378 | * @network_header: Network layer header | 382 | * @network_header: Network layer header |
379 | * @mac_header: Link layer header | 383 | * @mac_header: Link layer header |
@@ -469,7 +473,13 @@ struct sk_buff { | |||
469 | __u8 wifi_acked:1; | 473 | __u8 wifi_acked:1; |
470 | __u8 no_fcs:1; | 474 | __u8 no_fcs:1; |
471 | __u8 head_frag:1; | 475 | __u8 head_frag:1; |
472 | /* 8/10 bit hole (depending on ndisc_nodetype presence) */ | 476 | /* Encapsulation protocol and NIC drivers should use |
477 | * this flag to indicate to each other if the skb contains | ||
478 | * encapsulated packet or not and maybe use the inner packet | ||
479 | * headers if needed | ||
480 | */ | ||
481 | __u8 encapsulation:1; | ||
482 | /* 7/9 bit hole (depending on ndisc_nodetype presence) */ | ||
473 | kmemcheck_bitfield_end(flags2); | 483 | kmemcheck_bitfield_end(flags2); |
474 | 484 | ||
475 | #ifdef CONFIG_NET_DMA | 485 | #ifdef CONFIG_NET_DMA |
@@ -484,6 +494,8 @@ struct sk_buff { | |||
484 | __u32 avail_size; | 494 | __u32 avail_size; |
485 | }; | 495 | }; |
486 | 496 | ||
497 | sk_buff_data_t inner_transport_header; | ||
498 | sk_buff_data_t inner_network_header; | ||
487 | sk_buff_data_t transport_header; | 499 | sk_buff_data_t transport_header; |
488 | sk_buff_data_t network_header; | 500 | sk_buff_data_t network_header; |
489 | sk_buff_data_t mac_header; | 501 | sk_buff_data_t mac_header; |
@@ -566,6 +578,7 @@ static inline struct rtable *skb_rtable(const struct sk_buff *skb) | |||
566 | } | 578 | } |
567 | 579 | ||
568 | extern void kfree_skb(struct sk_buff *skb); | 580 | extern void kfree_skb(struct sk_buff *skb); |
581 | extern void skb_tx_error(struct sk_buff *skb); | ||
569 | extern void consume_skb(struct sk_buff *skb); | 582 | extern void consume_skb(struct sk_buff *skb); |
570 | extern void __kfree_skb(struct sk_buff *skb); | 583 | extern void __kfree_skb(struct sk_buff *skb); |
571 | extern struct kmem_cache *skbuff_head_cache; | 584 | extern struct kmem_cache *skbuff_head_cache; |
@@ -643,7 +656,7 @@ extern unsigned int skb_find_text(struct sk_buff *skb, unsigned int from, | |||
643 | extern void __skb_get_rxhash(struct sk_buff *skb); | 656 | extern void __skb_get_rxhash(struct sk_buff *skb); |
644 | static inline __u32 skb_get_rxhash(struct sk_buff *skb) | 657 | static inline __u32 skb_get_rxhash(struct sk_buff *skb) |
645 | { | 658 | { |
646 | if (!skb->rxhash) | 659 | if (!skb->l4_rxhash) |
647 | __skb_get_rxhash(skb); | 660 | __skb_get_rxhash(skb); |
648 | 661 | ||
649 | return skb->rxhash; | 662 | return skb->rxhash; |
@@ -1432,12 +1445,53 @@ static inline void skb_reserve(struct sk_buff *skb, int len) | |||
1432 | skb->tail += len; | 1445 | skb->tail += len; |
1433 | } | 1446 | } |
1434 | 1447 | ||
1448 | static inline void skb_reset_inner_headers(struct sk_buff *skb) | ||
1449 | { | ||
1450 | skb->inner_network_header = skb->network_header; | ||
1451 | skb->inner_transport_header = skb->transport_header; | ||
1452 | } | ||
1453 | |||
1435 | static inline void skb_reset_mac_len(struct sk_buff *skb) | 1454 | static inline void skb_reset_mac_len(struct sk_buff *skb) |
1436 | { | 1455 | { |
1437 | skb->mac_len = skb->network_header - skb->mac_header; | 1456 | skb->mac_len = skb->network_header - skb->mac_header; |
1438 | } | 1457 | } |
1439 | 1458 | ||
1440 | #ifdef NET_SKBUFF_DATA_USES_OFFSET | 1459 | #ifdef NET_SKBUFF_DATA_USES_OFFSET |
1460 | static inline unsigned char *skb_inner_transport_header(const struct sk_buff | ||
1461 | *skb) | ||
1462 | { | ||
1463 | return skb->head + skb->inner_transport_header; | ||
1464 | } | ||
1465 | |||
1466 | static inline void skb_reset_inner_transport_header(struct sk_buff *skb) | ||
1467 | { | ||
1468 | skb->inner_transport_header = skb->data - skb->head; | ||
1469 | } | ||
1470 | |||
1471 | static inline void skb_set_inner_transport_header(struct sk_buff *skb, | ||
1472 | const int offset) | ||
1473 | { | ||
1474 | skb_reset_inner_transport_header(skb); | ||
1475 | skb->inner_transport_header += offset; | ||
1476 | } | ||
1477 | |||
1478 | static inline unsigned char *skb_inner_network_header(const struct sk_buff *skb) | ||
1479 | { | ||
1480 | return skb->head + skb->inner_network_header; | ||
1481 | } | ||
1482 | |||
1483 | static inline void skb_reset_inner_network_header(struct sk_buff *skb) | ||
1484 | { | ||
1485 | skb->inner_network_header = skb->data - skb->head; | ||
1486 | } | ||
1487 | |||
1488 | static inline void skb_set_inner_network_header(struct sk_buff *skb, | ||
1489 | const int offset) | ||
1490 | { | ||
1491 | skb_reset_inner_network_header(skb); | ||
1492 | skb->inner_network_header += offset; | ||
1493 | } | ||
1494 | |||
1441 | static inline unsigned char *skb_transport_header(const struct sk_buff *skb) | 1495 | static inline unsigned char *skb_transport_header(const struct sk_buff *skb) |
1442 | { | 1496 | { |
1443 | return skb->head + skb->transport_header; | 1497 | return skb->head + skb->transport_header; |
@@ -1493,6 +1547,38 @@ static inline void skb_set_mac_header(struct sk_buff *skb, const int offset) | |||
1493 | } | 1547 | } |
1494 | 1548 | ||
1495 | #else /* NET_SKBUFF_DATA_USES_OFFSET */ | 1549 | #else /* NET_SKBUFF_DATA_USES_OFFSET */ |
1550 | static inline unsigned char *skb_inner_transport_header(const struct sk_buff | ||
1551 | *skb) | ||
1552 | { | ||
1553 | return skb->inner_transport_header; | ||
1554 | } | ||
1555 | |||
1556 | static inline void skb_reset_inner_transport_header(struct sk_buff *skb) | ||
1557 | { | ||
1558 | skb->inner_transport_header = skb->data; | ||
1559 | } | ||
1560 | |||
1561 | static inline void skb_set_inner_transport_header(struct sk_buff *skb, | ||
1562 | const int offset) | ||
1563 | { | ||
1564 | skb->inner_transport_header = skb->data + offset; | ||
1565 | } | ||
1566 | |||
1567 | static inline unsigned char *skb_inner_network_header(const struct sk_buff *skb) | ||
1568 | { | ||
1569 | return skb->inner_network_header; | ||
1570 | } | ||
1571 | |||
1572 | static inline void skb_reset_inner_network_header(struct sk_buff *skb) | ||
1573 | { | ||
1574 | skb->inner_network_header = skb->data; | ||
1575 | } | ||
1576 | |||
1577 | static inline void skb_set_inner_network_header(struct sk_buff *skb, | ||
1578 | const int offset) | ||
1579 | { | ||
1580 | skb->inner_network_header = skb->data + offset; | ||
1581 | } | ||
1496 | 1582 | ||
1497 | static inline unsigned char *skb_transport_header(const struct sk_buff *skb) | 1583 | static inline unsigned char *skb_transport_header(const struct sk_buff *skb) |
1498 | { | 1584 | { |
@@ -1571,11 +1657,21 @@ static inline u32 skb_network_header_len(const struct sk_buff *skb) | |||
1571 | return skb->transport_header - skb->network_header; | 1657 | return skb->transport_header - skb->network_header; |
1572 | } | 1658 | } |
1573 | 1659 | ||
1660 | static inline u32 skb_inner_network_header_len(const struct sk_buff *skb) | ||
1661 | { | ||
1662 | return skb->inner_transport_header - skb->inner_network_header; | ||
1663 | } | ||
1664 | |||
1574 | static inline int skb_network_offset(const struct sk_buff *skb) | 1665 | static inline int skb_network_offset(const struct sk_buff *skb) |
1575 | { | 1666 | { |
1576 | return skb_network_header(skb) - skb->data; | 1667 | return skb_network_header(skb) - skb->data; |
1577 | } | 1668 | } |
1578 | 1669 | ||
1670 | static inline int skb_inner_network_offset(const struct sk_buff *skb) | ||
1671 | { | ||
1672 | return skb_inner_network_header(skb) - skb->data; | ||
1673 | } | ||
1674 | |||
1579 | static inline int pskb_network_may_pull(struct sk_buff *skb, unsigned int len) | 1675 | static inline int pskb_network_may_pull(struct sk_buff *skb, unsigned int len) |
1580 | { | 1676 | { |
1581 | return pskb_may_pull(skb, skb_network_offset(skb) + len); | 1677 | return pskb_may_pull(skb, skb_network_offset(skb) + len); |