From f8e9147674fb816bc273c50aedc510da5a305b70 Mon Sep 17 00:00:00 2001 From: Igor Ryzhov Date: Wed, 14 Oct 2020 01:20:53 +0300 Subject: [PATCH] ospfd: correctly process interface creation/destruction Signed-off-by: Igor Ryzhov --- ospfd/ospf_interface.c | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/ospfd/ospf_interface.c b/ospfd/ospf_interface.c index 31ea603e0f..a2e7d2b1f8 100644 --- a/ospfd/ospf_interface.c +++ b/ospfd/ospf_interface.c @@ -1241,6 +1241,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( @@ -1262,6 +1265,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); @@ -1327,7 +1343,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( @@ -1338,6 +1357,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); -- 2.39.5