instanciate new tasks only if none queued

This commit is contained in:
Martin Willi
2009-05-07 15:57:34 +02:00
parent a627e31f46
commit 0ce19b27a6
+131 -130
View File
@@ -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 */