aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMartin Willi <martin@revosec.ch>2011-12-21 10:53:05 +0100
committerMartin Willi <martin@revosec.ch>2012-03-20 17:31:30 +0100
commitdaee47ba466c96eca5accbb0cac737465915b4f8 (patch)
tree1f6cca8b425371fefb5e817a5966400842a31f19 /src
parent6379c679aedd4e61c01fed2689e60de484616bc4 (diff)
downloadstrongswan-daee47ba466c96eca5accbb0cac737465915b4f8.tar.bz2
strongswan-daee47ba466c96eca5accbb0cac737465915b4f8.tar.xz
Send a delete for every CHILD_SA before deleting IKE_SA
Diffstat (limited to 'src')
-rw-r--r--src/libcharon/sa/ikev1/task_manager_v1.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/src/libcharon/sa/ikev1/task_manager_v1.c b/src/libcharon/sa/ikev1/task_manager_v1.c
index f31f49783..da889be76 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));
}