aboutsummaryrefslogtreecommitdiffstats
path: root/src/libcharon/plugins/kernel_wfp/kernel_wfp_ipsec.c
diff options
context:
space:
mode:
authorMartin Willi <martin@revosec.ch>2013-12-19 09:48:43 +0100
committerMartin Willi <martin@revosec.ch>2014-06-04 16:32:09 +0200
commit28683140282493fb6b9dbf825961154d0ff02504 (patch)
tree29ca383d8a18f61ccca6aa156ac2a989651852e7 /src/libcharon/plugins/kernel_wfp/kernel_wfp_ipsec.c
parent6aaa432741c6675493c7a07bc5e9c5ea69eaf21e (diff)
downloadstrongswan-28683140282493fb6b9dbf825961154d0ff02504.tar.bz2
strongswan-28683140282493fb6b9dbf825961154d0ff02504.tar.xz
kernel-wfp: Register for WFP Net events
Diffstat (limited to 'src/libcharon/plugins/kernel_wfp/kernel_wfp_ipsec.c')
-rw-r--r--src/libcharon/plugins/kernel_wfp/kernel_wfp_ipsec.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/src/libcharon/plugins/kernel_wfp/kernel_wfp_ipsec.c b/src/libcharon/plugins/kernel_wfp/kernel_wfp_ipsec.c
index a658fd150..da5e3cea9 100644
--- a/src/libcharon/plugins/kernel_wfp/kernel_wfp_ipsec.c
+++ b/src/libcharon/plugins/kernel_wfp/kernel_wfp_ipsec.c
@@ -80,6 +80,11 @@ struct private_kernel_wfp_ipsec_t {
* Provider charon registers as
*/
FWPM_PROVIDER0 provider;
+
+ /**
+ * Event handle
+ */
+ HANDLE event;
};
/**
@@ -1262,6 +1267,32 @@ static bool install(private_kernel_wfp_ipsec_t *this, entry_t *entry)
}
}
+/**
+ * FwpmNetEventSubscribe0() callback
+ */
+static void event_callback(private_kernel_wfp_ipsec_t *this,
+ const FWPM_NET_EVENT1 *event)
+{
+}
+
+/**
+ * Register for net events
+ */
+static bool register_events(private_kernel_wfp_ipsec_t *this)
+{
+ FWPM_NET_EVENT_SUBSCRIPTION0 subscription = {};
+ DWORD res;
+
+ res = FwpmNetEventSubscribe0(this->handle, &subscription,
+ (void*)event_callback, this, &this->event);
+ if (res != ERROR_SUCCESS)
+ {
+ DBG1(DBG_KNL, "registering for WFP events failed: 0x%08x", res);
+ return FALSE;
+ }
+ return TRUE;
+}
+
METHOD(kernel_ipsec_t, get_features, kernel_feature_t,
private_kernel_wfp_ipsec_t *this)
{
@@ -1800,6 +1831,10 @@ METHOD(kernel_ipsec_t, destroy, void,
{
if (this->handle)
{
+ if (this->event)
+ {
+ FwpmNetEventUnsubscribe0(this->handle, this->event);
+ }
FwpmProviderDeleteByKey0(this->handle, &this->provider.providerKey);
FwpmEngineClose0(this->handle);
}
@@ -1883,5 +1918,11 @@ kernel_wfp_ipsec_t *kernel_wfp_ipsec_create()
return NULL;
}
+ if (!register_events(this))
+ {
+ destroy(this);
+ return NULL;
+ }
+
return &this->public;
}