mirror of
https://github.com/facebookincubator/mvfst.git
synced 2025-07-29 03:41:11 +03:00
Write ACK_EXTENDED frame when supported by peer
Summary: Write the new ACK_EXTENDED frame. When any of the ACK_EXTENDED features are enabled locally and supported by the peer, this frame type will take precedence over ACK_ECN and ACK_RECEIVETIMESTAMPS. See first diff in the stack for the features. Frame format: ``` ACK_EXTENDED Frame { Type (i) = 0xB1 // Fields of the existing ACK (type=0x02) frame: Largest Acknowledged (i), ACK Delay (i), ACK Range Count (i), First ACK Range (i), ACK Range (..) ..., Extended Ack Features (i), // Optional ECN counts (if bit 0 is set in Features) [ECN Counts (..)], // Optional Receive Timestamps (if bit 1 is set in Features) [Receive Timestamps (..)] } // Fields from the existing ACK_ECN frame ECN Counts { ECT0 Count (i), ECT1 Count (i), ECN-CE Count (i), } // Fields from the existing ACK_RECEIVE_TIMESTAMPS frame Receive Timestamps { Timestamp Range Count (i), Timestamp Ranges (..) ..., } Timestamp Range { Gap (i), Timestamp Delta Count (i), Timestamp Delta (i) ..., } ``` Reviewed By: sharmafb Differential Revision: D68931148 fbshipit-source-id: 0fb4bac23e121f82a11602daabc1ec7084db43dd
This commit is contained in:
committed by
Facebook GitHub Bot
parent
31fbb343d1
commit
aac108ddc7
@ -614,16 +614,38 @@ Optional<PacketNum> AckScheduler::writeNextAcks(
|
||||
.maxReceiveTimestampsPerAck
|
||||
: 0;
|
||||
|
||||
if (conn_.transportSettings.readEcnOnIngress &&
|
||||
uint64_t extendedAckSupportedAndEnabled =
|
||||
conn_.peerAdvertisedExtendedAckFeatures &
|
||||
conn_.transportSettings.enableExtendedAckFeatures;
|
||||
// Disable the ECN fields if we are not reading them
|
||||
if (!conn_.transportSettings.readEcnOnIngress) {
|
||||
extendedAckSupportedAndEnabled &= ~static_cast<ExtendedAckFeatureMaskType>(
|
||||
ExtendedAckFeatureMask::ECN_COUNTS);
|
||||
}
|
||||
// Disable the receive timestamps fields if we have not regoatiated receive
|
||||
// timestamps support
|
||||
if (!isAckReceiveTimestampsSupported || (peerRequestedTimestampsCount == 0)) {
|
||||
extendedAckSupportedAndEnabled &= ~static_cast<ExtendedAckFeatureMaskType>(
|
||||
ExtendedAckFeatureMask::RECEIVE_TIMESTAMPS);
|
||||
}
|
||||
|
||||
if (extendedAckSupportedAndEnabled > 0) {
|
||||
// The peer supports extended ACKs and we have them enabled.
|
||||
ackWriteResult = writeAckFrame(
|
||||
meta,
|
||||
builder,
|
||||
FrameType::ACK_EXTENDED,
|
||||
conn_.transportSettings.maybeAckReceiveTimestampsConfigSentToPeer
|
||||
.value_or(AckReceiveTimestampsConfig()),
|
||||
peerRequestedTimestampsCount,
|
||||
extendedAckSupportedAndEnabled);
|
||||
} else if (
|
||||
conn_.transportSettings.readEcnOnIngress &&
|
||||
(meta.ackState.ecnECT0CountReceived ||
|
||||
meta.ackState.ecnECT1CountReceived ||
|
||||
meta.ackState.ecnCECountReceived)) {
|
||||
// If echoing ECN is enabled and we have seen marked packets, this will
|
||||
// currently take priority over sending receive timestamps. There is
|
||||
// currently no provision for a frame time that includes both ECN counts and
|
||||
// receive timestamps.
|
||||
// TODO: explore design changes for an ACK frame that supports both ECN and
|
||||
// receive timestamps
|
||||
// We have to report ECN counts, but we can't use the extended ACK frame. In
|
||||
// this case, we give ACK_ECN precedence over ACK_RECEIVE_TIMESTAMPS.
|
||||
ackWriteResult = writeAckFrame(meta, builder, FrameType::ACK_ECN);
|
||||
} else if (
|
||||
isAckReceiveTimestampsSupported && (peerRequestedTimestampsCount > 0)) {
|
||||
|
Reference in New Issue
Block a user