diff options
author | Tobias Brunner <tobias@strongswan.org> | 2014-10-02 12:28:37 +0200 |
---|---|---|
committer | Tobias Brunner <tobias@strongswan.org> | 2014-10-07 13:45:01 +0200 |
commit | d4828f51e080239f3d03cc4d45c36fbffe08bf3f (patch) | |
tree | 517bae54bc1a9f3f99a7bbc7d40bd08516f52a74 /src | |
parent | 89e953797d0c90dc1208b8513b56a0b80b8d3422 (diff) | |
download | strongswan-d4828f51e080239f3d03cc4d45c36fbffe08bf3f.tar.bz2 strongswan-d4828f51e080239f3d03cc4d45c36fbffe08bf3f.tar.xz |
ikev1: Don't queue more than one mode config or XAuth task
At the time we reset an IKE_SA (e.g. when re-authenticating a not yet
established SA due to a roaming event) such tasks might already be queued
by one of the phase 1 tasks. If the SA is initiated again another task will
get queued by the phase 1 task. This results in e.g. multiple mode config
requests, which most gateways will have problems with.
Diffstat (limited to 'src')
-rw-r--r-- | src/libcharon/sa/ikev1/task_manager_v1.c | 29 |
1 files changed, 22 insertions, 7 deletions
diff --git a/src/libcharon/sa/ikev1/task_manager_v1.c b/src/libcharon/sa/ikev1/task_manager_v1.c index 97812a5c5..2dd393b8d 100644 --- a/src/libcharon/sa/ikev1/task_manager_v1.c +++ b/src/libcharon/sa/ikev1/task_manager_v1.c @@ -1593,13 +1593,6 @@ METHOD(task_manager_t, process_message, status_t, return SUCCESS; } -METHOD(task_manager_t, queue_task, void, - private_task_manager_t *this, task_t *task) -{ - DBG2(DBG_IKE, "queueing %N task", task_type_names, task->get_type(task)); - this->queued_tasks->insert_last(this->queued_tasks, task); -} - /** * Check if a given task has been queued already */ @@ -1622,6 +1615,28 @@ static bool has_queued(private_task_manager_t *this, task_type_t type) return found; } +METHOD(task_manager_t, queue_task, void, + private_task_manager_t *this, task_t *task) +{ + task_type_t type = task->get_type(task); + + switch (type) + { + case TASK_MODE_CONFIG: + case TASK_XAUTH: + if (has_queued(this, type)) + { + task->destroy(task); + return; + } + break; + default: + break; + } + DBG2(DBG_IKE, "queueing %N task", task_type_names, task->get_type(task)); + this->queued_tasks->insert_last(this->queued_tasks, task); +} + METHOD(task_manager_t, queue_ike, void, private_task_manager_t *this) { |