No public description PiperOrigin-RevId: 676051976
diff --git a/quiche/quic/core/congestion_control/pacing_sender.cc b/quiche/quic/core/congestion_control/pacing_sender.cc index 687bf47..a705591 100644 --- a/quiche/quic/core/congestion_control/pacing_sender.cc +++ b/quiche/quic/core/congestion_control/pacing_sender.cc
@@ -23,6 +23,7 @@ PacingSender::PacingSender() : sender_(nullptr), max_pacing_rate_(QuicBandwidth::Zero()), + application_driven_pacing_rate_(QuicBandwidth::Infinite()), burst_tokens_(kInitialUnpacedBurst), ideal_next_packet_send_time_(QuicTime::Zero()), initial_burst_size_(kInitialUnpacedBurst),
diff --git a/quiche/quic/core/congestion_control/pacing_sender.h b/quiche/quic/core/congestion_control/pacing_sender.h index 214b2670..3461a39 100644 --- a/quiche/quic/core/congestion_control/pacing_sender.h +++ b/quiche/quic/core/congestion_control/pacing_sender.h
@@ -44,6 +44,19 @@ max_pacing_rate_ = max_pacing_rate; } + void set_application_driven_pacing_rate( + QuicBandwidth application_driven_pacing_rate) { + // Soft pacing suggestion from application layer. Experimental, see + // b/364614652 for more context. + + application_driven_pacing_rate_ = application_driven_pacing_rate; + sender_->SetApplicationDrivenPacingRate(application_driven_pacing_rate_); + } + + QuicBandwidth application_driven_pacing_rate() const { + return application_driven_pacing_rate_; + } + void set_remove_non_initial_burst() { remove_non_initial_burst_ = true; } QuicBandwidth max_pacing_rate() const { return max_pacing_rate_; } @@ -88,6 +101,12 @@ // If not QuicBandidth::Zero, the maximum rate the PacingSender will use. QuicBandwidth max_pacing_rate_; + // Keep track of the application driven pacing rate used by sender_. + // Experimental, see b/364614652 for more context. This signals application + // bandwidth needs to the underlying BBR sender, so that we can back off + // accordingly when congestion is detected. + QuicBandwidth application_driven_pacing_rate_; + // Number of unpaced packets to be sent before packets are delayed. uint32_t burst_tokens_; QuicTime ideal_next_packet_send_time_; // When can the next packet be sent.
diff --git a/quiche/quic/core/quic_connection.cc b/quiche/quic/core/quic_connection.cc index d569048..e705044 100644 --- a/quiche/quic/core/quic_connection.cc +++ b/quiche/quic/core/quic_connection.cc
@@ -663,6 +663,12 @@ sent_packet_manager_.SetMaxPacingRate(max_pacing_rate); } +void QuicConnection::SetApplicationDrivenPacingRate( + QuicBandwidth application_driven_pacing_rate) { + sent_packet_manager_.SetApplicationDrivenPacingRate( + application_driven_pacing_rate); +} + void QuicConnection::AdjustNetworkParameters( const SendAlgorithmInterface::NetworkParams& params) { sent_packet_manager_.AdjustNetworkParameters(params); @@ -687,6 +693,10 @@ return sent_packet_manager_.MaxPacingRate(); } +QuicBandwidth QuicConnection::ApplicationDrivenPacingRate() const { + return sent_packet_manager_.ApplicationDrivenPacingRate(); +} + bool QuicConnection::SelectMutualVersion( const ParsedQuicVersionVector& available_versions) { // Try to find the highest mutual version by iterating over supported
diff --git a/quiche/quic/core/quic_connection.h b/quiche/quic/core/quic_connection.h index 81a742d..3a7e534 100644 --- a/quiche/quic/core/quic_connection.h +++ b/quiche/quic/core/quic_connection.h
@@ -561,6 +561,15 @@ // Called by the Session when a max pacing rate for the connection is needed. virtual void SetMaxPacingRate(QuicBandwidth max_pacing_rate); + // Called by the Session when an application driven pacing rate for the + // connection is needed. Experimental, see b/364614652 for more context. + // This is only used by an experimental feature for bbr2_sender to support + // soft pacing based on application layer hints when there are signs of + // congestion. application_driven_pacing_rat| is the bandwidth that is + // considered sufficient for the application's need. + virtual void SetApplicationDrivenPacingRate( + QuicBandwidth application_driven_pacing_rate); + // Allows the client to adjust network parameters based on external // information. void AdjustNetworkParameters( @@ -577,6 +586,9 @@ // Returns the max pacing rate for the connection. virtual QuicBandwidth MaxPacingRate() const; + // Returns the application driven pacing rate for the connection. + virtual QuicBandwidth ApplicationDrivenPacingRate() const; + // Sends crypto handshake messages of length |write_length| to the peer in as // few packets as possible. Returns the number of bytes consumed from the // data.
diff --git a/quiche/quic/core/quic_sent_packet_manager.h b/quiche/quic/core/quic_sent_packet_manager.h index ce95b4d..faebd06 100644 --- a/quiche/quic/core/quic_sent_packet_manager.h +++ b/quiche/quic/core/quic_sent_packet_manager.h
@@ -151,6 +151,20 @@ pacing_sender_.set_max_pacing_rate(max_pacing_rate); } + // Experimental, see b/364614652 for more context. + // This is only used by an experimental feature for bbr2_sender to support + // soft pacing based on application layer hints when there are signs of + // congestion. + void SetApplicationDrivenPacingRate( + QuicBandwidth application_driven_pacing_rate) { + pacing_sender_.set_application_driven_pacing_rate( + application_driven_pacing_rate); + } + + QuicBandwidth ApplicationDrivenPacingRate() const { + return pacing_sender_.application_driven_pacing_rate(); + } + // The delay to use for the send alarm. If zero, it essentially means // to queue the send call immediately. // WARNING: This is currently an experimental API.
diff --git a/quiche/quic/test_tools/quic_test_utils.h b/quiche/quic/test_tools/quic_test_utils.h index df9fd66..0e9f020 100644 --- a/quiche/quic/test_tools/quic_test_utils.h +++ b/quiche/quic/test_tools/quic_test_utils.h
@@ -655,6 +655,11 @@ (const CachedNetworkParameters&, bool), (override)); MOCK_METHOD(void, SetMaxPacingRate, (QuicBandwidth), (override)); + MOCK_METHOD(void, SetApplicationDrivenPacingRate, (quic::QuicBandwidth), + (override)); + MOCK_METHOD(quic::QuicBandwidth, ApplicationDrivenPacingRate, (), + (const, override)); + MOCK_METHOD(void, OnStreamReset, (QuicStreamId, QuicRstStreamErrorCode), (override)); MOCK_METHOD(bool, SendControlFrame, (const QuicFrame& frame), (override));