From: Yu Watanabe Date: Tue, 22 Aug 2023 03:22:13 +0000 (+0900) Subject: inetwork/address-pool: also check queued addresses X-Git-Tag: v255-rc1~648^2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=refs%2Fpull%2F28917%2Fhead;p=thirdparty%2Fsystemd.git inetwork/address-pool: also check queued addresses After 0a0c2672dbd22dc85d660e5baa7e1bef701beb88, acquired and queued addresses are not directly saved into Link object, but it will be saved later the addresses are really assigned to the interface. So, when searching free address space, we also need to check the queued addresses. --- diff --git a/src/network/networkd-address-pool.c b/src/network/networkd-address-pool.c index c8c6b82fc1f..d9ac78a1a9f 100644 --- a/src/network/networkd-address-pool.c +++ b/src/network/networkd-address-pool.c @@ -4,7 +4,7 @@ #include "networkd-address-pool.h" #include "networkd-address.h" #include "networkd-manager.h" -#include "set.h" +#include "networkd-queue.h" #include "string-util.h" #define RANDOM_PREFIX_TRIAL_MAX 1024 @@ -107,6 +107,7 @@ static bool address_pool_prefix_is_taken( Address *a; Link *l; Network *n; + Request *req; assert(p); assert(u); @@ -123,6 +124,15 @@ static bool address_pool_prefix_is_taken( if (address_intersect(a, p->family, u, prefixlen)) return true; + /* Also check queued addresses. */ + ORDERED_SET_FOREACH(req, p->manager->request_queue) { + if (req->type != REQUEST_TYPE_ADDRESS) + continue; + + if (address_intersect(req->userdata, p->family, u, prefixlen)) + return true; + } + return false; }