diff options
author | Martin Willi <martin@revosec.ch> | 2011-12-20 19:03:12 +0100 |
---|---|---|
committer | Martin Willi <martin@revosec.ch> | 2012-03-20 17:31:29 +0100 |
commit | 8ed976c061a7093d2d29d0c31a541aee8e9ec448 (patch) | |
tree | ea705c0c1241e9ff0b88002c2d792efb097ad108 /src | |
parent | fd5d6bb08e62a795b3700ac6ec1da6bb0bb1f319 (diff) | |
download | strongswan-8ed976c061a7093d2d29d0c31a541aee8e9ec448.tar.bz2 strongswan-8ed976c061a7093d2d29d0c31a541aee8e9ec448.tar.xz |
Don't requeue IKEv1 init tasks if they already exist in a second keyingtry
Diffstat (limited to 'src')
-rw-r--r-- | src/libcharon/sa/ikev1/task_manager_v1.c | 47 |
1 files changed, 42 insertions, 5 deletions
diff --git a/src/libcharon/sa/ikev1/task_manager_v1.c b/src/libcharon/sa/ikev1/task_manager_v1.c index 37c3f76fb..f31f49783 100644 --- a/src/libcharon/sa/ikev1/task_manager_v1.c +++ b/src/libcharon/sa/ikev1/task_manager_v1.c @@ -1013,14 +1013,51 @@ METHOD(task_manager_t, queue_task, void, this->queued_tasks->insert_last(this->queued_tasks, task); } +/** + * Check if a given task has been queued already + */ +static bool has_queued(private_task_manager_t *this, task_type_t type) +{ + enumerator_t *enumerator; + bool found = FALSE; + task_t *task; + + enumerator = this->queued_tasks->create_enumerator(this->queued_tasks); + while (enumerator->enumerate(enumerator, &task)) + { + if (task->get_type(task) == type) + { + found = TRUE; + break; + } + } + enumerator->destroy(enumerator); + return found; +} + METHOD(task_manager_t, queue_ike, void, private_task_manager_t *this) { - queue_task(this, (task_t*)isakmp_vendor_create(this->ike_sa, TRUE)); - queue_task(this, (task_t*)isakmp_cert_pre_create(this->ike_sa, TRUE)); - queue_task(this, (task_t*)main_mode_create(this->ike_sa, TRUE)); - queue_task(this, (task_t*)isakmp_cert_post_create(this->ike_sa, TRUE)); - queue_task(this, (task_t*)isakmp_natd_create(this->ike_sa, TRUE)); + if (!has_queued(this, TASK_ISAKMP_VENDOR)) + { + queue_task(this, (task_t*)isakmp_vendor_create(this->ike_sa, TRUE)); + } + if (!has_queued(this, TASK_ISAKMP_CERT_PRE)) + { + queue_task(this, (task_t*)isakmp_cert_pre_create(this->ike_sa, TRUE)); + } + if (!has_queued(this, TASK_MAIN_MODE)) + { + queue_task(this, (task_t*)main_mode_create(this->ike_sa, TRUE)); + } + if (!has_queued(this, TASK_ISAKMP_CERT_POST)) + { + queue_task(this, (task_t*)isakmp_cert_post_create(this->ike_sa, TRUE)); + } + if (!has_queued(this, TASK_ISAKMP_NATD)) + { + queue_task(this, (task_t*)isakmp_natd_create(this->ike_sa, TRUE)); + } } METHOD(task_manager_t, queue_ike_rekey, void, |