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) static void load_addrs(private_load_tester_config_t *this)
{ {
enumerator_t *enumerator; enumerator_t *enumerator, *tokens;
host_t *net; host_t *from, *to;
int bits; int bits;
char *iface, *cidr; char *iface, *token, *pos;
mem_pool_t *pool; mem_pool_t *pool;
this->prefix = lib->settings->get_int(lib->settings, this->prefix = lib->settings->get_int(lib->settings,
"%s.plugins.load-tester.addrs_prefix", 16, charon->name); "%s.plugins.load-tester.addrs_prefix", 16, charon->name);
enumerator = lib->settings->create_key_value_enumerator(lib->settings, enumerator = lib->settings->create_key_value_enumerator(lib->settings,
"%s.plugins.load-tester.addrs", charon->name); "%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); tokens = enumerator_create_token(token, ",", " ");
if (net) while (tokens->enumerate(tokens, &token))
{ {
DBG1(DBG_CFG, "loaded load-tester addresses %s", cidr); pos = strchr(token, '-');
pool = mem_pool_create(iface, net, bits); if (pos)
net->destroy(net); { /* range */
this->pools->insert_last(this->pools, pool); *(pos++) = '\0';
} /* trim whitespace */
else while (*pos == ' ')
{ {
DBG1(DBG_CFG, "parsing load-tester addresses %s failed", cidr); 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); enumerator->destroy(enumerator);
} }