ospfd.c
上传用户:xiaozhuqw
上传日期:2009-11-15
资源大小:1338k
文件大小:37k
源码类别:

网络

开发平台:

Unix_Linux

  1. /* OSPF version 2 daemon program.
  2.    Copyright (C) 1999, 2000 Toshiaki Takada
  3. This file is part of GNU Zebra.
  4. GNU Zebra is free software; you can redistribute it and/or modify it
  5. under the terms of the GNU General Public License as published by the
  6. Free Software Foundation; either version 2, or (at your option) any
  7. later version.
  8. GNU Zebra is distributed in the hope that it will be useful, but
  9. WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11. General Public License for more details.
  12. You should have received a copy of the GNU General Public License
  13. along with GNU Zebra; see the file COPYING.  If not, write to the Free
  14. Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
  15. 02111-1307, USA.  */
  16. #include <zebra.h>
  17. #include "thread.h"
  18. #include "vty.h"
  19. #include "command.h"
  20. #include "linklist.h"
  21. #include "prefix.h"
  22. #include "table.h"
  23. #include "if.h"
  24. #include "memory.h"
  25. #include "stream.h"
  26. #include "log.h"
  27. #include "sockunion.h"          /* for inet_aton () */
  28. #include "zclient.h"
  29. #include "plist.h"
  30. #include "ospfd/ospfd.h"
  31. #include "ospfd/ospf_network.h"
  32. #include "ospfd/ospf_interface.h"
  33. #include "ospfd/ospf_ism.h"
  34. #include "ospfd/ospf_asbr.h"
  35. #include "ospfd/ospf_lsa.h"
  36. #include "ospfd/ospf_lsdb.h"
  37. #include "ospfd/ospf_neighbor.h"
  38. #include "ospfd/ospf_nsm.h"
  39. #include "ospfd/ospf_spf.h"
  40. #include "ospfd/ospf_packet.h"
  41. #include "ospfd/ospf_dump.h"
  42. #include "ospfd/ospf_zebra.h"
  43. #include "ospfd/ospf_abr.h"
  44. #include "ospfd/ospf_flood.h"
  45. #include "ospfd/ospf_route.h"
  46. #include "ospfd/ospf_ase.h"
  47. /* OSPF process wide configuration. */
  48. static struct ospf_master ospf_master;
  49. /* OSPF process wide configuration pointer to export. */
  50. struct ospf_master *om;
  51. extern struct zclient *zclient;
  52. void ospf_remove_vls_through_area (struct ospf *, struct ospf_area *);
  53. void ospf_network_free (struct ospf *, struct ospf_network *);
  54. void ospf_area_free (struct ospf_area *);
  55. void ospf_network_run (struct ospf *, struct prefix *, struct ospf_area *);
  56. /* Get Router ID from ospf interface list. */
  57. struct in_addr
  58. ospf_router_id_get (list if_list)
  59. {
  60.   listnode node;
  61.   struct in_addr router_id;
  62.   memset (&router_id, 0, sizeof (struct in_addr));
  63.   for (node = listhead (if_list); node; nextnode (node))
  64.     {
  65.       struct ospf_interface *oi = getdata (node);
  66.       if (!if_is_up (oi->ifp) ||
  67.   OSPF_IF_PARAM (oi, passive_interface) == OSPF_IF_PASSIVE)
  68. continue;
  69.       
  70.       /* Ignore virtual link interface. */
  71.       if (oi->type != OSPF_IFTYPE_VIRTUALLINK &&
  72.   oi->type != OSPF_IFTYPE_LOOPBACK) 
  73. if (IPV4_ADDR_CMP (&router_id, &oi->address->u.prefix4) < 0)
  74.   router_id = oi->address->u.prefix4;
  75.     }
  76.   return router_id;
  77. }
  78. #define OSPF_EXTERNAL_LSA_ORIGINATE_DELAY 1
  79. void
  80. ospf_router_id_update (struct ospf *ospf)
  81. {
  82.   struct in_addr router_id, router_id_old;
  83.   listnode node;
  84.   if (IS_DEBUG_OSPF_EVENT)
  85.     zlog_info ("Router-ID[OLD:%s]: Update", inet_ntoa (ospf->router_id));
  86.   router_id_old = ospf->router_id;
  87.   if (ospf->router_id_static.s_addr != 0)
  88.     router_id = ospf->router_id_static;
  89.   else
  90.     router_id = ospf_router_id_get (ospf->oiflist);
  91.   ospf->router_id = router_id;
  92.   
  93.   if (IS_DEBUG_OSPF_EVENT)
  94.     zlog_info ("Router-ID[NEW:%s]: Update", inet_ntoa (ospf->router_id));
  95.   if (!IPV4_ADDR_SAME (&router_id_old, &router_id))
  96.     {
  97.       for (node = listhead (ospf->oiflist); node; nextnode (node))
  98.         {
  99.   struct ospf_interface *oi = getdata (node);
  100.           /* Update self-neighbor's router_id. */
  101.           oi->nbr_self->router_id = router_id;
  102.         }
  103.       /* If AS-external-LSA is queued, then flush those LSAs. */
  104.       if (router_id_old.s_addr == 0 && ospf->external_origin)
  105. {
  106.   int type;
  107.   /* Originate each redistributed external route. */
  108.   for (type = 0; type < ZEBRA_ROUTE_MAX; type++)
  109.     if (ospf->external_origin & (1 << type))
  110.       thread_add_event (master, ospf_external_lsa_originate_timer,
  111. ospf, type);
  112.   /* Originate Deafult. */
  113.   if (ospf->external_origin & (1 << ZEBRA_ROUTE_MAX))
  114.     thread_add_event (master, ospf_default_originate_timer,
  115.       &ospf->default_originate, 0);
  116.   ospf->external_origin = 0;
  117. }
  118.       OSPF_TIMER_ON (ospf->t_router_lsa_update,
  119.      ospf_router_lsa_update_timer, OSPF_LSA_UPDATE_DELAY);
  120.     }
  121. }
  122. int
  123. ospf_router_id_update_timer (struct thread *thread)
  124. {
  125.   struct ospf *ospf = THREAD_ARG (thread);
  126.   if (IS_DEBUG_OSPF_EVENT)
  127.     zlog_info ("Router-ID: Update timer fired!");
  128.   ospf->t_router_id_update = NULL;
  129.   ospf_router_id_update (ospf);
  130.   return 0;
  131. }
  132. /* For OSPF area sort by area id. */
  133. int
  134. ospf_area_id_cmp (struct ospf_area *a1, struct ospf_area *a2)
  135. {
  136.   if (ntohl (a1->area_id.s_addr) > ntohl (a2->area_id.s_addr))
  137.     return 1;
  138.   if (ntohl (a1->area_id.s_addr) < ntohl (a2->area_id.s_addr))
  139.     return -1;
  140.   return 0;
  141. }
  142. /* Allocate new ospf structure. */
  143. struct ospf *
  144. ospf_new ()
  145. {
  146.   int i;
  147.   struct ospf *new = XCALLOC (MTYPE_OSPF_TOP, sizeof (struct ospf));
  148.   new->router_id.s_addr = htonl (0);
  149.   new->router_id_static.s_addr = htonl (0);
  150.   new->abr_type = OSPF_ABR_STAND;
  151.   new->oiflist = list_new ();
  152.   new->vlinks = list_new ();
  153.   new->areas = list_new ();
  154.   new->areas->cmp = (int (*)(void *, void *)) ospf_area_id_cmp;
  155.   new->networks = route_table_init ();
  156.   new->nbr_nbma = route_table_init ();
  157.   new->lsdb = ospf_lsdb_new ();
  158.   new->default_originate = DEFAULT_ORIGINATE_NONE;
  159.   new->new_external_route = route_table_init ();
  160.   new->old_external_route = route_table_init ();
  161.   new->external_lsas = route_table_init ();
  162.   /* Distribute parameter init. */
  163.   for (i = 0; i <= ZEBRA_ROUTE_MAX; i++)
  164.     {
  165.       new->dmetric[i].type = -1;
  166.       new->dmetric[i].value = -1;
  167.     }
  168.   new->default_metric = -1;
  169.   new->ref_bandwidth = OSPF_DEFAULT_REF_BANDWIDTH;
  170.   /* SPF timer value init. */
  171.   new->spf_delay = OSPF_SPF_DELAY_DEFAULT;
  172.   new->spf_holdtime = OSPF_SPF_HOLDTIME_DEFAULT;
  173.   /* MaxAge init. */
  174.   new->maxage_lsa = list_new ();
  175.   new->t_maxage_walker =
  176.     thread_add_timer (master, ospf_lsa_maxage_walker,
  177.                       new, OSPF_LSA_MAXAGE_CHECK_INTERVAL);
  178.   /* Distance table init. */
  179.   new->distance_table = route_table_init ();
  180.   new->lsa_refresh_queue.index = 0;
  181.   new->lsa_refresh_interval = OSPF_LSA_REFRESH_INTERVAL_DEFAULT;
  182.   new->t_lsa_refresher = thread_add_timer (master, ospf_lsa_refresh_walker,
  183.    new, new->lsa_refresh_interval);
  184.   new->lsa_refresher_started = time (NULL);
  185.   new->fd = ospf_sock_init ();
  186.   if (new->fd >= 0)
  187.     new->t_read = thread_add_read (master, ospf_read, new, new->fd);
  188.   new->oi_write_q = list_new ();
  189.   
  190.   return new;
  191. }
  192. struct ospf *
  193. ospf_lookup ()
  194. {
  195.   if (listcount (om->ospf) == 0)
  196.     return NULL;
  197.   return getdata (listhead (om->ospf));
  198. }
  199. void
  200. ospf_add (struct ospf *ospf)
  201. {
  202.   listnode_add (om->ospf, ospf);
  203. }
  204. void
  205. ospf_delete (struct ospf *ospf)
  206. {
  207.   listnode_delete (om->ospf, ospf);
  208. }
  209. struct ospf *
  210. ospf_get ()
  211. {
  212.   struct ospf *ospf;
  213.   ospf = ospf_lookup ();
  214.   if (ospf == NULL)
  215.     {
  216.       ospf = ospf_new ();
  217.       ospf_add (ospf);
  218.       if (ospf->router_id_static.s_addr == 0)
  219. ospf_router_id_update (ospf);
  220. #ifdef HAVE_OPAQUE_LSA
  221.       ospf_opaque_type11_lsa_init (ospf);
  222. #endif /* HAVE_OPAQUE_LSA */
  223.     }
  224.   return ospf;
  225. }
  226. void
  227. ospf_finish (struct ospf *ospf)
  228. {
  229.   struct route_node *rn;
  230.   struct ospf_nbr_nbma *nbr_nbma;
  231.   struct ospf_lsa *lsa;
  232.   listnode node;
  233.   int i;
  234. #ifdef HAVE_OPAQUE_LSA
  235.   ospf_opaque_type11_lsa_term (ospf);
  236. #endif /* HAVE_OPAQUE_LSA */
  237.   /* Unredister redistribution */
  238.   for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
  239.     ospf_redistribute_unset (ospf, i);
  240.   for (node = listhead (ospf->areas); node;)
  241.     {
  242.       struct ospf_area *area = getdata (node);
  243.       nextnode (node);
  244.       
  245.       ospf_remove_vls_through_area (ospf, area);
  246.     }
  247.   
  248.   for (node = listhead (ospf->vlinks); node; )
  249.     {
  250.       struct ospf_vl_data *vl_data = node->data;
  251.       nextnode (node);
  252.       
  253.       ospf_vl_delete (ospf, vl_data);
  254.     }
  255.   
  256.   list_delete (ospf->vlinks);
  257.   /* Reset interface. */
  258.   for (node = listhead (ospf->oiflist); node;)
  259.     {
  260.       struct ospf_interface *oi = getdata (node);
  261.       nextnode (node);
  262.       
  263.       if (oi)
  264. ospf_if_free (oi);
  265.     }
  266.   /* Clear static neighbors */
  267.   for (rn = route_top (ospf->nbr_nbma); rn; rn = route_next (rn))
  268.     if ((nbr_nbma = rn->info))
  269.       {
  270. OSPF_POLL_TIMER_OFF (nbr_nbma->t_poll);
  271. if (nbr_nbma->nbr)
  272.   {
  273.     nbr_nbma->nbr->nbr_nbma = NULL;
  274.     nbr_nbma->nbr = NULL;
  275.   }
  276. if (nbr_nbma->oi)
  277.   {
  278.     listnode_delete (nbr_nbma->oi->nbr_nbma, nbr_nbma);
  279.     nbr_nbma->oi = NULL;
  280.   }
  281. XFREE (MTYPE_OSPF_NEIGHBOR_STATIC, nbr_nbma);
  282.       }
  283.   route_table_finish (ospf->nbr_nbma);
  284.   /* Clear networks and Areas. */
  285.   for (rn = route_top (ospf->networks); rn; rn = route_next (rn))
  286.     {
  287.       struct ospf_network *network;
  288.       if ((network = rn->info) != NULL)
  289. {
  290.   ospf_network_free (ospf, network);
  291.   rn->info = NULL;
  292.   route_unlock_node (rn);
  293. }
  294.     }
  295.   for (node = listhead (ospf->areas); node;)
  296.     {
  297.       struct ospf_area *area = getdata (node);
  298.       nextnode (node);
  299.       
  300.       listnode_delete (ospf->areas, area);
  301.       ospf_area_free (area);
  302.     }
  303.   /* Cancel all timers. */
  304.   OSPF_TIMER_OFF (ospf->t_external_lsa);
  305.   OSPF_TIMER_OFF (ospf->t_router_id_update);
  306.   OSPF_TIMER_OFF (ospf->t_router_lsa_update);
  307.   OSPF_TIMER_OFF (ospf->t_spf_calc);
  308.   OSPF_TIMER_OFF (ospf->t_ase_calc);
  309.   OSPF_TIMER_OFF (ospf->t_maxage);
  310.   OSPF_TIMER_OFF (ospf->t_maxage_walker);
  311.   OSPF_TIMER_OFF (ospf->t_abr_task);
  312.   OSPF_TIMER_OFF (ospf->t_distribute_update);
  313.   OSPF_TIMER_OFF (ospf->t_lsa_refresher);
  314.   OSPF_TIMER_OFF (ospf->t_read);
  315.   OSPF_TIMER_OFF (ospf->t_write);
  316.   close (ospf->fd);
  317.    
  318. #ifdef HAVE_OPAQUE_LSA
  319.   LSDB_LOOP (OPAQUE_AS_LSDB (ospf), rn, lsa)
  320.     ospf_discard_from_db (ospf, ospf->lsdb, lsa);
  321. #endif /* HAVE_OPAQUE_LSA */
  322.   LSDB_LOOP (EXTERNAL_LSDB (ospf), rn, lsa)
  323.     ospf_discard_from_db (ospf, ospf->lsdb, lsa);
  324.   ospf_lsdb_delete_all (ospf->lsdb);
  325.   ospf_lsdb_free (ospf->lsdb);
  326.   for (node = listhead (ospf->maxage_lsa); node; nextnode (node))
  327.     ospf_lsa_unlock (getdata (node));
  328.   list_delete (ospf->maxage_lsa);
  329.   if (ospf->old_table)
  330.     ospf_route_table_free (ospf->old_table);
  331.   if (ospf->new_table)
  332.     {
  333.       ospf_route_delete (ospf->new_table);
  334.       ospf_route_table_free (ospf->new_table);
  335.     }
  336.   if (ospf->old_rtrs)
  337.     ospf_rtrs_free (ospf->old_rtrs);
  338.   if (ospf->new_rtrs)
  339.     ospf_rtrs_free (ospf->new_rtrs);
  340.   if (ospf->new_external_route)
  341.     {
  342.       ospf_route_delete (ospf->new_external_route);
  343.       ospf_route_table_free (ospf->new_external_route);
  344.     }
  345.   if (ospf->old_external_route)
  346.     {
  347.       ospf_route_delete (ospf->old_external_route);
  348.       ospf_route_table_free (ospf->old_external_route);
  349.     }
  350.   if (ospf->external_lsas)
  351.     {
  352.       ospf_ase_external_lsas_finish (ospf->external_lsas);
  353.     }
  354.   list_delete (ospf->areas);
  355.   
  356.   for (i = ZEBRA_ROUTE_SYSTEM; i <= ZEBRA_ROUTE_MAX; i++)
  357.     if (EXTERNAL_INFO (i) != NULL)
  358.       for (rn = route_top (EXTERNAL_INFO (i)); rn; rn = route_next (rn))
  359. {
  360.   if (rn->info == NULL)
  361.     continue;
  362.   
  363.   XFREE (MTYPE_OSPF_EXTERNAL_INFO, rn->info);
  364.   rn->info = NULL;
  365.   route_unlock_node (rn);
  366. }
  367.   ospf_distance_reset (ospf);
  368.   route_table_finish (ospf->distance_table);
  369.   ospf_delete (ospf);
  370.   XFREE (MTYPE_OSPF_TOP, ospf);
  371. }
  372. /* allocate new OSPF Area object */
  373. struct ospf_area *
  374. ospf_area_new (struct ospf *ospf, struct in_addr area_id)
  375. {
  376.   struct ospf_area *new;
  377.   /* Allocate new config_network. */
  378.   new = XCALLOC (MTYPE_OSPF_AREA, sizeof (struct ospf_area));
  379.   new->ospf = ospf;
  380.   new->area_id = area_id;
  381.   new->external_routing = OSPF_AREA_DEFAULT;
  382.   new->default_cost = 1;
  383.   new->auth_type = OSPF_AUTH_NULL;
  384.   /* New LSDB init. */
  385.   new->lsdb = ospf_lsdb_new ();
  386.   /* Self-originated LSAs initialize. */
  387.   new->router_lsa_self = NULL;
  388. #ifdef HAVE_OPAQUE_LSA
  389.   ospf_opaque_type10_lsa_init (new);
  390. #endif /* HAVE_OPAQUE_LSA */
  391.   new->oiflist = list_new ();
  392.   new->ranges = route_table_init ();
  393.   if (area_id.s_addr == OSPF_AREA_BACKBONE)
  394.     ospf->backbone = new;
  395.   return new;
  396. }
  397. void
  398. ospf_area_free (struct ospf_area *area)
  399. {
  400.   struct route_node *rn;
  401.   struct ospf_lsa *lsa;
  402.   /* Free LSDBs. */
  403.   LSDB_LOOP (ROUTER_LSDB (area), rn, lsa)
  404.     ospf_discard_from_db (area->ospf, area->lsdb, lsa);
  405.   LSDB_LOOP (NETWORK_LSDB (area), rn, lsa)
  406.     ospf_discard_from_db (area->ospf, area->lsdb, lsa);
  407.   LSDB_LOOP (SUMMARY_LSDB (area), rn, lsa)
  408.     ospf_discard_from_db (area->ospf, area->lsdb, lsa);
  409.   LSDB_LOOP (ASBR_SUMMARY_LSDB (area), rn, lsa)
  410.     ospf_discard_from_db (area->ospf, area->lsdb, lsa);
  411. #ifdef HAVE_NSSA
  412.   LSDB_LOOP (NSSA_LSDB (area), rn, lsa)
  413.     ospf_discard_from_db (area->ospf, area->lsdb, lsa);
  414. #endif /* HAVE_NSSA */
  415. #ifdef HAVE_OPAQUE_LSA
  416.   LSDB_LOOP (OPAQUE_AREA_LSDB (area), rn, lsa)
  417.     ospf_discard_from_db (area->ospf, area->lsdb, lsa);
  418.   LSDB_LOOP (OPAQUE_LINK_LSDB (area), rn, lsa)
  419.     ospf_discard_from_db (area->ospf, area->lsdb, lsa);
  420. #endif /* HAVE_OPAQUE_LSA */
  421.   ospf_lsdb_delete_all (area->lsdb);
  422.   ospf_lsdb_free (area->lsdb);
  423. #ifdef HAVE_OPAQUE_LSA
  424.   ospf_opaque_type10_lsa_term (area);
  425. #endif /* HAVE_OPAQUE_LSA */
  426.   ospf_lsa_unlock (area->router_lsa_self);
  427.   
  428.   route_table_finish (area->ranges);
  429.   list_delete (area->oiflist);
  430.   if (EXPORT_NAME (area))
  431.     free (EXPORT_NAME (area));
  432.   if (IMPORT_NAME (area))
  433.     free (IMPORT_NAME (area));
  434.   /* Cancel timer. */
  435.   OSPF_TIMER_OFF (area->t_router_lsa_self);
  436.   if (OSPF_IS_AREA_BACKBONE (area))
  437.     area->ospf->backbone = NULL;
  438.   XFREE (MTYPE_OSPF_AREA, area);
  439. }
  440. void
  441. ospf_area_check_free (struct ospf *ospf, struct in_addr area_id)
  442. {
  443.   struct ospf_area *area;
  444.   area = ospf_area_lookup_by_area_id (ospf, area_id);
  445.   if (area &&
  446.       listcount (area->oiflist) == 0 &&
  447.       area->ranges->top == NULL &&
  448.       area->shortcut_configured == OSPF_SHORTCUT_DEFAULT &&
  449.       area->external_routing == OSPF_AREA_DEFAULT &&
  450.       area->no_summary == 0 &&
  451.       area->default_cost == 1 &&
  452.       EXPORT_NAME (area) == NULL &&
  453.       IMPORT_NAME (area) == NULL &&
  454.       area->auth_type == OSPF_AUTH_NULL)
  455.     {
  456.       listnode_delete (ospf->areas, area);
  457.       ospf_area_free (area);
  458.     }
  459. }
  460. struct ospf_area *
  461. ospf_area_get (struct ospf *ospf, struct in_addr area_id, int format)
  462. {
  463.   struct ospf_area *area;
  464.   
  465.   area = ospf_area_lookup_by_area_id (ospf, area_id);
  466.   if (!area)
  467.     {
  468.       area = ospf_area_new (ospf, area_id);
  469.       area->format = format;
  470.       listnode_add_sort (ospf->areas, area);
  471.       ospf_check_abr_status (ospf);  
  472.     }
  473.   return area;
  474. }
  475. struct ospf_area *
  476. ospf_area_lookup_by_area_id (struct ospf *ospf, struct in_addr area_id)
  477. {
  478.   struct ospf_area *area;
  479.   listnode node;
  480.   for (node = listhead (ospf->areas); node; nextnode (node))
  481.     {
  482.       area = getdata (node);
  483.       if (IPV4_ADDR_SAME (&area->area_id, &area_id))
  484.         return area;
  485.     }
  486.   return NULL;
  487. }
  488. void
  489. ospf_area_add_if (struct ospf_area *area, struct ospf_interface *oi)
  490. {
  491.   listnode_add (area->oiflist, oi);
  492. }
  493. void
  494. ospf_area_del_if (struct ospf_area *area, struct ospf_interface *oi)
  495. {
  496.   listnode_delete (area->oiflist, oi);
  497. }
  498. /* Config network statement related functions. */
  499. struct ospf_network *
  500. ospf_network_new (struct in_addr area_id, int format)
  501. {
  502.   struct ospf_network *new;
  503.   new = XCALLOC (MTYPE_OSPF_NETWORK, sizeof (struct ospf_network));
  504.   new->area_id = area_id;
  505.   new->format = format;
  506.   
  507.   return new;
  508. }
  509. void
  510. ospf_network_free (struct ospf *ospf, struct ospf_network *network)
  511. {
  512.   ospf_area_check_free (ospf, network->area_id);
  513.   ospf_schedule_abr_task (ospf);
  514.   XFREE (MTYPE_OSPF_NETWORK, network);
  515. }
  516. int
  517. ospf_network_set (struct ospf *ospf, struct prefix_ipv4 *p,
  518.   struct in_addr area_id)
  519. {
  520.   struct ospf_network *network;
  521.   struct ospf_area *area;
  522.   struct route_node *rn;
  523.   struct external_info *ei;
  524.   int ret = OSPF_AREA_ID_FORMAT_ADDRESS;
  525.   rn = route_node_get (ospf->networks, (struct prefix *)p);
  526.   if (rn->info)
  527.     {
  528.       /* There is already same network statement. */
  529.       route_unlock_node (rn);
  530.       return 0;
  531.     }
  532.   rn->info = network = ospf_network_new (area_id, ret);
  533.   area = ospf_area_get (ospf, area_id, ret);
  534.   /* Run network config now. */
  535.   ospf_network_run (ospf, (struct prefix *)p, area);
  536.   /* Update connected redistribute. */
  537.   if (ospf_is_type_redistributed (ZEBRA_ROUTE_CONNECT))
  538.     if (EXTERNAL_INFO (ZEBRA_ROUTE_CONNECT))
  539.       for (rn = route_top (EXTERNAL_INFO (ZEBRA_ROUTE_CONNECT));
  540.    rn; rn = route_next (rn))
  541. if ((ei = rn->info) != NULL)
  542.   if (ospf_external_info_find_lsa (ospf, &ei->p))
  543.     if (!ospf_distribute_check_connected (ospf, ei))
  544.       ospf_external_lsa_flush (ospf, ei->type, &ei->p,
  545.        ei->ifindex, ei->nexthop);
  546.   ospf_area_check_free (ospf, area_id);
  547.   return 1;
  548. }
  549. int
  550. ospf_network_unset (struct ospf *ospf, struct prefix_ipv4 *p,
  551.     struct in_addr area_id)
  552. {
  553.   struct route_node *rn;
  554.   struct ospf_network *network;
  555.   struct external_info *ei;
  556.   rn = route_node_lookup (ospf->networks, (struct prefix *)p);
  557.   if (rn == NULL)
  558.     return 0;
  559.   network = rn->info;
  560.   if (!IPV4_ADDR_SAME (&area_id, &network->area_id))
  561.     return 0;
  562.   ospf_network_free (ospf, rn->info);
  563.   rn->info = NULL;
  564.   route_unlock_node (rn);
  565.   ospf_if_update (ospf);
  566.   
  567.   /* Update connected redistribute. */
  568.   if (ospf_is_type_redistributed (ZEBRA_ROUTE_CONNECT))
  569.     if (EXTERNAL_INFO (ZEBRA_ROUTE_CONNECT))
  570.       for (rn = route_top (EXTERNAL_INFO (ZEBRA_ROUTE_CONNECT));
  571.    rn; rn = route_next (rn))
  572. if ((ei = rn->info) != NULL)
  573.   if (!ospf_external_info_find_lsa (ospf, &ei->p))
  574.     if (ospf_distribute_check_connected (ospf, ei))
  575.       ospf_external_lsa_originate (ospf, ei);
  576.   return 1;
  577. }
  578. void
  579. ospf_network_run (struct ospf *ospf, struct prefix *p, struct ospf_area *area)
  580. {
  581.   struct interface *ifp;
  582.   listnode node;
  583.   /* Schedule Router ID Update. */
  584.   if (ospf->router_id_static.s_addr == 0)
  585.     if (ospf->t_router_id_update == NULL)
  586.       {
  587. OSPF_TIMER_ON (ospf->t_router_id_update, ospf_router_id_update_timer,
  588.        OSPF_ROUTER_ID_UPDATE_DELAY);
  589.       }
  590.   /* Get target interface. */
  591.   for (node = listhead (om->iflist); node; nextnode (node))
  592.     {
  593.       listnode cn;
  594.       
  595.       if ((ifp = getdata (node)) == NULL)
  596. continue;
  597.       if (memcmp (ifp->name, "VLINK", 5) == 0)
  598. continue;
  599.       /* if interface prefix is match specified prefix,
  600.  then create socket and join multicast group. */
  601.       for (cn = listhead (ifp->connected); cn; nextnode (cn))
  602. {
  603.   struct connected *co = getdata (cn);
  604.   struct prefix *addr;
  605.   if (if_is_pointopoint (ifp))
  606.     addr = co->destination;
  607.   else 
  608.     addr = co->address;
  609.   if (p->family == co->address->family &&
  610.       ! ospf_if_is_configured (ospf, &(addr->u.prefix4)))
  611.     if ((if_is_pointopoint (ifp) &&
  612.  IPV4_ADDR_SAME (&(addr->u.prefix4), &(p->u.prefix4))) ||
  613. prefix_match (p, addr)) 
  614.     {
  615.         struct ospf_interface *oi;
  616. oi = ospf_if_new (ospf, ifp, co->address);
  617. oi->connected = co;
  618. oi->nbr_self->address = *oi->address;
  619. area->act_ints++;
  620. oi->area = area;
  621. oi->params = ospf_lookup_if_params (ifp, oi->address->u.prefix4);
  622. oi->output_cost = ospf_if_get_output_cost (oi);
  623. if (area->external_routing != OSPF_AREA_DEFAULT)
  624.   UNSET_FLAG (oi->nbr_self->options, OSPF_OPTION_E);
  625. oi->nbr_self->priority = OSPF_IF_PARAM (oi, priority);
  626. /* Add pseudo neighbor. */
  627. ospf_nbr_add_self (oi);
  628. /* Make sure pseudo neighbor's router_id. */
  629. oi->nbr_self->router_id = ospf->router_id;
  630. oi->nbr_self->src = oi->address->u.prefix4;
  631. /* Relate ospf interface to ospf instance. */
  632. oi->ospf = ospf;
  633. /* update network type as interface flag */
  634. /* If network type is specified previously,
  635.    skip network type setting. */
  636. oi->type = IF_DEF_PARAMS (ifp)->type;
  637. /* Set area flag. */
  638. switch (area->external_routing)
  639.   {
  640.   case OSPF_AREA_DEFAULT:
  641.     SET_FLAG (oi->nbr_self->options, OSPF_OPTION_E);
  642.     break;
  643.   case OSPF_AREA_STUB:
  644.     UNSET_FLAG (oi->nbr_self->options, OSPF_OPTION_E);
  645.     break;
  646. #ifdef HAVE_NSSA
  647.   case OSPF_AREA_NSSA:
  648.     UNSET_FLAG (oi->nbr_self->options, OSPF_OPTION_E);
  649.     SET_FLAG (oi->nbr_self->options, OSPF_OPTION_NP);
  650.     break;
  651. #endif /* HAVE_NSSA */
  652.   }
  653. ospf_area_add_if (oi->area, oi);
  654. if (if_is_up (ifp)) 
  655.   ospf_if_up (oi);
  656. break;
  657.       }
  658. }
  659.     }
  660. }
  661. void
  662. ospf_ls_upd_queue_empty (struct ospf_interface *oi)
  663. {
  664.   struct route_node *rn;
  665.   listnode node;
  666.   list lst;
  667.   struct ospf_lsa *lsa;
  668.   /* empty ls update queue */
  669.   for (rn = route_top (oi->ls_upd_queue); rn;
  670.        rn = route_next (rn))
  671.     if ((lst = (list) rn->info))
  672.       {
  673. for (node = listhead (lst); node; nextnode (node))
  674.   if ((lsa = getdata (node)))
  675.     ospf_lsa_unlock (lsa);
  676. list_free (lst);
  677. rn->info = NULL;
  678.       }
  679.   
  680.   /* remove update event */
  681.   if (oi->t_ls_upd_event)
  682.     {
  683.       thread_cancel (oi->t_ls_upd_event);
  684.       oi->t_ls_upd_event = NULL;
  685.     }
  686. }
  687. void
  688. ospf_if_update (struct ospf *ospf)
  689. {
  690.   struct route_node *rn;
  691.   listnode node;
  692.   listnode next;
  693.   struct ospf_network *network;
  694.   struct ospf_area *area;
  695.   if (ospf != NULL)
  696.     {
  697.       /* Update Router ID scheduled. */
  698.       if (ospf->router_id_static.s_addr == 0)
  699.         if (ospf->t_router_id_update == NULL)
  700.           {
  701.     OSPF_TIMER_ON (ospf->t_router_id_update,
  702.    ospf_router_id_update_timer,
  703.    OSPF_ROUTER_ID_UPDATE_DELAY);
  704.           }
  705.       /* Find interfaces that not configured already.  */
  706.       for (node = listhead (ospf->oiflist); node; node = next)
  707. {
  708.   int found = 0;
  709.   struct ospf_interface *oi = getdata (node);
  710.   struct connected *co = oi->connected;
  711.   
  712.   next = nextnode (node);
  713.   if (oi->type == OSPF_IFTYPE_VIRTUALLINK)
  714.     continue;
  715.   
  716.   for (rn = route_top (ospf->networks); rn; rn = route_next (rn))
  717.     {
  718.       if (rn->info == NULL)
  719. continue;
  720.       
  721.       if ((oi->type == OSPF_IFTYPE_POINTOPOINT
  722.    && IPV4_ADDR_SAME (&(co->destination->u.prefix4),
  723.       &(rn->p.u.prefix4)))
  724.   || prefix_match (&(rn->p), co->address))
  725. {
  726.   found = 1;
  727.   route_unlock_node (rn);
  728.   break;
  729. }
  730.     }
  731.   if (found == 0)
  732.     ospf_if_free (oi);
  733. }
  734.       /* Run each interface. */
  735.       for (rn = route_top (ospf->networks); rn; rn = route_next (rn))
  736. if (rn->info != NULL)
  737.   {
  738.     network = (struct ospf_network *) rn->info;
  739.     area = ospf_area_get (ospf, network->area_id, network->format);
  740.     ospf_network_run (ospf, &rn->p, area);
  741.   }
  742.     }
  743. }
  744. void
  745. ospf_remove_vls_through_area (struct ospf *ospf, struct ospf_area *area)
  746. {
  747.   listnode node, next;
  748.   struct ospf_vl_data *vl_data;
  749.   for (node = listhead (ospf->vlinks); node; node = next)
  750.     {
  751.       next = node->next;
  752.       if ((vl_data = getdata (node)) != NULL)
  753. if (IPV4_ADDR_SAME (&vl_data->vl_area_id, &area->area_id))
  754.   ospf_vl_delete (ospf, vl_data);
  755.     }
  756. }
  757. struct message ospf_area_type_msg[] =
  758. {
  759.   { OSPF_AREA_DEFAULT, "Default" },
  760.   { OSPF_AREA_STUB,     "Stub" },
  761.   { OSPF_AREA_NSSA,     "NSSA" },
  762. };
  763. int ospf_area_type_msg_max = OSPF_AREA_TYPE_MAX;
  764. void
  765. ospf_area_type_set (struct ospf_area *area, int type)
  766. {
  767.   listnode node;
  768.   struct ospf_interface *oi;
  769.   if (area->external_routing == type)
  770.     {
  771.       if (IS_DEBUG_OSPF_EVENT)
  772. zlog_info ("Area[%s]: Types are the same, ignored.",
  773.    inet_ntoa (area->area_id));
  774.       return;
  775.     }
  776.   area->external_routing = type;
  777.   if (IS_DEBUG_OSPF_EVENT)
  778.     zlog_info ("Area[%s]: Configured as %s", inet_ntoa (area->area_id),
  779.        LOOKUP (ospf_area_type_msg, type));
  780.   switch (area->external_routing)
  781.     {
  782.     case OSPF_AREA_DEFAULT:
  783.       for (node = listhead (area->oiflist); node; nextnode (node))
  784. if ((oi = getdata (node)) != NULL)
  785.   if (oi->nbr_self != NULL)
  786.     SET_FLAG (oi->nbr_self->options, OSPF_OPTION_E);
  787.       break;
  788.     case OSPF_AREA_STUB:
  789.       for (node = listhead (area->oiflist); node; nextnode (node))
  790. if ((oi = getdata (node)) != NULL)
  791.   if (oi->nbr_self != NULL)
  792.     {
  793.       if (IS_DEBUG_OSPF_EVENT)
  794. zlog_info ("setting options on %s accordingly", IF_NAME (oi));
  795.       UNSET_FLAG (oi->nbr_self->options, OSPF_OPTION_E);
  796.       if (IS_DEBUG_OSPF_EVENT)
  797. zlog_info ("options set on %s: %x",
  798.    IF_NAME (oi), OPTIONS (oi));
  799.     }
  800.       break;
  801.     case OSPF_AREA_NSSA:
  802. #ifdef HAVE_NSSA
  803.       for (node = listhead (area->oiflist); node; nextnode (node))
  804. if ((oi = getdata (node)) != NULL)
  805.   if (oi->nbr_self != NULL)
  806.     {
  807.       zlog_info ("setting nssa options on %s accordingly", IF_NAME (oi));
  808.       UNSET_FLAG (oi->nbr_self->options, OSPF_OPTION_E);
  809.       SET_FLAG (oi->nbr_self->options, OSPF_OPTION_NP);
  810.       zlog_info ("options set on %s: %x", IF_NAME (oi), OPTIONS (oi));
  811.     }
  812. #endif /* HAVE_NSSA */
  813.       break;
  814.     default:
  815.       break;
  816.     }
  817.   ospf_router_lsa_timer_add (area);
  818.   ospf_schedule_abr_task (area->ospf);
  819. }
  820. int
  821. ospf_area_shortcut_set (struct ospf *ospf, struct ospf_area *area, int mode)
  822. {
  823.   if (area->shortcut_configured == mode)
  824.     return 0;
  825.   area->shortcut_configured = mode;
  826.   ospf_router_lsa_timer_add (area);
  827.   ospf_schedule_abr_task (ospf);
  828.   ospf_area_check_free (ospf, area->area_id);
  829.   return 1;
  830. }
  831. int
  832. ospf_area_shortcut_unset (struct ospf *ospf, struct ospf_area *area)
  833. {
  834.   area->shortcut_configured = OSPF_SHORTCUT_DEFAULT;
  835.   ospf_router_lsa_timer_add (area);
  836.   ospf_area_check_free (ospf, area->area_id);
  837.   ospf_schedule_abr_task (ospf);
  838.   return 1;
  839. }
  840. int
  841. ospf_area_vlink_count (struct ospf *ospf, struct ospf_area *area)
  842. {
  843.   struct ospf_vl_data *vl;
  844.   listnode node;
  845.   int count = 0;
  846.   for (node = listhead (ospf->vlinks); node; nextnode (node))
  847.     {
  848.       vl = getdata (node);
  849.       if (IPV4_ADDR_SAME (&vl->vl_area_id, &area->area_id))
  850. count++;
  851.     }
  852.   return count;
  853. }
  854. int
  855. ospf_area_stub_set (struct ospf *ospf, struct in_addr area_id)
  856. {
  857.   struct ospf_area *area;
  858.   int format = OSPF_AREA_ID_FORMAT_ADDRESS;
  859.   area = ospf_area_get (ospf, area_id, format);
  860.   if (ospf_area_vlink_count (ospf, area))
  861.     return 0;
  862.   if (area->external_routing != OSPF_AREA_STUB)
  863.     ospf_area_type_set (area, OSPF_AREA_STUB);
  864.   return 1;
  865. }
  866. int
  867. ospf_area_stub_unset (struct ospf *ospf, struct in_addr area_id)
  868. {
  869.   struct ospf_area *area;
  870.   area = ospf_area_lookup_by_area_id (ospf, area_id);
  871.   if (area == NULL)
  872.     return 1;
  873.   if (area->external_routing == OSPF_AREA_STUB)
  874.     ospf_area_type_set (area, OSPF_AREA_DEFAULT);
  875.   ospf_area_check_free (ospf, area_id);
  876.   return 1;
  877. }
  878. int
  879. ospf_area_no_summary_set (struct ospf *ospf, struct in_addr area_id)
  880. {
  881.   struct ospf_area *area;
  882.   int format = OSPF_AREA_ID_FORMAT_ADDRESS;
  883.   area = ospf_area_get (ospf, area_id, format);
  884.   area->no_summary = 1;
  885.   return 1;
  886. }
  887. int
  888. ospf_area_no_summary_unset (struct ospf *ospf, struct in_addr area_id)
  889. {
  890.   struct ospf_area *area;
  891.   area = ospf_area_lookup_by_area_id (ospf, area_id);
  892.   if (area == NULL)
  893.     return 0;
  894.   area->no_summary = 0;
  895.   ospf_area_check_free (ospf, area_id);
  896.   return 1;
  897. }
  898. int
  899. ospf_area_nssa_set (struct ospf *ospf, struct in_addr area_id)
  900. {
  901.   struct ospf_area *area;
  902.   int format = OSPF_AREA_ID_FORMAT_ADDRESS;
  903.   area = ospf_area_get (ospf, area_id, format);
  904.   if (ospf_area_vlink_count (ospf, area))
  905.     return 0;
  906.   if (area->external_routing != OSPF_AREA_NSSA)
  907.     {
  908.       ospf_area_type_set (area, OSPF_AREA_NSSA);
  909.       ospf->anyNSSA++;
  910.     }
  911.   return 1;
  912. }
  913. int
  914. ospf_area_nssa_unset (struct ospf *ospf, struct in_addr area_id)
  915. {
  916.   struct ospf_area *area;
  917.   area = ospf_area_lookup_by_area_id (ospf, area_id);
  918.   if (area == NULL)
  919.     return 0;
  920.   if (area->external_routing == OSPF_AREA_NSSA)
  921.     {
  922.       ospf->anyNSSA--;
  923.       ospf_area_type_set (area, OSPF_AREA_DEFAULT);
  924.     }
  925.   ospf_area_check_free (ospf, area_id);
  926.   return 1;
  927. }
  928. int
  929. ospf_area_nssa_translator_role_set (struct ospf *ospf, struct in_addr area_id,
  930.     int role)
  931. {
  932.   struct ospf_area *area;
  933.   area = ospf_area_lookup_by_area_id (ospf, area_id);
  934.   if (area == NULL)
  935.     return 0;
  936.   area->NSSATranslator = role;
  937.   return 1;
  938. }
  939. int
  940. ospf_area_nssa_translator_role_unset (struct ospf *ospf,
  941.       struct in_addr area_id)
  942. {
  943.   struct ospf_area *area;
  944.   area = ospf_area_lookup_by_area_id (ospf, area_id);
  945.   if (area == NULL)
  946.     return 0;
  947.   area->NSSATranslator = OSPF_NSSA_ROLE_CANDIDATE;
  948.   ospf_area_check_free (ospf, area_id);
  949.   return 1;
  950. }
  951. int
  952. ospf_area_export_list_set (struct ospf *ospf,
  953.    struct ospf_area *area, char *list_name)
  954. {
  955.   struct access_list *list;
  956.   list = access_list_lookup (AFI_IP, list_name);
  957.   EXPORT_LIST (area) = list;
  958.   if (EXPORT_NAME (area))
  959.     free (EXPORT_NAME (area));
  960.   EXPORT_NAME (area) = strdup (list_name);
  961.   ospf_schedule_abr_task (ospf);
  962.   return 1;
  963. }
  964. int
  965. ospf_area_export_list_unset (struct ospf *ospf, struct ospf_area * area)
  966. {
  967.   EXPORT_LIST (area) = 0;
  968.   if (EXPORT_NAME (area))
  969.     free (EXPORT_NAME (area));
  970.   EXPORT_NAME (area) = NULL;
  971.   ospf_area_check_free (ospf, area->area_id);
  972.   
  973.   ospf_schedule_abr_task (ospf);
  974.   return 1;
  975. }
  976. int
  977. ospf_area_import_list_set (struct ospf *ospf,
  978.    struct ospf_area *area, char *name)
  979. {
  980.   struct access_list *list;
  981.   list = access_list_lookup (AFI_IP, name);
  982.   IMPORT_LIST (area) = list;
  983.   if (IMPORT_NAME (area))
  984.     free (IMPORT_NAME (area));
  985.   IMPORT_NAME (area) = strdup (name);
  986.   ospf_schedule_abr_task (ospf);
  987.   return 1;
  988. }
  989. int
  990. ospf_area_import_list_unset (struct ospf *ospf, struct ospf_area * area)
  991. {
  992.   IMPORT_LIST (area) = 0;
  993.   if (IMPORT_NAME (area))
  994.     free (IMPORT_NAME (area));
  995.   IMPORT_NAME (area) = NULL;
  996.   ospf_area_check_free (ospf, area->area_id);
  997.   ospf_schedule_abr_task (ospf);
  998.   return 1;
  999. }
  1000. int
  1001. ospf_timers_spf_set (struct ospf *ospf, u_int32_t delay, u_int32_t hold)
  1002. {
  1003.   ospf->spf_delay = delay;
  1004.   ospf->spf_holdtime = hold;
  1005.   return 1;
  1006. }
  1007. int
  1008. ospf_timers_spf_unset (struct ospf *ospf)
  1009. {
  1010.   ospf->spf_delay = OSPF_SPF_DELAY_DEFAULT;
  1011.   ospf->spf_holdtime = OSPF_SPF_HOLDTIME_DEFAULT;
  1012.   return 1;
  1013. }
  1014. int
  1015. ospf_timers_refresh_set (struct ospf *ospf, int interval)
  1016. {
  1017.   int time_left;
  1018.   if (ospf->lsa_refresh_interval == interval)
  1019.     return 1;
  1020.   time_left = ospf->lsa_refresh_interval -
  1021.     (time (NULL) - ospf->lsa_refresher_started);
  1022.   
  1023.   if (time_left > interval)
  1024.     {
  1025.       OSPF_TIMER_OFF (ospf->t_lsa_refresher);
  1026.       ospf->t_lsa_refresher =
  1027. thread_add_timer (master, ospf_lsa_refresh_walker, ospf, interval);
  1028.     }
  1029.   ospf->lsa_refresh_interval = interval;
  1030.   return 1;
  1031. }
  1032. int
  1033. ospf_timers_refresh_unset (struct ospf *ospf)
  1034. {
  1035.   int time_left;
  1036.   time_left = ospf->lsa_refresh_interval -
  1037.     (time (NULL) - ospf->lsa_refresher_started);
  1038.   if (time_left > OSPF_LSA_REFRESH_INTERVAL_DEFAULT)
  1039.     {
  1040.       OSPF_TIMER_OFF (ospf->t_lsa_refresher);
  1041.       ospf->t_lsa_refresher =
  1042. thread_add_timer (master, ospf_lsa_refresh_walker, ospf,
  1043.   OSPF_LSA_REFRESH_INTERVAL_DEFAULT);
  1044.     }
  1045.   ospf->lsa_refresh_interval = OSPF_LSA_REFRESH_INTERVAL_DEFAULT;
  1046.   return 1;
  1047. }
  1048. struct ospf_nbr_nbma *
  1049. ospf_nbr_nbma_new ()
  1050. {
  1051.   struct ospf_nbr_nbma *nbr_nbma;
  1052.   nbr_nbma = XMALLOC (MTYPE_OSPF_NEIGHBOR_STATIC,
  1053.       sizeof (struct ospf_nbr_nbma));
  1054.   memset (nbr_nbma, 0, sizeof (struct ospf_nbr_nbma));
  1055.   nbr_nbma->priority = OSPF_NEIGHBOR_PRIORITY_DEFAULT;
  1056.   nbr_nbma->v_poll = OSPF_POLL_INTERVAL_DEFAULT;
  1057.   return nbr_nbma;
  1058. }
  1059. void
  1060. ospf_nbr_nbma_free (struct ospf_nbr_nbma *nbr_nbma)
  1061. {
  1062.   XFREE (MTYPE_OSPF_NEIGHBOR_STATIC, nbr_nbma);
  1063. }
  1064. void
  1065. ospf_nbr_nbma_delete (struct ospf *ospf, struct ospf_nbr_nbma *nbr_nbma)
  1066. {
  1067.   struct route_node *rn;
  1068.   struct prefix_ipv4 p;
  1069.   p.family = AF_INET;
  1070.   p.prefix = nbr_nbma->addr;
  1071.   p.prefixlen = IPV4_MAX_BITLEN;
  1072.   rn = route_node_lookup (ospf->nbr_nbma, (struct prefix *)&p);
  1073.   if (rn)
  1074.     {
  1075.       ospf_nbr_nbma_free (rn->info);
  1076.       rn->info = NULL;
  1077.       route_unlock_node (rn);
  1078.       route_unlock_node (rn);
  1079.     }
  1080. }
  1081. void
  1082. ospf_nbr_nbma_down (struct ospf_nbr_nbma *nbr_nbma)
  1083. {
  1084.   OSPF_TIMER_OFF (nbr_nbma->t_poll);
  1085.   if (nbr_nbma->nbr)
  1086.     {
  1087.       nbr_nbma->nbr->nbr_nbma = NULL;
  1088.       OSPF_NSM_EVENT_EXECUTE (nbr_nbma->nbr, NSM_KillNbr);
  1089.     }
  1090.   if (nbr_nbma->oi)
  1091.     listnode_delete (nbr_nbma->oi->nbr_nbma, nbr_nbma);
  1092. }
  1093. void
  1094. ospf_nbr_nbma_add (struct ospf_nbr_nbma *nbr_nbma,
  1095.    struct ospf_interface *oi)
  1096. {
  1097.   struct ospf_neighbor *nbr;
  1098.   struct route_node *rn;
  1099.   struct prefix p;
  1100.   if (oi->type != OSPF_IFTYPE_NBMA)
  1101.     return;
  1102.   if (nbr_nbma->nbr != NULL)
  1103.     return;
  1104.   if (IPV4_ADDR_SAME (&oi->nbr_self->address.u.prefix4, &nbr_nbma->addr))
  1105.     return;
  1106.       
  1107.   nbr_nbma->oi = oi;
  1108.   listnode_add (oi->nbr_nbma, nbr_nbma);
  1109.   /* Get neighbor information from table. */
  1110.   p.family = AF_INET;
  1111.   p.prefixlen = IPV4_MAX_BITLEN;
  1112.   p.u.prefix4 = nbr_nbma->addr;
  1113.   rn = route_node_get (oi->nbrs, (struct prefix *)&p);
  1114.   if (rn->info)
  1115.     {
  1116.       nbr = rn->info;
  1117.       nbr->nbr_nbma = nbr_nbma;
  1118.       nbr_nbma->nbr = nbr;
  1119.       route_unlock_node (rn);
  1120.     }
  1121.   else
  1122.     {
  1123.       nbr = rn->info = ospf_nbr_new (oi);
  1124.       nbr->state = NSM_Down;
  1125.       nbr->src = nbr_nbma->addr;
  1126.       nbr->nbr_nbma = nbr_nbma;
  1127.       nbr->priority = nbr_nbma->priority;
  1128.       nbr->address = p;
  1129.       nbr_nbma->nbr = nbr;
  1130.       OSPF_NSM_EVENT_EXECUTE (nbr, NSM_Start);
  1131.     }
  1132. }
  1133. void
  1134. ospf_nbr_nbma_if_update (struct ospf *ospf, struct ospf_interface *oi)
  1135. {
  1136.   struct ospf_nbr_nbma *nbr_nbma;
  1137.   struct route_node *rn;
  1138.   struct prefix_ipv4 p;
  1139.   if (oi->type != OSPF_IFTYPE_NBMA)
  1140.     return;
  1141.   for (rn = route_top (ospf->nbr_nbma); rn; rn = route_next (rn))
  1142.     if ((nbr_nbma = rn->info))
  1143.       if (nbr_nbma->oi == NULL && nbr_nbma->nbr == NULL)
  1144. {
  1145.   p.family = AF_INET;
  1146.   p.prefix = nbr_nbma->addr;
  1147.   p.prefixlen = IPV4_MAX_BITLEN;
  1148.   if (prefix_match (oi->address, (struct prefix *)&p))
  1149.     ospf_nbr_nbma_add (nbr_nbma, oi);
  1150. }
  1151. }
  1152. struct ospf_nbr_nbma *
  1153. ospf_nbr_nbma_lookup (struct ospf *ospf, struct in_addr nbr_addr)
  1154. {
  1155.   struct route_node *rn;
  1156.   struct prefix_ipv4 p;
  1157.   p.family = AF_INET;
  1158.   p.prefix = nbr_addr;
  1159.   p.prefixlen = IPV4_MAX_BITLEN;
  1160.   rn = route_node_lookup (ospf->nbr_nbma, (struct prefix *)&p);
  1161.   if (rn)
  1162.     {
  1163.       route_unlock_node (rn);
  1164.       return rn->info;
  1165.     }
  1166.   return NULL;
  1167. }
  1168. int
  1169. ospf_nbr_nbma_set (struct ospf *ospf, struct in_addr nbr_addr)
  1170. {
  1171.   struct ospf_nbr_nbma *nbr_nbma;
  1172.   struct ospf_interface *oi;
  1173.   struct prefix_ipv4 p;
  1174.   struct route_node *rn;
  1175.   listnode node;
  1176.   nbr_nbma = ospf_nbr_nbma_lookup (ospf, nbr_addr);
  1177.   if (nbr_nbma)
  1178.     return 0;
  1179.   nbr_nbma = ospf_nbr_nbma_new ();
  1180.   nbr_nbma->addr = nbr_addr;
  1181.   p.family = AF_INET;
  1182.   p.prefix = nbr_addr;
  1183.   p.prefixlen = IPV4_MAX_BITLEN;
  1184.   rn = route_node_get (ospf->nbr_nbma, (struct prefix *)&p);
  1185.   rn->info = nbr_nbma;
  1186.   for (node = listhead (ospf->oiflist); node; nextnode (node))
  1187.     {
  1188.       oi = getdata (node);
  1189.       if (oi->type == OSPF_IFTYPE_NBMA)
  1190. if (prefix_match (oi->address, (struct prefix *)&p))
  1191.   {
  1192.     ospf_nbr_nbma_add (nbr_nbma, oi);
  1193.     break;
  1194.   }
  1195.     }
  1196.   return 1;
  1197. }
  1198. int
  1199. ospf_nbr_nbma_unset (struct ospf *ospf, struct in_addr nbr_addr)
  1200. {
  1201.   struct ospf_nbr_nbma *nbr_nbma;
  1202.   nbr_nbma = ospf_nbr_nbma_lookup (ospf, nbr_addr);
  1203.   if (nbr_nbma == NULL)
  1204.     return 0;
  1205.   ospf_nbr_nbma_down (nbr_nbma);
  1206.   ospf_nbr_nbma_delete (ospf, nbr_nbma);
  1207.   return 1;
  1208. }
  1209. int
  1210. ospf_nbr_nbma_priority_set (struct ospf *ospf, struct in_addr nbr_addr,
  1211.     u_char priority)
  1212. {
  1213.   struct ospf_nbr_nbma *nbr_nbma;
  1214.   nbr_nbma = ospf_nbr_nbma_lookup (ospf, nbr_addr);
  1215.   if (nbr_nbma == NULL)
  1216.     return 0;
  1217.   if (nbr_nbma->priority != priority)
  1218.     nbr_nbma->priority = priority;
  1219.   return 1;
  1220. }
  1221. int
  1222. ospf_nbr_nbma_priority_unset (struct ospf *ospf, struct in_addr nbr_addr)
  1223. {
  1224.   struct ospf_nbr_nbma *nbr_nbma;
  1225.   nbr_nbma = ospf_nbr_nbma_lookup (ospf, nbr_addr);
  1226.   if (nbr_nbma == NULL)
  1227.     return 0;
  1228.   if (nbr_nbma != OSPF_NEIGHBOR_PRIORITY_DEFAULT)
  1229.     nbr_nbma->priority = OSPF_NEIGHBOR_PRIORITY_DEFAULT;
  1230.   return 1;
  1231. }
  1232. int
  1233. ospf_nbr_nbma_poll_interval_set (struct ospf *ospf, struct in_addr nbr_addr,
  1234.  int interval)
  1235. {
  1236.   struct ospf_nbr_nbma *nbr_nbma;
  1237.   nbr_nbma = ospf_nbr_nbma_lookup (ospf, nbr_addr);
  1238.   if (nbr_nbma == NULL)
  1239.     return 0;
  1240.   if (nbr_nbma->v_poll != interval)
  1241.     {
  1242.       nbr_nbma->v_poll = interval;
  1243.       if (nbr_nbma->oi && ospf_if_is_up (nbr_nbma->oi))
  1244. {
  1245.   OSPF_TIMER_OFF (nbr_nbma->t_poll);
  1246.   OSPF_POLL_TIMER_ON (nbr_nbma->t_poll, ospf_poll_timer,
  1247.       nbr_nbma->v_poll);
  1248. }
  1249.     }
  1250.   return 1;
  1251. }
  1252. int
  1253. ospf_nbr_nbma_poll_interval_unset (struct ospf *ospf, struct in_addr addr)
  1254. {
  1255.   struct ospf_nbr_nbma *nbr_nbma;
  1256.   nbr_nbma = ospf_nbr_nbma_lookup (ospf, addr);
  1257.   if (nbr_nbma == NULL)
  1258.     return 0;
  1259.   if (nbr_nbma->v_poll != OSPF_POLL_INTERVAL_DEFAULT)
  1260.     nbr_nbma->v_poll = OSPF_POLL_INTERVAL_DEFAULT;
  1261.   return 1;
  1262. }
  1263. void
  1264. ospf_prefix_list_update (struct prefix_list *plist)
  1265. {
  1266.   struct ospf *ospf;
  1267.   struct ospf_area *area;
  1268.   listnode node;
  1269.   int abr_inv = 0;
  1270.   /* If OSPF instatnce does not exist, return right now. */
  1271.   ospf = ospf_lookup ();
  1272.   if (ospf == NULL)
  1273.     return;
  1274.   /* Update Area prefix-list. */
  1275.   for (node = listhead (ospf->areas); node; nextnode (node))
  1276.     {
  1277.       area = getdata (node);
  1278.       /* Update filter-list in. */
  1279.       if (PREFIX_NAME_IN (area))
  1280. if (strcmp (PREFIX_NAME_IN (area), plist->name) == 0)
  1281.   {
  1282.     PREFIX_LIST_IN (area) = 
  1283.       prefix_list_lookup (AFI_IP, PREFIX_NAME_IN (area));
  1284.     abr_inv++;
  1285.   }
  1286.       /* Update filter-list out. */
  1287.       if (PREFIX_NAME_OUT (area))
  1288. if (strcmp (PREFIX_NAME_OUT (area), plist->name) == 0)
  1289.   {
  1290.     PREFIX_LIST_IN (area) = 
  1291.       prefix_list_lookup (AFI_IP, PREFIX_NAME_OUT (area));
  1292.     abr_inv++;
  1293.   }
  1294.     }
  1295.   /* Schedule ABR tasks. */
  1296.   if (IS_OSPF_ABR (ospf) && abr_inv)
  1297.     ospf_schedule_abr_task (ospf);
  1298. }
  1299. void
  1300. ospf_master_init ()
  1301. {
  1302.   memset (&ospf_master, 0, sizeof (struct ospf_master));
  1303.   om = &ospf_master;
  1304.   om->ospf = list_new ();
  1305.   om->master = thread_master_create ();
  1306.   om->start_time = time (NULL);
  1307. }
  1308. void
  1309. ospf_init ()
  1310. {
  1311.   prefix_list_add_hook (ospf_prefix_list_update);
  1312.   prefix_list_delete_hook (ospf_prefix_list_update);
  1313. }