Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

net: gre: Implement LCO for GRE over IPv4

parent 06f62292
Loading
Loading
Loading
Loading
+13 −3
Original line number Diff line number Diff line
@@ -440,6 +440,17 @@ static int gre_rcv(struct sk_buff *skb)
	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);
}