EVT_NET_ADAPTER_RECEIVE_SCALING_SET_INDIRECTION_ENTRIES função de retorno de chamada (netreceivescaling.h)

A função de retorno de chamada EvtNetAdapterReceiveScalingSetIndirectionEntries é implementada pelo driver cliente para executar movimentos de entradas de tabela de indireção RSS (recebimento lateral) para novas filas de recebimento.

Sintaxe

EVT_NET_ADAPTER_RECEIVE_SCALING_SET_INDIRECTION_ENTRIES EvtNetAdapterReceiveScalingSetIndirectionEntries;

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

Parâmetros

[_In_] Adapter

O objeto NETADAPTER que o driver cliente obteve em uma chamada anterior para NetAdapterCreate.

[_Inout_] IndirectionEntries

Um ponteiro para uma estrutura NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES que representa a tabela de indireção.

Retornar valor

Retorna STATUS_SUCCESS se as operações de movimentação foram bem-sucedidas. Caso contrário, retorna um código de erro NTSTATUS apropriado.

Comentários

Registre sua implementação dessa função de retorno de chamada definindo o membro apropriado da estrutura NET_ADAPTER_RECEIVE_SCALING_CAPABILITIES e chamando NetAdapterSetReceiveScalingCapabilities. Os drivers de cliente normalmente chamam NetAdapterSetReceiveScalingCapabilities ao iniciar um adaptador de rede, antes de chamar NetAdapterStart.

Quando um driver de protocolo precisa reequilibrar a carga de trabalho do processador no RSS, ele calcula primeiro um novo mapeamento para cada entrada de tabela de indireção para um novo processador. Em seguida, o protocolo passa essas informações para NetAdapterCx, que mapeia internamente os números do processador para IDs de fila de recebimento de NIC. NetAdapterCx armazena a nova tabela de indireção, com entradas mapeadas para receber IDs de fila, em uma estrutura NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES e passa essa estrutura para o driver de cliente NIC quando invoca a função de retorno de chamada EvtNetAdapterReceiveScalingSetIndirectionEntries do driver.

Nesse retorno de chamada, os drivers de cliente movem cada entrada na tabela de indireção da NIC para a fila de recebimento especificada. Cada estrutura NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRY na matriz NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES contém o índice de hash dessa entrada na tabela, a nova fila de recebimento à qual atribuir a entrada e um campo status indicando se essa movimentação individual foi bem-sucedida ou não.

A função de atribuir entradas de índice a filas de recebimento de hardware depende do design de cada NIC. Por exemplo, alguns drivers de cliente NIC podem atribuir suas próprias IDs a cada fila de recebimento que são diferentes das IDs atribuídas por NetAdapterCx, portanto, eles teriam que primeiro traduzir as IDs de fila fornecidas para suas próprias IDs de fila antes de reatribuir entradas de tabela de indireção. Outras NICs podem ter uma tabela de indireção compactada que difere em tamanho da tabela de indireção mantida pelo sistema, portanto, os drivers de cliente dessas NICs precisariam calcular o índice correto na tabela de indireção de seu hardware ao atribuir entradas. Para obter um exemplo de código deste segundo exemplo, consulte o driver de exemplo do Github realtek.

Exemplo

Este exemplo simples pressupõe uma proporção de 1:1 de filas de recebimento para processadores, portanto, a tabela de indireção da NIC tem o mesmo tamanho que a tabela de indireção do sistema.

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;
}

Requisitos

Requisito Valor
Plataforma de Destino Universal
Versão mínima do KMDF 1,25
Versão mínima do UMDF 2.33
Cabeçalho netreceivescaling.h (inclua netadaptercx.h)
IRQL DISPATCH_LEVEL

Confira também

NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES

NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRY

NetAdapterCx recebe dimensionamento lateral