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
software:freebsd:ng_vlan [2022/02/04 18:37]
– removed - external edit (Unknown date) 127.0.0.1
software:freebsd:ng_vlan [2022/03/02 23:11] (current)
– [FreeBSD QinQ: ng_vlan patch] 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