mirror of
https://github.com/facebookincubator/mvfst.git
synced 2025-07-30 14:43:05 +03:00
Add IMMEDIATE_ACK frame
Summary: Add the new IMMEDIATE_ACK frame from the ack frequency draft. Reviewed By: mjoras Differential Revision: D38523438 fbshipit-source-id: 79f4a26160ccf4333fb79897ab4ace2ed262fa01
This commit is contained in:
committed by
Facebook GitHub Bot
parent
1e594fe1ba
commit
abee1d8387
@ -186,6 +186,11 @@ FrameScheduler::Builder& FrameScheduler::Builder::datagramFrames() {
|
||||
return *this;
|
||||
}
|
||||
|
||||
FrameScheduler::Builder& FrameScheduler::Builder::immediateAckFrames() {
|
||||
immediateAckFrameScheduler_ = true;
|
||||
return *this;
|
||||
}
|
||||
|
||||
FrameScheduler FrameScheduler::Builder::build() && {
|
||||
FrameScheduler scheduler(name_, conn_);
|
||||
if (streamFrameScheduler_) {
|
||||
@ -217,6 +222,10 @@ FrameScheduler FrameScheduler::Builder::build() && {
|
||||
if (datagramFrameScheduler_) {
|
||||
scheduler.datagramFrameScheduler_.emplace(DatagramFrameScheduler(conn_));
|
||||
}
|
||||
if (immediateAckFrameScheduler_) {
|
||||
scheduler.immediateAckFrameScheduler_.emplace(
|
||||
ImmediateAckFrameScheduler(conn_));
|
||||
}
|
||||
return scheduler;
|
||||
}
|
||||
|
||||
@ -259,6 +268,13 @@ SchedulingResult FrameScheduler::scheduleFramesForPacket(
|
||||
ackScheduler_->writeNextAcks(builder);
|
||||
}
|
||||
}
|
||||
// Immediate ACK frames are subject to congestion control but should be sent
|
||||
// before other frames to maximize their chance of being included in the
|
||||
// packet since they are time sensitive
|
||||
if (immediateAckFrameScheduler_ &&
|
||||
immediateAckFrameScheduler_->hasPendingImmediateAckFrame()) {
|
||||
immediateAckFrameScheduler_->writeImmediateAckFrame(wrapper);
|
||||
}
|
||||
if (windowUpdateScheduler_ &&
|
||||
windowUpdateScheduler_->hasPendingWindowUpdates()) {
|
||||
windowUpdateScheduler_->writeWindowUpdates(wrapper);
|
||||
@ -317,7 +333,7 @@ void FrameScheduler::writeNextAcks(PacketBuilderInterface& builder) {
|
||||
}
|
||||
|
||||
bool FrameScheduler::hasData() const {
|
||||
return (hasPendingAcks()) || hasImmediateData();
|
||||
return hasPendingAcks() || hasImmediateData();
|
||||
}
|
||||
|
||||
bool FrameScheduler::hasPendingAcks() const {
|
||||
@ -335,7 +351,9 @@ bool FrameScheduler::hasImmediateData() const {
|
||||
simpleFrameScheduler_->hasPendingSimpleFrames()) ||
|
||||
(pingFrameScheduler_ && pingFrameScheduler_->hasPingFrame()) ||
|
||||
(datagramFrameScheduler_ &&
|
||||
datagramFrameScheduler_->hasPendingDatagramFrames());
|
||||
datagramFrameScheduler_->hasPendingDatagramFrames()) ||
|
||||
(immediateAckFrameScheduler_ &&
|
||||
immediateAckFrameScheduler_->hasPendingImmediateAckFrame());
|
||||
}
|
||||
|
||||
folly::StringPiece FrameScheduler::name() const {
|
||||
@ -779,6 +797,19 @@ bool CryptoStreamScheduler::hasData() const {
|
||||
!cryptoStream_.lossBuffer.empty();
|
||||
}
|
||||
|
||||
ImmediateAckFrameScheduler::ImmediateAckFrameScheduler(
|
||||
const QuicConnectionStateBase& conn)
|
||||
: conn_(conn) {}
|
||||
|
||||
bool ImmediateAckFrameScheduler::hasPendingImmediateAckFrame() const {
|
||||
return conn_.pendingEvents.requestImmediateAck;
|
||||
}
|
||||
|
||||
bool ImmediateAckFrameScheduler::writeImmediateAckFrame(
|
||||
PacketBuilderInterface& builder) {
|
||||
return 0 != writeFrame(ImmediateAckFrame(), builder);
|
||||
}
|
||||
|
||||
CloningScheduler::CloningScheduler(
|
||||
FrameScheduler& scheduler,
|
||||
QuicConnectionStateBase& conn,
|
||||
|
Reference in New Issue
Block a user