aboutsummaryrefslogtreecommitdiffstats
path: root/src/libcharon
diff options
context:
space:
mode:
authorTobias Brunner <tobias@strongswan.org>2010-07-06 16:09:06 +0200
committerTobias Brunner <tobias@strongswan.org>2010-09-02 19:01:23 +0200
commitf7f3d87ed7206f8b5f8cdb2b2de6f3d657ca6426 (patch)
treedfd581b5374659c9e5351ac5638bc7d3002e425f /src/libcharon
parentc560ddeb252fd42cc28d1d2e9c491a70b860ff9e (diff)
downloadstrongswan-f7f3d87ed7206f8b5f8cdb2b2de6f3d657ca6426.tar.bz2
strongswan-f7f3d87ed7206f8b5f8cdb2b2de6f3d657ca6426.tar.xz
All kernel listener hooks are optional.
Diffstat (limited to 'src/libcharon')
-rw-r--r--src/libcharon/kernel/kernel_interface.c14
-rw-r--r--src/libcharon/kernel/kernel_listener.h2
2 files changed, 11 insertions, 5 deletions
diff --git a/src/libcharon/kernel/kernel_interface.c b/src/libcharon/kernel/kernel_interface.c
index 98ec37cde..fffde68ae 100644
--- a/src/libcharon/kernel/kernel_interface.c
+++ b/src/libcharon/kernel/kernel_interface.c
@@ -376,7 +376,8 @@ METHOD(kernel_interface_t, acquire, void,
enumerator = this->listeners->create_enumerator(this->listeners);
while (enumerator->enumerate(enumerator, &listener))
{
- if (!listener->acquire(listener, reqid, src_ts, dst_ts))
+ if (listener->acquire &&
+ !listener->acquire(listener, reqid, src_ts, dst_ts))
{
this->listeners->remove_at(this->listeners, enumerator);
}
@@ -395,7 +396,8 @@ METHOD(kernel_interface_t, expire, void,
enumerator = this->listeners->create_enumerator(this->listeners);
while (enumerator->enumerate(enumerator, &listener))
{
- if (!listener->expire(listener, reqid, protocol, spi, hard))
+ if (listener->expire &&
+ !listener->expire(listener, reqid, protocol, spi, hard))
{
this->listeners->remove_at(this->listeners, enumerator);
}
@@ -414,7 +416,8 @@ METHOD(kernel_interface_t, mapping, void,
enumerator = this->listeners->create_enumerator(this->listeners);
while (enumerator->enumerate(enumerator, &listener))
{
- if (!listener->mapping(listener, reqid, spi, remote))
+ if (listener->mapping &&
+ !listener->mapping(listener, reqid, spi, remote))
{
this->listeners->remove_at(this->listeners, enumerator);
}
@@ -434,7 +437,8 @@ METHOD(kernel_interface_t, migrate, void,
enumerator = this->listeners->create_enumerator(this->listeners);
while (enumerator->enumerate(enumerator, &listener))
{
- if (!listener->migrate(listener, reqid, src_ts, dst_ts, direction,
+ if (listener->migrate &&
+ !listener->migrate(listener, reqid, src_ts, dst_ts, direction,
local, remote))
{
this->listeners->remove_at(this->listeners, enumerator);
@@ -446,7 +450,7 @@ METHOD(kernel_interface_t, migrate, void,
static bool call_roam(kernel_listener_t *listener, bool *roam)
{
- return !listener->roam(listener, *roam);
+ return listener->roam && !listener->roam(listener, *roam);
}
METHOD(kernel_interface_t, roam, void,
diff --git a/src/libcharon/kernel/kernel_listener.h b/src/libcharon/kernel/kernel_listener.h
index e0a911a16..b69bed66f 100644
--- a/src/libcharon/kernel/kernel_listener.h
+++ b/src/libcharon/kernel/kernel_listener.h
@@ -29,6 +29,8 @@ typedef struct kernel_listener_t kernel_listener_t;
/**
* Interface for components interested in kernel events.
+ *
+ * All hooks are optional.
*/
struct kernel_listener_t {