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 <pshe...@ovn.org>
---
 datapath/linux/compat/geneve.c | 26 ++++++++++++++++++++++++--
 1 file changed, 24 insertions(+), 2 deletions(-)

diff --git a/datapath/linux/compat/geneve.c b/datapath/linux/compat/geneve.c
index 7f2b192..6cce5ca 100644
--- a/datapath/linux/compat/geneve.c
+++ b/datapath/linux/compat/geneve.c
@@ -750,11 +750,22 @@ 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;
 
+       if (skb_vlan_tag_present(skb)) {
+               err = __vlan_insert_tag(skb, skb->vlan_proto,
+                                       skb_vlan_tag_get(skb));
+
+               if (unlikely(err))
+                       goto free_rt;
+               skb->vlan_tci = 0;
+       }
+
        err = udp_tunnel_handle_offloads(skb, udp_sum);
        if (err)
                goto free_rt;
@@ -783,11 +794,22 @@ 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;
 
+       if (skb_vlan_tag_present(skb)) {
+               err = __vlan_insert_tag(skb, skb->vlan_proto,
+                                       skb_vlan_tag_get(skb));
+
+               if (unlikely(err))
+                       goto free_dst;
+               skb->vlan_tci = 0;
+       }
+
        err = udp_tunnel_handle_offloads(skb, udp_sum);
        if (err)
                goto free_dst;
-- 
2.5.5

_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to