[ovs-dev] [PATCH 08/14] datapath: Consistently set skb->inner_protocol for tunnels.

Jesse Gross jesse at nicira.com
Thu Feb 19 03:02:18 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 02551fb..f382f1c 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
 
diff --git a/datapath/linux/compat/ip_tunnels_core.c b/datapath/linux/compat/ip_tunnels_core.c
index 22ee0dd..ffebfb8 100644
--- a/datapath/linux/compat/ip_tunnels_core.c
+++ b/datapath/linux/compat/ip_tunnels_core.c
@@ -147,6 +147,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 d6626b3..d47195e 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