aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/charon/processing/jobs/initiate_mediation_job.c24
-rw-r--r--src/charon/sa/ike_sa.c12
2 files changed, 25 insertions, 11 deletions
diff --git a/src/charon/processing/jobs/initiate_mediation_job.c b/src/charon/processing/jobs/initiate_mediation_job.c
index ed247e06e..db9e76e63 100644
--- a/src/charon/processing/jobs/initiate_mediation_job.c
+++ b/src/charon/processing/jobs/initiate_mediation_job.c
@@ -54,6 +54,21 @@ static void destroy(private_initiate_mediation_job_t *this)
}
/**
+ * Callback to handle initiation of mediation connection
+ */
+static bool initiate_callback(private_initiate_mediation_job_t *this,
+ debug_t group, level_t level, ike_sa_t *ike_sa,
+ char *format, va_list args)
+{
+ if (ike_sa && !this->mediation_sa_id)
+ {
+ this->mediation_sa_id = ike_sa->get_id(ike_sa);
+ this->mediation_sa_id = this->mediation_sa_id->clone(this->mediation_sa_id);
+ }
+ return TRUE;
+}
+
+/**
* Implementation of job_t.execute.
*/
static void initiate(private_initiate_mediation_job_t *this)
@@ -96,13 +111,8 @@ static void initiate(private_initiate_mediation_job_t *this)
/* we need an additional reference because initiate consumes one */
mediation_cfg->get_ref(mediation_cfg);
- /* this function call blocks until the connection is up or failed
- * we do not check the status, but NEED_MORE would be returned on success
- * because the registered callback returns FALSE then
- * this->mediation_sa_id is set in the callback */
- charon->controller->initiate(charon->controller, mediation_cfg, NULL,
- controller_cb_empty, this);
- if (!this->mediation_sa_id)
+ if (charon->controller->initiate(charon->controller, mediation_cfg,
+ NULL, (controller_cb_t)initiate_callback, this) != SUCCESS)
{
mediation_cfg->destroy(mediation_cfg);
mediated_cfg->destroy(mediated_cfg);
diff --git a/src/charon/sa/ike_sa.c b/src/charon/sa/ike_sa.c
index 80e42d924..1c5953cd0 100644
--- a/src/charon/sa/ike_sa.c
+++ b/src/charon/sa/ike_sa.c
@@ -1169,10 +1169,14 @@ static status_t initiate_with_reqid(private_ike_sa_t *this, child_cfg_t *child_c
#ifdef ME
if (this->peer_cfg->is_mediation(this->peer_cfg))
- { /* mediation connection is already established, retrigger state change
- * to notify bus listeners */
- DBG1(DBG_IKE, "mediation connection is already up");
- set_state(this, IKE_ESTABLISHED);
+ {
+ if (this->state == IKE_ESTABLISHED)
+ {
+ /* mediation connection is already established, retrigger state change
+ * to notify bus listeners */
+ DBG1(DBG_IKE, "mediation connection is already up");
+ set_state(this, IKE_ESTABLISHED);
+ }
DESTROY_IF(child_cfg);
}
else