diff options
| author | Christian Breunig <christian@breunig.cc> | 2025-11-24 16:06:35 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-11-24 16:06:35 +0100 |
| commit | 1aec97d70ceaba9f89db8c592478e10ed1c0aefc (patch) | |
| tree | 4df77ba2f641151cd60b343d6744c7a9adbbe940 | |
| parent | 844d517fa43f2b31dee9320e4e2cb19e2b351684 (diff) | |
| parent | 6285a2fd7fec1239bdd1ccc8b4e40e10a9086c48 (diff) | |
| download | vyos-1x-1aec97d70ceaba9f89db8c592478e10ed1c0aefc.tar.gz vyos-1x-1aec97d70ceaba9f89db8c592478e10ed1c0aefc.zip | |
Merge pull request #4861 from c-po/bond-member-mtu
bond: T8023: validate member interface min/max MTU
| -rw-r--r-- | smoketest/config-tests/bgp-evpn-l2vpn-leaf | 3 | ||||
| -rw-r--r-- | smoketest/config-tests/bgp-evpn-l2vpn-spine | 3 | ||||
| -rw-r--r-- | smoketest/config-tests/bgp-evpn-l3vpn-pe-router | 5 | ||||
| -rw-r--r-- | smoketest/config-tests/dialup-router-medium-vpn | 4 | ||||
| -rw-r--r-- | smoketest/configs/bgp-evpn-l2vpn-leaf | 3 | ||||
| -rw-r--r-- | smoketest/configs/bgp-evpn-l2vpn-spine | 3 | ||||
| -rw-r--r-- | smoketest/configs/bgp-evpn-l3vpn-pe-router | 5 | ||||
| -rw-r--r-- | smoketest/configs/dialup-router-medium-vpn | 4 | ||||
| -rw-r--r-- | smoketest/scripts/cli/base_interfaces_test.py | 19 | ||||
| -rwxr-xr-x | smoketest/scripts/cli/test_interfaces_bonding.py | 24 | ||||
| -rwxr-xr-x | src/conf_mode/interfaces_bonding.py | 11 |
11 files changed, 48 insertions, 36 deletions
diff --git a/smoketest/config-tests/bgp-evpn-l2vpn-leaf b/smoketest/config-tests/bgp-evpn-l2vpn-leaf index 5e42a269e..84cf0805e 100644 --- a/smoketest/config-tests/bgp-evpn-l2vpn-leaf +++ b/smoketest/config-tests/bgp-evpn-l2vpn-leaf @@ -6,13 +6,10 @@ set interfaces ethernet eth0 address '192.0.2.41/27' set interfaces ethernet eth0 description 'Out-of-Band Managament Port' set interfaces ethernet eth0 vrf 'MGMT' set interfaces ethernet eth1 address '172.29.1.1/31' -set interfaces ethernet eth1 mtu '1600' set interfaces ethernet eth2 address '172.29.2.1/31' -set interfaces ethernet eth2 mtu '1600' set interfaces ethernet eth2 offload gro set interfaces ethernet eth3 offload gro set interfaces loopback lo -set interfaces vxlan vxlan100 mtu '1500' set interfaces vxlan vxlan100 parameters nolearning set interfaces vxlan vxlan100 port '8472' set interfaces vxlan vxlan100 source-address '172.29.0.1' diff --git a/smoketest/config-tests/bgp-evpn-l2vpn-spine b/smoketest/config-tests/bgp-evpn-l2vpn-spine index e6d876af6..5d0a70398 100644 --- a/smoketest/config-tests/bgp-evpn-l2vpn-spine +++ b/smoketest/config-tests/bgp-evpn-l2vpn-spine @@ -3,12 +3,9 @@ set interfaces ethernet eth0 address '2001:db8::51/64' set interfaces ethernet eth0 description 'Out-of-Band Managament Port' set interfaces ethernet eth0 vrf 'MGMT' set interfaces ethernet eth1 address '172.29.1.0/31' -set interfaces ethernet eth1 mtu '1600' set interfaces ethernet eth2 address '172.29.1.2/31' -set interfaces ethernet eth2 mtu '1600' set interfaces ethernet eth2 offload gro set interfaces ethernet eth3 address '172.29.1.4/31' -set interfaces ethernet eth3 mtu '1600' set interfaces ethernet eth3 offload gro set interfaces loopback lo set protocols bgp address-family ipv4-unicast maximum-paths ibgp '4' diff --git a/smoketest/config-tests/bgp-evpn-l3vpn-pe-router b/smoketest/config-tests/bgp-evpn-l3vpn-pe-router index f867c221e..88309e424 100644 --- a/smoketest/config-tests/bgp-evpn-l3vpn-pe-router +++ b/smoketest/config-tests/bgp-evpn-l3vpn-pe-router @@ -21,13 +21,11 @@ set interfaces ethernet eth0 offload gro set interfaces ethernet eth0 vrf 'mgmt' set interfaces ethernet eth1 address '172.29.0.2/31' set interfaces ethernet eth1 description 'link to pe2' -set interfaces ethernet eth1 mtu '1600' set interfaces ethernet eth1 offload gro set interfaces ethernet eth2 disable set interfaces ethernet eth2 offload gro set interfaces ethernet eth3 address '172.29.0.6/31' set interfaces ethernet eth3 description 'link to pe3' -set interfaces ethernet eth3 mtu '1600' set interfaces ethernet eth3 offload gro set interfaces ethernet eth4 description 'customer blue' set interfaces ethernet eth4 offload gro @@ -36,17 +34,14 @@ set interfaces ethernet eth5 offload gro set interfaces ethernet eth6 description 'customer green' set interfaces ethernet eth6 offload gro set interfaces loopback lo -set interfaces vxlan vxlan2000 mtu '1500' set interfaces vxlan vxlan2000 parameters nolearning set interfaces vxlan vxlan2000 port '4789' set interfaces vxlan vxlan2000 source-address '172.29.255.1' set interfaces vxlan vxlan2000 vni '2000' -set interfaces vxlan vxlan3000 mtu '1500' set interfaces vxlan vxlan3000 parameters nolearning set interfaces vxlan vxlan3000 port '4789' set interfaces vxlan vxlan3000 source-address '172.29.255.1' set interfaces vxlan vxlan3000 vni '3000' -set interfaces vxlan vxlan4000 mtu '1500' set interfaces vxlan vxlan4000 parameters nolearning set interfaces vxlan vxlan4000 port '4789' set interfaces vxlan vxlan4000 source-address '172.29.255.1' diff --git a/smoketest/config-tests/dialup-router-medium-vpn b/smoketest/config-tests/dialup-router-medium-vpn index ba3ed29f4..92d2f00ef 100644 --- a/smoketest/config-tests/dialup-router-medium-vpn +++ b/smoketest/config-tests/dialup-router-medium-vpn @@ -23,13 +23,11 @@ set high-availability vrrp group LAN priority '200' set high-availability vrrp group LAN vrid '1' set high-availability vrrp sync-group failover-group member 'LAN' set interfaces ethernet eth0 duplex 'auto' -set interfaces ethernet eth0 mtu '9000' set interfaces ethernet eth0 offload gro set interfaces ethernet eth0 speed 'auto' set interfaces ethernet eth1 address '192.168.0.250/24' set interfaces ethernet eth1 duplex 'auto' set interfaces ethernet eth1 ip source-validation 'strict' -set interfaces ethernet eth1 mtu '9000' set interfaces ethernet eth1 offload gro set interfaces ethernet eth1 speed 'auto' set interfaces loopback lo @@ -102,7 +100,7 @@ set interfaces openvpn vtun2 tls auth-key 'openvpn_vtun2_auth' set interfaces openvpn vtun2 tls ca-certificate 'openvpn_vtun2_1' set interfaces pppoe pppoe0 authentication password 'password' set interfaces pppoe pppoe0 authentication username 'vyos' -set interfaces pppoe pppoe0 mtu '1500' +set interfaces pppoe pppoe0 mtu '1400' set interfaces pppoe pppoe0 source-interface 'eth0' set interfaces wireguard wg0 address '192.168.10.1/24' set interfaces wireguard wg0 ip adjust-mss '1380' diff --git a/smoketest/configs/bgp-evpn-l2vpn-leaf b/smoketest/configs/bgp-evpn-l2vpn-leaf index ab46fbb02..1632db03b 100644 --- a/smoketest/configs/bgp-evpn-l2vpn-leaf +++ b/smoketest/configs/bgp-evpn-l2vpn-leaf @@ -18,18 +18,15 @@ interfaces { } ethernet eth1 { address 172.29.1.1/31 - mtu 1600 } ethernet eth2 { address 172.29.2.1/31 - mtu 1600 } ethernet eth3 { } loopback lo { } vxlan vxlan100 { - mtu 1500 parameters { nolearning } diff --git a/smoketest/configs/bgp-evpn-l2vpn-spine b/smoketest/configs/bgp-evpn-l2vpn-spine index 5dafc2f77..235a5102f 100644 --- a/smoketest/configs/bgp-evpn-l2vpn-spine +++ b/smoketest/configs/bgp-evpn-l2vpn-spine @@ -7,15 +7,12 @@ interfaces { } ethernet eth1 { address 172.29.1.0/31 - mtu 1600 } ethernet eth2 { address 172.29.1.2/31 - mtu 1600 } ethernet eth3 { address 172.29.1.4/31 - mtu 1600 } loopback lo { } diff --git a/smoketest/configs/bgp-evpn-l3vpn-pe-router b/smoketest/configs/bgp-evpn-l3vpn-pe-router index c676463b8..0deda4c8f 100644 --- a/smoketest/configs/bgp-evpn-l3vpn-pe-router +++ b/smoketest/configs/bgp-evpn-l3vpn-pe-router @@ -44,7 +44,6 @@ interfaces { ethernet eth1 { address 172.29.0.2/31 description "link to pe2" - mtu 1600 } ethernet eth2 { disable @@ -52,7 +51,6 @@ interfaces { ethernet eth3 { address 172.29.0.6/31 description "link to pe3" - mtu 1600 } ethernet eth4 { description "customer blue" @@ -66,7 +64,6 @@ interfaces { loopback lo { } vxlan vxlan2000 { - mtu 1500 parameters { nolearning } @@ -75,7 +72,6 @@ interfaces { vni 2000 } vxlan vxlan3000 { - mtu 1500 parameters { nolearning } @@ -84,7 +80,6 @@ interfaces { vni 3000 } vxlan vxlan4000 { - mtu 1500 parameters { nolearning } diff --git a/smoketest/configs/dialup-router-medium-vpn b/smoketest/configs/dialup-router-medium-vpn index 503280017..3c14daaa3 100644 --- a/smoketest/configs/dialup-router-medium-vpn +++ b/smoketest/configs/dialup-router-medium-vpn @@ -56,7 +56,6 @@ high-availability { interfaces { ethernet eth0 { duplex auto - mtu 9000 offload-options { generic-receive on generic-segmentation on @@ -65,7 +64,7 @@ interfaces { } pppoe 0 { default-route auto - mtu 1500 + mtu 1400 name-server auto password password user-id vyos @@ -80,7 +79,6 @@ interfaces { ip { source-validation strict } - mtu 9000 offload-options { generic-receive on generic-segmentation on diff --git a/smoketest/scripts/cli/base_interfaces_test.py b/smoketest/scripts/cli/base_interfaces_test.py index 7dba60313..7e9c5b6a4 100644 --- a/smoketest/scripts/cli/base_interfaces_test.py +++ b/smoketest/scripts/cli/base_interfaces_test.py @@ -700,22 +700,25 @@ class BasicInterfaceTest: if not self._test_vlan or not self._test_mtu: self.skipTest(MSG_TESTCASE_UNSUPPORTED) - mtu_1500 = '1500' - mtu_9000 = '9000' + # Some drivers are limited to an MTU of 1500 byte - e.g. when VyOS + # runs on PROXMOX with default bridge settings. We use lower values + # for this test which will fit for almost every NIC + mtu_1300 = '1300' + mtu_1420 = '1420' for interface in self._interfaces: base = self._base_path + [interface] - self.cli_set(base + ['mtu', mtu_1500]) + self.cli_set(base + ['mtu', mtu_1300]) for option in self._options.get(interface, []): self.cli_set(base + option.split()) if 'source-interface' in option: iface = option.split()[-1] iface_type = Section.section(iface) - self.cli_set(['interfaces', iface_type, iface, 'mtu', mtu_9000]) + self.cli_set(['interfaces', iface_type, iface, 'mtu', mtu_1420]) for vlan in self._vlan_range: base = self._base_path + [interface, 'vif', vlan] - self.cli_set(base + ['mtu', mtu_9000]) + self.cli_set(base + ['mtu', mtu_1420]) # check validate() - Interface MTU "9000" too high, parent interface MTU is "1500"! with self.assertRaises(ConfigSessionError): @@ -724,18 +727,18 @@ class BasicInterfaceTest: # Change MTU on base interface to be the same as on the VIF interface for interface in self._interfaces: base = self._base_path + [interface] - self.cli_set(base + ['mtu', mtu_9000]) + self.cli_set(base + ['mtu', mtu_1420]) self.cli_commit() # Verify MTU on base and VIF interfaces for interface in self._interfaces: tmp = get_interface_config(interface) - self.assertEqual(tmp['mtu'], int(mtu_9000)) + self.assertEqual(tmp['mtu'], int(mtu_1420)) for vlan in self._vlan_range: tmp = get_interface_config(f'{interface}.{vlan}') - self.assertEqual(tmp['mtu'], int(mtu_9000)) + self.assertEqual(tmp['mtu'], int(mtu_1420)) def test_vif_8021q_qos_change(self): diff --git a/smoketest/scripts/cli/test_interfaces_bonding.py b/smoketest/scripts/cli/test_interfaces_bonding.py index 21918282d..b6eb5328d 100755 --- a/smoketest/scripts/cli/test_interfaces_bonding.py +++ b/smoketest/scripts/cli/test_interfaces_bonding.py @@ -334,5 +334,29 @@ class BondingInterfaceTest(BasicInterfaceTest.TestCase): id = int(id) + 1 + def test_bonding_member_mtu(self): + # This Smoketest only works on our CI platform where we force the NIC + # to virtio and an MTU of only 1500 bytes max + if not os.path.exists('/tmp/vyos.smoketests.hint'): + self.skipTest('Not running under VyOS CI/CD QEMU environment!') + + for interface in self._interfaces: + for option in self._options.get(interface, []): + self.cli_set(self._base_path + [interface] + option.split()) + + self.cli_set(self._base_path + [interface, 'mtu', '10000']) + + # check validate() - MTU of bond higher then virtio max MTU + with self.assertRaises(ConfigSessionError): + self.cli_commit() + + for interface in self._interfaces: + for option in self._options.get(interface, []): + self.cli_set(self._base_path + [interface] + option.split()) + + self.cli_delete(self._base_path + [interface, 'mtu']) + + self.cli_commit() + if __name__ == '__main__': unittest.main(verbosity=2, failfast=VyOSUnitTestSHIM.TestCase.debug_on()) diff --git a/src/conf_mode/interfaces_bonding.py b/src/conf_mode/interfaces_bonding.py index 68c2885bc..f844d0a21 100755 --- a/src/conf_mode/interfaces_bonding.py +++ b/src/conf_mode/interfaces_bonding.py @@ -248,6 +248,17 @@ def verify(bond): continue raise ConfigError(error_msg + f'it has a "{option_path.replace(".", " ")}" assigned!') + if mtu := bond.get('mtu'): + mtu = int(mtu) + max_mtu = int(EthernetIf(interface).get_max_mtu()) + min_mtu = int(EthernetIf(interface).get_min_mtu()) + if mtu > max_mtu: + raise ConfigError('Configured MTU is greater then member '\ + f'interface "{interface}" maximum of {max_mtu}!') + if mtu < min_mtu: + raise ConfigError('Configured MTU is less then member '\ + f'interface "{interface}" minimum of {min_mtu}!') + if 'primary' in bond: if bond['primary'] not in bond['member']['interface']: raise ConfigError(f'Primary interface of bond "{bond_name}" must be a member interface') |
