Flush task queues explicitly, not implicitly if task returns ALREADY_DONE
This commit is contained in:
parent
cbc1a20ffe
commit
7ce504e182
|
@ -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:
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue