kernel-wfp: Refactor route management to separate function
This commit is contained in:
@@ -1325,6 +1325,50 @@ static bool install_route(private_kernel_wfp_ipsec_t *this,
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* (Un)-install a single route
|
||||||
|
*/
|
||||||
|
static bool manage_route(private_kernel_wfp_ipsec_t *this,
|
||||||
|
host_t *local, host_t *remote,
|
||||||
|
traffic_selector_t *src_ts, traffic_selector_t *dst_ts,
|
||||||
|
bool add)
|
||||||
|
{
|
||||||
|
host_t *src, *dst, *gtw;
|
||||||
|
u_int8_t mask;
|
||||||
|
bool done;
|
||||||
|
|
||||||
|
if (!dst_ts->to_subnet(dst_ts, &dst, &mask))
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
if (hydra->kernel_interface->get_address_by_ts(hydra->kernel_interface,
|
||||||
|
src_ts, &src, NULL) != SUCCESS)
|
||||||
|
{
|
||||||
|
dst->destroy(dst);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
gtw = hydra->kernel_interface->get_nexthop(hydra->kernel_interface,
|
||||||
|
remote, local);
|
||||||
|
if (add)
|
||||||
|
{
|
||||||
|
done = install_route(this, dst, mask, src, gtw);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
done = uninstall_route(this, dst, mask, src, gtw);
|
||||||
|
}
|
||||||
|
dst->destroy(dst);
|
||||||
|
src->destroy(src);
|
||||||
|
DESTROY_IF(gtw);
|
||||||
|
|
||||||
|
if (!done)
|
||||||
|
{
|
||||||
|
DBG1(DBG_KNL, "%sinstalling route for policy %R === %R failed",
|
||||||
|
add ? "" : "un", src_ts, dst_ts);
|
||||||
|
}
|
||||||
|
return done;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* (Un)-install routes for IPsec policies
|
* (Un)-install routes for IPsec policies
|
||||||
*/
|
*/
|
||||||
@@ -1332,9 +1376,7 @@ static bool manage_routes(private_kernel_wfp_ipsec_t *this, entry_t *entry,
|
|||||||
bool add)
|
bool add)
|
||||||
{
|
{
|
||||||
enumerator_t *enumerator;
|
enumerator_t *enumerator;
|
||||||
host_t *src, *dst, *gtw;
|
|
||||||
sp_entry_t *sp;
|
sp_entry_t *sp;
|
||||||
u_int8_t mask;
|
|
||||||
|
|
||||||
enumerator = array_create_enumerator(entry->sps);
|
enumerator = array_create_enumerator(entry->sps);
|
||||||
while (enumerator->enumerate(enumerator, &sp))
|
while (enumerator->enumerate(enumerator, &sp))
|
||||||
@@ -1347,45 +1389,11 @@ static bool manage_routes(private_kernel_wfp_ipsec_t *this, entry_t *entry,
|
|||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (!sp->dst->to_subnet(sp->dst, &dst, &mask))
|
if (manage_route(this, entry->local, entry->remote,
|
||||||
|
sp->src, sp->dst, add))
|
||||||
{
|
{
|
||||||
continue;
|
sp->route = add;
|
||||||
}
|
}
|
||||||
if (hydra->kernel_interface->get_address_by_ts(hydra->kernel_interface,
|
|
||||||
sp->src, &src, NULL) != SUCCESS)
|
|
||||||
{
|
|
||||||
dst->destroy(dst);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
gtw = hydra->kernel_interface->get_nexthop(hydra->kernel_interface,
|
|
||||||
entry->remote, entry->local);
|
|
||||||
if (add)
|
|
||||||
{
|
|
||||||
if (install_route(this, dst, mask, src, gtw))
|
|
||||||
{
|
|
||||||
sp->route = TRUE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DBG1(DBG_KNL, "installing route for policy %R === %R failed",
|
|
||||||
sp->src, sp->dst);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (uninstall_route(this, dst, mask, src, gtw))
|
|
||||||
{
|
|
||||||
sp->route = FALSE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DBG1(DBG_KNL, "uninstalling route for policy %R === %R failed",
|
|
||||||
sp->src, sp->dst);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
dst->destroy(dst);
|
|
||||||
src->destroy(src);
|
|
||||||
DESTROY_IF(gtw);
|
|
||||||
}
|
}
|
||||||
enumerator->destroy(enumerator);
|
enumerator->destroy(enumerator);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user