Control client-side MinAckDelay option with AFIA connection option.
PiperOrigin-RevId: 778564306
diff --git a/quiche/quic/core/crypto/crypto_protocol.h b/quiche/quic/core/crypto/crypto_protocol.h
index 9d1dbe2..c8dd332 100644
--- a/quiche/quic/core/crypto/crypto_protocol.h
+++ b/quiche/quic/core/crypto/crypto_protocol.h
@@ -217,6 +217,8 @@
// AckFrequencyFrame.
DEFINE_STATIC_QUIC_TAG(AFF2); // Send AckFrequencyFrame upon
// handshake completion.
+DEFINE_STATIC_QUIC_TAG(AFIA); // Send MinAckDelay transport parameter to allow
+ // receipt of ACK_FREQUENCY and IMMEDIATE_ACK
DEFINE_STATIC_QUIC_TAG(SSLR); // Slow Start Large Reduction.
DEFINE_STATIC_QUIC_TAG(NPRR); // Pace at unity instead of PRR
DEFINE_STATIC_QUIC_TAG(5RTO); // Close connection on 5 RTOs
diff --git a/quiche/quic/core/quic_session.cc b/quiche/quic/core/quic_session.cc
index be6aa0a..17743e5 100644
--- a/quiche/quic/core/quic_session.cc
+++ b/quiche/quic/core/quic_session.cc
@@ -179,6 +179,10 @@
} else if (config_.HasClientSentConnectionOption(kCHP2, perspective_)) {
config_.SetDiscardLengthToSend(kDefaultMaxPacketSize * 2);
}
+ if (config_.HasClientRequestedIndependentOption(kAFIA, perspective_) &&
+ connection_->version().HasIetfQuicFrames()) {
+ config_.SetMinAckDelayDraft10Ms(kDefaultMinAckDelayTimeMs);
+ }
} else if (GetQuicReloadableFlag(quic_receive_ack_frequency) &&
connection_->version().HasIetfQuicFrames()) {
config_.SetMinAckDelayDraft10Ms(kDefaultMinAckDelayTimeMs);
diff --git a/quiche/quic/core/quic_session_test.cc b/quiche/quic/core/quic_session_test.cc
index 3ae99ee..30480eb 100644
--- a/quiche/quic/core/quic_session_test.cc
+++ b/quiche/quic/core/quic_session_test.cc
@@ -2453,6 +2453,17 @@
EXPECT_TRUE(session_.CanOpenNextOutgoingBidirectionalStream());
}
+TEST_P(QuicSessionTestClient, MinAckDelaySet) {
+ // IETF QUIC only feature.
+ if (!VersionHasIetfQuicFrames(transport_version())) {
+ return;
+ }
+ session_.config()->SetClientConnectionOptions({kAFIA});
+ session_.Initialize();
+ EXPECT_EQ(session_.config()->GetMinAckDelayDraft10ToSendMs(),
+ kDefaultMinAckDelayTimeMs);
+}
+
TEST_P(QuicSessionTestServer, ZombieStreams) {
CompleteHandshake();
TestStream* stream2 = session_.CreateOutgoingBidirectionalStream();