child-sa: Add method to remove the outbound SA and policies
This commit is contained in:
@@ -1317,6 +1317,64 @@ METHOD(child_sa_t, install_outbound, status_t,
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
METHOD(child_sa_t, remove_outbound, void,
|
||||||
|
private_child_sa_t *this)
|
||||||
|
{
|
||||||
|
enumerator_t *enumerator;
|
||||||
|
traffic_selector_t *my_ts, *other_ts;
|
||||||
|
|
||||||
|
switch (this->outbound_state)
|
||||||
|
{
|
||||||
|
case OUTBOUND_INSTALLED:
|
||||||
|
break;
|
||||||
|
case OUTBOUND_REGISTERED:
|
||||||
|
chunk_clear(&this->encr_r);
|
||||||
|
chunk_clear(&this->integ_r);
|
||||||
|
this->outbound_state = OUTBOUND_NONE;
|
||||||
|
/* fall-through */
|
||||||
|
case OUTBOUND_NONE:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!this->config->has_option(this->config, OPT_NO_POLICIES))
|
||||||
|
{
|
||||||
|
ipsec_sa_cfg_t my_sa, other_sa;
|
||||||
|
uint32_t manual_prio;
|
||||||
|
|
||||||
|
prepare_sa_cfg(this, &my_sa, &other_sa);
|
||||||
|
manual_prio = this->config->get_manual_prio(this->config);
|
||||||
|
|
||||||
|
enumerator = create_policy_enumerator(this);
|
||||||
|
while (enumerator->enumerate(enumerator, &my_ts, &other_ts))
|
||||||
|
{
|
||||||
|
del_policies_outbound(this, this->my_addr, this->other_addr,
|
||||||
|
my_ts, other_ts, &my_sa, &other_sa,
|
||||||
|
POLICY_IPSEC, POLICY_PRIORITY_DEFAULT,
|
||||||
|
manual_prio);
|
||||||
|
if (manual_prio == 0 && require_policy_update())
|
||||||
|
{
|
||||||
|
del_policies_outbound(this, this->my_addr, this->other_addr,
|
||||||
|
my_ts, other_ts, &my_sa, &other_sa,
|
||||||
|
POLICY_DROP, POLICY_PRIORITY_FALLBACK, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
enumerator->destroy(enumerator);
|
||||||
|
}
|
||||||
|
|
||||||
|
kernel_ipsec_sa_id_t id = {
|
||||||
|
.src = this->my_addr,
|
||||||
|
.dst = this->other_addr,
|
||||||
|
.spi = this->other_spi,
|
||||||
|
.proto = proto_ike2ip(this->protocol),
|
||||||
|
.mark = this->mark_out,
|
||||||
|
};
|
||||||
|
kernel_ipsec_del_sa_t sa = {
|
||||||
|
.cpi = this->other_cpi,
|
||||||
|
};
|
||||||
|
charon->kernel->del_sa(charon->kernel, &id, &sa);
|
||||||
|
this->outbound_state = OUTBOUND_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
METHOD(child_sa_t, set_rekey_spi, void,
|
METHOD(child_sa_t, set_rekey_spi, void,
|
||||||
private_child_sa_t *this, uint32_t spi)
|
private_child_sa_t *this, uint32_t spi)
|
||||||
{
|
{
|
||||||
@@ -1519,19 +1577,28 @@ METHOD(child_sa_t, destroy, void,
|
|||||||
{
|
{
|
||||||
ipsec_sa_cfg_t my_sa, other_sa;
|
ipsec_sa_cfg_t my_sa, other_sa;
|
||||||
uint32_t manual_prio;
|
uint32_t manual_prio;
|
||||||
|
bool del_outbound;
|
||||||
|
|
||||||
prepare_sa_cfg(this, &my_sa, &other_sa);
|
prepare_sa_cfg(this, &my_sa, &other_sa);
|
||||||
manual_prio = this->config->get_manual_prio(this->config);
|
manual_prio = this->config->get_manual_prio(this->config);
|
||||||
|
del_outbound = this->trap || this->outbound_state == OUTBOUND_INSTALLED;
|
||||||
|
|
||||||
/* delete all policies in the kernel */
|
/* delete all policies in the kernel */
|
||||||
enumerator = create_policy_enumerator(this);
|
enumerator = create_policy_enumerator(this);
|
||||||
while (enumerator->enumerate(enumerator, &my_ts, &other_ts))
|
while (enumerator->enumerate(enumerator, &my_ts, &other_ts))
|
||||||
{
|
{
|
||||||
del_policies_internal(this, this->my_addr, this->other_addr,
|
if (del_outbound)
|
||||||
my_ts, other_ts, &my_sa, &other_sa,
|
{
|
||||||
POLICY_IPSEC, priority, manual_prio);
|
del_policies_outbound(this, this->my_addr,
|
||||||
if (priority == POLICY_PRIORITY_DEFAULT && manual_prio == 0 &&
|
this->other_addr, my_ts, other_ts,
|
||||||
require_policy_update())
|
&my_sa, &other_sa, POLICY_IPSEC,
|
||||||
|
priority, manual_prio);
|
||||||
|
}
|
||||||
|
del_policies_inbound(this, this->my_addr, this->other_addr,
|
||||||
|
my_ts, other_ts, &my_sa, &other_sa,
|
||||||
|
POLICY_IPSEC, priority, manual_prio);
|
||||||
|
if (!this->trap && manual_prio == 0 && require_policy_update() &&
|
||||||
|
del_outbound)
|
||||||
{
|
{
|
||||||
del_policies_outbound(this, this->my_addr, this->other_addr,
|
del_policies_outbound(this, this->my_addr, this->other_addr,
|
||||||
my_ts, other_ts, &my_sa, &other_sa,
|
my_ts, other_ts, &my_sa, &other_sa,
|
||||||
@@ -1668,6 +1735,7 @@ child_sa_t * child_sa_create(host_t *me, host_t* other,
|
|||||||
.install = _install,
|
.install = _install,
|
||||||
.register_outbound = _register_outbound,
|
.register_outbound = _register_outbound,
|
||||||
.install_outbound = _install_outbound,
|
.install_outbound = _install_outbound,
|
||||||
|
.remove_outbound = _remove_outbound,
|
||||||
.set_rekey_spi = _set_rekey_spi,
|
.set_rekey_spi = _set_rekey_spi,
|
||||||
.get_rekey_spi = _get_rekey_spi,
|
.get_rekey_spi = _get_rekey_spi,
|
||||||
.update = _update,
|
.update = _update,
|
||||||
|
|||||||
@@ -390,6 +390,11 @@ struct child_sa_t {
|
|||||||
*/
|
*/
|
||||||
status_t (*install_outbound)(child_sa_t *this);
|
status_t (*install_outbound)(child_sa_t *this);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove the outbound SA and the outbound policies after a rekeying.
|
||||||
|
*/
|
||||||
|
void (*remove_outbound)(child_sa_t *this);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Configure the policies using some traffic selectors.
|
* Configure the policies using some traffic selectors.
|
||||||
*
|
*
|
||||||
|
|||||||
Reference in New Issue
Block a user