ospfd: Tighten up the connected check for redistribution
[jleu-quagga.git] / ospfd / ospfd.c
blobb86986b5686bcb9ca0b51ff955c30d9a4363e5b9
1 /* OSPF version 2 daemon program.
2 Copyright (C) 1999, 2000 Toshiaki Takada
4 This file is part of GNU Zebra.
6 GNU Zebra is free software; you can redistribute it and/or modify it
7 under the terms of the GNU General Public License as published by the
8 Free Software Foundation; either version 2, or (at your option) any
9 later version.
11 GNU Zebra is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU Zebra; see the file COPYING. If not, write to the Free
18 Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
19 02111-1307, USA. */
21 #include <zebra.h>
23 #include "thread.h"
24 #include "vty.h"
25 #include "command.h"
26 #include "linklist.h"
27 #include "prefix.h"
28 #include "table.h"
29 #include "if.h"
30 #include "memory.h"
31 #include "stream.h"
32 #include "log.h"
33 #include "sockunion.h" /* for inet_aton () */
34 #include "zclient.h"
35 #include "plist.h"
36 #include "sockopt.h"
38 #include "ospfd/ospfd.h"
39 #include "ospfd/ospf_network.h"
40 #include "ospfd/ospf_interface.h"
41 #include "ospfd/ospf_ism.h"
42 #include "ospfd/ospf_asbr.h"
43 #include "ospfd/ospf_lsa.h"
44 #include "ospfd/ospf_lsdb.h"
45 #include "ospfd/ospf_neighbor.h"
46 #include "ospfd/ospf_nsm.h"
47 #include "ospfd/ospf_spf.h"
48 #include "ospfd/ospf_packet.h"
49 #include "ospfd/ospf_dump.h"
50 #include "ospfd/ospf_zebra.h"
51 #include "ospfd/ospf_abr.h"
52 #include "ospfd/ospf_flood.h"
53 #include "ospfd/ospf_route.h"
54 #include "ospfd/ospf_ase.h"
58 /* OSPF process wide configuration. */
59 static struct ospf_master ospf_master;
61 /* OSPF process wide configuration pointer to export. */
62 struct ospf_master *om;
64 extern struct zclient *zclient;
65 extern struct in_addr router_id_zebra;
68 static void ospf_remove_vls_through_area (struct ospf *, struct ospf_area *);
69 static void ospf_network_free (struct ospf *, struct ospf_network *);
70 static void ospf_area_free (struct ospf_area *);
71 static void ospf_network_run (struct prefix *, struct ospf_area *);
72 static void ospf_network_run_interface (struct prefix *, struct ospf_area *,
73 struct interface *);
74 static void ospf_finish_final (struct ospf *);
76 #define OSPF_EXTERNAL_LSA_ORIGINATE_DELAY 1
78 void
79 ospf_router_id_update (struct ospf *ospf)
81 struct in_addr router_id, router_id_old;
82 struct ospf_interface *oi;
83 struct interface *ifp;
84 struct listnode *node;
86 if (IS_DEBUG_OSPF_EVENT)
87 zlog_debug ("Router-ID[OLD:%s]: Update", inet_ntoa (ospf->router_id));
89 router_id_old = ospf->router_id;
91 /* Select the router ID based on these priorities:
92 1. Statically assigned router ID is always the first choice.
93 2. If there is no statically assigned router ID, then try to stick
94 with the most recent value, since changing router ID's is very
95 disruptive.
96 3. Last choice: just go with whatever the zebra daemon recommends.
98 if (ospf->router_id_static.s_addr != 0)
99 router_id = ospf->router_id_static;
100 else if (ospf->router_id.s_addr != 0)
101 router_id = ospf->router_id;
102 else
103 router_id = router_id_zebra;
105 ospf->router_id = router_id;
107 if (IS_DEBUG_OSPF_EVENT)
108 zlog_debug ("Router-ID[NEW:%s]: Update", inet_ntoa (ospf->router_id));
110 if (!IPV4_ADDR_SAME (&router_id_old, &router_id))
112 for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
113 /* Update self-neighbor's router_id. */
114 oi->nbr_self->router_id = router_id;
116 /* If AS-external-LSA is queued, then flush those LSAs. */
117 if (router_id_old.s_addr == 0 && ospf->external_origin)
119 int type;
120 /* Originate each redistributed external route. */
121 for (type = 0; type < ZEBRA_ROUTE_MAX; type++)
122 if (ospf->external_origin & (1 << type))
123 thread_add_event (master, ospf_external_lsa_originate_timer,
124 ospf, type);
125 /* Originate Deafult. */
126 if (ospf->external_origin & (1 << ZEBRA_ROUTE_MAX))
127 thread_add_event (master, ospf_default_originate_timer, ospf, 0);
129 ospf->external_origin = 0;
132 OSPF_TIMER_ON (ospf->t_router_lsa_update,
133 ospf_router_lsa_update_timer, OSPF_LSA_UPDATE_DELAY);
135 /* update ospf_interface's */
136 for (ALL_LIST_ELEMENTS_RO (om->iflist, node, ifp))
137 ospf_if_update (ospf, ifp);
141 /* For OSPF area sort by area id. */
142 static int
143 ospf_area_id_cmp (struct ospf_area *a1, struct ospf_area *a2)
145 if (ntohl (a1->area_id.s_addr) > ntohl (a2->area_id.s_addr))
146 return 1;
147 if (ntohl (a1->area_id.s_addr) < ntohl (a2->area_id.s_addr))
148 return -1;
149 return 0;
152 /* Allocate new ospf structure. */
153 static struct ospf *
154 ospf_new (void)
156 int i;
158 struct ospf *new = XCALLOC (MTYPE_OSPF_TOP, sizeof (struct ospf));
160 new->router_id.s_addr = htonl (0);
161 new->router_id_static.s_addr = htonl (0);
163 new->abr_type = OSPF_ABR_DEFAULT;
164 new->oiflist = list_new ();
165 new->vlinks = list_new ();
166 new->areas = list_new ();
167 new->areas->cmp = (int (*)(void *, void *)) ospf_area_id_cmp;
168 new->networks = route_table_init ();
169 new->nbr_nbma = route_table_init ();
171 new->lsdb = ospf_lsdb_new ();
173 new->default_originate = DEFAULT_ORIGINATE_NONE;
175 new->passive_interface_default = OSPF_IF_ACTIVE;
177 new->new_external_route = route_table_init ();
178 new->old_external_route = route_table_init ();
179 new->external_lsas = route_table_init ();
181 new->stub_router_startup_time = OSPF_STUB_ROUTER_UNCONFIGURED;
182 new->stub_router_shutdown_time = OSPF_STUB_ROUTER_UNCONFIGURED;
184 /* Distribute parameter init. */
185 for (i = 0; i <= ZEBRA_ROUTE_MAX; i++)
187 new->dmetric[i].type = -1;
188 new->dmetric[i].value = -1;
190 new->default_metric = -1;
191 new->ref_bandwidth = OSPF_DEFAULT_REF_BANDWIDTH;
193 /* SPF timer value init. */
194 new->spf_delay = OSPF_SPF_DELAY_DEFAULT;
195 new->spf_holdtime = OSPF_SPF_HOLDTIME_DEFAULT;
196 new->spf_max_holdtime = OSPF_SPF_MAX_HOLDTIME_DEFAULT;
197 new->spf_hold_multiplier = 1;
199 /* MaxAge init. */
200 new->maxage_lsa = list_new ();
201 new->t_maxage_walker =
202 thread_add_timer (master, ospf_lsa_maxage_walker,
203 new, OSPF_LSA_MAXAGE_CHECK_INTERVAL);
205 /* Distance table init. */
206 new->distance_table = route_table_init ();
208 new->lsa_refresh_queue.index = 0;
209 new->lsa_refresh_interval = OSPF_LSA_REFRESH_INTERVAL_DEFAULT;
210 new->t_lsa_refresher = thread_add_timer (master, ospf_lsa_refresh_walker,
211 new, new->lsa_refresh_interval);
212 new->lsa_refresher_started = quagga_time (NULL);
214 if ((new->fd = ospf_sock_init()) < 0)
216 zlog_err("ospf_new: fatal error: ospf_sock_init was unable to open "
217 "a socket");
218 exit(1);
220 new->maxsndbuflen = getsockopt_so_sendbuf (new->fd);
221 if (IS_DEBUG_OSPF (zebra, ZEBRA_INTERFACE))
222 zlog_debug ("%s: starting with OSPF send buffer size %d",
223 __func__, new->maxsndbuflen);
224 if ((new->ibuf = stream_new(OSPF_MAX_PACKET_SIZE+1)) == NULL)
226 zlog_err("ospf_new: fatal error: stream_new(%u) failed allocating ibuf",
227 OSPF_MAX_PACKET_SIZE+1);
228 exit(1);
230 new->t_read = thread_add_read (master, ospf_read, new, new->fd);
231 new->oi_write_q = list_new ();
233 return new;
236 struct ospf *
237 ospf_lookup ()
239 if (listcount (om->ospf) == 0)
240 return NULL;
242 return listgetdata (listhead (om->ospf));
245 static void
246 ospf_add (struct ospf *ospf)
248 listnode_add (om->ospf, ospf);
251 static void
252 ospf_delete (struct ospf *ospf)
254 listnode_delete (om->ospf, ospf);
257 struct ospf *
258 ospf_get ()
260 struct ospf *ospf;
262 ospf = ospf_lookup ();
263 if (ospf == NULL)
265 ospf = ospf_new ();
266 ospf_add (ospf);
268 if (ospf->router_id_static.s_addr == 0)
269 ospf_router_id_update (ospf);
271 #ifdef HAVE_OPAQUE_LSA
272 ospf_opaque_type11_lsa_init (ospf);
273 #endif /* HAVE_OPAQUE_LSA */
276 return ospf;
279 /* Handle the second half of deferred shutdown. This is called either
280 * from the deferred-shutdown timer thread, or directly through
281 * ospf_deferred_shutdown_check.
283 * Function is to cleanup G-R state, if required then call ospf_finish_final
284 * to complete shutdown of this ospf instance. Possibly exit if the
285 * whole process is being shutdown and this was the last OSPF instance.
287 static void
288 ospf_deferred_shutdown_finish (struct ospf *ospf)
290 ospf->stub_router_shutdown_time = OSPF_STUB_ROUTER_UNCONFIGURED;
291 OSPF_TIMER_OFF (ospf->t_deferred_shutdown);
293 ospf_finish_final (ospf);
295 /* *ospf is now invalid */
297 /* ospfd being shut-down? If so, was this the last ospf instance? */
298 if (CHECK_FLAG (om->options, OSPF_MASTER_SHUTDOWN)
299 && (listcount (om->ospf) == 0))
300 exit (0);
302 return;
305 /* Timer thread for G-R */
306 static int
307 ospf_deferred_shutdown_timer (struct thread *t)
309 struct ospf *ospf = THREAD_ARG(t);
311 ospf_deferred_shutdown_finish (ospf);
313 return 0;
316 /* Check whether deferred-shutdown must be scheduled, otherwise call
317 * down directly into second-half of instance shutdown.
319 static void
320 ospf_deferred_shutdown_check (struct ospf *ospf)
322 unsigned long timeout;
323 struct listnode *ln;
324 struct ospf_area *area;
326 /* deferred shutdown already running? */
327 if (ospf->t_deferred_shutdown)
328 return;
330 /* Should we try push out max-metric LSAs? */
331 if (ospf->stub_router_shutdown_time != OSPF_STUB_ROUTER_UNCONFIGURED)
333 for (ALL_LIST_ELEMENTS_RO (ospf->areas, ln, area))
335 SET_FLAG (area->stub_router_state, OSPF_AREA_ADMIN_STUB_ROUTED);
337 if (!CHECK_FLAG (area->stub_router_state, OSPF_AREA_IS_STUB_ROUTED))
338 ospf_router_lsa_timer_add (area);
340 timeout = ospf->stub_router_shutdown_time;
342 else
344 /* No timer needed */
345 ospf_deferred_shutdown_finish (ospf);
346 return;
349 OSPF_TIMER_ON (ospf->t_deferred_shutdown, ospf_deferred_shutdown_timer,
350 timeout);
351 return;
354 /* Shut down the entire process */
355 void
356 ospf_terminate (void)
358 struct ospf *ospf;
359 struct listnode *node, *nnode;
361 /* shutdown already in progress */
362 if (CHECK_FLAG (om->options, OSPF_MASTER_SHUTDOWN))
363 return;
365 SET_FLAG (om->options, OSPF_MASTER_SHUTDOWN);
367 /* exit immediately if OSPF not actually running */
368 if (listcount(om->ospf) == 0)
369 exit(0);
371 for (ALL_LIST_ELEMENTS (om->ospf, node, nnode, ospf))
372 ospf_finish (ospf);
374 /* Deliberately go back up, hopefully to thread scheduler, as
375 * One or more ospf_finish()'s may have deferred shutdown to a timer
376 * thread
380 void
381 ospf_finish (struct ospf *ospf)
383 /* let deferred shutdown decide */
384 ospf_deferred_shutdown_check (ospf);
386 /* if ospf_deferred_shutdown returns, then ospf_finish_final is
387 * deferred to expiry of G-S timer thread. Return back up, hopefully
388 * to thread scheduler.
390 return;
393 /* Final cleanup of ospf instance */
394 static void
395 ospf_finish_final (struct ospf *ospf)
397 struct route_node *rn;
398 struct ospf_nbr_nbma *nbr_nbma;
399 struct ospf_lsa *lsa;
400 struct ospf_interface *oi;
401 struct ospf_area *area;
402 struct ospf_vl_data *vl_data;
403 struct listnode *node, *nnode;
404 int i;
406 #ifdef HAVE_OPAQUE_LSA
407 ospf_opaque_type11_lsa_term (ospf);
408 #endif /* HAVE_OPAQUE_LSA */
410 /* be nice if this worked, but it doesn't */
411 /*ospf_flush_self_originated_lsas_now (ospf);*/
413 /* Unregister redistribution */
414 for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
415 ospf_redistribute_unset (ospf, i);
416 ospf_redistribute_default_unset (ospf);
418 for (ALL_LIST_ELEMENTS (ospf->areas, node, nnode, area))
419 ospf_remove_vls_through_area (ospf, area);
421 for (ALL_LIST_ELEMENTS (ospf->vlinks, node, nnode, vl_data))
422 ospf_vl_delete (ospf, vl_data);
424 list_delete (ospf->vlinks);
426 /* Reset interface. */
427 for (ALL_LIST_ELEMENTS (ospf->oiflist, node, nnode, oi))
428 ospf_if_free (oi);
430 /* Clear static neighbors */
431 for (rn = route_top (ospf->nbr_nbma); rn; rn = route_next (rn))
432 if ((nbr_nbma = rn->info))
434 OSPF_POLL_TIMER_OFF (nbr_nbma->t_poll);
436 if (nbr_nbma->nbr)
438 nbr_nbma->nbr->nbr_nbma = NULL;
439 nbr_nbma->nbr = NULL;
442 if (nbr_nbma->oi)
444 listnode_delete (nbr_nbma->oi->nbr_nbma, nbr_nbma);
445 nbr_nbma->oi = NULL;
448 XFREE (MTYPE_OSPF_NEIGHBOR_STATIC, nbr_nbma);
451 route_table_finish (ospf->nbr_nbma);
453 /* Clear networks and Areas. */
454 for (rn = route_top (ospf->networks); rn; rn = route_next (rn))
456 struct ospf_network *network;
458 if ((network = rn->info) != NULL)
460 ospf_network_free (ospf, network);
461 rn->info = NULL;
462 route_unlock_node (rn);
466 for (ALL_LIST_ELEMENTS (ospf->areas, node, nnode, area))
468 listnode_delete (ospf->areas, area);
469 ospf_area_free (area);
472 /* Cancel all timers. */
473 OSPF_TIMER_OFF (ospf->t_external_lsa);
474 OSPF_TIMER_OFF (ospf->t_router_lsa_update);
475 OSPF_TIMER_OFF (ospf->t_spf_calc);
476 OSPF_TIMER_OFF (ospf->t_ase_calc);
477 OSPF_TIMER_OFF (ospf->t_maxage);
478 OSPF_TIMER_OFF (ospf->t_maxage_walker);
479 OSPF_TIMER_OFF (ospf->t_abr_task);
480 OSPF_TIMER_OFF (ospf->t_asbr_check);
481 OSPF_TIMER_OFF (ospf->t_distribute_update);
482 OSPF_TIMER_OFF (ospf->t_lsa_refresher);
483 OSPF_TIMER_OFF (ospf->t_read);
484 OSPF_TIMER_OFF (ospf->t_write);
485 #ifdef HAVE_OPAQUE_LSA
486 OSPF_TIMER_OFF (ospf->t_opaque_lsa_self);
487 #endif
489 close (ospf->fd);
490 stream_free(ospf->ibuf);
492 #ifdef HAVE_OPAQUE_LSA
493 LSDB_LOOP (OPAQUE_AS_LSDB (ospf), rn, lsa)
494 ospf_discard_from_db (ospf, ospf->lsdb, lsa);
495 #endif /* HAVE_OPAQUE_LSA */
496 LSDB_LOOP (EXTERNAL_LSDB (ospf), rn, lsa)
497 ospf_discard_from_db (ospf, ospf->lsdb, lsa);
499 ospf_lsdb_delete_all (ospf->lsdb);
500 ospf_lsdb_free (ospf->lsdb);
502 for (ALL_LIST_ELEMENTS (ospf->maxage_lsa, node, nnode, lsa))
503 ospf_lsa_unlock (&lsa); /* maxage_lsa */
505 list_delete (ospf->maxage_lsa);
507 if (ospf->old_table)
508 ospf_route_table_free (ospf->old_table);
509 if (ospf->new_table)
511 ospf_route_delete (ospf->new_table);
512 ospf_route_table_free (ospf->new_table);
514 if (ospf->old_rtrs)
515 ospf_rtrs_free (ospf->old_rtrs);
516 if (ospf->new_rtrs)
517 ospf_rtrs_free (ospf->new_rtrs);
518 if (ospf->new_external_route)
520 ospf_route_delete (ospf->new_external_route);
521 ospf_route_table_free (ospf->new_external_route);
523 if (ospf->old_external_route)
525 ospf_route_delete (ospf->old_external_route);
526 ospf_route_table_free (ospf->old_external_route);
528 if (ospf->external_lsas)
530 ospf_ase_external_lsas_finish (ospf->external_lsas);
533 list_delete (ospf->areas);
535 for (i = ZEBRA_ROUTE_SYSTEM; i <= ZEBRA_ROUTE_MAX; i++)
536 if (EXTERNAL_INFO (i) != NULL)
537 for (rn = route_top (EXTERNAL_INFO (i)); rn; rn = route_next (rn))
539 if (rn->info == NULL)
540 continue;
542 XFREE (MTYPE_OSPF_EXTERNAL_INFO, rn->info);
543 rn->info = NULL;
544 route_unlock_node (rn);
547 ospf_distance_reset (ospf);
548 route_table_finish (ospf->distance_table);
550 ospf_delete (ospf);
552 XFREE (MTYPE_OSPF_TOP, ospf);
556 /* allocate new OSPF Area object */
557 static struct ospf_area *
558 ospf_area_new (struct ospf *ospf, struct in_addr area_id)
560 struct ospf_area *new;
562 /* Allocate new config_network. */
563 new = XCALLOC (MTYPE_OSPF_AREA, sizeof (struct ospf_area));
565 new->ospf = ospf;
567 new->area_id = area_id;
569 new->external_routing = OSPF_AREA_DEFAULT;
570 new->default_cost = 1;
571 new->auth_type = OSPF_AUTH_NULL;
573 /* New LSDB init. */
574 new->lsdb = ospf_lsdb_new ();
576 /* Self-originated LSAs initialize. */
577 new->router_lsa_self = NULL;
579 #ifdef HAVE_OPAQUE_LSA
580 ospf_opaque_type10_lsa_init (new);
581 #endif /* HAVE_OPAQUE_LSA */
583 new->oiflist = list_new ();
584 new->ranges = route_table_init ();
586 if (area_id.s_addr == OSPF_AREA_BACKBONE)
587 ospf->backbone = new;
589 return new;
592 void
593 ospf_area_free (struct ospf_area *area)
595 struct route_node *rn;
596 struct ospf_lsa *lsa;
598 /* Free LSDBs. */
599 LSDB_LOOP (ROUTER_LSDB (area), rn, lsa)
600 ospf_discard_from_db (area->ospf, area->lsdb, lsa);
601 LSDB_LOOP (NETWORK_LSDB (area), rn, lsa)
602 ospf_discard_from_db (area->ospf, area->lsdb, lsa);
603 LSDB_LOOP (SUMMARY_LSDB (area), rn, lsa)
604 ospf_discard_from_db (area->ospf, area->lsdb, lsa);
605 LSDB_LOOP (ASBR_SUMMARY_LSDB (area), rn, lsa)
606 ospf_discard_from_db (area->ospf, area->lsdb, lsa);
608 LSDB_LOOP (NSSA_LSDB (area), rn, lsa)
609 ospf_discard_from_db (area->ospf, area->lsdb, lsa);
610 #ifdef HAVE_OPAQUE_LSA
611 LSDB_LOOP (OPAQUE_AREA_LSDB (area), rn, lsa)
612 ospf_discard_from_db (area->ospf, area->lsdb, lsa);
613 LSDB_LOOP (OPAQUE_LINK_LSDB (area), rn, lsa)
614 ospf_discard_from_db (area->ospf, area->lsdb, lsa);
615 #endif /* HAVE_OPAQUE_LSA */
617 ospf_lsdb_delete_all (area->lsdb);
618 ospf_lsdb_free (area->lsdb);
620 ospf_lsa_unlock (&area->router_lsa_self);
622 route_table_finish (area->ranges);
623 list_delete (area->oiflist);
625 if (EXPORT_NAME (area))
626 free (EXPORT_NAME (area));
628 if (IMPORT_NAME (area))
629 free (IMPORT_NAME (area));
631 /* Cancel timer. */
632 OSPF_TIMER_OFF (area->t_router_lsa_self);
633 OSPF_TIMER_OFF (area->t_stub_router);
634 #ifdef HAVE_OPAQUE_LSA
635 OSPF_TIMER_OFF (area->t_opaque_lsa_self);
636 #endif /* HAVE_OPAQUE_LSA */
638 if (OSPF_IS_AREA_BACKBONE (area))
639 area->ospf->backbone = NULL;
641 XFREE (MTYPE_OSPF_AREA, area);
644 void
645 ospf_area_check_free (struct ospf *ospf, struct in_addr area_id)
647 struct ospf_area *area;
649 area = ospf_area_lookup_by_area_id (ospf, area_id);
650 if (area &&
651 listcount (area->oiflist) == 0 &&
652 area->ranges->top == NULL &&
653 area->shortcut_configured == OSPF_SHORTCUT_DEFAULT &&
654 area->external_routing == OSPF_AREA_DEFAULT &&
655 area->no_summary == 0 &&
656 area->default_cost == 1 &&
657 EXPORT_NAME (area) == NULL &&
658 IMPORT_NAME (area) == NULL &&
659 area->auth_type == OSPF_AUTH_NULL)
661 listnode_delete (ospf->areas, area);
662 ospf_area_free (area);
666 struct ospf_area *
667 ospf_area_get (struct ospf *ospf, struct in_addr area_id, int format)
669 struct ospf_area *area;
671 area = ospf_area_lookup_by_area_id (ospf, area_id);
672 if (!area)
674 area = ospf_area_new (ospf, area_id);
675 area->format = format;
676 listnode_add_sort (ospf->areas, area);
677 ospf_check_abr_status (ospf);
680 return area;
683 struct ospf_area *
684 ospf_area_lookup_by_area_id (struct ospf *ospf, struct in_addr area_id)
686 struct ospf_area *area;
687 struct listnode *node;
689 for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
690 if (IPV4_ADDR_SAME (&area->area_id, &area_id))
691 return area;
693 return NULL;
696 void
697 ospf_area_add_if (struct ospf_area *area, struct ospf_interface *oi)
699 listnode_add (area->oiflist, oi);
702 void
703 ospf_area_del_if (struct ospf_area *area, struct ospf_interface *oi)
705 listnode_delete (area->oiflist, oi);
709 /* Config network statement related functions. */
710 static struct ospf_network *
711 ospf_network_new (struct in_addr area_id, int format)
713 struct ospf_network *new;
714 new = XCALLOC (MTYPE_OSPF_NETWORK, sizeof (struct ospf_network));
716 new->area_id = area_id;
717 new->format = format;
719 return new;
722 void
723 ospf_network_free (struct ospf *ospf, struct ospf_network *network)
725 ospf_area_check_free (ospf, network->area_id);
726 ospf_schedule_abr_task (ospf);
727 XFREE (MTYPE_OSPF_NETWORK, network);
731 ospf_network_set (struct ospf *ospf, struct prefix_ipv4 *p,
732 struct in_addr area_id)
734 struct ospf_network *network;
735 struct ospf_area *area;
736 struct route_node *rn;
737 struct external_info *ei;
738 int ret = OSPF_AREA_ID_FORMAT_ADDRESS;
740 rn = route_node_get (ospf->networks, (struct prefix *)p);
741 if (rn->info)
743 /* There is already same network statement. */
744 route_unlock_node (rn);
745 return 0;
748 rn->info = network = ospf_network_new (area_id, ret);
749 area = ospf_area_get (ospf, area_id, ret);
751 /* Run network config now. */
752 ospf_network_run ((struct prefix *)p, area);
754 /* Update connected redistribute. */
755 if (ospf_is_type_redistributed (ZEBRA_ROUTE_CONNECT))
756 if (EXTERNAL_INFO (ZEBRA_ROUTE_CONNECT))
757 for (rn = route_top (EXTERNAL_INFO (ZEBRA_ROUTE_CONNECT));
758 rn; rn = route_next (rn))
759 if ((ei = rn->info) != NULL)
760 if (ospf_external_info_find_lsa (ospf, &ei->p))
761 if (!ospf_distribute_check_connected (ospf, ei))
762 ospf_external_lsa_flush (ospf, ei->type, &ei->p,
763 ei->ifindex /*, ei->nexthop */);
765 ospf_area_check_free (ospf, area_id);
767 return 1;
771 ospf_network_unset (struct ospf *ospf, struct prefix_ipv4 *p,
772 struct in_addr area_id)
774 struct route_node *rn;
775 struct ospf_network *network;
776 struct external_info *ei;
777 struct listnode *node, *nnode;
778 struct ospf_interface *oi;
780 rn = route_node_lookup (ospf->networks, (struct prefix *)p);
781 if (rn == NULL)
782 return 0;
784 network = rn->info;
785 route_unlock_node (rn);
786 if (!IPV4_ADDR_SAME (&area_id, &network->area_id))
787 return 0;
789 ospf_network_free (ospf, rn->info);
790 rn->info = NULL;
791 route_unlock_node (rn); /* initial reference */
793 /* Find interfaces that not configured already. */
794 for (ALL_LIST_ELEMENTS (ospf->oiflist, node, nnode, oi))
796 int found = 0;
797 struct connected *co = oi->connected;
799 if (oi->type == OSPF_IFTYPE_VIRTUALLINK)
800 continue;
802 for (rn = route_top (ospf->networks); rn; rn = route_next (rn))
804 if (rn->info == NULL)
805 continue;
807 if (ospf_network_match_iface(co,&rn->p))
809 found = 1;
810 route_unlock_node (rn);
811 break;
815 if (found == 0)
816 ospf_if_free (oi);
819 /* Update connected redistribute. */
820 if (ospf_is_type_redistributed (ZEBRA_ROUTE_CONNECT))
821 if (EXTERNAL_INFO (ZEBRA_ROUTE_CONNECT))
822 for (rn = route_top (EXTERNAL_INFO (ZEBRA_ROUTE_CONNECT));
823 rn; rn = route_next (rn))
824 if ((ei = rn->info) != NULL)
825 if (!ospf_external_info_find_lsa (ospf, &ei->p))
826 if (ospf_distribute_check_connected (ospf, ei))
827 ospf_external_lsa_originate (ospf, ei);
829 return 1;
832 /* Check whether interface matches given network
833 * returns: 1, true. 0, false
835 int
836 ospf_network_match_iface(struct connected *co, struct prefix *net)
838 /* #define COMPATIBILITY_MODE */
839 /* The old code used to have a special case for PtP interfaces:
841 if (if_is_pointopoint (co->ifp) && co->destination &&
842 IPV4_ADDR_SAME ( &(co->destination->u.prefix4), &(net->u.prefix4)))
843 return 1;
845 The new approach is much more general. If a peer address is supplied,
846 then we are routing to that prefix, so that's the address to compare
847 against (not the local address, which may not be unique).
849 #ifndef COMPATIBILITY_MODE
850 /* new approach: more elegant and conceptually clean */
851 return prefix_match(net, CONNECTED_PREFIX(co));
852 #else /* COMPATIBILITY_MODE */
853 /* match old (strange?) behavior */
855 /* Behaviour to match both Cisco where:
856 * iface address lies within network specified -> ospf
857 * and zebra 0.9[2ish-3]:
858 * PtP special case: network specified == iface peer addr -> ospf
861 /* For PtP, match if peer address matches network address exactly.
862 * This can be addr/32 or addr/p for p < 32, but the addr must match
863 * exactly; this is not a test for falling within the prefix. This
864 * test is solely for compatibility with zebra.
866 if (CONNECTED_PEER(co) &&
867 IPV4_ADDR_SAME ( &(co->destination->u.prefix4), &(net->u.prefix4)))
868 return 1;
870 #if 0
871 /* Decline to accept PtP if dst address does not match the
872 * prefix. (ifdefed out because this is a workaround, not the
873 * desired behavior.) */
874 if (if_is_pointopoint (co->ifp) &&
875 ! prefix_match (net, co->destination))
876 return 0;
877 #endif
879 /* If the address is within the prefix, accept. Note that this
880 * applies to PtP as well as other types.
882 if (prefix_match (net, co->address))
883 return 1;
885 return 0; /* no match */
887 #endif /* COMPATIBILITY_MODE */
890 void
891 ospf_network_run_interface (struct prefix *p, struct ospf_area *area,
892 struct interface *ifp)
894 struct listnode *cnode;
895 struct connected *co;
897 if (memcmp (ifp->name, "VLINK", 5) == 0)
898 return;
900 /* if interface prefix is match specified prefix,
901 then create socket and join multicast group. */
902 for (ALL_LIST_ELEMENTS_RO (ifp->connected, cnode, co))
905 if (CHECK_FLAG(co->flags,ZEBRA_IFA_SECONDARY))
906 continue;
908 if (p->family == co->address->family
909 && ! ospf_if_table_lookup(ifp, co->address)
910 && ospf_network_match_iface(co,p))
912 struct ospf_interface *oi;
914 oi = ospf_if_new (area->ospf, ifp, co->address);
915 oi->connected = co;
917 oi->area = area;
919 oi->params = ospf_lookup_if_params (ifp, oi->address->u.prefix4);
920 oi->output_cost = ospf_if_get_output_cost (oi);
922 /* Add pseudo neighbor. */
923 ospf_nbr_add_self (oi);
925 /* Relate ospf interface to ospf instance. */
926 oi->ospf = area->ospf;
928 /* update network type as interface flag */
929 /* If network type is specified previously,
930 skip network type setting. */
931 oi->type = IF_DEF_PARAMS (ifp)->type;
933 ospf_area_add_if (oi->area, oi);
935 /* if router_id is not configured, dont bring up
936 * interfaces.
937 * ospf_router_id_update() will call ospf_if_update
938 * whenever r-id is configured instead.
940 if ((area->ospf->router_id.s_addr != 0)
941 && if_is_operative (ifp))
942 ospf_if_up (oi);
947 void
948 ospf_network_run (struct prefix *p, struct ospf_area *area)
950 struct interface *ifp;
951 struct listnode *node;
953 /* Schedule Router ID Update. */
954 if (area->ospf->router_id.s_addr == 0)
955 ospf_router_id_update (area->ospf);
957 /* Get target interface. */
958 for (ALL_LIST_ELEMENTS_RO (om->iflist, node, ifp))
959 ospf_network_run_interface (p, area, ifp);
962 void
963 ospf_ls_upd_queue_empty (struct ospf_interface *oi)
965 struct route_node *rn;
966 struct listnode *node, *nnode;
967 struct list *lst;
968 struct ospf_lsa *lsa;
970 /* empty ls update queue */
971 for (rn = route_top (oi->ls_upd_queue); rn;
972 rn = route_next (rn))
973 if ((lst = (struct list *) rn->info))
975 for (ALL_LIST_ELEMENTS (lst, node, nnode, lsa))
976 ospf_lsa_unlock (&lsa); /* oi->ls_upd_queue */
977 list_free (lst);
978 rn->info = NULL;
981 /* remove update event */
982 if (oi->t_ls_upd_event)
984 thread_cancel (oi->t_ls_upd_event);
985 oi->t_ls_upd_event = NULL;
989 void
990 ospf_if_update (struct ospf *ospf, struct interface *ifp)
992 struct route_node *rn;
993 struct ospf_network *network;
994 struct ospf_area *area;
996 if (!ospf)
997 ospf = ospf_lookup ();
999 /* OSPF must be on and Router-ID must be configured. */
1000 if (!ospf || ospf->router_id.s_addr == 0)
1001 return;
1003 /* Run each netowrk for this interface. */
1004 for (rn = route_top (ospf->networks); rn; rn = route_next (rn))
1005 if (rn->info != NULL)
1007 network = (struct ospf_network *) rn->info;
1008 area = ospf_area_get (ospf, network->area_id, network->format);
1009 ospf_network_run_interface (&rn->p, area, ifp);
1013 void
1014 ospf_remove_vls_through_area (struct ospf *ospf, struct ospf_area *area)
1016 struct listnode *node, *nnode;
1017 struct ospf_vl_data *vl_data;
1019 for (ALL_LIST_ELEMENTS (ospf->vlinks, node, nnode, vl_data))
1020 if (IPV4_ADDR_SAME (&vl_data->vl_area_id, &area->area_id))
1021 ospf_vl_delete (ospf, vl_data);
1025 static const struct message ospf_area_type_msg[] =
1027 { OSPF_AREA_DEFAULT, "Default" },
1028 { OSPF_AREA_STUB, "Stub" },
1029 { OSPF_AREA_NSSA, "NSSA" },
1031 static const int ospf_area_type_msg_max = OSPF_AREA_TYPE_MAX;
1033 static void
1034 ospf_area_type_set (struct ospf_area *area, int type)
1036 struct listnode *node;
1037 struct ospf_interface *oi;
1039 if (area->external_routing == type)
1041 if (IS_DEBUG_OSPF_EVENT)
1042 zlog_debug ("Area[%s]: Types are the same, ignored.",
1043 inet_ntoa (area->area_id));
1044 return;
1047 area->external_routing = type;
1049 if (IS_DEBUG_OSPF_EVENT)
1050 zlog_debug ("Area[%s]: Configured as %s", inet_ntoa (area->area_id),
1051 LOOKUP (ospf_area_type_msg, type));
1053 switch (area->external_routing)
1055 case OSPF_AREA_DEFAULT:
1056 for (ALL_LIST_ELEMENTS_RO (area->oiflist, node, oi))
1057 if (oi->nbr_self != NULL)
1059 UNSET_FLAG (oi->nbr_self->options, OSPF_OPTION_NP);
1060 SET_FLAG (oi->nbr_self->options, OSPF_OPTION_E);
1062 break;
1063 case OSPF_AREA_STUB:
1064 for (ALL_LIST_ELEMENTS_RO (area->oiflist, node, oi))
1065 if (oi->nbr_self != NULL)
1067 if (IS_DEBUG_OSPF_EVENT)
1068 zlog_debug ("setting options on %s accordingly", IF_NAME (oi));
1069 UNSET_FLAG (oi->nbr_self->options, OSPF_OPTION_NP);
1070 UNSET_FLAG (oi->nbr_self->options, OSPF_OPTION_E);
1071 if (IS_DEBUG_OSPF_EVENT)
1072 zlog_debug ("options set on %s: %x",
1073 IF_NAME (oi), OPTIONS (oi));
1075 break;
1076 case OSPF_AREA_NSSA:
1077 for (ALL_LIST_ELEMENTS_RO (area->oiflist, node, oi))
1078 if (oi->nbr_self != NULL)
1080 zlog_debug ("setting nssa options on %s accordingly", IF_NAME (oi));
1081 UNSET_FLAG (oi->nbr_self->options, OSPF_OPTION_E);
1082 SET_FLAG (oi->nbr_self->options, OSPF_OPTION_NP);
1083 zlog_debug ("options set on %s: %x", IF_NAME (oi), OPTIONS (oi));
1085 break;
1086 default:
1087 break;
1090 ospf_router_lsa_timer_add (area);
1091 ospf_schedule_abr_task (area->ospf);
1095 ospf_area_shortcut_set (struct ospf *ospf, struct ospf_area *area, int mode)
1097 if (area->shortcut_configured == mode)
1098 return 0;
1100 area->shortcut_configured = mode;
1101 ospf_router_lsa_timer_add (area);
1102 ospf_schedule_abr_task (ospf);
1104 ospf_area_check_free (ospf, area->area_id);
1106 return 1;
1110 ospf_area_shortcut_unset (struct ospf *ospf, struct ospf_area *area)
1112 area->shortcut_configured = OSPF_SHORTCUT_DEFAULT;
1113 ospf_router_lsa_timer_add (area);
1114 ospf_area_check_free (ospf, area->area_id);
1115 ospf_schedule_abr_task (ospf);
1117 return 1;
1120 static int
1121 ospf_area_vlink_count (struct ospf *ospf, struct ospf_area *area)
1123 struct ospf_vl_data *vl;
1124 struct listnode *node;
1125 int count = 0;
1127 for (ALL_LIST_ELEMENTS_RO (ospf->vlinks, node, vl))
1128 if (IPV4_ADDR_SAME (&vl->vl_area_id, &area->area_id))
1129 count++;
1131 return count;
1135 ospf_area_stub_set (struct ospf *ospf, struct in_addr area_id)
1137 struct ospf_area *area;
1138 int format = OSPF_AREA_ID_FORMAT_ADDRESS;
1140 area = ospf_area_get (ospf, area_id, format);
1141 if (ospf_area_vlink_count (ospf, area))
1142 return 0;
1144 if (area->external_routing != OSPF_AREA_STUB)
1145 ospf_area_type_set (area, OSPF_AREA_STUB);
1147 return 1;
1151 ospf_area_stub_unset (struct ospf *ospf, struct in_addr area_id)
1153 struct ospf_area *area;
1155 area = ospf_area_lookup_by_area_id (ospf, area_id);
1156 if (area == NULL)
1157 return 1;
1159 if (area->external_routing == OSPF_AREA_STUB)
1160 ospf_area_type_set (area, OSPF_AREA_DEFAULT);
1162 ospf_area_check_free (ospf, area_id);
1164 return 1;
1168 ospf_area_no_summary_set (struct ospf *ospf, struct in_addr area_id)
1170 struct ospf_area *area;
1171 int format = OSPF_AREA_ID_FORMAT_ADDRESS;
1173 area = ospf_area_get (ospf, area_id, format);
1174 area->no_summary = 1;
1176 return 1;
1180 ospf_area_no_summary_unset (struct ospf *ospf, struct in_addr area_id)
1182 struct ospf_area *area;
1184 area = ospf_area_lookup_by_area_id (ospf, area_id);
1185 if (area == NULL)
1186 return 0;
1188 area->no_summary = 0;
1189 ospf_area_check_free (ospf, area_id);
1191 return 1;
1195 ospf_area_nssa_set (struct ospf *ospf, struct in_addr area_id)
1197 struct ospf_area *area;
1198 int format = OSPF_AREA_ID_FORMAT_ADDRESS;
1200 area = ospf_area_get (ospf, area_id, format);
1201 if (ospf_area_vlink_count (ospf, area))
1202 return 0;
1204 if (area->external_routing != OSPF_AREA_NSSA)
1206 ospf_area_type_set (area, OSPF_AREA_NSSA);
1207 ospf->anyNSSA++;
1210 /* set NSSA area defaults */
1211 area->no_summary = 0;
1212 area->NSSATranslatorRole = OSPF_NSSA_ROLE_CANDIDATE;
1213 area->NSSATranslatorState = OSPF_NSSA_TRANSLATE_DISABLED;
1214 area->NSSATranslatorStabilityInterval = OSPF_NSSA_TRANS_STABLE_DEFAULT;
1216 return 1;
1220 ospf_area_nssa_unset (struct ospf *ospf, struct in_addr area_id)
1222 struct ospf_area *area;
1224 area = ospf_area_lookup_by_area_id (ospf, area_id);
1225 if (area == NULL)
1226 return 0;
1228 if (area->external_routing == OSPF_AREA_NSSA)
1230 ospf->anyNSSA--;
1231 ospf_area_type_set (area, OSPF_AREA_DEFAULT);
1234 ospf_area_check_free (ospf, area_id);
1236 return 1;
1240 ospf_area_nssa_translator_role_set (struct ospf *ospf, struct in_addr area_id,
1241 int role)
1243 struct ospf_area *area;
1245 area = ospf_area_lookup_by_area_id (ospf, area_id);
1246 if (area == NULL)
1247 return 0;
1249 area->NSSATranslatorRole = role;
1251 return 1;
1254 /* XXX: unused? Leave for symmetry? */
1255 static int
1256 ospf_area_nssa_translator_role_unset (struct ospf *ospf,
1257 struct in_addr area_id)
1259 struct ospf_area *area;
1261 area = ospf_area_lookup_by_area_id (ospf, area_id);
1262 if (area == NULL)
1263 return 0;
1265 area->NSSATranslatorRole = OSPF_NSSA_ROLE_CANDIDATE;
1267 ospf_area_check_free (ospf, area_id);
1269 return 1;
1273 ospf_area_export_list_set (struct ospf *ospf,
1274 struct ospf_area *area, const char *list_name)
1276 struct access_list *list;
1277 list = access_list_lookup (AFI_IP, list_name);
1279 EXPORT_LIST (area) = list;
1281 if (EXPORT_NAME (area))
1282 free (EXPORT_NAME (area));
1284 EXPORT_NAME (area) = strdup (list_name);
1285 ospf_schedule_abr_task (ospf);
1287 return 1;
1291 ospf_area_export_list_unset (struct ospf *ospf, struct ospf_area * area)
1294 EXPORT_LIST (area) = 0;
1296 if (EXPORT_NAME (area))
1297 free (EXPORT_NAME (area));
1299 EXPORT_NAME (area) = NULL;
1301 ospf_area_check_free (ospf, area->area_id);
1303 ospf_schedule_abr_task (ospf);
1305 return 1;
1309 ospf_area_import_list_set (struct ospf *ospf, struct ospf_area *area,
1310 const char *name)
1312 struct access_list *list;
1313 list = access_list_lookup (AFI_IP, name);
1315 IMPORT_LIST (area) = list;
1317 if (IMPORT_NAME (area))
1318 free (IMPORT_NAME (area));
1320 IMPORT_NAME (area) = strdup (name);
1321 ospf_schedule_abr_task (ospf);
1323 return 1;
1327 ospf_area_import_list_unset (struct ospf *ospf, struct ospf_area * area)
1329 IMPORT_LIST (area) = 0;
1331 if (IMPORT_NAME (area))
1332 free (IMPORT_NAME (area));
1334 IMPORT_NAME (area) = NULL;
1335 ospf_area_check_free (ospf, area->area_id);
1337 ospf_schedule_abr_task (ospf);
1339 return 1;
1343 ospf_timers_refresh_set (struct ospf *ospf, int interval)
1345 int time_left;
1347 if (ospf->lsa_refresh_interval == interval)
1348 return 1;
1350 time_left = ospf->lsa_refresh_interval -
1351 (quagga_time (NULL) - ospf->lsa_refresher_started);
1353 if (time_left > interval)
1355 OSPF_TIMER_OFF (ospf->t_lsa_refresher);
1356 ospf->t_lsa_refresher =
1357 thread_add_timer (master, ospf_lsa_refresh_walker, ospf, interval);
1359 ospf->lsa_refresh_interval = interval;
1361 return 1;
1365 ospf_timers_refresh_unset (struct ospf *ospf)
1367 int time_left;
1369 time_left = ospf->lsa_refresh_interval -
1370 (quagga_time (NULL) - ospf->lsa_refresher_started);
1372 if (time_left > OSPF_LSA_REFRESH_INTERVAL_DEFAULT)
1374 OSPF_TIMER_OFF (ospf->t_lsa_refresher);
1375 ospf->t_lsa_refresher =
1376 thread_add_timer (master, ospf_lsa_refresh_walker, ospf,
1377 OSPF_LSA_REFRESH_INTERVAL_DEFAULT);
1380 ospf->lsa_refresh_interval = OSPF_LSA_REFRESH_INTERVAL_DEFAULT;
1382 return 1;
1386 static struct ospf_nbr_nbma *
1387 ospf_nbr_nbma_new (void)
1389 struct ospf_nbr_nbma *nbr_nbma;
1391 nbr_nbma = XCALLOC (MTYPE_OSPF_NEIGHBOR_STATIC,
1392 sizeof (struct ospf_nbr_nbma));
1394 nbr_nbma->priority = OSPF_NEIGHBOR_PRIORITY_DEFAULT;
1395 nbr_nbma->v_poll = OSPF_POLL_INTERVAL_DEFAULT;
1397 return nbr_nbma;
1400 static void
1401 ospf_nbr_nbma_free (struct ospf_nbr_nbma *nbr_nbma)
1403 XFREE (MTYPE_OSPF_NEIGHBOR_STATIC, nbr_nbma);
1406 static void
1407 ospf_nbr_nbma_delete (struct ospf *ospf, struct ospf_nbr_nbma *nbr_nbma)
1409 struct route_node *rn;
1410 struct prefix_ipv4 p;
1412 p.family = AF_INET;
1413 p.prefix = nbr_nbma->addr;
1414 p.prefixlen = IPV4_MAX_BITLEN;
1416 rn = route_node_lookup (ospf->nbr_nbma, (struct prefix *)&p);
1417 if (rn)
1419 ospf_nbr_nbma_free (rn->info);
1420 rn->info = NULL;
1421 route_unlock_node (rn);
1422 route_unlock_node (rn);
1426 static void
1427 ospf_nbr_nbma_down (struct ospf_nbr_nbma *nbr_nbma)
1429 OSPF_TIMER_OFF (nbr_nbma->t_poll);
1431 if (nbr_nbma->nbr)
1433 nbr_nbma->nbr->nbr_nbma = NULL;
1434 OSPF_NSM_EVENT_EXECUTE (nbr_nbma->nbr, NSM_KillNbr);
1437 if (nbr_nbma->oi)
1438 listnode_delete (nbr_nbma->oi->nbr_nbma, nbr_nbma);
1441 static void
1442 ospf_nbr_nbma_add (struct ospf_nbr_nbma *nbr_nbma,
1443 struct ospf_interface *oi)
1445 struct ospf_neighbor *nbr;
1446 struct route_node *rn;
1447 struct prefix p;
1449 if (oi->type != OSPF_IFTYPE_NBMA)
1450 return;
1452 if (nbr_nbma->nbr != NULL)
1453 return;
1455 if (IPV4_ADDR_SAME (&oi->nbr_self->address.u.prefix4, &nbr_nbma->addr))
1456 return;
1458 nbr_nbma->oi = oi;
1459 listnode_add (oi->nbr_nbma, nbr_nbma);
1461 /* Get neighbor information from table. */
1462 p.family = AF_INET;
1463 p.prefixlen = IPV4_MAX_BITLEN;
1464 p.u.prefix4 = nbr_nbma->addr;
1466 rn = route_node_get (oi->nbrs, (struct prefix *)&p);
1467 if (rn->info)
1469 nbr = rn->info;
1470 nbr->nbr_nbma = nbr_nbma;
1471 nbr_nbma->nbr = nbr;
1473 route_unlock_node (rn);
1475 else
1477 nbr = rn->info = ospf_nbr_new (oi);
1478 nbr->state = NSM_Down;
1479 nbr->src = nbr_nbma->addr;
1480 nbr->nbr_nbma = nbr_nbma;
1481 nbr->priority = nbr_nbma->priority;
1482 nbr->address = p;
1484 nbr_nbma->nbr = nbr;
1486 OSPF_NSM_EVENT_EXECUTE (nbr, NSM_Start);
1490 void
1491 ospf_nbr_nbma_if_update (struct ospf *ospf, struct ospf_interface *oi)
1493 struct ospf_nbr_nbma *nbr_nbma;
1494 struct route_node *rn;
1495 struct prefix_ipv4 p;
1497 if (oi->type != OSPF_IFTYPE_NBMA)
1498 return;
1500 for (rn = route_top (ospf->nbr_nbma); rn; rn = route_next (rn))
1501 if ((nbr_nbma = rn->info))
1502 if (nbr_nbma->oi == NULL && nbr_nbma->nbr == NULL)
1504 p.family = AF_INET;
1505 p.prefix = nbr_nbma->addr;
1506 p.prefixlen = IPV4_MAX_BITLEN;
1508 if (prefix_match (oi->address, (struct prefix *)&p))
1509 ospf_nbr_nbma_add (nbr_nbma, oi);
1513 struct ospf_nbr_nbma *
1514 ospf_nbr_nbma_lookup (struct ospf *ospf, struct in_addr nbr_addr)
1516 struct route_node *rn;
1517 struct prefix_ipv4 p;
1519 p.family = AF_INET;
1520 p.prefix = nbr_addr;
1521 p.prefixlen = IPV4_MAX_BITLEN;
1523 rn = route_node_lookup (ospf->nbr_nbma, (struct prefix *)&p);
1524 if (rn)
1526 route_unlock_node (rn);
1527 return rn->info;
1529 return NULL;
1532 struct ospf_nbr_nbma *
1533 ospf_nbr_nbma_lookup_next (struct ospf *ospf, struct in_addr *addr, int first)
1535 #if 0
1536 struct ospf_nbr_nbma *nbr_nbma;
1537 struct listnode *node;
1538 #endif
1540 if (ospf == NULL)
1541 return NULL;
1543 #if 0
1544 for (ALL_LIST_ELEMENTS_RO (ospf->nbr_nbma, node, nbr_nbma))
1546 if (first)
1548 *addr = nbr_nbma->addr;
1549 return nbr_nbma;
1551 else if (ntohl (nbr_nbma->addr.s_addr) > ntohl (addr->s_addr))
1553 *addr = nbr_nbma->addr;
1554 return nbr_nbma;
1557 #endif
1558 return NULL;
1562 ospf_nbr_nbma_set (struct ospf *ospf, struct in_addr nbr_addr)
1564 struct ospf_nbr_nbma *nbr_nbma;
1565 struct ospf_interface *oi;
1566 struct prefix_ipv4 p;
1567 struct route_node *rn;
1568 struct listnode *node;
1570 nbr_nbma = ospf_nbr_nbma_lookup (ospf, nbr_addr);
1571 if (nbr_nbma)
1572 return 0;
1574 nbr_nbma = ospf_nbr_nbma_new ();
1575 nbr_nbma->addr = nbr_addr;
1577 p.family = AF_INET;
1578 p.prefix = nbr_addr;
1579 p.prefixlen = IPV4_MAX_BITLEN;
1581 rn = route_node_get (ospf->nbr_nbma, (struct prefix *)&p);
1582 rn->info = nbr_nbma;
1584 for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
1586 if (oi->type == OSPF_IFTYPE_NBMA)
1587 if (prefix_match (oi->address, (struct prefix *)&p))
1589 ospf_nbr_nbma_add (nbr_nbma, oi);
1590 break;
1594 return 1;
1598 ospf_nbr_nbma_unset (struct ospf *ospf, struct in_addr nbr_addr)
1600 struct ospf_nbr_nbma *nbr_nbma;
1602 nbr_nbma = ospf_nbr_nbma_lookup (ospf, nbr_addr);
1603 if (nbr_nbma == NULL)
1604 return 0;
1606 ospf_nbr_nbma_down (nbr_nbma);
1607 ospf_nbr_nbma_delete (ospf, nbr_nbma);
1609 return 1;
1613 ospf_nbr_nbma_priority_set (struct ospf *ospf, struct in_addr nbr_addr,
1614 u_char priority)
1616 struct ospf_nbr_nbma *nbr_nbma;
1618 nbr_nbma = ospf_nbr_nbma_lookup (ospf, nbr_addr);
1619 if (nbr_nbma == NULL)
1620 return 0;
1622 if (nbr_nbma->priority != priority)
1623 nbr_nbma->priority = priority;
1625 return 1;
1629 ospf_nbr_nbma_priority_unset (struct ospf *ospf, struct in_addr nbr_addr)
1631 struct ospf_nbr_nbma *nbr_nbma;
1633 nbr_nbma = ospf_nbr_nbma_lookup (ospf, nbr_addr);
1634 if (nbr_nbma == NULL)
1635 return 0;
1637 if (nbr_nbma != OSPF_NEIGHBOR_PRIORITY_DEFAULT)
1638 nbr_nbma->priority = OSPF_NEIGHBOR_PRIORITY_DEFAULT;
1640 return 1;
1644 ospf_nbr_nbma_poll_interval_set (struct ospf *ospf, struct in_addr nbr_addr,
1645 unsigned int interval)
1647 struct ospf_nbr_nbma *nbr_nbma;
1649 nbr_nbma = ospf_nbr_nbma_lookup (ospf, nbr_addr);
1650 if (nbr_nbma == NULL)
1651 return 0;
1653 if (nbr_nbma->v_poll != interval)
1655 nbr_nbma->v_poll = interval;
1656 if (nbr_nbma->oi && ospf_if_is_up (nbr_nbma->oi))
1658 OSPF_TIMER_OFF (nbr_nbma->t_poll);
1659 OSPF_POLL_TIMER_ON (nbr_nbma->t_poll, ospf_poll_timer,
1660 nbr_nbma->v_poll);
1664 return 1;
1668 ospf_nbr_nbma_poll_interval_unset (struct ospf *ospf, struct in_addr addr)
1670 struct ospf_nbr_nbma *nbr_nbma;
1672 nbr_nbma = ospf_nbr_nbma_lookup (ospf, addr);
1673 if (nbr_nbma == NULL)
1674 return 0;
1676 if (nbr_nbma->v_poll != OSPF_POLL_INTERVAL_DEFAULT)
1677 nbr_nbma->v_poll = OSPF_POLL_INTERVAL_DEFAULT;
1679 return 1;
1682 void
1683 ospf_master_init ()
1685 memset (&ospf_master, 0, sizeof (struct ospf_master));
1687 om = &ospf_master;
1688 om->ospf = list_new ();
1689 om->master = thread_master_create ();
1690 om->start_time = quagga_time (NULL);