diff options
Diffstat (limited to 'net/ipv4')
-rw-r--r-- | net/ipv4/af_inet.c | 10 | ||||
-rw-r--r-- | net/ipv4/tcp.c | 16 | ||||
-rw-r--r-- | net/ipv4/tcp_ipv4.c | 2 |
3 files changed, 14 insertions, 14 deletions
diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c index 743f5542d65a..d6770f295d5b 100644 --- a/net/ipv4/af_inet.c +++ b/net/ipv4/af_inet.c | |||
@@ -1253,10 +1253,10 @@ static struct sk_buff **inet_gro_receive(struct sk_buff **head, | |||
1253 | int proto; | 1253 | int proto; |
1254 | int id; | 1254 | int id; |
1255 | 1255 | ||
1256 | if (unlikely(!pskb_may_pull(skb, sizeof(*iph)))) | 1256 | iph = skb_gro_header(skb, sizeof(*iph)); |
1257 | if (unlikely(!iph)) | ||
1257 | goto out; | 1258 | goto out; |
1258 | 1259 | ||
1259 | iph = ip_hdr(skb); | ||
1260 | proto = iph->protocol & (MAX_INET_PROTOS - 1); | 1260 | proto = iph->protocol & (MAX_INET_PROTOS - 1); |
1261 | 1261 | ||
1262 | rcu_read_lock(); | 1262 | rcu_read_lock(); |
@@ -1270,7 +1270,7 @@ static struct sk_buff **inet_gro_receive(struct sk_buff **head, | |||
1270 | if (unlikely(ip_fast_csum((u8 *)iph, iph->ihl))) | 1270 | if (unlikely(ip_fast_csum((u8 *)iph, iph->ihl))) |
1271 | goto out_unlock; | 1271 | goto out_unlock; |
1272 | 1272 | ||
1273 | flush = ntohs(iph->tot_len) != skb->len || | 1273 | flush = ntohs(iph->tot_len) != skb_gro_len(skb) || |
1274 | iph->frag_off != htons(IP_DF); | 1274 | iph->frag_off != htons(IP_DF); |
1275 | id = ntohs(iph->id); | 1275 | id = ntohs(iph->id); |
1276 | 1276 | ||
@@ -1298,8 +1298,8 @@ static struct sk_buff **inet_gro_receive(struct sk_buff **head, | |||
1298 | } | 1298 | } |
1299 | 1299 | ||
1300 | NAPI_GRO_CB(skb)->flush |= flush; | 1300 | NAPI_GRO_CB(skb)->flush |= flush; |
1301 | __skb_pull(skb, sizeof(*iph)); | 1301 | skb_gro_pull(skb, sizeof(*iph)); |
1302 | skb_reset_transport_header(skb); | 1302 | skb_set_transport_header(skb, skb_gro_offset(skb)); |
1303 | 1303 | ||
1304 | pp = ops->gro_receive(head, skb); | 1304 | pp = ops->gro_receive(head, skb); |
1305 | 1305 | ||
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 0cd71b84e483..1cd608253940 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
@@ -2481,19 +2481,19 @@ struct sk_buff **tcp_gro_receive(struct sk_buff **head, struct sk_buff *skb) | |||
2481 | unsigned int mss = 1; | 2481 | unsigned int mss = 1; |
2482 | int flush = 1; | 2482 | int flush = 1; |
2483 | 2483 | ||
2484 | if (!pskb_may_pull(skb, sizeof(*th))) | 2484 | th = skb_gro_header(skb, sizeof(*th)); |
2485 | if (unlikely(!th)) | ||
2485 | goto out; | 2486 | goto out; |
2486 | 2487 | ||
2487 | th = tcp_hdr(skb); | ||
2488 | thlen = th->doff * 4; | 2488 | thlen = th->doff * 4; |
2489 | if (thlen < sizeof(*th)) | 2489 | if (thlen < sizeof(*th)) |
2490 | goto out; | 2490 | goto out; |
2491 | 2491 | ||
2492 | if (!pskb_may_pull(skb, thlen)) | 2492 | th = skb_gro_header(skb, thlen); |
2493 | if (unlikely(!th)) | ||
2493 | goto out; | 2494 | goto out; |
2494 | 2495 | ||
2495 | th = tcp_hdr(skb); | 2496 | skb_gro_pull(skb, thlen); |
2496 | __skb_pull(skb, thlen); | ||
2497 | 2497 | ||
2498 | flags = tcp_flag_word(th); | 2498 | flags = tcp_flag_word(th); |
2499 | 2499 | ||
@@ -2521,10 +2521,10 @@ found: | |||
2521 | flush |= th->ack_seq != th2->ack_seq || th->window != th2->window; | 2521 | flush |= th->ack_seq != th2->ack_seq || th->window != th2->window; |
2522 | flush |= memcmp(th + 1, th2 + 1, thlen - sizeof(*th)); | 2522 | flush |= memcmp(th + 1, th2 + 1, thlen - sizeof(*th)); |
2523 | 2523 | ||
2524 | total = p->len; | 2524 | total = skb_gro_len(p); |
2525 | mss = skb_shinfo(p)->gso_size; | 2525 | mss = skb_shinfo(p)->gso_size; |
2526 | 2526 | ||
2527 | flush |= skb->len > mss || skb->len <= 0; | 2527 | flush |= skb_gro_len(skb) > mss || !skb_gro_len(skb); |
2528 | flush |= ntohl(th2->seq) + total != ntohl(th->seq); | 2528 | flush |= ntohl(th2->seq) + total != ntohl(th->seq); |
2529 | 2529 | ||
2530 | if (flush || skb_gro_receive(head, skb)) { | 2530 | if (flush || skb_gro_receive(head, skb)) { |
@@ -2537,7 +2537,7 @@ found: | |||
2537 | tcp_flag_word(th2) |= flags & (TCP_FLAG_FIN | TCP_FLAG_PSH); | 2537 | tcp_flag_word(th2) |= flags & (TCP_FLAG_FIN | TCP_FLAG_PSH); |
2538 | 2538 | ||
2539 | out_check_final: | 2539 | out_check_final: |
2540 | flush = skb->len < mss; | 2540 | flush = skb_gro_len(skb) < mss; |
2541 | flush |= flags & (TCP_FLAG_URG | TCP_FLAG_PSH | TCP_FLAG_RST | | 2541 | flush |= flags & (TCP_FLAG_URG | TCP_FLAG_PSH | TCP_FLAG_RST | |
2542 | TCP_FLAG_SYN | TCP_FLAG_FIN); | 2542 | TCP_FLAG_SYN | TCP_FLAG_FIN); |
2543 | 2543 | ||
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 19d7b429a262..f6b962f56ab4 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c | |||
@@ -2355,7 +2355,7 @@ struct sk_buff **tcp4_gro_receive(struct sk_buff **head, struct sk_buff *skb) | |||
2355 | 2355 | ||
2356 | switch (skb->ip_summed) { | 2356 | switch (skb->ip_summed) { |
2357 | case CHECKSUM_COMPLETE: | 2357 | case CHECKSUM_COMPLETE: |
2358 | if (!tcp_v4_check(skb->len, iph->saddr, iph->daddr, | 2358 | if (!tcp_v4_check(skb_gro_len(skb), iph->saddr, iph->daddr, |
2359 | skb->csum)) { | 2359 | skb->csum)) { |
2360 | skb->ip_summed = CHECKSUM_UNNECESSARY; | 2360 | skb->ip_summed = CHECKSUM_UNNECESSARY; |
2361 | break; | 2361 | break; |