aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMartin Willi <martin@revosec.ch>2012-05-21 14:17:09 +0200
committerMartin Willi <martin@revosec.ch>2012-05-21 14:17:09 +0200
commit7ce504e182c1ce1cde7c80e7dfe2a70b3e5dbed4 (patch)
tree47c862183f50aaeb19340c1fe7130c58c1c9f7bd /src
parentcbc1a20ffe69fae5ae7fc216873c7ee7d737e103 (diff)
downloadstrongswan-7ce504e182c1ce1cde7c80e7dfe2a70b3e5dbed4.tar.bz2
strongswan-7ce504e182c1ce1cde7c80e7dfe2a70b3e5dbed4.tar.xz
Flush task queues explicitly, not implicitly if task returns ALREADY_DONE
Diffstat (limited to 'src')
-rw-r--r--src/libcharon/sa/ikev1/task_manager_v1.c16
-rw-r--r--src/libcharon/sa/ikev1/tasks/aggressive_mode.c4
-rw-r--r--src/libcharon/sa/ikev1/tasks/main_mode.c4
-rw-r--r--src/libcharon/sa/ikev1/tasks/quick_delete.c1
-rw-r--r--src/libcharon/sa/ikev1/tasks/quick_mode.c3
-rw-r--r--src/libcharon/sa/task.h4
6 files changed, 20 insertions, 12 deletions
diff --git a/src/libcharon/sa/ikev1/task_manager_v1.c b/src/libcharon/sa/ikev1/task_manager_v1.c
index 38fe8ec0a..b52a7e923 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 9621e7099..4c581cdb6 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 53c38748e..ff78764da 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 6e4194ee2..db48bc58e 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 f98bfa2b6..7c843e85e 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 8bf9217be..c37221a77 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);