Commit 53936107 authored by Edward Cree's avatar Edward Cree Committed by David S. Miller

net: gre: Implement LCO for GRE over IPv4

Signed-off-by: default avatarEdward Cree <ecree@solarflare.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 06f62292
...@@ -440,6 +440,17 @@ static int gre_rcv(struct sk_buff *skb) ...@@ -440,6 +440,17 @@ static int gre_rcv(struct sk_buff *skb)
return 0; 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, static void build_header(struct sk_buff *skb, int hdr_len, __be16 flags,
__be16 proto, __be32 key, __be32 seq) __be16 proto, __be32 key, __be32 seq)
{ {
...@@ -467,8 +478,7 @@ static void build_header(struct sk_buff *skb, int hdr_len, __be16 flags, ...@@ -467,8 +478,7 @@ static void build_header(struct sk_buff *skb, int hdr_len, __be16 flags,
!(skb_shinfo(skb)->gso_type & !(skb_shinfo(skb)->gso_type &
(SKB_GSO_GRE | SKB_GSO_GRE_CSUM))) { (SKB_GSO_GRE | SKB_GSO_GRE_CSUM))) {
*ptr = 0; *ptr = 0;
*(__sum16 *)ptr = csum_fold(skb_checksum(skb, 0, *(__sum16 *)ptr = gre_checksum(skb);
skb->len, 0));
} }
} }
} }
...@@ -493,7 +503,7 @@ static void __gre_xmit(struct sk_buff *skb, struct net_device *dev, ...@@ -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, static struct sk_buff *gre_handle_offloads(struct sk_buff *skb,
bool csum) bool csum)
{ {
return iptunnel_handle_offloads(skb, csum, return iptunnel_handle_offloads(skb, false,
csum ? SKB_GSO_GRE_CSUM : SKB_GSO_GRE); csum ? SKB_GSO_GRE_CSUM : SKB_GSO_GRE);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment