task->use_reqid(task, child_sa->get_reqid(child_sa));
task->use_marks(task, child_sa->get_mark(child_sa, TRUE).value,
child_sa->get_mark(child_sa, FALSE).value);
+ task->use_if_ids(task, child_sa->get_if_id(child_sa, TRUE),
+ child_sa->get_if_id(child_sa, FALSE));
task->rekey(task, child_sa->get_spi(child_sa, TRUE));
queue_task(this, &task->task);
/*
- * Copyright (C) 2012-2015 Tobias Brunner
+ * Copyright (C) 2012-2019 Tobias Brunner
* HSR Hochschule fuer Technik Rapperswil
*
* Copyright (C) 2011 Martin Willi
/**
* Explicit inbound mark value to use, if any
*/
- u_int mark_in;
+ uint32_t mark_in;
/**
- * Explicit inbound mark value to use, if any
+ * Explicit outbound mark value to use, if any
+ */
+ uint32_t mark_out;
+
+ /**
+ * Explicit inbound interface ID to use, if any
+ */
+ uint32_t if_id_in;
+
+ /**
+ * Explicit outbound interface ID to use, if any
*/
- u_int mark_out;
+ uint32_t if_id_out;
/**
* SPI of SA we rekey
this->ike_sa->get_other_host(this->ike_sa),
this->config, this->reqid, this->udp,
this->mark_in, this->mark_out,
- 0, 0);
+ this->if_id_in, this->if_id_out);
if (this->udp && this->mode == MODE_TRANSPORT)
{
TRUE).value;
this->mark_out = child_sa->get_mark(child_sa,
FALSE).value;
+ this->if_id_in = child_sa->get_if_id(child_sa, TRUE);
+ this->if_id_out = child_sa->get_if_id(child_sa, FALSE);
child_sa->set_state(child_sa, CHILD_REKEYING);
DBG1(DBG_IKE, "detected rekeying of CHILD_SA %s{%u}",
child_sa->get_name(child_sa),
this->ike_sa->get_other_host(this->ike_sa),
this->config, this->reqid, this->udp,
this->mark_in, this->mark_out,
- 0, 0);
+ this->if_id_in, this->if_id_out);
tsi = linked_list_create_with_items(this->tsi, NULL);
tsr = linked_list_create_with_items(this->tsr, NULL);
}
METHOD(quick_mode_t, use_marks, void,
- private_quick_mode_t *this, u_int in, u_int out)
+ private_quick_mode_t *this, uint32_t in, uint32_t out)
{
this->mark_in = in;
this->mark_out = out;
}
+METHOD(quick_mode_t, use_if_ids, void,
+ private_quick_mode_t *this, uint32_t in, uint32_t out)
+{
+ this->if_id_in = in;
+ this->if_id_out = out;
+}
+
METHOD(quick_mode_t, rekey, void,
private_quick_mode_t *this, uint32_t spi)
{
this->spi_r = 0;
this->mark_in = 0;
this->mark_out = 0;
+ this->if_id_in = 0;
+ this->if_id_out = 0;
if (!this->initiator)
{
.get_mid = _get_mid,
.use_reqid = _use_reqid,
.use_marks = _use_marks,
+ .use_if_ids = _use_if_ids,
.rekey = _rekey,
},
.ike_sa = ike_sa,
/*
- * Copyright (C) 2015 Tobias Brunner
+ * Copyright (C) 2015-2019 Tobias Brunner
* HSR Hochschule fuer Technik Rapperswil
*
* Copyright (C) 2011 Martin Willi
* @param in inbound mark value
* @param out outbound mark value
*/
- void (*use_marks)(quick_mode_t *this, u_int in, u_int out);
+ void (*use_marks)(quick_mode_t *this, uint32_t in, uint32_t out);
+
+ /**
+ * Use specific interface IDs, overriding configuration.
+ *
+ * @param in inbound interface ID
+ * @param out outbound interface ID
+ */
+ void (*use_if_ids)(quick_mode_t *this, uint32_t in, uint32_t out);
/**
* Set the SPI of the old SA, if rekeying.
child_create->use_marks(child_create,
child_sa->get_mark(child_sa, TRUE).value,
child_sa->get_mark(child_sa, FALSE).value);
+ /* interface IDs are not migrated as the new CHILD_SAs on old and new
+ * IKE_SA go though regular updown events */
new->queue_task(new, &child_create->task);
children = TRUE;
}
/*
- * Copyright (C) 2008-2018 Tobias Brunner
+ * Copyright (C) 2008-2019 Tobias Brunner
* Copyright (C) 2005-2008 Martin Willi
* Copyright (C) 2005 Jan Hutter
* HSR Hochschule fuer Technik Rapperswil
/**
* Explicit inbound mark value
*/
- u_int mark_in;
+ uint32_t mark_in;
/**
* Explicit outbound mark value
*/
- u_int mark_out;
+ uint32_t mark_out;
+
+ /**
+ * Explicit inbound interface ID to use, if any
+ */
+ uint32_t if_id_in;
+
+ /**
+ * Explicit outbound interface ID to use, if any
+ */
+ uint32_t if_id_out;
/**
* CHILD_SA which gets established
this->child_sa = child_sa_create(this->ike_sa->get_my_host(this->ike_sa),
this->ike_sa->get_other_host(this->ike_sa), this->config, this->reqid,
this->ike_sa->has_condition(this->ike_sa, COND_NAT_ANY),
- this->mark_in, this->mark_out, 0, 0);
+ this->mark_in, this->mark_out, this->if_id_in, this->if_id_out);
if (this->reqid)
{
this->child_sa = child_sa_create(this->ike_sa->get_my_host(this->ike_sa),
this->ike_sa->get_other_host(this->ike_sa), this->config, this->reqid,
this->ike_sa->has_condition(this->ike_sa, COND_NAT_ANY),
- this->mark_in, this->mark_out, 0, 0);
+ this->mark_in, this->mark_out, this->if_id_in, this->if_id_out);
if (this->ipcomp_received != IPCOMP_NONE)
{
}
METHOD(child_create_t, use_marks, void,
- private_child_create_t *this, u_int in, u_int out)
+ private_child_create_t *this, uint32_t in, uint32_t out)
{
this->mark_in = in;
this->mark_out = out;
}
+METHOD(child_create_t, use_if_ids, void,
+ private_child_create_t *this, uint32_t in, uint32_t out)
+{
+ this->if_id_in = in;
+ this->if_id_out = out;
+}
+
METHOD(child_create_t, use_dh_group, void,
private_child_create_t *this, diffie_hellman_group_t dh_group)
{
this->reqid = 0;
this->mark_in = 0;
this->mark_out = 0;
+ this->if_id_in = 0;
+ this->if_id_out = 0;
this->established = FALSE;
}
.get_lower_nonce = _get_lower_nonce,
.use_reqid = _use_reqid,
.use_marks = _use_marks,
+ .use_if_ids = _use_if_ids,
.use_dh_group = _use_dh_group,
.task = {
.get_type = _get_type,
/*
- * Copyright (C) 2018 Tobias Brunner
+ * Copyright (C) 2018-2019 Tobias Brunner
* Copyright (C) 2007 Martin Willi
* HSR Hochschule fuer Technik Rapperswil
*
* @param in inbound mark value
* @param out outbound mark value
*/
- void (*use_marks)(child_create_t *this, u_int in, u_int out);
+ void (*use_marks)(child_create_t *this, uint32_t in, uint32_t out);
+
+ /**
+ * Use specific interface IDs, overriding configuration.
+ *
+ * @param in inbound interface ID
+ * @param out outbound interface ID
+ */
+ void (*use_if_ids)(child_create_t *this, uint32_t in, uint32_t out);
/**
* Initially propose a specific DH group to override configuration.
this->child_create->use_marks(this->child_create,
this->child_sa->get_mark(this->child_sa, TRUE).value,
this->child_sa->get_mark(this->child_sa, FALSE).value);
+ this->child_create->use_if_ids(this->child_create,
+ this->child_sa->get_if_id(this->child_sa, TRUE),
+ this->child_sa->get_if_id(this->child_sa, FALSE));
if (this->child_create->task.build(&this->child_create->task,
message) != NEED_MORE)
this->child_create->use_marks(this->child_create,
this->child_sa->get_mark(this->child_sa, TRUE).value,
this->child_sa->get_mark(this->child_sa, FALSE).value);
+ this->child_create->use_if_ids(this->child_create,
+ this->child_sa->get_if_id(this->child_sa, TRUE),
+ this->child_sa->get_if_id(this->child_sa, FALSE));
config = this->child_sa->get_config(this->child_sa);
this->child_create->set_config(this->child_create, config->get_ref(config));
this->child_create->task.build(&this->child_create->task, message);