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