diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index 11dca0162b..f413e61911 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -861,6 +861,15 @@ void link_check_ready(Link *link) { if (!link->neighbors_configured) return; + SET_FOREACH(a, link->addresses, i) + if (!address_is_ready(a)) + return; + + if (!link->addresses_ready) { + link->addresses_ready = true; + link_request_set_routes(link); + } + if (!link->static_routes_configured) return; @@ -890,10 +899,6 @@ void link_check_ready(Link *link) { return; } - SET_FOREACH(a, link->addresses, i) - if (!address_is_ready(a)) - return; - if (link->state != LINK_STATE_CONFIGURED) link_enter_configured(link); @@ -954,7 +959,7 @@ static int address_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) if (link->address_messages == 0) { log_link_debug(link, "Addresses set"); link->addresses_configured = true; - link_request_set_routes(link); + link_check_ready(link); } return 1; @@ -1084,6 +1089,7 @@ static int link_request_set_addresses(Link *link) { /* Reset all *_configured flags we are configuring. */ link->addresses_configured = false; + link->addresses_ready = false; link->neighbors_configured = false; link->static_routes_configured = false; link->routing_policy_rules_configured = false; @@ -1238,7 +1244,7 @@ static int link_request_set_addresses(Link *link) { if (link->address_messages == 0) { link->addresses_configured = true; - link_request_set_routes(link); + link_check_ready(link); } else log_link_debug(link, "Setting addresses"); diff --git a/src/network/networkd-link.h b/src/network/networkd-link.h index 00e68fdfaa..e417ea26ef 100644 --- a/src/network/networkd-link.h +++ b/src/network/networkd-link.h @@ -82,6 +82,7 @@ typedef struct Link { Set *routes_foreign; bool addresses_configured; + bool addresses_ready; sd_dhcp_client *dhcp_client; sd_dhcp_lease *dhcp_lease;