diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index ec6d03ff02..d16090dbcd 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -398,11 +398,6 @@ void link_check_ready(Link *link) { if (!link->static_addresses_configured) return (void) log_link_debug(link, "%s(): static addresses are not configured.", __func__); - SET_FOREACH(a, link->addresses) - if (!address_is_ready(a)) - return (void) log_link_debug(link, "%s(): address %s is not ready.", __func__, - IN_ADDR_PREFIX_TO_STRING(a->family, &a->in_addr, a->prefixlen)); - if (!link->static_address_labels_configured) return (void) log_link_debug(link, "%s(): static address labels are not configured.", __func__); @@ -436,6 +431,21 @@ void link_check_ready(Link *link) { !in6_addr_is_set(&link->ipv6ll_address)) return (void) log_link_debug(link, "%s(): IPv6LL is not configured yet.", __func__); + /* All static addresses must be ready. */ + bool has_static_address = false; + SET_FOREACH(a, link->addresses) { + if (a->source != NETWORK_CONFIG_SOURCE_STATIC) + continue; + if (!address_is_ready(a)) + return (void) log_link_debug(link, "%s(): static address %s is not ready.", __func__, + IN_ADDR_PREFIX_TO_STRING(a->family, &a->in_addr, a->prefixlen)); + has_static_address = true; + } + + /* If at least one static address is requested, do not request that dynamic addressing protocols are finished. */ + if (has_static_address) + goto ready; + /* If no dynamic addressing protocol enabled, assume the interface is ready. * Note, ignore NDisc when ConfigureWithoutCarrier= is enabled, as IPv6AcceptRA= is enabled by default. */ if (!link_ipv4ll_enabled(link) && !link_dhcp4_enabled(link) && diff --git a/test/test-network/systemd-networkd-tests.py b/test/test-network/systemd-networkd-tests.py index 8b01718d55..2fd3f10021 100755 --- a/test/test-network/systemd-networkd-tests.py +++ b/test/test-network/systemd-networkd-tests.py @@ -4676,6 +4676,7 @@ class NetworkdDHCPClientTests(unittest.TestCase, Utilities): '--dhcp-alternate-port=67,5555', ipv4_range='192.168.5.110,192.168.5.119') self.wait_online(['veth99:routable', 'veth-peer:routable']) + self.wait_address('veth99', r'inet 192.168.5.11[0-9]*/24', ipv='-4') print('## ip address show dev veth99 scope global') output = check_output('ip address show dev veth99 scope global')