diff options
Diffstat (limited to 'net/ipv6/af_inet6.c')
-rw-r--r-- | net/ipv6/af_inet6.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c index 94f74f5b0cbf..c802bc1658a8 100644 --- a/net/ipv6/af_inet6.c +++ b/net/ipv6/af_inet6.c | |||
@@ -797,6 +797,7 @@ static struct sk_buff **ipv6_gro_receive(struct sk_buff **head, | |||
797 | unsigned int nlen; | 797 | unsigned int nlen; |
798 | int flush = 1; | 798 | int flush = 1; |
799 | int proto; | 799 | int proto; |
800 | __wsum csum; | ||
800 | 801 | ||
801 | if (unlikely(!pskb_may_pull(skb, sizeof(*iph)))) | 802 | if (unlikely(!pskb_may_pull(skb, sizeof(*iph)))) |
802 | goto out; | 803 | goto out; |
@@ -808,6 +809,7 @@ static struct sk_buff **ipv6_gro_receive(struct sk_buff **head, | |||
808 | 809 | ||
809 | rcu_read_lock(); | 810 | rcu_read_lock(); |
810 | proto = ipv6_gso_pull_exthdrs(skb, iph->nexthdr); | 811 | proto = ipv6_gso_pull_exthdrs(skb, iph->nexthdr); |
812 | iph = ipv6_hdr(skb); | ||
811 | IPV6_GRO_CB(skb)->proto = proto; | 813 | IPV6_GRO_CB(skb)->proto = proto; |
812 | ops = rcu_dereference(inet6_protos[proto]); | 814 | ops = rcu_dereference(inet6_protos[proto]); |
813 | if (!ops || !ops->gro_receive) | 815 | if (!ops || !ops->gro_receive) |
@@ -839,8 +841,13 @@ static struct sk_buff **ipv6_gro_receive(struct sk_buff **head, | |||
839 | 841 | ||
840 | NAPI_GRO_CB(skb)->flush |= flush; | 842 | NAPI_GRO_CB(skb)->flush |= flush; |
841 | 843 | ||
844 | csum = skb->csum; | ||
845 | skb_postpull_rcsum(skb, iph, skb_network_header_len(skb)); | ||
846 | |||
842 | pp = ops->gro_receive(head, skb); | 847 | pp = ops->gro_receive(head, skb); |
843 | 848 | ||
849 | skb->csum = csum; | ||
850 | |||
844 | out_unlock: | 851 | out_unlock: |
845 | rcu_read_unlock(); | 852 | rcu_read_unlock(); |
846 | 853 | ||