diff options
-rw-r--r-- | net/ipv4/tcp_input.c | 28 |
1 files changed, 11 insertions, 17 deletions
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index ba34a23c1bfb..2bdb0da237e6 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
@@ -4481,26 +4481,20 @@ drop: | |||
4481 | __skb_queue_after(&tp->out_of_order_queue, skb1, skb); | 4481 | __skb_queue_after(&tp->out_of_order_queue, skb1, skb); |
4482 | 4482 | ||
4483 | /* And clean segments covered by new one as whole. */ | 4483 | /* And clean segments covered by new one as whole. */ |
4484 | if (skb1 && !skb_queue_is_last(&tp->out_of_order_queue, skb1)) { | 4484 | while (!skb_queue_is_last(&tp->out_of_order_queue, skb)) { |
4485 | struct sk_buff *n; | 4485 | skb1 = skb_queue_next(&tp->out_of_order_queue, skb); |
4486 | 4486 | ||
4487 | skb1 = skb_queue_next(&tp->out_of_order_queue, skb1); | 4487 | if (!after(end_seq, TCP_SKB_CB(skb1)->seq)) |
4488 | skb_queue_walk_from_safe(&tp->out_of_order_queue, | 4488 | break; |
4489 | skb1, n) { | 4489 | if (before(end_seq, TCP_SKB_CB(skb1)->end_seq)) { |
4490 | if (!after(end_seq, TCP_SKB_CB(skb1)->seq)) | ||
4491 | break; | ||
4492 | if (before(end_seq, | ||
4493 | TCP_SKB_CB(skb1)->end_seq)) { | ||
4494 | tcp_dsack_extend(sk, | ||
4495 | TCP_SKB_CB(skb1)->seq, | ||
4496 | end_seq); | ||
4497 | break; | ||
4498 | } | ||
4499 | __skb_unlink(skb1, &tp->out_of_order_queue); | ||
4500 | tcp_dsack_extend(sk, TCP_SKB_CB(skb1)->seq, | 4490 | tcp_dsack_extend(sk, TCP_SKB_CB(skb1)->seq, |
4501 | TCP_SKB_CB(skb1)->end_seq); | 4491 | end_seq); |
4502 | __kfree_skb(skb1); | 4492 | break; |
4503 | } | 4493 | } |
4494 | __skb_unlink(skb1, &tp->out_of_order_queue); | ||
4495 | tcp_dsack_extend(sk, TCP_SKB_CB(skb1)->seq, | ||
4496 | TCP_SKB_CB(skb1)->end_seq); | ||
4497 | __kfree_skb(skb1); | ||
4504 | } | 4498 | } |
4505 | 4499 | ||
4506 | add_sack: | 4500 | add_sack: |