diff --git a/src/network/networkd-address.c b/src/network/networkd-address.c index f2a88da411..2dd02f5efb 100644 --- a/src/network/networkd-address.c +++ b/src/network/networkd-address.c @@ -685,6 +685,26 @@ int address_get(Link *link, const Address *in, Address **ret) { return -ENOENT; } +int address_get_harder(Link *link, const Address *in, Address **ret) { + Request *req; + int r; + + assert(link); + assert(in); + + if (address_get(link, in, ret) >= 0) + return 0; + + r = address_get_request(link, in, &req); + if (r < 0) + return r; + + if (ret) + *ret = ASSERT_PTR(req->userdata); + + return 0; +} + int link_get_address(Link *link, int family, const union in_addr_union *address, unsigned char prefixlen, Address **ret) { Address *a; int r; diff --git a/src/network/networkd-address.h b/src/network/networkd-address.h index 9b418af414..bdb5b5b5e5 100644 --- a/src/network/networkd-address.h +++ b/src/network/networkd-address.h @@ -73,6 +73,7 @@ int address_flags_to_string_alloc(uint32_t flags, int family, char **ret); int address_new(Address **ret); Address* address_free(Address *address); int address_get(Link *link, const Address *in, Address **ret); +int address_get_harder(Link *link, const Address *in, Address **ret); int address_configure_handler_internal(sd_netlink *rtnl, sd_netlink_message *m, Link *link, const char *error_msg); int address_remove(Address *address); int address_remove_and_drop(Address *address); diff --git a/src/network/networkd-dhcp-prefix-delegation.c b/src/network/networkd-dhcp-prefix-delegation.c index 8d50da042c..169f1b3b5e 100644 --- a/src/network/networkd-dhcp-prefix-delegation.c +++ b/src/network/networkd-dhcp-prefix-delegation.c @@ -359,7 +359,7 @@ static void log_dhcp_pd_address(Link *link, const Address *address) { assert(address); assert(address->family == AF_INET6); - int log_level = address_get(link, address, NULL) >= 0 ? LOG_DEBUG : LOG_INFO; + int log_level = address_get_harder(link, address, NULL) >= 0 ? LOG_DEBUG : LOG_INFO; if (log_level < log_get_max_level()) return; diff --git a/src/network/networkd-dhcp-server.c b/src/network/networkd-dhcp-server.c index 50d84893c6..8221fd92db 100644 --- a/src/network/networkd-dhcp-server.c +++ b/src/network/networkd-dhcp-server.c @@ -108,8 +108,8 @@ int link_request_dhcp_server_address(Link *link) { address->prefixlen = link->network->dhcp_server_address_prefixlen; address_set_broadcast(address, link); - if (address_get(link, address, &existing) >= 0 && - address_exists(existing) && + if (address_get_harder(link, address, &existing) >= 0 && + (address_exists(existing) || address_is_requesting(existing)) && existing->source == NETWORK_CONFIG_SOURCE_STATIC) /* The same address seems explicitly configured in [Address] or [Network] section. * Configure the DHCP server address only when it is not. */ diff --git a/src/network/networkd-dhcp6.c b/src/network/networkd-dhcp6.c index 755957f5b1..00c767e1fb 100644 --- a/src/network/networkd-dhcp6.c +++ b/src/network/networkd-dhcp6.c @@ -161,7 +161,7 @@ static int verify_dhcp6_address(Link *link, const Address *address) { const char *pretty = IN6_ADDR_TO_STRING(&address->in_addr.in6); - if (address_get(link, address, &existing) < 0) { + if (address_get_harder(link, address, &existing) < 0) { /* New address. */ log_level = LOG_INFO; goto simple_log;