Skip to content

Commit

Permalink
Remove change to collect TOS on Windows platforms on receive. Address…
Browse files Browse the repository at this point in the history
… comments.
  • Loading branch information
anrossi committed Jan 31, 2025
1 parent 35eff60 commit 2ea4426
Show file tree
Hide file tree
Showing 17 changed files with 87 additions and 73 deletions.
2 changes: 1 addition & 1 deletion docs/Settings.md
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,7 @@ These parameters are accessed by calling [GetParam](./api/GetParam.md) or [SetPa
| `QUIC_PARAM_CONN_STATISTICS_V2`<br> 22 | QUIC_STATISTICS_V2 | Get-only | Connection-level statistics, version 2. |
| `QUIC_PARAM_CONN_STATISTICS_V2_PLAT`<br> 23 | QUIC_STATISTICS_V2 | Get-only | Connection-level statistics with platform-specific time format, version 2. |
| `QUIC_PARAM_CONN_ORIG_DEST_CID` <br> 24 | uint8_t[] | Get-only | The original destination connection ID used by the client to connect to the server. |
| `QUIC_PARAM_CONN_DSCP` <br> 25 | uint8_t | Both | The DiffServ Code Point put in the DiffServ field (formerly TypeOfService/TrafficClass) on packets sent from this connection. |
| `QUIC_PARAM_CONN_SEND_DSCP` <br> 25 | uint8_t | Both | The DiffServ Code Point put in the DiffServ field (formerly TypeOfService/TrafficClass) on packets sent from this connection. |

### QUIC_PARAM_CONN_STATISTICS_V2

Expand Down
8 changes: 3 additions & 5 deletions src/core/connection.c
Original file line number Diff line number Diff line change
Expand Up @@ -6623,15 +6623,13 @@ QuicConnParamSet(
return QUIC_STATUS_SUCCESS;
}

case QUIC_PARAM_CONN_DSCP:
{
case QUIC_PARAM_CONN_SEND_DSCP: {
if (BufferLength != sizeof(uint8_t) || Buffer == NULL) {
Status = QUIC_STATUS_INVALID_PARAMETER;
break;

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

View check run for this annotation

Codecov / codecov/patch

src/core/connection.c#L6627-L6629

Added lines #L6627 - L6629 were not covered by tests
}

uint8_t DSCP = 0;
CxPlatCopyMemory(&DSCP, Buffer, BufferLength);
uint8_t DSCP = *(uint8_t*)Buffer;

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

View check run for this annotation

Codecov / codecov/patch

src/core/connection.c#L6632

Added line #L6632 was not covered by tests

if (DSCP > CXPLAT_MAX_DSCP) {
Status = QUIC_STATUS_INVALID_PARAMETER;
Expand Down Expand Up @@ -7258,7 +7256,7 @@ QuicConnParamGet(
Status = QUIC_STATUS_SUCCESS;
break;

case QUIC_PARAM_CONN_DSCP:
case QUIC_PARAM_CONN_SEND_DSCP:

if (*BufferLength < sizeof(Connection->DSCP)) {
Status = QUIC_STATUS_BUFFER_TOO_SMALL;
Expand Down
4 changes: 2 additions & 2 deletions src/cs/lib/msquic_generated.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3447,8 +3447,8 @@ internal static unsafe partial class MsQuic
[NativeTypeName("#define QUIC_PARAM_CONN_ORIG_DEST_CID 0x05000018")]
internal const uint QUIC_PARAM_CONN_ORIG_DEST_CID = 0x05000018;

[NativeTypeName("#define QUIC_PARAM_CONN_DSCP 0x50000019")]
internal const uint QUIC_PARAM_CONN_DSCP = 0x50000019;
[NativeTypeName("#define QUIC_PARAM_CONN_SEND_DSCP 0x50000019")]
internal const uint QUIC_PARAM_CONN_SEND_DSCP = 0x50000019;

[NativeTypeName("#define QUIC_PARAM_TLS_HANDSHAKE_INFO 0x06000000")]
internal const uint QUIC_PARAM_TLS_HANDSHAKE_INFO = 0x06000000;
Expand Down
2 changes: 1 addition & 1 deletion src/inc/msquic.h
Original file line number Diff line number Diff line change
Expand Up @@ -923,7 +923,7 @@ typedef struct QUIC_SCHANNEL_CREDENTIAL_ATTRIBUTE_W {
#define QUIC_PARAM_CONN_STATISTICS_V2 0x05000016 // QUIC_STATISTICS_V2
#define QUIC_PARAM_CONN_STATISTICS_V2_PLAT 0x05000017 // QUIC_STATISTICS_V2
#define QUIC_PARAM_CONN_ORIG_DEST_CID 0x05000018 // uint8_t[]
#define QUIC_PARAM_CONN_DSCP 0x50000019 // uint8_t
#define QUIC_PARAM_CONN_SEND_DSCP 0x50000019 // uint8_t

//
// Parameters for TLS.
Expand Down
20 changes: 18 additions & 2 deletions src/inc/quic_datapath.h
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,22 @@ typedef enum CXPLAT_ECN_TYPE {

} CXPLAT_ECN_TYPE;

//
// Different DiffServ Code Points
//
typedef enum CXPLAT_DSCP_TYPE {

CXPLAT_DSCP_CS0 = 0,
CXPLAT_DSCP_LE = 1,
CXPLAT_DSCP_CS1 = 8,
CXPLAT_DSCP_CS2 = 16,
CXPLAT_DSCP_CS3 = 24,
CXPLAT_DSCP_CS4 = 32,
CXPLAT_DSCP_CS5 = 40,
CXPLAT_DSCP_EF = 46,

} CXPLAT_DSCP_TYPE;

//
// Helper to get the ECN type from the Type of Service field of received data.
//
Expand Down Expand Up @@ -455,7 +471,7 @@ CxPlatDataPathUpdateConfig(
#define CXPLAT_DATAPATH_FEATURE_TCP 0x0020
#define CXPLAT_DATAPATH_FEATURE_RAW 0x0040
#define CXPLAT_DATAPATH_FEATURE_TTL 0x0080
#define CXPLAT_DATAPATH_FEATURE_DSCP 0x0100
#define CXPLAT_DATAPATH_FEATURE_SEND_DSCP 0x0100

//
// Queries the currently supported features of the datapath.
Expand Down Expand Up @@ -687,7 +703,7 @@ typedef struct CXPLAT_SEND_CONFIG {
uint16_t MaxPacketSize;
uint8_t ECN; // CXPLAT_ECN_TYPE
uint8_t Flags; // CXPLAT_SEND_FLAGS
uint8_t DSCP;
uint8_t DSCP; // CXPLAT_DSCP_TYPE
} CXPLAT_SEND_CONFIG;

//
Expand Down
2 changes: 1 addition & 1 deletion src/perf/lib/Tcp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1088,7 +1088,7 @@ QUIC_BUFFER* TcpConnection::NewSendBuffer()
return nullptr;
}
if (!BatchedSendData) {
CXPLAT_SEND_CONFIG SendConfig = { &Route, TLS_BLOCK_SIZE, CXPLAT_ECN_NON_ECT, 0, 0 };
CXPLAT_SEND_CONFIG SendConfig = { &Route, TLS_BLOCK_SIZE, CXPLAT_ECN_NON_ECT, 0, CXPLAT_DSCP_CS0 };
BatchedSendData = CxPlatSendDataAlloc(Socket, &SendConfig);
if (!BatchedSendData) { return nullptr; }
}
Expand Down
2 changes: 1 addition & 1 deletion src/platform/datapath_epoll.c
Original file line number Diff line number Diff line change
Expand Up @@ -340,7 +340,7 @@ CxPlatDataPathCalculateFeatureSupport(

Datapath->Features |= CXPLAT_DATAPATH_FEATURE_TCP;
Datapath->Features |= CXPLAT_DATAPATH_FEATURE_TTL;
Datapath->Features |= CXPLAT_DATAPATH_FEATURE_DSCP;
Datapath->Features |= CXPLAT_DATAPATH_FEATURE_SEND_DSCP;
}

void
Expand Down
2 changes: 1 addition & 1 deletion src/platform/datapath_raw.c
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ RawDataPathGetSupportedFeatures(
)
{
UNREFERENCED_PARAMETER(Datapath);
return CXPLAT_DATAPATH_FEATURE_RAW | CXPLAT_DATAPATH_FEATURE_TTL;
return CXPLAT_DATAPATH_FEATURE_RAW | CXPLAT_DATAPATH_FEATURE_TTL | CXPLAT_DATAPATH_FEATURE_SEND_DSCP;
}

_IRQL_requires_max_(DISPATCH_LEVEL)
Expand Down
6 changes: 3 additions & 3 deletions src/platform/datapath_raw_socket.c
Original file line number Diff line number Diff line change
Expand Up @@ -538,7 +538,7 @@ CxPlatDpRawSocketAckFin(
CXPLAT_DBG_ASSERT(Socket->UseTcp);

CXPLAT_ROUTE* Route = Packet->Route;
CXPLAT_SEND_CONFIG SendConfig = { Route, 0, CXPLAT_ECN_NON_ECT, 0, 0 };
CXPLAT_SEND_CONFIG SendConfig = { Route, 0, CXPLAT_ECN_NON_ECT, 0, CXPLAT_DSCP_CS0 };
CXPLAT_SEND_DATA *SendData = CxPlatSendDataAlloc(CxPlatRawToSocket(Socket), &SendConfig);
if (SendData == NULL) {
return;
Expand Down Expand Up @@ -577,7 +577,7 @@ CxPlatDpRawSocketAckSyn(
CXPLAT_DBG_ASSERT(Socket->UseTcp);

CXPLAT_ROUTE* Route = Packet->Route;
CXPLAT_SEND_CONFIG SendConfig = { Route, 0, CXPLAT_ECN_NON_ECT, 0, 0 };
CXPLAT_SEND_CONFIG SendConfig = { Route, 0, CXPLAT_ECN_NON_ECT, 0, CXPLAT_DSCP_CS0 };
CXPLAT_SEND_DATA *SendData = CxPlatSendDataAlloc(CxPlatRawToSocket(Socket), &SendConfig);
if (SendData == NULL) {
return;
Expand Down Expand Up @@ -660,7 +660,7 @@ CxPlatDpRawSocketSyn(
)
{
CXPLAT_DBG_ASSERT(Socket->UseTcp);
CXPLAT_SEND_CONFIG SendConfig = { (CXPLAT_ROUTE*)Route, 0, CXPLAT_ECN_NON_ECT, 0, 0 };
CXPLAT_SEND_CONFIG SendConfig = { (CXPLAT_ROUTE*)Route, 0, CXPLAT_ECN_NON_ECT, 0, CXPLAT_DSCP_CS0 };
CXPLAT_SEND_DATA *SendData = CxPlatSendDataAlloc(CxPlatRawToSocket(Socket), &SendConfig);
if (SendData == NULL) {
return;
Expand Down
20 changes: 10 additions & 10 deletions src/platform/datapath_winkernel.c
Original file line number Diff line number Diff line change
Expand Up @@ -644,7 +644,7 @@ CxPlatDataPathQuerySockoptSupport(
break;
}

Datapath->Features |= CXPLAT_DATAPATH_FEATURE_DSCP;
Datapath->Features |= CXPLAT_DATAPATH_FEATURE_SEND_DSCP;

} while (FALSE);

Expand Down Expand Up @@ -2070,7 +2070,7 @@ CxPlatDataPathSocketReceive(
SOCKADDR_INET LocalAddr = { 0 };
SOCKADDR_INET RemoteAddr;
UINT16 MessageLength = 0;
INT TOS = 0;
INT ECN = 0;
INT HopLimitTTL = 0;

//
Expand Down Expand Up @@ -2100,9 +2100,9 @@ CxPlatDataPathSocketReceive(
IsUnreachableError = TRUE;
break;
}
} else if (CMsg->cmsg_type == IPV6_TCLASS) {
TOS = *(PINT)WSA_CMSG_DATA(CMsg);
CXPLAT_DBG_ASSERT(TOS <= UINT8_MAX);
} else if (CMsg->cmsg_type == IPV6_ECN) {
ECN = *(PINT)WSA_CMSG_DATA(CMsg);
CXPLAT_DBG_ASSERT(ECN < UINT8_MAX);
} else if (CMsg->cmsg_type == IPV6_HOPLIMIT) {
HopLimitTTL = *(PINT)WSA_CMSG_DATA(CMsg);
CXPLAT_DBG_ASSERT(HopLimitTTL < 256);
Expand All @@ -2123,9 +2123,9 @@ CxPlatDataPathSocketReceive(
IsUnreachableError = TRUE;
break;
}
} else if (CMsg->cmsg_type == IP_TOS) {
TOS = *(PINT)WSA_CMSG_DATA(CMsg);
CXPLAT_DBG_ASSERT(TOS <= UINT8_MAX);
} else if (CMsg->cmsg_type == IP_ECN) {
ECN = *(PINT)WSA_CMSG_DATA(CMsg);
CXPLAT_DBG_ASSERT(ECN < UINT8_MAX);
} else if (CMsg->cmsg_type == IP_TTL) {
HopLimitTTL = *(PINT)WSA_CMSG_DATA(CMsg);
CXPLAT_DBG_ASSERT(HopLimitTTL < 256);
Expand Down Expand Up @@ -2295,7 +2295,7 @@ CxPlatDataPathSocketReceive(
Datagram->IoBlock = IoBlock;
Datagram->Data.Next = NULL;
Datagram->Data.PartitionIndex = (uint16_t)(CurProcNumber % Binding->Datapath->ProcCount);
Datagram->Data.TypeOfService = (uint8_t)TOS;
Datagram->Data.TypeOfService = (uint8_t)ECN;
Datagram->Data.HopLimitTTL = (uint8_t)HopLimitTTL;
Datagram->Data.Allocated = TRUE;
Datagram->Data.QueuedOnConnection = FALSE;
Expand Down Expand Up @@ -2973,7 +2973,7 @@ SocketSend(
*(PINT)WSA_CMSG_DATA(CMsg) = SendData->ECN;
}

if (Binding->Datapath->Features & CXPLAT_DATAPATH_FEATURE_DSCP) {
if (Binding->Datapath->Features & CXPLAT_DATAPATH_FEATURE_SEND_DSCP) {
CMsg = (PWSACMSGHDR)&CMsgBuffer[CMsgLen];
CMsgLen += WSA_CMSG_SPACE(sizeof(INT));
CMsg->cmsg_level =
Expand Down
34 changes: 17 additions & 17 deletions src/platform/datapath_winuser.c
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,7 @@ typedef struct DATAPATH_RX_IO_BLOCK {
RIO_CMSG_BASE_SIZE +
WSA_CMSG_SPACE(sizeof(IN6_PKTINFO)) + // IP_PKTINFO
WSA_CMSG_SPACE(sizeof(DWORD)) + // UDP_COALESCED_INFO
WSA_CMSG_SPACE(sizeof(INT)) + // IP_TOS
WSA_CMSG_SPACE(sizeof(INT)) + // IP_ECN
WSA_CMSG_SPACE(sizeof(INT)) // IP_HOP_LIMIT
];

Expand Down Expand Up @@ -274,7 +274,7 @@ typedef struct CXPLAT_SEND_DATA {
RIO_CMSG_BASE_SIZE +
WSA_CMSG_SPACE(sizeof(IN6_PKTINFO)) + // IP_PKTINFO
WSA_CMSG_SPACE(sizeof(INT)) + // IP_ECN
WSA_CMSG_SPACE(sizeof(INT)) + // IP_TOS/IPV6_TCLASS
WSA_CMSG_SPACE(sizeof(INT)) + // IP_TOS
WSA_CMSG_SPACE(sizeof(DWORD)) // UDP_SEND_MSG_SIZE
];

Expand Down Expand Up @@ -732,7 +732,7 @@ CxPlatDataPathQuerySockoptSupport(
"[data] Test setting IPV6_TCLASS failed, 0x%x",
WsaError);
} else {
Datapath->Features |= CXPLAT_DATAPATH_FEATURE_DSCP;
Datapath->Features |= CXPLAT_DATAPATH_FEATURE_SEND_DSCP;
}
closesocket(Udpv6Socket);
}
Expand Down Expand Up @@ -1688,7 +1688,7 @@ SocketCreateUdp(
setsockopt(
SocketProc->Socket,
IPPROTO_IPV6,
IPV6_RECVTCLASS,
IPV6_ECN,
(char*)&Option,
sizeof(Option));
if (Result == SOCKET_ERROR) {
Expand All @@ -1698,7 +1698,7 @@ SocketCreateUdp(
"[data][%p] ERROR, %u, %s.",
Socket,
WsaError,
"Set IPV6_RECVTCLASS");
"Set IPV6_ECN");
Status = HRESULT_FROM_WIN32(WsaError);
goto Error;
}
Expand All @@ -1708,7 +1708,7 @@ SocketCreateUdp(
setsockopt(
SocketProc->Socket,
IPPROTO_IP,
IP_RECVTOS,
IP_ECN,
(char*)&Option,
sizeof(Option));
if (Result == SOCKET_ERROR) {
Expand All @@ -1718,7 +1718,7 @@ SocketCreateUdp(
"[data][%p] ERROR, %u, %s.",
Socket,
WsaError,
"Set IP_RECVTOS");
"Set IP_ECN");
Status = HRESULT_FROM_WIN32(WsaError);
goto Error;
}
Expand Down Expand Up @@ -3463,7 +3463,7 @@ CxPlatDataPathUdpRecvComplete(
UINT16 MessageLength = NumberOfBytesTransferred;
ULONG MessageCount = 0;
BOOLEAN IsCoalesced = FALSE;
INT TOS = 0;
INT ECN = 0;
INT HopLimitTTL = 0;
if (SocketProc->Parent->UseRio) {
PRIO_CMSG_BUFFER RioRcvMsg = (PRIO_CMSG_BUFFER)IoBlock->ControlBuf;
Expand All @@ -3484,9 +3484,9 @@ CxPlatDataPathUdpRecvComplete(
CxPlatConvertFromMappedV6(LocalAddr, LocalAddr);
LocalAddr->Ipv6.sin6_scope_id = PktInfo6->ipi6_ifindex;
FoundLocalAddr = TRUE;
} else if (CMsg->cmsg_type == IPV6_TCLASS) {
TOS = *(PINT)WSA_CMSG_DATA(CMsg);
CXPLAT_DBG_ASSERT(TOS <= UINT8_MAX);
} else if (CMsg->cmsg_type == IPV6_ECN) {
ECN = *(PINT)WSA_CMSG_DATA(CMsg);
CXPLAT_DBG_ASSERT(ECN < UINT8_MAX);
} else if (CMsg->cmsg_type == IPV6_HOPLIMIT) {
HopLimitTTL = *(PINT)WSA_CMSG_DATA(CMsg);
CXPLAT_DBG_ASSERT(HopLimitTTL < 256);
Expand All @@ -3500,9 +3500,9 @@ CxPlatDataPathUdpRecvComplete(
LocalAddr->Ipv4.sin_port = SocketProc->Parent->LocalAddress.Ipv6.sin6_port;
LocalAddr->Ipv6.sin6_scope_id = PktInfo->ipi_ifindex;
FoundLocalAddr = TRUE;
} else if (CMsg->cmsg_type == IP_TOS) {
TOS = *(PINT)WSA_CMSG_DATA(CMsg);
CXPLAT_DBG_ASSERT(TOS <= UINT8_MAX);
} else if (CMsg->cmsg_type == IP_ECN) {
ECN = *(PINT)WSA_CMSG_DATA(CMsg);
CXPLAT_DBG_ASSERT(ECN < UINT8_MAX);
} else if (CMsg->cmsg_type == IP_TTL) {
HopLimitTTL = *(PINT)WSA_CMSG_DATA(CMsg);
CXPLAT_DBG_ASSERT(HopLimitTTL < 256);
Expand Down Expand Up @@ -3563,7 +3563,7 @@ CxPlatDataPathUdpRecvComplete(
Datagram->Route = &IoBlock->Route;
Datagram->PartitionIndex =
SocketProc->DatapathProc->PartitionIndex % SocketProc->DatapathProc->Datapath->PartitionCount;
Datagram->TypeOfService = (uint8_t)TOS;
Datagram->TypeOfService = (uint8_t)ECN;
Datagram->HopLimitTTL = (uint8_t) HopLimitTTL;
Datagram->Allocated = TRUE;
Datagram->Route->DatapathType = Datagram->DatapathType = CXPLAT_DATAPATH_TYPE_NORMAL;
Expand Down Expand Up @@ -4528,7 +4528,7 @@ CxPlatSocketSendInline(
CMsg->cmsg_len = WSA_CMSG_LEN(sizeof(INT));
*(PINT)WSA_CMSG_DATA(CMsg) = SendData->ECN;

if (Socket->Datapath->Features & CXPLAT_DATAPATH_FEATURE_DSCP) {
if (Socket->Datapath->Features & CXPLAT_DATAPATH_FEATURE_SEND_DSCP) {
WSAMhdr.Control.len += WSA_CMSG_SPACE(sizeof(INT));
CMsg = WSA_CMSG_NXTHDR(&WSAMhdr, CMsg);
CXPLAT_DBG_ASSERT(CMsg != NULL);
Expand Down Expand Up @@ -4559,7 +4559,7 @@ CxPlatSocketSendInline(
CMsg->cmsg_len = WSA_CMSG_LEN(sizeof(INT));
*(PINT)WSA_CMSG_DATA(CMsg) = SendData->ECN;

if (Socket->Datapath->Features & CXPLAT_DATAPATH_FEATURE_DSCP) {
if (Socket->Datapath->Features & CXPLAT_DATAPATH_FEATURE_SEND_DSCP) {
WSAMhdr.Control.len += WSA_CMSG_SPACE(sizeof(INT));
CMsg = WSA_CMSG_NXTHDR(&WSAMhdr, CMsg);
CXPLAT_DBG_ASSERT(CMsg != NULL);
Expand Down
4 changes: 2 additions & 2 deletions src/platform/pcp.c
Original file line number Diff line number Diff line change
Expand Up @@ -391,7 +391,7 @@ CxPlatPcpSendMapRequestInternal(
QUIC_ADDR LocalMappedAddress;
CxPlatConvertToMappedV6(&Route.LocalAddress, &LocalMappedAddress);

CXPLAT_SEND_CONFIG SendConfig = { &Route, PCP_MAP_REQUEST_SIZE, CXPLAT_ECN_NON_ECT, 0, 0 };
CXPLAT_SEND_CONFIG SendConfig = { &Route, PCP_MAP_REQUEST_SIZE, CXPLAT_ECN_NON_ECT, 0, CXPLAT_DSCP_CS0 };
CXPLAT_SEND_DATA* SendData = CxPlatSendDataAlloc(Socket, &SendConfig);
if (SendData == NULL) {
return QUIC_STATUS_OUT_OF_MEMORY;
Expand Down Expand Up @@ -483,7 +483,7 @@ CxPlatPcpSendPeerRequestInternal(
QUIC_ADDR RemotePeerMappedAddress;
CxPlatConvertToMappedV6(RemotePeerAddress, &RemotePeerMappedAddress);

CXPLAT_SEND_CONFIG SendConfig = { &Route, PCP_MAP_REQUEST_SIZE, CXPLAT_ECN_NON_ECT, 0, 0 };
CXPLAT_SEND_CONFIG SendConfig = { &Route, PCP_MAP_REQUEST_SIZE, CXPLAT_ECN_NON_ECT, 0, CXPLAT_DSCP_CS0 };
CXPLAT_SEND_DATA* SendData = CxPlatSendDataAlloc(Socket, &SendConfig);
if (SendData == NULL) {
return QUIC_STATUS_OUT_OF_MEMORY;
Expand Down
Loading

0 comments on commit 2ea4426

Please sign in to comment.