Add a constructor to create in-memory pools from an address range

This commit is contained in:
Martin Willi
2013-03-11 15:12:47 +01:00
parent 8f727d8007
commit 0897cda33b
2 changed files with 58 additions and 3 deletions
+48 -3
View File
@@ -513,12 +513,11 @@ METHOD(mem_pool_t, destroy, void,
}
/**
* Described in header
* Generic constructor
*/
mem_pool_t *mem_pool_create(char *name, host_t *base, int bits)
static private_mem_pool_t *create_generic(char *name)
{
private_mem_pool_t *this;
int addr_bits;
INIT(this,
.public = {
@@ -538,6 +537,18 @@ mem_pool_t *mem_pool_create(char *name, host_t *base, int bits)
.mutex = mutex_create(MUTEX_TYPE_DEFAULT),
);
return this;
}
/**
* Described in header
*/
mem_pool_t *mem_pool_create(char *name, host_t *base, int bits)
{
private_mem_pool_t *this;
int addr_bits;
this = create_generic(name);
if (base)
{
addr_bits = base->get_family(base) == AF_INET ? 32 : 128;
@@ -563,3 +574,37 @@ mem_pool_t *mem_pool_create(char *name, host_t *base, int bits)
return &this->public;
}
/**
* Described in header
*/
mem_pool_t *mem_pool_create_range(char *name, host_t *from, host_t *to)
{
private_mem_pool_t *this;
chunk_t fromaddr, toaddr;
u_int32_t diff;
fromaddr = from->get_address(from);
toaddr = to->get_address(to);
if (from->get_family(from) != to->get_family(to) ||
fromaddr.len != toaddr.len || fromaddr.len < sizeof(diff) ||
memcmp(fromaddr.ptr, toaddr.ptr, toaddr.len) > 0)
{
DBG1(DBG_CFG, "invalid IP address range: %H-%H", from, to);
return NULL;
}
if (fromaddr.len > sizeof(diff) &&
!chunk_equals(chunk_create(fromaddr.ptr, fromaddr.len - sizeof(diff)),
chunk_create(toaddr.ptr, toaddr.len - sizeof(diff))))
{
DBG1(DBG_CFG, "IP address range too large: %H-%H", from, to);
return NULL;
}
this = create_generic(name);
this->base = from->clone(from);
diff = untoh32(toaddr.ptr + toaddr.len - sizeof(diff)) -
untoh32(fromaddr.ptr + fromaddr.len - sizeof(diff));
this->size = diff + 1;
return &this->public;
}
+10
View File
@@ -133,4 +133,14 @@ struct mem_pool_t {
*/
mem_pool_t *mem_pool_create(char *name, host_t *base, int bits);
/**
* Create an in-memory IP address from a range.
*
* @param name name of this pool
* @param from start of ranged pool
* @param to end of ranged pool
* @return memory pool instance, NULL if range invalid
*/
mem_pool_t *mem_pool_create_range(char *name, host_t *from, host_t *to);
#endif /** MEM_POOL_H_ @} */