Merge branch 'ha-pool-offset'
Ensure an even distribution of a pool's addresses among all segments. Fixes #2828.
This commit is contained in:
@@ -159,13 +159,13 @@ static pool_t* get_pool(private_ha_attribute_t *this, char *name)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check if we are responsible for a bit in our bitmask
|
* Check if we are responsible for an offset
|
||||||
*/
|
*/
|
||||||
static bool responsible_for(private_ha_attribute_t *this, int bit)
|
static bool responsible_for(private_ha_attribute_t *this, int offset)
|
||||||
{
|
{
|
||||||
u_int segment;
|
u_int segment;
|
||||||
|
|
||||||
segment = this->kernel->get_segment_int(this->kernel, bit);
|
segment = offset % this->segments->count(this->segments) + 1;
|
||||||
return this->segments->is_active(this->segments, segment);
|
return this->segments->is_active(this->segments, segment);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -175,7 +175,7 @@ METHOD(attribute_provider_t, acquire_address, host_t*,
|
|||||||
{
|
{
|
||||||
enumerator_t *enumerator;
|
enumerator_t *enumerator;
|
||||||
pool_t *pool = NULL;
|
pool_t *pool = NULL;
|
||||||
int offset = -1, byte, bit;
|
int offset = -1, tmp_offset, byte, bit;
|
||||||
host_t *address;
|
host_t *address;
|
||||||
char *name;
|
char *name;
|
||||||
|
|
||||||
@@ -199,10 +199,11 @@ METHOD(attribute_provider_t, acquire_address, host_t*,
|
|||||||
{
|
{
|
||||||
for (bit = 0; bit < 8; bit++)
|
for (bit = 0; bit < 8; bit++)
|
||||||
{
|
{
|
||||||
|
tmp_offset = byte * 8 + bit;
|
||||||
if (!(pool->mask[byte] & 1 << bit) &&
|
if (!(pool->mask[byte] & 1 << bit) &&
|
||||||
responsible_for(this, bit))
|
responsible_for(this, tmp_offset))
|
||||||
{
|
{
|
||||||
offset = byte * 8 + bit;
|
offset = tmp_offset;
|
||||||
pool->mask[byte] |= 1 << bit;
|
pool->mask[byte] |= 1 << bit;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -433,6 +433,12 @@ METHOD(ha_segments_t, is_active, bool,
|
|||||||
return (this->active & SEGMENTS_BIT(segment)) != 0;
|
return (this->active & SEGMENTS_BIT(segment)) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
METHOD(ha_segments_t, count, u_int,
|
||||||
|
private_ha_segments_t *this)
|
||||||
|
{
|
||||||
|
return this->count;
|
||||||
|
}
|
||||||
|
|
||||||
METHOD(ha_segments_t, destroy, void,
|
METHOD(ha_segments_t, destroy, void,
|
||||||
private_ha_segments_t *this)
|
private_ha_segments_t *this)
|
||||||
{
|
{
|
||||||
@@ -459,6 +465,7 @@ ha_segments_t *ha_segments_create(ha_socket_t *socket, ha_kernel_t *kernel,
|
|||||||
.deactivate = _deactivate,
|
.deactivate = _deactivate,
|
||||||
.handle_status = _handle_status,
|
.handle_status = _handle_status,
|
||||||
.is_active = _is_active,
|
.is_active = _is_active,
|
||||||
|
.count = _count,
|
||||||
.destroy = _destroy,
|
.destroy = _destroy,
|
||||||
},
|
},
|
||||||
.socket = socket,
|
.socket = socket,
|
||||||
|
|||||||
@@ -82,6 +82,13 @@ struct ha_segments_t {
|
|||||||
*/
|
*/
|
||||||
bool (*is_active)(ha_segments_t *this, u_int segment);
|
bool (*is_active)(ha_segments_t *this, u_int segment);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the number of segments
|
||||||
|
*
|
||||||
|
* @return number of segments
|
||||||
|
*/
|
||||||
|
u_int (*count)(ha_segments_t *this);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Destroy a ha_segments_t.
|
* Destroy a ha_segments_t.
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user