METHOD(kernel_net_t, add_ip, status_t,
private_kernel_android_net_t *this, host_t *virtual_ip, int prefix,
- host_t *iface_ip)
+ char *iface)
{
/* we get the IP from the IKE_SA once the CHILD_SA is established */
return SUCCESS;
*/
static host_t *allocate_addr(private_load_tester_config_t *this, uint num)
{
- enumerator_t *pools, *addrs;
+ enumerator_t *enumerator;
mem_pool_t *pool;
- host_t *addr, *iface = NULL, *found = NULL, *requested;
+ host_t *found = NULL, *requested;
identification_t *id;
- char *name, buf[32];
+ char *iface = NULL, buf[32];
requested = host_create_any(AF_INET);
snprintf(buf, sizeof(buf), "ext-%d", num);
id = identification_create_from_string(buf);
- pools = this->pools->create_enumerator(this->pools);
- while (!found && pools->enumerate(pools, &pool))
+ enumerator = this->pools->create_enumerator(this->pools);
+ while (enumerator->enumerate(enumerator, &pool))
{
- addrs = hydra->kernel_interface->create_address_enumerator(
- hydra->kernel_interface, ADDR_TYPE_REGULAR);
- while (!found && addrs->enumerate(addrs, &addr))
+ found = pool->acquire_address(pool, id, requested, MEM_POOL_NEW);
+ if (found)
{
- if (hydra->kernel_interface->get_interface(hydra->kernel_interface,
- addr, &name))
- {
- if (streq(pool->get_name(pool), name))
- {
- found = pool->acquire_address(pool, id, requested,
- MEM_POOL_NEW);
- if (found)
- {
- iface = addr->clone(addr);
- }
- }
- free(name);
- }
+ iface = (char*)pool->get_name(pool);
+ break;
}
- addrs->destroy(addrs);
}
- pools->destroy(pools);
+ enumerator->destroy(enumerator);
requested->destroy(requested);
id->destroy(id);
if (!found)
{
- DBG1(DBG_CFG, "no interface found to install load-tester IP");
+ DBG1(DBG_CFG, "no address found to install as load-tester external IP");
return NULL;
}
if (hydra->kernel_interface->add_ip(hydra->kernel_interface,
found, this->prefix, iface) != SUCCESS)
{
- DBG1(DBG_CFG, "installing load-tester IP %H failed", found);
- iface->destroy(iface);
+ DBG1(DBG_CFG, "installing load-tester IP %H on %s failed", found, iface);
found->destroy(found);
return NULL;
}
- DBG1(DBG_CFG, "installed load-tester IP %H", found);
- iface->destroy(iface);
+ DBG1(DBG_CFG, "installed load-tester IP %H on %s", found, iface);
return found;
}
*/
static void reinstall_vip(host_t *vip, host_t *me)
{
- hydra->kernel_interface->del_ip(hydra->kernel_interface, vip, -1);
- hydra->kernel_interface->add_ip(hydra->kernel_interface, vip, -1, me);
+ char *iface;
+
+ if (hydra->kernel_interface->get_interface(hydra->kernel_interface,
+ me, &iface))
+ {
+ hydra->kernel_interface->del_ip(hydra->kernel_interface, vip, -1);
+ hydra->kernel_interface->add_ip(hydra->kernel_interface, vip, -1, iface);
+ free(iface);
+ }
}
METHOD(child_sa_t, update, status_t,
{
if (local)
{
- DBG1(DBG_IKE, "installing new virtual IP %H", ip);
- if (hydra->kernel_interface->add_ip(hydra->kernel_interface,
- ip, -1, this->my_host) == SUCCESS)
+ char *iface;
+
+ if (hydra->kernel_interface->get_interface(hydra->kernel_interface,
+ this->my_host, &iface))
{
- this->my_vips->insert_last(this->my_vips, ip->clone(ip));
+ DBG1(DBG_IKE, "installing new virtual IP %H", ip);
+ if (hydra->kernel_interface->add_ip(hydra->kernel_interface,
+ ip, -1, iface) == SUCCESS)
+ {
+ this->my_vips->insert_last(this->my_vips, ip->clone(ip));
+ }
+ else
+ {
+ DBG1(DBG_IKE, "installing virtual IP %H failed", ip);
+ }
+ free(iface);
}
else
{
- DBG1(DBG_IKE, "installing virtual IP %H failed", ip);
+ DBG1(DBG_IKE, "looking up interface for virtual IP %H failed", ip);
}
}
else
METHOD(kernel_interface_t, add_ip, status_t,
private_kernel_interface_t *this, host_t *virtual_ip, int prefix,
- host_t *iface_ip)
+ char *iface)
{
if (!this->net)
{
return NOT_SUPPORTED;
}
- return this->net->add_ip(this->net, virtual_ip, prefix, iface_ip);
+ return this->net->add_ip(this->net, virtual_ip, prefix, iface);
}
METHOD(kernel_interface_t, del_ip, status_t,
* Virtual IPs are attached to an interface. If an IP is added multiple
* times, the IP is refcounted and not removed until del_ip() was called
* as many times as add_ip().
- * The virtual IP is attached to the interface where the iface_ip is found.
*
* @param virtual_ip virtual ip address to assign
* @param prefix prefix length to install IP with, -1 for auto
- * @param iface_ip IP of an interface to attach virtual IP
+ * @param iface interface to install virtual IP on
* @return SUCCESS if operation completed
*/
status_t (*add_ip) (kernel_interface_t *this, host_t *virtual_ip, int prefix,
- host_t *iface_ip);
+ char *iface);
/**
* Remove a virtual IP from an interface.
* Virtual IPs are attached to an interface. If an IP is added multiple
* times, the IP is refcounted and not removed until del_ip() was called
* as many times as add_ip().
- * The virtual IP is attached to the interface where the iface_ip is found.
*
* @param virtual_ip virtual ip address to assign
* @param prefix prefix length to install with IP address, -1 for auto
- * @param iface_ip IP of an interface to attach virtual IP
+ * @param iface interface to install virtual IP on
* @return SUCCESS if operation completed
*/
status_t (*add_ip) (kernel_net_t *this, host_t *virtual_ip, int prefix,
- host_t *iface_ip);
+ char *iface);
/**
* Remove a virtual IP from an interface.
METHOD(kernel_net_t, add_ip, status_t,
private_kernel_netlink_net_t *this, host_t *virtual_ip, int prefix,
- host_t *iface_ip)
+ char *iface_name)
{
addr_map_entry_t *entry, lookup = {
.ip = virtual_ip,
this->ifaces->find_first(this->ifaces, (void*)iface_entry_by_name,
(void**)&iface, this->install_virtual_ip_on) != SUCCESS)
{
- lookup.ip = iface_ip;
- entry = this->addrs->get_match(this->addrs, &lookup,
- (void*)addr_map_entry_match);
- if (!entry)
+ if (this->ifaces->find_first(this->ifaces, (void*)iface_entry_by_name,
+ (void**)&iface, iface_name) != SUCCESS)
{ /* if we don't find the requested interface we just use the first */
this->ifaces->get_first(this->ifaces, (void**)&iface);
}
- else
- {
- iface = entry->iface;
- }
}
if (iface)
{
METHOD(kernel_net_t, add_ip, status_t,
private_kernel_pfroute_net_t *this, host_t *virtual_ip, int prefix,
- host_t *iface_ip)
+ char *iface)
{
return FAILED;
}