ike-rekey: Handle TEMPORARY_FAILURE notify

This commit is contained in:
Tobias Brunner
2016-06-17 18:48:05 +02:00
parent c0976a5e01
commit 8a78e41f29
+22 -8
View File
@@ -69,6 +69,22 @@ struct private_ike_rekey_t {
task_t *collision;
};
/**
* Schedule a retry if rekeying temporary failed
*/
static void schedule_delayed_rekey(private_ike_rekey_t *this)
{
uint32_t retry;
job_t *job;
retry = RETRY_INTERVAL - (random() % RETRY_JITTER);
job = (job_t*)rekey_ike_sa_job_create(
this->ike_sa->get_id(this->ike_sa), FALSE);
DBG1(DBG_IKE, "IKE_SA rekeying failed, trying again in %d seconds", retry);
this->ike_sa->set_state(this->ike_sa, IKE_ESTABLISHED);
lib->scheduler->schedule_job(lib->scheduler, job, retry);
}
/**
* Check if an IKE_SA has any queued tasks, return initiation job
*/
@@ -251,6 +267,11 @@ METHOD(task_t, process_i, status_t,
this->ike_sa->get_id(this->ike_sa), TRUE));
return SUCCESS;
}
if (message->get_notify(message, TEMPORARY_FAILURE))
{
schedule_delayed_rekey(this);
return SUCCESS;
}
switch (this->ike_init->task.process(&this->ike_init->task, message))
{
@@ -260,14 +281,7 @@ METHOD(task_t, process_i, status_t,
this->collision->get_type(this->collision) == TASK_IKE_DELETE ||
this->collision->get_type(this->collision) == TASK_IKE_REAUTH)))
{
job_t *job;
uint32_t retry = RETRY_INTERVAL - (random() % RETRY_JITTER);
job = (job_t*)rekey_ike_sa_job_create(
this->ike_sa->get_id(this->ike_sa), FALSE);
DBG1(DBG_IKE, "IKE_SA rekeying failed, "
"trying again in %d seconds", retry);
this->ike_sa->set_state(this->ike_sa, IKE_ESTABLISHED);
lib->scheduler->schedule_job(lib->scheduler, job, retry);
schedule_delayed_rekey(this);
}
return SUCCESS;
case NEED_MORE: