| Index: net/quic/congestion_control/tcp_cubic_sender_bytes.cc
|
| diff --git a/net/quic/congestion_control/tcp_cubic_sender_bytes.cc b/net/quic/congestion_control/tcp_cubic_sender_bytes.cc
|
| index 863def3b366bd2b7bbf3576ef47e94fe1914c74c..7b0341d720f8acfa4ea693613cc1ee48671fe84d 100644
|
| --- a/net/quic/congestion_control/tcp_cubic_sender_bytes.cc
|
| +++ b/net/quic/congestion_control/tcp_cubic_sender_bytes.cc
|
| @@ -42,18 +42,25 @@ TcpCubicSenderBytes::TcpCubicSenderBytes(
|
| initial_tcp_congestion_window_(initial_tcp_congestion_window *
|
| kDefaultTCPMSS),
|
| initial_max_tcp_congestion_window_(max_congestion_window *
|
| - kDefaultTCPMSS) {}
|
| + kDefaultTCPMSS),
|
| + min_slow_start_exit_window_(min_congestion_window_) {}
|
|
|
| TcpCubicSenderBytes::~TcpCubicSenderBytes() {}
|
|
|
| void TcpCubicSenderBytes::SetCongestionWindowFromBandwidthAndRtt(
|
| QuicBandwidth bandwidth,
|
| QuicTime::Delta rtt) {
|
| - // Make sure CWND is in appropriate range (in case of bad data).
|
| QuicByteCount new_congestion_window = bandwidth.ToBytesPerPeriod(rtt);
|
| - congestion_window_ =
|
| - max(min(new_congestion_window, kMaxCongestionWindow * kDefaultTCPMSS),
|
| - kMinCongestionWindowForBandwidthResumption * kDefaultTCPMSS);
|
| + if (FLAGS_quic_no_lower_bw_resumption_limit) {
|
| + // Limit new CWND if needed.
|
| + congestion_window_ =
|
| + max(min_congestion_window_,
|
| + min(new_congestion_window, kMaxCongestionWindow * kDefaultTCPMSS));
|
| + } else {
|
| + congestion_window_ =
|
| + max(min(new_congestion_window, kMaxCongestionWindow * kDefaultTCPMSS),
|
| + kMinCongestionWindowForBandwidthResumption * kDefaultTCPMSS);
|
| + }
|
| }
|
|
|
| void TcpCubicSenderBytes::SetCongestionWindowInPackets(
|
| @@ -92,7 +99,7 @@ void TcpCubicSenderBytes::OnPacketLost(QuicPacketNumber packet_number,
|
| if (slow_start_large_reduction_) {
|
| // Reduce congestion window by lost_bytes for every loss.
|
| congestion_window_ =
|
| - max(congestion_window_ - lost_bytes, min_congestion_window_);
|
| + max(congestion_window_ - lost_bytes, min_slow_start_exit_window_);
|
| slowstart_threshold_ = congestion_window_;
|
| }
|
| }
|
| @@ -111,6 +118,10 @@ void TcpCubicSenderBytes::OnPacketLost(QuicPacketNumber packet_number,
|
| // TODO(jri): Separate out all of slow start into a separate class.
|
| if (slow_start_large_reduction_ && InSlowStart()) {
|
| DCHECK_LT(kDefaultTCPMSS, congestion_window_);
|
| + if (FLAGS_quic_sslr_limit_reduction &&
|
| + congestion_window_ >= 2 * initial_tcp_congestion_window_) {
|
| + min_slow_start_exit_window_ = congestion_window_ / 2;
|
| + }
|
| congestion_window_ = congestion_window_ - kDefaultTCPMSS;
|
| } else if (reno_) {
|
| congestion_window_ = congestion_window_ * RenoBeta();
|
| @@ -118,7 +129,6 @@ void TcpCubicSenderBytes::OnPacketLost(QuicPacketNumber packet_number,
|
| congestion_window_ =
|
| cubic_.CongestionWindowAfterPacketLoss(congestion_window_);
|
| }
|
| - // Enforce TCP's minimum congestion window of 2*MSS.
|
| if (congestion_window_ < min_congestion_window_) {
|
| congestion_window_ = min_congestion_window_;
|
| }
|
|
|