network: manage addresses from pool by Set
This commit is contained in:
parent
9cd9fc8f44
commit
aa651e88de
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -52,8 +52,6 @@ struct Address {
|
|||
address_ready_callback_t callback;
|
||||
|
||||
sd_ipv4acd *acd;
|
||||
|
||||
LIST_FIELDS(Address, addresses);
|
||||
};
|
||||
|
||||
int address_new(Address **ret);
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue