aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv6
diff options
context:
space:
mode:
Diffstat (limited to 'net/ipv6')
-rw-r--r--net/ipv6/af_inet6.c13
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));