mirror of
https://github.com/facebookincubator/mvfst.git
synced 2025-11-09 10:00:57 +03:00
Add additional transport parameters validation
Summary: Added code for remaining transport parameter validation. These errors are covered by these changes MUST send TRANSPORT_PARAMETER_ERROR if original_destination_connection_id is received [Transport 18.2] FAILED [2] MUST send TRANSPORT_PARAMETER_ERROR if preferred_address, is received [Transport 18.2] FAILED [3] MUST send TRANSPORT_PARAMETER_ERROR if retry_source_connection_id is received [Transport 18.2] FAILED [4] MUST send TRANSPORT_PARAMETER_ERROR if stateless_reset_token is received [Transport 18.2] FAILED [5] MUST send TRANSPORT_PARAMETER_ERROR if max_ack_delay >= 2^14 [Transport 7.4 and 18.2] FAILED [6] Reviewed By: yangchi Differential Revision: D28266216 fbshipit-source-id: f0e935f9158554c4a5b6922a8ee1453ebabfab25
This commit is contained in:
committed by
Facebook GitHub Bot
parent
8b03c992e0
commit
6683325105
@@ -433,6 +433,8 @@ constexpr uint16_t kDefaultRxPacketsBeforeAckAfterInit = 10;
|
||||
constexpr double kAckTimerFactor = 0.25;
|
||||
// max ack timeout: 25ms
|
||||
constexpr std::chrono::microseconds kMaxAckTimeout = 25000us;
|
||||
// max_ack_delay cannot be equal or greater that 2^14
|
||||
constexpr uint64_t kMaxAckDelay = 1ULL << 14;
|
||||
|
||||
constexpr uint64_t kAckPurgingThresh = 10;
|
||||
|
||||
|
||||
@@ -99,8 +99,17 @@ void setExperimentalSettings(QuicServerConnectionState& conn) {
|
||||
void processClientInitialParams(
|
||||
QuicServerConnectionState& conn,
|
||||
const ClientTransportParameters& clientParams) {
|
||||
// TODO validate that we didn't receive original connection ID, stateless
|
||||
// reset token, or preferred address.
|
||||
auto preferredAddress = getIntegerParameter(
|
||||
TransportParameterId::preferred_address, clientParams.parameters);
|
||||
auto origConnId = getIntegerParameter(
|
||||
TransportParameterId::original_destination_connection_id,
|
||||
clientParams.parameters);
|
||||
auto statelessResetToken = getIntegerParameter(
|
||||
TransportParameterId::stateless_reset_token, clientParams.parameters);
|
||||
auto retrySourceConnId = getIntegerParameter(
|
||||
TransportParameterId::retry_source_connection_id,
|
||||
clientParams.parameters);
|
||||
|
||||
auto maxData = getIntegerParameter(
|
||||
TransportParameterId::initial_max_data, clientParams.parameters);
|
||||
auto maxStreamDataBidiLocal = getIntegerParameter(
|
||||
@@ -136,6 +145,9 @@ void processClientInitialParams(
|
||||
clientParams.parameters);
|
||||
auto minAckDelay = getIntegerParameter(
|
||||
TransportParameterId::min_ack_delay, clientParams.parameters);
|
||||
auto maxAckDelay = getIntegerParameter(
|
||||
TransportParameterId::max_ack_delay, clientParams.parameters);
|
||||
|
||||
if (conn.version == QuicVersion::QUIC_DRAFT) {
|
||||
auto initialSourceConnId = getConnIdParameter(
|
||||
TransportParameterId::initial_source_connection_id,
|
||||
@@ -149,6 +161,38 @@ void processClientInitialParams(
|
||||
}
|
||||
}
|
||||
|
||||
// validate that we didn't receive original connection ID, stateless
|
||||
// reset token, or preferred address.
|
||||
if (preferredAddress && *preferredAddress != 0) {
|
||||
throw QuicTransportException(
|
||||
"Preferred Address is received by server",
|
||||
TransportErrorCode::TRANSPORT_PARAMETER_ERROR);
|
||||
}
|
||||
|
||||
if (origConnId && *origConnId != 0) {
|
||||
throw QuicTransportException(
|
||||
"OriginalDestinationConnectionId is received by server",
|
||||
TransportErrorCode::TRANSPORT_PARAMETER_ERROR);
|
||||
}
|
||||
|
||||
if (statelessResetToken && statelessResetToken.value() != 0) {
|
||||
throw QuicTransportException(
|
||||
"Stateless Reset Token is received by server",
|
||||
TransportErrorCode::TRANSPORT_PARAMETER_ERROR);
|
||||
}
|
||||
|
||||
if (retrySourceConnId && retrySourceConnId.value() != 0) {
|
||||
throw QuicTransportException(
|
||||
"Retry Source Connection ID is received by server",
|
||||
TransportErrorCode::TRANSPORT_PARAMETER_ERROR);
|
||||
}
|
||||
|
||||
if (maxAckDelay && *maxAckDelay >= kMaxAckDelay) {
|
||||
throw QuicTransportException(
|
||||
"Max Ack Delay is greater than 2^14 ",
|
||||
TransportErrorCode::TRANSPORT_PARAMETER_ERROR);
|
||||
}
|
||||
|
||||
// TODO Validate active_connection_id_limit
|
||||
if (packetSize && *packetSize < kMinMaxUDPPayload) {
|
||||
throw QuicTransportException(
|
||||
|
||||
Reference in New Issue
Block a user