[i] Настройка и заполнение HASH-таблицы
Фильтрация по HASH таблице
Прием пакетов с фильтрацией по HASH-таблице осуществляется, если HASH-функция MAC-адреса принятого пакета соответствует маске в HASH-таблице контроллера. Для разрешения фильтрации принимаемых пакетов по HASH-таблице необходимо установить в «1» бит MCA_EN регистра R_CFG.
HASH-таблица выполняет роль маски для HASH-функции от MAC-адреса назначения пакета. HASH-функция вычисляется как «1», сдвинутая на значение 6-ти старших разрядов CRC32 от MAC-адреса назначения пакета.
Расчёт выполняется в три этапа:
* 1. CRC32.inv[i] = ~CRC32(MAC)[7-i], где i = 0 .. 7 — номер бита в байте, а CRC32(MAC) — CRC32 от MAC-адреса назначения пакета по полиному 0x04C11DB7 (инв. 0xEDB88320)
2. N.hash = CRC32.inv[31:24]
3. HASH(MAC) = 1 << N.hash
Примечание к расчету:
* Если для вычисления используется алгоритм с инверсным CRC, то данный шаг может быть пропущен.
Пример:
Пусть имеется пакет с МАС-адресом назначения:
01:23:45:67:89:AB (0х01, 0х23, 0х45, 0х67, 0х89, 0хAB)
Его CRC32 по полиному будет равен 0x1A0BE8B6
Инверсия производится побайтно в соответствии с шагом 3.:
- 0x1A после инверсии станет 0xE5, 0xE5 после реверса разрядов 0xA7;
- 0x0B после инверсии станет 0xF4, 0xF4 после реверса разрядов 0x2F;
- 0xE8 после инверсии станет 0x17, 0x17 после реверса разрядов 0xE8;
- 0xB6 после инверсии станет 0x49, 0x49 после реверса разрядов 0x92.
Итого имеем значение CRC32.inv = 0xA72FE892, где от полученного значения берутся 6 старших разрядов:
N.hash = CRC.inv[31:26] = (101001b) = 0x29 = 41.
HASH(MAC) = 1<<N.hash = 1<<41 = 0x0000_0200_0000_0000
Таким образом, при установке 41-го бита HASH-таблицы (необходимо записать в регистры HASH: HASH0=0x0, HASH1=0x0, HASH2=0x200, HASH3=0x0) будет разрешен прием пакетов c МАС-адресом 01:23:45:67:89:AB и других пакетов, для которых значение, содержащееся в 6 старших разрядах HASH-функции от MAC адреса назначения, также равняется 0x29 (41).
Сохранить статью в PDF