From 439637bf1b5e292fdf85e4b358a297ab9b4fa8c6 Mon Sep 17 00:00:00 2001 From: Tobias Brunner Date: Tue, 9 May 2017 14:32:21 +0200 Subject: [PATCH] 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. --- .../kernel_netlink/kernel_netlink_net.c | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) 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); -- 2.47.2