Функции хэширования RSS

Общие сведения

Сетевой адаптер или драйвер мини-порта использует функцию хэширования RSS для вычисления значения хэша RSS.

Избыточные драйверы задают тип хэша, функцию и таблицу для назначения подключений к ЦП. Дополнительные сведения см. в разделе Конфигурация RSS.

Функция хэширования может быть одной из следующих:

  • NdisHashFunctionToeplitz
  • NdisHashFunctionReserved1
  • NdisHashFunctionReserved2
  • NdisHashFunctionReserved3

Примечание

В настоящее время NdisHashFunctionToeplitz является единственной функцией хэширования, доступной для драйверов мини-портов. Другие хэш-функции зарезервированы для NDIS. 

Драйвер мини-порта должен определить хэш-функцию и значение, которое он использует в каждой структуре NET_BUFFER_LIST , прежде чем драйвер укажет полученные данные. Дополнительные сведения см. в разделе Указание данных получения RSS.

Примеры

В следующих четырех примерах псевдокода показано, как вычислить значение хэша NdisHashFunctionToeplitz . В этих примерах представлены четыре возможных типа хэша, доступных для NdisHashFunctionToeplitz. Дополнительные сведения о типах хэша см. в разделе Типы хэширования RSS.

Чтобы упростить примеры, требуется обобщенный алгоритм, обрабатывающий входной поток байтов. Конкретные форматы для байтовых потоков определяются далее в четырех примерах.

Драйвер overlying предоставляет секретный ключ (K) драйверу мини-порта для использования в хэш-вычислении. Ключ имеет длину 40 байт (320 бит). Дополнительные сведения о ключе см. в разделе Конфигурация RSS.

При входном массиве, который содержит n байтов, поток байтов определяется следующим образом:

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

Наибольший левый байт — input[0], а самый значительный бит входных данных[0] — самый левый бит. Самый правый байт — входные[n-1], а наименьший бит входных данных[n-1] — самый правый бит.

Учитывая приведенные выше определения, псевдокод для обработки общего входного потока байтов определяется следующим образом:

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

Псевдокод содержит записи формы @n-m. Эти записи определяют диапазон байтов каждого элемента в TCP-пакете.

Пример вычисления хэша для IPv4 с заголовком TCP

Сцепить поля SourceAddress, DestinationAddress, SourcePort и DestinationPort пакета в массив байтов, сохранив порядок их выполнения в пакете:

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

Пример вычисления хэша только для IPv4

Сцепить поля SourceAddress и DestinationAddress пакета в массив байтов.

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

Пример вычисления хэша для IPv6 с заголовком TCP

Сцепить поля SourceAddress, DestinationAddress, SourcePort и DestinationPort пакета в массив байтов, сохранив порядок их выполнения в пакете.

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

Пример вычисления хэша только для IPv6

Сцепить поля SourceAddress и DestinationAddress пакета в массив байтов.

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