tagged-пакет от untagged-пакета отличается доп.заголовком, в котором содержится номер вилана. Размер доп.заголовка 4 байта. Стало быть то, что в untagged-пакете начинается с 12-й позиции, в tagged-пакете пойдет с 16-й. Вот
snark и прописал в одном (первом) АЦЛ-е сразу оба правила:
Код:
# протоколы
create access_profile packet_content_mask offset_0-15 0x0 0x0 0x0 0xffff0000 offset_16-31 0xffff0000 profile_id 1
offset_0-15 0x0 0x0 0x0 0xffff0000 - это для untagged - пропущены неинтересные байты 0-11 (0x0 0x0 0x0), а для позиций 12-15 задается условие маской -0xffff0000
offset_16-31 0xffff0000 - это для tagged - это 16-я позиция, значит для позиции с 16 по 19-ю задаем условие маской 0xffff0000, а все остальное - с 20 по 31-ю позиции - нас не интересует - его и не пишем - нули.
А уже дальше в правилах эту маску применяем на строку
0x08060000 (т.е. это протокол ARP - Ethertype 0x806 hex) и
0x08000000 (протокол IP - Ethertype 0x800 hex).
Код:
config access_profile profile_id 1 add access_id auto_assign packet_content offset 12 0x08060000 offset 16 0x08060000 port <порт(ы)> permit
config access_profile profile_id 1 add access_id auto_assign packet_content offset 12 0x08000000 offset 16 0x08000000 port <порт(ы)> permit
Сюда же можно добавить, к примеру, PPPoE (Ethertype 0x8863 (hex) - PPPoE Discovery Stage и Ethertype 0x8864 (hex) - PPPoE Session Stage)
Код:
config access_profile profile_id 1 add access_id auto_assign packet_content offset 12 0x88630000 offset 16 0x88630000 port <порт(ы)> permit
config access_profile profile_id 1 add access_id auto_assign packet_content offset 12 0x88640000 offset 16 0x88640000 port <порт(ы)> permit
И так далее - открываем
http://www.iana.org/assignments/ethernet-numbers и выбираем все, что душе угодно.
Пока писал пост, подумал - а вот интересно, как отрабатывают условия на
offset_0-15 и
offset_16-31 -
AND или
OR?
Лично мне больше нравится запись того же самого АЦЛ-а в виде
ethernet ethernet_type
Кстати, а это как работает? Явно поле Ethertype проверяется, причем в 12-й и 16-й позициях - основной вопрос - с логикой
AND или
OR? По идее в случае с ethernet ethernet_type логика должна быть
OR, а в packet_content должна БЫ быть логика
AND, т.к. условия в одном профиле прописаны.