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

Обзор

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

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

Хеш-функция может быть одной из следующих:

  • NdisHashFunctionToeplitz
  • NdisHashFunctionReserved1
  • NdisHashFunctionReserved2
  • NdisHashFunctionReserved3

Заметка

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

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

Примеры

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

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

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

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

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

Левый байт — это входной байт[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)