Site Tools


software:freebsd:ng_vlan

This is an old revision of the document!


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

Изменения

  • 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, что равноценно.

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

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

В 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

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: {}

software/freebsd/ng_vlan.1431777182.txt.gz · Last modified: 2015/05/16 11:53 by root