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(
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);
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(
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);