> have experienced a growing number of queued IKE_INIT and IKE_NATD (one > task for every reset of the ike_sa to be precise).
Hm, not obvious to me why this happens, as these tasks should have gone if we received the IKE_SA_INIT response. I'll have to test that. Might be a little overkill, but what about the attached patch? Regards Martin
>From 73d13704e10ff04c0681a2d124fc28d703b6c5f7 Mon Sep 17 00:00:00 2001 From: Martin Willi <[email protected]> Date: Tue, 29 Jun 2010 15:18:12 +0200 Subject: [PATCH] Recreate the required tasks in the next keyingtry only --- src/libcharon/sa/ike_sa.c | 56 ++++++++++++++++++++++++++++++++++++++------ 1 files changed, 48 insertions(+), 8 deletions(-) diff --git a/src/libcharon/sa/ike_sa.c b/src/libcharon/sa/ike_sa.c index 8b44fd9..27462fa 100644 --- a/src/libcharon/sa/ike_sa.c +++ b/src/libcharon/sa/ike_sa.c @@ -1613,6 +1613,53 @@ METHOD(ike_sa_t, reestablish, status_t, return status; } +/** + * Recreate the required IKE_SA_INIT for another keyingtry + */ +static void recreate_init_tasks(private_ike_sa_t *this) +{ + bool has_vendor = FALSE, has_natd = FALSE, has_init = FALSE; + enumerator_t *enumerator; + task_t *task; + + enumerator = this->task_manager->create_task_enumerator( + this->task_manager, TASK_QUEUE_QUEUED); + while (enumerator->enumerate(enumerator, &task)) + { + switch (task->get_type(task)) + { + case IKE_VENDOR: + has_vendor = TRUE; + break; + case IKE_NATD: + has_natd = TRUE; + break; + case IKE_INIT: + has_init = TRUE; + break; + default: + break; + } + } + enumerator->destroy(enumerator); + + if (!has_vendor) + { + task = (task_t*)ike_vendor_create(&this->public, TRUE); + this->task_manager->queue_task(this->task_manager, task); + } + if (!has_natd) + { + task = (task_t*)ike_natd_create(&this->public, TRUE); + this->task_manager->queue_task(this->task_manager, task); + } + if (!has_init) + { + task = (task_t*)ike_init_create(&this->public, TRUE, NULL); + this->task_manager->queue_task(this->task_manager, task); + } +} + METHOD(ike_sa_t, retransmit, status_t, private_ike_sa_t *this, u_int32_t message_id) { @@ -1634,14 +1681,7 @@ METHOD(ike_sa_t, retransmit, status_t, reset(this); if (this->stats[STAT_INBOUND]) { /* IKE_INIT already completed, recreate associated tasks */ - task_t *task; - - task = (task_t*)ike_vendor_create(&this->public, TRUE); - this->task_manager->queue_task(this->task_manager, task); - task = (task_t*)ike_natd_create(&this->public, TRUE); - this->task_manager->queue_task(this->task_manager, task); - task = (task_t*)ike_init_create(&this->public, TRUE, NULL); - this->task_manager->queue_task(this->task_manager, task); + recreate_init_tasks(this); } return this->task_manager->initiate(this->task_manager); } -- 1.7.0.4
_______________________________________________ Dev mailing list [email protected] https://lists.strongswan.org/mailman/listinfo/dev
