mirror of
https://github.com/facebookincubator/mvfst.git
synced 2025-08-08 09:42:06 +03:00
Randomize initial packet numbers.
Summary: As in title. Also use the same starting value for each space, since our outstanding packets structure keeps all of them globally ordered. Reviewed By: yangchi Differential Revision: D23882335 fbshipit-source-id: 83c35d50a30593d2f596715ba5fc52c2a639ffd6
This commit is contained in:
committed by
Facebook GitHub Bot
parent
bf806a2e73
commit
b34a07b586
@@ -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,
|
||||
|
@@ -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(
|
||||
|
@@ -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)).
|
||||
|
@@ -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());
|
||||
|
@@ -8,9 +8,12 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <quic/QuicConstants.h>
|
||||
#include <quic/codec/Types.h>
|
||||
#include <quic/common/IntervalSet.h>
|
||||
|
||||
#include <folly/Random.h>
|
||||
|
||||
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.
|
||||
|
Reference in New Issue
Block a user