Index: net/quic/core/quic_sent_packet_manager.cc |
diff --git a/net/quic/core/quic_sent_packet_manager.cc b/net/quic/core/quic_sent_packet_manager.cc |
index 5b9026de419546db081a8d3f710aac5d0c6daccd..8cd4824671ce1c72d629327bead1fc86a9db5ff8 100644 |
--- a/net/quic/core/quic_sent_packet_manager.cc |
+++ b/net/quic/core/quic_sent_packet_manager.cc |
@@ -42,9 +42,6 @@ static const int64_t kMinHandshakeTimeoutMs = 10; |
// per draft RFC draft-dukkipati-tcpm-tcp-loss-probe. |
static const size_t kDefaultMaxTailLossProbes = 2; |
-// Number of unpaced packets to send after quiescence. |
-static const size_t kInitialUnpacedBurst = 10; |
- |
bool HasCryptoHandshake(const TransmissionInfo& transmission_info) { |
DCHECK(!transmission_info.has_crypto_handshake || |
!transmission_info.retransmittable_frames.empty()); |
@@ -73,12 +70,6 @@ QuicSentPacketManager::QuicSentPacketManager( |
debug_delegate_(nullptr), |
network_change_visitor_(nullptr), |
initial_congestion_window_(kInitialCongestionWindow), |
- send_algorithm_( |
- SendAlgorithmInterface::Create(clock, |
- &rtt_stats_, |
- congestion_control_type, |
- stats, |
- initial_congestion_window_)), |
loss_algorithm_(&general_loss_algorithm_), |
general_loss_algorithm_(loss_type), |
n_connection_simulation_(false), |
@@ -96,7 +87,9 @@ QuicSentPacketManager::QuicSentPacketManager( |
undo_pending_retransmits_(false), |
largest_newly_acked_(0), |
largest_mtu_acked_(0), |
- handshake_confirmed_(false) {} |
+ handshake_confirmed_(false) { |
+ SetSendAlgorithm(congestion_control_type); |
+} |
QuicSentPacketManager::~QuicSentPacketManager() {} |
@@ -117,26 +110,20 @@ void QuicSentPacketManager::SetFromConfig(const QuicConfig& config) { |
// TODO(ianswett): BBR is currently a server only feature. |
if (FLAGS_quic_allow_bbr && config.HasReceivedConnectionOptions() && |
ContainsQuicTag(config.ReceivedConnectionOptions(), kTBBR)) { |
- send_algorithm_.reset(SendAlgorithmInterface::Create( |
- clock_, &rtt_stats_, kBBR, stats_, initial_congestion_window_)); |
+ SetSendAlgorithm(kBBR); |
} |
if (config.HasReceivedConnectionOptions() && |
ContainsQuicTag(config.ReceivedConnectionOptions(), kRENO)) { |
if (ContainsQuicTag(config.ReceivedConnectionOptions(), kBYTE)) { |
- send_algorithm_.reset(SendAlgorithmInterface::Create( |
- clock_, &rtt_stats_, kRenoBytes, stats_, initial_congestion_window_)); |
+ SetSendAlgorithm(kRenoBytes); |
} else { |
- send_algorithm_.reset(SendAlgorithmInterface::Create( |
- clock_, &rtt_stats_, kReno, stats_, initial_congestion_window_)); |
+ SetSendAlgorithm(kReno); |
} |
} else if (config.HasReceivedConnectionOptions() && |
ContainsQuicTag(config.ReceivedConnectionOptions(), kBYTE)) { |
- send_algorithm_.reset(SendAlgorithmInterface::Create( |
- clock_, &rtt_stats_, kCubicBytes, stats_, initial_congestion_window_)); |
- } |
- if (!FLAGS_quic_disable_pacing_for_perf_tests) { |
- EnablePacing(); |
+ SetSendAlgorithm(kCubicBytes); |
} |
+ using_pacing_ = !FLAGS_quic_disable_pacing_for_perf_tests; |
if (config.HasClientSentConnectionOption(k1CON, perspective_)) { |
send_algorithm_->SetNumEmulatedConnections(1); |
@@ -195,10 +182,7 @@ void QuicSentPacketManager::SetNumOpenStreams(size_t num_streams) { |
} |
void QuicSentPacketManager::SetMaxPacingRate(QuicBandwidth max_pacing_rate) { |
- if (using_pacing_) { |
- static_cast<PacingSender*>(send_algorithm_.get()) |
- ->SetMaxPacingRate(max_pacing_rate); |
- } |
+ pacing_sender_.set_max_pacing_rate(max_pacing_rate); |
} |
void QuicSentPacketManager::SetHandshakeConfirmed() { |
@@ -283,8 +267,13 @@ void QuicSentPacketManager::MaybeInvokeCongestionEvent( |
if (!rtt_updated && packets_acked_.empty() && packets_lost_.empty()) { |
return; |
} |
- send_algorithm_->OnCongestionEvent(rtt_updated, bytes_in_flight, |
+ if (using_pacing_) { |
+ pacing_sender_.OnCongestionEvent(rtt_updated, bytes_in_flight, |
packets_acked_, packets_lost_); |
+ } else { |
+ send_algorithm_->OnCongestionEvent(rtt_updated, bytes_in_flight, |
+ packets_acked_, packets_lost_); |
+ } |
packets_acked_.clear(); |
packets_lost_.clear(); |
if (network_change_visitor_ != nullptr) { |
@@ -560,10 +549,16 @@ bool QuicSentPacketManager::OnPacketSent( |
--pending_timer_transmission_count_; |
} |
- // TODO(ianswett): Remove sent_time, because it's unused. |
- const bool in_flight = send_algorithm_->OnPacketSent( |
- sent_time, unacked_packets_.bytes_in_flight(), packet_number, |
- serialized_packet->encrypted_length, has_retransmittable_data); |
+ bool in_flight; |
+ if (using_pacing_) { |
+ in_flight = pacing_sender_.OnPacketSent( |
+ sent_time, unacked_packets_.bytes_in_flight(), packet_number, |
+ serialized_packet->encrypted_length, has_retransmittable_data); |
+ } else { |
+ in_flight = send_algorithm_->OnPacketSent( |
+ sent_time, unacked_packets_.bytes_in_flight(), packet_number, |
+ serialized_packet->encrypted_length, has_retransmittable_data); |
+ } |
unacked_packets_.AddSentPacket(serialized_packet, original_packet_number, |
transmission_type, sent_time, in_flight); |
@@ -774,6 +769,9 @@ QuicTime::Delta QuicSentPacketManager::TimeUntilSend(QuicTime now, |
// send algorithm does not need to be consulted. |
if (pending_timer_transmission_count_ > 0) { |
delay = QuicTime::Delta::Zero(); |
+ } else if (using_pacing_) { |
+ delay = |
+ pacing_sender_.TimeUntilSend(now, unacked_packets_.bytes_in_flight()); |
} else { |
delay = |
send_algorithm_->TimeUntilSend(now, unacked_packets_.bytes_in_flight()); |
@@ -926,19 +924,17 @@ void QuicSentPacketManager::CancelRetransmissionsForStream( |
} |
} |
-void QuicSentPacketManager::EnablePacing() { |
- // TODO(ianswett): Replace with a method which wraps the send algorithm in a |
- // pacer every time a new algorithm is set. |
- if (using_pacing_) { |
- return; |
- } |
+void QuicSentPacketManager::SetSendAlgorithm( |
+ CongestionControlType congestion_control_type) { |
+ SetSendAlgorithm(SendAlgorithmInterface::Create( |
+ clock_, &rtt_stats_, congestion_control_type, stats_, |
+ initial_congestion_window_)); |
+} |
- // Set up a pacing sender with a 1 millisecond alarm granularity, the same as |
- // the default granularity of the Linux kernel's FQ qdisc. |
- using_pacing_ = true; |
- send_algorithm_.reset(new PacingSender(send_algorithm_.release(), |
- QuicTime::Delta::FromMilliseconds(1), |
- kInitialUnpacedBurst)); |
+void QuicSentPacketManager::SetSendAlgorithm( |
+ SendAlgorithmInterface* send_algorithm) { |
+ send_algorithm_.reset(send_algorithm); |
+ pacing_sender_.set_sender(send_algorithm); |
} |
void QuicSentPacketManager::OnConnectionMigration(QuicPathId, |