diff --git a/test/test-network/conf/12-dummy-mtu.link b/test/test-network/conf/12-dummy-mtu.link new file mode 100644 index 0000000000..cb7965c37a --- /dev/null +++ b/test/test-network/conf/12-dummy-mtu.link @@ -0,0 +1,5 @@ +[Match] +OriginalName=dummy98 + +[Link] +MTUBytes=1600 diff --git a/test/test-network/conf/12-dummy-mtu.netdev b/test/test-network/conf/12-dummy-mtu.netdev new file mode 100644 index 0000000000..c51d2a47a5 --- /dev/null +++ b/test/test-network/conf/12-dummy-mtu.netdev @@ -0,0 +1,4 @@ +[NetDev] +Name=dummy98 +Kind=dummy +MTUBytes=1600 diff --git a/test/test-network/conf/12-dummy.network b/test/test-network/conf/12-dummy.network new file mode 100644 index 0000000000..29ced8b90b --- /dev/null +++ b/test/test-network/conf/12-dummy.network @@ -0,0 +1,7 @@ +[Match] +Name=dummy98 + +[Network] +IPv6AcceptRA=no +Address=10.1.2.3/16 +Address=2001:db8:0:f101::15/64 diff --git a/test/test-network/conf/12-dummy.network.d/ipv6-mtu-1400.conf b/test/test-network/conf/12-dummy.network.d/ipv6-mtu-1400.conf new file mode 100644 index 0000000000..7a2eb5389f --- /dev/null +++ b/test/test-network/conf/12-dummy.network.d/ipv6-mtu-1400.conf @@ -0,0 +1,2 @@ +[Network] +IPv6MTUBytes=1400 diff --git a/test/test-network/conf/12-dummy.network.d/ipv6-mtu-1550.conf b/test/test-network/conf/12-dummy.network.d/ipv6-mtu-1550.conf new file mode 100644 index 0000000000..6a88073b41 --- /dev/null +++ b/test/test-network/conf/12-dummy.network.d/ipv6-mtu-1550.conf @@ -0,0 +1,2 @@ +[Network] +IPv6MTUBytes=1550 diff --git a/test/test-network/conf/12-dummy.network.d/mtu.conf b/test/test-network/conf/12-dummy.network.d/mtu.conf new file mode 100644 index 0000000000..6e7da63b4f --- /dev/null +++ b/test/test-network/conf/12-dummy.network.d/mtu.conf @@ -0,0 +1,2 @@ +[Link] +MTUBytes=1600 diff --git a/test/test-network/systemd-networkd-tests.py b/test/test-network/systemd-networkd-tests.py index e63cca50f2..3b041f88cf 100755 --- a/test/test-network/systemd-networkd-tests.py +++ b/test/test-network/systemd-networkd-tests.py @@ -3297,6 +3297,101 @@ class NetworkdIPv6PrefixTests(unittest.TestCase, Utilities): print(output) self.assertRegex(output, '2001:db8:0:1::/64 proto ra') +class NetworkdMTUTests(unittest.TestCase, Utilities): + links = ['dummy98'] + + units = [ + '12-dummy.netdev', + '12-dummy-mtu.netdev', + '12-dummy-mtu.link', + '12-dummy.network', + ] + + def setUp(self): + remove_links(self.links) + stop_networkd(show_logs=False) + + def tearDown(self): + remove_log_file() + remove_links(self.links) + remove_unit_from_networkd_path(self.units) + stop_networkd(show_logs=True) + + def check_mtu(self, mtu, ipv6_mtu=None, reset=True): + if not ipv6_mtu: + ipv6_mtu = mtu + + # test normal start + start_networkd() + self.wait_online(['dummy98:routable']) + self.assertEqual(read_ipv6_sysctl_attr('dummy98', 'mtu'), ipv6_mtu) + self.assertEqual(read_link_attr('dummy98', 'mtu'), mtu) + + # test normal restart + restart_networkd() + self.wait_online(['dummy98:routable']) + self.assertEqual(read_ipv6_sysctl_attr('dummy98', 'mtu'), ipv6_mtu) + self.assertEqual(read_link_attr('dummy98', 'mtu'), mtu) + + if reset: + self.reset_check_mtu(mtu, ipv6_mtu) + + def reset_check_mtu(self, mtu, ipv6_mtu=None): + ''' test setting mtu/ipv6_mtu with interface already up ''' + stop_networkd() + + # note - changing the device mtu resets the ipv6 mtu + run('ip link set up mtu 1501 dev dummy98') + run('ip link set up mtu 1500 dev dummy98') + self.assertEqual(read_link_attr('dummy98', 'mtu'), '1500') + self.assertEqual(read_ipv6_sysctl_attr('dummy98', 'mtu'), '1500') + + self.check_mtu(mtu, ipv6_mtu, reset=False) + + def test_mtu_network(self): + copy_unit_to_networkd_unit_path('12-dummy.netdev', '12-dummy.network.d/mtu.conf') + self.check_mtu('1600') + + def test_mtu_netdev(self): + copy_unit_to_networkd_unit_path('12-dummy-mtu.netdev', '12-dummy.network', dropins=False) + # note - MTU set by .netdev happens ONLY at device creation! + self.check_mtu('1600', reset=False) + + def test_mtu_link(self): + copy_unit_to_networkd_unit_path('12-dummy.netdev', '12-dummy-mtu.link', '12-dummy.network', dropins=False) + # must reload udev because it only picks up new files after 3 second delay + call('udevadm control --reload') + # note - MTU set by .link happens ONLY at udev processing of device 'add' uevent! + self.check_mtu('1600', reset=False) + + def test_ipv6_mtu(self): + ''' set ipv6 mtu without setting device mtu ''' + copy_unit_to_networkd_unit_path('12-dummy.netdev', '12-dummy.network.d/ipv6-mtu-1400.conf') + self.check_mtu('1500', '1400') + + def test_ipv6_mtu_toolarge(self): + ''' try set ipv6 mtu over device mtu (it shouldn't work) ''' + copy_unit_to_networkd_unit_path('12-dummy.netdev', '12-dummy.network.d/ipv6-mtu-1550.conf') + self.check_mtu('1500', '1500') + + def test_mtu_network_ipv6_mtu(self): + ''' set ipv6 mtu and set device mtu via network file ''' + copy_unit_to_networkd_unit_path('12-dummy.netdev', '12-dummy.network.d/mtu.conf', '12-dummy.network.d/ipv6-mtu-1550.conf') + self.check_mtu('1600', '1550') + + def test_mtu_netdev_ipv6_mtu(self): + ''' set ipv6 mtu and set device mtu via netdev file ''' + copy_unit_to_networkd_unit_path('12-dummy-mtu.netdev', '12-dummy.network.d/ipv6-mtu-1550.conf') + self.check_mtu('1600', '1550', reset=False) + + def test_mtu_link_ipv6_mtu(self): + ''' set ipv6 mtu and set device mtu via link file ''' + copy_unit_to_networkd_unit_path('12-dummy.netdev', '12-dummy-mtu.link', '12-dummy.network.d/ipv6-mtu-1550.conf') + # must reload udev because it only picks up new files after 3 second delay + call('udevadm control --reload') + self.check_mtu('1600', '1550', reset=False) + + if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument('--build-dir', help='Path to build dir', dest='build_dir')