Pass full pool list to release_address
This commit is contained in:
@@ -119,13 +119,25 @@ METHOD(attribute_provider_t, acquire_address, host_t*,
|
||||
}
|
||||
|
||||
METHOD(attribute_provider_t, release_address, bool,
|
||||
private_dhcp_provider_t *this, char *pool,
|
||||
private_dhcp_provider_t *this, linked_list_t *pools,
|
||||
host_t *address, identification_t *id)
|
||||
{
|
||||
if (streq(pool, "dhcp") && address->get_family(address) == AF_INET)
|
||||
{
|
||||
dhcp_transaction_t *transaction;
|
||||
dhcp_transaction_t *transaction;
|
||||
enumerator_t *enumerator;
|
||||
bool found = FALSE;
|
||||
char *pool;
|
||||
|
||||
if (address->get_family(address) != AF_INET)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
enumerator = pools->create_enumerator(pools);
|
||||
while (enumerator->enumerate(enumerator, &pool))
|
||||
{
|
||||
if (!streq(pool, "dhcp"))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
this->mutex->lock(this->mutex);
|
||||
transaction = this->transactions->remove(this->transactions,
|
||||
(void*)hash_id_host(id, address));
|
||||
@@ -134,10 +146,12 @@ METHOD(attribute_provider_t, release_address, bool,
|
||||
{
|
||||
this->socket->release(this->socket, transaction);
|
||||
transaction->destroy(transaction);
|
||||
return TRUE;
|
||||
found = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
enumerator->destroy(enumerator);
|
||||
return found;
|
||||
}
|
||||
|
||||
METHOD(attribute_provider_t, create_attribute_enumerator, enumerator_t*,
|
||||
|
||||
@@ -232,26 +232,40 @@ METHOD(attribute_provider_t, acquire_address, host_t*,
|
||||
}
|
||||
|
||||
METHOD(attribute_provider_t, release_address, bool,
|
||||
private_ha_attribute_t *this, char *name, host_t *address,
|
||||
private_ha_attribute_t *this, linked_list_t *pools, host_t *address,
|
||||
identification_t *id)
|
||||
{
|
||||
enumerator_t *enumerator;
|
||||
pool_t *pool;
|
||||
int offset;
|
||||
char *name;
|
||||
bool found = FALSE;
|
||||
|
||||
enumerator = pools->create_enumerator(pools);
|
||||
this->mutex->lock(this->mutex);
|
||||
pool = get_pool(this, name);
|
||||
if (pool)
|
||||
while (enumerator->enumerate(enumerator, &name))
|
||||
{
|
||||
pool = get_pool(this, name);
|
||||
if (!pool)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (pool->base->get_family(pool->base) != address->get_family(address))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
offset = host2offset(pool, address);
|
||||
if (offset > 0 && offset < pool->size)
|
||||
{
|
||||
pool->mask[offset / 8] &= ~(1 << (offset % 8));
|
||||
DBG1(DBG_CFG, "released address %H to HA pool '%s'", address, name);
|
||||
found = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
this->mutex->unlock(this->mutex);
|
||||
enumerator->destroy(enumerator);
|
||||
|
||||
return found;
|
||||
}
|
||||
|
||||
|
||||
@@ -119,19 +119,31 @@ METHOD(attribute_provider_t, acquire_address, host_t*,
|
||||
}
|
||||
|
||||
METHOD(attribute_provider_t, release_address, bool,
|
||||
private_stroke_attribute_t *this, char *name, host_t *address,
|
||||
private_stroke_attribute_t *this, linked_list_t *pools, host_t *address,
|
||||
identification_t *id)
|
||||
{
|
||||
enumerator_t *enumerator;
|
||||
mem_pool_t *pool;
|
||||
bool found = FALSE;
|
||||
char *name;
|
||||
|
||||
enumerator = pools->create_enumerator(pools);
|
||||
this->lock->read_lock(this->lock);
|
||||
pool = find_pool(this, name);
|
||||
if (pool)
|
||||
while (enumerator->enumerate(enumerator, &name))
|
||||
{
|
||||
found = pool->release_address(pool, address, id);
|
||||
pool = find_pool(this, name);
|
||||
if (pool)
|
||||
{
|
||||
found = pool->release_address(pool, address, id);
|
||||
if (found)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
this->lock->unlock(this->lock);
|
||||
enumerator->destroy(enumerator);
|
||||
|
||||
return found;
|
||||
}
|
||||
|
||||
|
||||
@@ -53,15 +53,15 @@ static void* testing(void *thread)
|
||||
}
|
||||
}
|
||||
|
||||
pools->destroy(pools);
|
||||
|
||||
/* release addresses */
|
||||
for (i = 0; i < ALLOCS; i++)
|
||||
{
|
||||
hydra->attributes->release_address(hydra->attributes,
|
||||
"test", addr[i], id[i]);
|
||||
pools, addr[i], id[i]);
|
||||
}
|
||||
|
||||
pools->destroy(pools);
|
||||
|
||||
/* cleanup */
|
||||
for (i = 0; i < ALLOCS; i++)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user