]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
test-network: check if static routes not overridden by NDisc routes 33450/head
authorYu Watanabe <watanabe.yu+github@gmail.com>
Sun, 23 Jun 2024 05:37:01 +0000 (14:37 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 24 Jun 2024 18:17:21 +0000 (03:17 +0900)
test/test-network/conf/25-ipv6-prefix-veth-static-route.network [new file with mode: 0644]
test/test-network/systemd-networkd-tests.py

diff --git a/test/test-network/conf/25-ipv6-prefix-veth-static-route.network b/test/test-network/conf/25-ipv6-prefix-veth-static-route.network
new file mode 100644 (file)
index 0000000..a2ea7bf
--- /dev/null
@@ -0,0 +1,14 @@
+# SPDX-License-Identifier: LGPL-2.1-or-later
+[Match]
+Name=veth99
+
+[Network]
+IPv6AcceptRA=true
+
+[Route]
+Gateway=fe80::1034:56ff:fe78:9abd
+GatewayOnLink=no
+Metric=256
+
+[IPv6AcceptRA]
+RouteMetric=256
index 0355c7aca1b3c8923d5aeded78129b64abfe7d4f..7c336ba9e292ed50e291c4cbb57bf13459e7cd3c 100755 (executable)
@@ -5824,6 +5824,30 @@ class NetworkdRATests(unittest.TestCase, Utilities):
         self.assertIn('pref high', output)
         self.assertNotIn('pref low', output)
 
+    def test_ndisc_vs_static_route(self):
+        copy_network_unit('25-veth.netdev', '25-ipv6-prefix.network', '25-ipv6-prefix-veth-static-route.network')
+        start_networkd()
+        self.wait_online('veth99:routable', 'veth-peer:degraded')
+
+        output = check_output('ip -6 route show dev veth99 table all')
+        print(output)
+
+        # If a conflicting static route is already configured, do not override the static route.
+        output = check_output('ip -6 route show dev veth99 default via fe80::1034:56ff:fe78:9abd')
+        print(output)
+        self.assertIn('default proto static metric 256 pref medium', output)
+        self.assertNotIn('proto ra', output)
+
+        if not os.path.exists(test_ndisc_send):
+            self.skipTest(f"{test_ndisc_send} does not exist.")
+
+        # Also check if the static route is protected from RA with zero lifetime
+        check_output(f'{test_ndisc_send} --interface veth-peer --type router-advertisement --lifetime 0')
+        time.sleep(2)
+        output = check_output('ip -6 route show dev veth99 default via fe80::1034:56ff:fe78:9abd')
+        print(output)
+        self.assertIn('default proto static metric 256 pref medium', output)
+
     # radvd supports captive portal since v2.20.
     # https://github.com/radvd-project/radvd/commit/791179a7f730decbddb2290ef0e34aa85d71b1bc
     @unittest.skipUnless(radvd_check_config('captive-portal.conf'), "Installed radvd doesn't support captive portals")