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;
|
constexpr double kAckTimerFactor = 0.25;
|
||||||
// max ack timeout: 25ms
|
// max ack timeout: 25ms
|
||||||
constexpr std::chrono::microseconds kMaxAckTimeout = 25000us;
|
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;
|
constexpr uint64_t kAckPurgingThresh = 10;
|
||||||
|
|
||||||
|
|||||||
@@ -99,8 +99,17 @@ void setExperimentalSettings(QuicServerConnectionState& conn) {
|
|||||||
void processClientInitialParams(
|
void processClientInitialParams(
|
||||||
QuicServerConnectionState& conn,
|
QuicServerConnectionState& conn,
|
||||||
const ClientTransportParameters& clientParams) {
|
const ClientTransportParameters& clientParams) {
|
||||||
// TODO validate that we didn't receive original connection ID, stateless
|
auto preferredAddress = getIntegerParameter(
|
||||||
// reset token, or preferred address.
|
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(
|
auto maxData = getIntegerParameter(
|
||||||
TransportParameterId::initial_max_data, clientParams.parameters);
|
TransportParameterId::initial_max_data, clientParams.parameters);
|
||||||
auto maxStreamDataBidiLocal = getIntegerParameter(
|
auto maxStreamDataBidiLocal = getIntegerParameter(
|
||||||
@@ -136,6 +145,9 @@ void processClientInitialParams(
|
|||||||
clientParams.parameters);
|
clientParams.parameters);
|
||||||
auto minAckDelay = getIntegerParameter(
|
auto minAckDelay = getIntegerParameter(
|
||||||
TransportParameterId::min_ack_delay, clientParams.parameters);
|
TransportParameterId::min_ack_delay, clientParams.parameters);
|
||||||
|
auto maxAckDelay = getIntegerParameter(
|
||||||
|
TransportParameterId::max_ack_delay, clientParams.parameters);
|
||||||
|
|
||||||
if (conn.version == QuicVersion::QUIC_DRAFT) {
|
if (conn.version == QuicVersion::QUIC_DRAFT) {
|
||||||
auto initialSourceConnId = getConnIdParameter(
|
auto initialSourceConnId = getConnIdParameter(
|
||||||
TransportParameterId::initial_source_connection_id,
|
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
|
// TODO Validate active_connection_id_limit
|
||||||
if (packetSize && *packetSize < kMinMaxUDPPayload) {
|
if (packetSize && *packetSize < kMinMaxUDPPayload) {
|
||||||
throw QuicTransportException(
|
throw QuicTransportException(
|
||||||
|
|||||||
Reference in New Issue
Block a user