aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMartin Willi <martin@revosec.ch>2011-12-20 19:03:12 +0100
committerMartin Willi <martin@revosec.ch>2012-03-20 17:31:29 +0100
commit8ed976c061a7093d2d29d0c31a541aee8e9ec448 (patch)
treeea705c0c1241e9ff0b88002c2d792efb097ad108 /src
parentfd5d6bb08e62a795b3700ac6ec1da6bb0bb1f319 (diff)
downloadstrongswan-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.c47
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,