summaryrefslogtreecommitdiffstats
path: root/net/core/dev.c
diff options
context:
space:
mode:
authorJesse Gross2010-10-29 14:14:55 +0200
committerDavid S. Miller2010-11-15 18:22:53 +0100
commit58e998c6d23988490162cef0784b19ea274d90bb (patch)
treede3bbb355639d4bd6f2858d6265537672554d13b /net/core/dev.c
parentoffloading: Support multiple vlan tags in GSO. (diff)
downloadkernel-qcow2-linux-58e998c6d23988490162cef0784b19ea274d90bb.tar.gz
kernel-qcow2-linux-58e998c6d23988490162cef0784b19ea274d90bb.tar.xz
kernel-qcow2-linux-58e998c6d23988490162cef0784b19ea274d90bb.zip
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 'net/core/dev.c')
-rw-r--r--net/core/dev.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/net/core/dev.c b/net/core/dev.c
index 368930a988e3..8b500c3e0297 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -1968,6 +1968,22 @@ static inline void skb_orphan_try(struct sk_buff *skb)
}
}
+int netif_get_vlan_features(struct sk_buff *skb, struct net_device *dev)
+{
+ __be16 protocol = skb->protocol;
+
+ if (protocol == htons(ETH_P_8021Q)) {
+ struct vlan_ethhdr *veh = (struct vlan_ethhdr *)skb->data;
+ protocol = veh->h_vlan_encapsulated_proto;
+ } else if (!skb->vlan_tci)
+ return dev->features;
+
+ if (protocol != htons(ETH_P_8021Q))
+ return dev->features & dev->vlan_features;
+ else
+ return 0;
+}
+
/*
* Returns true if either:
* 1. skb has frag_list and the device doesn't support FRAGLIST, or