Compartilhar via


Funções de hash do RSS

Visão geral

Uma NIC ou seu driver de miniporta usa a função de hash RSS para calcular um valor de hash RSS.

Drivers superiores definem o tipo de hash, a função e a tabela para atribuir conexões às CPUs. Para obter mais informações, consulte Configuração do RSS.

A função de hash pode ser uma das seguintes:

  • NdisHashFunctionToeplitz
  • NdisHashFunctionReserved1
  • NdisHashFunctionReserved2
  • NdisHashFunctionReserved3

Observação

Atualmente, NdisHashFunctionToeplitz é a única função de hash disponível para drivers de miniport. As outras funções de hash são reservadas para o NDIS. 

Um driver de miniporto deve identificar a função de hash e o valor que utiliza em cada estrutura NET_BUFFER_LIST antes que o driver indique os dados recebidos. Para mais informações, consulte Indicação de Dados Recebidos pelo RSS.

Exemplos

Os quatro exemplos de pseudocódigo a seguir mostram como calcular o valor de hash NdisHashFunctionToeplitz . Esses exemplos representam os quatro tipos de hash possíveis que estão disponíveis para NdisHashFunctionToeplitz. Para obter mais informações sobre tipos de hash, consulte Tipos de Hash RSS.

Para simplificar os exemplos, é necessário um algoritmo generalizado que processa um fluxo de bytes de entrada. Formatos específicos para os fluxos de bytes são definidos posteriormente nos quatro exemplos.

O driver superior fornece uma chave secreta (K) para o driver de miniporto para uso no cálculo de hash. A chave tem 40 bytes (320 bits) de comprimento. Para obter mais informações sobre a chave, consulte Configuração do RSS.

Considerando uma matriz de entrada que contém n bytes, o fluxo de bytes é definido da seguinte maneira:

input[0] input[1] input[2] ... input[n-1]

O byte mais à esquerda é entrada[0], e o bit mais significativo de entrada[0] é o bit mais à esquerda. O byte mais à direita é input[n-1], e o bit menos significativo de input[n-1] é o bit mais à direita.

Dadas as definições anteriores, o pseudocódigo para processar um fluxo de bytes de entrada geral é definido da seguinte maneira:

ComputeHash(input[], n)

result = 0
For each bit b in input[] from left to right
{
if (b == 1) result ^= (left-most 32 bits of K)
shift K left 1 bit position
}

return result

O pseudocódigo contém entradas do formulário @n-m. Essas entradas identificam o intervalo de bytes de cada elemento no pacote TCP.

Exemplo de cálculo de hash para IPv4 com o cabeçalho TCP

Concatene os campos SourceAddress, DestinationAddress, SourcePort e DestinationPort do pacote em uma matriz de bytes, preservando a ordem na qual eles ocorreram no pacote:

Input[12] = @12-15, @16-19, @20-21, @22-23
Result = ComputeHash(Input, 12)

Cálculo de hash de exemplo somente para IPv4

Concatene os campos SourceAddress e DestinationAddress do pacote em uma matriz de bytes.

Input[8] = @12-15, @16-19
Result = ComputeHash(Input, 8) 

Exemplo de cálculo de hash para IPv6 com o cabeçalho TCP

Concatene os campos SourceAddress, DestinationAddress, SourcePort e DestinationPort do pacote em uma matriz de bytes, preservando a ordem na qual eles ocorreram no pacote.

Input[36] = @8-23, @24-39, @40-41, @42-43
Result = ComputeHash(Input, 36)

Cálculo de hash de exemplo somente para IPv6

Concatene os campos SourceAddress e DestinationAddress do pacote em uma matriz de bytes.

Input[32] = @8-23, @24-39
Result = ComputeHash(Input, 32)