ipip: Properly mark ipip GRO packets as encapsulated.
authorJesse Gross <jesse@kernel.org>
Sat, 19 Mar 2016 16:32:00 +0000 (09:32 -0700)
committerDavid S. Miller <davem@davemloft.net>
Sun, 20 Mar 2016 20:33:39 +0000 (16:33 -0400)
ipip encapsulated packets can be merged together by GRO but the result
does not have the proper GSO type set or even marked as being
encapsulated at all. Later retransmission of these packets will likely
fail if the device does not support ipip offloads. This is similar to
the issue resolved in IPv6 sit in feec0cb3
("ipv6: gro: support sit protocol").

Reported-by: Patrick Boutilier <boutilpj@ednet.ns.ca>
Fixes: 9667e9bb ("ipip: Add gro callbacks to ipip offload")
Tested-by: Patrick Boutilier <boutilpj@ednet.ns.ca>
Acked-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: Jesse Gross <jesse@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv4/af_inet.c

index 0cc923f83e107b429521ef809a5a308c06680e7e..965923325535213568eb6937d9c482b54e45a3cc 100644 (file)
@@ -1448,6 +1448,13 @@ out_unlock:
        return err;
 }
 
+static int ipip_gro_complete(struct sk_buff *skb, int nhoff)
+{
+       skb->encapsulation = 1;
+       skb_shinfo(skb)->gso_type |= SKB_GSO_IPIP;
+       return inet_gro_complete(skb, nhoff);
+}
+
 int inet_ctl_sock_create(struct sock **sk, unsigned short family,
                         unsigned short type, unsigned char protocol,
                         struct net *net)
@@ -1676,7 +1683,7 @@ static const struct net_offload ipip_offload = {
        .callbacks = {
                .gso_segment    = inet_gso_segment,
                .gro_receive    = inet_gro_receive,
-               .gro_complete   = inet_gro_complete,
+               .gro_complete   = ipip_gro_complete,
        },
 };