some cleanups
[strongswan.git] / src / charon / sa / task_manager.c
index 2bd10fa..050f651 100644 (file)
@@ -207,6 +207,13 @@ static status_t build_request(private_task_manager_t *this)
        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");
@@ -379,6 +386,7 @@ static status_t process_response(private_task_manager_t *this,
        iterator->destroy(iterator);
        
        this->initiating.mid++;
+       this->initiating.type = EXCHANGE_TYPE_UNDEFINED;
 
        return build_request(this);
 }
@@ -425,6 +433,13 @@ static status_t build_response(private_task_manager_t *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);
@@ -771,6 +786,7 @@ task_manager_t *task_manager_create(ike_sa_t *ike_sa)
        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();