diff --git a/quic/client/state/ClientStateMachine.cpp b/quic/client/state/ClientStateMachine.cpp index d00ffbe13..6e944744c 100644 --- a/quic/client/state/ClientStateMachine.cpp +++ b/quic/client/state/ClientStateMachine.cpp @@ -85,6 +85,9 @@ void processServerInitialParams( auto partialReliability = getIntegerParameter( static_cast(kPartialReliabilityParameterId), serverParams.parameters); + auto activeConnectionIdLimit = getIntegerParameter( + TransportParameterId::active_connection_id_limit, + serverParams.parameters); if (!packetSize || *packetSize == 0) { packetSize = kDefaultMaxUDPPayload; @@ -132,6 +135,9 @@ void processServerInitialParams( conn.udpSendPacketLen = *packetSize; } + conn.peerActiveConnectionIdLimit = + activeConnectionIdLimit.value_or(kDefaultConnectionIdLimit); + if (partialReliability && *partialReliability != 0 && conn.transportSettings.partialReliabilityEnabled) { conn.partialReliabilityEnabled = true; diff --git a/quic/codec/QuicConnectionId.h b/quic/codec/QuicConnectionId.h index c18a16ded..4fd92205c 100644 --- a/quic/codec/QuicConnectionId.h +++ b/quic/codec/QuicConnectionId.h @@ -28,6 +28,8 @@ constexpr size_t kMinInitialDestinationConnIdLength = 8; // set conn id version at the first 4 bits constexpr uint8_t kShortVersionId = 0x1; +constexpr uint64_t kDefaultConnectionIdLimit = 0; + struct ConnectionId { uint8_t* data(); diff --git a/quic/handshake/TransportParameters.h b/quic/handshake/TransportParameters.h index ab8c2c7ed..46f085a6d 100644 --- a/quic/handshake/TransportParameters.h +++ b/quic/handshake/TransportParameters.h @@ -30,6 +30,7 @@ enum class TransportParameterId : uint16_t { max_ack_delay = 0x000b, disable_migration = 0x000c, preferred_address = 0x000d, + active_connection_id_limit = 0x000e }; struct TransportParameter { diff --git a/quic/server/state/ServerStateMachine.cpp b/quic/server/state/ServerStateMachine.cpp index 2c8b165c5..ce9a07bfc 100644 --- a/quic/server/state/ServerStateMachine.cpp +++ b/quic/server/state/ServerStateMachine.cpp @@ -110,6 +110,10 @@ void processClientInitialParams( auto partialReliability = getIntegerParameter( static_cast(kPartialReliabilityParameterId), clientParams.parameters); + auto activeConnectionIdLimit = getIntegerParameter( + TransportParameterId::active_connection_id_limit, + clientParams.parameters); + if (!packetSize || *packetSize == 0) { packetSize = kDefaultMaxUDPPayload; } @@ -154,6 +158,9 @@ void processClientInitialParams( conn.udpSendPacketLen = *packetSize; } + conn.peerActiveConnectionIdLimit = + activeConnectionIdLimit.value_or(kDefaultConnectionIdLimit); + if (partialReliability && *partialReliability != 0 && conn.transportSettings.partialReliabilityEnabled) { conn.partialReliabilityEnabled = true; diff --git a/quic/state/StateData.h b/quic/state/StateData.h index 54521b97d..b84665d77 100644 --- a/quic/state/StateData.h +++ b/quic/state/StateData.h @@ -479,6 +479,8 @@ struct QuicConnectionStateBase { // Time at which the connection started. TimePoint connectionTime; + uint64_t peerActiveConnectionIdLimit{kDefaultConnectionIdLimit}; + // The current connection id. This will eventually be negotiated // with the peer. folly::Optional clientConnectionId;