diff options
Diffstat (limited to 'net/ipv4/af_inet.c')
-rw-r--r-- | net/ipv4/af_inet.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c index 170689681aa2..644cc5535319 100644 --- a/net/ipv4/af_inet.c +++ b/net/ipv4/af_inet.c | |||
@@ -1246,13 +1246,20 @@ static struct sk_buff **inet_gro_receive(struct sk_buff **head, | |||
1246 | struct sk_buff **pp = NULL; | 1246 | struct sk_buff **pp = NULL; |
1247 | struct sk_buff *p; | 1247 | struct sk_buff *p; |
1248 | struct iphdr *iph; | 1248 | struct iphdr *iph; |
1249 | unsigned int hlen; | ||
1250 | unsigned int off; | ||
1249 | int flush = 1; | 1251 | int flush = 1; |
1250 | int proto; | 1252 | int proto; |
1251 | int id; | 1253 | int id; |
1252 | 1254 | ||
1253 | iph = skb_gro_header(skb, sizeof(*iph)); | 1255 | off = skb_gro_offset(skb); |
1254 | if (unlikely(!iph)) | 1256 | hlen = off + sizeof(*iph); |
1255 | goto out; | 1257 | iph = skb_gro_header_fast(skb, off); |
1258 | if (skb_gro_header_hard(skb, hlen)) { | ||
1259 | iph = skb_gro_header_slow(skb, hlen, off); | ||
1260 | if (unlikely(!iph)) | ||
1261 | goto out; | ||
1262 | } | ||
1256 | 1263 | ||
1257 | proto = iph->protocol & (MAX_INET_PROTOS - 1); | 1264 | proto = iph->protocol & (MAX_INET_PROTOS - 1); |
1258 | 1265 | ||