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);
}
Beispiel #2
0
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);
}