aboutsummaryrefslogtreecommitdiffstats
path: root/src/libcharon
diff options
context:
space:
mode:
authorTobias Brunner <tobias@strongswan.org>2017-03-09 10:59:31 +0100
committerTobias Brunner <tobias@strongswan.org>2017-05-23 18:46:49 +0200
commit2b581b59f069828f26542cc6b5df33482a36e9ac (patch)
tree5f8235431e6f47dfcd7806f50145da2ee0258aa6 /src/libcharon
parentd80055baae6719a28fe1ec872e35086dd3f23870 (diff)
downloadstrongswan-2b581b59f069828f26542cc6b5df33482a36e9ac.tar.bz2
strongswan-2b581b59f069828f26542cc6b5df33482a36e9ac.tar.xz
unit-tests: Migrate cached IPsec SAs to new IKE_SAs during rekeying
Diffstat (limited to 'src/libcharon')
-rw-r--r--src/libcharon/tests/utils/mock_ipsec.c42
1 files changed, 42 insertions, 0 deletions
diff --git a/src/libcharon/tests/utils/mock_ipsec.c b/src/libcharon/tests/utils/mock_ipsec.c
index c11f5c966..68daaac32 100644
--- a/src/libcharon/tests/utils/mock_ipsec.c
+++ b/src/libcharon/tests/utils/mock_ipsec.c
@@ -18,6 +18,7 @@
#include <daemon.h>
#include <collections/hashtable.h>
+#include <collections/array.h>
#include <assert.h>
@@ -34,6 +35,11 @@ struct private_kernel_ipsec_t {
kernel_ipsec_t public;
/**
+ * Rekey listener
+ */
+ listener_t listener;
+
+ /**
* Allocated SPI
*/
refcount_t spi;
@@ -166,6 +172,36 @@ METHOD(kernel_ipsec_t, del_sa, status_t,
return SUCCESS;
}
+METHOD(listener_t, ike_rekey, bool,
+ listener_t *listener, ike_sa_t *old, ike_sa_t *new)
+{
+ enumerator_t *enumerator;
+ array_t *sas = NULL;
+ entry_t *entry;
+
+ enumerator = instance->sas->create_enumerator(instance->sas);
+ while (enumerator->enumerate(enumerator, &entry, NULL))
+ {
+ if (entry->ike_sa == old)
+ {
+ instance->sas->remove_at(instance->sas, enumerator);
+ array_insert_create(&sas, ARRAY_TAIL, entry);
+ }
+ }
+ enumerator->destroy(enumerator);
+ enumerator = array_create_enumerator(sas);
+ while (enumerator->enumerate(enumerator, &entry))
+ {
+ array_remove_at(sas, enumerator);
+ entry->ike_sa = new;
+ entry = instance->sas->put(instance->sas, entry, entry);
+ assert(!entry);
+ }
+ enumerator->destroy(enumerator);
+ array_destroy(sas);
+ return TRUE;
+}
+
METHOD(kernel_ipsec_t, add_policy, status_t,
private_kernel_ipsec_t *this, kernel_ipsec_policy_id_t *id,
kernel_ipsec_manage_policy_t *data)
@@ -191,6 +227,7 @@ METHOD(kernel_ipsec_t, del_policy, status_t,
METHOD(kernel_ipsec_t, destroy, void,
private_kernel_ipsec_t *this)
{
+ charon->bus->remove_listener(charon->bus, &this->listener);
this->sas->destroy(this->sas);
free(this);
}
@@ -219,11 +256,16 @@ kernel_ipsec_t *mock_ipsec_create()
.enable_udp_decap = (void*)return_true,
.destroy = _destroy,
},
+ .listener = {
+ .ike_rekey = _ike_rekey,
+ },
.sas = hashtable_create(entry_hash, entry_equals, 8),
);
instance = this;
+ charon->bus->add_listener(charon->bus, &this->listener);
+
return &this->public;
}