On Wed, 25 Sep 2019, 13:35, you wrote:

On 25.09.2019 05:47, Yaroslav Shvets wrote:
On Tue, 24 Sep 2019, 07:55, you wrote:

On 24.09.2019 11:26, Eugene Grosbein wrote:

Просьба отвечать в рассылку, а то я и сам не обратил внимания и свой ответ не 
продублировал сюда.

On 24.09.2019 06:50, Yaroslav Shvets wrote:
Hello Eugene.

On Mon, 23 Sep 2019, 08:51, you wrote:

23.09.2019 8:46, Yaroslav Shvets пишет:

Сервер, к сожалению, рабочий, и экспериментировать часто не получается.
Но обязательно попробую, как будет возможность.

Пока выяснилось, что сам lagg работает с нетегированными пакетами.
Проблема только - с тегированными. Т.е. не работает ни один
из vlan'ов построенных на lagg, но сам lagg - рабочий.

Очень может быть, что дело как раз в сломанном аппаратном offload для 
vlanhwtag/vlanhwfilter.
Более того, такое уже бывало в старых версиях, но с другими драйверами.

Крайне желательно это выяснить побыстрей, пока ещё есть немного времени успеть 
починить к 12.1-RELEASE.
Но времени совсем немного.

Сразу скажу: результаты экспериментов у меня странные.

Последовательность 1:
---------------------
Если делать все руками, то все работает.
Примерно так:
ifconfig em0 up
ifconfig em1 up
ifconfig lagg0 create
ifconfig lagg0 laggproto lacp laggport em0 laggport em1 up
ifconfig lagg0.11 create
ifconfig lagg0.11 inet <ip/prefix>
--> интерфейс lagg0.11 оказывается рабочим
и это не зависит от -rxcsum -txcsum -tso4 -vlanmtu -vlanhwtag -vlanhwfilter
-vlanhwcsum -vlanhwtso
т.е. все работает в разных сочетаниях

Последовательность 2:
---------------------
Если разрешить часть работы проделать rc.conf'у, примерно так:
-- rc.conf --
ifconfig_em0="up"
ifconfig_em1="up"
cloned_interfaces="lagg0 lagg0.11"
ifconfig_lagg0="laggproto lacp laggport em0 laggport em1 up"
----------------
А потом вручную доделать:
ifconfig lagg0.11 inet <ip/prefix>
--> интерфейс lagg0.11 оказывается нерабочим
хотя выглядит абсолютно нормальным

Последовательность 3:
---------------------
Аналогично последовательности 2, но убираем из cloned_interfaces
создание lagg0.11, предполагая сделать его руками:
-- rc.conf --
ifconfig_em0="up"
ifconfig_em1="up"
cloned_interfaces="lagg0"
ifconfig_lagg0="laggproto lacp laggport em0 laggport em1 up"
----------------
А потом вручную доделать:
ifconfig lagg0.11 create
ifconfig lagg0.11 inet <ip/prefix>
--> интерфейс lagg0.11 оказывается рабочим
и выглядит абсолютно нормально

Итого: руками все создаем - все работает,
имеем cloned_interfaces="lagg0 lagg0.11" - не работает,
имеем cloned_interfaces="lagg0", а потом руками досоздаем lagg0.11 -
опять все работает.

Создается впечатление, что в cloned_interfaces lagg0.11 как-то неправильно
создается (или раньше чего-то), или как-то не так, как руками.

Причем интересно, что если взять последовательность 2, при которой получился
нерабочий интерфейс lagg0.11, удалить интерфейс, снова его создать:
ifconfig lagg0.11 destroy
ifconfig lagg0.11 create
ifconfig lagg0.11 inet <ip/prefix>
--> то все равно интерфейс получается нерабочий

Последовательность 1 отличается от последовательности 2
очередностью создания 11-го vlan'а и "собиранием" lagg'а
'ifconfig lagg0.11 create' и
'ifconfig lagg0 laggproto lacp laggport em0 laggport em1 up'.
Но при ручном варианте (последовательность 1) очередность
собирания lagg0 и создания lagg0.11 не имеет значения.
Интерфейс lagg0.11 в любом случае оказывается рабочим.

Вобщем, странные вещи происходят.

Во-первых, чудес не бывает и нерабочий интерфейс наверняка можно отличить по 
его состоянию.
Покажи вывод ifconfig -v lagg0.11 в "нерабочем" виде и в "рабочем" для 
сравнения.

Нерабочий интерфейс:
# ifconfig -v lagg0.11
lagg0.11: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1496
         options=403<RXCSUM,TXCSUM,LRO>
         ether 00:e0:81:ba:ad:90
         inet xx.xx.170.82 netmask 0xfffffff0 broadcast xx.xx.170.95
         groups: vlan
         vlan: 11 vlanpcp: 0 parent interface: lagg0
         media: Ethernet autoselect
         status: active
         nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>

Рабочий интерфейс:
# ifconfig -v lagg0.11
lagg0.11: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
         options=403<RXCSUM,TXCSUM,LRO>
         ether 00:e0:81:ba:ad:90
         inet xx.xx.170.82 netmask 0xfffffff0 broadcast xx.xx.170.95
         groups: vlan
         vlan: 11 vlanpcp: 0 parent interface: lagg0
         media: Ethernet autoselect
         status: active
         nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>


Воспроизвел проблему на 11.3 последовательностью:

ifconfig lagg0 create
ifconfig lagg0.11 create
ifconfig lagg0 laggproto lacp laggport em0

Дело в том, что в чипах сетевых Intel есть аппаратная поддержка vlanhwfilter и 
она очень полезная:
если сеть флудит порт фреймами с разнообразными вланами, то чип фильтрует поток 
и передаёт хосту
только те фреймы, теги которых соответствуют созданным вланам у хоста.

При создании нового влана драйвер добавляет в этот фильтр новый тег.
Если создавать вланы напрямую поверх em0, то это работает всегда.
Если создавать вланы на lagg поверх em0, это работает, если в момент создания 
влана все аппаратные сетевые
уже добавлены в lagg.

Теоретически при добавлении новой сетевой в агрегат в неё тоже должен 
прописываться фильтр,
если новая и все ранее добавленные сетевые поддерживают vlanhwfilter. 
Практически у тебя
получается в некоторых случаях, что вланы создаются до создания lagg.

Пересоздание lagg должно "исправлять" проблему без ребута.

Да. Пересоздание lagg0 решает проблему.

Но 11.3 (немного по времени) и до этого много-много версий назад эта схема
долгое время нормально отрабатывала. И lagg, и vlan'ы поверх него всегда
работали без подобных сюрпризов.

--
Yaroslav Shvets
_______________________________________________
freebsd mailing list
freebsd@uafug.org.ua
http://mailman.uafug.org.ua/mailman/listinfo/freebsd

Ответить