net: gre: Implement LCO for GRE over IPv4
authorEdward Cree <ecree@solarflare.com>
Thu, 11 Feb 2016 21:01:07 +0000 (21:01 +0000)
committerDavid S. Miller <davem@davemloft.net>
Fri, 12 Feb 2016 10:52:16 +0000 (05:52 -0500)
Signed-off-by: Edward Cree <ecree@solarflare.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv4/ip_gre.c

index 7c51c4e1661f9aafc63829cf58b3b5ec28ed859e..9b31532d95f4a3b50ee76ce0ef022c3e4589c49d 100644 (file)
@@ -440,6 +440,17 @@ drop:
        return 0;
 }
 
+static __sum16 gre_checksum(struct sk_buff *skb)
+{
+       __wsum csum;
+
+       if (skb->ip_summed == CHECKSUM_PARTIAL)
+               csum = lco_csum(skb);
+       else
+               csum = skb_checksum(skb, 0, skb->len, 0);
+       return csum_fold(csum);
+}
+
 static void build_header(struct sk_buff *skb, int hdr_len, __be16 flags,
                         __be16 proto, __be32 key, __be32 seq)
 {
@@ -467,8 +478,7 @@ static void build_header(struct sk_buff *skb, int hdr_len, __be16 flags,
                    !(skb_shinfo(skb)->gso_type &
                      (SKB_GSO_GRE | SKB_GSO_GRE_CSUM))) {
                        *ptr = 0;
-                       *(__sum16 *)ptr = csum_fold(skb_checksum(skb, 0,
-                                                                skb->len, 0));
+                       *(__sum16 *)ptr = gre_checksum(skb);
                }
        }
 }
@@ -493,7 +503,7 @@ static void __gre_xmit(struct sk_buff *skb, struct net_device *dev,
 static struct sk_buff *gre_handle_offloads(struct sk_buff *skb,
                                           bool csum)
 {
-       return iptunnel_handle_offloads(skb, csum,
+       return iptunnel_handle_offloads(skb, false,
                                        csum ? SKB_GSO_GRE_CSUM : SKB_GSO_GRE);
 }