diff options
author | Tobias Brunner <tobias@strongswan.org> | 2016-06-10 17:13:22 +0200 |
---|---|---|
committer | Tobias Brunner <tobias@strongswan.org> | 2016-06-10 17:52:26 +0200 |
commit | b52e540f43c8a97ea3343e12a1cc33b6dc3d3fbc (patch) | |
tree | 1b19c6494e2142a8faacd3c87c8cb67e67d03fc4 | |
parent | b98afc0a37dbb2360e5ffee580cf9f57175f2e5f (diff) | |
download | strongswan-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.c | 17 |
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); } /** |