aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorTobias Brunner <tobias@strongswan.org>2013-06-16 11:40:16 +0200
committerTobias Brunner <tobias@strongswan.org>2013-06-21 17:03:21 +0200
commitd6c17e96b26e74d6cdb2dfa9355f2acf830811f3 (patch)
tree204256bd1a0a0ce5523dddaa4cea31b20a2c61cb /src
parentf58f8bf4097a2e30ebf4a70c762824577ea8d11f (diff)
downloadstrongswan-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.c39
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);
}
/**