This is an old revision of the document!
Патч добавляет функционал в нетграф ноду 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
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; предупреждения: – если down хук подключён к ng_ether, чей интерфейс if_capenable & IFCAP_VLAN_HWTAGGING то инкапсуляцию произведёт сетевой адаптер, с ethernet_type = 0x8100, значение установленное через NGM_VLAN_SET_ENCAP_PROTO - будет проигнорировано! – если адаптер не поддерживает инкапсуляцию или она отключены то пакеты уйдут в сеть не тегированными. 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, что равноценно.
[hr] NGM_VLAN_SET_DECAP = 1 и NGM_VLAN_SET_ENCAP = 2 (или 3) - это режим в котором все входящие декапсулируются (информация сохраняется в специальном заголовке пакета, доступном ОС) а исходящие инкапсулируются, также ведут себя драйвера сетевых адаптеров с включённой опцией: VLAN_HWTAGGING.
[hr] Тюнинг системы В 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 (…)
[hr] Примеры
kldunload ng_vlan kldload ng_ether
ngctl msg re0: setpromisc 1 ngctl msg re0: setautosrc 0
ngctl mkpeer re0: vlan lower downstream ngctl connect re0: re0:lower upper nomatch
ngctl mkpeer re0:lower eiface vlan1001 ether ngctl mkpeer re0:lower eiface vlan1002 ether
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
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
ngctl msg re0:lower addfilter '{ vid=1001 hook=“vlan1001” }' 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
# 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 } ] }
# ngctl msg re0:lower delfilter '“vlan1002”'
# ngctl msg re0:lower gettable Rec'd response “gettable” (4) from “[156]:”: Args: {}