From: Yu Watanabe Date: Tue, 11 Jul 2023 03:11:18 +0000 (+0900) Subject: network/address: introduce address_get_harder() and use it where appropriate X-Git-Tag: v255-rc1~879^2~2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=b33dd04ebe40683e142e303a8a166273eaf56db5;p=thirdparty%2Fsystemd.git network/address: introduce address_get_harder() and use it where appropriate With the previous change, now Address objects under requesting are not owned by Link object, hence we need to also search corresponding Address object in the request queue. --- diff --git a/src/network/networkd-address.c b/src/network/networkd-address.c index f2a88da4113..2dd02f5efbe 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 9b418af4142..bdb5b5b5e50 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 8d50da042c8..169f1b3b5eb 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 50d84893c63..8221fd92dbd 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 755957f5b19..00c767e1fb8 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;