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