Partilhar via


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 RSS (dimensionamento lateral de recebimento) entradas de tabela de indireção 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.

Valor de retorno

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

Observações

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

Quando um driver de protocolo precisa rebalancear a carga de trabalho do processador no RSS, ele primeiro calcula 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 a NIC receber IDs da fila. O NetAdapterCx armazena a nova tabela de indireção, com entradas mapeadas para receber IDs de fila, em uma estrutura de NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES e passa essa estrutura para o driver cliente NIC quando invoca o do driver EvtNetAdapterReceiveScalingSetIndirectionEntries função de retorno de chamada.

Nesse retorno de chamada, os drivers 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 de status que indica se esse movimento individual foi bem-sucedido 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 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 de driver de exemplo do Github realtek.

Exemplo

Este exemplo simples pressupõe uma taxa de 1:1 de filas de recebimento para processadores, portanto, a tabela de indireção da NIC tem o mesmo tamanho da 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
da Plataforma de Destino Universal
versão mínima do KMDF 1.25
versão mínima do UMDF 2.33
cabeçalho netreceivescaling.h (include netadaptercx.h)
IRQL DISPATCH_LEVEL

Consulte também

NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES

NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRY

netAdapterCx receive side scaling