diff --git a/src/network/networkd-dhcp4.c b/src/network/networkd-dhcp4.c index 8a987e84a3..1bb1df32e9 100644 --- a/src/network/networkd-dhcp4.c +++ b/src/network/networkd-dhcp4.c @@ -103,6 +103,11 @@ static int link_set_dhcp_routes(Link *link) { if (!link->network->dhcp_use_routes) return 0; + if (!link_has_carrier(link) && !link->network->configure_without_carrier) + /* During configuring addresses, the link lost its carrier. As networkd is dropping + * the addresses now, let's not configure the routes either. */ + return 0; + table = link_get_dhcp_route_table(link); r = sd_dhcp_lease_get_address(link->dhcp_lease, &address); diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index 66fbeac79d..46830290c6 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -934,6 +934,11 @@ int link_request_set_routes(Link *link) { link->static_routes_configured = false; + if (!link_has_carrier(link) && !link->network->configure_without_carrier) + /* During configuring addresses, the link lost its carrier. As networkd is dropping + * the addresses now, let's not configure the routes either. */ + return 0; + r = link_request_set_routing_policy_rule(link); if (r < 0) return r; diff --git a/test/test-network/systemd-networkd-tests.py b/test/test-network/systemd-networkd-tests.py index 1eda8ee8e8..2fbd9ae7b7 100755 --- a/test/test-network/systemd-networkd-tests.py +++ b/test/test-network/systemd-networkd-tests.py @@ -2815,7 +2815,7 @@ class NetworkdDHCPClientTests(unittest.TestCase, Utilities): self.wait_address('veth99', r'inet 192.168.5.[0-9]*/24 brd 192.168.5.255 scope global dynamic', ipv='-4') self.wait_address('veth99', r'inet6 2600::[0-9a-f]*/128 scope global (?:dynamic noprefixroute|noprefixroute dynamic)', ipv='-6') - time.sleep(3) + time.sleep(10) output = check_output(*resolvectl_cmd, 'dns', 'veth99', env=env) print(output) self.assertRegex(output, '192.168.5.1') @@ -2833,7 +2833,7 @@ class NetworkdDHCPClientTests(unittest.TestCase, Utilities): self.wait_address('veth99', r'inet 192.168.5.[0-9]*/24 brd 192.168.5.255 scope global dynamic', ipv='-4') self.wait_address('veth99', r'inet6 2600::[0-9a-f]*/128 scope global (?:dynamic noprefixroute|noprefixroute dynamic)', ipv='-6') - time.sleep(3) + time.sleep(10) output = check_output(*resolvectl_cmd, 'dns', 'veth99', env=env) print(output) self.assertNotRegex(output, '192.168.5.1') @@ -2851,7 +2851,7 @@ class NetworkdDHCPClientTests(unittest.TestCase, Utilities): self.wait_address('veth99', r'inet 192.168.5.[0-9]*/24 brd 192.168.5.255 scope global dynamic', ipv='-4') self.wait_address('veth99', r'inet6 2600::[0-9a-f]*/128 scope global (?:dynamic noprefixroute|noprefixroute dynamic)', ipv='-6') - time.sleep(3) + time.sleep(10) output = check_output(*resolvectl_cmd, 'dns', 'veth99', env=env) print(output) self.assertRegex(output, '192.168.5.1') @@ -2869,7 +2869,7 @@ class NetworkdDHCPClientTests(unittest.TestCase, Utilities): self.wait_address('veth99', r'inet 192.168.5.[0-9]*/24 brd 192.168.5.255 scope global dynamic', ipv='-4') self.wait_address('veth99', r'inet6 2600::[0-9a-f]*/128 scope global (?:dynamic noprefixroute|noprefixroute dynamic)', ipv='-6') - time.sleep(3) + time.sleep(10) output = check_output(*resolvectl_cmd, 'dns', 'veth99', env=env) print(output) self.assertRegex(output, '192.168.5.1')