Funzioni hash RSS
Panoramica
Una scheda di interfaccia di rete o il relativo driver miniport usa la funzione hash RSS per calcolare un valore hash RSS.
I driver overlying impostano il tipo hash, la funzione e la tabella per assegnare connessioni alle CPU. Per altre informazioni, vedere Configurazione RSS.
La funzione hashing può essere una delle seguenti:
- NdisHashFunctionToeplitz
- NdisHashFunctionReserved1
- NdisHashFunctionReserved2
- NdisHashFunctionReserved3
Nota
Attualmente , NdisHashFunctionToeplitz è l'unica funzione hash disponibile per i driver miniport. Le altre funzioni hash sono riservate per NDIS.
Un driver miniport deve identificare la funzione di hashing e il valore usati in ogni struttura NET_BUFFER_LIST prima che il driver indichi i dati ricevuti. Per altre informazioni, vedere Indicazione dei dati di ricezione RSS.
Esempio
I quattro esempi di pseudocodice seguenti illustrano come calcolare il valore hash NdisHashFunctionToeplitz . Questi esempi rappresentano i quattro possibili tipi hash disponibili per NdisHashFunctionToeplitz. Per altre informazioni sui tipi hash, vedere Tipi hash RSS.
Per semplificare gli esempi, è necessario un algoritmo generalizzato che elabora un flusso di byte di input. I formati specifici per i flussi di byte vengono definiti più avanti nei quattro esempi.
Il driver overlying fornisce una chiave privata (K) al driver miniport da usare nel calcolo hash. La chiave è lunga 40 byte (320 bit). Per altre informazioni sulla chiave, vedere Configurazione RSS.
Data una matrice di input che contiene n byte, il flusso di byte viene definito come segue:
input[0] input[1] input[2] ... input[n-1]
Il byte più a sinistra è input[0], mentre il bit più significativo di input[0] è il bit più a sinistra. Il byte più a destra è input[n-1], mentre il bit meno significativo di input[n-1] è il bit più a destra.
Date le definizioni precedenti, lo pseudocodice per l'elaborazione di un flusso di byte di input generale è definito come segue:
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
Lo pseudocodice contiene voci del modulo @n-m. Queste voci identificano l'intervallo di byte di ogni elemento nel pacchetto TCP.
Esempio di calcolo hash per IPv4 con l'intestazione TCP
Concatenare i campi SourceAddress, DestinationAddress, SourcePort e DestinationPort del pacchetto in una matrice di byte, mantenendo l'ordine in cui si sono verificati nel pacchetto:
Input[12] = @12-15, @16-19, @20-21, @22-23
Result = ComputeHash(Input, 12)
Esempio di calcolo hash solo per IPv4
Concatenare i campi SourceAddress e DestinationAddress del pacchetto in una matrice di byte.
Input[8] = @12-15, @16-19
Result = ComputeHash(Input, 8)
Esempio di calcolo hash per IPv6 con l'intestazione TCP
Concatenare i campi SourceAddress, DestinationAddress, SourcePort e DestinationPort del pacchetto in una matrice di byte, mantenendo l'ordine in cui si sono verificati nel pacchetto.
Input[36] = @8-23, @24-39, @40-41, @42-43
Result = ComputeHash(Input, 36)
Esempio di calcolo hash solo per IPv6
Concatenare i campi SourceAddress e DestinationAddress del pacchetto in una matrice di byte.
Input[32] = @8-23, @24-39
Result = ComputeHash(Input, 32)