Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Функция обратного вызова 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