From: Tobias Brunner Date: Tue, 9 May 2017 12:32:21 +0000 (+0200) Subject: kernel-netlink: Prefer finding a source IP via next hop over interface X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=refs%2Fheads%2Fkernel-netlink-prefer-gw;p=thirdparty%2Fstrongswan.git kernel-netlink: Prefer finding a source IP via next hop over interface If there are private and public addresses on an interface we should look for other routes that use the listed next hop as the order of the addresses is pretty much random. --- diff --git a/src/libcharon/plugins/kernel_netlink/kernel_netlink_net.c b/src/libcharon/plugins/kernel_netlink/kernel_netlink_net.c index 2dc76d941c..75983e9f86 100644 --- a/src/libcharon/plugins/kernel_netlink/kernel_netlink_net.c +++ b/src/libcharon/plugins/kernel_netlink/kernel_netlink_net.c @@ -2035,22 +2035,6 @@ static host_t *get_route(private_kernel_netlink_net_t *this, host_t *dest, continue; } } - if (route->oif) - { /* no src, but an interface - get address from it */ - route->src_host = get_interface_address(this, route->oif, - msg->rtm_family, dest, candidate); - if (route->src_host) - { /* more of the same */ - if (!candidate || - candidate->ip_equals(candidate, route->src_host)) - { - best = route; - break; - } - best = best ?: route; - continue; - } - } if (route->gtw.ptr) { /* no src, no iface, but a gateway - lookup src to reach gtw */ host_t *gtw; @@ -2073,6 +2057,22 @@ static host_t *get_route(private_kernel_netlink_net_t *this, host_t *dest, best = best ?: route; } } + if (route->oif) + { /* no src, but an interface - get address from it */ + route->src_host = get_interface_address(this, route->oif, + msg->rtm_family, dest, candidate); + if (route->src_host) + { /* more of the same */ + if (!candidate || + candidate->ip_equals(candidate, route->src_host)) + { + best = route; + break; + } + best = best ?: route; + continue; + } + } } enumerator->destroy(enumerator);