Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Обзор
Сетевой адаптер или драйвер мини-порта использует функцию хэширования 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)