tcp: fix bogus RTT for CC when retransmissions are acked
Since retransmitted segments are not used for RTT estimation, previously SACKed segments present in the rtx queue are used. This estimation can be several times larger than the actual RTT. When a cumulative ack covers both previously SACKed and retransmitted segments, CC may thus get a bogus RTT. Such segments previously had an RTT estimation in tcp_sacktag_one(), so it seems reasonable to not reuse them in tcp_clean_rtx_queue() at all. Afaik, this has had no effect on SRTT/RTO because of Karn's check. Signed-off-by: Kenneth Klette Jonassen <kennetkl@ifi.uio.no> Acked-by: Neal Cardwell <ncardwell@google.com> Tested-by: Neal Cardwell <ncardwell@google.com> Acked-by: Yuchung Cheng <ycheng@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
4577139b2d
Коммит
3d0d26c797
|
@ -3099,17 +3099,15 @@ static int tcp_clean_rtx_queue(struct sock *sk, int prior_fackets,
|
|||
if (sacked & TCPCB_SACKED_RETRANS)
|
||||
tp->retrans_out -= acked_pcount;
|
||||
flag |= FLAG_RETRANS_DATA_ACKED;
|
||||
} else {
|
||||
} else if (!(sacked & TCPCB_SACKED_ACKED)) {
|
||||
last_ackt = skb->skb_mstamp;
|
||||
WARN_ON_ONCE(last_ackt.v64 == 0);
|
||||
if (!first_ackt.v64)
|
||||
first_ackt = last_ackt;
|
||||
|
||||
if (!(sacked & TCPCB_SACKED_ACKED)) {
|
||||
reord = min(pkts_acked, reord);
|
||||
if (!after(scb->end_seq, tp->high_seq))
|
||||
flag |= FLAG_ORIG_SACK_ACKED;
|
||||
}
|
||||
reord = min(pkts_acked, reord);
|
||||
if (!after(scb->end_seq, tp->high_seq))
|
||||
flag |= FLAG_ORIG_SACK_ACKED;
|
||||
}
|
||||
|
||||
if (sacked & TCPCB_SACKED_ACKED)
|
||||
|
|
Загрузка…
Ссылка в новой задаче