Mark CHILD_SAs used for trap policies to uninstall them properly.
If the installation failed the state is not CHILD_ROUTED which means the wrong priority is used to uninstall the policies. This is a problem for kernel interfaces that keep track of installed policies as now the proper policy is not found (if the priority is considered).
This commit is contained in:
@@ -123,6 +123,11 @@ struct private_child_sa_t {
|
|||||||
*/
|
*/
|
||||||
child_sa_state_t state;
|
child_sa_state_t state;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TRUE if this CHILD_SA is used to install trap policies
|
||||||
|
*/
|
||||||
|
bool trap;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Specifies if UDP encapsulation is enabled (NAT traversal)
|
* Specifies if UDP encapsulation is enabled (NAT traversal)
|
||||||
*/
|
*/
|
||||||
@@ -767,8 +772,11 @@ METHOD(child_sa_t, add_policies, status_t,
|
|||||||
other_sa.ah.spi = this->other_spi;
|
other_sa.ah.spi = this->other_spi;
|
||||||
}
|
}
|
||||||
|
|
||||||
priority = this->state == CHILD_CREATED ? POLICY_PRIORITY_ROUTED
|
/* if we're not in state CHILD_INSTALLING (i.e. if there is no SAD
|
||||||
: POLICY_PRIORITY_DEFAULT;
|
* entry) we install a trap policy */
|
||||||
|
this->trap = this->state == CHILD_CREATED;
|
||||||
|
priority = this->trap ? POLICY_PRIORITY_ROUTED
|
||||||
|
: POLICY_PRIORITY_DEFAULT;
|
||||||
|
|
||||||
/* enumerate pairs of traffic selectors */
|
/* enumerate pairs of traffic selectors */
|
||||||
enumerator = create_policy_enumerator(this);
|
enumerator = create_policy_enumerator(this);
|
||||||
@@ -797,8 +805,8 @@ METHOD(child_sa_t, add_policies, status_t,
|
|||||||
enumerator->destroy(enumerator);
|
enumerator->destroy(enumerator);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (status == SUCCESS && this->state == CHILD_CREATED)
|
if (status == SUCCESS && this->trap)
|
||||||
{ /* switch to routed state if no SAD entry set up */
|
{
|
||||||
set_state(this, CHILD_ROUTED);
|
set_state(this, CHILD_ROUTED);
|
||||||
}
|
}
|
||||||
return status;
|
return status;
|
||||||
@@ -970,8 +978,7 @@ METHOD(child_sa_t, destroy, void,
|
|||||||
traffic_selector_t *my_ts, *other_ts;
|
traffic_selector_t *my_ts, *other_ts;
|
||||||
policy_priority_t priority;
|
policy_priority_t priority;
|
||||||
|
|
||||||
priority = this->state == CHILD_ROUTED ? POLICY_PRIORITY_ROUTED
|
priority = this->trap ? POLICY_PRIORITY_ROUTED : POLICY_PRIORITY_DEFAULT;
|
||||||
: POLICY_PRIORITY_DEFAULT;
|
|
||||||
|
|
||||||
set_state(this, CHILD_DESTROYING);
|
set_state(this, CHILD_DESTROYING);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user