diff --git a/quic/server/state/ServerStateMachine.cpp b/quic/server/state/ServerStateMachine.cpp index ef712911f..8a169b000 100644 --- a/quic/server/state/ServerStateMachine.cpp +++ b/quic/server/state/ServerStateMachine.cpp @@ -1601,6 +1601,13 @@ std::vector setSupportedExtensionTransportParameters( customTransportParams.push_back(receiveTimestampsExponent.encode()); } + if (ts.minAckDelay) { + CustomIntegralTransportParameter minAckDelay( + static_cast(TransportParameterId::min_ack_delay), + ts.minAckDelay.value().count()); + customTransportParams.push_back(minAckDelay.encode()); + } + if (ts.advertisedKnobFrameSupport) { CustomIntegralTransportParameter knobFrameSupport( static_cast(TransportParameterId::knob_frames_supported), 1); diff --git a/quic/server/test/ServerStateMachineTest.cpp b/quic/server/test/ServerStateMachineTest.cpp index 31143fbaf..d0eea6c61 100644 --- a/quic/server/test/ServerStateMachineTest.cpp +++ b/quic/server/test/ServerStateMachineTest.cpp @@ -16,6 +16,7 @@ #include #include #include +#include using namespace testing; @@ -229,6 +230,55 @@ TEST(ServerStateMachineTest, TestProcessMaxDatagramSizeZeroOk) { EXPECT_EQ(serverConn.datagramState.maxWriteFrameSize, 0); } +TEST(ServerStateMachineTest, TestProcessMinAckDelayNotSet) { + QuicServerConnectionState serverConn( + FizzServerQuicHandshakeContext::Builder().build()); + std::vector transportParams; + ClientTransportParameters clientTransportParams = { + std::move(transportParams)}; + processClientInitialParams(serverConn, clientTransportParams); + EXPECT_FALSE(serverConn.peerAdvertisedKnobFrameSupport); +} + +TEST(ServerStateMachineTest, TestProcessMinAckDelaySet) { + QuicServerConnectionState serverConn( + FizzServerQuicHandshakeContext::Builder().build()); + std::vector transportParams; + transportParams.push_back( + encodeIntegerParameter(TransportParameterId::min_ack_delay, 1000)); + ClientTransportParameters clientTransportParams = { + std::move(transportParams)}; + processClientInitialParams(serverConn, clientTransportParams); + ASSERT_TRUE(serverConn.peerMinAckDelay.has_value()); + ASSERT_EQ( + serverConn.peerMinAckDelay.value(), std::chrono::microseconds(1000)); +} + +TEST(ServerStateMachineTest, TestEncodeMinAckDelayParamSet) { + QuicServerConnectionState serverConn( + FizzServerQuicHandshakeContext::Builder().build()); + serverConn.transportSettings.minAckDelay = std::chrono::microseconds(1000); + auto customTransportParams = + quic::setSupportedExtensionTransportParameters(serverConn); + auto minAckDelayParam = getIntegerParameter( + TransportParameterId::min_ack_delay, customTransportParams); + ASSERT_TRUE(minAckDelayParam.has_value()); + EXPECT_EQ(minAckDelayParam.value(), 1000); +} + +TEST(ServerStateMachineTest, TestEncodeMinAckDelayParamNotSet) { + QuicServerConnectionState serverConn( + FizzServerQuicHandshakeContext::Builder().build()); + serverConn.transportSettings.advertisedKnobFrameSupport = false; + auto customTransportParams = + quic::setSupportedExtensionTransportParameters(serverConn); + EXPECT_THAT( + customTransportParams, + Not(Contains(testing::Field( + &TransportParameter::parameter, + testing::Eq(TransportParameterId::min_ack_delay))))); +} + TEST(ServerStateMachineTest, TestProcessKnobFramesSupportedParamEnabled) { QuicServerConnectionState serverConn( FizzServerQuicHandshakeContext::Builder().build());