функция обратного вызова EVT_NET_ADAPTER_RECEIVE_SCALING_ENABLE (netreceivescaling.h)
Функция обратного вызова EvtNetAdapterReceiveScalingEnable реализуется драйвером клиента для включения масштабирования на стороне приема (RSS) для контроллера сетевого интерфейса (NIC).
Синтаксис
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 (включая netadaptercx.h) |
IRQL | PASSIVE_LEVEL |