From: Martin Willi Date: Wed, 21 Dec 2011 09:53:05 +0000 (+0100) Subject: Send a delete for every CHILD_SA before deleting IKE_SA X-Git-Tag: 5.0.0~338^2~9^2~126 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=daee47ba466c96eca5accbb0cac737465915b4f8;p=thirdparty%2Fstrongswan.git Send a delete for every CHILD_SA before deleting IKE_SA --- diff --git a/src/libcharon/sa/ikev1/task_manager_v1.c b/src/libcharon/sa/ikev1/task_manager_v1.c index f31f497836..da889be76b 100644 --- a/src/libcharon/sa/ikev1/task_manager_v1.c +++ b/src/libcharon/sa/ikev1/task_manager_v1.c @@ -349,13 +349,13 @@ METHOD(task_manager_t, initiate, status_t, new_mid = TRUE; break; } - if (activate_task(this, TASK_ISAKMP_DELETE)) + if (activate_task(this, TASK_QUICK_DELETE)) { exchange = INFORMATIONAL_V1; new_mid = TRUE; break; } - if (activate_task(this, TASK_QUICK_DELETE)) + if (activate_task(this, TASK_ISAKMP_DELETE)) { exchange = INFORMATIONAL_V1; new_mid = TRUE; @@ -499,7 +499,7 @@ METHOD(task_manager_t, initiate, status_t, break; } } - return SUCCESS; + return initiate(this); } /** @@ -1075,6 +1075,18 @@ METHOD(task_manager_t, queue_ike_reauth, void, METHOD(task_manager_t, queue_ike_delete, void, private_task_manager_t *this) { + enumerator_t *enumerator; + child_sa_t *child_sa; + + enumerator = this->ike_sa->create_child_sa_enumerator(this->ike_sa); + while (enumerator->enumerate(enumerator, &child_sa)) + { + queue_task(this, (task_t*) + quick_delete_create(this->ike_sa, child_sa->get_protocol(child_sa), + child_sa->get_spi(child_sa, TRUE), FALSE)); + } + enumerator->destroy(enumerator); + queue_task(this, (task_t*)isakmp_delete_create(this->ike_sa, TRUE)); }