gre: Set inner protocol in v4 and v6 GRE transmit
authorTom Herbert <therbert@google.com>
Tue, 30 Sep 2014 03:22:32 +0000 (20:22 -0700)
committerDavid S. Miller <davem@davemloft.net>
Thu, 2 Oct 2014 01:35:51 +0000 (21:35 -0400)
Call skb_set_inner_protocol to set inner Ethernet protocol to
protocol being encapsulation by GRE before tunnel_xmit. This is
needed for GSO if UDP encapsulation (fou) is being done.

Signed-off-by: Tom Herbert <therbert@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv4/ip_gre.c
net/ipv6/ip6_gre.c

index 829aff8bf723a5bb0250237889ea6e739943b8c7..0485ef18d254205fe621d504a1ac294cb8f33480 100644 (file)
@@ -241,6 +241,8 @@ static void __gre_xmit(struct sk_buff *skb, struct net_device *dev,
        /* Push GRE header. */
        gre_build_header(skb, &tpi, tunnel->tun_hlen);
 
+       skb_set_inner_protocol(skb, tpi.proto);
+
        ip_tunnel_xmit(skb, dev, tnl_params, tnl_params->protocol);
 }
 
index 5f19dfbc4c6a4039ae2a22eb065bed6d46565d83..9a0a1aafe7272808640edd2df9ea17f65c97bdb9 100644 (file)
@@ -616,6 +616,7 @@ static netdev_tx_t ip6gre_xmit2(struct sk_buff *skb,
        int err = -1;
        u8 proto;
        struct sk_buff *new_skb;
+       __be16 protocol;
 
        if (dev->type == ARPHRD_ETHER)
                IPCB(skb)->flags = 0;
@@ -732,8 +733,9 @@ static netdev_tx_t ip6gre_xmit2(struct sk_buff *skb,
        ipv6h->daddr = fl6->daddr;
 
        ((__be16 *)(ipv6h + 1))[0] = tunnel->parms.o_flags;
-       ((__be16 *)(ipv6h + 1))[1] = (dev->type == ARPHRD_ETHER) ?
-                                  htons(ETH_P_TEB) : skb->protocol;
+       protocol = (dev->type == ARPHRD_ETHER) ?
+                   htons(ETH_P_TEB) : skb->protocol;
+       ((__be16 *)(ipv6h + 1))[1] = protocol;
 
        if (tunnel->parms.o_flags&(GRE_KEY|GRE_CSUM|GRE_SEQ)) {
                __be32 *ptr = (__be32 *)(((u8 *)ipv6h) + tunnel->hlen - 4);
@@ -754,6 +756,8 @@ static netdev_tx_t ip6gre_xmit2(struct sk_buff *skb,
                }
        }
 
+       skb_set_inner_protocol(skb, protocol);
+
        ip6tunnel_xmit(skb, dev);
        if (ndst)
                ip6_tnl_dst_store(tunnel, ndst);