[ovs-dev] [PATCH v2] datapath: geneve: Handle vlan tag
Pravin B Shelar
pshelar at ovn.org
Tue Nov 1 18:35:04 UTC 2016
The compat vlan code ignores vlan tag for inner packet
on egress path. Following patch fixes this by inserting the
tag for inner packet before tunnel encapsulation.
Signed-off-by: Pravin B Shelar <pshelar at ovn.org>
---
datapath/linux/compat/geneve.c | 33 +++++++++++++++++++++++++++++++--
1 file changed, 31 insertions(+), 2 deletions(-)
diff --git a/datapath/linux/compat/geneve.c b/datapath/linux/compat/geneve.c
index 7f2b192..c08dced 100644
--- a/datapath/linux/compat/geneve.c
+++ b/datapath/linux/compat/geneve.c
@@ -738,6 +738,23 @@ static void geneve_build_header(struct genevehdr *geneveh,
memcpy(geneveh->options, options, options_len);
}
+static int push_vlan_tag(struct sk_buff *skb)
+{
+ if (skb_vlan_tag_present(skb)) {
+ __be16 vlan_proto = skb->vlan_proto;
+ int err;
+
+ err = __vlan_insert_tag(skb, skb->vlan_proto,
+ skb_vlan_tag_get(skb));
+
+ if (unlikely(err))
+ return err;
+ skb->vlan_tci = 0;
+ skb->protocol = vlan_proto;
+ }
+ return 0;
+}
+
static int geneve_build_skb(struct rtable *rt, struct sk_buff *skb,
__be16 tun_flags, u8 vni[3], u8 opt_len, u8 *opt,
u32 flags, bool xnet)
@@ -750,11 +767,17 @@ static int geneve_build_skb(struct rtable *rt, struct sk_buff *skb,
skb_scrub_packet(skb, xnet);
min_headroom = LL_RESERVED_SPACE(rt->dst.dev) + rt->dst.header_len
- + GENEVE_BASE_HLEN + opt_len + sizeof(struct iphdr);
+ + GENEVE_BASE_HLEN + opt_len + sizeof(struct iphdr)
+ + (skb_vlan_tag_present(skb) ? VLAN_HLEN : 0);
+
err = skb_cow_head(skb, min_headroom);
if (unlikely(err))
goto free_rt;
+ err = push_vlan_tag(skb);
+ if (unlikely(err))
+ goto free_rt;
+
err = udp_tunnel_handle_offloads(skb, udp_sum);
if (err)
goto free_rt;
@@ -783,11 +806,17 @@ static int geneve6_build_skb(struct dst_entry *dst, struct sk_buff *skb,
skb_scrub_packet(skb, xnet);
min_headroom = LL_RESERVED_SPACE(dst->dev) + dst->header_len
- + GENEVE_BASE_HLEN + opt_len + sizeof(struct ipv6hdr);
+ + GENEVE_BASE_HLEN + opt_len + sizeof(struct ipv6hdr)
+ + (skb_vlan_tag_present(skb) ? VLAN_HLEN : 0);
+
err = skb_cow_head(skb, min_headroom);
if (unlikely(err))
goto free_dst;
+ err = push_vlan_tag(skb);
+ if (unlikely(err))
+ goto free_dst;
+
err = udp_tunnel_handle_offloads(skb, udp_sum);
if (err)
goto free_dst;
--
2.5.5
More information about the dev
mailing list