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;
|
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,
|
||||||
|
@@ -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(
|
||||||
|
@@ -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)).
|
||||||
|
@@ -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());
|
||||||
|
@@ -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.
|
||||||
|
Reference in New Issue
Block a user