Enable QUIC Path Degraded Experiment. The experiment controls how many PTOs are allowed before a path becomes degraded. Protected by QUIC connection options. PiperOrigin-RevId: 766276642
diff --git a/quiche/quic/core/crypto/crypto_protocol.h b/quiche/quic/core/crypto/crypto_protocol.h index c1bf0db..5435e4d 100644 --- a/quiche/quic/core/crypto/crypto_protocol.h +++ b/quiche/quic/core/crypto/crypto_protocol.h
@@ -520,6 +520,11 @@ // Fix timeouts experiment. DEFINE_STATIC_QUIC_TAG(FTOE); +// Path degradation experiments. +DEFINE_STATIC_QUIC_TAG(PDE2); // 2 PTOs for path degradation. +DEFINE_STATIC_QUIC_TAG(PDE3); // 3 PTOs for path degradation. +DEFINE_STATIC_QUIC_TAG(PDE5); // 5 PTOs for path degradation. + #undef DEFINE_STATIC_QUIC_TAG // These tags have a special form so that they appear either at the beginning
diff --git a/quiche/quic/core/quic_sent_packet_manager.cc b/quiche/quic/core/quic_sent_packet_manager.cc index ac1cc36..cdb6dde 100644 --- a/quiche/quic/core/quic_sent_packet_manager.cc +++ b/quiche/quic/core/quic_sent_packet_manager.cc
@@ -218,6 +218,17 @@ if (config.HasClientSentConnectionOption(kRNIB, perspective)) { pacing_sender_.set_remove_non_initial_burst(); } + // Path degradation experiments + if (config.HasClientRequestedIndependentOption(kPDE2, perspective)) { + num_ptos_for_path_degrading_ = 2; + } + if (config.HasClientRequestedIndependentOption(kPDE3, perspective)) { + num_ptos_for_path_degrading_ = 3; + } + // kPDE4 is the default. We have the experiments with kPDE4. + if (config.HasClientRequestedIndependentOption(kPDE5, perspective)) { + num_ptos_for_path_degrading_ = 5; + } send_algorithm_->SetFromConfig(config, perspective); loss_algorithm_->SetFromConfig(config, perspective);
diff --git a/quiche/quic/core/quic_sent_packet_manager_test.cc b/quiche/quic/core/quic_sent_packet_manager_test.cc index f325d58..ca83497 100644 --- a/quiche/quic/core/quic_sent_packet_manager_test.cc +++ b/quiche/quic/core/quic_sent_packet_manager_test.cc
@@ -3556,6 +3556,30 @@ ENCRYPTION_FORWARD_SECURE, ecn_counts)); } +// Test that the path degrading delay is set correctly when the path degrading +// connection option is set. +TEST_F(QuicSentPacketManagerTest, GetPathDegradingDelayUsingPTO) { + QuicConfig client_config; + QuicTagVector all_path_dergradation_options = {kPDE2, kPDE3, kPDE5}; + uint8_t pto_count = 2; + for (QuicTag current_dergradation_option : all_path_dergradation_options) { + QuicTagVector client_options; + client_options.push_back(current_dergradation_option); + QuicSentPacketManagerPeer::SetPerspective(&manager_, + Perspective::IS_CLIENT); + client_config.SetClientConnectionOptions(client_options); + EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); + EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); + manager_.SetFromConfig(client_config); + QuicTime::Delta expected_delay = pto_count * manager_.GetPtoDelay(); + EXPECT_EQ(expected_delay, manager_.GetPathDegradingDelay()); + pto_count++; + if (pto_count == 4) { + pto_count++; + } + } +} + } // namespace } // namespace test } // namespace quic