kernel-interface: get_address_by_ts() can tell if a returned IP is virtual
This commit is contained in:
@@ -415,7 +415,8 @@ METHOD(kernel_interface_t, all_interfaces_usable, bool,
|
|||||||
}
|
}
|
||||||
|
|
||||||
METHOD(kernel_interface_t, get_address_by_ts, status_t,
|
METHOD(kernel_interface_t, get_address_by_ts, status_t,
|
||||||
private_kernel_interface_t *this, traffic_selector_t *ts, host_t **ip)
|
private_kernel_interface_t *this, traffic_selector_t *ts,
|
||||||
|
host_t **ip, bool *vip)
|
||||||
{
|
{
|
||||||
enumerator_t *addrs;
|
enumerator_t *addrs;
|
||||||
host_t *host;
|
host_t *host;
|
||||||
@@ -446,18 +447,41 @@ METHOD(kernel_interface_t, get_address_by_ts, status_t,
|
|||||||
}
|
}
|
||||||
host->destroy(host);
|
host->destroy(host);
|
||||||
|
|
||||||
addrs = create_address_enumerator(this, ADDR_TYPE_ALL);
|
addrs = create_address_enumerator(this, ADDR_TYPE_VIRTUAL);
|
||||||
while (addrs->enumerate(addrs, (void**)&host))
|
while (addrs->enumerate(addrs, (void**)&host))
|
||||||
{
|
{
|
||||||
if (ts->includes(ts, host))
|
if (ts->includes(ts, host))
|
||||||
{
|
{
|
||||||
found = TRUE;
|
found = TRUE;
|
||||||
*ip = host->clone(host);
|
*ip = host->clone(host);
|
||||||
|
if (vip)
|
||||||
|
{
|
||||||
|
*vip = TRUE;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
addrs->destroy(addrs);
|
addrs->destroy(addrs);
|
||||||
|
|
||||||
|
if (!found)
|
||||||
|
{
|
||||||
|
addrs = create_address_enumerator(this, ADDR_TYPE_REGULAR);
|
||||||
|
while (addrs->enumerate(addrs, (void**)&host))
|
||||||
|
{
|
||||||
|
if (ts->includes(ts, host))
|
||||||
|
{
|
||||||
|
found = TRUE;
|
||||||
|
*ip = host->clone(host);
|
||||||
|
if (vip)
|
||||||
|
{
|
||||||
|
*vip = FALSE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
addrs->destroy(addrs);
|
||||||
|
}
|
||||||
|
|
||||||
if (!found)
|
if (!found)
|
||||||
{
|
{
|
||||||
DBG2(DBG_KNL, "no local address found in traffic selector %R", ts);
|
DBG2(DBG_KNL, "no local address found in traffic selector %R", ts);
|
||||||
|
|||||||
@@ -451,10 +451,11 @@ struct kernel_interface_t {
|
|||||||
*
|
*
|
||||||
* @param ts traffic selector
|
* @param ts traffic selector
|
||||||
* @param ip returned IP address (has to be destroyed)
|
* @param ip returned IP address (has to be destroyed)
|
||||||
|
* @param vip set to TRUE if returned address is a virtual IP
|
||||||
* @return SUCCESS if address found
|
* @return SUCCESS if address found
|
||||||
*/
|
*/
|
||||||
status_t (*get_address_by_ts)(kernel_interface_t *this,
|
status_t (*get_address_by_ts)(kernel_interface_t *this,
|
||||||
traffic_selector_t *ts, host_t **ip);
|
traffic_selector_t *ts, host_t **ip, bool *vip);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Register an ipsec kernel interface constructor on the manager.
|
* Register an ipsec kernel interface constructor on the manager.
|
||||||
|
|||||||
@@ -2118,7 +2118,7 @@ METHOD(kernel_ipsec_t, add_policy, status_t,
|
|||||||
this->install_routes)
|
this->install_routes)
|
||||||
{
|
{
|
||||||
hydra->kernel_interface->get_address_by_ts(hydra->kernel_interface,
|
hydra->kernel_interface->get_address_by_ts(hydra->kernel_interface,
|
||||||
src_ts, &route->src_ip);
|
src_ts, &route->src_ip, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!route->src_ip)
|
if (!route->src_ip)
|
||||||
|
|||||||
@@ -2102,7 +2102,7 @@ static status_t add_policy_internal(private_kernel_netlink_ipsec_t *this,
|
|||||||
);
|
);
|
||||||
|
|
||||||
if (hydra->kernel_interface->get_address_by_ts(hydra->kernel_interface,
|
if (hydra->kernel_interface->get_address_by_ts(hydra->kernel_interface,
|
||||||
fwd->dst_ts, &route->src_ip) == SUCCESS)
|
fwd->dst_ts, &route->src_ip, NULL) == SUCCESS)
|
||||||
{
|
{
|
||||||
/* get the nexthop to src (src as we are in POLICY_FWD) */
|
/* get the nexthop to src (src as we are in POLICY_FWD) */
|
||||||
route->gateway = hydra->kernel_interface->get_nexthop(
|
route->gateway = hydra->kernel_interface->get_nexthop(
|
||||||
|
|||||||
@@ -1925,7 +1925,7 @@ static bool install_route(private_kernel_pfkey_ipsec_t *this,
|
|||||||
host_t *host, *src, *dst;
|
host_t *host, *src, *dst;
|
||||||
|
|
||||||
if (hydra->kernel_interface->get_address_by_ts(hydra->kernel_interface,
|
if (hydra->kernel_interface->get_address_by_ts(hydra->kernel_interface,
|
||||||
in->dst_ts, &host) != SUCCESS)
|
in->dst_ts, &host, NULL) != SUCCESS)
|
||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user