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 <je...@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 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev