[ovs-dev] [PATCH v3 3/9] datapath: Consistently set skb->inner_protocol for tunnels.

Jesse Gross jesse at nicira.com
Fri Feb 20 18:50:07 UTC 2015


skb->inner_protocol is used by GSO and TSO for tunnels on new
kernels. Since we are setting up packets to be handled by the
kernel's GSO and not just our own, we need to initialize this
field properly.

Signed-off-by: Jesse Gross <jesse at nicira.com>
---
 datapath/linux/compat/gre.c             | 2 ++
 datapath/linux/compat/ip_tunnels_core.c | 1 -
 datapath/linux/compat/vxlan.c           | 2 ++
 datapath/vport-lisp.c                   | 2 ++
 4 files changed, 6 insertions(+), 1 deletion(-)

diff --git a/datapath/linux/compat/gre.c b/datapath/linux/compat/gre.c
index 7b77d23..22bbf2f 100644
--- a/datapath/linux/compat/gre.c
+++ b/datapath/linux/compat/gre.c
@@ -331,6 +331,8 @@ void gre_build_header(struct sk_buff *skb, const struct tnl_ptk_info *tpi,
 						skb->len, 0));
 		}
 	}
+
+	ovs_skb_set_inner_protocol(skb, tpi->proto);
 }
 
 #endif /* CONFIG_NET_IPGRE_DEMUX */
diff --git a/datapath/linux/compat/ip_tunnels_core.c b/datapath/linux/compat/ip_tunnels_core.c
index ffe6add..c37db14 100644
--- a/datapath/linux/compat/ip_tunnels_core.c
+++ b/datapath/linux/compat/ip_tunnels_core.c
@@ -199,6 +199,5 @@ bool skb_is_encapsulated(struct sk_buff *skb)
 	/* checking for inner protocol should be sufficient on newer kernel, but
 	 * old kernel just set encapsulation bit.
 	 */
-	/* XXX: set inner protocol for all tunnel in OVS. */
 	return ovs_skb_get_inner_protocol(skb) || skb_encapsulation(skb);
 }
diff --git a/datapath/linux/compat/vxlan.c b/datapath/linux/compat/vxlan.c
index 9585c8d..c1632a7 100644
--- a/datapath/linux/compat/vxlan.c
+++ b/datapath/linux/compat/vxlan.c
@@ -268,6 +268,8 @@ int vxlan_xmit_skb(struct vxlan_sock *vs,
 	if (IS_ERR(skb))
 		return PTR_ERR(skb);
 
+	ovs_skb_set_inner_protocol(skb, htons(ETH_P_TEB));
+
 	return iptunnel_xmit(vs->sock->sk, rt, skb, src, dst, IPPROTO_UDP,
 			     tos, ttl, df, xnet);
 }
diff --git a/datapath/vport-lisp.c b/datapath/vport-lisp.c
index c7f8a9a..10369dc 100644
--- a/datapath/vport-lisp.c
+++ b/datapath/vport-lisp.c
@@ -499,6 +499,8 @@ static int lisp_send(struct vport *vport, struct sk_buff *skb)
 
 	skb->ignore_df = 1;
 
+	ovs_skb_set_inner_protocol(skb, skb->protocol);
+
 	df = tun_key->tun_flags & TUNNEL_DONT_FRAGMENT ? htons(IP_DF) : 0;
 	sent_len = iptunnel_xmit(skb->sk, rt, skb,
 			     saddr, tun_key->ipv4_dst,
-- 
1.9.1




More information about the dev mailing list