diff options
Diffstat (limited to 'net/ipv6')
-rw-r--r-- | net/ipv6/af_inet6.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c index 61f55386a236..b6215be0963f 100644 --- a/net/ipv6/af_inet6.c +++ b/net/ipv6/af_inet6.c | |||
@@ -817,13 +817,20 @@ static struct sk_buff **ipv6_gro_receive(struct sk_buff **head, | |||
817 | struct sk_buff *p; | 817 | struct sk_buff *p; |
818 | struct ipv6hdr *iph; | 818 | struct ipv6hdr *iph; |
819 | unsigned int nlen; | 819 | unsigned int nlen; |
820 | unsigned int hlen; | ||
821 | unsigned int off; | ||
820 | int flush = 1; | 822 | int flush = 1; |
821 | int proto; | 823 | int proto; |
822 | __wsum csum; | 824 | __wsum csum; |
823 | 825 | ||
824 | iph = skb_gro_header(skb, sizeof(*iph)); | 826 | off = skb_gro_offset(skb); |
825 | if (unlikely(!iph)) | 827 | hlen = off + sizeof(*iph); |
826 | goto out; | 828 | iph = skb_gro_header_fast(skb, off); |
829 | if (skb_gro_header_hard(skb, hlen)) { | ||
830 | iph = skb_gro_header_slow(skb, hlen, off); | ||
831 | if (unlikely(!iph)) | ||
832 | goto out; | ||
833 | } | ||
827 | 834 | ||
828 | skb_gro_pull(skb, sizeof(*iph)); | 835 | skb_gro_pull(skb, sizeof(*iph)); |
829 | skb_set_transport_header(skb, skb_gro_offset(skb)); | 836 | skb_set_transport_header(skb, skb_gro_offset(skb)); |