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)