From 0d34228fc03f9dc47d1024268b66a23df1914914 Mon Sep 17 00:00:00 2001 From: Susant Sahani Date: Mon, 26 Nov 2018 22:43:17 +0530 Subject: [PATCH] fix: systemd-networkd reverse route ordering We missing a default route. Add gateway first. This fixes https://github.com/systemd/systemd/issues/5430 --- src/network/networkd-link.c | 30 ++++++++++++++----- .../conf/25-route-reverse-order.network | 15 ++++++++++ test/test-network/systemd-networkd-tests.py | 13 +++++++- 3 files changed, 49 insertions(+), 9 deletions(-) create mode 100644 test/test-network/conf/25-route-reverse-order.network diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index 4af1a559b2..1f7b214cd9 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -860,16 +860,30 @@ static int link_enter_set_routes(Link *link) { link_set_state(link, LINK_STATE_SETTING_ROUTES); - LIST_FOREACH(routes, rt, link->network->static_routes) { - r = route_configure(rt, link, route_handler); - if (r < 0) { - log_link_warning_errno(link, r, "Could not set routes: %m"); - link_enter_failed(link); - return r; + /* First add the default route i.e. Gateway.*/ + LIST_FOREACH(routes, rt, link->network->static_routes) + if (in_addr_is_null(rt->family, &rt->gw)) { + r = route_configure(rt, link, route_handler); + if (r < 0) { + log_link_warning_errno(link, r, "Could not set routes: %m"); + link_enter_failed(link); + return r; + } + + link->route_messages++; } - link->route_messages++; - } + LIST_FOREACH(routes, rt, link->network->static_routes) + if (!in_addr_is_null(rt->family, &rt->gw)) { + r = route_configure(rt, link, route_handler); + if (r < 0) { + log_link_warning_errno(link, r, "Could not set routes: %m"); + link_enter_failed(link); + return r; + } + + link->route_messages++; + } if (link->route_messages == 0) { link->static_routes_configured = true; diff --git a/test/test-network/conf/25-route-reverse-order.network b/test/test-network/conf/25-route-reverse-order.network new file mode 100644 index 0000000000..d1b47ad434 --- /dev/null +++ b/test/test-network/conf/25-route-reverse-order.network @@ -0,0 +1,15 @@ +[Match] +Name=dummy98 + +[Network] +LinkLocalAddressing=ipv6 +Address=2001:1234:5:8f63::1/128 +IPv6AcceptRA=no + +[Route] +Destination=2001:1234:5:8fff:ff:ff:ff:ff/128 +Scope=link + +[Route] +Destination=::/0 +Gateway=2001:1234:5:8fff:ff:ff:ff:ff diff --git a/test/test-network/systemd-networkd-tests.py b/test/test-network/systemd-networkd-tests.py index 73ecf6f73f..74c0e10008 100755 --- a/test/test-network/systemd-networkd-tests.py +++ b/test/test-network/systemd-networkd-tests.py @@ -431,7 +431,7 @@ class NetworkdNetWorkTests(unittest.TestCase, Utilities): '25-route-section.network', '25-route-type.network', '25-route-tcp-window-settings.network', '25-route-gateway.network', '25-route-gateway-on-link.network', '25-address-link-section.network', '25-ipv6-address-label-section.network', '25-link-section-unmanaged.network', - '25-sysctl.network'] + '25-sysctl.network', '25-route-reverse-order.network'] def setUp(self): self.link_remove(self.links) @@ -519,6 +519,17 @@ class NetworkdNetWorkTests(unittest.TestCase, Utilities): self.assertRegex(output, 'static') self.assertRegex(output, '192.168.0.0/24') + def test_ip_route_reverse(self): + self.copy_unit_to_networkd_unit_path('25-route-reverse-order.network', '12-dummy.netdev') + self.start_networkd() + + self.assertTrue(self.link_exits('dummy98')) + + output = subprocess.check_output(['ip', '-6', 'route', 'show', 'dev', 'dummy98']).rstrip().decode('utf-8') + print(output) + self.assertRegex(output, '2001:1234:5:8fff:ff:ff:ff:ff') + self.assertRegex(output, '2001:1234:5:8f63::1') + def test_ip_route_blackhole_unreachable_prohibit(self): self.copy_unit_to_networkd_unit_path('25-route-type.network', '12-dummy.netdev') self.start_networkd()