diff options
author | Jesse Gross <jesse@nicira.com> | 2010-10-29 08:14:55 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-11-15 12:22:53 -0500 |
commit | 58e998c6d23988490162cef0784b19ea274d90bb (patch) | |
tree | de3bbb355639d4bd6f2858d6265537672554d13b /include/linux/netdevice.h | |
parent | c8d5bcd1aff89199cde4bd82c5c40fb704c8bba4 (diff) |
offloading: Force software GSO for multiple vlan tags.
We currently use vlan_features to check for TSO support if there is
a vlan tag. However, it's quite likely that the NIC is not able to
do TSO when there is an arbitrary number of tags. Therefore if there
is more than one tag (in-band or out-of-band), fall back to software
emulation.
Signed-off-by: Jesse Gross <jesse@nicira.com>
CC: Ben Hutchings <bhutchings@solarflare.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/linux/netdevice.h')
-rw-r--r-- | include/linux/netdevice.h | 7 |
1 files changed, 3 insertions, 4 deletions
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 578debb801f4..6e4cfbc53d4c 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
@@ -2239,6 +2239,8 @@ unsigned long netdev_fix_features(unsigned long features, const char *name); | |||
2239 | void netif_stacked_transfer_operstate(const struct net_device *rootdev, | 2239 | void netif_stacked_transfer_operstate(const struct net_device *rootdev, |
2240 | struct net_device *dev); | 2240 | struct net_device *dev); |
2241 | 2241 | ||
2242 | int netif_get_vlan_features(struct sk_buff *skb, struct net_device *dev); | ||
2243 | |||
2242 | static inline int net_gso_ok(int features, int gso_type) | 2244 | static inline int net_gso_ok(int features, int gso_type) |
2243 | { | 2245 | { |
2244 | int feature = gso_type << NETIF_F_GSO_SHIFT; | 2246 | int feature = gso_type << NETIF_F_GSO_SHIFT; |
@@ -2254,10 +2256,7 @@ static inline int skb_gso_ok(struct sk_buff *skb, int features) | |||
2254 | static inline int netif_needs_gso(struct net_device *dev, struct sk_buff *skb) | 2256 | static inline int netif_needs_gso(struct net_device *dev, struct sk_buff *skb) |
2255 | { | 2257 | { |
2256 | if (skb_is_gso(skb)) { | 2258 | if (skb_is_gso(skb)) { |
2257 | int features = dev->features; | 2259 | int features = netif_get_vlan_features(skb, dev); |
2258 | |||
2259 | if (skb->protocol == htons(ETH_P_8021Q) || skb->vlan_tci) | ||
2260 | features &= dev->vlan_features; | ||
2261 | 2260 | ||
2262 | return (!skb_gso_ok(skb, features) || | 2261 | return (!skb_gso_ok(skb, features) || |
2263 | unlikely(skb->ip_summed != CHECKSUM_PARTIAL)); | 2262 | unlikely(skb->ip_summed != CHECKSUM_PARTIAL)); |