Функции хэширования 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)