Support mutliple subnets and ranges as external load-tester addresses

This commit is contained in:
Martin Willi
2013-03-11 15:16:13 +01:00
parent 0897cda33b
commit d6b6d1ecdb
@@ -205,31 +205,75 @@ static bool equals(host_t *a, host_t *b)
*/
static void load_addrs(private_load_tester_config_t *this)
{
enumerator_t *enumerator;
host_t *net;
enumerator_t *enumerator, *tokens;
host_t *from, *to;
int bits;
char *iface, *cidr;
char *iface, *token, *pos;
mem_pool_t *pool;
this->prefix = lib->settings->get_int(lib->settings,
"%s.plugins.load-tester.addrs_prefix", 16, charon->name);
enumerator = lib->settings->create_key_value_enumerator(lib->settings,
"%s.plugins.load-tester.addrs", charon->name);
while (enumerator->enumerate(enumerator, &iface, &cidr))
while (enumerator->enumerate(enumerator, &iface, &token))
{
net = host_create_from_subnet(cidr, &bits);
if (net)
tokens = enumerator_create_token(token, ",", " ");
while (tokens->enumerate(tokens, &token))
{
DBG1(DBG_CFG, "loaded load-tester addresses %s", cidr);
pool = mem_pool_create(iface, net, bits);
net->destroy(net);
this->pools->insert_last(this->pools, pool);
}
else
{
DBG1(DBG_CFG, "parsing load-tester addresses %s failed", cidr);
pos = strchr(token, '-');
if (pos)
{ /* range */
*(pos++) = '\0';
/* trim whitespace */
while (*pos == ' ')
{
pos++;
}
while (token[strlen(token) - 1] == ' ')
{
token[strlen(token) - 1] = '\0';
}
from = host_create_from_string(token, 0);
to = host_create_from_string(pos, 0);
if (from && to)
{
pool = mem_pool_create_range(iface, from, to);
if (pool)
{
DBG1(DBG_CFG, "loaded load-tester address range "
"%H-%H on %s", from, to, iface);
this->pools->insert_last(this->pools, pool);
}
from->destroy(from);
to->destroy(to);
}
else
{
DBG1(DBG_CFG, "parsing load-tester address range %s-%s "
"failed, skipped", token, pos);
DESTROY_IF(from);
DESTROY_IF(to);
}
}
else
{ /* subnet */
from = host_create_from_subnet(token, &bits);
if (from)
{
DBG1(DBG_CFG, "loaded load-tester address pool %H/%d on %s",
from, bits, iface);
pool = mem_pool_create(iface, from, bits);
from->destroy(from);
this->pools->insert_last(this->pools, pool);
}
else
{
DBG1(DBG_CFG, "parsing load-tester address %s failed, "
"skipped", token);
}
}
}
tokens->destroy(tokens);
}
enumerator->destroy(enumerator);
}