diff options
author | Martin Willi <martin@revosec.ch> | 2011-12-12 15:16:15 +0100 |
---|---|---|
committer | Martin Willi <martin@revosec.ch> | 2012-03-20 17:31:18 +0100 |
commit | 590ca1d482e2817558e8e4029e203d1cef749eb7 (patch) | |
tree | d3ecaec5942dd4ff0d108e744b36e6f8cb182568 /src | |
parent | 0f61964ed75ded8c40dce8413943f343146bc840 (diff) | |
download | strongswan-590ca1d482e2817558e8e4029e203d1cef749eb7.tar.bz2 strongswan-590ca1d482e2817558e8e4029e203d1cef749eb7.tar.xz |
Allow IKEv1 tasks to return ALREADY_DONE to flush all active or passive tasks
Diffstat (limited to 'src')
-rwxr-xr-x | src/libcharon/sa/task_manager_v1.c | 31 | ||||
-rw-r--r-- | src/libcharon/sa/tasks/task.h | 2 |
2 files changed, 23 insertions, 10 deletions
diff --git a/src/libcharon/sa/task_manager_v1.c b/src/libcharon/sa/task_manager_v1.c index cfa67b079..93c02278e 100755 --- a/src/libcharon/sa/task_manager_v1.c +++ b/src/libcharon/sa/task_manager_v1.c @@ -371,10 +371,13 @@ METHOD(task_manager_t, initiate, status_t, /* task completed, remove it */ this->active_tasks->remove_at(this->active_tasks, enumerator); task->destroy(task); - break; + continue; case NEED_MORE: expect_response = TRUE; /* processed, but task needs another exchange */ + continue; + case ALREADY_DONE: + flush_queue(this, this->active_tasks); break; case FAILED: default: @@ -390,6 +393,7 @@ METHOD(task_manager_t, initiate, status_t, flush(this); return DESTROY_ME; } + break; } enumerator->destroy(enumerator); @@ -464,7 +468,7 @@ static status_t build_response(private_task_manager_t *this, message_t *request) { task->destroy(task); } - break; + continue; case NEED_MORE: /* processed, but task needs another exchange */ if (handle_collisions(this, task)) @@ -472,6 +476,9 @@ static status_t build_response(private_task_manager_t *this, message_t *request) this->passive_tasks->remove_at(this->passive_tasks, enumerator); } + continue; + case ALREADY_DONE: + flush_queue(this, this->passive_tasks); break; case FAILED: default: @@ -482,10 +489,7 @@ static status_t build_response(private_task_manager_t *this, message_t *request) delete = TRUE; break; } - if (delete) - { - break; - } + break; } enumerator->destroy(enumerator); @@ -700,13 +704,15 @@ static status_t process_request(private_task_manager_t *this, /* task completed, remove it */ this->passive_tasks->remove_at(this->passive_tasks, enumerator); task->destroy(task); - break; + continue; case NEED_MORE: /* processed, but task needs at least another call to build() */ send_response = TRUE; + continue; + case ALREADY_DONE: + send_response = FALSE; + flush_queue(this, this->passive_tasks); break; - case FAILED_SEND_ERROR: - send_notify_response(this, NULL, 0, chunk_empty, task); case FAILED: default: charon->bus->ike_updown(charon->bus, this->ike_sa, FALSE); @@ -718,6 +724,7 @@ static status_t process_request(private_task_manager_t *this, task->destroy(task); return DESTROY_ME; } + break; } enumerator->destroy(enumerator); @@ -765,9 +772,12 @@ static status_t process_response(private_task_manager_t *this, /* task completed, remove it */ this->active_tasks->remove_at(this->active_tasks, enumerator); task->destroy(task); - break; + continue; case NEED_MORE: /* processed, but task needs another exchange */ + continue; + case ALREADY_DONE: + flush_queue(this, this->active_tasks); break; case FAILED: default: @@ -780,6 +790,7 @@ static status_t process_response(private_task_manager_t *this, task->destroy(task); return DESTROY_ME; } + break; } enumerator->destroy(enumerator); diff --git a/src/libcharon/sa/tasks/task.h b/src/libcharon/sa/tasks/task.h index d368a6810..7c725944e 100644 --- a/src/libcharon/sa/tasks/task.h +++ b/src/libcharon/sa/tasks/task.h @@ -121,6 +121,7 @@ struct task_t { * - FAILED if a critical error occurred * - DESTROY_ME if IKE_SA has been properly deleted * - NEED_MORE if another call to build/process needed + * - ALREADY_DONE to cancel all active or passive tasks * - SUCCESS if task completed */ status_t (*build) (task_t *this, message_t *message); @@ -133,6 +134,7 @@ struct task_t { * - FAILED if a critical error occurred * - DESTROY_ME if IKE_SA has been properly deleted * - NEED_MORE if another call to build/process needed + * - ALREADY_DONE to cancel all active or passive tasks * - SUCCESS if task completed */ status_t (*process) (task_t *this, message_t *message); |