1
0
mirror of https://github.com/facebookincubator/mvfst.git synced 2025-11-24 04:01:07 +03:00

Maitain ingress ECN counts in the AckState for writing ACKs

Summary:
Keep track of ECN values in incoming packets and update the AckState that is used for echoing the counts to the peer in ACK_ECN frames.

Reading and writing the ACK_ECN frames is in the next change.

Reviewed By: kvtsoy

Differential Revision: D54927783

fbshipit-source-id: 44471c6224ee8578aaacc0d1a1c54370ef6d2ffe
This commit is contained in:
Joseph Beshay
2024-05-15 11:51:15 -07:00
committed by Facebook GitHub Bot
parent 3eef6d0e55
commit 9add439090
8 changed files with 108 additions and 38 deletions

View File

@@ -58,12 +58,12 @@ RegularQuicWritePacket makeTestLongPacket(LongHeader::Types type) {
class AddPacketToAckStateTest : public TestWithParam<PacketNumberSpace> {
public:
/**
* Build a ReceivedUdpPacket::Timings structure with minimal fields set.
* Build a ReceivedUdpPacket structure with minimal fields set.
*/
static ReceivedUdpPacket::Timings buildPacketTimingsMinimal() {
ReceivedUdpPacket::Timings timings;
timings.receiveTimePoint = Clock::now();
return timings;
static ReceivedUdpPacket buildPacketMinimal() {
ReceivedUdpPacket packet;
packet.timings.receiveTimePoint = Clock::now();
return packet;
}
};
@@ -78,10 +78,7 @@ TEST_P(AddPacketToAckStateTest, FirstPacketNotOutOfOrder) {
*/
PacketNum firstPacket = folly::Random::rand32(1, 100);
EXPECT_FALSE(addPacketToAckState(
conn,
getAckState(conn, GetParam()),
firstPacket,
buildPacketTimingsMinimal()));
conn, getAckState(conn, GetParam()), firstPacket, buildPacketMinimal()));
}
TEST_P(AddPacketToAckStateTest, ReceiveNew) {
@@ -92,10 +89,7 @@ TEST_P(AddPacketToAckStateTest, ReceiveNew) {
*getAckState(conn, GetParam()).largestRecvdPacketNum;
PacketNum newReceived = currentLargestReceived + 1;
auto distance = addPacketToAckState(
conn,
getAckState(conn, GetParam()),
newReceived,
buildPacketTimingsMinimal());
conn, getAckState(conn, GetParam()), newReceived, buildPacketMinimal());
EXPECT_EQ(distance, 0);
EXPECT_GT(
*getAckState(conn, GetParam()).largestRecvdPacketNum,
@@ -110,10 +104,7 @@ TEST_P(AddPacketToAckStateTest, ReceiveNewWithGap) {
*getAckState(conn, GetParam()).largestRecvdPacketNum;
PacketNum newReceived = currentLargestReceived + 3;
auto distance = addPacketToAckState(
conn,
getAckState(conn, GetParam()),
newReceived,
buildPacketTimingsMinimal());
conn, getAckState(conn, GetParam()), newReceived, buildPacketMinimal());
EXPECT_EQ(distance, 2); // newReceived is 2 after the expected pkt num
EXPECT_GT(
*getAckState(conn, GetParam()).largestRecvdPacketNum,
@@ -128,10 +119,7 @@ TEST_P(AddPacketToAckStateTest, ReceiveOld) {
*getAckState(conn, GetParam()).largestRecvdPacketNum;
PacketNum newReceived = currentLargestReceived - 1;
auto distance = addPacketToAckState(
conn,
getAckState(conn, GetParam()),
newReceived,
buildPacketTimingsMinimal());
conn, getAckState(conn, GetParam()), newReceived, buildPacketMinimal());
EXPECT_EQ(distance, 2); // newReceived is 2 before the expected pkt num
EXPECT_EQ(
*getAckState(conn, GetParam()).largestRecvdPacketNum,
@@ -146,16 +134,79 @@ TEST_P(AddPacketToAckStateTest, ReceiveOldWithGap) {
*getAckState(conn, GetParam()).largestRecvdPacketNum;
PacketNum newReceived = currentLargestReceived - 5;
auto distance = addPacketToAckState(
conn,
getAckState(conn, GetParam()),
newReceived,
buildPacketTimingsMinimal());
conn, getAckState(conn, GetParam()), newReceived, buildPacketMinimal());
EXPECT_EQ(distance, 6); // newReceived is 6 before the expected pkt num
EXPECT_EQ(
*getAckState(conn, GetParam()).largestRecvdPacketNum,
currentLargestReceived);
}
TEST_P(AddPacketToAckStateTest, ReceiveWithECN) {
QuicServerConnectionState conn(
FizzServerQuicHandshakeContext::Builder().build());
getAckState(conn, GetParam()).largestRecvdPacketNum = 100;
auto nextPacketNum = *getAckState(conn, GetParam()).largestRecvdPacketNum;
{
// No ECN values seen yet.
EXPECT_EQ(getAckState(conn, GetParam()).ecnCECountReceived, 0);
EXPECT_EQ(getAckState(conn, GetParam()).ecnECT0CountReceived, 0);
EXPECT_EQ(getAckState(conn, GetParam()).ecnECT1CountReceived, 0);
}
{
auto packet = buildPacketMinimal();
packet.tosValue = kEcnECT0;
auto distance = addPacketToAckState(
conn, getAckState(conn, GetParam()), ++nextPacketNum, packet);
EXPECT_EQ(distance, 0);
// Seen 1 ECT0, 0 ECT1, 0 CE.
EXPECT_EQ(getAckState(conn, GetParam()).ecnCECountReceived, 0);
EXPECT_EQ(getAckState(conn, GetParam()).ecnECT0CountReceived, 1);
EXPECT_EQ(getAckState(conn, GetParam()).ecnECT1CountReceived, 0);
}
{
auto packet = buildPacketMinimal();
packet.tosValue = kEcnECT1;
auto distance = addPacketToAckState(
conn, getAckState(conn, GetParam()), ++nextPacketNum, packet);
EXPECT_EQ(distance, 0);
// Seen 1 ECT0, 1 ECT1, 0 CE.
EXPECT_EQ(getAckState(conn, GetParam()).ecnCECountReceived, 0);
EXPECT_EQ(getAckState(conn, GetParam()).ecnECT0CountReceived, 1);
EXPECT_EQ(getAckState(conn, GetParam()).ecnECT1CountReceived, 1);
}
{
auto packet = buildPacketMinimal();
packet.tosValue = kEcnCE;
auto distance = addPacketToAckState(
conn, getAckState(conn, GetParam()), ++nextPacketNum, packet);
EXPECT_EQ(distance, 0);
// Seen 1 ECT0, 1 ECT1, 1 CE.
EXPECT_EQ(getAckState(conn, GetParam()).ecnCECountReceived, 1);
EXPECT_EQ(getAckState(conn, GetParam()).ecnECT0CountReceived, 1);
EXPECT_EQ(getAckState(conn, GetParam()).ecnECT1CountReceived, 1);
}
{
auto packet = buildPacketMinimal();
packet.tosValue = kEcnCE;
auto distance = addPacketToAckState(
conn, getAckState(conn, GetParam()), ++nextPacketNum, packet);
EXPECT_EQ(distance, 0);
// Seen 1 ECT0, 1 ECT1, 2 CE.
EXPECT_EQ(getAckState(conn, GetParam()).ecnCECountReceived, 2);
EXPECT_EQ(getAckState(conn, GetParam()).ecnECT0CountReceived, 1);
EXPECT_EQ(getAckState(conn, GetParam()).ecnECT1CountReceived, 1);
}
}
INSTANTIATE_TEST_SUITE_P(
AddPacketToAckStateTests,
AddPacketToAckStateTest,