Only initiate an exchange from send_dpd() if a task was actually queued
Otherwise, the initiator would prematurely initiate Quick Mode if it has DPD enabled and XAuth is used.
This commit is contained in:
@@ -575,6 +575,7 @@ METHOD(ike_sa_t, send_dpd, status_t,
|
|||||||
{
|
{
|
||||||
job_t *job;
|
job_t *job;
|
||||||
time_t diff, delay;
|
time_t diff, delay;
|
||||||
|
bool task_queued = FALSE;
|
||||||
|
|
||||||
if (this->state == IKE_PASSIVE)
|
if (this->state == IKE_PASSIVE)
|
||||||
{
|
{
|
||||||
@@ -595,9 +596,10 @@ METHOD(ike_sa_t, send_dpd, status_t,
|
|||||||
diff = now - last_in;
|
diff = now - last_in;
|
||||||
if (!delay || diff >= delay)
|
if (!delay || diff >= delay)
|
||||||
{
|
{
|
||||||
/* to long ago, initiate dead peer detection */
|
/* too long ago, initiate dead peer detection */
|
||||||
DBG1(DBG_IKE, "sending DPD request");
|
DBG1(DBG_IKE, "sending DPD request");
|
||||||
this->task_manager->queue_dpd(this->task_manager);
|
this->task_manager->queue_dpd(this->task_manager);
|
||||||
|
task_queued = TRUE;
|
||||||
diff = 0;
|
diff = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -607,7 +609,11 @@ METHOD(ike_sa_t, send_dpd, status_t,
|
|||||||
job = (job_t*)send_dpd_job_create(this->ike_sa_id);
|
job = (job_t*)send_dpd_job_create(this->ike_sa_id);
|
||||||
lib->scheduler->schedule_job(lib->scheduler, job, delay - diff);
|
lib->scheduler->schedule_job(lib->scheduler, job, delay - diff);
|
||||||
}
|
}
|
||||||
return this->task_manager->initiate(this->task_manager);
|
if (task_queued)
|
||||||
|
{
|
||||||
|
return this->task_manager->initiate(this->task_manager);
|
||||||
|
}
|
||||||
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(ike_sa_t, get_state, ike_sa_state_t,
|
METHOD(ike_sa_t, get_state, ike_sa_state_t,
|
||||||
|
|||||||
Reference in New Issue
Block a user