quic/server/handshake/ServerTransportParametersExtension.h (116 lines of code) (raw):
/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
#pragma once
#include <fizz/server/ServerExtensions.h>
#include <quic/fizz/handshake/FizzTransportParameters.h>
#include <quic/server/handshake/StatelessResetGenerator.h>
namespace quic {
class ServerTransportParametersExtension : public fizz::ServerExtensions {
public:
ServerTransportParametersExtension(
QuicVersion encodingVersion,
uint64_t initialMaxData,
uint64_t initialMaxStreamDataBidiLocal,
uint64_t initialMaxStreamDataBidiRemote,
uint64_t initialMaxStreamDataUni,
uint64_t initialMaxStreamsBidi,
uint64_t initialMaxStreamsUni,
std::chrono::milliseconds idleTimeout,
uint64_t ackDelayExponent,
uint64_t maxRecvPacketSize,
const StatelessResetToken& token,
ConnectionId initialSourceCid,
ConnectionId originalDestinationCid,
std::vector<TransportParameter> customTransportParameters =
std::vector<TransportParameter>())
: encodingVersion_(encodingVersion),
initialMaxData_(initialMaxData),
initialMaxStreamDataBidiLocal_(initialMaxStreamDataBidiLocal),
initialMaxStreamDataBidiRemote_(initialMaxStreamDataBidiRemote),
initialMaxStreamDataUni_(initialMaxStreamDataUni),
initialMaxStreamsBidi_(initialMaxStreamsBidi),
initialMaxStreamsUni_(initialMaxStreamsUni),
idleTimeout_(idleTimeout),
ackDelayExponent_(ackDelayExponent),
maxRecvPacketSize_(maxRecvPacketSize),
token_(token),
initialSourceCid_(initialSourceCid),
originalDestinationCid_(originalDestinationCid),
customTransportParameters_(std::move(customTransportParameters)) {}
~ServerTransportParametersExtension() override = default;
std::vector<fizz::Extension> getExtensions(
const fizz::ClientHello& chlo) override {
fizz::validateTransportExtensions(chlo.extensions, encodingVersion_);
auto clientParams =
fizz::getClientExtension(chlo.extensions, encodingVersion_);
if (!clientParams) {
throw fizz::FizzException(
"missing client quic transport parameters extension",
fizz::AlertDescription::missing_extension);
}
clientTransportParameters_ = std::move(clientParams);
std::vector<fizz::Extension> exts;
ServerTransportParameters params;
if (encodingVersion_ == QuicVersion::QUIC_DRAFT ||
encodingVersion_ == QuicVersion::QUIC_V1) {
params.parameters.push_back(encodeConnIdParameter(
TransportParameterId::original_destination_connection_id,
originalDestinationCid_));
}
params.parameters.push_back(encodeIntegerParameter(
TransportParameterId::initial_max_stream_data_bidi_local,
initialMaxStreamDataBidiLocal_));
params.parameters.push_back(encodeIntegerParameter(
TransportParameterId::initial_max_stream_data_bidi_remote,
initialMaxStreamDataBidiRemote_));
params.parameters.push_back(encodeIntegerParameter(
TransportParameterId::initial_max_stream_data_uni,
initialMaxStreamDataUni_));
params.parameters.push_back(encodeIntegerParameter(
TransportParameterId::initial_max_data, initialMaxData_));
params.parameters.push_back(encodeIntegerParameter(
TransportParameterId::initial_max_streams_bidi,
initialMaxStreamsBidi_));
params.parameters.push_back(encodeIntegerParameter(
TransportParameterId::initial_max_streams_uni, initialMaxStreamsUni_));
params.parameters.push_back(encodeIntegerParameter(
TransportParameterId::idle_timeout, idleTimeout_.count()));
params.parameters.push_back(encodeIntegerParameter(
TransportParameterId::ack_delay_exponent, ackDelayExponent_));
params.parameters.push_back(encodeIntegerParameter(
TransportParameterId::max_packet_size, maxRecvPacketSize_));
TransportParameter statelessReset;
statelessReset.parameter = TransportParameterId::stateless_reset_token;
statelessReset.value = folly::IOBuf::copyBuffer(token_);
params.parameters.push_back(std::move(statelessReset));
if (encodingVersion_ == QuicVersion::QUIC_DRAFT ||
encodingVersion_ == QuicVersion::QUIC_V1) {
params.parameters.push_back(encodeConnIdParameter(
TransportParameterId::initial_source_connection_id,
initialSourceCid_));
}
for (const auto& customParameter : customTransportParameters_) {
params.parameters.push_back(customParameter);
}
exts.push_back(encodeExtension(params, encodingVersion_));
return exts;
}
folly::Optional<ClientTransportParameters> getClientTransportParams() {
return std::move(clientTransportParameters_);
}
private:
QuicVersion encodingVersion_;
uint64_t initialMaxData_;
uint64_t initialMaxStreamDataBidiLocal_;
uint64_t initialMaxStreamDataBidiRemote_;
uint64_t initialMaxStreamDataUni_;
uint64_t initialMaxStreamsBidi_;
uint64_t initialMaxStreamsUni_;
std::chrono::milliseconds idleTimeout_;
uint64_t ackDelayExponent_;
uint64_t maxRecvPacketSize_;
folly::Optional<ClientTransportParameters> clientTransportParameters_;
StatelessResetToken token_;
ConnectionId initialSourceCid_;
ConnectionId originalDestinationCid_;
std::vector<TransportParameter> customTransportParameters_;
};
} // namespace quic