Update fallback drop policies if required.
This commit is contained in:
@@ -881,6 +881,7 @@ METHOD(child_sa_t, update, status_t,
|
|||||||
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))
|
||||||
{
|
{
|
||||||
|
traffic_selector_t *old_my_ts = NULL, *old_other_ts = NULL;
|
||||||
/* remove old policies first */
|
/* remove old policies first */
|
||||||
del_policies_internal(this, my_ts, other_ts,
|
del_policies_internal(this, my_ts, other_ts,
|
||||||
POLICY_PRIORITY_DEFAULT);
|
POLICY_PRIORITY_DEFAULT);
|
||||||
@@ -889,11 +890,13 @@ METHOD(child_sa_t, update, status_t,
|
|||||||
if (!me->ip_equals(me, this->my_addr) &&
|
if (!me->ip_equals(me, this->my_addr) &&
|
||||||
my_ts->is_host(my_ts, this->my_addr))
|
my_ts->is_host(my_ts, this->my_addr))
|
||||||
{
|
{
|
||||||
|
old_my_ts = my_ts->clone(my_ts);
|
||||||
my_ts->set_address(my_ts, me);
|
my_ts->set_address(my_ts, me);
|
||||||
}
|
}
|
||||||
if (!other->ip_equals(other, this->other_addr) &&
|
if (!other->ip_equals(other, this->other_addr) &&
|
||||||
other_ts->is_host(other_ts, this->other_addr))
|
other_ts->is_host(other_ts, this->other_addr))
|
||||||
{
|
{
|
||||||
|
old_other_ts = other_ts->clone(other_ts);
|
||||||
other_ts->set_address(other_ts, other);
|
other_ts->set_address(other_ts, other);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -901,14 +904,29 @@ METHOD(child_sa_t, update, status_t,
|
|||||||
* correctly */
|
* correctly */
|
||||||
if (vip)
|
if (vip)
|
||||||
{
|
{
|
||||||
hydra->kernel_interface->del_ip(hydra->kernel_interface, vip);
|
hydra->kernel_interface->del_ip(hydra->kernel_interface,
|
||||||
hydra->kernel_interface->add_ip(hydra->kernel_interface, vip, me);
|
vip);
|
||||||
|
hydra->kernel_interface->add_ip(hydra->kernel_interface,
|
||||||
|
vip, me);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* reinstall updated policies */
|
/* reinstall updated policies */
|
||||||
install_policies_internal(this, me, other, my_ts, other_ts,
|
install_policies_internal(this, me, other, my_ts, other_ts,
|
||||||
&my_sa, &other_sa, POLICY_IPSEC,
|
&my_sa, &other_sa, POLICY_IPSEC,
|
||||||
POLICY_PRIORITY_DEFAULT);
|
POLICY_PRIORITY_DEFAULT);
|
||||||
|
|
||||||
|
/* update fallback policies after the new policy is in place */
|
||||||
|
if (old_my_ts || old_other_ts)
|
||||||
|
{
|
||||||
|
del_policies_internal(this, old_my_ts ?: my_ts,
|
||||||
|
old_other_ts ?: other_ts,
|
||||||
|
POLICY_PRIORITY_FALLBACK);
|
||||||
|
install_policies_internal(this, me, other, my_ts, other_ts,
|
||||||
|
&my_sa, &other_sa, POLICY_DROP,
|
||||||
|
POLICY_PRIORITY_FALLBACK);
|
||||||
|
DESTROY_IF(old_my_ts);
|
||||||
|
DESTROY_IF(old_other_ts);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
enumerator->destroy(enumerator);
|
enumerator->destroy(enumerator);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user