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)