Index: net/quic/congestion_control/tcp_cubic_sender.cc |
diff --git a/net/quic/congestion_control/tcp_cubic_sender.cc b/net/quic/congestion_control/tcp_cubic_sender.cc |
index 2378eeb179101946ab0499295c4d9bf6f9d06f7f..8abedc827ed64157eb2ee40a1d9fa62cc0255b99 100644 |
--- a/net/quic/congestion_control/tcp_cubic_sender.cc |
+++ b/net/quic/congestion_control/tcp_cubic_sender.cc |
@@ -138,6 +138,8 @@ void TcpCubicSender::OnPacketAcked( |
QuicByteCount bytes_in_flight) { |
largest_acked_sequence_number_ = max(acked_sequence_number, |
largest_acked_sequence_number_); |
+ // As soon as a packet is acked, ensure we're no longer in RTO mode. |
+ previous_congestion_window_ = 0; |
if (InRecovery()) { |
// PRR is used when in recovery. |
prr_.OnPacketAcked(acked_bytes); |
@@ -345,6 +347,10 @@ void TcpCubicSender::OnRetransmissionTimeout(bool packets_retransmitted) { |
} |
cubic_.Reset(); |
hybrid_slow_start_.Restart(); |
+ // Only reduce ssthresh once over multiple retransmissions. |
+ if (previous_congestion_window_ != 0) { |
+ return; |
+ } |
previous_slowstart_threshold_ = slowstart_threshold_; |
slowstart_threshold_ = congestion_window_ / 2; |
previous_congestion_window_ = congestion_window_; |