Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for both Qtip and UDP traffic for Server Listeners. #4803

Draft
wants to merge 42 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
63a4f6f
first iteration
ProjectsByJackHe Feb 7, 2025
4312eea
test code sanity check
ProjectsByJackHe Feb 7, 2025
f865630
full revert
ProjectsByJackHe Feb 7, 2025
19354ee
test this out
ProjectsByJackHe Feb 10, 2025
a2511c3
update control.cpp as well
ProjectsByJackHe Feb 10, 2025
2db51dd
update all instances of connAndPing
ProjectsByJackHe Feb 10, 2025
0a1ec39
sanity check
ProjectsByJackHe Feb 10, 2025
07aedfd
do not define multiple of these registrations
ProjectsByJackHe Feb 10, 2025
ae85b9f
turn QTIP off right after Listener.Start
ProjectsByJackHe Feb 11, 2025
cf38283
don't pass nullptr as size
ProjectsByJackHe Feb 11, 2025
1c9fa0b
revert back to old code - useqtip test SHOULD fail
ProjectsByJackHe Feb 11, 2025
93ff078
move the server config instantiation after we set qtip to be off
ProjectsByJackHe Feb 11, 2025
ba3c146
add sanity checks
ProjectsByJackHe Feb 11, 2025
c7b920a
fix sanity check
ProjectsByJackHe Feb 11, 2025
ebd9fd9
revise sanity check
ProjectsByJackHe Feb 11, 2025
5b2de37
better sanity check
ProjectsByJackHe Feb 12, 2025
b590242
set socket->usetcp to always false and see what happens when we enabl…
ProjectsByJackHe Feb 13, 2025
5486743
resolve warning for winkernel
ProjectsByJackHe Feb 13, 2025
1495588
add a couple of setparams
ProjectsByJackHe Feb 13, 2025
cae946f
add a few getparams
ProjectsByJackHe Feb 13, 2025
6629817
remember to generate cs
ProjectsByJackHe Feb 14, 2025
1adaad5
resolve merge conflicts
ProjectsByJackHe Feb 14, 2025
455b833
adjust hex
ProjectsByJackHe Feb 14, 2025
1c0c411
proper parameter definitions
ProjectsByJackHe Feb 14, 2025
0f5a6c6
delete include
ProjectsByJackHe Feb 14, 2025
a68f0f5
don't hardcode 0
ProjectsByJackHe Feb 14, 2025
64a9dff
add back removed include
ProjectsByJackHe Feb 14, 2025
38ba016
try and see if this works
ProjectsByJackHe Feb 15, 2025
1688d4d
address comment feedback
ProjectsByJackHe Feb 18, 2025
d6a7244
update CLOG
ProjectsByJackHe Feb 18, 2025
5b59fd9
sanity check
ProjectsByJackHe Feb 18, 2025
bac8b9d
sanity check pt 2
ProjectsByJackHe Feb 18, 2025
415688d
allow conn to opt-in on whether to use qtip or not
ProjectsByJackHe Feb 18, 2025
dd53344
let's not modify route logic in core code
ProjectsByJackHe Feb 18, 2025
6e8c2d0
write to route also
ProjectsByJackHe Feb 18, 2025
5b83325
use uint8_t instead of BOOLEAN
ProjectsByJackHe Feb 18, 2025
ffca523
don't mess with kqueue stuff
ProjectsByJackHe Feb 18, 2025
4652e63
looks like we need kqueue changes here
ProjectsByJackHe Feb 18, 2025
52ca291
finding needle in haystack
ProjectsByJackHe Feb 19, 2025
61fa178
error: expected parameter declarator; fix is to remove extra comma?
ProjectsByJackHe Feb 19, 2025
8ad43c6
add back Socket->UseTcp in datapath_raw_socket.c
ProjectsByJackHe Feb 19, 2025
1cde3f8
expectation: QTIP tests should crash
ProjectsByJackHe Feb 19, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 33 additions & 0 deletions src/core/connection.c
Original file line number Diff line number Diff line change
Expand Up @@ -6648,6 +6648,21 @@
break;
}

case QUIC_PARAM_CONN_QTIP: {
if (BufferLength != sizeof(BOOLEAN) || Buffer == NULL) {
Status = QUIC_STATUS_INVALID_PARAMETER;
break;

Check warning on line 6654 in src/core/connection.c

View check run for this annotation

Codecov / codecov/patch

src/core/connection.c#L6652-L6654

Added lines #L6652 - L6654 were not covered by tests
}
if (Connection->State.Started) {
Status = QUIC_STATUS_INVALID_STATE;
break;

Check warning on line 6658 in src/core/connection.c

View check run for this annotation

Codecov / codecov/patch

src/core/connection.c#L6656-L6658

Added lines #L6656 - L6658 were not covered by tests
}
Connection->State.UseQTIP = *(BOOLEAN*)Buffer;
Connection->State.AppDidSetQTIP = TRUE;
Status = QUIC_STATUS_SUCCESS;
break;

Check warning on line 6663 in src/core/connection.c

View check run for this annotation

Codecov / codecov/patch

src/core/connection.c#L6660-L6663

Added lines #L6660 - L6663 were not covered by tests
}

//
// Private
//
Expand Down Expand Up @@ -7284,6 +7299,24 @@
Status = QUIC_STATUS_SUCCESS;
break;

case QUIC_PARAM_CONN_QTIP:
if (*BufferLength < sizeof(BOOLEAN)) {
*BufferLength = sizeof(BOOLEAN);
Status = QUIC_STATUS_BUFFER_TOO_SMALL;
break;

Check warning on line 7306 in src/core/connection.c

View check run for this annotation

Codecov / codecov/patch

src/core/connection.c#L7303-L7306

Added lines #L7303 - L7306 were not covered by tests
}

if (Buffer == NULL) {
Status = QUIC_STATUS_INVALID_PARAMETER;
break;

Check warning on line 7311 in src/core/connection.c

View check run for this annotation

Codecov / codecov/patch

src/core/connection.c#L7309-L7311

Added lines #L7309 - L7311 were not covered by tests
}

*BufferLength = sizeof(BOOLEAN);
*(BOOLEAN*)Buffer = Connection->State.UseQTIP;

Check warning on line 7315 in src/core/connection.c

View check run for this annotation

Codecov / codecov/patch

src/core/connection.c#L7314-L7315

Added lines #L7314 - L7315 were not covered by tests

Status = QUIC_STATUS_SUCCESS;
break;

Check warning on line 7318 in src/core/connection.c

View check run for this annotation

Codecov / codecov/patch

src/core/connection.c#L7317-L7318

Added lines #L7317 - L7318 were not covered by tests

default:
Status = QUIC_STATUS_INVALID_PARAMETER;
break;
Expand Down
10 changes: 10 additions & 0 deletions src/core/connection.h
Original file line number Diff line number Diff line change
Expand Up @@ -208,6 +208,16 @@ typedef union QUIC_CONNECTION_STATE {
//
BOOLEAN DisableVneTp : 1;
#endif

//
// Whether to use QTIP on sends for this connection.
//
BOOLEAN UseQTIP : 1;

//
// Whether or not the app explicitly set the UseQTIP flag.
//
BOOLEAN AppDidSetQTIP : 1;
};
} QUIC_CONNECTION_STATE;

Expand Down
81 changes: 57 additions & 24 deletions src/core/listener.c
Original file line number Diff line number Diff line change
Expand Up @@ -740,35 +740,49 @@
const void* Buffer
)
{
if (Param == QUIC_PARAM_LISTENER_CIBIR_ID) {
if (BufferLength > QUIC_MAX_CIBIR_LENGTH + 1) {
return QUIC_STATUS_INVALID_PARAMETER;
}
if (BufferLength == 0) {
CxPlatZeroMemory(Listener->CibirId, sizeof(Listener->CibirId));
switch (Param) {
case QUIC_PARAM_LISTENER_CIBIR_ID: {
if (BufferLength > QUIC_MAX_CIBIR_LENGTH + 1) {
return QUIC_STATUS_INVALID_PARAMETER;
}
if (BufferLength == 0) {
CxPlatZeroMemory(Listener->CibirId, sizeof(Listener->CibirId));
return QUIC_STATUS_SUCCESS;
}
if (BufferLength < 2) { // Must have at least the offset and 1 byte of payload.
return QUIC_STATUS_INVALID_PARAMETER;
}

if (((uint8_t*)Buffer)[0] != 0) {
return QUIC_STATUS_NOT_SUPPORTED; // Not yet supproted.
}

Listener->CibirId[0] = (uint8_t)BufferLength - 1;
memcpy(Listener->CibirId + 1, Buffer, BufferLength);

QuicTraceLogVerbose(
ListenerCibirIdSet,
"[list][%p] CIBIR ID set (len %hhu, offset %hhu)",
Listener,
Listener->CibirId[0],
Listener->CibirId[1]);

return QUIC_STATUS_SUCCESS;
}
if (BufferLength < 2) { // Must have at least the offset and 1 byte of payload.
return QUIC_STATUS_INVALID_PARAMETER;
}

if (((uint8_t*)Buffer)[0] != 0) {
return QUIC_STATUS_NOT_SUPPORTED; // Not yet supproted.
case QUIC_PARAM_LISTENER_QTIP: {
if (BufferLength > sizeof(uint8_t)) {
return QUIC_STATUS_INVALID_PARAMETER;

Check warning on line 774 in src/core/listener.c

View check run for this annotation

Codecov / codecov/patch

src/core/listener.c#L773-L774

Added lines #L773 - L774 were not covered by tests
}
if (Buffer == NULL) {
return QUIC_STATUS_INVALID_PARAMETER;

Check warning on line 777 in src/core/listener.c

View check run for this annotation

Codecov / codecov/patch

src/core/listener.c#L776-L777

Added lines #L776 - L777 were not covered by tests
}
Listener->UseQTIP = *(uint8_t*)Buffer;
return QUIC_STATUS_SUCCESS;

Check warning on line 780 in src/core/listener.c

View check run for this annotation

Codecov / codecov/patch

src/core/listener.c#L779-L780

Added lines #L779 - L780 were not covered by tests
}

Listener->CibirId[0] = (uint8_t)BufferLength - 1;
memcpy(Listener->CibirId + 1, Buffer, BufferLength);

QuicTraceLogVerbose(
ListenerCibirIdSet,
"[list][%p] CIBIR ID set (len %hhu, offset %hhu)",
Listener,
Listener->CibirId[0],
Listener->CibirId[1]);

return QUIC_STATUS_SUCCESS;
default:
break;
}

return QUIC_STATUS_INVALID_PARAMETER;
}

Expand Down Expand Up @@ -855,6 +869,25 @@
Status = QUIC_STATUS_SUCCESS;
break;

case QUIC_PARAM_LISTENER_QTIP:

if (*BufferLength < sizeof(uint8_t)) {
*BufferLength = sizeof(uint8_t);
Status = QUIC_STATUS_BUFFER_TOO_SMALL;
break;

Check warning on line 877 in src/core/listener.c

View check run for this annotation

Codecov / codecov/patch

src/core/listener.c#L874-L877

Added lines #L874 - L877 were not covered by tests
}

if (Buffer == NULL) {
Status = QUIC_STATUS_INVALID_PARAMETER;
break;

Check warning on line 882 in src/core/listener.c

View check run for this annotation

Codecov / codecov/patch

src/core/listener.c#L880-L882

Added lines #L880 - L882 were not covered by tests
}

*BufferLength = sizeof(uint8_t);
*(uint8_t*)Buffer = Listener->UseQTIP;

Check warning on line 886 in src/core/listener.c

View check run for this annotation

Codecov / codecov/patch

src/core/listener.c#L885-L886

Added lines #L885 - L886 were not covered by tests

Status = QUIC_STATUS_SUCCESS;
break;

Check warning on line 889 in src/core/listener.c

View check run for this annotation

Codecov / codecov/patch

src/core/listener.c#L888-L889

Added lines #L888 - L889 were not covered by tests

default:
Status = QUIC_STATUS_INVALID_PARAMETER;
break;
Expand Down
5 changes: 5 additions & 0 deletions src/core/listener.h
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,11 @@ typedef struct QUIC_LISTENER {
//
uint8_t CibirId[2 + QUIC_MAX_CIBIR_LENGTH];

//
// Whether or not this listener accepts QTIP traffic (BOOLEAN)
//
BOOLEAN UseQTIP : 1;

} QUIC_LISTENER;

#ifdef QUIC_SILO
Expand Down
2 changes: 1 addition & 1 deletion src/core/send.c
Original file line number Diff line number Diff line change
Expand Up @@ -1061,7 +1061,7 @@ CxPlatIsRouteReady(
QuicConnAddRef(Connection, QUIC_CONN_REF_ROUTE);
QUIC_STATUS Status =
CxPlatResolveRoute(
Path->Binding->Socket, &Path->Route, Path->ID, (void*)Connection, QuicConnQueueRouteCompletion);
Path->Binding->Socket, &Path->Route, Path->ID, (void*)Connection, QuicConnQueueRouteCompletion, Connection->State.UseQTIP, Connection->State.AppDidSetQTIP);
if (Status == QUIC_STATUS_SUCCESS) {
QuicConnRelease(Connection, QUIC_CONN_REF_ROUTE);
return TRUE;
Expand Down
6 changes: 6 additions & 0 deletions src/cs/lib/msquic_generated.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3372,6 +3372,9 @@ internal static unsafe partial class MsQuic
[NativeTypeName("#define QUIC_PARAM_LISTENER_CIBIR_ID 0x04000002")]
internal const uint QUIC_PARAM_LISTENER_CIBIR_ID = 0x04000002;

[NativeTypeName("#define QUIC_PARAM_LISTENER_QTIP 0x04000004")]
internal const uint QUIC_PARAM_LISTENER_QTIP = 0x04000004;

[NativeTypeName("#define QUIC_PARAM_CONN_QUIC_VERSION 0x05000000")]
internal const uint QUIC_PARAM_CONN_QUIC_VERSION = 0x05000000;

Expand Down Expand Up @@ -3450,6 +3453,9 @@ internal static unsafe partial class MsQuic
[NativeTypeName("#define QUIC_PARAM_CONN_SEND_DSCP 0x05000019")]
internal const uint QUIC_PARAM_CONN_SEND_DSCP = 0x05000019;

[NativeTypeName("#define QUIC_PARAM_CONN_QTIP 0x0500001A")]
internal const uint QUIC_PARAM_CONN_QTIP = 0x0500001A;

[NativeTypeName("#define QUIC_PARAM_TLS_HANDSHAKE_INFO 0x06000000")]
internal const uint QUIC_PARAM_TLS_HANDSHAKE_INFO = 0x06000000;

Expand Down
10 changes: 5 additions & 5 deletions src/generated/linux/listener.c.clog.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,11 +71,11 @@ tracepoint(CLOG_LISTENER_C, ListenerIndicateNewConnection , arg2, arg3);\
// Decoder Ring for ListenerCibirIdSet
// [list][%p] CIBIR ID set (len %hhu, offset %hhu)
// QuicTraceLogVerbose(
ListenerCibirIdSet,
"[list][%p] CIBIR ID set (len %hhu, offset %hhu)",
Listener,
Listener->CibirId[0],
Listener->CibirId[1]);
ListenerCibirIdSet,
"[list][%p] CIBIR ID set (len %hhu, offset %hhu)",
Listener,
Listener->CibirId[0],
Listener->CibirId[1]);
// arg2 = arg2 = Listener = arg2
// arg3 = arg3 = Listener->CibirId[0] = arg3
// arg4 = arg4 = Listener->CibirId[1] = arg4
Expand Down
10 changes: 5 additions & 5 deletions src/generated/linux/listener.c.clog.h.lttng.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,11 +47,11 @@ TRACEPOINT_EVENT(CLOG_LISTENER_C, ListenerIndicateNewConnection,
// Decoder Ring for ListenerCibirIdSet
// [list][%p] CIBIR ID set (len %hhu, offset %hhu)
// QuicTraceLogVerbose(
ListenerCibirIdSet,
"[list][%p] CIBIR ID set (len %hhu, offset %hhu)",
Listener,
Listener->CibirId[0],
Listener->CibirId[1]);
ListenerCibirIdSet,
"[list][%p] CIBIR ID set (len %hhu, offset %hhu)",
Listener,
Listener->CibirId[0],
Listener->CibirId[1]);
// arg2 = arg2 = Listener = arg2
// arg3 = arg3 = Listener->CibirId[0] = arg3
// arg4 = arg4 = Listener->CibirId[1] = arg4
Expand Down
5 changes: 5 additions & 0 deletions src/inc/msquic.h
Original file line number Diff line number Diff line change
Expand Up @@ -889,6 +889,7 @@ typedef struct QUIC_SCHANNEL_CREDENTIAL_ATTRIBUTE_W {
#define QUIC_PARAM_LISTENER_STATS 0x04000001 // QUIC_LISTENER_STATISTICS
#ifdef QUIC_API_ENABLE_PREVIEW_FEATURES
#define QUIC_PARAM_LISTENER_CIBIR_ID 0x04000002 // uint8_t[] {offset, id[]}
#define QUIC_PARAM_LISTENER_QTIP 0x04000004 // uint8_t (BOOLEAN)
#endif

//
Expand Down Expand Up @@ -925,6 +926,10 @@ typedef struct QUIC_SCHANNEL_CREDENTIAL_ATTRIBUTE_W {
#define QUIC_PARAM_CONN_ORIG_DEST_CID 0x05000018 // uint8_t[]
#define QUIC_PARAM_CONN_SEND_DSCP 0x05000019 // uint8_t

#ifdef QUIC_API_ENABLE_PREVIEW_FEATURES
#define QUIC_PARAM_CONN_QTIP 0x0500001A // uint8_t (BOOLEAN)
#endif

//
// Parameters for TLS.
//
Expand Down
7 changes: 5 additions & 2 deletions src/inc/quic_datapath.h
Original file line number Diff line number Diff line change
Expand Up @@ -202,14 +202,15 @@ typedef struct CXPLAT_ROUTE {
uint8_t NextHopLinkLayerAddress[6];

uint16_t DatapathType; // CXPLAT_DATAPATH_TYPE
uint8_t UseQTIP : 1; // TRUE if the route is using QTIP
uint8_t AppDidSetQTIP : 1; // TRUE if the app explicitly set the UseQTIP flag

//
// QuicCopyRouteInfo copies memory up to this point (not including State).
//

CXPLAT_ROUTE_STATE State;
CXPLAT_RAW_TCP_STATE TcpState;

} CXPLAT_ROUTE;

//
Expand Down Expand Up @@ -848,7 +849,9 @@ CxPlatResolveRoute(
_Inout_ CXPLAT_ROUTE* Route,
_In_ uint8_t PathId,
_In_ void* Context,
_In_ CXPLAT_ROUTE_RESOLUTION_CALLBACK_HANDLER Callback
_In_ CXPLAT_ROUTE_RESOLUTION_CALLBACK_HANDLER Callback,
_In_ uint8_t UseQTIP,
_In_ uint8_t OverrideGlobalQTIPSettings
);

_IRQL_requires_max_(PASSIVE_LEVEL)
Expand Down
6 changes: 5 additions & 1 deletion src/platform/datapath_kqueue.c
Original file line number Diff line number Diff line change
Expand Up @@ -2156,13 +2156,17 @@ CxPlatResolveRoute(
_Inout_ CXPLAT_ROUTE* Route,
_In_ uint8_t PathId,
_In_ void* Context,
_In_ CXPLAT_ROUTE_RESOLUTION_CALLBACK_HANDLER Callback
_In_ CXPLAT_ROUTE_RESOLUTION_CALLBACK_HANDLER Callback,
_In_ uint8_t UseQTIP,
_In_ uint8_t OverrideGlobalQTIPSettings
)
{
UNREFERENCED_PARAMETER(Socket);
UNREFERENCED_PARAMETER(PathId);
UNREFERENCED_PARAMETER(Context);
UNREFERENCED_PARAMETER(Callback);
UNREFERENCED_PARAMETER(UseQTIP);
UNREFERENCED_PARAMETER(OverrideGlobalQTIPSettings);
Route->State = RouteResolved;
return QUIC_STATUS_SUCCESS;
}
Expand Down
7 changes: 6 additions & 1 deletion src/platform/datapath_raw.c
Original file line number Diff line number Diff line change
Expand Up @@ -234,7 +234,12 @@ CxPlatDpRawRxEthernet(

if (Socket) {
if (PacketChain->Reserved == L4_TYPE_UDP || PacketChain->Reserved == L4_TYPE_TCP) {
uint8_t SocketType = Socket->UseTcp ? L4_TYPE_TCP : L4_TYPE_UDP;
//
// If we have UseTcp enabled, we should still support UDP type of packets.
//
// uint8_t SocketType = (Socket->UseTcp && PacketChain->Reserved == L4_TYPE_TCP) ? L4_TYPE_TCP : L4_TYPE_UDP;

uint8_t SocketType = (Socket->UseTcp) ? L4_TYPE_TCP : L4_TYPE_UDP; // This is the old code

//
// Found a match. Chain and deliver contiguous packets with the same 4-tuple.
Expand Down
2 changes: 1 addition & 1 deletion src/platform/datapath_raw_socket.c
Original file line number Diff line number Diff line change
Expand Up @@ -1139,4 +1139,4 @@ CxPlatTryAddSocket(
}

return Status;
}
}
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

will address this.

2 changes: 1 addition & 1 deletion src/platform/datapath_winuser.c
Original file line number Diff line number Diff line change
Expand Up @@ -1490,7 +1490,7 @@ SocketCreateUdp(
Socket->HasFixedRemoteAddress = (Config->RemoteAddress != NULL);
Socket->Type = CXPLAT_SOCKET_UDP;
Socket->UseRio = Datapath->UseRio;
Socket->UseTcp = Datapath->UseTcp;
Socket->UseTcp = Datapath->UseTcp; // TODO: If we ever decide to remove the global execution param, this needs to be updated.
if (Config->LocalAddress) {
CxPlatConvertToMappedV6(Config->LocalAddress, &Socket->LocalAddress);
} else {
Expand Down
9 changes: 8 additions & 1 deletion src/platform/datapath_xplat.c
Original file line number Diff line number Diff line change
Expand Up @@ -409,9 +409,16 @@ CxPlatResolveRoute(
_Inout_ CXPLAT_ROUTE* Route,
_In_ uint8_t PathId,
_In_ void* Context,
_In_ CXPLAT_ROUTE_RESOLUTION_CALLBACK_HANDLER Callback
_In_ CXPLAT_ROUTE_RESOLUTION_CALLBACK_HANDLER Callback,
_In_ uint8_t UseQTIP,
_In_ uint8_t OverrideGlobalQTIPSettings
)
{
if (OverrideGlobalQTIPSettings) {
Socket->UseTcp = UseQTIP;
Route->UseQTIP = UseQTIP;
Route->AppDidSetQTIP = TRUE;
}
if (Socket->UseTcp || Route->DatapathType == CXPLAT_DATAPATH_TYPE_RAW ||
(Route->DatapathType == CXPLAT_DATAPATH_TYPE_UNKNOWN &&
Socket->RawSocketAvailable && !IS_LOOPBACK(Route->RemoteAddress))) {
Expand Down
2 changes: 1 addition & 1 deletion src/platform/unittest/DataPathTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -569,7 +569,7 @@ struct CxPlatSocket {
// This is a connected socket and its route must be resolved
// to be able to send traffic.
//
InitStatus = CxPlatResolveRoute(Socket, &Route, 0, &Route, ResolveRouteComplete);
InitStatus = CxPlatResolveRoute(Socket, &Route, 0, &Route, ResolveRouteComplete, FALSE, FALSE);
//
// Duonic sets up static neighbor entries, so CxPlatResolveRoute should
// complete synchronously. If this changes, we will need to add code to
Expand Down
4 changes: 3 additions & 1 deletion src/test/MsQuicTests.h
Original file line number Diff line number Diff line change
Expand Up @@ -407,7 +407,8 @@ QuicTestConnectAndPing(
_In_ bool UseSendBuffer,
_In_ bool UnidirectionalStreams,
_In_ bool ServerInitiatedStreams,
_In_ bool FifoScheduling
_In_ bool FifoScheduling,
_In_ bool SendUdpToQtipListener
);

//
Expand Down Expand Up @@ -820,6 +821,7 @@ typedef struct {
uint8_t UnidirectionalStreams;
uint8_t ServerInitiatedStreams;
uint8_t FifoScheduling;
uint8_t SendUdpToQtipListener;
} QUIC_RUN_CONNECT_AND_PING_PARAMS;

#pragma pack(pop)
Expand Down
Loading
Loading