X-Git-Url: https://git.strongswan.org/?p=strongswan.git;a=blobdiff_plain;f=src%2Flibcharon%2Fsa%2Ftask_manager_v1.c;h=e899b0687c1700274643ff6fd14584d9c40a06aa;hp=c012295641903138a258c66270f19f082792764b;hb=156b8662a64a4e251470de1e42213bc66f8e772e;hpb=69adeb5bf25b9938a0aff34718ece9d2be4f32ef;ds=sidebyside diff --git a/src/libcharon/sa/task_manager_v1.c b/src/libcharon/sa/task_manager_v1.c index c012295..e899b06 100755 --- a/src/libcharon/sa/task_manager_v1.c +++ b/src/libcharon/sa/task_manager_v1.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -287,6 +288,12 @@ METHOD(task_manager_t, initiate, status_t, } break; case IKE_ESTABLISHED: + if (activate_task(this, TASK_MODE_CONFIG)) + { + exchange = TRANSACTION; + new_mid = TRUE; + break; + } if (activate_task(this, TASK_QUICK_MODE)) { exchange = QUICK_MODE; @@ -400,15 +407,11 @@ METHOD(task_manager_t, initiate, status_t, { return retransmit(this, this->initiating.seqnr); } - else - { - charon->sender->send(charon->sender, - this->initiating.packet->clone(this->initiating.packet)); - - this->initiating.packet->destroy(this->initiating.packet); - this->initiating.packet = NULL; - return SUCCESS; - } + charon->sender->send(charon->sender, + this->initiating.packet->clone(this->initiating.packet)); + this->initiating.packet->destroy(this->initiating.packet); + this->initiating.packet = NULL; + return SUCCESS; } /** @@ -592,6 +595,12 @@ static status_t process_request(private_task_manager_t *this, /* TODO-IKEv1: agressive mode */ return FAILED; case QUICK_MODE: + if (this->ike_sa->get_state(this->ike_sa) != IKE_ESTABLISHED) + { + DBG1(DBG_IKE, "received quick mode request for " + "unestablished IKE_SA, ignored"); + return FAILED; + } task = (task_t *)quick_mode_create(this->ike_sa, NULL, NULL, NULL); this->passive_tasks->insert_last(this->passive_tasks, task); @@ -648,7 +657,14 @@ static status_t process_request(private_task_manager_t *this, enumerator->destroy(enumerator); break; case TRANSACTION: - task = (task_t *)xauth_create(this->ike_sa, FALSE); + if (this->ike_sa->get_state(this->ike_sa) == IKE_ESTABLISHED) + { + task = (task_t *)mode_config_create(this->ike_sa, FALSE); + } + else + { + task = (task_t *)xauth_create(this->ike_sa, FALSE); + } this->passive_tasks->insert_last(this->passive_tasks, task); break; default: