]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: manage addresses from pool by Set
authorYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 2 Oct 2020 04:39:02 +0000 (13:39 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 6 Oct 2020 17:50:50 +0000 (02:50 +0900)
src/network/networkd-address-pool.c
src/network/networkd-address.c
src/network/networkd-address.h
src/network/networkd-dhcp-server.c
src/network/networkd-link.c
src/network/networkd-link.h

index e867323dbbc559f0158f6a77b064fcf21ed6fa93..5f5a17071877d302a6f3cf8159ebb4374e17da3f 100644 (file)
@@ -94,7 +94,7 @@ static bool address_pool_prefix_is_taken(
                 }
 
                 /* Don't clash with addresses already pulled from the pool, but not assigned yet */
-                LIST_FOREACH(addresses, a, l->pool_addresses) {
+                SET_FOREACH(a, l->pool_addresses) {
                         if (a->family != p->family)
                                 continue;
 
index d2c08a0f32e43f006fd2c322ae8cbe934510d69b..1502251fc4611a4d0937ad36e54d46900fb08b15 100644 (file)
@@ -657,13 +657,9 @@ int link_drop_addresses(Link *link) {
 
                 link->address_remove_messages++;
 
-                /* If this address came from an address pool, clean up the pool */
-                LIST_FOREACH(addresses, pool_address, link->pool_addresses)
-                        if (address_equal(address, pool_address)) {
-                                LIST_REMOVE(addresses, link->pool_addresses, pool_address);
-                                address_free(pool_address);
-                                break;
-                        }
+                SET_FOREACH(pool_address, link->pool_addresses)
+                        if (address_equal(address, pool_address))
+                                address_free(set_remove(link->pool_addresses, pool_address));
         }
 
         return r;
@@ -681,8 +677,12 @@ static int address_acquire(Link *link, Address *original, Address **ret) {
 
         /* Something useful was configured? just use it */
         r = in_addr_is_null(original->family, &original->in_addr);
-        if (r <= 0)
+        if (r < 0)
                 return r;
+        if (r == 0) {
+                *ret = NULL;
+                return 0;
+        }
 
         /* The address is configured to be 0.0.0.0 or [::] by the user?
          * Then let's acquire something more useful from the pool. */
@@ -722,11 +722,14 @@ static int address_acquire(Link *link, Address *original, Address **ret) {
         na->broadcast = broadcast;
         na->in_addr = in_addr;
 
-        LIST_PREPEND(addresses, link->pool_addresses, na);
+        r = set_ensure_put(&link->pool_addresses, &address_hash_ops, na);
+        if (r < 0)
+                return r;
+        if (r == 0)
+                return -EEXIST;
 
         *ret = TAKE_PTR(na);
-
-        return 0;
+        return 1;
 }
 
 int address_configure(
@@ -737,7 +740,7 @@ int address_configure(
                 Address **ret) {
 
         _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
-        Address *a;
+        Address *acquired_address, *a;
         int r;
 
         assert(address);
@@ -754,9 +757,11 @@ int address_configure(
                 return log_link_error_errno(link, SYNTHETIC_ERRNO(E2BIG),
                                             "Too many addresses are configured, refusing: %m");
 
-        r = address_acquire(link, address, &address);
+        r = address_acquire(link, address, &acquired_address);
         if (r < 0)
                 return log_link_error_errno(link, r, "Failed to acquire an address from pool: %m");
+        if (acquired_address)
+                address = acquired_address;
 
         if (DEBUG_LOGGING) {
                 _cleanup_free_ char *str = NULL;
index 097cafc3150301b883e04ac2c1ad1a79e8faf01e..5b930314c0fce63e920e8b451df7dc8705cc8076 100644 (file)
@@ -52,8 +52,6 @@ struct Address {
         address_ready_callback_t callback;
 
         sd_ipv4acd *acd;
-
-        LIST_FIELDS(Address, addresses);
 };
 
 int address_new(Address **ret);
index ddc58cb9c04b7840ce7e6c89244fb3345b84fd2e..9195f0680fe7fd8b33cdd45ef13718306f530587 100644 (file)
@@ -27,7 +27,7 @@ static Address* link_find_dhcp_server_address(Link *link) {
                         return address;
 
         /* If that didn't work, find a suitable address we got from the pool */
-        LIST_FOREACH(addresses, address, link->pool_addresses)
+        SET_FOREACH(address, link->pool_addresses)
                 if (address->family == AF_INET)
                         return address;
 
index dc6960b00b2745757eba309393130242bc74d37d..ef3a20befbb0ae6f0d60e3f40a17ce63a12deb65 100644 (file)
@@ -707,8 +707,6 @@ static void link_free_engines(Link *link) {
 }
 
 static Link *link_free(Link *link) {
-        Address *address;
-
         assert(link);
 
         link_ntp_settings_clear(link);
@@ -732,6 +730,7 @@ static Link *link_free(Link *link) {
 
         link->addresses = set_free(link->addresses);
         link->addresses_foreign = set_free(link->addresses_foreign);
+        link->pool_addresses = set_free(link->pool_addresses);
         link->static_addresses = set_free(link->static_addresses);
         link->dhcp6_addresses = set_free(link->dhcp6_addresses);
         link->dhcp6_addresses_old = set_free(link->dhcp6_addresses_old);
@@ -739,11 +738,6 @@ static Link *link_free(Link *link) {
         link->dhcp6_pd_addresses_old = set_free(link->dhcp6_pd_addresses_old);
         link->ndisc_addresses = set_free(link->ndisc_addresses);
 
-        while ((address = link->pool_addresses)) {
-                LIST_REMOVE(addresses, link->pool_addresses, address);
-                address_free(address);
-        }
-
         link_lldp_emit_stop(link);
         link_free_engines(link);
         free(link->lease_file);
index 670ae9783d2bbdfe148254ac9a5e43cbdae6bede..361646ec4dd5b546351102bb3ef33e0b4c73abe7 100644 (file)
@@ -89,6 +89,7 @@ typedef struct Link {
 
         Set *addresses;
         Set *addresses_foreign;
+        Set *pool_addresses;
         Set *static_addresses;
         Set *neighbors;
         Set *neighbors_foreign;
@@ -127,8 +128,6 @@ typedef struct Link {
         bool ipv6_mtu_set:1;
         bool bridge_mdb_configured:1;
 
-        LIST_HEAD(Address, pool_addresses);
-
         sd_dhcp_server *dhcp_server;
 
         sd_ndisc *ndisc;