diff mbox

[ovs-dev,v2] datapath: geneve: Handle vlan tag

Message ID 1478025304-98401-1-git-send-email-pshelar@ovn.org
State Accepted
Headers show

Commit Message

Pravin Shelar Nov. 1, 2016, 6:35 p.m. UTC
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@ovn.org>
---
 datapath/linux/compat/geneve.c | 33 +++++++++++++++++++++++++++++++--
 1 file changed, 31 insertions(+), 2 deletions(-)

Comments

Joe Stringer Nov. 1, 2016, 6:41 p.m. UTC | #1
On 1 November 2016 at 11:35, Pravin B Shelar <pshelar@ovn.org> 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 <pshelar@ovn.org>

Acked-by: Joe Stringer <joe@ovn.org>
Pravin Shelar Nov. 1, 2016, 7:07 p.m. UTC | #2
On Tue, Nov 1, 2016 at 11:41 AM, Joe Stringer <joe@ovn.org> wrote:
> On 1 November 2016 at 11:35, Pravin B Shelar <pshelar@ovn.org> 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 <pshelar@ovn.org>
>
> Acked-by: Joe Stringer <joe@ovn.org>

Thanks for review.
I pushed patch to master and branch-2.6.
diff mbox

Patch

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;