Site Tools


software:freebsd:ng_vlan

FreeBSD QinQ: ng_vlan patch

Патч добавляет функционал в нетграф ноду ng_vlan, в том числе становится возможным делать QinQ.
http://www.netlab.linkpc.net/download/software/FreeBSD/patches/ng_vlan.patch
http://www.freebsd.org/cgi/query-pr.cgi?pr=161908

Включено в кодовую базу FreeBSD, патч применять больше не требуется.


Изменения

  • vlan заменён на vid в управляющих сообщениях: используйте vid, vlan - помечен для удаления в будущем;
  • в коде: динамическая таблица заменена на статическую таблицу это позволило упростить код и это даст выигрыш в скорости на большом (>128) количестве VLAN-в обрабатываемом нодой, минус в чуть большем потреблении памяти и возможно замедление на малом (2-100 разбросанных по номерам);
  • в коде: улучшен алгоритм инкапсуляции/декапсуляции (tag/untag)

Новое

  • настройка ethernet_type для VLAN инкапсуляции, по умолчанию: 0x8100 (33024)
  • настройка PCP (Priority Code Point) для инкапсуляции каждого VID
  • настройка CFI (Canonical Format Indicator) для инкапсуляции каждого VID
  • возможность удалить VLAN фильтр/хук по VID (те по номеру, а не по имени хука)
  • возможность инкапсулировать пакеты с тэгом (в mbuf) пришедшие с nomatch хука при отправке в downstream хук
  • возможность на инкапсулировать пакеты пришедшие с фильтра в выставлять тэг (в mbuf) при отправке в downstream хук
  • возможность декапсулировать пакеты выходящие из nomatch хука, с сохранением тэга в mbuf

Сообщения

NGM_VLAN_DEL_VID_FLT (“delvidflt”)
аргумент: число (uint16)
действие: удаляет VLAN фильтр на vid. Те удаляет фльтр на хуке по номеру VLAN (vid), а не по имени хука, как NGM_VLAN_DEL_FILTER

NGM_VLAN_GET_DECAP (“getdecap”)
аргумент: нет
действие: возвращает:

  • 0 - по умолчанию, нода пересылает без изменений пакеты не попавшие в фильтры с downstream на nomatch хук.
  • 1 - если нода делает 802.1Q/P декапсуляцию, и добавляет в mbuf флаг M_VLANTAG, записывает всю информацию (vid, pcp, cfi) в m_pkthdr.ether_vtag перед отправкой пакетов на nomatch хук. Это обычная декапсуляция, подобная той, что делают сетевые драйвера.

NGM_VLAN_SET_DECAP (“setdecap”)
аргумент: число (hint32)
действие: устанавливает режим декапсуляции ноды, см NGM_VLAN_GET_DECAP

NGM_VLAN_GET_ENCAP (“getencap”)
аргумент: нет
действие: возвращает:

  • 0 - если нода не делает 802.1Q/P инкапсуляцию, а добавляет в mbuf флаг M_VLANTAG и записывает всю информацию (vid, pcp, cfi) в m_pkthdr.ether_vtag;

предупреждения:

  1. если down хук подключён к ng_ether, чей интерфейс if_capenable & IFCAP_VLAN_HWTAGGING то инкапсуляцию произведёт сетевой адаптер, с ethernet_type = 0x8100, значение установленное через NGM_VLAN_SET_ENCAP_PROTO - будет проигнорировано!
  2. если адаптер не поддерживает инкапсуляцию или она отключены то пакеты уйдут в сеть не тегированными.
  • 1 (VLAN_ENCAP_FROM_FILTER) - по умолчанию, нода производит 802.1Q/P инкапсуляцию пакетов полученный через хук фильтра
  • 2 (VLAN_ENCAP_FROM_NOMATCH) - нода производит 802.1Q/P инкапсуляцию пакетов полученный через хук nomatch если в заголовке пакеты установлен флаг M_VLANTAG.

Возможна комбинация: 1+2 = 3.

NGM_VLAN_SET_ENCAP (“setencap”)
аргумент: число (hint32)
действие: устанавливает режим инкапсуляции ноды, см NGM_VLAN_GET_ENCAP

NGM_VLAN_GET_ENCAP_PROTO (“getencapproto”)
аргумент: нет
действие: возвращает число (hint16) - тэг в который будет использоваться для инкапсуляции/деинкапсуляции (tag/untag) пакетов. По умолчанию: 0x8100 (33024)

NGM_VLAN_SET_ENCAP_PROTO (“setencapproto”) аргумент: число (hint16)
действие: устанавливает число (hint16), см NGM_VLAN_GET_ENCAP_PROTO
Можно указать: 0x8100 или 33024, что равноценно.

NGM_VLAN_SET_DECAP = 1 и NGM_VLAN_SET_ENCAP = 2 (или 3) - это режим в котором все входящие декапсулируются (информация сохраняется в специальном заголовке пакета, доступном ОС) а исходящие инкапсулируются, также ведут себя драйвера сетевых адаптеров с включённой опцией: VLAN_HWTAGGING.

Тюнинг системы

В /boot/loader.conf
kern.ipc.max_linkhdr - рекомендую увеличить, это критично для тех, кто генерирует трафик, маршрутизации это мало касается:

  • 20 - 1 VLAN tag (.Q)
  • 24 - 2 VLAN tags (QinQ)
  • 28 - 3 VLAN tags (QinQinQ)
  • 32 - 4 VLAN tags (…)

Примеры

kldunload ng_vlan kldload ng_ether

Включить “неразборчивый” режим = отключить mac фильтры на сетевом адаптере и отключить автоматическое установку mac адреса на исходящих пакетах:

ngctl msg re0: setpromisc 1
ngctl msg re0: setautosrc 0

Подключаем ng_vlan к re0 адаптеру, таким образом чтобы все пакеты не попавшие в vlan фильтры ушли в ядро:

ngctl mkpeer re0: vlan lower downstream
ngctl connect re0: re0:lower upper nomatch

Создаём интерфейсы для вланов и подключаем их к ng_vlan на re0:

ngctl mkpeer re0:lower eiface vlan1001 ether
ngctl mkpeer re0:lower eiface vlan1002 ether

Задаём имя интерфейса, mac и ip адрес для созданного влан 1001 интерфейса:

ngctl name re0:lower:vlan1001 ngeth0
ifconfig ngeth0 link 00:1a:4d:55:9a:43
ifconfig ngeth0 inet 192.168.0.36 netmask 255.255.255.0

Задаём имя интерфейса, mac и ip адрес для созданного влан 1002 интерфейса:

ngctl name re0:lower:vlan1002 ngeth1
ifconfig ngeth1 link 00:1a:4d:55:9a:44
ifconfig ngeth1 inet 192.168.254.36 netmask 255.255.255.0

Добавляем фильтр в ng_vlan для влана 1001:

ngctl msg re0:lower addfilter '{ vid=1001 hook="vlan1001" }'

Добавляем фильтр в ng_vlan для влана 1002, так же задаем доп параметры:

ngctl msg re0:lower addfilter '{ vid=1002 pcp=6 cfi=1 hook="vlan1002" }'

Проверяем что фильтры добавились, смотрим какие фильтры есть:

# ngctl msg re0:lower gettable
Rec'd response "gettable" (4) from "[156]:":
Args: { n=2 filter=[ { hook="vlan1001" vid=1001 } { hook="vlan1002" vid=1002 pcp=6 cfi=1 } ] }

Проверяем режим инкапсуляции пакетов:

# ngctl msg re0:lower getencap
Rec'd response "getencap" (5) from "[156]:":
Args: 1

Проверяем номер протокола для инкапсуляции/декапсуляции:

# ngctl msg re0:lower getencapproto
Rec'd response "getencapproto" (7) from "[156]:":
Args: 0x8100

Удаляем фильтр для влан 1001 (интерфейс ngeth0 при этом не удаляется из системы!):

# ngctl msg re0:lower delvidflt 1001

Проверяем что удалилось:

# ngctl msg re0:lower gettable
Rec'd response "gettable" (4) from "[156]:":
Args: { n=1 filter=[ { hook="vlan1002" vid=1002 pcp=6 cfi=1 } ] } 

Удаляем фильтр для влан 1002 (интерфейс ngeth1 при этом не удаляется из системы!):

# ngctl msg re0:lower delfilter '"vlan1002"'

Убеждаемся что все фильтры удалены:

# ngctl msg re0:lower gettable
Rec'd response "gettable" (4) from "[156]:":
Args: {}
software/freebsd/ng_vlan.txt · Last modified: 2022/03/02 23:11 by root