diff options
author | Martin Willi <martin@revosec.ch> | 2013-12-19 09:48:43 +0100 |
---|---|---|
committer | Martin Willi <martin@revosec.ch> | 2014-06-04 16:32:09 +0200 |
commit | 28683140282493fb6b9dbf825961154d0ff02504 (patch) | |
tree | 29ca383d8a18f61ccca6aa156ac2a989651852e7 /src/libcharon/plugins/kernel_wfp/kernel_wfp_ipsec.c | |
parent | 6aaa432741c6675493c7a07bc5e9c5ea69eaf21e (diff) | |
download | strongswan-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.c | 41 |
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; } |