quic/state/LossState.h (48 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/Types.h>
#include <quic/common/EnumArray.h>
namespace quic {
struct LossState {
enum class AlarmMethod { EarlyRetransmitOrReordering, PTO };
// Latest packet number sent
// TODO: this also needs to be 3 numbers now...
folly::Optional<PacketNum> largestSent;
// Timer for time reordering detection or early retransmit alarm.
EnumArray<PacketNumberSpace, folly::Optional<TimePoint>> lossTimes;
// Max ack delay received from peer.
std::chrono::microseconds maxAckDelay{0us};
// minimum rtt. AckDelay isn't excluded from this.
std::chrono::microseconds mrtt{kDefaultMinRtt};
// minimum rtt measured from samples with AckDelay excluded.
folly::Optional<std::chrono::microseconds> maybeMrttNoAckDelay;
// Last raw RTT value; unlike lrtt, this will always contain any ACK delay.
folly::Optional<std::chrono::microseconds> maybeLrtt;
// Last raw ACK delay value.
folly::Optional<std::chrono::microseconds> maybeLrttAckDelay;
// Smooth rtt.
std::chrono::microseconds srtt{0us};
// Latest rtt.
std::chrono::microseconds lrtt{0us};
// Rtt var.
std::chrono::microseconds rttvar{0us};
// The sent time of the latest acked packet.
folly::Optional<TimePoint> lastAckedPacketSentTime;
// The latest time a packet is acked.
folly::Optional<TimePoint> lastAckedTime;
// The latest time a packet is acked, minus ack delay.
folly::Optional<TimePoint> adjustedLastAckedTime;
// The time when last retranmittable packet is sent for every packet number.
// space
TimePoint lastRetransmittablePacketSentTime;
// The time when the last packet was sent.
folly::Optional<TimePoint> maybeLastPacketSentTime;
// Total number of bytes sent on this connection. This is after encoding.
uint64_t totalBytesSent{0};
// Total number of bytes received on this connection. This is before decoding.
uint64_t totalBytesRecvd{0};
// Total number of stream bytes retransmitted, excluding cloning.
uint64_t totalBytesRetransmitted{0};
// Total number of stream bytes cloned.
uint64_t totalStreamBytesCloned{0};
// Total number of bytes cloned.
uint64_t totalBytesCloned{0};
// Total number of bytes acked on this connection. If a packet is acked twice,
// it won't be count twice. Pure acks packets are NOT included.
uint64_t totalBytesAcked{0};
// The total number of bytes sent on this connection when the last time a
// packet is acked.
uint64_t totalBytesSentAtLastAck{0};
// The total number of bytes acked on this connection when the last time a
// packet is acked.
uint64_t totalBytesAckedAtLastAck{0};
// Total number of body bytes sent on this connection. This is after encoding.
uint64_t totalBodyBytesSent{0};
// Total number of body bytes acked on this connection. If a packet is acked
// twice, it won't be count twice. Pure acks packets are NOT included (as they
// have no encoded body bytes).
uint64_t totalBodyBytesAcked{0};
// Total number of stream bytes sent on this connection.
// Includes retransmissions of stream bytes.
uint64_t totalStreamBytesSent{0};
// Total number of 'new' stream bytes sent on this connection.
// Does not include retransmissions of stream bytes.
//
// Equal to ConnectionFlowControlState::sumCurWriteOffset, stored here as well
// to colocate with other related vars to assist with interpreting LossState.
uint64_t totalNewStreamBytesSent{0};
// Total number of packets sent on this connection, including retransmissions.
uint32_t totalPacketsSent{0};
// Total number of ack-eliciting packets sent on this connection.
uint32_t totalAckElicitingPacketsSent{0};
// Total number of packets which were declared lost, including losses that
// we later detected were spurious (see totalPacketsSpuriouslyMarkedLost).
uint32_t totalPacketsMarkedLost{0};
// Total number of packets which were declared lost due to PTO; a packet can
// marked as lost by multiple detection mechanisms.
uint32_t totalPacketsMarkedLostByPto{0};
// Total number of packets which were declared lost based on the reordering
// threshold; a packet can marked as lost by multiple detection mechanisms.
uint32_t totalPacketsMarkedLostByReorderingThreshold{0};
// Total number of packets which were declared lost spuriously, i.e. we
// received an ACK for them later.
uint32_t totalPacketsSpuriouslyMarkedLost{0};
// Inflight bytes
uint64_t inflightBytes{0};
// Reordering threshold used
uint32_t reorderingThreshold{kReorderingThreshold};
// Number of packet loss timer fired before receiving an ack
uint32_t ptoCount{0};
// Total number of packet retransmitted on this connection, including packet
// clones, retransmitted clones, handshake and rejected zero rtt packets.
uint32_t rtxCount{0};
// Total number of retransmission due to PTO
uint32_t timeoutBasedRtxCount{0};
// Total number of PTO count
uint32_t totalPTOCount{0};
// Current method by which the loss detection alarm is set.
AlarmMethod currentAlarmMethod{AlarmMethod::EarlyRetransmitOrReordering};
};
} // namespace quic