From 28683140282493fb6b9dbf825961154d0ff02504 Mon Sep 17 00:00:00 2001 From: Martin Willi Date: Thu, 19 Dec 2013 09:48:43 +0100 Subject: kernel-wfp: Register for WFP Net events --- .../plugins/kernel_wfp/kernel_wfp_ipsec.c | 41 ++++++++++++++++++++++ 1 file changed, 41 insertions(+) (limited to 'src/libcharon/plugins/kernel_wfp/kernel_wfp_ipsec.c') 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; } -- cgit v1.2.3