ikev2: Insert MOBIKE tasks at the front of the queue
authorTobias Brunner <tobias@strongswan.org>
Tue, 22 Jul 2014 16:51:57 +0000 (18:51 +0200)
committerTobias Brunner <tobias@strongswan.org>
Fri, 12 Sep 2014 08:29:36 +0000 (10:29 +0200)
In case we have no usable path to the other peer there is no point in
initiating any other tasks (like rekeying).

src/libcharon/sa/ikev2/task_manager_v2.c

index ada798b..630c902 100644 (file)
@@ -1246,6 +1246,8 @@ METHOD(task_manager_t, process_message, status_t,
 METHOD(task_manager_t, queue_task, void,
        private_task_manager_t *this, task_t *task)
 {
 METHOD(task_manager_t, queue_task, void,
        private_task_manager_t *this, task_t *task)
 {
+       int pos = ARRAY_TAIL;
+
        if (task->get_type(task) == TASK_IKE_MOBIKE)
        {       /*  there is no need to queue more than one mobike task */
                enumerator_t *enumerator;
        if (task->get_type(task) == TASK_IKE_MOBIKE)
        {       /*  there is no need to queue more than one mobike task */
                enumerator_t *enumerator;
@@ -1262,9 +1264,12 @@ METHOD(task_manager_t, queue_task, void,
                        }
                }
                enumerator->destroy(enumerator);
                        }
                }
                enumerator->destroy(enumerator);
+               /* insert MOBIKE tasks first as we currently might not have a usable
+                * path to initiate any other tasks */
+               pos = ARRAY_HEAD;
        }
        DBG2(DBG_IKE, "queueing %N task", task_type_names, task->get_type(task));
        }
        DBG2(DBG_IKE, "queueing %N task", task_type_names, task->get_type(task));
-       array_insert(this->queued_tasks, ARRAY_TAIL, task);
+       array_insert(this->queued_tasks, pos, task);
 }
 
 /**
 }
 
 /**