*/
connection_t *connection;
+ /**
+ * host to connect to, use NULL to use connections one
+ */
+ host_t *other;
+
/**
* associated policy to initiate
*/
this->policy->get_my_id(this->policy),
this->policy->get_other_id(this->policy));
+ if (this->other)
+ {
+ ike_sa->set_other_host(ike_sa, this->other->clone(this->other));
+ }
+
this->connection->get_ref(this->connection);
this->policy->get_ref(this->policy);
if (ike_sa->initiate(ike_sa, this->connection, this->policy) != SUCCESS)
{
this->connection->destroy(this->connection);
this->policy->destroy(this->policy);
+ DESTROY_IF(this->other);
free(this);
}
/*
* Described in header
*/
-initiate_job_t *initiate_job_create(connection_t *connection, policy_t *policy)
+initiate_job_t *initiate_job_create(connection_t *connection, host_t *other,
+ policy_t *policy)
{
private_initiate_job_t *this = malloc_thing(private_initiate_job_t);
/* private variables */
this->connection = connection;
this->policy = policy;
+ this->other = other;
return &this->public;
}
* @brief Creates a job of type INITIATE_IKE_SA.
*
* @param connection connection_t to initialize
+ * @param other another host to initiate to, NULL to use connections one
* @param policy policy to set up
* @return initiate_job_t object
*
* @ingroup jobs
*/
-initiate_job_t *initiate_job_create(connection_t *connection,
- policy_t *policy);
+initiate_job_t *initiate_job_create(connection_t *connection, host_t *other,
+ policy_t *policy);
#endif /*INITIATE_IKE_SA_JOB_H_*/
break;
case DPD_RESTART:
connection->get_ref(connection);
- job = (job_t*)initiate_job_create(connection, policy);
+ job = (job_t*)initiate_job_create(connection, NULL, policy);
charon->job_queue->add(charon->job_queue, job);
break;
default:
ike_sa_init_t *ike_sa_init;
DBG2(DBG_IKE, "initiating new IKE_SA for CHILD_SA");
- DESTROY_IF(this->my_host);
- this->my_host = connection->get_my_host(connection);
- this->my_host = this->my_host->clone(this->my_host);
- DESTROY_IF(this->other_host);
- this->other_host = connection->get_other_host(connection);
- this->other_host = this->other_host->clone(this->other_host);
+ if (this->my_host->is_anyaddr(this->my_host))
+ {
+ this->my_host->destroy(this->my_host);
+ this->my_host = connection->get_my_host(connection);
+ this->my_host = this->my_host->clone(this->my_host);
+ }
+ if (this->other_host->is_anyaddr(this->other_host))
+ {
+ this->other_host->destroy(this->other_host);
+ this->other_host = connection->get_other_host(connection);
+ this->other_host = this->other_host->clone(this->other_host);
+ }
this->retrans_sequences = connection->get_retrans_seq(connection);
this->dpd_delay = connection->get_dpd_delay(connection);
job_t *job;
policy_t *policy;
linked_list_t *my_ts, *other_ts;
+ host_t *other;
+
my_ts = child_sa->get_my_traffic_selectors(child_sa);
other_ts = child_sa->get_other_traffic_selectors(child_sa);
policy = charon->policies->get_policy(charon->policies,
DBG1(DBG_IKE, "policy not found to recreate CHILD_SA, skipped");
continue;
}
-
connection->get_ref(connection);
- job = (job_t*)initiate_job_create(connection, policy);
+ other = this->other_host->clone(this->other_host);
+ job = (job_t*)initiate_job_create(connection, other, policy);
charon->job_queue->add(charon->job_queue, job);
}
iterator->destroy(iterator);