diff options
author | Martin Willi <martin@revosec.ch> | 2013-12-12 17:28:51 +0100 |
---|---|---|
committer | Martin Willi <martin@revosec.ch> | 2014-06-04 16:32:08 +0200 |
commit | 0cefd9400734fea388b86d8d2a1075907f96d769 (patch) | |
tree | c7044112009222ae002128b8ff5345f36a20765e /src/libcharon/plugins/kernel_iph/kernel_iph_net.c | |
parent | f9e6200d066f210e7c5a49048f5c7ec5c002ff7a (diff) | |
download | strongswan-0cefd9400734fea388b86d8d2a1075907f96d769.tar.bz2 strongswan-0cefd9400734fea388b86d8d2a1075907f96d769.tar.xz |
kernel-iph: Implement get_source_addr()
Diffstat (limited to 'src/libcharon/plugins/kernel_iph/kernel_iph_net.c')
-rw-r--r-- | src/libcharon/plugins/kernel_iph/kernel_iph_net.c | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/src/libcharon/plugins/kernel_iph/kernel_iph_net.c b/src/libcharon/plugins/kernel_iph/kernel_iph_net.c index 3d7fd7b88..56c458fdb 100644 --- a/src/libcharon/plugins/kernel_iph/kernel_iph_net.c +++ b/src/libcharon/plugins/kernel_iph/kernel_iph_net.c @@ -469,7 +469,29 @@ METHOD(kernel_net_t, create_address_enumerator, enumerator_t*, METHOD(kernel_net_t, get_source_addr, host_t*, private_kernel_iph_net_t *this, host_t *dest, host_t *src) { - return NULL; + MIB_IPFORWARD_ROW2 route; + SOCKADDR_INET best, *sai_dst, *sai_src = NULL; + DWORD res, index = 0; + + res = GetBestInterfaceEx(dest->get_sockaddr(dest), &index); + if (res != NO_ERROR) + { + DBG1(DBG_KNL, "getting interface to %H failed: 0x%08x", dest, res); + return NULL; + } + + sai_dst = (SOCKADDR_INET*)dest->get_sockaddr(dest); + if (src) + { + sai_src = (SOCKADDR_INET*)src->get_sockaddr(src); + } + res = GetBestRoute2(0, index, sai_src, sai_dst, 0, &route, &best); + if (res != NO_ERROR) + { + DBG2(DBG_KNL, "getting src address to %H failed: 0x%08x", dest, res); + return NULL; + } + return host_create_from_sockaddr((struct sockaddr*)&best); } METHOD(kernel_net_t, get_nexthop, host_t*, |