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_spf_table_finish (oa->spf_table); ospf6_route_table_delete (oa->spf_table); ospf6_route_table_delete (oa->route_table); THREAD_OFF (oa->thread_spf_calculation); THREAD_OFF (oa->thread_route_calculation); listnode_delete (oa->ospf6->area_list, oa); oa->ospf6 = NULL; /* free area */ XFREE (MTYPE_OSPF6_AREA, oa); }
void ospf6_interface_if_del (struct interface *ifp) { struct ospf6_interface *oi; oi = (struct ospf6_interface *) ifp->info; if (oi == NULL) return; /* interface stop */ if (oi->area) thread_execute (master, interface_down, oi, 0); listnode_delete (oi->area->if_list, oi); oi->area = (struct ospf6_area *) NULL; /* cut link */ oi->interface = NULL; ifp->info = NULL; ospf6_interface_delete (oi); }