aboutsummaryrefslogtreecommitdiffstats
path: root/src/charon/kernel
diff options
context:
space:
mode:
authorMartin Willi <martin@strongswan.org>2008-10-08 08:23:46 +0000
committerMartin Willi <martin@strongswan.org>2008-10-08 08:23:46 +0000
commitce5b17082d1f7d03653f068bc81e9f68e8f738e6 (patch)
tree188f3f0ce6d0573c2d5eef02e8cc4c6c3518a764 /src/charon/kernel
parente39b271b1791d852b38632a5e9e36911a1f55883 (diff)
downloadstrongswan-ce5b17082d1f7d03653f068bc81e9f68e8f738e6.tar.bz2
strongswan-ce5b17082d1f7d03653f068bc81e9f68e8f738e6.tar.xz
mobike: try to keep existing source address before switching to another
Diffstat (limited to 'src/charon/kernel')
-rw-r--r--src/charon/kernel/kernel_interface.c7
-rw-r--r--src/charon/kernel/kernel_interface.h6
-rw-r--r--src/charon/kernel/kernel_net.h5
3 files changed, 13 insertions, 5 deletions
diff --git a/src/charon/kernel/kernel_interface.c b/src/charon/kernel/kernel_interface.c
index 4e56a0762..7a0ffa1da 100644
--- a/src/charon/kernel/kernel_interface.c
+++ b/src/charon/kernel/kernel_interface.c
@@ -160,9 +160,10 @@ static status_t del_policy(private_kernel_interface_t *this,
/**
* Implementation of kernel_interface_t.get_source_addr
*/
-static host_t *get_source_addr(private_kernel_interface_t *this, host_t *dest)
+static host_t *get_source_addr(private_kernel_interface_t *this,
+ host_t *dest, host_t *src)
{
- return this->net->get_source_addr(this->net, dest);
+ return this->net->get_source_addr(this->net, dest, src);
}
/**
@@ -329,7 +330,7 @@ kernel_interface_t *kernel_interface_create()
this->public.query_policy = (status_t(*)(kernel_interface_t*,traffic_selector_t*,traffic_selector_t*,policy_dir_t,u_int32_t*))query_policy;
this->public.del_policy = (status_t(*)(kernel_interface_t*,traffic_selector_t*,traffic_selector_t*,policy_dir_t))del_policy;
- this->public.get_source_addr = (host_t*(*)(kernel_interface_t*, host_t *dest))get_source_addr;
+ this->public.get_source_addr = (host_t*(*)(kernel_interface_t*, host_t *dest, host_t *src))get_source_addr;
this->public.get_nexthop = (host_t*(*)(kernel_interface_t*, host_t *dest))get_nexthop;
this->public.get_interface = (char*(*)(kernel_interface_t*,host_t*))get_interface;
this->public.create_address_enumerator = (enumerator_t*(*)(kernel_interface_t*,bool,bool))create_address_enumerator;
diff --git a/src/charon/kernel/kernel_interface.h b/src/charon/kernel/kernel_interface.h
index 49faf7c0c..c87e82526 100644
--- a/src/charon/kernel/kernel_interface.h
+++ b/src/charon/kernel/kernel_interface.h
@@ -235,11 +235,15 @@ struct kernel_interface_t {
*
* Does a route lookup to get the source address used to reach dest.
* The returned host is allocated and must be destroyed.
+ * An optional src address can be used to check if a route is available
+ * for given source to dest.
*
* @param dest target destination address
+ * @param src source address to check, or NULL
* @return outgoing source address, NULL if unreachable
*/
- host_t* (*get_source_addr)(kernel_interface_t *this, host_t *dest);
+ host_t* (*get_source_addr)(kernel_interface_t *this,
+ host_t *dest, host_t *src);
/**
* Get the next hop for a destination.
diff --git a/src/charon/kernel/kernel_net.h b/src/charon/kernel/kernel_net.h
index 998fef0f1..525a9de0f 100644
--- a/src/charon/kernel/kernel_net.h
+++ b/src/charon/kernel/kernel_net.h
@@ -42,11 +42,14 @@ struct kernel_net_t {
*
* Does a route lookup to get the source address used to reach dest.
* The returned host is allocated and must be destroyed.
+ * An optional src address can be used to check if a route is available
+ * for given source to dest.
*
* @param dest target destination address
+ * @param src source address to check, or NULL
* @return outgoing source address, NULL if unreachable
*/
- host_t* (*get_source_addr)(kernel_net_t *this, host_t *dest);
+ host_t* (*get_source_addr)(kernel_net_t *this, host_t *dest, host_t *src);
/**
* Get the next hop for a destination.