ospfd: correctly process interface creation/destruction

Signed-off-by: Igor Ryzhov <iryzhov@nfware.com>
This commit is contained in:
Igor Ryzhov 2020-10-14 01:20:53 +03:00
parent eb364867d4
commit cbf1568110

View File

@ -1277,6 +1277,9 @@ void ospf_if_interface(struct interface *ifp)
static int ospf_ifp_create(struct interface *ifp)
{
struct ospf *ospf = NULL;
struct ospf_if_params *params;
struct route_node *rn;
uint32_t count = 0;
if (IS_DEBUG_OSPF(zebra, ZEBRA_INTERFACE))
zlog_debug(
@ -1298,6 +1301,19 @@ static int ospf_ifp_create(struct interface *ifp)
if (!ospf)
return 0;
params = IF_DEF_PARAMS(ifp);
if (OSPF_IF_PARAM_CONFIGURED(params, if_area))
count++;
for (rn = route_top(IF_OIFS_PARAMS(ifp)); rn; rn = route_next(rn))
if ((params = rn->info) && OSPF_IF_PARAM_CONFIGURED(params, if_area))
count++;
if (count > 0) {
ospf->if_ospf_cli_count += count;
ospf_interface_area_set(ospf, ifp);
}
ospf_if_recalculate_output_cost(ifp);
ospf_if_update(ospf, ifp);
@ -1363,7 +1379,10 @@ static int ospf_ifp_down(struct interface *ifp)
static int ospf_ifp_destroy(struct interface *ifp)
{
struct ospf *ospf;
struct ospf_if_params *params;
struct route_node *rn;
uint32_t count = 0;
if (IS_DEBUG_OSPF(zebra, ZEBRA_INTERFACE))
zlog_debug(
@ -1374,6 +1393,22 @@ static int ospf_ifp_destroy(struct interface *ifp)
hook_call(ospf_if_delete, ifp);
ospf = ospf_lookup_by_vrf_id(ifp->vrf_id);
if (ospf) {
params = IF_DEF_PARAMS(ifp);
if (OSPF_IF_PARAM_CONFIGURED(params, if_area))
count++;
for (rn = route_top(IF_OIFS_PARAMS(ifp)); rn; rn = route_next(rn))
if ((params = rn->info) && OSPF_IF_PARAM_CONFIGURED(params, if_area))
count++;
if (count > 0) {
ospf->if_ospf_cli_count -= count;
ospf_interface_area_unset(ospf, ifp);
}
}
for (rn = route_top(IF_OIFS(ifp)); rn; rn = route_next(rn))
if (rn->info)
ospf_if_free((struct ospf_interface *)rn->info);