Udostępnij za pośrednictwem


Funkcje tworzenia skrótów RSS

Przegląd

Karta sieciowa lub jej sterownik miniportu używa funkcji haszującej RSS do obliczenia wartości skrótu RSS.

Sterowniki nadrzędne ustawiają typ skrótu, funkcję i tabelę w celu przypisania połączeń do procesorów. Aby uzyskać więcej informacji, zobacz KONFIGURACJA RSS.

Funkcja skrótu może być jedną z następujących funkcji:

  • NdisHashFunctionToeplitz
  • NdisHashFunctionReserved1
  • NdisHashFunctionReserved2
  • NdisHashFunctionReserved3

Uwaga / Notatka

Obecnie NdisHashFunctionToeplitz jest jedyną funkcją skrótu dostępną dla sterowników miniportu. Inne funkcje tworzenia skrótów są zarezerwowane dla NDIS. 

Sterownik miniportu powinien zidentyfikować funkcję haszującą i wartość używaną w każdej strukturze NET_BUFFER_LIST zanim wskaże dane odbierane. Aby uzyskać więcej informacji, zobacz Oznaczenie danych odbioru RSS.

Przykłady

W poniższych czterech przykładach pseudokodów pokazano, jak obliczyć wartość skrótu NdisHashFunctionToeplitz . Te przykłady reprezentują cztery możliwe typy skrótów, które są dostępne dla NdisHashFunctionToeplitz. Aby uzyskać więcej informacji na temat typów skrótów, zobacz Typy skrótów RSS.

Aby uprościć przykłady, wymagany jest uogólniony algorytm, który przetwarza strumień bajtów wejściowych. Określone formaty strumieni bajtów są definiowane w dalszej części czterech przykładów.

Sterownik nadrzędny przekazuje klucz tajny (K) do sterownika miniportu w celu użycia w obliczeniu skrótu. Klucz ma długość 40 bajtów (320 bitów). Aby uzyskać więcej informacji na temat klucza, zobacz Konfiguracja RSS.

Biorąc pod uwagę tablicę wejściową zawierającą n bajtów, strumień bajtów jest definiowany w następujący sposób:

input[0] input[1] input[2] ... input[n-1]

Najbardziej lewy bajt to dane wejściowe[0], a najbardziej znaczący bit danych wejściowych[0] to najbardziej lewy bit. Najbardziej prawy bajt to dane wejściowe[n-1], a najmniej znaczący bit danych wejściowych[n-1] jest najbardziej prawym bitem.

Biorąc pod uwagę powyższe definicje, pseudokod do przetwarzania ogólnego strumienia bajtów wejściowych jest definiowany w następujący sposób:

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

Pseudokod zawiera wpisy formularza @n-m. Te wpisy identyfikują zakres bajtów każdego elementu w pakiecie TCP.

Przykładowe obliczenie skrótu dla protokołu IPv4 z nagłówkiem TCP

Połącz pola SourceAddress, DestinationAddress, SourcePort i DestinationPort pakietu w tablicę bajtów, zachowując kolejność, w jakiej wystąpiły w pakiecie:

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

Przykładowe obliczanie skrótu tylko dla protokołu IPv4

Połącz pola SourceAddress i DestinationAddress pakietu w tablicę bajtów.

Input[8] = @12-15, @16-19
Result = ComputeHash(Input, 8) 

Przykładowe obliczenie skrótu dla protokołu IPv6 z nagłówkiem TCP

Połącz pola SourceAddress, DestinationAddress, SourcePort i DestinationPort pakietu w tablicę bajtów, zachowując kolejność, w jakiej wystąpiły w pakiecie.

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

Przykładowe obliczanie skrótu tylko dla protokołu IPv6

Połącz pola SourceAddress i DestinationAddress pakietu w tablicę bajtów.

Input[32] = @8-23, @24-39
Result = ComputeHash(Input, 32)