Funções de hash RSS

Visão geral

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

Drivers sobrepostos definem o tipo de hash, a função e a tabela para atribuir conexões a 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 NDIS. 

Um driver de miniporte deve identificar a função de hash e o valor que ele usa em cada estrutura NET_BUFFER_LIST antes que o driver indique os dados recebidos. Para obter mais informações, consulte Indicando que o RSS recebe dados.

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 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 sobressalente 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 é input[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 em que ocorreram no pacote:

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

Exemplo de cálculo de hash 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 em que ocorreram no pacote.

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

Exemplo de cálculo de hash 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)