функция обратного вызова EVT_NET_ADAPTER_RECEIVE_SCALING_ENABLE (netreceivescaling.h)
Функция обратного вызова EvtNetAdapterReceiveScalingEnable реализована драйвером клиента, чтобы включить масштабирование на стороне получения (RSS) для сетевого контроллера (сетевого адаптера).
Синтаксис
EVT_NET_ADAPTER_RECEIVE_SCALING_ENABLE EvtNetAdapterReceiveScalingEnable;
NTSTATUS EvtNetAdapterReceiveScalingEnable(
[_In_] NETADAPTER Adapter,
[_In_] NET_ADAPTER_RECEIVE_SCALING_HASH_TYPE HashType,
[_In_] NET_ADAPTER_RECEIVE_SCALING_PROTOCOL_TYPE ProtocolType
)
{...}
Параметры
[_In_] Adapter
Объект NETADAPTER драйвер клиента, полученный в предыдущем вызове NetAdapterCreate.
[_In_] HashType
Значение NET_ADAPTER_RECEIVE_SCALING_HASH_TYPE, указывающее тип хэширования на стороне получения (RSS), которую сетевой адаптер должен использовать для вычисления хэш-значений входящих пакетов.
[_In_] ProtocolType
Значение NET_ADAPTER_RECEIVE_SCALING_PROTOCOL_TYPE, указывающее часть полученных сетевых данных, которую должен использовать сетевой адаптер, поддерживающий RSS, для вычисления хэш-значения RSS.
Возвращаемое значение
Возвращает STATUS_SUCCESS, если RSS был успешно включен. В противном случае возвращает соответствующий код ошибки NTSTATUS.
Замечания
Зарегистрируйте реализацию этой функции обратного вызова, задав соответствующий элемент структуры NET_ADAPTER_RECEIVE_SCALING_CAPABILITIES, а затем вызовите NetAdapterSetReceiveScalingCapabilities. Клиентские драйверы обычно вызывают NetAdapterSetReceiveScalingCapabilities при запуске сетевого адаптера перед вызовом NetAdapterStart.
Пример
В этом обратном вызове клиенты включите RSS с предоставленными сведениями, задав соответствующие биты управления в оборудовании.
Важный
Клиентские драйверы должны не очистить или сбросить таблицу косвенного обращения из EvtNetAdapterReceiveScalingEnable обратного вызова. Платформа установит начальное состояние таблицы косвенного обращения драйвера.
NTSTATUS
MyEvtNetAdapterReceiveScalingEnable(
_In_ NETADAPTER Adapter,
_In_ NET_ADAPTER_RECEIVE_SCALING_HASH_TYPE HashType,
_In_ NET_ADAPTER_RECEIVE_SCALING_PROTOCOL_TYPE ProtocolType
)
{
NTSTATUS status = STATUS_SUCCESS;
// Not using the hash type in this example
UNREFERENCED_PARAMETER(HashType);
UINT32 controlBitsEnable = MY_RSS_MULTI_CPU_ENABLE | MY_RSS_HASH_BITS_ENABLE;
// Set the appropriate control bits for IPv4
if(ProtocolType & NetAdapterReceiveScalingProtocolTypeIPv4)
{
controlBitsEnable |= MY_RSS_IPV4_ENABLE;
if (ProtocolType & NetAdapterReceiveScalingProtocolTypeTcp)
{
controlBitsEnable |= MY_RSS_IPV4_TCP_ENABLE;
}
}
// Repeat for IPv6
...
// Set the bits in hardware
if(!MyHardwareRssSetControl(controlBitsEnable))
{
WdfDeviceSetFailed(Adapter->WdfDevice, WdfDeviceFailedAttemptRestart);
return STATUS_UNSUCCESSFUL;
}
// Perform other tasks like restarting the Rx queue
return STATUS_SUCCESS;
}
Требования
Требование | Ценность |
---|---|
целевая платформа | Всеобщий |
минимальная версия KMDF | 1.27 |
минимальная версия UMDF | 2.33 |
заголовка | netreceivescaling.h (include netadaptercx.h) |
IRQL | PASSIVE_LEVEL |