/* * 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 #include #include #include #include #include #include namespace quic { void updateAckSendStateOnRecvPacket( QuicConnectionStateBase& conn, AckState& ackState, uint64_t distanceFromExpectedPacketNum, 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; const AckState* getAckStatePtr( 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, bool dsrPacket = false) noexcept; /** * Update largestReceivedUdpPacketNum in ackState with packetNum. Return the * distance from the next packet number we expect to receive. */ [[nodiscard]] Expected addPacketToAckState( QuicConnectionStateBase& conn, AckState& ackState, const PacketNum packetNum, const ReceivedUdpPacket& udpPacket); std::deque::iterator getNextOutstandingPacket( QuicConnectionStateBase& conn, PacketNumberSpace packetNumberSpace, std::deque::iterator from); std::deque::iterator getFirstOutstandingPacket( QuicConnectionStateBase& conn, PacketNumberSpace packetNumberSpace); std::deque::reverse_iterator getLastOutstandingPacket( QuicConnectionStateBase& conn, PacketNumberSpace packetNumberSpace, bool includeDeclaredLost = false, bool includeScheduledForDestruction = false); bool hasReceivedUdpPackets(const QuicConnectionStateBase& conn) noexcept; bool hasReceivedUdpPacketsAtLastCloseSent( const QuicConnectionStateBase& conn) noexcept; bool hasNotReceivedNewPacketsSinceLastCloseSent( const QuicConnectionStateBase& conn) noexcept; void updateLargestReceivedUdpPacketsAtLastCloseSent( QuicConnectionStateBase& conn) noexcept; Optional& getLossTime( QuicConnectionStateBase& conn, PacketNumberSpace pnSpace) noexcept; bool canSetLossTimerForAppData(const QuicConnectionStateBase& conn) noexcept; std::pair, PacketNumberSpace> earliestLossTimer( const QuicConnectionStateBase& conn) noexcept; std::pair, PacketNumberSpace> earliestTimeAndSpace( const EnumArray>& times, bool considerAppData) noexcept; uint64_t maximumConnectionIdsToIssue(const QuicConnectionStateBase& conn); bool checkCustomRetransmissionProfilesEnabled( const QuicConnectionStateBase& conn); /** * Checks if the retransmission policy on the stream group prohibits * retransmissions. */ bool streamRetransmissionDisabled( QuicConnectionStateBase& conn, const QuicStreamState& stream); } // namespace quic