Funciones hash rss
Información general
Una NIC o su controlador de minipuerto usa la función hash RSS para calcular un valor hash RSS.
El uso excesivo de controladores establece el tipo hash, la función y la tabla para asignar conexiones a CPU. Para obtener más información, consulte Configuración de RSS.
La función hash puede ser una de las siguientes:
- NdisHashFunctionToeplitz
- NdisHashFunctionReserved1
- NdisHashFunctionReserved2
- NdisHashFunctionReserved3
Nota
Actualmente, NdisHashFunctionToeplitz es la única función hash disponible para los controladores de miniport. Las demás funciones hash están reservadas para NDIS.
Un controlador de minipuerto debe identificar la función hash y el valor que usa en cada estructura de NET_BUFFER_LIST antes de que el controlador indique los datos recibidos. Para obtener más información, vea Indicar datos de recepción RSS.
Ejemplos
Los cuatro ejemplos de pseudocódigo siguientes muestran cómo calcular el valor hash NdisHashFunctionToeplitz . Estos ejemplos representan los cuatro tipos hash posibles que están disponibles para NdisHashFunctionToeplitz. Para obtener más información sobre los tipos hash, vea Tipos de hash RSS.
Para simplificar los ejemplos, se requiere un algoritmo generalizado que procesa un flujo de bytes de entrada. Los formatos específicos para las secuencias de bytes se definen más adelante en los cuatro ejemplos.
El controlador de sobreaprovisionamiento proporciona una clave secreta (K) al controlador de minipuerto para su uso en el cálculo hash. La clave es de 40 bytes (320 bits) de longitud. Para obtener más información sobre la clave, consulte Configuración rss.
Dada una matriz de entrada que contiene n bytes, la secuencia de bytes se define de la siguiente manera:
input[0] input[1] input[2] ... input[n-1]
El byte izquierdo es input[0] y el bit más significativo de input[0] es el bit más a la izquierda. El byte más a la derecha es input[n-1] y el bit menos significativo de input[n-1] es el bit más adecuado.
Dadas las definiciones anteriores, el pseudocódigo para procesar un flujo de bytes de entrada general se define de la siguiente manera:
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
El pseudocódigo contiene entradas del formato @n-m. Estas entradas identifican el intervalo de bytes de cada elemento del paquete TCP.
Ejemplo de cálculo hash para IPv4 con el encabezado TCP
Concatene los campos SourceAddress, DestinationAddress, SourcePort y DestinationPort del paquete en una matriz de bytes, conservando el orden en que se produjeron en el paquete:
Input[12] = @12-15, @16-19, @20-21, @22-23
Result = ComputeHash(Input, 12)
Ejemplo de cálculo hash solo para IPv4
Concatene los campos SourceAddress y DestinationAddress del paquete en una matriz de bytes.
Input[8] = @12-15, @16-19
Result = ComputeHash(Input, 8)
Ejemplo de cálculo hash para IPv6 con el encabezado TCP
Concatene los campos SourceAddress, DestinationAddress, SourcePort y DestinationPort del paquete en una matriz de bytes, conservando el orden en que se produjeron en el paquete.
Input[36] = @8-23, @24-39, @40-41, @42-43
Result = ComputeHash(Input, 36)
Ejemplo de cálculo hash solo para IPv6
Concatene los campos SourceAddress y DestinationAddress del paquete en una matriz de bytes.
Input[32] = @8-23, @24-39
Result = ComputeHash(Input, 32)