null

FreeBSD: jumbo frame на агрегированных интерфейсах

О не совсем корректной официальной документации операционной системы FreeBSD по созданию агрегированных интерфейсов я уже писал ранее. Но речь шла про использование стандартного MTU для интерфейсов. Но иногда, в некоторых VLAN-ах может возникнуть желание использовать кадры с размером больше 1500. Если следовать официальной документации, и добавлять в интерфейс lagg порты уже после создания тегированных интерфейсов поверх интерфейса lagg, то, даже если не забыть настроить MTU на физических интерфейсах, в результате мы получим корректное значение MTU для самого интерфейса lagg, но VLAN интерфейс останется с MTU 1496, и без его пересоздания увеличить MTU не получится:

# ifconfig lagg0 create
# ifconfig lagg0.2 create
# ifconfig lagg0 laggport em0 
# ifconfig lagg0
lagg0: flags=8802<BROADCAST,SIMPLEX,MULTICAST> metric 0 mtu 9000
        options=802499<RXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,LRO,WOL_MAGIC>
        ether 8c:ec:4b:e9:28:23
        laggproto failover lagghash l2,l3,l4
        laggport: em0 flags=1<MASTER>
        groups: lagg
        media: Ethernet autoselect
        status: no carrier
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
# ifconfig lagg0.2
lagg0.2: flags=8842<BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1496
        options=401<RXCSUM,LRO>
        ether 8c:ec:4b:e9:28:23
        groups: vlan
        vlan: 2 vlanpcp: 0 parent interface: lagg0
        media: Ethernet autoselect
        status: no carrier
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
# ifconfig lagg0.2 mtu 9000
ifconfig: ioctl SIOCSIFMTU (set mtu): Invalid argument

При этом можно заметить, что для самого интерфейса lagg0 взято значение MTU добавленного физического интерфейса.

Проблема заключается в том, что в FreeBSD сначала создаются интерфейсы, указанные в cloned_interfaces, а потом уже применяются настройки, указанные в ifconfig_iface. Более того, увеличить MTU для физического интерфейса после его добавления в агрегированный интерфейс тоже не получится:

# ifconfig em0 mtu 9000
ifconfig: ioctl SIOCSIFMTU (set mtu): Invalid argument

Таким образом получается, что MTU для физических интерфейсов надо изменить до того, как они будут добавлены в агрегированный интерфейс, а добавлены они должны быть с использованием create_args_iface, так как иначе VLAN интерфейсы получат подрезанный MTU. Оказалось, что переменная create_args_iface также применима и к физическим интерфейсам, которые не создаются посредством cloned_interfaces.

Таким образом, правильное создание агрегированных интерфейсов для jumbo фреймов выглядит примерно так:

# Нам нужны bridge для VLANID=2 с MTU=9000 и VLANID=3 с MTU=1500
cloned_interfaces="lagg0 lagg0.2 bridge2 lagg0.3 bridge3"
# Задаём MTU для физических интерфейсов
create_args_em0="mtu 9000"
create_args_em1="mtu 9000"
# Добавить физические интерфейсы в агрегированный при его создании
create_args_lagg0="laggproto lacp laggport em0 laggport em1 mtu 9000"
# Не забываем перевести в состояние UP интерфейсы
ifconfig_em0="up"
ifconfig_em1="up"
ifconfig_lagg0="up"
ifconfig_lagg0_2="up"
# Уменьшаем MTU для VLANID=3
ifconfig_lagg0_3="mtu 1500 up"
# Задаём IP адреса для bridge интерфейсов и добавляем в них VLAN интерфейсы
ifconfig_bridge2="inet 192.168.2.254/24 addm lagg0.2"
ifconfig_bridge3="inet 192.168.3.254/24 addm lagg0.3"

Напоследок замечу, что если у Вас в сети используются коммутаторы Cisco, то на них по умолчанию запрещены jumbo фреймы:

#show system mtu

System MTU size is 1500 bytes
System Jumbo MTU size is 1500 bytes
Routing MTU size is 1500 bytes

И для разрешения необходимо в режиме configure terminal выполнить команду:

system mtu jumbo 9000

После чего перезагрузить коммутатор. И мои соболезнования, если это был Ваш коммутатор ядра.

Коротко о себе:

Работаю в компании Tune-IT и тьютором кафедры Вычислительной техники в СПбГУИТМО.

Очень люблю команду cat, core solaris и IPv6.