[freebsd] В releng-12 опять поломали lagg?

Yaroslav Shvets yaroslav at shvets.name
Wed Sep 25 13:51:16 EEST 2019


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


More information about the freebsd mailing list