diff options
-rw-r--r-- | src/network/networkd-address-pool.c | 2 | ||||
-rw-r--r-- | src/network/networkd-address.c | 31 | ||||
-rw-r--r-- | src/network/networkd-address.h | 2 | ||||
-rw-r--r-- | src/network/networkd-dhcp-server.c | 2 | ||||
-rw-r--r-- | src/network/networkd-link.c | 8 | ||||
-rw-r--r-- | src/network/networkd-link.h | 3 |
6 files changed, 22 insertions, 26 deletions
diff --git a/src/network/networkd-address-pool.c b/src/network/networkd-address-pool.c index e867323dbb..5f5a170718 100644 --- a/src/network/networkd-address-pool.c +++ b/src/network/networkd-address-pool.c @@ -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; diff --git a/src/network/networkd-address.c b/src/network/networkd-address.c index d2c08a0f32..1502251fc4 100644 --- a/src/network/networkd-address.c +++ b/src/network/networkd-address.c @@ -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; diff --git a/src/network/networkd-address.h b/src/network/networkd-address.h index 097cafc315..5b930314c0 100644 --- a/src/network/networkd-address.h +++ b/src/network/networkd-address.h @@ -52,8 +52,6 @@ struct Address { address_ready_callback_t callback; sd_ipv4acd *acd; - - LIST_FIELDS(Address, addresses); }; int address_new(Address **ret); diff --git a/src/network/networkd-dhcp-server.c b/src/network/networkd-dhcp-server.c index ddc58cb9c0..9195f0680f 100644 --- a/src/network/networkd-dhcp-server.c +++ b/src/network/networkd-dhcp-server.c @@ -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; diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index dc6960b00b..ef3a20befb 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -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); diff --git a/src/network/networkd-link.h b/src/network/networkd-link.h index 670ae9783d..361646ec4d 100644 --- a/src/network/networkd-link.h +++ b/src/network/networkd-link.h @@ -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; |