aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/libcharon/sa/ikev1/task_manager_v1.c21
1 files changed, 20 insertions, 1 deletions
diff --git a/src/libcharon/sa/ikev1/task_manager_v1.c b/src/libcharon/sa/ikev1/task_manager_v1.c
index 007707ed2..11d579991 100644
--- a/src/libcharon/sa/ikev1/task_manager_v1.c
+++ b/src/libcharon/sa/ikev1/task_manager_v1.c
@@ -341,6 +341,24 @@ METHOD(task_manager_t, retransmit, status_t,
return status;
}
+/**
+ * Check if we have to wait for a mode config before starting a quick mode
+ */
+static bool mode_config_expected(private_task_manager_t *this)
+{
+ peer_cfg_t *peer_cfg;
+
+ peer_cfg = this->ike_sa->get_peer_cfg(this->ike_sa);
+ if (peer_cfg && peer_cfg->get_pool(peer_cfg))
+ {
+ if (!this->ike_sa->get_virtual_ip(this->ike_sa, FALSE))
+ {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
METHOD(task_manager_t, initiate, status_t,
private_task_manager_t *this)
{
@@ -407,7 +425,8 @@ METHOD(task_manager_t, initiate, status_t,
new_mid = TRUE;
break;
}
- if (activate_task(this, TASK_QUICK_MODE))
+ if (!mode_config_expected(this) &&
+ activate_task(this, TASK_QUICK_MODE))
{
exchange = QUICK_MODE;
new_mid = TRUE;