ospf6_route_table_delete(oa->summary_router);
listnode_delete(oa->ospf6->area_list, oa);
+
+ if (oa->ospf6->backbone == oa)
+ oa->ospf6->backbone = NULL;
oa->ospf6 = NULL;
/* free area */
XFREE(MTYPE_OSPF6_AREA, oa);
}
+void ospf6_area_no_config_delete(struct ospf6_area *oa)
+{
+ if ((oa->if_list->count == 0) && (oa->range_table->count == 0) &&
+ (oa->nssa_range_table->count == 0) && !IS_AREA_STUB(oa) && !IS_AREA_NSSA(oa) &&
+ !PREFIX_NAME_IN(oa) && !PREFIX_NAME_OUT(oa) && !IMPORT_NAME(oa) && !EXPORT_NAME(oa)) {
+ ospf6_area_disable(oa);
+ ospf6_area_delete(oa);
+ }
+}
+
struct ospf6_area *ospf6_area_lookup_by_area_id(uint32_t area_id)
{
struct ospf6_area *oa;
struct listnode *node, *nnode;
struct ospf6_interface *oi;
+ UNSET_FLAG(oa->flag, OSPF6_AREA_ACTIVE);
UNSET_FLAG(oa->flag, OSPF6_AREA_ENABLE);
for (ALL_LIST_ELEMENTS(oa->if_list, node, nnode, oi))
}
ospf6_route_remove(range, oa->range_table);
+ /* Delete area if no interfaces or configuration. */
+ ospf6_area_no_config_delete(oa);
+
return CMD_SUCCESS;
}
if (ospf6_check_and_set_router_abr(area->ospf6))
ospf6_schedule_abr_task(ospf6);
+ /* Delete area if no interfaces or configuration. */
+ ospf6_area_no_config_delete(area);
+
return CMD_SUCCESS;
}
if (ospf6_check_and_set_router_abr(area->ospf6))
ospf6_schedule_abr_task(ospf6);
+ /* Delete area if no interfaces or configuration. */
+ ospf6_area_no_config_delete(area);
+
return CMD_SUCCESS;
}
if (ospf6_check_and_set_router_abr(area->ospf6))
ospf6_schedule_abr_task(ospf6);
+ /* Delete area if no interfaces or configuration. */
+ ospf6_area_no_config_delete(area);
+
return CMD_SUCCESS;
}
ospf6_area_stub_unset(ospf6, area);
ospf6_area_no_summary_unset(ospf6, area);
+ /* Delete area if no interfaces or configuration. */
+ ospf6_area_no_config_delete(area);
+
return CMD_SUCCESS;
}
ospf6_area_no_summary_unset(ospf6, area);
ospf6_nssa_default_originate_unset(ospf6, area);
+ /* Delete area if no interfaces or configuration. */
+ ospf6_area_no_config_delete(area);
+
return CMD_SUCCESS;
}