API QOSSetFlow успешно выполняется, но значение Dscp не применяется на виртуальной машине с ОС Windows 2016 Server - PullRequest
0 голосов
/ 12 октября 2018

На виртуальной машине win2k16 я пытаюсь программно установить произвольные значения Dscp с помощью API QoS2.

Роль Qwave (Quality Audio Video Experience устанавливается из диспетчера сервера).

тот же код (см. ниже) - работает на виртуальной машине Windows 10, но не работает на виртуальной машине Windows 2016.Все API возвращают Успех, но значение Dscp устанавливается на «ноль», когда я проверяю wireshark.

Мой код выглядит примерно так:

1. Step 1: LoadLibrary(qwave.dll)
2. Step 2: GetProcAddress - QOSCreateHandle, QOSAddSocketToFlow, QOSSetFlow, QOSRemoveSocketFromFlow, QOSCloseHandle
3. Step 3: Use QWave APIs to set Dscp (code below)

int SetDscpWithQWave(SOCKET           fd, // Accepted SOCKET fd
                     struct sockaddr *remoteAddr,
                     int              dscpValueToSet) 
{
   Bool ret = FALSE;

   QOS_VERSION version;
   DWORD priority;
   HANDLE qwaveQoSHandle = NULL;
   QOS_FLOWID qwaveQoSFlowID = 0;

   // Initialize the QoS version parameter
   version.MajorVersion = 1;
   version.MinorVersion = 0;

   ret = qwaveQoSCreateHandleFn(&version, &qwaveQoSHandle);
   if (!ret) {
      Warning("QOSCreateHandle failed to create handle with error %d\n", GetLastError());
      return ret;
   }

   ret = qwaveQoSAddSocketToFlowFn(qwaveQoSHandle,
                                   fd,
                                   remoteAddr,
                                   QOSTrafficTypeExcellentEffort,
                                   QOS_NON_ADAPTIVE_FLOW,
                                   &qwaveQoSFlowID);
   if (!ret) {
      Warning("QOSAddSocketToFlow failed to add a flow with error %d\n", GetLastError());
      return ret;
   }

   priority = dscpValueToSet;
   ret =qwaveQoSSetFlowFn(qwaveQoSHandle,
                          qwaveQoSFlowID,
                          QOSSetOutgoingDSCPValue,
                          sizeof(priority),
                          &priority,
                          0,
                          NULL);
   if (!ret) {
      Warning("QOSSetFlow failed to add a flow with error %d\n",
              GetLastError());
      return ret;
   }

   return ret;
}
  • Этот же код работает наВиртуальная машина Windows 10 - значение Dscp установлено в порядке.
  • На виртуальной машине Win2016 - все вызовы API QOS выполняются успешно.Но значение Dscp устанавливается в «ноль», если я проверяю wireshark.
  • Вместо загрузки «qwave.dll» - я пытался статически связывать в qwave.lib и вызывать функции QOS * напрямую - не повезло,то же самое наблюдение.

Я что-то упускаю здесь очевидное?

Тот факт, что тот же код работает на виртуальной машине Windows10, но не на виртуальной машине Win2k16, заставляет меня думать, что мне не хватает некоторой конфигурации - ноне удалось найти что-либо в документах MSDN.

Спасибо!

...