функция обратного вызова 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
Верхняя часть netreceivescaling.h (включая netadaptercx.h)
IRQL PASSIVE_LEVEL

См. также раздел

EvtNetAdapterReceiveScalingDisable

Масштабирование на стороне приема NetAdapterCx