Поделиться через


функция обратного вызова EVT_NET_ADAPTER_RECEIVE_SCALING_SET_INDIRECTION_ENTRIES (netreceivescaling.h)

Функция обратного вызова EvtNetAdapterReceiveScalingSetIndirectionEntries реализована драйвером клиента для выполнения перемещения записей таблицы косвенного масштабирования на стороне приема (RSS) в новые очереди получения.

Синтаксис

EVT_NET_ADAPTER_RECEIVE_SCALING_SET_INDIRECTION_ENTRIES EvtNetAdapterReceiveScalingSetIndirectionEntries;

NTSTATUS EvtNetAdapterReceiveScalingSetIndirectionEntries(
  [_In_]    NETADAPTER Adapter,
  [_Inout_] NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES *IndirectionEntries
)
{...}

Параметры

[_In_] Adapter

Объект NETADAPTER, полученный драйвером клиента в предыдущем вызове NetAdapterCreate.

[_Inout_] IndirectionEntries

Указатель на структуру NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES, представляющую таблицу косвенного обращения.

Возвращаемое значение

Возвращает STATUS_SUCCESS, если операции перемещения были успешными. В противном случае возвращает соответствующий код ошибки NTSTATUS.

Замечания

Зарегистрируйте реализацию этой функции обратного вызова, задав соответствующий элемент структуры NET_ADAPTER_RECEIVE_SCALING_CAPABILITIES, а затем вызовите NetAdapterSetReceiveScalingCapabilities. Клиентские драйверы обычно вызывают NetAdapterSetReceiveScalingCapabilities при запуске сетевого адаптера перед вызовом NetAdapterStart.

Если драйвер протокола должен перебалансировать рабочую нагрузку процессора в RSS, сначала вычисляет новое сопоставление для каждой записи таблицы косвенного обращения с новым процессором. Затем протокол передает эти сведения в NetAdapterCx, который внутренне сопоставляет номера процессора с идентификаторами очередей сетевых адаптеров. NetAdapterCx сохраняет новую таблицу косвенного обращения с записями, сопоставленными с идентификаторами очереди, в структуре NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES и передает эту структуру драйверу клиента сетевого адаптера при вызове функции обратного вызова evtNetAdapterReceiveScalingSetIndirectionEntries функции обратного вызова.

В этом обратном вызове драйверы клиентов перемещают каждую запись в непрямой таблице сетевого адаптера в указанную очередь получения. Каждая NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRY структура в массиве NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES содержит хэш-индекс для этой записи в таблице, новую очередь получения, в которую нужно назначить запись, и поле состояния, указывающее, успешно ли выполнено это перемещение.

Функция назначения записей индекса аппаратным очередям получения зависит от структуры каждой сетевой карты. Например, некоторые клиентские драйверы сетевого адаптера могут назначать собственные идентификаторы для каждой очереди получения, отличающейся от идентификаторов, назначенных NetAdapterCx, поэтому сначала необходимо перевести идентификаторы предоставленных очередей в собственные идентификаторы очередей, прежде чем переназначить записи таблицы косвенного обращения. Другие сетевые карты могут иметь сжатую таблицу косвенного обращения, которая отличается от поддерживаемой системой таблицы косвенного обращения, поэтому клиентские драйверы этих сетевых адаптеров должны были бы вычислить правильный индекс в таблицу косвенного обращения оборудования при назначении записей. Пример кода этого второго примера см. в примердрайвера Github realtek Github.

Пример

В этом простом примере предполагается, что число очередей получения от процессоров равно 1:1, поэтому таблица косвенного ввода сетевого адаптера совпадает с размером, что и таблица косвенного обращения системы.

NTSTATUS
MyEvtNetAdapterReceiveScalingSetIndirectionEntries(
	_In_ 	NETADAPTER   										Adapter,
    _Inout_ PNET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES 	IndirectionEntries
)
{

	// Get the adapter's context to retrieve the address of the hardware indirection table
	PMY_NET_ADAPTER_CONTEXT adapterContext = GetMyAdapterContext(Adapter);

	// Assign each indirection table entry to the specified receive queue
	for(size_t i = 0; i < IndirectionEntries->Count; i++)
	{
		// Get the queue ID from its context
		const ULONG queueId = GetMyRxQueueContext(IndirectionEntries->Entries[i].Queue)->QueueId;
		
		// Get the hash index for this entry
		const UINT32 index = IndirectionEntries->Entries[i].Index;

		// Assign the new queue ID for this index in the indirection table and record success
		IndirectionEntries->Entries[i].Status = MySetIndirectionTableEntry(adapterContext->HardwareInfo->RssIndirectionTable[index], 
	queueId
	);
	}

	return STATUS_SUCCESS;
}

Требования

Требование Ценность
целевая платформа Всеобщий
минимальная версия KMDF 1.25
минимальная версия UMDF 2.33
заголовка netreceivescaling.h (include netadaptercx.h)
IRQL DISPATCH_LEVEL

См. также

NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES

NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRY

Масштабирование на стороне получения NetAdapterCx