void ospf6_area_delete (struct ospf6_area *o6a) { listnode n; struct ospf6_interface *o6i; CALL_REMOVE_HOOK (&area_hook, o6a); /* ospf6 interface list */ for (n = listhead (o6a->if_list); n; nextnode (n)) { o6i = (struct ospf6_interface *) getdata (n); /* ospf6_interface_delete (o6i); */ } list_delete (o6a->if_list); /* terminate LSDB */ ospf6_lsdb_remove_all (o6a->lsdb); /* spf tree terminate */ /* xxx */ /* threads */ if (o6a->spf_calc) thread_cancel (o6a->spf_calc); o6a->spf_calc = (struct thread *) NULL; if (o6a->route_calc) thread_cancel (o6a->route_calc); o6a->route_calc = (struct thread *) NULL; /* new */ ospf6_route_table_delete (o6a->route_table); ospf6_spftree_delete (o6a->spf_tree); ospf6_route_table_delete (o6a->table_topology); /* free area */ XFREE (MTYPE_OSPF6_AREA, o6a); }
void ospf6_area_delete (struct ospf6_area *oa) { struct listnode *n, *nnode; struct ospf6_interface *oi; ospf6_route_table_delete (oa->range_table); ospf6_route_table_delete (oa->summary_prefix); ospf6_route_table_delete (oa->summary_router); /* ospf6 interface list */ for (ALL_LIST_ELEMENTS (oa->if_list, n, nnode, oi)) { ospf6_interface_delete (oi); } list_delete (oa->if_list); ospf6_lsdb_delete (oa->lsdb); ospf6_lsdb_delete (oa->lsdb_self); ospf6_route_table_delete (oa->spf_table); ospf6_route_table_delete (oa->route_table); #if 0 ospf6_spftree_delete (oa->spf_tree); ospf6_route_table_delete (oa->topology_table); #endif /*0*/ THREAD_OFF (oa->thread_spf_calculation); THREAD_OFF (oa->thread_route_calculation); THREAD_OFF (oa->thread_router_lsa); THREAD_OFF (oa->thread_intra_prefix_lsa); listnode_delete (oa->ospf6->area_list, oa); oa->ospf6 = NULL; /* free area */ XFREE (MTYPE_OSPF6_AREA, oa); }