diff options
author | Tobias Brunner <tobias@strongswan.org> | 2013-06-16 11:40:16 +0200 |
---|---|---|
committer | Tobias Brunner <tobias@strongswan.org> | 2013-06-21 17:03:21 +0200 |
commit | d6c17e96b26e74d6cdb2dfa9355f2acf830811f3 (patch) | |
tree | 204256bd1a0a0ce5523dddaa4cea31b20a2c61cb /src | |
parent | f58f8bf4097a2e30ebf4a70c762824577ea8d11f (diff) | |
download | strongswan-d6c17e96b26e74d6cdb2dfa9355f2acf830811f3.tar.bz2 strongswan-d6c17e96b26e74d6cdb2dfa9355f2acf830811f3.tar.xz |
kernel-pfroute: Implement get_source_addr()
Diffstat (limited to 'src')
-rw-r--r-- | src/libhydra/plugins/kernel_pfroute/kernel_pfroute_net.c | 39 |
1 files changed, 27 insertions, 12 deletions
diff --git a/src/libhydra/plugins/kernel_pfroute/kernel_pfroute_net.c b/src/libhydra/plugins/kernel_pfroute/kernel_pfroute_net.c index 540bce5d1..e7e6da3d2 100644 --- a/src/libhydra/plugins/kernel_pfroute/kernel_pfroute_net.c +++ b/src/libhydra/plugins/kernel_pfroute/kernel_pfroute_net.c @@ -812,12 +812,6 @@ METHOD(kernel_net_t, get_interface_name, bool, return FALSE; } -METHOD(kernel_net_t, get_source_addr, host_t*, - private_kernel_pfroute_net_t *this, host_t *dest, host_t *src) -{ - return NULL; -} - METHOD(kernel_net_t, add_ip, status_t, private_kernel_pfroute_net_t *this, host_t *vip, int prefix, char *ifname) @@ -1092,8 +1086,12 @@ METHOD(kernel_net_t, del_route, status_t, return manage_route(this, RTM_DELETE, dst_net, prefixlen, gateway, if_name); } -METHOD(kernel_net_t, get_nexthop, host_t*, - private_kernel_pfroute_net_t *this, host_t *dest, host_t *src) +/** + * Do a route lookup for dest and return either the nexthop or the source + * address. + */ +static host_t *get_route(private_kernel_pfroute_net_t *this, bool nexthop, + host_t *dest, host_t *src) { struct { struct rt_msghdr hdr; @@ -1106,7 +1104,7 @@ METHOD(kernel_net_t, get_nexthop, host_t*, .rtm_seq = ++this->seq, }, }; - host_t *hop = NULL; + host_t *host = NULL; enumerator_t *enumerator; struct sockaddr *addr; int type; @@ -1150,9 +1148,14 @@ METHOD(kernel_net_t, get_nexthop, host_t*, sizeof(*this->reply)); while (enumerator->enumerate(enumerator, &type, &addr)) { - if (type == RTAX_GATEWAY) + if (nexthop && type == RTAX_GATEWAY) { - hop = host_create_from_sockaddr(addr); + host = host_create_from_sockaddr(addr); + break; + } + if (!nexthop && type == RTAX_IFA) + { + host = host_create_from_sockaddr(addr); break; } } @@ -1169,7 +1172,19 @@ METHOD(kernel_net_t, get_nexthop, host_t*, this->condvar->signal(this->condvar); this->mutex->unlock(this->mutex); - return hop; + return host; +} + +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); +} + +METHOD(kernel_net_t, get_nexthop, host_t*, + private_kernel_pfroute_net_t *this, host_t *dest, host_t *src) +{ + return get_route(this, TRUE, dest, src); } /** |