Enable QoS prioritization on Windows

This commit is contained in:
Cameron Gutman
2020-04-09 17:42:12 -07:00
parent d988023971
commit 5c96da29c2
+53
View File
@@ -8,8 +8,12 @@
#include "enet/enet.h"
#include <windows.h>
#include <mmsystem.h>
#include <qos2.h>
static enet_uint32 timeBase = 0;
static HANDLE qosHandle = INVALID_HANDLE_VALUE;
static QOS_FLOWID qosFlowId;
static BOOL qosAddedFlow;
int
enet_initialize (void)
@@ -36,6 +40,15 @@ enet_initialize (void)
void
enet_deinitialize (void)
{
qosAddedFlow = FALSE;
qosFlowId = 0;
if (qosHandle != INVALID_HANDLE_VALUE)
{
QOSCloseHandle(qosHandle);
qosHandle = INVALID_HANDLE_VALUE;
}
timeEndPeriod (1);
WSACleanup ();
@@ -218,6 +231,32 @@ enet_socket_set_option (ENetSocket socket, ENetSocketOption option, int value)
result = setsockopt (socket, IPPROTO_TCP, TCP_NODELAY, (char *) & value, sizeof (int));
break;
case ENET_SOCKOPT_QOS:
{
if (value)
{
QOS_VERSION qosVersion;
qosVersion.MajorVersion = 1;
qosVersion.MinorVersion = 0;
if (!QOSCreateHandle(&qosVersion, &qosHandle))
{
qosHandle = INVALID_HANDLE_VALUE;
}
}
else if (qosHandle != INVALID_HANDLE_VALUE)
{
QOSCloseHandle(qosHandle);
qosHandle = INVALID_HANDLE_VALUE;
}
qosAddedFlow = FALSE;
qosFlowId = 0;
result = 0;
break;
}
default:
break;
}
@@ -292,6 +331,20 @@ enet_socket_send (ENetSocket socket,
{
DWORD sentLength;
if (!qosAddedFlow && qosHandle != INVALID_HANDLE_VALUE)
{
qosFlowId = 0; // Must be initialized to 0
QOSAddSocketToFlow(qosHandle,
socket,
(struct sockaddr *)&address->address,
QOSTrafficTypeControl,
QOS_NON_ADAPTIVE_FLOW,
&qosFlowId);
// Even if we failed, don't try again
qosAddedFlow = TRUE;
}
if (WSASendTo (socket,
(LPWSABUF) buffers,
(DWORD) bufferCount,