quic/state/QuicStateFunctions.h (85 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 <quic/codec/QuicPacketBuilder.h>
#include <quic/codec/Types.h>
#include <quic/state/StateData.h>
namespace quic {
void updateAckSendStateOnRecvPacket(
QuicConnectionStateBase& conn,
AckState& ackState,
bool pktOutOfOrder,
bool pktHasRetransmittableData,
bool pktHasCryptoData,
bool initPktNumSpace = false);
void updateAckStateOnAckTimeout(QuicConnectionStateBase& conn);
void updateAckSendStateOnSentPacketWithAcks(
QuicConnectionStateBase& conn,
AckState& ackState,
PacketNum largestAckScheduled);
void updateRtt(
QuicConnectionStateBase& conn,
const std::chrono::microseconds rttSample,
const std::chrono::microseconds ackDelay);
bool isConnectionPaced(const QuicConnectionStateBase& conn) noexcept;
AckState& getAckState(
QuicConnectionStateBase& conn,
PacketNumberSpace pnSpace) noexcept;
const AckState& getAckState(
const QuicConnectionStateBase& conn,
PacketNumberSpace pnSpace) noexcept;
AckStateVersion currentAckStateVersion(
const QuicConnectionStateBase& conn) noexcept;
PacketNum getNextPacketNum(
const QuicConnectionStateBase& conn,
PacketNumberSpace pnSpace) noexcept;
void increaseNextPacketNum(
QuicConnectionStateBase& conn,
PacketNumberSpace pnSpace) noexcept;
/**
* Update largestReceivedPacketNum in ackState with packetNum. Return if the
* current packetNum is received out of order.
*/
template <typename ClockType = quic::Clock>
bool updateLargestReceivedPacketNum(
AckState& ackState,
PacketNum packetNum,
TimePoint receivedTime) {
PacketNum expectedNextPacket = 0;
if (ackState.largestReceivedPacketNum) {
expectedNextPacket = *ackState.largestReceivedPacketNum + 1;
}
ackState.largestReceivedPacketNum = std::max<PacketNum>(
ackState.largestReceivedPacketNum.value_or(packetNum), packetNum);
ackState.acks.insert(packetNum);
if (ackState.largestReceivedPacketNum == packetNum) {
ackState.largestRecvdPacketTime = receivedTime;
}
static_assert(ClockType::is_steady, "Needs steady clock");
return expectedNextPacket != packetNum;
}
std::deque<OutstandingPacket>::iterator getNextOutstandingPacket(
QuicConnectionStateBase& conn,
PacketNumberSpace packetNumberSpace,
std::deque<OutstandingPacket>::iterator from);
std::deque<OutstandingPacket>::iterator getFirstOutstandingPacket(
QuicConnectionStateBase& conn,
PacketNumberSpace packetNumberSpace);
std::deque<OutstandingPacket>::reverse_iterator getLastOutstandingPacket(
QuicConnectionStateBase& conn,
PacketNumberSpace packetNumberSpace);
std::deque<OutstandingPacket>::reverse_iterator
getLastOutstandingPacketIncludingLost(
QuicConnectionStateBase& conn,
PacketNumberSpace packetNumberSpace);
bool hasReceivedPackets(const QuicConnectionStateBase& conn) noexcept;
bool hasReceivedPacketsAtLastCloseSent(
const QuicConnectionStateBase& conn) noexcept;
bool hasNotReceivedNewPacketsSinceLastCloseSent(
const QuicConnectionStateBase& conn) noexcept;
void updateLargestReceivedPacketsAtLastCloseSent(
QuicConnectionStateBase& conn) noexcept;
folly::Optional<TimePoint>& getLossTime(
QuicConnectionStateBase& conn,
PacketNumberSpace pnSpace) noexcept;
bool canSetLossTimerForAppData(const QuicConnectionStateBase& conn) noexcept;
std::pair<folly::Optional<TimePoint>, PacketNumberSpace> earliestLossTimer(
const QuicConnectionStateBase& conn) noexcept;
std::pair<folly::Optional<TimePoint>, PacketNumberSpace> earliestTimeAndSpace(
const EnumArray<PacketNumberSpace, folly::Optional<TimePoint>>& times,
bool considerAppData) noexcept;
} // namespace quic