instanciate new tasks only if none queued
This commit is contained in:
+131
-130
@@ -655,161 +655,162 @@ static status_t process_request(private_task_manager_t *this,
|
|||||||
notify_payload_t *notify;
|
notify_payload_t *notify;
|
||||||
delete_payload_t *delete;
|
delete_payload_t *delete;
|
||||||
|
|
||||||
/* create tasks depending on request type */
|
if (this->passive_tasks->get_count(this->passive_tasks) == 0)
|
||||||
switch (message->get_exchange_type(message))
|
{ /* create tasks depending on request type, if not already some queued */
|
||||||
{
|
switch (message->get_exchange_type(message))
|
||||||
case IKE_SA_INIT:
|
|
||||||
{
|
{
|
||||||
task = (task_t*)ike_init_create(this->ike_sa, FALSE, NULL);
|
case IKE_SA_INIT:
|
||||||
this->passive_tasks->insert_last(this->passive_tasks, task);
|
{
|
||||||
task = (task_t*)ike_natd_create(this->ike_sa, FALSE);
|
task = (task_t*)ike_init_create(this->ike_sa, FALSE, NULL);
|
||||||
this->passive_tasks->insert_last(this->passive_tasks, task);
|
this->passive_tasks->insert_last(this->passive_tasks, task);
|
||||||
task = (task_t*)ike_cert_pre_create(this->ike_sa, FALSE);
|
task = (task_t*)ike_natd_create(this->ike_sa, FALSE);
|
||||||
this->passive_tasks->insert_last(this->passive_tasks, task);
|
this->passive_tasks->insert_last(this->passive_tasks, task);
|
||||||
|
task = (task_t*)ike_cert_pre_create(this->ike_sa, FALSE);
|
||||||
|
this->passive_tasks->insert_last(this->passive_tasks, task);
|
||||||
#ifdef ME
|
#ifdef ME
|
||||||
task = (task_t*)ike_me_create(this->ike_sa, FALSE);
|
task = (task_t*)ike_me_create(this->ike_sa, FALSE);
|
||||||
this->passive_tasks->insert_last(this->passive_tasks, task);
|
this->passive_tasks->insert_last(this->passive_tasks, task);
|
||||||
#endif /* ME */
|
#endif /* ME */
|
||||||
task = (task_t*)ike_auth_create(this->ike_sa, FALSE);
|
task = (task_t*)ike_auth_create(this->ike_sa, FALSE);
|
||||||
this->passive_tasks->insert_last(this->passive_tasks, task);
|
this->passive_tasks->insert_last(this->passive_tasks, task);
|
||||||
task = (task_t*)ike_cert_post_create(this->ike_sa, FALSE);
|
task = (task_t*)ike_cert_post_create(this->ike_sa, FALSE);
|
||||||
this->passive_tasks->insert_last(this->passive_tasks, task);
|
this->passive_tasks->insert_last(this->passive_tasks, task);
|
||||||
task = (task_t*)ike_config_create(this->ike_sa, FALSE);
|
task = (task_t*)ike_config_create(this->ike_sa, FALSE);
|
||||||
this->passive_tasks->insert_last(this->passive_tasks, task);
|
this->passive_tasks->insert_last(this->passive_tasks, task);
|
||||||
task = (task_t*)child_create_create(this->ike_sa, NULL);
|
task = (task_t*)child_create_create(this->ike_sa, NULL);
|
||||||
this->passive_tasks->insert_last(this->passive_tasks, task);
|
this->passive_tasks->insert_last(this->passive_tasks, task);
|
||||||
task = (task_t*)ike_auth_lifetime_create(this->ike_sa, FALSE);
|
task = (task_t*)ike_auth_lifetime_create(this->ike_sa, FALSE);
|
||||||
this->passive_tasks->insert_last(this->passive_tasks, task);
|
this->passive_tasks->insert_last(this->passive_tasks, task);
|
||||||
task = (task_t*)ike_mobike_create(this->ike_sa, FALSE);
|
task = (task_t*)ike_mobike_create(this->ike_sa, FALSE);
|
||||||
this->passive_tasks->insert_last(this->passive_tasks, task);
|
this->passive_tasks->insert_last(this->passive_tasks, task);
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
case CREATE_CHILD_SA:
|
|
||||||
{ /* FIXME: we should prevent this on mediation connections */
|
|
||||||
bool notify_found = FALSE, ts_found = FALSE;
|
|
||||||
enumerator = message->create_payload_enumerator(message);
|
|
||||||
while (enumerator->enumerate(enumerator, &payload))
|
|
||||||
{
|
|
||||||
switch (payload->get_type(payload))
|
|
||||||
{
|
|
||||||
case NOTIFY:
|
|
||||||
{
|
|
||||||
/* if we find a rekey notify, its CHILD_SA rekeying */
|
|
||||||
notify = (notify_payload_t*)payload;
|
|
||||||
if (notify->get_notify_type(notify) == REKEY_SA &&
|
|
||||||
(notify->get_protocol_id(notify) == PROTO_AH ||
|
|
||||||
notify->get_protocol_id(notify) == PROTO_ESP))
|
|
||||||
{
|
|
||||||
notify_found = TRUE;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case TRAFFIC_SELECTOR_INITIATOR:
|
|
||||||
case TRAFFIC_SELECTOR_RESPONDER:
|
|
||||||
{
|
|
||||||
/* if we don't find a TS, its IKE rekeying */
|
|
||||||
ts_found = TRUE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
enumerator->destroy(enumerator);
|
case CREATE_CHILD_SA:
|
||||||
|
{ /* FIXME: we should prevent this on mediation connections */
|
||||||
if (ts_found)
|
bool notify_found = FALSE, ts_found = FALSE;
|
||||||
{
|
enumerator = message->create_payload_enumerator(message);
|
||||||
if (notify_found)
|
while (enumerator->enumerate(enumerator, &payload))
|
||||||
{
|
{
|
||||||
task = (task_t*)child_rekey_create(this->ike_sa,
|
switch (payload->get_type(payload))
|
||||||
PROTO_NONE, 0);
|
{
|
||||||
|
case NOTIFY:
|
||||||
|
{ /* if we find a rekey notify, its CHILD_SA rekeying */
|
||||||
|
notify = (notify_payload_t*)payload;
|
||||||
|
if (notify->get_notify_type(notify) == REKEY_SA &&
|
||||||
|
(notify->get_protocol_id(notify) == PROTO_AH ||
|
||||||
|
notify->get_protocol_id(notify) == PROTO_ESP))
|
||||||
|
{
|
||||||
|
notify_found = TRUE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case TRAFFIC_SELECTOR_INITIATOR:
|
||||||
|
case TRAFFIC_SELECTOR_RESPONDER:
|
||||||
|
{ /* if we don't find a TS, its IKE rekeying */
|
||||||
|
ts_found = TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
enumerator->destroy(enumerator);
|
||||||
|
|
||||||
|
if (ts_found)
|
||||||
|
{
|
||||||
|
if (notify_found)
|
||||||
|
{
|
||||||
|
task = (task_t*)child_rekey_create(this->ike_sa,
|
||||||
|
PROTO_NONE, 0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
task = (task_t*)child_create_create(this->ike_sa, NULL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
task = (task_t*)child_create_create(this->ike_sa, NULL);
|
task = (task_t*)ike_rekey_create(this->ike_sa, FALSE);
|
||||||
}
|
}
|
||||||
|
this->passive_tasks->insert_last(this->passive_tasks, task);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else
|
case INFORMATIONAL:
|
||||||
{
|
{
|
||||||
task = (task_t*)ike_rekey_create(this->ike_sa, FALSE);
|
enumerator = message->create_payload_enumerator(message);
|
||||||
}
|
while (enumerator->enumerate(enumerator, &payload))
|
||||||
this->passive_tasks->insert_last(this->passive_tasks, task);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case INFORMATIONAL:
|
|
||||||
{
|
|
||||||
enumerator = message->create_payload_enumerator(message);
|
|
||||||
while (enumerator->enumerate(enumerator, &payload))
|
|
||||||
{
|
|
||||||
switch (payload->get_type(payload))
|
|
||||||
{
|
{
|
||||||
case NOTIFY:
|
switch (payload->get_type(payload))
|
||||||
{
|
{
|
||||||
notify = (notify_payload_t*)payload;
|
case NOTIFY:
|
||||||
switch (notify->get_notify_type(notify))
|
|
||||||
{
|
{
|
||||||
case ADDITIONAL_IP4_ADDRESS:
|
notify = (notify_payload_t*)payload;
|
||||||
case ADDITIONAL_IP6_ADDRESS:
|
switch (notify->get_notify_type(notify))
|
||||||
case NO_ADDITIONAL_ADDRESSES:
|
{
|
||||||
case UPDATE_SA_ADDRESSES:
|
case ADDITIONAL_IP4_ADDRESS:
|
||||||
case NO_NATS_ALLOWED:
|
case ADDITIONAL_IP6_ADDRESS:
|
||||||
case UNACCEPTABLE_ADDRESSES:
|
case NO_ADDITIONAL_ADDRESSES:
|
||||||
case UNEXPECTED_NAT_DETECTED:
|
case UPDATE_SA_ADDRESSES:
|
||||||
case COOKIE2:
|
case NO_NATS_ALLOWED:
|
||||||
case NAT_DETECTION_SOURCE_IP:
|
case UNACCEPTABLE_ADDRESSES:
|
||||||
case NAT_DETECTION_DESTINATION_IP:
|
case UNEXPECTED_NAT_DETECTED:
|
||||||
task = (task_t*)ike_mobike_create(
|
case COOKIE2:
|
||||||
this->ike_sa, FALSE);
|
case NAT_DETECTION_SOURCE_IP:
|
||||||
break;
|
case NAT_DETECTION_DESTINATION_IP:
|
||||||
case AUTH_LIFETIME:
|
task = (task_t*)ike_mobike_create(
|
||||||
task = (task_t*)ike_auth_lifetime_create(
|
this->ike_sa, FALSE);
|
||||||
this->ike_sa, FALSE);
|
break;
|
||||||
break;
|
case AUTH_LIFETIME:
|
||||||
default:
|
task = (task_t*)ike_auth_lifetime_create(
|
||||||
break;
|
this->ike_sa, FALSE);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
case DELETE:
|
||||||
}
|
|
||||||
case DELETE:
|
|
||||||
{
|
|
||||||
delete = (delete_payload_t*)payload;
|
|
||||||
if (delete->get_protocol_id(delete) == PROTO_IKE)
|
|
||||||
{
|
{
|
||||||
task = (task_t*)ike_delete_create(this->ike_sa, FALSE);
|
delete = (delete_payload_t*)payload;
|
||||||
}
|
if (delete->get_protocol_id(delete) == PROTO_IKE)
|
||||||
else
|
{
|
||||||
{
|
task = (task_t*)ike_delete_create(this->ike_sa,
|
||||||
task = (task_t*)child_delete_create(this->ike_sa,
|
FALSE);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
task = (task_t*)child_delete_create(this->ike_sa,
|
||||||
PROTO_NONE, 0);
|
PROTO_NONE, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (task)
|
||||||
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
if (task)
|
enumerator->destroy(enumerator);
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
enumerator->destroy(enumerator);
|
|
||||||
|
|
||||||
if (task == NULL)
|
if (task == NULL)
|
||||||
{
|
{
|
||||||
task = (task_t*)ike_dpd_create(FALSE);
|
task = (task_t*)ike_dpd_create(FALSE);
|
||||||
|
}
|
||||||
|
this->passive_tasks->insert_last(this->passive_tasks, task);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
this->passive_tasks->insert_last(this->passive_tasks, task);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#ifdef ME
|
#ifdef ME
|
||||||
case ME_CONNECT:
|
case ME_CONNECT:
|
||||||
{
|
{
|
||||||
task = (task_t*)ike_me_create(this->ike_sa, FALSE);
|
task = (task_t*)ike_me_create(this->ike_sa, FALSE);
|
||||||
this->passive_tasks->insert_last(this->passive_tasks, task);
|
this->passive_tasks->insert_last(this->passive_tasks, task);
|
||||||
}
|
}
|
||||||
#endif /* ME */
|
#endif /* ME */
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* let the tasks process the message */
|
/* let the tasks process the message */
|
||||||
|
|||||||
Reference in New Issue
Block a user