aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTobias Brunner <tobias@strongswan.org>2016-06-10 17:13:22 +0200
committerTobias Brunner <tobias@strongswan.org>2016-06-10 17:52:26 +0200
commitb52e540f43c8a97ea3343e12a1cc33b6dc3d3fbc (patch)
tree1b19c6494e2142a8faacd3c87c8cb67e67d03fc4
parentb98afc0a37dbb2360e5ffee580cf9f57175f2e5f (diff)
downloadstrongswan-b52e540f43c8a97ea3343e12a1cc33b6dc3d3fbc.tar.bz2
strongswan-b52e540f43c8a97ea3343e12a1cc33b6dc3d3fbc.tar.xz
kernel-pfroute: Return interface to reach destination from get_nexthop()
-rw-r--r--src/libcharon/plugins/kernel_pfroute/kernel_pfroute_net.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/src/libcharon/plugins/kernel_pfroute/kernel_pfroute_net.c b/src/libcharon/plugins/kernel_pfroute/kernel_pfroute_net.c
index b2b6d9758..236e3417f 100644
--- a/src/libcharon/plugins/kernel_pfroute/kernel_pfroute_net.c
+++ b/src/libcharon/plugins/kernel_pfroute/kernel_pfroute_net.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2009-2013 Tobias Brunner
+ * Copyright (C) 2009-2016 Tobias Brunner
* Hochschule fuer Technik Rapperswil
*
* This program is free software; you can redistribute it and/or modify it
@@ -1533,7 +1533,7 @@ METHOD(kernel_net_t, del_route, status_t,
* address.
*/
static host_t *get_route(private_kernel_pfroute_net_t *this, bool nexthop,
- host_t *dest, host_t *src)
+ host_t *dest, host_t *src, char **iface)
{
struct {
struct rt_msghdr hdr;
@@ -1612,6 +1612,15 @@ retry:
host = gtw;
}
}
+ if (type == RTAX_IFP && addr->sa_family == AF_LINK)
+ {
+ struct sockaddr_dl *sdl = (struct sockaddr_dl*)addr;
+ if (iface)
+ {
+ free(*iface);
+ *iface = strndup(sdl->sdl_data, sdl->sdl_nlen);
+ }
+ }
}
else
{
@@ -1680,7 +1689,7 @@ retry:
METHOD(kernel_net_t, get_source_addr, host_t*,
private_kernel_pfroute_net_t *this, host_t *dest, host_t *src)
{
- return get_route(this, FALSE, dest, src);
+ return get_route(this, FALSE, dest, src, NULL);
}
METHOD(kernel_net_t, get_nexthop, host_t*,
@@ -1691,7 +1700,7 @@ METHOD(kernel_net_t, get_nexthop, host_t*,
{
*iface = NULL;
}
- return get_route(this, TRUE, dest, src);
+ return get_route(this, TRUE, dest, src, iface);
}
/**