]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
inetwork/address-pool: also check queued addresses 28917/head
authorYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 22 Aug 2023 03:22:13 +0000 (12:22 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 22 Aug 2023 03:30:26 +0000 (12:30 +0900)
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.

src/network/networkd-address-pool.c

index c8c6b82fc1fd1b2d8cb6bcfa72cee6aa1c3e99ce..d9ac78a1a9fdb69c424bb7e4aa651edaede65929 100644 (file)
@@ -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;
 }