On 31 October 2016 at 22:00, Pravin B Shelar <[email protected]> wrote:
> 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 <[email protected]>
Is this a problem upstream and for other tunnels too?
> ---
> 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));
Does the proto need to be set? I see that the equivalent vxlan code
upstream uses vlan_hwaccel_push_inside() instead.
> +
> + 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
> [email protected]
> http://openvswitch.org/mailman/listinfo/dev
_______________________________________________
dev mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/dev