1
0
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:
Matt Joras
2020-10-15 08:57:37 -07:00
committed by Facebook GitHub Bot
parent bf806a2e73
commit b34a07b586
5 changed files with 16 additions and 5 deletions

View File

@@ -487,6 +487,9 @@ constexpr TransportPartialReliabilitySetting kDefaultPartialReliability = false;
constexpr uint64_t kMaxPacketNumber = (1ull << 62) - 1; 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 { enum class ZeroRttSourceTokenMatchingPolicy : uint8_t {
REJECT_IF_NO_EXACT_MATCH = 0, REJECT_IF_NO_EXACT_MATCH = 0,
LIMIT_IF_NO_EXACT_MATCH = 1, LIMIT_IF_NO_EXACT_MATCH = 1,

View File

@@ -344,7 +344,8 @@ TEST_F(QuicPacketSchedulerTest, CryptoWritePartialLossBuffer) {
RegularQuicPacketBuilder builder( RegularQuicPacketBuilder builder(
25, 25,
std::move(longHeader), std::move(longHeader),
conn.ackStates.initialAckState.largestAckedByPeer.value_or(0)); conn.ackStates.initialAckState.largestAckedByPeer.value_or(
conn.ackStates.initialAckState.nextPacketNum));
FrameScheduler cryptoOnlyScheduler = FrameScheduler cryptoOnlyScheduler =
std::move( std::move(
FrameScheduler::Builder( FrameScheduler::Builder(

View File

@@ -18,9 +18,6 @@ PacketNumEncodingResult::PacketNumEncodingResult(
PacketNumEncodingResult encodePacketNumber( PacketNumEncodingResult encodePacketNumber(
PacketNum packetNum, PacketNum packetNum,
PacketNum largestAckedPacketNum) { PacketNum largestAckedPacketNum) {
DCHECK(
(!packetNum && !largestAckedPacketNum) ||
packetNum > largestAckedPacketNum);
PacketNum twiceDistance = (packetNum - largestAckedPacketNum) * 2; PacketNum twiceDistance = (packetNum - largestAckedPacketNum) * 2;
// The number of bits we need to mask all set bits in twiceDistance. // The number of bits we need to mask all set bits in twiceDistance.
// This is 1 + floor(log2(x)). // This is 1 + floor(log2(x)).

View File

@@ -121,7 +121,7 @@ RegularQuicPacketBuilder::Packet createAckPacket(
RegularQuicPacketBuilder builder( RegularQuicPacketBuilder builder(
dstConn.udpSendPacketLen, dstConn.udpSendPacketLen,
std::move(*header), std::move(*header),
getAckState(dstConn, pnSpace).largestAckedByPeer.value_or(0)); getAckState(dstConn, pnSpace).largestAckScheduled.value_or(0));
builder.encodePacketHeader(); builder.encodePacketHeader();
if (aead) { if (aead) {
builder.accountForCipherOverhead(aead->getCipherOverhead()); builder.accountForCipherOverhead(aead->getCipherOverhead());

View File

@@ -8,9 +8,12 @@
#pragma once #pragma once
#include <quic/QuicConstants.h>
#include <quic/codec/Types.h> #include <quic/codec/Types.h>
#include <quic/common/IntervalSet.h> #include <quic/common/IntervalSet.h>
#include <folly/Random.h>
namespace quic { namespace quic {
// Ack and PacketNumber states. This is per-packet number space. // Ack and PacketNumber states. This is per-packet number space.
@@ -41,6 +44,13 @@ struct AckState {
}; };
struct AckStates { 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 for acks to peer packets in Initial packet number space.
AckState initialAckState; AckState initialAckState;
// AckState for acks to peer packets in Handshake packet number space. // AckState for acks to peer packets in Handshake packet number space.