status_t status;
exchange_type_t exchange = 0;
+ if (this->initiating.type != EXCHANGE_TYPE_UNDEFINED)
+ {
+ DBG2(DBG_IKE, "delaying task initiation, exchange in progress");
+ /* do not initiate if we already have a message in the air */
+ return SUCCESS;
+ }
+
if (this->active_tasks->get_count(this->active_tasks) == 0)
{
DBG2(DBG_IKE, "activating new tasks");
iterator->destroy(iterator);
this->initiating.mid++;
+ this->initiating.type = EXCHANGE_TYPE_UNDEFINED;
return build_request(this);
}
}
}
iterator->destroy(iterator);
+
+ /* remove resonder SPI if IKE_SA_INIT failed */
+ if (delete && exchange == IKE_SA_INIT)
+ {
+ ike_sa_id_t *id = this->ike_sa->get_id(this->ike_sa);
+ id->set_responder_spi(id, 0);
+ }
/* message complete, send it */
DESTROY_IF(this->responding.packet);
SIG(IKE_UP_FAILED, "establishing IKE_SA failed");
break;
case IKE_DELETE:
- SIG(IKE_DOWN_FAILED, "deleteing IKE_SA properly failed");
+ SIG(IKE_DOWN_FAILED, "deleting IKE_SA properly failed");
break;
case IKE_REKEY:
SIG(IKE_REKEY_FAILED, "rekeying IKE_SA failed");
this->initiating.packet = NULL;
this->responding.mid = 0;
this->initiating.mid = 0;
+ this->initiating.type = EXCHANGE_TYPE_UNDEFINED;
this->queued_tasks = linked_list_create();
this->active_tasks = linked_list_create();
this->passive_tasks = linked_list_create();