Skip to content

Commit

Permalink
gro: Fix handling of complete checksums in IPv6
Browse files Browse the repository at this point in the history
We need to perform skb_postpull_rcsum after pulling the IPv6
header in order to maintain the correctness of the complete
checksum.

This patch also adds a missing iph reload after pulling.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Herbert Xu authored and David S. Miller committed Jan 20, 2009
1 parent 0d1cfd2 commit ebad18e
Showing 1 changed file with 7 additions and 0 deletions.
7 changes: 7 additions & 0 deletions net/ipv6/af_inet6.c
Original file line number Diff line number Diff line change
Expand Up @@ -797,6 +797,7 @@ static struct sk_buff **ipv6_gro_receive(struct sk_buff **head,
unsigned int nlen;
int flush = 1;
int proto;
__wsum csum;

if (unlikely(!pskb_may_pull(skb, sizeof(*iph))))
goto out;
Expand All @@ -808,6 +809,7 @@ static struct sk_buff **ipv6_gro_receive(struct sk_buff **head,

rcu_read_lock();
proto = ipv6_gso_pull_exthdrs(skb, iph->nexthdr);
iph = ipv6_hdr(skb);
IPV6_GRO_CB(skb)->proto = proto;
ops = rcu_dereference(inet6_protos[proto]);
if (!ops || !ops->gro_receive)
Expand Down Expand Up @@ -839,8 +841,13 @@ 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));

pp = ops->gro_receive(head, skb);

skb->csum = csum;

out_unlock:
rcu_read_unlock();

Expand Down

0 comments on commit ebad18e

Please sign in to comment.