Index: net/quic/quic_sent_packet_manager.cc |
diff --git a/net/quic/quic_sent_packet_manager.cc b/net/quic/quic_sent_packet_manager.cc |
index c0041978a2fd498319dc1a88dc3d7e7482f25ee5..553e7e2f69a188ed7a7c2bb78c34323ab5741cf7 100644 |
--- a/net/quic/quic_sent_packet_manager.cc |
+++ b/net/quic/quic_sent_packet_manager.cc |
@@ -78,6 +78,7 @@ QuicSentPacketManager::QuicSentPacketManager( |
congestion_control_type, |
stats)), |
loss_algorithm_(LossDetectionInterface::Create(loss_type)), |
+ receive_buffer_bytes_(kDefaultSocketReceiveBuffer), |
least_packet_awaited_by_peer_(1), |
first_rto_transmission_(0), |
consecutive_rto_count_(0), |
@@ -103,7 +104,8 @@ void QuicSentPacketManager::SetFromConfig(const QuicConfig& config) { |
config.GetInitialRoundTripTimeUsToSend())); |
} |
// TODO(ianswett): BBR is currently a server only feature. |
- if (config.HasReceivedConnectionOptions() && |
+ if (FLAGS_quic_allow_bbr && |
+ config.HasReceivedConnectionOptions() && |
ContainsQuicTag(config.ReceivedConnectionOptions(), kTBBR)) { |
if (FLAGS_quic_recent_min_rtt_window_s > 0) { |
rtt_stats_.set_recent_min_rtt_window( |
@@ -123,10 +125,18 @@ void QuicSentPacketManager::SetFromConfig(const QuicConfig& config) { |
if (HasClientSentConnectionOption(config, k1CON)) { |
send_algorithm_->SetNumEmulatedConnections(1); |
} |
+ if (HasClientSentConnectionOption(config, kNTLP)) { |
+ max_tail_loss_probes_ = 0; |
+ } |
if (config.HasReceivedConnectionOptions() && |
ContainsQuicTag(config.ReceivedConnectionOptions(), kTIME)) { |
loss_algorithm_.reset(LossDetectionInterface::Create(kTime)); |
} |
+ if (config.HasReceivedSocketReceiveBuffer()) { |
+ receive_buffer_bytes_ = |
+ max(kMinSocketReceiveBuffer, |
+ static_cast<QuicByteCount>(config.ReceivedSocketReceiveBuffer())); |
+ } |
send_algorithm_->SetFromConfig(config, is_server_); |
if (network_change_visitor_ != nullptr) { |
@@ -664,8 +674,9 @@ QuicSentPacketManager::RetransmissionTimeoutMode |
void QuicSentPacketManager::OnIncomingQuicCongestionFeedbackFrame( |
const QuicCongestionFeedbackFrame& frame, |
const QuicTime& feedback_receive_time) { |
- send_algorithm_->OnIncomingQuicCongestionFeedbackFrame( |
- frame, feedback_receive_time); |
+ if (frame.type == kTCP) { |
+ receive_buffer_bytes_ = frame.tcp.receive_window; |
+ } |
} |
void QuicSentPacketManager::InvokeLossDetection(QuicTime time) { |
@@ -730,6 +741,9 @@ QuicTime::Delta QuicSentPacketManager::TimeUntilSend( |
if (pending_timer_transmission_count_ > 0) { |
return QuicTime::Delta::Zero(); |
} |
+ if (unacked_packets_.bytes_in_flight() >= receive_buffer_bytes_) { |
+ return QuicTime::Delta::Infinite(); |
+ } |
return send_algorithm_->TimeUntilSend( |
now, unacked_packets_.bytes_in_flight(), retransmittable); |
} |