prevent from initiating multiple exchanges the same time
authorMartin Willi <martin@strongswan.org>
Tue, 6 Mar 2007 22:17:53 +0000 (22:17 -0000)
committerMartin Willi <martin@strongswan.org>
Tue, 6 Mar 2007 22:17:53 +0000 (22:17 -0000)
src/charon/sa/task_manager.c

index d326681..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);
 }
@@ -778,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();