diff options
author | Martin Willi <martin@revosec.ch> | 2013-11-07 15:50:46 +0100 |
---|---|---|
committer | Martin Willi <martin@revosec.ch> | 2014-06-04 16:32:06 +0200 |
commit | ebb9362d85a5822c039b29673092267186a79cb9 (patch) | |
tree | 2d7e79c4486d24b87de4fe2093d394832c0d821e /src/libcharon/plugins/kernel_wfp/kernel_wfp_ipsec.c | |
parent | 96ab7a8022341997cdf74459e2864c56be31af55 (diff) | |
download | strongswan-ebb9362d85a5822c039b29673092267186a79cb9.tar.bz2 strongswan-ebb9362d85a5822c039b29673092267186a79cb9.tar.xz |
kernel-wfp: Open and close a WFP engine
Diffstat (limited to 'src/libcharon/plugins/kernel_wfp/kernel_wfp_ipsec.c')
-rw-r--r-- | src/libcharon/plugins/kernel_wfp/kernel_wfp_ipsec.c | 34 |
1 files changed, 33 insertions, 1 deletions
diff --git a/src/libcharon/plugins/kernel_wfp/kernel_wfp_ipsec.c b/src/libcharon/plugins/kernel_wfp/kernel_wfp_ipsec.c index 35bf8cc8a..dd80ea617 100644 --- a/src/libcharon/plugins/kernel_wfp/kernel_wfp_ipsec.c +++ b/src/libcharon/plugins/kernel_wfp/kernel_wfp_ipsec.c @@ -13,6 +13,9 @@ * for more details. */ +/* Windows 7, for some fwpmu.h functionality */ +#define _WIN32_WINNT 0x0601 + #include "kernel_wfp_ipsec.h" #include <daemon.h> @@ -20,6 +23,10 @@ #include <collections/array.h> #include <collections/hashtable.h> +#include <fwpmtypes.h> +#include <fwpmu.h> +#undef interface + typedef struct private_kernel_wfp_ipsec_t private_kernel_wfp_ipsec_t; struct private_kernel_wfp_ipsec_t { @@ -48,6 +55,11 @@ struct private_kernel_wfp_ipsec_t { * Mutex for accessing entries */ mutex_t *mutex; + + /** + * WFP session handle + */ + HANDLE handle; }; /** @@ -485,6 +497,10 @@ METHOD(kernel_ipsec_t, enable_udp_decap, bool, METHOD(kernel_ipsec_t, destroy, void, private_kernel_wfp_ipsec_t *this) { + if (this->handle) + { + FwpmEngineClose0(this->handle); + } this->entries->destroy(this->entries); this->sas->destroy(this->sas); this->mutex->destroy(this->mutex); @@ -497,6 +513,13 @@ METHOD(kernel_ipsec_t, destroy, void, kernel_wfp_ipsec_t *kernel_wfp_ipsec_create() { private_kernel_wfp_ipsec_t *this; + DWORD res; + FWPM_SESSION0 session = { + .displayData = { + .name = L"charon", + .description = L"strongSwan IKE kernel-wfp backend", + }, + }; INIT(this, .public = { @@ -524,5 +547,14 @@ kernel_wfp_ipsec_t *kernel_wfp_ipsec_create() .sas = hashtable_create((void*)hash_sa, (void*)equals_sa, 4), ); + res = FwpmEngineOpen0(NULL, RPC_C_AUTHN_WINNT, NULL, &session, + &this->handle); + if (res != ERROR_SUCCESS) + { + DBG1(DBG_KNL, "opening WFP engine failed: 0x%08x", res); + destroy(this); + return NULL; + } + return &this->public; -}; +} |