net: Add ndo_gso_check
Subsystems (3)
PATCH v2 1/1 net: Add ndo_gso_check
Add ndo_gso_check which a device can define to indicate whether is is capable of doing GSO on a packet. This funciton would be called from the stack to determine whether software GSO is needed to be done. A driver should populate this function if it advertises GSO types for which there are combinations that it wouldn't be able to handle. For instance a device that performs UDP tunneling might only implement support for transparent Ethernet bridging type of inner packets or might have limitations on lengths of inner headers.
--- drivers/net/macvtap.c | 2 +- drivers/net/xen-netfront.c | 2 +- include/linux/netdevice.h | 12 +++++++++++- net/core/dev.c | 2 +- 4 files changed, 14 insertions(+), 4 deletions(-)
drivers/net/macvtap.c +1 -1
@@ -298,7 +298,7 @@ static rx_handler_result_t macvtap_handle_frame(struct sk_buff **pskb)*/ if (q->flags &IFF_VNET_HDR ) features |= vlan->tap_features; -if (netif_needs_gso (skb, features)) { +if (netif_needs_gso (dev, skb, features)) {struct sk_buff *segs =__skb_gso_segment (skb, features, false);if (IS_ERR (segs))
drivers/net/xen-netfront.c +1 -1
@@ -638,7 +638,7 @@ static int xennet_start_xmit(struct sk_buff *skb, struct net_device *dev)if (unlikely (!netif_carrier_ok (dev) || (slots >1 && !xennet_can_sg (dev)) || -netif_needs_gso (skb,netif_skb_features (skb)))) { +netif_needs_gso (dev, skb,netif_skb_features (skb)))) {spin_unlock_irqrestore (&queue->tx_lock, flags); goto drop; }
include/linux/netdevice.h +11 -1
@@ -998,6 +998,12 @@ typedef u16 (*select_queue_fallback_t)(struct net_device *dev,* Callback to use for xmit over the accelerated station. This * is used in place of ndo_start_xmit on accelerated net * devices. +* bool (*ndo_gso_check) (struct sk_buff *skb, +* struct net_device *dev); +* Called by core transmit path to determine if device is capable of +* performing GSO on a packet. The device returns true if it is +* able to GSO the packet, false otherwise. If the return value is +* false the stack will do software GSO. */ struct net_device_ops {int (*ndo_init)(struct net_device *dev);
@@ -1147,6 +1153,8 @@ struct net_device_ops {struct net_device *dev, void *priv);int (*ndo_get_lock_subclass)(struct net_device *dev); +bool (*ndo_gso_check) (struct sk_buff *skb, +struct net_device *dev); };/**
@@ -3572,10 +3580,12 @@ static inline bool skb_gso_ok(struct sk_buff *skb, netdev_features_t features) (!skb_has_frag_list (skb) || (features &NETIF_F_FRAGLIST )); } -static inline bool netif_needs_gso (struct sk_buff *skb, +static inline bool netif_needs_gso (struct net_device *dev,struct sk_buff *skb,netdev_features_t features) {return skb_is_gso (skb) && (!skb_gso_ok (skb, features) || + (dev->netdev_ops->ndo_gso_check && + !dev->netdev_ops->ndo_gso_check (skb, dev)) ||unlikely ((skb->ip_summed !=CHECKSUM_PARTIAL ) && (skb->ip_summed !=CHECKSUM_UNNECESSARY ))); }
net/core/dev.c +1 -1
@@ -2677,7 +2677,7 @@ static struct sk_buff *validate_xmit_skb(struct sk_buff *skb, struct net_deviceif (skb->encapsulation) features &= dev->hw_enc_features; -if (netif_needs_gso (skb, features)) { +if (netif_needs_gso (dev, skb, features)) {struct sk_buff *segs; segs =skb_gso_segment (skb, features);
Signature · 1 line
2.1.0.rc2.206.gedb03e5
From: Tom Herbert <[email protected]>
Date: Tue, 14 Oct 2014 15:19:06 -0700
Quoted 10 lines
Add
ndo_gso_checkwhich a device can define to indicate whether is is capable of doing GSO on a packet. This funciton would be called from the stack to determine whether software GSO is needed to be done. A driver should populate this function if it advertises GSO types for which there are combinations that it wouldn't be able to handle. For instance a device that performs UDP tunneling might only implement support for transparent Ethernet bridging type of inner packets or might have limitations on lengths of inner headers.Signed-off-by Tom Herbert <[email protected]>
Applied, thanks Tom.