Pass the full list of pools to acquire_address, enumerate in providers
If the provider has access to the full pool list, it can enumerate them twice, for example to search for existing leases first, and only search for new leases in a second step. Fixes lease enumeration in attr-sql using multiple pools.
This commit is contained in:
@@ -60,8 +60,8 @@ typedef struct {
|
||||
} enum_data_t;
|
||||
|
||||
METHOD(attribute_manager_t, acquire_address, host_t*,
|
||||
private_attribute_manager_t *this, char *pool, identification_t *id,
|
||||
host_t *requested)
|
||||
private_attribute_manager_t *this, linked_list_t *pools,
|
||||
identification_t *id, host_t *requested)
|
||||
{
|
||||
enumerator_t *enumerator;
|
||||
attribute_provider_t *current;
|
||||
@@ -71,7 +71,7 @@ METHOD(attribute_manager_t, acquire_address, host_t*,
|
||||
enumerator = this->providers->create_enumerator(this->providers);
|
||||
while (enumerator->enumerate(enumerator, ¤t))
|
||||
{
|
||||
host = current->acquire_address(current, pool, id, requested);
|
||||
host = current->acquire_address(current, pools, id, requested);
|
||||
if (host)
|
||||
{
|
||||
break;
|
||||
|
||||
@@ -39,13 +39,13 @@ struct attribute_manager_t {
|
||||
/**
|
||||
* Acquire a virtual IP address to assign to a peer.
|
||||
*
|
||||
* @param pool pool name to acquire address from
|
||||
* @param pools list of pool names (char*) to acquire from
|
||||
* @param id peer identity to get address forua
|
||||
* @param requested IP in configuration request
|
||||
* @return allocated address, NULL to serve none
|
||||
*/
|
||||
host_t* (*acquire_address)(attribute_manager_t *this,
|
||||
char *pool, identification_t *id,
|
||||
linked_list_t *pool, identification_t *id,
|
||||
host_t *requested);
|
||||
|
||||
/**
|
||||
|
||||
@@ -35,13 +35,13 @@ struct attribute_provider_t {
|
||||
/**
|
||||
* Acquire a virtual IP address to assign to a peer.
|
||||
*
|
||||
* @param pool name of the pool to acquire address from
|
||||
* @param pools list of pool names (char*) to acquire from
|
||||
* @param id peer ID
|
||||
* @param requested IP in configuration request
|
||||
* @return allocated address, NULL to serve none
|
||||
*/
|
||||
host_t* (*acquire_address)(attribute_provider_t *this,
|
||||
char *pool, identification_t *id,
|
||||
linked_list_t *pools, identification_t *id,
|
||||
host_t *requested);
|
||||
/**
|
||||
* Release a previously acquired address.
|
||||
|
||||
@@ -233,26 +233,51 @@ static host_t* get_lease(private_sql_attribute_t *this, char *name,
|
||||
}
|
||||
|
||||
METHOD(attribute_provider_t, acquire_address, host_t*,
|
||||
private_sql_attribute_t *this, char *name, identification_t *id,
|
||||
private_sql_attribute_t *this, linked_list_t *pools, identification_t *id,
|
||||
host_t *requested)
|
||||
{
|
||||
enumerator_t *enumerator;
|
||||
host_t *address = NULL;
|
||||
u_int identity, pool, timeout;
|
||||
char *name;
|
||||
|
||||
identity = get_identity(this, id);
|
||||
if (identity)
|
||||
{
|
||||
pool = get_pool(this, name, &timeout);
|
||||
if (pool)
|
||||
/* check for an existing lease in all pools */
|
||||
enumerator = pools->create_enumerator(pools);
|
||||
while (enumerator->enumerate(enumerator, &name))
|
||||
{
|
||||
/* check for an existing lease */
|
||||
address = check_lease(this, name, pool, identity);
|
||||
if (address == NULL)
|
||||
pool = get_pool(this, name, &timeout);
|
||||
if (pool)
|
||||
{
|
||||
/* get an unallocated address or expired lease */
|
||||
address = get_lease(this, name, pool, timeout, identity);
|
||||
address = check_lease(this, name, pool, identity);
|
||||
if (address)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
enumerator->destroy(enumerator);
|
||||
|
||||
if (!address)
|
||||
{
|
||||
/* get an unallocated address or expired lease */
|
||||
enumerator = pools->create_enumerator(pools);
|
||||
while (enumerator->enumerate(enumerator, &name))
|
||||
{
|
||||
pool = get_pool(this, name, &timeout);
|
||||
if (pool)
|
||||
{
|
||||
address = get_lease(this, name, pool, timeout, identity);
|
||||
if (address)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
enumerator->destroy(enumerator);
|
||||
}
|
||||
}
|
||||
return address;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user