gfe-relnote: Allow connection option LRTT to be set for BBRv1 and BBQ2 to be set set for BBRv1 and BBRv2. Refactor only, not protected.
PiperOrigin-RevId: 309735417
Change-Id: I7c111a10ad3e7fcd3e319e8b3fd202176f0fde2b
diff --git a/quic/core/congestion_control/bbr2_sender.cc b/quic/core/congestion_control/bbr2_sender.cc
index 65c4f16..8c0171b 100644
--- a/quic/core/congestion_control/bbr2_sender.cc
+++ b/quic/core/congestion_control/bbr2_sender.cc
@@ -108,13 +108,6 @@
if (config.HasClientRequestedIndependentOption(kB2RP, perspective)) {
params_.avoid_unnecessary_probe_rtt = false;
}
- if (GetQuicReloadableFlag(quic_bbr2_lower_startup_cwnd_gain) &&
- config.HasClientRequestedIndependentOption(kBBQ2, perspective)) {
- QUIC_RELOADABLE_FLAG_COUNT(quic_bbr2_lower_startup_cwnd_gain);
- // 2 is the lower, derived gain for CWND.
- params_.startup_cwnd_gain = 2;
- params_.drain_cwnd_gain = 2;
- }
if (GetQuicReloadableFlag(quic_bbr2_avoid_too_low_probe_bw_cwnd) &&
config.HasClientRequestedIndependentOption(kB2CL, perspective)) {
params_.avoid_too_low_probe_bw_cwnd = false;
@@ -134,6 +127,18 @@
QUIC_RELOADABLE_FLAG_COUNT(quic_bbr2_ignore_inflight_lo);
params_.ignore_inflight_lo = true;
}
+
+ ApplyConnectionOptions(config.ClientRequestedIndependentOptions(perspective));
+}
+
+void Bbr2Sender::ApplyConnectionOptions(
+ const QuicTagVector& connection_options) {
+ if (GetQuicReloadableFlag(quic_bbr2_lower_startup_cwnd_gain) &&
+ ContainsQuicTag(connection_options, kBBQ2)) {
+ // 2 is the lower, derived gain for CWND.
+ params_.startup_cwnd_gain = 2;
+ params_.drain_cwnd_gain = 2;
+ }
}
Limits<QuicByteCount> Bbr2Sender::GetCwndLimitsByMode() const {
diff --git a/quic/core/congestion_control/bbr2_sender.h b/quic/core/congestion_control/bbr2_sender.h
index d68a6a1..60824cd 100644
--- a/quic/core/congestion_control/bbr2_sender.h
+++ b/quic/core/congestion_control/bbr2_sender.h
@@ -50,6 +50,8 @@
void SetFromConfig(const QuicConfig& config,
Perspective perspective) override;
+ void ApplyConnectionOptions(const QuicTagVector& connection_options) override;
+
void AdjustNetworkParameters(const NetworkParams& params) override;
void SetInitialCongestionWindowInPackets(
@@ -173,8 +175,8 @@
QuicRandom* random_;
QuicConnectionStats* connection_stats_;
- // Don't use it directly outside of SetFromConfig. Instead, use params() to
- // get read-only access.
+ // Don't use it directly outside of SetFromConfig and ApplyConnectionOptions.
+ // Instead, use params() to get read-only access.
Bbr2Params params_;
Bbr2NetworkModel model_;
diff --git a/quic/core/congestion_control/bbr_sender.cc b/quic/core/congestion_control/bbr_sender.cc
index ec51dee..f150ec1 100644
--- a/quic/core/congestion_control/bbr_sender.cc
+++ b/quic/core/congestion_control/bbr_sender.cc
@@ -259,9 +259,6 @@
void BbrSender::SetFromConfig(const QuicConfig& config,
Perspective perspective) {
- if (config.HasClientRequestedIndependentOption(kLRTT, perspective)) {
- exit_startup_on_loss_ = true;
- }
if (config.HasClientRequestedIndependentOption(k1RTT, perspective)) {
num_startup_rtts_ = 1;
}
@@ -303,9 +300,6 @@
set_high_cwnd_gain(kDerivedHighGain);
set_drain_gain(1.f / kDerivedHighGain);
}
- if (config.HasClientRequestedIndependentOption(kBBQ2, perspective)) {
- set_high_cwnd_gain(kDerivedHighCWNDGain);
- }
if (config.HasClientRequestedIndependentOption(kBBQ3, perspective)) {
enable_ack_aggregation_during_startup_ = true;
}
@@ -326,6 +320,18 @@
quic_avoid_overestimate_bandwidth_with_aggregation, 3, 4);
sampler_.EnableOverestimateAvoidance();
}
+
+ ApplyConnectionOptions(config.ClientRequestedIndependentOptions(perspective));
+}
+
+void BbrSender::ApplyConnectionOptions(
+ const QuicTagVector& connection_options) {
+ if (ContainsQuicTag(connection_options, kLRTT)) {
+ exit_startup_on_loss_ = true;
+ }
+ if (ContainsQuicTag(connection_options, kBBQ2)) {
+ set_high_cwnd_gain(kDerivedHighCWNDGain);
+ }
}
void BbrSender::AdjustNetworkParameters(const NetworkParams& params) {
diff --git a/quic/core/congestion_control/bbr_sender.h b/quic/core/congestion_control/bbr_sender.h
index 8000f17..c7285d7 100644
--- a/quic/core/congestion_control/bbr_sender.h
+++ b/quic/core/congestion_control/bbr_sender.h
@@ -106,6 +106,7 @@
void SetFromConfig(const QuicConfig& config,
Perspective perspective) override;
+ void ApplyConnectionOptions(const QuicTagVector& connection_options) override;
void AdjustNetworkParameters(const NetworkParams& params) override;
void SetInitialCongestionWindowInPackets(
diff --git a/quic/core/congestion_control/send_algorithm_interface.h b/quic/core/congestion_control/send_algorithm_interface.h
index 2bfc2df..ea0c375 100644
--- a/quic/core/congestion_control/send_algorithm_interface.h
+++ b/quic/core/congestion_control/send_algorithm_interface.h
@@ -86,6 +86,9 @@
virtual void SetFromConfig(const QuicConfig& config,
Perspective perspective) = 0;
+ virtual void ApplyConnectionOptions(
+ const QuicTagVector& connection_options) = 0;
+
// Sets the initial congestion window in number of packets. May be ignored
// if called after the initial congestion window is no longer relevant.
virtual void SetInitialCongestionWindowInPackets(QuicPacketCount packets) = 0;
diff --git a/quic/core/congestion_control/tcp_cubic_sender_bytes.h b/quic/core/congestion_control/tcp_cubic_sender_bytes.h
index 7a36f76..59ca7f8 100644
--- a/quic/core/congestion_control/tcp_cubic_sender_bytes.h
+++ b/quic/core/congestion_control/tcp_cubic_sender_bytes.h
@@ -46,6 +46,8 @@
// Start implementation of SendAlgorithmInterface.
void SetFromConfig(const QuicConfig& config,
Perspective perspective) override;
+ void ApplyConnectionOptions(
+ const QuicTagVector& /*connection_options*/) override {}
void AdjustNetworkParameters(const NetworkParams& params) override;
void SetNumEmulatedConnections(int num_connections);
void SetInitialCongestionWindowInPackets(
diff --git a/quic/core/quic_config.cc b/quic/core/quic_config.cc
index a06e698..5cd0061 100644
--- a/quic/core/quic_config.cc
+++ b/quic/core/quic_config.cc
@@ -590,6 +590,19 @@
ContainsQuicTag(client_connection_options_.GetSendValues(), tag));
}
+const QuicTagVector& QuicConfig::ClientRequestedIndependentOptions(
+ Perspective perspective) const {
+ static const QuicTagVector* no_options = new QuicTagVector;
+ if (perspective == Perspective::IS_SERVER) {
+ return HasReceivedConnectionOptions() ? ReceivedConnectionOptions()
+ : *no_options;
+ }
+
+ return client_connection_options_.HasSendValues()
+ ? client_connection_options_.GetSendValues()
+ : *no_options;
+}
+
void QuicConfig::SetIdleNetworkTimeout(QuicTime::Delta idle_network_timeout) {
idle_network_timeout_seconds_.set(
static_cast<uint32_t>(idle_network_timeout.ToSeconds()),
diff --git a/quic/core/quic_config.h b/quic/core/quic_config.h
index 0009cda..4caba41 100644
--- a/quic/core/quic_config.h
+++ b/quic/core/quic_config.h
@@ -333,6 +333,9 @@
bool HasClientRequestedIndependentOption(QuicTag tag,
Perspective perspective) const;
+ const QuicTagVector& ClientRequestedIndependentOptions(
+ Perspective perspective) const;
+
void SetIdleNetworkTimeout(QuicTime::Delta idle_network_timeout);
QuicTime::Delta IdleNetworkTimeout() const;
diff --git a/quic/core/quic_connection.cc b/quic/core/quic_connection.cc
index 45ce52a..a3dc325 100644
--- a/quic/core/quic_connection.cc
+++ b/quic/core/quic_connection.cc
@@ -482,6 +482,11 @@
}
}
+void QuicConnection::ApplyConnectionOptions(
+ const QuicTagVector& connection_options) {
+ sent_packet_manager_.ApplyConnectionOptions(connection_options);
+}
+
void QuicConnection::OnSendConnectionState(
const CachedNetworkParameters& cached_network_params) {
if (debug_visitor_ != nullptr) {
diff --git a/quic/core/quic_connection.h b/quic/core/quic_connection.h
index 82c354d..f516e52 100644
--- a/quic/core/quic_connection.h
+++ b/quic/core/quic_connection.h
@@ -383,6 +383,12 @@
// Sets connection parameters from the supplied |config|.
void SetFromConfig(const QuicConfig& config);
+ // Apply |connection_options| for this connection. Unlike SetFromConfig, this
+ // can happen at anytime in the life of a connection.
+ // Note there is no guarantee that all options can be applied. Components will
+ // only apply cherrypicked options that make sense at the time of the call.
+ void ApplyConnectionOptions(const QuicTagVector& connection_options);
+
// Called by the session when sending connection state to the client.
virtual void OnSendConnectionState(
const CachedNetworkParameters& cached_network_params);
diff --git a/quic/core/quic_sent_packet_manager.cc b/quic/core/quic_sent_packet_manager.cc
index 512632d..108fbf3 100644
--- a/quic/core/quic_sent_packet_manager.cc
+++ b/quic/core/quic_sent_packet_manager.cc
@@ -295,6 +295,11 @@
}
}
+void QuicSentPacketManager::ApplyConnectionOptions(
+ const QuicTagVector& connection_options) {
+ send_algorithm_->ApplyConnectionOptions(connection_options);
+}
+
void QuicSentPacketManager::ResumeConnectionState(
const CachedNetworkParameters& cached_network_params,
bool max_bandwidth_resumption) {
diff --git a/quic/core/quic_sent_packet_manager.h b/quic/core/quic_sent_packet_manager.h
index 54cf737..8407fbb 100644
--- a/quic/core/quic_sent_packet_manager.h
+++ b/quic/core/quic_sent_packet_manager.h
@@ -120,6 +120,8 @@
virtual void SetFromConfig(const QuicConfig& config);
+ void ApplyConnectionOptions(const QuicTagVector& connection_options);
+
// Pass the CachedNetworkParameters to the send algorithm.
void ResumeConnectionState(
const CachedNetworkParameters& cached_network_params,