diff --git a/quic/QuicConstants.h b/quic/QuicConstants.h index 7792e3829..aa9a44197 100644 --- a/quic/QuicConstants.h +++ b/quic/QuicConstants.h @@ -487,6 +487,9 @@ constexpr TransportPartialReliabilitySetting kDefaultPartialReliability = false; constexpr uint64_t kMaxPacketNumber = (1ull << 62) - 1; +// Use up to 3 bytes for the initial packet number. +constexpr uint32_t kMaxInitialPacketNum = 0xffffff; + enum class ZeroRttSourceTokenMatchingPolicy : uint8_t { REJECT_IF_NO_EXACT_MATCH = 0, LIMIT_IF_NO_EXACT_MATCH = 1, diff --git a/quic/api/test/QuicPacketSchedulerTest.cpp b/quic/api/test/QuicPacketSchedulerTest.cpp index 4ee78b00d..56e6a0063 100644 --- a/quic/api/test/QuicPacketSchedulerTest.cpp +++ b/quic/api/test/QuicPacketSchedulerTest.cpp @@ -344,7 +344,8 @@ TEST_F(QuicPacketSchedulerTest, CryptoWritePartialLossBuffer) { RegularQuicPacketBuilder builder( 25, std::move(longHeader), - conn.ackStates.initialAckState.largestAckedByPeer.value_or(0)); + conn.ackStates.initialAckState.largestAckedByPeer.value_or( + conn.ackStates.initialAckState.nextPacketNum)); FrameScheduler cryptoOnlyScheduler = std::move( FrameScheduler::Builder( diff --git a/quic/codec/PacketNumber.cpp b/quic/codec/PacketNumber.cpp index 8e5c85faf..811f3605b 100644 --- a/quic/codec/PacketNumber.cpp +++ b/quic/codec/PacketNumber.cpp @@ -18,9 +18,6 @@ PacketNumEncodingResult::PacketNumEncodingResult( PacketNumEncodingResult encodePacketNumber( PacketNum packetNum, PacketNum largestAckedPacketNum) { - DCHECK( - (!packetNum && !largestAckedPacketNum) || - packetNum > largestAckedPacketNum); PacketNum twiceDistance = (packetNum - largestAckedPacketNum) * 2; // The number of bits we need to mask all set bits in twiceDistance. // This is 1 + floor(log2(x)). diff --git a/quic/common/test/TestUtils.cpp b/quic/common/test/TestUtils.cpp index b07d5d4ec..de438f4b7 100644 --- a/quic/common/test/TestUtils.cpp +++ b/quic/common/test/TestUtils.cpp @@ -121,7 +121,7 @@ RegularQuicPacketBuilder::Packet createAckPacket( RegularQuicPacketBuilder builder( dstConn.udpSendPacketLen, std::move(*header), - getAckState(dstConn, pnSpace).largestAckedByPeer.value_or(0)); + getAckState(dstConn, pnSpace).largestAckScheduled.value_or(0)); builder.encodePacketHeader(); if (aead) { builder.accountForCipherOverhead(aead->getCipherOverhead()); diff --git a/quic/state/AckStates.h b/quic/state/AckStates.h index b3b59feca..e490663e4 100644 --- a/quic/state/AckStates.h +++ b/quic/state/AckStates.h @@ -8,9 +8,12 @@ #pragma once +#include #include #include +#include + namespace quic { // Ack and PacketNumber states. This is per-packet number space. @@ -41,6 +44,13 @@ struct AckState { }; struct AckStates { + AckStates() { + PacketNum randomizedPacketNum = + folly::Random::secureRand32(kMaxInitialPacketNum); + initialAckState.nextPacketNum = randomizedPacketNum; + handshakeAckState.nextPacketNum = randomizedPacketNum; + appDataAckState.nextPacketNum = randomizedPacketNum; + } // AckState for acks to peer packets in Initial packet number space. AckState initialAckState; // AckState for acks to peer packets in Handshake packet number space.