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,
|
||||
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;
|
||||
host_t *host;
|
||||
@@ -446,18 +447,41 @@ METHOD(kernel_interface_t, get_address_by_ts, status_t,
|
||||
}
|
||||
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))
|
||||
{
|
||||
if (ts->includes(ts, host))
|
||||
{
|
||||
found = TRUE;
|
||||
*ip = host->clone(host);
|
||||
if (vip)
|
||||
{
|
||||
*vip = TRUE;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
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)
|
||||
{
|
||||
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 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
|
||||
*/
|
||||
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.
|
||||
|
||||
Reference in New Issue
Block a user