aboutsummaryrefslogtreecommitdiffstats
path: root/src/libhydra/plugins/kernel_netlink/kernel_netlink_ipsec.c
diff options
context:
space:
mode:
authorTobias Brunner <tobias@strongswan.org>2014-06-18 10:10:25 +0200
committerTobias Brunner <tobias@strongswan.org>2014-06-19 14:33:40 +0200
commit88f125f5605e54b38cf8913df79e32ec6bddff10 (patch)
tree9bf8f3840be0986fb8d60c3f25eeb25b519558e2 /src/libhydra/plugins/kernel_netlink/kernel_netlink_ipsec.c
parentde7cb6de65436e24f2a23fb0ff3618e305940107 (diff)
downloadstrongswan-88f125f5605e54b38cf8913df79e32ec6bddff10.tar.bz2
strongswan-88f125f5605e54b38cf8913df79e32ec6bddff10.tar.xz
kernel-netlink: Pass prefix when looking up next hop for shunt policies
Diffstat (limited to 'src/libhydra/plugins/kernel_netlink/kernel_netlink_ipsec.c')
-rw-r--r--src/libhydra/plugins/kernel_netlink/kernel_netlink_ipsec.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/src/libhydra/plugins/kernel_netlink/kernel_netlink_ipsec.c b/src/libhydra/plugins/kernel_netlink/kernel_netlink_ipsec.c
index 314dbaaaf..55c2f344e 100644
--- a/src/libhydra/plugins/kernel_netlink/kernel_netlink_ipsec.c
+++ b/src/libhydra/plugins/kernel_netlink/kernel_netlink_ipsec.c
@@ -2135,9 +2135,20 @@ static status_t add_policy_internal(private_kernel_netlink_ipsec_t *this,
fwd->dst_ts, &route->src_ip, NULL) == SUCCESS)
{
/* get the nexthop to src (src as we are in POLICY_FWD) */
- route->gateway = hydra->kernel_interface->get_nexthop(
+ if (!ipsec->src->is_anyaddr(ipsec->src))
+ {
+ route->gateway = hydra->kernel_interface->get_nexthop(
hydra->kernel_interface, ipsec->src,
-1, ipsec->dst);
+ }
+ else
+ { /* for shunt policies */
+ iface = xfrm2host(policy->sel.family, &policy->sel.saddr, 0);
+ route->gateway = hydra->kernel_interface->get_nexthop(
+ hydra->kernel_interface, iface,
+ policy->sel.prefixlen_s, route->src_ip);
+ iface->destroy(iface);
+ }
route->dst_net = chunk_alloc(policy->sel.family == AF_INET ? 4 : 16);
memcpy(route->dst_net.ptr, &policy->sel.saddr, route->dst_net.len);