Site Tools


software:freebsd:ng_vlan

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
Last revisionBoth sides next revision
software:freebsd:ng_vlan [2022/02/04 18:37]
– removed - external edit (Unknown date) 127.0.0.1
software:freebsd:ng_vlan [2022/02/05 04:20]
root
Line 1: Line 1:
 +====== FreeBSD QinQ: ng_vlan patch ======
 +Патч добавляет функционал в нетграф ноду ng_vlan, в том числе становится возможным делать QinQ.
 +[[http://www.netlab.linkpc.net/download/software/FreeBSD/patches/ng_vlan.patch|http://www.netlab.linkpc.net/download/software/FreeBSD/patches/ng_vlan.patch]]\\
 +[[http://www.freebsd.org/cgi/query-pr.cgi?pr=161908|http://www.freebsd.org/cgi/query-pr.cgi?pr=161908]]\\
 +<note important>Включено в кодовую базу FreeBSD, патч применять больше не требуется.</note>\\
  
 +
 +===== Изменения =====
 +  * **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__;
 +**предупреждения**:
 +  - если **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, что равноценно.\\
 +
 +
 +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 адреса на исходящих пакетах:
 +<code>ngctl msg re0: setpromisc 1
 +ngctl msg re0: setautosrc 0</code>
 +
 +Подключаем ng_vlan к re0 адаптеру, таким образом чтобы все пакеты не попавшие в vlan фильтры ушли в ядро:
 +<code>ngctl mkpeer re0: vlan lower downstream
 +ngctl connect re0: re0:lower upper nomatch</code>
 +
 +Создаём интерфейсы для вланов и подключаем их к ng_vlan на re0:
 +<code>ngctl mkpeer re0:lower eiface vlan1001 ether
 +ngctl mkpeer re0:lower eiface vlan1002 ether</code>
 +
 +Задаём имя интерфейса, mac и ip адрес для созданного влан 1001 интерфейса:
 +<code>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</code>
 +
 +Задаём имя интерфейса, mac и ip адрес для созданного влан 1002 интерфейса:
 +<code>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</code>
 +
 +Добавляем фильтр в ng_vlan для влана 1001:
 +<code>ngctl msg re0:lower addfilter '{ vid=1001 hook="vlan1001" }'</code>
 +
 +Добавляем фильтр в ng_vlan для влана 1002, так же задаем доп параметры:
 +<code>ngctl msg re0:lower addfilter '{ vid=1002 pcp=6 cfi=1 hook="vlan1002" }'</code>
 +
 +Проверяем что фильтры добавились, смотрим какие фильтры есть:
 +<code># 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 } ] }</code>
 +
 +Проверяем режим инкапсуляции пакетов:
 +<code># ngctl msg re0:lower getencap
 +Rec'd response "getencap" (5) from "[156]:":
 +Args: 1</code>
 +
 +Проверяем номер протокола для инкапсуляции/декапсуляции:
 +<code># ngctl msg re0:lower getencapproto
 +Rec'd response "getencapproto" (7) from "[156]:":
 +Args: 0x8100</code>
 +
 +Удаляем фильтр для влан 1001 (интерфейс __ngeth0__ при этом не удаляется из системы!):
 +<code># ngctl msg re0:lower delvidflt 1001</code>
 +
 +Проверяем что удалилось:
 +<code># ngctl msg re0:lower gettable
 +Rec'd response "gettable" (4) from "[156]:":
 +Args: { n=1 filter=[ { hook="vlan1002" vid=1002 pcp=6 cfi=1 } ] } </code>
 +
 +Удаляем фильтр для влан 1002 (интерфейс __ngeth1__ при этом не удаляется из системы!):
 +<code># ngctl msg re0:lower delfilter '"vlan1002"'</code>
 +
 +Убеждаемся что все фильтры удалены:
 +<code># ngctl msg re0:lower gettable
 +Rec'd response "gettable" (4) from "[156]:":
 +Args: {}</code>
 +
 +
 +{{tag>software freebsd net netgraph vlan deprecated mysoft}}
software/freebsd/ng_vlan.txt · Last modified: 2022/03/02 23:11 by root