Патч добавляет функционал в нетграф ноду 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”)
аргумент: нет
действие: возвращает:
NGM_VLAN_SET_DECAP (“setdecap”)
аргумент: число (hint32)
действие: устанавливает режим декапсуляции ноды, см NGM_VLAN_GET_DECAP
NGM_VLAN_GET_ENCAP (“getencap”)
аргумент: нет
действие: возвращает:
предупреждения:
Возможна комбинация: 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 - рекомендую увеличить, это критично для тех, кто генерирует трафик, маршрутизации это мало касается:
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: {}