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