diff options
author | Tobias Brunner <tobias@strongswan.org> | 2012-09-14 16:27:33 +0200 |
---|---|---|
committer | Tobias Brunner <tobias@strongswan.org> | 2012-09-21 18:16:26 +0200 |
commit | 9ba36c0f7f68af814c9805ec8ac11d2f3ae2f5d7 (patch) | |
tree | 2ff3c2a3433ef923620072150a7161c6140a1017 /src/libhydra/plugins/kernel_netlink/kernel_netlink_net.c | |
parent | aed33805ce92a1d075971734357a111637488a2a (diff) | |
download | strongswan-9ba36c0f7f68af814c9805ec8ac11d2f3ae2f5d7.tar.bz2 strongswan-9ba36c0f7f68af814c9805ec8ac11d2f3ae2f5d7.tar.xz |
Make it easy to check if an address is locally usable via changed get_interface() method
Diffstat (limited to 'src/libhydra/plugins/kernel_netlink/kernel_netlink_net.c')
-rw-r--r-- | src/libhydra/plugins/kernel_netlink/kernel_netlink_net.c | 38 |
1 files changed, 21 insertions, 17 deletions
diff --git a/src/libhydra/plugins/kernel_netlink/kernel_netlink_net.c b/src/libhydra/plugins/kernel_netlink/kernel_netlink_net.c index 52671a205..b4eabb2e9 100644 --- a/src/libhydra/plugins/kernel_netlink/kernel_netlink_net.c +++ b/src/libhydra/plugins/kernel_netlink/kernel_netlink_net.c @@ -365,13 +365,15 @@ static job_requeue_t reinstall_routes(private_kernel_netlink_net_t *this) change = this->net_changes->get(this->net_changes, &lookup); if (!change) { /* in case src_ip is not on the outgoing interface */ - lookup.if_name = this->public.interface.get_interface( - &this->public.interface, route->src_ip); - if (lookup.if_name && !streq(lookup.if_name, route->if_name)) + if (this->public.interface.get_interface(&this->public.interface, + route->src_ip, &lookup.if_name)) { - change = this->net_changes->get(this->net_changes, &lookup); + if (!streq(lookup.if_name, route->if_name)) + { + change = this->net_changes->get(this->net_changes, &lookup); + } + free(lookup.if_name); } - free(lookup.if_name); } if (change) { @@ -999,15 +1001,13 @@ METHOD(kernel_net_t, create_address_enumerator, enumerator_t*, (void*)address_enumerator_destroy); } -METHOD(kernel_net_t, get_interface_name, char*, - private_kernel_netlink_net_t *this, host_t* ip) +METHOD(kernel_net_t, get_interface_name, bool, + private_kernel_netlink_net_t *this, host_t* ip, char **name) { enumerator_t *ifaces, *addrs; iface_entry_t *iface; addr_entry_t *addr; - char *name = NULL; - - DBG2(DBG_KNL, "getting interface name for %H", ip); + bool found = FALSE; this->mutex->lock(this->mutex); ifaces = this->ifaces->create_enumerator(this->ifaces); @@ -1018,12 +1018,16 @@ METHOD(kernel_net_t, get_interface_name, char*, { if (ip->ip_equals(ip, addr->ip)) { - name = strdup(iface->ifname); + found = TRUE; + if (name) + { + *name = strdup(iface->ifname); + } break; } } addrs->destroy(addrs); - if (name) + if (found) { break; } @@ -1031,15 +1035,15 @@ METHOD(kernel_net_t, get_interface_name, char*, ifaces->destroy(ifaces); this->mutex->unlock(this->mutex); - if (name) + if (!found) { - DBG2(DBG_KNL, "%H is on interface %s", ip, name); + DBG2(DBG_KNL, "%H is not a local address", ip); } - else + else if (name) { - DBG2(DBG_KNL, "%H is not a local address", ip); + DBG2(DBG_KNL, "%H is on interface %s", ip, *name); } - return name; + return found; } /** |