From 8a58ed57695b0fe20a583ea0ffe395a6ff3d57af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= Date: Thu, 20 Sep 2007 11:28:05 -0700 Subject: [PATCH] --- yaml --- r: 66673 b: refs/heads/master c: 0dde7b5404a3d52dcd9ce66d46197f6c3ca97dda h: refs/heads/master i: 66671: fac79d9f6ce54225d9d11f458a09c83073f1594c v: v3 --- [refs] | 2 +- trunk/net/ipv4/tcp_output.c | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 5b99882f6de9..f28387567378 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 1a09404a2338163f181d170c7abdc2242b6c6f03 +refs/heads/master: 0dde7b5404a3d52dcd9ce66d46197f6c3ca97dda diff --git a/trunk/net/ipv4/tcp_output.c b/trunk/net/ipv4/tcp_output.c index d65d17bb2a09..9df5b2a4da6e 100644 --- a/trunk/net/ipv4/tcp_output.c +++ b/trunk/net/ipv4/tcp_output.c @@ -692,6 +692,9 @@ int tcp_fragment(struct sock *sk, struct sk_buff *skb, u32 len, unsigned int mss TCP_SKB_CB(buff)->end_seq = TCP_SKB_CB(skb)->end_seq; TCP_SKB_CB(skb)->end_seq = TCP_SKB_CB(buff)->seq; + if (tp->sacked_out && (TCP_SKB_CB(skb)->seq == tp->highest_sack)) + tp->highest_sack = TCP_SKB_CB(buff)->seq; + /* PSH and FIN should only be set in the second packet. */ flags = TCP_SKB_CB(skb)->flags; TCP_SKB_CB(skb)->flags = flags & ~(TCPCB_FLAG_FIN|TCPCB_FLAG_PSH); @@ -1723,6 +1726,10 @@ static void tcp_retrans_try_collapse(struct sock *sk, struct sk_buff *skb, int m /* Update sequence range on original skb. */ TCP_SKB_CB(skb)->end_seq = TCP_SKB_CB(next_skb)->end_seq; + if (WARN_ON(tp->sacked_out && + (TCP_SKB_CB(next_skb)->seq == tp->highest_sack))) + return; + /* Merge over control information. */ flags |= TCP_SKB_CB(next_skb)->flags; /* This moves PSH/FIN etc. over */ TCP_SKB_CB(skb)->flags = flags;