From: Martin Willi Date: Mon, 21 May 2012 12:17:09 +0000 (+0200) Subject: Flush task queues explicitly, not implicitly if task returns ALREADY_DONE X-Git-Tag: 5.0.0~240 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=7ce504e182c1ce1cde7c80e7dfe2a70b3e5dbed4;p=thirdparty%2Fstrongswan.git Flush task queues explicitly, not implicitly if task returns ALREADY_DONE --- diff --git a/src/libcharon/sa/ikev1/task_manager_v1.c b/src/libcharon/sa/ikev1/task_manager_v1.c index 38fe8ec0ac..b52a7e9232 100644 --- a/src/libcharon/sa/ikev1/task_manager_v1.c +++ b/src/libcharon/sa/ikev1/task_manager_v1.c @@ -346,7 +346,7 @@ METHOD(task_manager_t, initiate, status_t, host_t *me, *other; status_t status; exchange_type_t exchange = EXCHANGE_TYPE_UNDEFINED; - bool new_mid = FALSE, expect_response = FALSE, flushed = FALSE, keep = FALSE; + bool new_mid = FALSE, expect_response = FALSE, cancelled = FALSE, keep = FALSE; if (this->initiating.type != EXCHANGE_TYPE_UNDEFINED && this->initiating.type != INFORMATIONAL_V1) @@ -511,8 +511,7 @@ METHOD(task_manager_t, initiate, status_t, /* processed, but task needs another exchange */ continue; case ALREADY_DONE: - flush_queue(this, TASK_QUEUE_ACTIVE); - flushed = TRUE; + cancelled = TRUE; break; case FAILED: default: @@ -537,7 +536,7 @@ METHOD(task_manager_t, initiate, status_t, { /* tasks completed, no exchange active anymore */ this->initiating.type = EXCHANGE_TYPE_UNDEFINED; } - if (flushed) + if (cancelled) { message->destroy(message); return initiate(this); @@ -600,7 +599,7 @@ static status_t build_response(private_task_manager_t *this, message_t *request) task_t *task; message_t *message; host_t *me, *other; - bool delete = FALSE, flushed = FALSE, expect_request = FALSE; + bool delete = FALSE, cancelled = FALSE, expect_request = FALSE; status_t status; me = request->get_destination(request); @@ -638,8 +637,7 @@ static status_t build_response(private_task_manager_t *this, message_t *request) } continue; case ALREADY_DONE: - flush_queue(this, TASK_QUEUE_PASSIVE); - flushed = TRUE; + cancelled = TRUE; break; case FAILED: default: @@ -656,7 +654,7 @@ static status_t build_response(private_task_manager_t *this, message_t *request) DESTROY_IF(this->responding.packet); this->responding.packet = NULL; - if (flushed) + if (cancelled) { message->destroy(message); return initiate(this); @@ -887,7 +885,6 @@ static status_t process_request(private_task_manager_t *this, continue; case ALREADY_DONE: send_response = FALSE; - flush_queue(this, TASK_QUEUE_PASSIVE); break; case FAILED: default: @@ -960,7 +957,6 @@ static status_t process_response(private_task_manager_t *this, /* processed, but task needs another exchange */ continue; case ALREADY_DONE: - flush_queue(this, TASK_QUEUE_ACTIVE); break; case FAILED: default: diff --git a/src/libcharon/sa/ikev1/tasks/aggressive_mode.c b/src/libcharon/sa/ikev1/tasks/aggressive_mode.c index 9621e70990..4c581cdb6d 100644 --- a/src/libcharon/sa/ikev1/tasks/aggressive_mode.c +++ b/src/libcharon/sa/ikev1/tasks/aggressive_mode.c @@ -174,6 +174,8 @@ static status_t send_notify(private_aggressive_mode_t *this, notify_type_t type) this->ike_sa->queue_task(this->ike_sa, (task_t*)informational_create(this->ike_sa, notify)); /* cancel all active/passive tasks in favour of informational */ + this->ike_sa->flush_queue(this->ike_sa, + this->initiator ? TASK_QUEUE_ACTIVE : TASK_QUEUE_PASSIVE); return ALREADY_DONE; } @@ -185,6 +187,8 @@ static status_t send_delete(private_aggressive_mode_t *this) this->ike_sa->queue_task(this->ike_sa, (task_t*)isakmp_delete_create(this->ike_sa, TRUE)); /* cancel all active tasks in favour of informational */ + this->ike_sa->flush_queue(this->ike_sa, + this->initiator ? TASK_QUEUE_ACTIVE : TASK_QUEUE_PASSIVE); return ALREADY_DONE; } diff --git a/src/libcharon/sa/ikev1/tasks/main_mode.c b/src/libcharon/sa/ikev1/tasks/main_mode.c index 53c38748e3..ff78764da3 100644 --- a/src/libcharon/sa/ikev1/tasks/main_mode.c +++ b/src/libcharon/sa/ikev1/tasks/main_mode.c @@ -186,6 +186,8 @@ static status_t send_notify(private_main_mode_t *this, notify_type_t type) this->ike_sa->queue_task(this->ike_sa, (task_t*)informational_create(this->ike_sa, notify)); /* cancel all active/passive tasks in favour of informational */ + this->ike_sa->flush_queue(this->ike_sa, + this->initiator ? TASK_QUEUE_ACTIVE : TASK_QUEUE_PASSIVE); return ALREADY_DONE; } @@ -197,6 +199,8 @@ static status_t send_delete(private_main_mode_t *this) this->ike_sa->queue_task(this->ike_sa, (task_t*)isakmp_delete_create(this->ike_sa, TRUE)); /* cancel all active tasks in favour of informational */ + this->ike_sa->flush_queue(this->ike_sa, + this->initiator ? TASK_QUEUE_ACTIVE : TASK_QUEUE_PASSIVE); return ALREADY_DONE; } diff --git a/src/libcharon/sa/ikev1/tasks/quick_delete.c b/src/libcharon/sa/ikev1/tasks/quick_delete.c index 6e4194ee2e..db48bc58ec 100644 --- a/src/libcharon/sa/ikev1/tasks/quick_delete.c +++ b/src/libcharon/sa/ikev1/tasks/quick_delete.c @@ -137,6 +137,7 @@ METHOD(task_t, build_i, status_t, return SUCCESS; } + this->ike_sa->flush_queue(this->ike_sa, TASK_QUEUE_ACTIVE); return ALREADY_DONE; } diff --git a/src/libcharon/sa/ikev1/tasks/quick_mode.c b/src/libcharon/sa/ikev1/tasks/quick_mode.c index f98bfa2b61..7c843e85e6 100644 --- a/src/libcharon/sa/ikev1/tasks/quick_mode.c +++ b/src/libcharon/sa/ikev1/tasks/quick_mode.c @@ -605,6 +605,8 @@ static status_t send_notify(private_quick_mode_t *this, notify_type_t type) this->ike_sa->queue_task(this->ike_sa, (task_t*)informational_create(this->ike_sa, notify)); /* cancel all active/passive tasks in favour of informational */ + this->ike_sa->flush_queue(this->ike_sa, + this->initiator ? TASK_QUEUE_ACTIVE : TASK_QUEUE_PASSIVE); return ALREADY_DONE; } @@ -892,6 +894,7 @@ METHOD(task_t, process_r, status_t, } if (!install(this)) { + this->ike_sa->flush_queue(this->ike_sa, TASK_QUEUE_PASSIVE); this->ike_sa->queue_task(this->ike_sa, (task_t*)quick_delete_create(this->ike_sa, this->proposal->get_protocol(this->proposal), diff --git a/src/libcharon/sa/task.h b/src/libcharon/sa/task.h index 8bf9217be2..c37221a775 100644 --- a/src/libcharon/sa/task.h +++ b/src/libcharon/sa/task.h @@ -131,7 +131,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 + * - ALREADY_DONE to cancel task processing * - SUCCESS if task completed */ status_t (*build) (task_t *this, message_t *message); @@ -144,7 +144,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 + * - ALREADY_DONE to cancel task processing * - SUCCESS if task completed */ status_t (*process) (task_t *this, message_t *message);