Skip to content

Commit 972e677

Browse files
authored
Refactor the RX Datapath Object Abstraction Model (#3826)
1 parent cd49fbb commit 972e677

25 files changed

+591
-750
lines changed

src/core/binding.c

Lines changed: 34 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -676,7 +676,7 @@ QuicBindingCreateStatelessOperation(
676676
}
677677

678678
if (Binding->StatelessOperCount >= (uint32_t)MsQuicLib.Settings.MaxBindingStatelessOperations) {
679-
QuicPacketLogDrop(Binding, CxPlatDataPathRecvDataToRecvPacket(Datagram),
679+
QuicPacketLogDrop(Binding, GetQuicRxPacket(Datagram),
680680
"Max binding operations reached");
681681
goto Exit;
682682
}
@@ -694,7 +694,7 @@ QuicBindingCreateStatelessOperation(
694694
CXPLAT_CONTAINING_RECORD(TableEntry, QUIC_STATELESS_CONTEXT, TableEntry);
695695

696696
if (QuicAddrCompare(&ExistingCtx->RemoteAddress, RemoteAddress)) {
697-
QuicPacketLogDrop(Binding, CxPlatDataPathRecvDataToRecvPacket(Datagram),
697+
QuicPacketLogDrop(Binding, GetQuicRxPacket(Datagram),
698698
"Already in stateless oper table");
699699
goto Exit;
700700
}
@@ -710,7 +710,7 @@ QuicBindingCreateStatelessOperation(
710710
StatelessCtx =
711711
(QUIC_STATELESS_CONTEXT*)CxPlatPoolAlloc(&Worker->StatelessContextPool);
712712
if (StatelessCtx == NULL) {
713-
QuicPacketLogDrop(Binding, CxPlatDataPathRecvDataToRecvPacket(Datagram),
713+
QuicPacketLogDrop(Binding, GetQuicRxPacket(Datagram),
714714
"Alloc failure for stateless oper ctx");
715715
goto Exit;
716716
}
@@ -753,14 +753,14 @@ QuicBindingQueueStatelessOperation(
753753
)
754754
{
755755
if (MsQuicLib.StatelessRegistration == NULL) {
756-
QuicPacketLogDrop(Binding, CxPlatDataPathRecvDataToRecvPacket(Datagram),
756+
QuicPacketLogDrop(Binding, GetQuicRxPacket(Datagram),
757757
"NULL stateless registration");
758758
return FALSE;
759759
}
760760

761761
QUIC_WORKER* Worker = QuicLibraryGetWorker(Datagram);
762762
if (QuicWorkerIsOverloaded(Worker)) {
763-
QuicPacketLogDrop(Binding, CxPlatDataPathRecvDataToRecvPacket(Datagram),
763+
QuicPacketLogDrop(Binding, GetQuicRxPacket(Datagram),
764764
"Stateless worker overloaded (stateless oper)");
765765
return FALSE;
766766
}
@@ -780,7 +780,7 @@ QuicBindingQueueStatelessOperation(
780780
sizeof(QUIC_OPERATION));
781781
QuicPacketLogDrop(
782782
Binding,
783-
CxPlatDataPathRecvDataToRecvPacket(Datagram),
783+
GetQuicRxPacket(Datagram),
784784
"Alloc failure for stateless operation");
785785
QuicBindingReleaseStatelessOperation(Context, FALSE);
786786
return FALSE;
@@ -801,8 +801,7 @@ QuicBindingProcessStatelessOperation(
801801
{
802802
QUIC_BINDING* Binding = StatelessCtx->Binding;
803803
CXPLAT_RECV_DATA* RecvDatagram = StatelessCtx->Datagram;
804-
CXPLAT_RECV_PACKET* RecvPacket =
805-
CxPlatDataPathRecvDataToRecvPacket(RecvDatagram);
804+
QUIC_RX_PACKET* RecvPacket = GetQuicRxPacket(RecvDatagram);
806805
QUIC_BUFFER* SendDatagram = NULL;
807806

808807
CXPLAT_DBG_ASSERT(RecvPacket->ValidatedHeaderInv);
@@ -893,7 +892,7 @@ QuicBindingProcessStatelessOperation(
893892
SupportedVersions,
894893
SupportedVersionsLength * sizeof(uint32_t));
895894

896-
CXPLAT_RECV_PACKET* Packet = CxPlatDataPathRecvDataToRecvPacket(RecvDatagram);
895+
QUIC_RX_PACKET* Packet = GetQuicRxPacket(RecvDatagram);
897896
Packet->ReleaseDeferred = FALSE;
898897

899898
QuicTraceLogVerbose(
@@ -922,11 +921,11 @@ QuicBindingProcessStatelessOperation(
922921
PacketLength >>= 5; // Only drop 5 of the 8 bits of randomness.
923922
PacketLength += QUIC_RECOMMENDED_STATELESS_RESET_PACKET_LENGTH;
924923

925-
if (PacketLength >= RecvPacket->BufferLength) {
924+
if (PacketLength >= RecvPacket->AvailBufferLength) {
926925
//
927926
// Can't go over the recieve packet's length.
928927
//
929-
PacketLength = (uint8_t)RecvPacket->BufferLength - 1;
928+
PacketLength = (uint8_t)RecvPacket->AvailBufferLength - 1;
930929
}
931930

932931
if (PacketLength < QUIC_MIN_STATELESS_RESET_PACKET_LENGTH) {
@@ -1118,7 +1117,7 @@ QuicBindingQueueStatelessReset(
11181117
CXPLAT_DBG_ASSERT(!((QUIC_SHORT_HEADER_V1*)Datagram->Buffer)->IsLongHeader);
11191118

11201119
if (Datagram->BufferLength <= QUIC_MIN_STATELESS_RESET_PACKET_LENGTH) {
1121-
QuicPacketLogDrop(Binding, CxPlatDataPathRecvDataToRecvPacket(Datagram),
1120+
QuicPacketLogDrop(Binding, GetQuicRxPacket(Datagram),
11221121
"Packet too short for stateless reset");
11231122
return FALSE;
11241123
}
@@ -1129,7 +1128,7 @@ QuicBindingQueueStatelessReset(
11291128
// a connection ID. Without a connection ID, a stateless reset token
11301129
// cannot be generated.
11311130
//
1132-
QuicPacketLogDrop(Binding, CxPlatDataPathRecvDataToRecvPacket(Datagram),
1131+
QuicPacketLogDrop(Binding, GetQuicRxPacket(Datagram),
11331132
"No stateless reset on exclusive binding");
11341133
return FALSE;
11351134
}
@@ -1147,10 +1146,10 @@ QuicBindingPreprocessDatagram(
11471146
_Out_ BOOLEAN* ReleaseDatagram
11481147
)
11491148
{
1150-
CXPLAT_RECV_PACKET* Packet = CxPlatDataPathRecvDataToRecvPacket(Datagram);
1151-
CxPlatZeroMemory(&Packet->PacketNumber, sizeof(CXPLAT_RECV_PACKET) - sizeof(uint64_t));
1152-
Packet->Buffer = Datagram->Buffer;
1153-
Packet->BufferLength = Datagram->BufferLength;
1149+
QUIC_RX_PACKET* Packet = GetQuicRxPacket(Datagram);
1150+
CxPlatZeroMemory(&Packet->PacketNumber, sizeof(QUIC_RX_PACKET) - sizeof(uint64_t));
1151+
Packet->AvailBuffer = Datagram->Buffer;
1152+
Packet->AvailBufferLength = Datagram->BufferLength;
11541153

11551154
*ReleaseDatagram = TRUE;
11561155

@@ -1219,7 +1218,7 @@ _IRQL_requires_max_(DISPATCH_LEVEL)
12191218
BOOLEAN
12201219
QuicBindingShouldRetryConnection(
12211220
_In_ const QUIC_BINDING* const Binding,
1222-
_In_ CXPLAT_RECV_PACKET* Packet,
1221+
_In_ QUIC_RX_PACKET* Packet,
12231222
_In_ uint16_t TokenLength,
12241223
_In_reads_(TokenLength)
12251224
const uint8_t* Token,
@@ -1269,7 +1268,7 @@ QuicBindingCreateConnection(
12691268
// QuicLookupAddRemoteHash.
12701269
//
12711270

1272-
CXPLAT_RECV_PACKET* Packet = CxPlatDataPathRecvDataToRecvPacket(Datagram);
1271+
QUIC_RX_PACKET* Packet = GetQuicRxPacket(Datagram);
12731272

12741273
//
12751274
// Pick a stateless worker to process the client hello and if successful,
@@ -1312,7 +1311,7 @@ QuicBindingCreateConnection(
13121311
//
13131312

13141313
if (!QuicLibraryTryAddRefBinding(Binding)) {
1315-
QuicPacketLogDrop(Binding, CxPlatDataPathRecvDataToRecvPacket(Datagram),
1314+
QuicPacketLogDrop(Binding, GetQuicRxPacket(Datagram),
13161315
"Clean up in progress");
13171316
goto Exit;
13181317
}
@@ -1414,7 +1413,7 @@ QuicBindingDropBlockedSourcePorts(
14141413
if (BlockedPorts[i] == SourcePort) {
14151414
QuicPacketLogDrop(
14161415
Binding,
1417-
CxPlatDataPathRecvDataToRecvPacket(Datagram),
1416+
GetQuicRxPacket(Datagram),
14181417
"Blocked source port");
14191418
return TRUE;
14201419
}
@@ -1438,8 +1437,7 @@ QuicBindingDeliverDatagrams(
14381437
_In_ uint32_t DatagramChainByteLength
14391438
)
14401439
{
1441-
CXPLAT_RECV_PACKET* Packet =
1442-
CxPlatDataPathRecvDataToRecvPacket(DatagramChain);
1440+
QUIC_RX_PACKET* Packet = GetQuicRxPacket(DatagramChain);
14431441
CXPLAT_DBG_ASSERT(Packet->ValidatedHeaderInv);
14441442

14451443
//
@@ -1654,13 +1652,20 @@ QuicBindingReceive(
16541652
DatagramChain = Datagram->Next;
16551653
Datagram->Next = NULL;
16561654

1657-
CXPLAT_RECV_PACKET* Packet =
1658-
CxPlatDataPathRecvDataToRecvPacket(Datagram);
1659-
CxPlatZeroMemory(Packet, sizeof(CXPLAT_RECV_PACKET));
1655+
QUIC_RX_PACKET* Packet = GetQuicRxPacket(Datagram);
16601656
Packet->PacketId =
16611657
PartitionShifted | InterlockedIncrement64((int64_t*)&QuicLibraryGetPerProc()->ReceivePacketId);
1662-
Packet->Buffer = Datagram->Buffer;
1663-
Packet->BufferLength = Datagram->BufferLength;
1658+
Packet->PacketNumber = 0;
1659+
Packet->AvailBuffer = Datagram->Buffer;
1660+
Packet->DestCid = NULL;
1661+
Packet->SourceCid = NULL;
1662+
Packet->AvailBufferLength = Datagram->BufferLength;
1663+
Packet->HeaderLength = 0;
1664+
Packet->PayloadLength = 0;
1665+
Packet->DestCidLen = 0;
1666+
Packet->SourceCidLen = 0;
1667+
Packet->KeyType = QUIC_PACKET_KEY_INITIAL;
1668+
Packet->Flags = 0;
16641669

16651670
CXPLAT_DBG_ASSERT(Packet->PacketId != 0);
16661671
QuicTraceEvent(
@@ -1708,8 +1713,7 @@ QuicBindingReceive(
17081713
// the same connection and this chain-splitting step is skipped.)
17091714
//
17101715
if (!Binding->Exclusive && SubChain != NULL) {
1711-
CXPLAT_RECV_PACKET* SubChainPacket =
1712-
CxPlatDataPathRecvDataToRecvPacket(SubChain);
1716+
QUIC_RX_PACKET* SubChainPacket = GetQuicRxPacket(SubChain);
17131717
if ((Packet->DestCidLen != SubChainPacket->DestCidLen ||
17141718
memcmp(Packet->DestCid, SubChainPacket->DestCid, Packet->DestCidLen) != 0)) {
17151719
if (!QuicBindingDeliverDatagrams(Binding, SubChain, SubChainLength, SubChainBytes)) {

src/core/binding.h

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,13 @@ typedef struct QUIC_TOKEN_CONTENTS {
2828
//
2929
// The per recv buffer context type.
3030
//
31-
typedef struct CXPLAT_RECV_PACKET {
31+
typedef struct QUIC_RX_PACKET {
32+
33+
#ifdef __cplusplus
34+
struct CXPLAT_RECV_DATA _;
35+
#else
36+
struct CXPLAT_RECV_DATA;
37+
#endif
3238

3339
//
3440
// The unique identifier for the packet.
@@ -44,8 +50,8 @@ typedef struct CXPLAT_RECV_PACKET {
4450
// The current packet buffer.
4551
//
4652
union {
47-
_Field_size_(BufferLength)
48-
const uint8_t* Buffer;
53+
_Field_size_(AvailBufferLength)
54+
const uint8_t* AvailBuffer;
4955
const struct QUIC_HEADER_INVARIANT* Invariant;
5056
const struct QUIC_VERSION_NEGOTIATION_PACKET* VerNeg;
5157
const struct QUIC_LONG_HEADER_V1* LH;
@@ -64,9 +70,9 @@ typedef struct CXPLAT_RECV_PACKET {
6470
const uint8_t* SourceCid;
6571

6672
//
67-
// Length of the Buffer array.
73+
// Length of the AvailBuffer array.
6874
//
69-
uint16_t BufferLength;
75+
uint16_t AvailBufferLength;
7076

7177
//
7278
// Length of the current packet header.
@@ -89,6 +95,9 @@ typedef struct CXPLAT_RECV_PACKET {
8995
//
9096
QUIC_PACKET_KEY_TYPE KeyType;
9197

98+
union {
99+
uint32_t Flags;
100+
struct {
92101
//
93102
// Flag indicating we have found the connection the packet belongs to.
94103
//
@@ -151,8 +160,12 @@ typedef struct CXPLAT_RECV_PACKET {
151160
// Flag indicating the packet contained a non-probing frame.
152161
//
153162
BOOLEAN HasNonProbingFrame : 1;
163+
};
164+
};
165+
166+
} QUIC_RX_PACKET;
154167

155-
} CXPLAT_RECV_PACKET;
168+
#define GetQuicRxPacket(RecvData) ((QUIC_RX_PACKET*)RecvData)
156169

157170
typedef enum QUIC_BINDING_LOOKUP_TYPE {
158171

@@ -455,7 +468,7 @@ inline
455468
_IRQL_requires_max_(DISPATCH_LEVEL)
456469
BOOLEAN
457470
QuicRetryTokenDecrypt(
458-
_In_ const CXPLAT_RECV_PACKET* const Packet,
471+
_In_ const QUIC_RX_PACKET* const Packet,
459472
_In_reads_(sizeof(QUIC_TOKEN_CONTENTS))
460473
const uint8_t* TokenBuffer,
461474
_Out_ QUIC_TOKEN_CONTENTS* Token

0 commit comments

Comments
 (0)