summaryrefslogtreecommitdiff
path: root/datapath/linux/compat/geneve.c
diff options
context:
space:
mode:
authorJesse Gross <jesse@nicira.com>2015-04-07 16:11:23 -0700
committerJesse Gross <jesse@nicira.com>2015-04-09 14:34:51 -0700
commitb13c9440d4e5e561ec4df011f1d62fffec5a8a66 (patch)
treef193674eab75afd377a6ccd955dd4104d712a7a4 /datapath/linux/compat/geneve.c
parente62d903bca43235e5c92ded0753b1c13096e790a (diff)
downloadopenvswitch-b13c9440d4e5e561ec4df011f1d62fffec5a8a66.tar.gz
datapath: Account for "udptunnels: Call handle_offloads after inserting vlan tag."
Upstream commit: udptunnels: Call handle_offloads after inserting vlan tag. handle_offloads() calls skb_reset_inner_headers() to store the layer pointers to the encapsulated packet. However, we currently push the vlag tag (if there is one) onto the packet afterwards. This changes the MAC header for the encapsulated packet but it is not reflected in skb->inner_mac_header, which breaks GSO and drivers which attempt to use this for encapsulation offloads. Fixes: b736a623 ("vxlan: Add tx-vlan offload support.") Signed-off-by: Jesse Gross <jesse@nicira.com> Signed-off-by: David S. Miller <davem@davemloft.net> Upstream: 4aac884d ("udptunnels: Call handle_offloads after inserting vlan tag.") Signed-off-by: Jesse Gross <jesse@nicira.com> Acked-by: Pravin B Shelar <pshelar@nicira.com>
Diffstat (limited to 'datapath/linux/compat/geneve.c')
-rw-r--r--datapath/linux/compat/geneve.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/datapath/linux/compat/geneve.c b/datapath/linux/compat/geneve.c
index 5fc6c6761..48a306e93 100644
--- a/datapath/linux/compat/geneve.c
+++ b/datapath/linux/compat/geneve.c
@@ -91,10 +91,6 @@ int geneve_xmit_skb(struct geneve_sock *gs, struct rtable *rt,
int min_headroom;
int err;
- skb = udp_tunnel_handle_offloads(skb, csum, (opt_len == 0));
- if (IS_ERR(skb))
- return PTR_ERR(skb);
-
min_headroom = LL_RESERVED_SPACE(rt_dst(rt).dev) + rt_dst(rt).header_len
+ GENEVE_BASE_HLEN + opt_len + sizeof(struct iphdr)
+ (skb_vlan_tag_present(skb) ? VLAN_HLEN : 0);
@@ -109,6 +105,10 @@ int geneve_xmit_skb(struct geneve_sock *gs, struct rtable *rt,
if (unlikely(!skb))
return -ENOMEM;
+ skb = udp_tunnel_handle_offloads(skb, csum, (opt_len == 0));
+ if (IS_ERR(skb))
+ return PTR_ERR(skb);
+
gnvh = (struct genevehdr *)__skb_push(skb, sizeof(*gnvh) + opt_len);
geneve_build_header(gnvh, tun_flags, vni, opt_len, opt);