Управление трафиком Linux Фильтры хеш-таблицы u32 на основе MAC-адреса

В настоящее время я работаю с узлом Linux, формирующим трафик. Набор правил вырос примерно до 2500 хостов, каждый из которых идентифицируется конкретно по MAC-адресу. Конфигурация фильтра является «базовой», что означает, что в среднем необходимо протестировать 1250 правил, прежде чем пакет будет отфильтрован до нужного класса. При линейных скоростях, которые мы сейчас наблюдаем, это вызывает слишком большую нагрузку на ЦП на хосте, что приводит к отбрасыванию пакетов.

Я хотел бы перейти от набора правил линейного связанного списка к 6-уровневому поиску по хеш-таблице (один для каждый байт MAC-адреса)

Я совершенно не уверен, как этого добиться. Большая часть документации по этой функции меня смущает, и, насколько я понял, все это основано на хешировании IP-адресов.

В настоящее время я сопоставляю пакеты на основе значений их заголовков L2 с помощью фильтра, например ( для выхода / загрузки):

MAC: 52: 54: 00: 12: 34: 56

tc filter add dev protocol ip parent 1: 0 prio 1 u32 match u16 0x0800 at -2 match u16 0x3456 0xffff at -4 match u32 0x52540012 0xffffffff at -8 flowid 1:50

Есть ли какие-либо ресурсы, которым я мог бы воспользоваться, чтобы лучше объяснить настройку хэш-таблицы?

0
задан 18 October 2020 в 21:47
1 ответ

Допустим, 52:54:00:12:34:56 переходит в 1:50 и 52:54:00:12:37:56 переходит в 1:51.

Для 256-кратного разделения правил начните с одной хэш-таблицы, назовем ее 2::

# tc filter add dev eth1 parent 1:0 prio 1 handle 2: protocol ip u32 divisor 256

Теперь для определения того, какому байту это соответствует, смещение и битовая маска выбирают один байт.

Начало полезной нагрузки IP минус 2 байта ethertype (0x800) минус 6 байт (48-бит) addr плюс начало адреса mac. Так что просто скажите минус 6, чтобы выбрать байт в конце нашей 4-байтовой маски.

# tc filter add dev <dev> protocol ip parent 1:0 prio 1 u32 ht 800:: \
    match u16 0x0800 at -2 \
    hashkey mask 0x000000ff at -6 \
    link 2:

Обратите внимание, что мои примеры соответствуют фильтру IPv4 сразу и не повторяйте его позже, я не думаю, что это имеет значение - в любом случае, он нам нужен только один раз.

Затем вставьте правила, поместив (шестнадцатеричный) байт в дескриптор ht:

# tc filter add dev <dev> protocol ip parent 1:0 prio 1 u32 \
  ht 2:56: \
  match u16 0x3456 0xffff at -4 match u32 0x52540012 0xffffffff at -8 \
  flowid 1:50
# tc filter add dev <dev> protocol ip parent 1:0 prio 1 u32 \
  ht 2:56: \
  match u16 0x3756 0xffff at -4 match u32 0x52540012 0xffffffff at -8 \
  flowid 1:51
... any many more mac addr rules

Блок-схема:

1:0 =hash 1st byte=> ht 2:56 =sequential mac filter=> flowid 1:50

Теперь, конечно, добавление еще одного слоя хэш-таблицы для второго (или более) байта возможно и потенциально еще больше снижает количество пройденных правил, но у вас, вероятно, есть только несколько macaddr с совпадающим последним байтом, так зачем беспокоиться о 6-уровневом?

0
ответ дан 18 October 2020 в 22:00

Теги

Похожие вопросы