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;
/* 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. */
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(
Address **ret) {
_cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
- Address *a;
+ Address *acquired_address, *a;
int r;
assert(address);
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;
}
static Link *link_free(Link *link) {
- Address *address;
-
assert(link);
link_ntp_settings_clear(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);
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);