ipv6: gro: fix CHECKSUM_COMPLETE support
When GRE support was added in linux-3.14, CHECKSUM_COMPLETE handling
broke on GRE+IPv6 because we did not update/use the appropriate csum :
GRO layer is supposed to use/update NAPI_GRO_CB(skb)->csum instead of
skb->csum
Tested using a GRE tunnel and IPv6 traffic. GRO aggregation now happens
at the first level (ethernet device) instead of being done in gre
tunnel. Native IPv6+TCP is still properly aggregated.
Fixes: bf5a755f5e
("net-gre-gro: Add GRE support to the GRO stack")
Signed-off-by: Eric Dumazet <edumazet@google.com>
Cc: Jerry Chu <hkchu@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
bf63ac73b3
commit
4de462ab63
|
@ -196,7 +196,6 @@ static struct sk_buff **ipv6_gro_receive(struct sk_buff **head,
|
|||
unsigned int off;
|
||||
u16 flush = 1;
|
||||
int proto;
|
||||
__wsum csum;
|
||||
|
||||
off = skb_gro_offset(skb);
|
||||
hlen = off + sizeof(*iph);
|
||||
|
@ -264,13 +263,10 @@ static struct sk_buff **ipv6_gro_receive(struct sk_buff **head,
|
|||
|
||||
NAPI_GRO_CB(skb)->flush |= flush;
|
||||
|
||||
csum = skb->csum;
|
||||
skb_postpull_rcsum(skb, iph, skb_network_header_len(skb));
|
||||
skb_gro_postpull_rcsum(skb, iph, nlen);
|
||||
|
||||
pp = ops->callbacks.gro_receive(head, skb);
|
||||
|
||||
skb->csum = csum;
|
||||
|
||||
out_unlock:
|
||||
rcu_read_unlock();
|
||||
|
||||
|
|
|
@ -42,7 +42,7 @@ static struct sk_buff **tcp6_gro_receive(struct sk_buff **head,
|
|||
if (NAPI_GRO_CB(skb)->flush)
|
||||
goto skip_csum;
|
||||
|
||||
wsum = skb->csum;
|
||||
wsum = NAPI_GRO_CB(skb)->csum;
|
||||
|
||||
switch (skb->ip_summed) {
|
||||
case CHECKSUM_NONE:
|
||||
|
|
Loading…
Reference in New Issue