1
0
mirror of https://github.com/facebookincubator/mvfst.git synced 2025-11-09 10:00:57 +03:00

Codec changes to support ACK_RECEIVE_TIMESTAMPS

Summary: Create a new ACK_RECEIVE_TIMESTAMPS frame, as outlined in https://www.ietf.org/archive/id/draft-smith-quic-receive-ts-00.html#name-ack_receive_timestamps-fram

Reviewed By: mjoras

Differential Revision: D37799050

fbshipit-source-id: 0157c7fa7c4e489bb310f7c9cd6c0c1877e4967f
This commit is contained in:
Sharad Jaiswal (Eng)
2022-11-16 13:02:27 -08:00
committed by Facebook GitHub Bot
parent 9ef63d6b46
commit 96abc8160d
23 changed files with 1468 additions and 185 deletions

View File

@@ -225,6 +225,15 @@ void processClientInitialParams(
static_cast<TransportParameterId>(kStreamGroupsEnabledCustomParamId),
clientParams.parameters);
auto isAckReceiveTimestampsEnabled = getIntegerParameter(
TransportParameterId::ack_receive_timestamps_enabled,
clientParams.parameters);
auto maxReceiveTimestampsPerAck = getIntegerParameter(
TransportParameterId::max_receive_timestamps_per_ack,
clientParams.parameters);
auto receiveTimestampsExponent = getIntegerParameter(
TransportParameterId::receive_timestamps_exponent,
clientParams.parameters);
if (conn.version == QuicVersion::QUIC_DRAFT ||
conn.version == QuicVersion::QUIC_V1 ||
conn.version == QuicVersion::QUIC_V1_ALIAS) {
@@ -397,6 +406,19 @@ void processClientInitialParams(
if (peerMaxStreamGroupsAdvertized) {
conn.peerMaxStreamGroupsAdvertized = *peerMaxStreamGroupsAdvertized;
}
if (isAckReceiveTimestampsEnabled.has_value() &&
isAckReceiveTimestampsEnabled.value() == 1) {
if (maxReceiveTimestampsPerAck.has_value() &&
receiveTimestampsExponent.has_value()) {
conn.maybePeerAckReceiveTimestampsConfig.assign(
{std::min(
static_cast<uint8_t>(maxReceiveTimestampsPerAck.value()),
kMaxReceivedPktsTimestampsStored),
std::max(
static_cast<uint8_t>(receiveTimestampsExponent.value()),
static_cast<uint8_t>(0))});
}
}
}
void updateHandshakeState(QuicServerConnectionState& conn) {
@@ -762,10 +784,10 @@ void onServerReadDataFromOpen(
readData.networkData.data->computeChainDataLength() == 0) {
return;
}
bool firstPacketFromPeer = false;
if (!conn.readCodec) {
firstPacketFromPeer = true;
folly::io::Cursor cursor(readData.networkData.data.get());
auto initialByte = cursor.readBE<uint8_t>();
auto parsedLongHeader = parseLongHeaderInvariant(initialByte, cursor);
@@ -857,8 +879,10 @@ void onServerReadDataFromOpen(
conn.qLogger->setScid(conn.serverConnectionId);
conn.qLogger->setDcid(initialDestinationConnectionId);
}
conn.readCodec->setCodecParameters(
CodecParameters(conn.peerAckDelayExponent, version));
conn.readCodec->setCodecParameters(CodecParameters(
conn.peerAckDelayExponent,
version,
conn.transportSettings.maybeAckReceiveTimestampsConfigSentToPeer));
conn.initialWriteCipher = cryptoFactory.getServerInitialCipher(
initialDestinationConnectionId, version);
@@ -1607,6 +1631,34 @@ std::vector<TransportParameter> setSupportedExtensionTransportParameters(
}
}
auto ackReceiveTimestampsEnabled =
std::make_unique<CustomIntegralTransportParameter>(
static_cast<uint64_t>(
TransportParameterId::ack_receive_timestamps_enabled),
conn.transportSettings.maybeAckReceiveTimestampsConfigSentToPeer
.has_value()
? 1
: 0);
customTransportParams.push_back(ackReceiveTimestampsEnabled->encode());
if (conn.transportSettings.maybeAckReceiveTimestampsConfigSentToPeer
.has_value()) {
auto maxReceiveTimestampsPerAck =
std::make_unique<CustomIntegralTransportParameter>(
static_cast<uint64_t>(
TransportParameterId::max_receive_timestamps_per_ack),
conn.transportSettings.maybeAckReceiveTimestampsConfigSentToPeer
.value()
.max_receive_timestamps_per_ack);
customTransportParams.push_back(maxReceiveTimestampsPerAck->encode());
auto receiveTimestampsExponent =
std::make_unique<CustomIntegralTransportParameter>(
static_cast<uint64_t>(
TransportParameterId::receive_timestamps_exponent),
conn.transportSettings.maybeAckReceiveTimestampsConfigSentToPeer
.value()
.receive_timestamps_exponent);
customTransportParams.push_back(receiveTimestampsExponent->encode());
}
return customTransportParams;
}
} // namespace quic