1
0
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:
Arvind Srinivasan
2021-05-08 09:25:48 -07:00
committed by Facebook GitHub Bot
parent 8b03c992e0
commit 6683325105
2 changed files with 48 additions and 2 deletions

View File

@@ -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;

View File

@@ -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(