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
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
33 #include "sockunion.h" /* for inet_aton () */
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 ospf
*, struct prefix
*, struct ospf_area
*);
72 static void ospf_finish_final (struct ospf
*);
74 #define OSPF_EXTERNAL_LSA_ORIGINATE_DELAY 1
77 ospf_router_id_update (struct ospf
*ospf
)
79 struct in_addr router_id
, router_id_old
;
80 struct ospf_interface
*oi
;
81 struct listnode
*node
;
83 if (IS_DEBUG_OSPF_EVENT
)
84 zlog_debug ("Router-ID[OLD:%s]: Update", inet_ntoa (ospf
->router_id
));
86 router_id_old
= ospf
->router_id
;
88 /* Select the router ID based on these priorities:
89 1. Statically assigned router ID is always the first choice.
90 2. If there is no statically assigned router ID, then try to stick
91 with the most recent value, since changing router ID's is very
93 3. Last choice: just go with whatever the zebra daemon recommends.
95 if (ospf
->router_id_static
.s_addr
!= 0)
96 router_id
= ospf
->router_id_static
;
97 else if (ospf
->router_id
.s_addr
!= 0)
98 router_id
= ospf
->router_id
;
100 router_id
= router_id_zebra
;
102 ospf
->router_id
= router_id
;
104 if (IS_DEBUG_OSPF_EVENT
)
105 zlog_debug ("Router-ID[NEW:%s]: Update", inet_ntoa (ospf
->router_id
));
107 if (!IPV4_ADDR_SAME (&router_id_old
, &router_id
))
109 for (ALL_LIST_ELEMENTS_RO (ospf
->oiflist
, node
, oi
))
110 /* Update self-neighbor's router_id. */
111 oi
->nbr_self
->router_id
= router_id
;
113 /* If AS-external-LSA is queued, then flush those LSAs. */
114 if (router_id_old
.s_addr
== 0 && ospf
->external_origin
)
117 /* Originate each redistributed external route. */
118 for (type
= 0; type
< ZEBRA_ROUTE_MAX
; type
++)
119 if (ospf
->external_origin
& (1 << type
))
120 thread_add_event (master
, ospf_external_lsa_originate_timer
,
122 /* Originate Deafult. */
123 if (ospf
->external_origin
& (1 << ZEBRA_ROUTE_MAX
))
124 thread_add_event (master
, ospf_default_originate_timer
, ospf
, 0);
126 ospf
->external_origin
= 0;
129 OSPF_TIMER_ON (ospf
->t_router_lsa_update
,
130 ospf_router_lsa_update_timer
, OSPF_LSA_UPDATE_DELAY
);
132 /* update ospf_interface's */
133 ospf_if_update (ospf
);
137 /* For OSPF area sort by area id. */
139 ospf_area_id_cmp (struct ospf_area
*a1
, struct ospf_area
*a2
)
141 if (ntohl (a1
->area_id
.s_addr
) > ntohl (a2
->area_id
.s_addr
))
143 if (ntohl (a1
->area_id
.s_addr
) < ntohl (a2
->area_id
.s_addr
))
148 /* Allocate new ospf structure. */
154 struct ospf
*new = XCALLOC (MTYPE_OSPF_TOP
, sizeof (struct ospf
));
156 new->router_id
.s_addr
= htonl (0);
157 new->router_id_static
.s_addr
= htonl (0);
159 new->abr_type
= OSPF_ABR_DEFAULT
;
160 new->oiflist
= list_new ();
161 new->vlinks
= list_new ();
162 new->areas
= list_new ();
163 new->areas
->cmp
= (int (*)(void *, void *)) ospf_area_id_cmp
;
164 new->networks
= route_table_init ();
165 new->nbr_nbma
= route_table_init ();
167 new->lsdb
= ospf_lsdb_new ();
169 new->default_originate
= DEFAULT_ORIGINATE_NONE
;
171 new->passive_interface_default
= OSPF_IF_ACTIVE
;
173 new->new_external_route
= route_table_init ();
174 new->old_external_route
= route_table_init ();
175 new->external_lsas
= route_table_init ();
177 new->stub_router_startup_time
= OSPF_STUB_ROUTER_UNCONFIGURED
;
178 new->stub_router_shutdown_time
= OSPF_STUB_ROUTER_UNCONFIGURED
;
180 /* Distribute parameter init. */
181 for (i
= 0; i
<= ZEBRA_ROUTE_MAX
; i
++)
183 new->dmetric
[i
].type
= -1;
184 new->dmetric
[i
].value
= -1;
186 new->default_metric
= -1;
187 new->ref_bandwidth
= OSPF_DEFAULT_REF_BANDWIDTH
;
189 /* SPF timer value init. */
190 new->spf_delay
= OSPF_SPF_DELAY_DEFAULT
;
191 new->spf_holdtime
= OSPF_SPF_HOLDTIME_DEFAULT
;
192 new->spf_max_holdtime
= OSPF_SPF_MAX_HOLDTIME_DEFAULT
;
193 new->spf_hold_multiplier
= 1;
196 new->maxage_lsa
= list_new ();
197 new->t_maxage_walker
=
198 thread_add_timer (master
, ospf_lsa_maxage_walker
,
199 new, OSPF_LSA_MAXAGE_CHECK_INTERVAL
);
201 /* Distance table init. */
202 new->distance_table
= route_table_init ();
204 new->lsa_refresh_queue
.index
= 0;
205 new->lsa_refresh_interval
= OSPF_LSA_REFRESH_INTERVAL_DEFAULT
;
206 new->t_lsa_refresher
= thread_add_timer (master
, ospf_lsa_refresh_walker
,
207 new, new->lsa_refresh_interval
);
208 new->lsa_refresher_started
= quagga_time (NULL
);
210 if ((new->fd
= ospf_sock_init()) < 0)
212 zlog_err("ospf_new: fatal error: ospf_sock_init was unable to open "
216 new->maxsndbuflen
= getsockopt_so_sendbuf (new->fd
);
217 if (IS_DEBUG_OSPF (zebra
, ZEBRA_INTERFACE
))
218 zlog_debug ("%s: starting with OSPF send buffer size %d",
219 __func__
, new->maxsndbuflen
);
220 if ((new->ibuf
= stream_new(OSPF_MAX_PACKET_SIZE
+1)) == NULL
)
222 zlog_err("ospf_new: fatal error: stream_new(%u) failed allocating ibuf",
223 OSPF_MAX_PACKET_SIZE
+1);
226 new->t_read
= thread_add_read (master
, ospf_read
, new, new->fd
);
227 new->oi_write_q
= list_new ();
235 if (listcount (om
->ospf
) == 0)
238 return listgetdata (listhead (om
->ospf
));
242 ospf_add (struct ospf
*ospf
)
244 listnode_add (om
->ospf
, ospf
);
248 ospf_delete (struct ospf
*ospf
)
250 listnode_delete (om
->ospf
, ospf
);
258 ospf
= ospf_lookup ();
264 if (ospf
->router_id_static
.s_addr
== 0)
265 ospf_router_id_update (ospf
);
267 #ifdef HAVE_OPAQUE_LSA
268 ospf_opaque_type11_lsa_init (ospf
);
269 #endif /* HAVE_OPAQUE_LSA */
275 /* Handle the second half of deferred shutdown. This is called either
276 * from the deferred-shutdown timer thread, or directly through
277 * ospf_deferred_shutdown_check.
279 * Function is to cleanup G-R state, if required then call ospf_finish_final
280 * to complete shutdown of this ospf instance. Possibly exit if the
281 * whole process is being shutdown and this was the last OSPF instance.
284 ospf_deferred_shutdown_finish (struct ospf
*ospf
)
286 ospf
->stub_router_shutdown_time
= OSPF_STUB_ROUTER_UNCONFIGURED
;
287 OSPF_TIMER_OFF (ospf
->t_deferred_shutdown
);
289 ospf_finish_final (ospf
);
291 /* *ospf is now invalid */
293 /* ospfd being shut-down? If so, was this the last ospf instance? */
294 if (CHECK_FLAG (om
->options
, OSPF_MASTER_SHUTDOWN
)
295 && (listcount (om
->ospf
) == 0))
301 /* Timer thread for G-R */
303 ospf_deferred_shutdown_timer (struct thread
*t
)
305 struct ospf
*ospf
= THREAD_ARG(t
);
307 ospf_deferred_shutdown_finish (ospf
);
312 /* Check whether deferred-shutdown must be scheduled, otherwise call
313 * down directly into second-half of instance shutdown.
316 ospf_deferred_shutdown_check (struct ospf
*ospf
)
318 unsigned long timeout
;
320 struct ospf_area
*area
;
322 /* deferred shutdown already running? */
323 if (ospf
->t_deferred_shutdown
)
326 /* Should we try push out max-metric LSAs? */
327 if (ospf
->stub_router_shutdown_time
!= OSPF_STUB_ROUTER_UNCONFIGURED
)
329 for (ALL_LIST_ELEMENTS_RO (ospf
->areas
, ln
, area
))
331 SET_FLAG (area
->stub_router_state
, OSPF_AREA_ADMIN_STUB_ROUTED
);
333 if (!CHECK_FLAG (area
->stub_router_state
, OSPF_AREA_IS_STUB_ROUTED
))
334 ospf_router_lsa_timer_add (area
);
336 timeout
= ospf
->stub_router_shutdown_time
;
340 /* No timer needed */
341 ospf_deferred_shutdown_finish (ospf
);
345 OSPF_TIMER_ON (ospf
->t_deferred_shutdown
, ospf_deferred_shutdown_timer
,
350 /* Shut down the entire process */
352 ospf_terminate (void)
355 struct listnode
*node
, *nnode
;
357 /* shutdown already in progress */
358 if (CHECK_FLAG (om
->options
, OSPF_MASTER_SHUTDOWN
))
361 SET_FLAG (om
->options
, OSPF_MASTER_SHUTDOWN
);
363 /* exit immediately if OSPF not actually running */
364 if (listcount(om
->ospf
) == 0)
367 for (ALL_LIST_ELEMENTS (om
->ospf
, node
, nnode
, ospf
))
370 /* Deliberately go back up, hopefully to thread scheduler, as
371 * One or more ospf_finish()'s may have deferred shutdown to a timer
377 ospf_finish (struct ospf
*ospf
)
379 /* let deferred shutdown decide */
380 ospf_deferred_shutdown_check (ospf
);
382 /* if ospf_deferred_shutdown returns, then ospf_finish_final is
383 * deferred to expiry of G-S timer thread. Return back up, hopefully
384 * to thread scheduler.
389 /* Final cleanup of ospf instance */
391 ospf_finish_final (struct ospf
*ospf
)
393 struct route_node
*rn
;
394 struct ospf_nbr_nbma
*nbr_nbma
;
395 struct ospf_lsa
*lsa
;
396 struct ospf_interface
*oi
;
397 struct ospf_area
*area
;
398 struct ospf_vl_data
*vl_data
;
399 struct listnode
*node
, *nnode
;
402 #ifdef HAVE_OPAQUE_LSA
403 ospf_opaque_type11_lsa_term (ospf
);
404 #endif /* HAVE_OPAQUE_LSA */
406 /* be nice if this worked, but it doesn't */
407 /*ospf_flush_self_originated_lsas_now (ospf);*/
409 /* Unregister redistribution */
410 for (i
= 0; i
< ZEBRA_ROUTE_MAX
; i
++)
411 ospf_redistribute_unset (ospf
, i
);
412 ospf_redistribute_default_unset (ospf
);
414 for (ALL_LIST_ELEMENTS (ospf
->areas
, node
, nnode
, area
))
415 ospf_remove_vls_through_area (ospf
, area
);
417 for (ALL_LIST_ELEMENTS (ospf
->vlinks
, node
, nnode
, vl_data
))
418 ospf_vl_delete (ospf
, vl_data
);
420 list_delete (ospf
->vlinks
);
422 /* Reset interface. */
423 for (ALL_LIST_ELEMENTS (ospf
->oiflist
, node
, nnode
, oi
))
426 /* Clear static neighbors */
427 for (rn
= route_top (ospf
->nbr_nbma
); rn
; rn
= route_next (rn
))
428 if ((nbr_nbma
= rn
->info
))
430 OSPF_POLL_TIMER_OFF (nbr_nbma
->t_poll
);
434 nbr_nbma
->nbr
->nbr_nbma
= NULL
;
435 nbr_nbma
->nbr
= NULL
;
440 listnode_delete (nbr_nbma
->oi
->nbr_nbma
, nbr_nbma
);
444 XFREE (MTYPE_OSPF_NEIGHBOR_STATIC
, nbr_nbma
);
447 route_table_finish (ospf
->nbr_nbma
);
449 /* Clear networks and Areas. */
450 for (rn
= route_top (ospf
->networks
); rn
; rn
= route_next (rn
))
452 struct ospf_network
*network
;
454 if ((network
= rn
->info
) != NULL
)
456 ospf_network_free (ospf
, network
);
458 route_unlock_node (rn
);
462 for (ALL_LIST_ELEMENTS (ospf
->areas
, node
, nnode
, area
))
464 listnode_delete (ospf
->areas
, area
);
465 ospf_area_free (area
);
468 /* Cancel all timers. */
469 OSPF_TIMER_OFF (ospf
->t_external_lsa
);
470 OSPF_TIMER_OFF (ospf
->t_router_lsa_update
);
471 OSPF_TIMER_OFF (ospf
->t_spf_calc
);
472 OSPF_TIMER_OFF (ospf
->t_ase_calc
);
473 OSPF_TIMER_OFF (ospf
->t_maxage
);
474 OSPF_TIMER_OFF (ospf
->t_maxage_walker
);
475 OSPF_TIMER_OFF (ospf
->t_abr_task
);
476 OSPF_TIMER_OFF (ospf
->t_asbr_check
);
477 OSPF_TIMER_OFF (ospf
->t_distribute_update
);
478 OSPF_TIMER_OFF (ospf
->t_lsa_refresher
);
479 OSPF_TIMER_OFF (ospf
->t_read
);
480 OSPF_TIMER_OFF (ospf
->t_write
);
481 #ifdef HAVE_OPAQUE_LSA
482 OSPF_TIMER_OFF (ospf
->t_opaque_lsa_self
);
486 stream_free(ospf
->ibuf
);
488 #ifdef HAVE_OPAQUE_LSA
489 LSDB_LOOP (OPAQUE_AS_LSDB (ospf
), rn
, lsa
)
490 ospf_discard_from_db (ospf
, ospf
->lsdb
, lsa
);
491 #endif /* HAVE_OPAQUE_LSA */
492 LSDB_LOOP (EXTERNAL_LSDB (ospf
), rn
, lsa
)
493 ospf_discard_from_db (ospf
, ospf
->lsdb
, lsa
);
495 ospf_lsdb_delete_all (ospf
->lsdb
);
496 ospf_lsdb_free (ospf
->lsdb
);
498 for (ALL_LIST_ELEMENTS (ospf
->maxage_lsa
, node
, nnode
, lsa
))
499 ospf_lsa_unlock (&lsa
); /* maxage_lsa */
501 list_delete (ospf
->maxage_lsa
);
504 ospf_route_table_free (ospf
->old_table
);
507 ospf_route_delete (ospf
->new_table
);
508 ospf_route_table_free (ospf
->new_table
);
511 ospf_rtrs_free (ospf
->old_rtrs
);
513 ospf_rtrs_free (ospf
->new_rtrs
);
514 if (ospf
->new_external_route
)
516 ospf_route_delete (ospf
->new_external_route
);
517 ospf_route_table_free (ospf
->new_external_route
);
519 if (ospf
->old_external_route
)
521 ospf_route_delete (ospf
->old_external_route
);
522 ospf_route_table_free (ospf
->old_external_route
);
524 if (ospf
->external_lsas
)
526 ospf_ase_external_lsas_finish (ospf
->external_lsas
);
529 list_delete (ospf
->areas
);
531 for (i
= ZEBRA_ROUTE_SYSTEM
; i
<= ZEBRA_ROUTE_MAX
; i
++)
532 if (EXTERNAL_INFO (i
) != NULL
)
533 for (rn
= route_top (EXTERNAL_INFO (i
)); rn
; rn
= route_next (rn
))
535 if (rn
->info
== NULL
)
538 XFREE (MTYPE_OSPF_EXTERNAL_INFO
, rn
->info
);
540 route_unlock_node (rn
);
543 ospf_distance_reset (ospf
);
544 route_table_finish (ospf
->distance_table
);
548 XFREE (MTYPE_OSPF_TOP
, ospf
);
552 /* allocate new OSPF Area object */
553 static struct ospf_area
*
554 ospf_area_new (struct ospf
*ospf
, struct in_addr area_id
)
556 struct ospf_area
*new;
558 /* Allocate new config_network. */
559 new = XCALLOC (MTYPE_OSPF_AREA
, sizeof (struct ospf_area
));
563 new->area_id
= area_id
;
565 new->external_routing
= OSPF_AREA_DEFAULT
;
566 new->default_cost
= 1;
567 new->auth_type
= OSPF_AUTH_NULL
;
570 new->lsdb
= ospf_lsdb_new ();
572 /* Self-originated LSAs initialize. */
573 new->router_lsa_self
= NULL
;
575 #ifdef HAVE_OPAQUE_LSA
576 ospf_opaque_type10_lsa_init (new);
577 #endif /* HAVE_OPAQUE_LSA */
579 new->oiflist
= list_new ();
580 new->ranges
= route_table_init ();
582 if (area_id
.s_addr
== OSPF_AREA_BACKBONE
)
583 ospf
->backbone
= new;
589 ospf_area_free (struct ospf_area
*area
)
591 struct route_node
*rn
;
592 struct ospf_lsa
*lsa
;
595 LSDB_LOOP (ROUTER_LSDB (area
), rn
, lsa
)
596 ospf_discard_from_db (area
->ospf
, area
->lsdb
, lsa
);
597 LSDB_LOOP (NETWORK_LSDB (area
), rn
, lsa
)
598 ospf_discard_from_db (area
->ospf
, area
->lsdb
, lsa
);
599 LSDB_LOOP (SUMMARY_LSDB (area
), rn
, lsa
)
600 ospf_discard_from_db (area
->ospf
, area
->lsdb
, lsa
);
601 LSDB_LOOP (ASBR_SUMMARY_LSDB (area
), rn
, lsa
)
602 ospf_discard_from_db (area
->ospf
, area
->lsdb
, lsa
);
604 LSDB_LOOP (NSSA_LSDB (area
), rn
, lsa
)
605 ospf_discard_from_db (area
->ospf
, area
->lsdb
, lsa
);
606 #ifdef HAVE_OPAQUE_LSA
607 LSDB_LOOP (OPAQUE_AREA_LSDB (area
), rn
, lsa
)
608 ospf_discard_from_db (area
->ospf
, area
->lsdb
, lsa
);
609 LSDB_LOOP (OPAQUE_LINK_LSDB (area
), rn
, lsa
)
610 ospf_discard_from_db (area
->ospf
, area
->lsdb
, lsa
);
611 #endif /* HAVE_OPAQUE_LSA */
613 ospf_lsdb_delete_all (area
->lsdb
);
614 ospf_lsdb_free (area
->lsdb
);
616 ospf_lsa_unlock (&area
->router_lsa_self
);
618 route_table_finish (area
->ranges
);
619 list_delete (area
->oiflist
);
621 if (EXPORT_NAME (area
))
622 free (EXPORT_NAME (area
));
624 if (IMPORT_NAME (area
))
625 free (IMPORT_NAME (area
));
628 OSPF_TIMER_OFF (area
->t_router_lsa_self
);
629 OSPF_TIMER_OFF (area
->t_stub_router
);
630 #ifdef HAVE_OPAQUE_LSA
631 OSPF_TIMER_OFF (area
->t_opaque_lsa_self
);
632 #endif /* HAVE_OPAQUE_LSA */
634 if (OSPF_IS_AREA_BACKBONE (area
))
635 area
->ospf
->backbone
= NULL
;
637 XFREE (MTYPE_OSPF_AREA
, area
);
641 ospf_area_check_free (struct ospf
*ospf
, struct in_addr area_id
)
643 struct ospf_area
*area
;
645 area
= ospf_area_lookup_by_area_id (ospf
, area_id
);
647 listcount (area
->oiflist
) == 0 &&
648 area
->ranges
->top
== NULL
&&
649 area
->shortcut_configured
== OSPF_SHORTCUT_DEFAULT
&&
650 area
->external_routing
== OSPF_AREA_DEFAULT
&&
651 area
->no_summary
== 0 &&
652 area
->default_cost
== 1 &&
653 EXPORT_NAME (area
) == NULL
&&
654 IMPORT_NAME (area
) == NULL
&&
655 area
->auth_type
== OSPF_AUTH_NULL
)
657 listnode_delete (ospf
->areas
, area
);
658 ospf_area_free (area
);
663 ospf_area_get (struct ospf
*ospf
, struct in_addr area_id
, int format
)
665 struct ospf_area
*area
;
667 area
= ospf_area_lookup_by_area_id (ospf
, area_id
);
670 area
= ospf_area_new (ospf
, area_id
);
671 area
->format
= format
;
672 listnode_add_sort (ospf
->areas
, area
);
673 ospf_check_abr_status (ospf
);
680 ospf_area_lookup_by_area_id (struct ospf
*ospf
, struct in_addr area_id
)
682 struct ospf_area
*area
;
683 struct listnode
*node
;
685 for (ALL_LIST_ELEMENTS_RO (ospf
->areas
, node
, area
))
686 if (IPV4_ADDR_SAME (&area
->area_id
, &area_id
))
693 ospf_area_add_if (struct ospf_area
*area
, struct ospf_interface
*oi
)
695 listnode_add (area
->oiflist
, oi
);
699 ospf_area_del_if (struct ospf_area
*area
, struct ospf_interface
*oi
)
701 listnode_delete (area
->oiflist
, oi
);
705 /* Config network statement related functions. */
706 static struct ospf_network
*
707 ospf_network_new (struct in_addr area_id
, int format
)
709 struct ospf_network
*new;
710 new = XCALLOC (MTYPE_OSPF_NETWORK
, sizeof (struct ospf_network
));
712 new->area_id
= area_id
;
713 new->format
= format
;
719 ospf_network_free (struct ospf
*ospf
, struct ospf_network
*network
)
721 ospf_area_check_free (ospf
, network
->area_id
);
722 ospf_schedule_abr_task (ospf
);
723 XFREE (MTYPE_OSPF_NETWORK
, network
);
727 ospf_network_set (struct ospf
*ospf
, struct prefix_ipv4
*p
,
728 struct in_addr area_id
)
730 struct ospf_network
*network
;
731 struct ospf_area
*area
;
732 struct route_node
*rn
;
733 struct external_info
*ei
;
734 int ret
= OSPF_AREA_ID_FORMAT_ADDRESS
;
736 rn
= route_node_get (ospf
->networks
, (struct prefix
*)p
);
739 /* There is already same network statement. */
740 route_unlock_node (rn
);
744 rn
->info
= network
= ospf_network_new (area_id
, ret
);
745 area
= ospf_area_get (ospf
, area_id
, ret
);
747 /* Run network config now. */
748 ospf_network_run (ospf
, (struct prefix
*)p
, area
);
750 /* Update connected redistribute. */
751 if (ospf_is_type_redistributed (ZEBRA_ROUTE_CONNECT
))
752 if (EXTERNAL_INFO (ZEBRA_ROUTE_CONNECT
))
753 for (rn
= route_top (EXTERNAL_INFO (ZEBRA_ROUTE_CONNECT
));
754 rn
; rn
= route_next (rn
))
755 if ((ei
= rn
->info
) != NULL
)
756 if (ospf_external_info_find_lsa (ospf
, &ei
->p
))
757 if (!ospf_distribute_check_connected (ospf
, ei
))
758 ospf_external_lsa_flush (ospf
, ei
->type
, &ei
->p
,
759 ei
->ifindex
/*, ei->nexthop */);
761 ospf_area_check_free (ospf
, area_id
);
767 ospf_network_unset (struct ospf
*ospf
, struct prefix_ipv4
*p
,
768 struct in_addr area_id
)
770 struct route_node
*rn
;
771 struct ospf_network
*network
;
772 struct external_info
*ei
;
774 rn
= route_node_lookup (ospf
->networks
, (struct prefix
*)p
);
779 if (!IPV4_ADDR_SAME (&area_id
, &network
->area_id
))
782 ospf_network_free (ospf
, rn
->info
);
784 route_unlock_node (rn
);
786 ospf_if_update (ospf
);
788 /* Update connected redistribute. */
789 if (ospf_is_type_redistributed (ZEBRA_ROUTE_CONNECT
))
790 if (EXTERNAL_INFO (ZEBRA_ROUTE_CONNECT
))
791 for (rn
= route_top (EXTERNAL_INFO (ZEBRA_ROUTE_CONNECT
));
792 rn
; rn
= route_next (rn
))
793 if ((ei
= rn
->info
) != NULL
)
794 if (!ospf_external_info_find_lsa (ospf
, &ei
->p
))
795 if (ospf_distribute_check_connected (ospf
, ei
))
796 ospf_external_lsa_originate (ospf
, ei
);
801 /* Check whether interface matches given network
802 * returns: 1, true. 0, false
805 ospf_network_match_iface(struct connected
*co
, struct prefix
*net
)
807 /* #define COMPATIBILITY_MODE */
808 /* The old code used to have a special case for PtP interfaces:
810 if (if_is_pointopoint (co->ifp) && co->destination &&
811 IPV4_ADDR_SAME ( &(co->destination->u.prefix4), &(net->u.prefix4)))
814 The new approach is much more general. If a peer address is supplied,
815 then we are routing to that prefix, so that's the address to compare
816 against (not the local address, which may not be unique).
818 #ifndef COMPATIBILITY_MODE
819 /* new approach: more elegant and conceptually clean */
820 return prefix_match(net
, CONNECTED_PREFIX(co
));
821 #else /* COMPATIBILITY_MODE */
822 /* match old (strange?) behavior */
824 /* Behaviour to match both Cisco where:
825 * iface address lies within network specified -> ospf
826 * and zebra 0.9[2ish-3]:
827 * PtP special case: network specified == iface peer addr -> ospf
830 /* For PtP, match if peer address matches network address exactly.
831 * This can be addr/32 or addr/p for p < 32, but the addr must match
832 * exactly; this is not a test for falling within the prefix. This
833 * test is solely for compatibility with zebra.
835 if (CONNECTED_PEER(co
) &&
836 IPV4_ADDR_SAME ( &(co
->destination
->u
.prefix4
), &(net
->u
.prefix4
)))
840 /* Decline to accept PtP if dst address does not match the
841 * prefix. (ifdefed out because this is a workaround, not the
842 * desired behavior.) */
843 if (if_is_pointopoint (co
->ifp
) &&
844 ! prefix_match (net
, co
->destination
))
848 /* If the address is within the prefix, accept. Note that this
849 * applies to PtP as well as other types.
851 if (prefix_match (net
, co
->address
))
854 return 0; /* no match */
856 #endif /* COMPATIBILITY_MODE */
860 ospf_network_run (struct ospf
*ospf
, struct prefix
*p
, struct ospf_area
*area
)
862 struct interface
*ifp
;
863 struct connected
*co
;
864 struct listnode
*node
;
866 /* Schedule Router ID Update. */
867 if (ospf
->router_id
.s_addr
== 0)
868 ospf_router_id_update (ospf
);
870 /* Get target interface. */
871 for (ALL_LIST_ELEMENTS_RO (om
->iflist
, node
, ifp
))
873 struct listnode
*cnode
;
875 if (memcmp (ifp
->name
, "VLINK", 5) == 0)
878 /* if interface prefix is match specified prefix,
879 then create socket and join multicast group. */
880 for (ALL_LIST_ELEMENTS_RO (ifp
->connected
, cnode
, co
))
884 if (CHECK_FLAG(co
->flags
,ZEBRA_IFA_SECONDARY
))
887 addr
= CONNECTED_ID(co
);
889 if (p
->family
== co
->address
->family
890 && ! ospf_if_is_configured (ospf
, &(addr
->u
.prefix4
))
891 && ospf_network_match_iface(co
,p
))
893 struct ospf_interface
*oi
;
895 oi
= ospf_if_new (ospf
, ifp
, co
->address
);
900 oi
->params
= ospf_lookup_if_params (ifp
, oi
->address
->u
.prefix4
);
901 oi
->output_cost
= ospf_if_get_output_cost (oi
);
903 /* Add pseudo neighbor. */
904 ospf_nbr_add_self (oi
);
906 /* Relate ospf interface to ospf instance. */
909 /* update network type as interface flag */
910 /* If network type is specified previously,
911 skip network type setting. */
912 oi
->type
= IF_DEF_PARAMS (ifp
)->type
;
914 ospf_area_add_if (oi
->area
, oi
);
916 /* if router_id is not configured, dont bring up
918 * ospf_router_id_update() will call ospf_if_update
919 * whenever r-id is configured instead.
921 if ((ospf
->router_id
.s_addr
!= 0)
922 && if_is_operative (ifp
))
930 ospf_ls_upd_queue_empty (struct ospf_interface
*oi
)
932 struct route_node
*rn
;
933 struct listnode
*node
, *nnode
;
935 struct ospf_lsa
*lsa
;
937 /* empty ls update queue */
938 for (rn
= route_top (oi
->ls_upd_queue
); rn
;
939 rn
= route_next (rn
))
940 if ((lst
= (struct list
*) rn
->info
))
942 for (ALL_LIST_ELEMENTS (lst
, node
, nnode
, lsa
))
943 ospf_lsa_unlock (&lsa
); /* oi->ls_upd_queue */
948 /* remove update event */
949 if (oi
->t_ls_upd_event
)
951 thread_cancel (oi
->t_ls_upd_event
);
952 oi
->t_ls_upd_event
= NULL
;
957 ospf_if_update (struct ospf
*ospf
)
959 struct route_node
*rn
;
960 struct listnode
*node
, *nnode
;
961 struct ospf_network
*network
;
962 struct ospf_area
*area
;
963 struct ospf_interface
*oi
;
967 /* Router-ID must be configured. */
968 if (ospf
->router_id
.s_addr
== 0)
971 /* Find interfaces that not configured already. */
972 for (ALL_LIST_ELEMENTS (ospf
->oiflist
, node
, nnode
, oi
))
975 struct connected
*co
= oi
->connected
;
977 if (oi
->type
== OSPF_IFTYPE_VIRTUALLINK
)
980 for (rn
= route_top (ospf
->networks
); rn
; rn
= route_next (rn
))
982 if (rn
->info
== NULL
)
985 if (ospf_network_match_iface(co
,&rn
->p
))
988 route_unlock_node (rn
);
997 /* Run each interface. */
998 for (rn
= route_top (ospf
->networks
); rn
; rn
= route_next (rn
))
999 if (rn
->info
!= NULL
)
1001 network
= (struct ospf_network
*) rn
->info
;
1002 area
= ospf_area_get (ospf
, network
->area_id
, network
->format
);
1003 ospf_network_run (ospf
, &rn
->p
, area
);
1009 ospf_remove_vls_through_area (struct ospf
*ospf
, struct ospf_area
*area
)
1011 struct listnode
*node
, *nnode
;
1012 struct ospf_vl_data
*vl_data
;
1014 for (ALL_LIST_ELEMENTS (ospf
->vlinks
, node
, nnode
, vl_data
))
1015 if (IPV4_ADDR_SAME (&vl_data
->vl_area_id
, &area
->area_id
))
1016 ospf_vl_delete (ospf
, vl_data
);
1020 struct message ospf_area_type_msg
[] =
1022 { OSPF_AREA_DEFAULT
, "Default" },
1023 { OSPF_AREA_STUB
, "Stub" },
1024 { OSPF_AREA_NSSA
, "NSSA" },
1026 int ospf_area_type_msg_max
= OSPF_AREA_TYPE_MAX
;
1029 ospf_area_type_set (struct ospf_area
*area
, int type
)
1031 struct listnode
*node
;
1032 struct ospf_interface
*oi
;
1034 if (area
->external_routing
== type
)
1036 if (IS_DEBUG_OSPF_EVENT
)
1037 zlog_debug ("Area[%s]: Types are the same, ignored.",
1038 inet_ntoa (area
->area_id
));
1042 area
->external_routing
= type
;
1044 if (IS_DEBUG_OSPF_EVENT
)
1045 zlog_debug ("Area[%s]: Configured as %s", inet_ntoa (area
->area_id
),
1046 LOOKUP (ospf_area_type_msg
, type
));
1048 switch (area
->external_routing
)
1050 case OSPF_AREA_DEFAULT
:
1051 for (ALL_LIST_ELEMENTS_RO (area
->oiflist
, node
, oi
))
1052 if (oi
->nbr_self
!= NULL
)
1054 UNSET_FLAG (oi
->nbr_self
->options
, OSPF_OPTION_NP
);
1055 SET_FLAG (oi
->nbr_self
->options
, OSPF_OPTION_E
);
1058 case OSPF_AREA_STUB
:
1059 for (ALL_LIST_ELEMENTS_RO (area
->oiflist
, node
, oi
))
1060 if (oi
->nbr_self
!= NULL
)
1062 if (IS_DEBUG_OSPF_EVENT
)
1063 zlog_debug ("setting options on %s accordingly", IF_NAME (oi
));
1064 UNSET_FLAG (oi
->nbr_self
->options
, OSPF_OPTION_NP
);
1065 UNSET_FLAG (oi
->nbr_self
->options
, OSPF_OPTION_E
);
1066 if (IS_DEBUG_OSPF_EVENT
)
1067 zlog_debug ("options set on %s: %x",
1068 IF_NAME (oi
), OPTIONS (oi
));
1071 case OSPF_AREA_NSSA
:
1072 for (ALL_LIST_ELEMENTS_RO (area
->oiflist
, node
, oi
))
1073 if (oi
->nbr_self
!= NULL
)
1075 zlog_debug ("setting nssa options on %s accordingly", IF_NAME (oi
));
1076 UNSET_FLAG (oi
->nbr_self
->options
, OSPF_OPTION_E
);
1077 SET_FLAG (oi
->nbr_self
->options
, OSPF_OPTION_NP
);
1078 zlog_debug ("options set on %s: %x", IF_NAME (oi
), OPTIONS (oi
));
1085 ospf_router_lsa_timer_add (area
);
1086 ospf_schedule_abr_task (area
->ospf
);
1090 ospf_area_shortcut_set (struct ospf
*ospf
, struct ospf_area
*area
, int mode
)
1092 if (area
->shortcut_configured
== mode
)
1095 area
->shortcut_configured
= mode
;
1096 ospf_router_lsa_timer_add (area
);
1097 ospf_schedule_abr_task (ospf
);
1099 ospf_area_check_free (ospf
, area
->area_id
);
1105 ospf_area_shortcut_unset (struct ospf
*ospf
, struct ospf_area
*area
)
1107 area
->shortcut_configured
= OSPF_SHORTCUT_DEFAULT
;
1108 ospf_router_lsa_timer_add (area
);
1109 ospf_area_check_free (ospf
, area
->area_id
);
1110 ospf_schedule_abr_task (ospf
);
1116 ospf_area_vlink_count (struct ospf
*ospf
, struct ospf_area
*area
)
1118 struct ospf_vl_data
*vl
;
1119 struct listnode
*node
;
1122 for (ALL_LIST_ELEMENTS_RO (ospf
->vlinks
, node
, vl
))
1123 if (IPV4_ADDR_SAME (&vl
->vl_area_id
, &area
->area_id
))
1130 ospf_area_stub_set (struct ospf
*ospf
, struct in_addr area_id
)
1132 struct ospf_area
*area
;
1133 int format
= OSPF_AREA_ID_FORMAT_ADDRESS
;
1135 area
= ospf_area_get (ospf
, area_id
, format
);
1136 if (ospf_area_vlink_count (ospf
, area
))
1139 if (area
->external_routing
!= OSPF_AREA_STUB
)
1140 ospf_area_type_set (area
, OSPF_AREA_STUB
);
1146 ospf_area_stub_unset (struct ospf
*ospf
, struct in_addr area_id
)
1148 struct ospf_area
*area
;
1150 area
= ospf_area_lookup_by_area_id (ospf
, area_id
);
1154 if (area
->external_routing
== OSPF_AREA_STUB
)
1155 ospf_area_type_set (area
, OSPF_AREA_DEFAULT
);
1157 ospf_area_check_free (ospf
, area_id
);
1163 ospf_area_no_summary_set (struct ospf
*ospf
, struct in_addr area_id
)
1165 struct ospf_area
*area
;
1166 int format
= OSPF_AREA_ID_FORMAT_ADDRESS
;
1168 area
= ospf_area_get (ospf
, area_id
, format
);
1169 area
->no_summary
= 1;
1175 ospf_area_no_summary_unset (struct ospf
*ospf
, struct in_addr area_id
)
1177 struct ospf_area
*area
;
1179 area
= ospf_area_lookup_by_area_id (ospf
, area_id
);
1183 area
->no_summary
= 0;
1184 ospf_area_check_free (ospf
, area_id
);
1190 ospf_area_nssa_set (struct ospf
*ospf
, struct in_addr area_id
)
1192 struct ospf_area
*area
;
1193 int format
= OSPF_AREA_ID_FORMAT_ADDRESS
;
1195 area
= ospf_area_get (ospf
, area_id
, format
);
1196 if (ospf_area_vlink_count (ospf
, area
))
1199 if (area
->external_routing
!= OSPF_AREA_NSSA
)
1201 ospf_area_type_set (area
, OSPF_AREA_NSSA
);
1205 /* set NSSA area defaults */
1206 area
->no_summary
= 0;
1207 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1208 area
->NSSATranslatorState
= OSPF_NSSA_TRANSLATE_DISABLED
;
1209 area
->NSSATranslatorStabilityInterval
= OSPF_NSSA_TRANS_STABLE_DEFAULT
;
1215 ospf_area_nssa_unset (struct ospf
*ospf
, struct in_addr area_id
)
1217 struct ospf_area
*area
;
1219 area
= ospf_area_lookup_by_area_id (ospf
, area_id
);
1223 if (area
->external_routing
== OSPF_AREA_NSSA
)
1226 ospf_area_type_set (area
, OSPF_AREA_DEFAULT
);
1229 ospf_area_check_free (ospf
, area_id
);
1235 ospf_area_nssa_translator_role_set (struct ospf
*ospf
, struct in_addr area_id
,
1238 struct ospf_area
*area
;
1240 area
= ospf_area_lookup_by_area_id (ospf
, area_id
);
1244 area
->NSSATranslatorRole
= role
;
1249 /* XXX: unused? Leave for symmetry? */
1251 ospf_area_nssa_translator_role_unset (struct ospf
*ospf
,
1252 struct in_addr area_id
)
1254 struct ospf_area
*area
;
1256 area
= ospf_area_lookup_by_area_id (ospf
, area_id
);
1260 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1262 ospf_area_check_free (ospf
, area_id
);
1268 ospf_area_export_list_set (struct ospf
*ospf
,
1269 struct ospf_area
*area
, const char *list_name
)
1271 struct access_list
*list
;
1272 list
= access_list_lookup (AFI_IP
, list_name
);
1274 EXPORT_LIST (area
) = list
;
1276 if (EXPORT_NAME (area
))
1277 free (EXPORT_NAME (area
));
1279 EXPORT_NAME (area
) = strdup (list_name
);
1280 ospf_schedule_abr_task (ospf
);
1286 ospf_area_export_list_unset (struct ospf
*ospf
, struct ospf_area
* area
)
1289 EXPORT_LIST (area
) = 0;
1291 if (EXPORT_NAME (area
))
1292 free (EXPORT_NAME (area
));
1294 EXPORT_NAME (area
) = NULL
;
1296 ospf_area_check_free (ospf
, area
->area_id
);
1298 ospf_schedule_abr_task (ospf
);
1304 ospf_area_import_list_set (struct ospf
*ospf
, struct ospf_area
*area
,
1307 struct access_list
*list
;
1308 list
= access_list_lookup (AFI_IP
, name
);
1310 IMPORT_LIST (area
) = list
;
1312 if (IMPORT_NAME (area
))
1313 free (IMPORT_NAME (area
));
1315 IMPORT_NAME (area
) = strdup (name
);
1316 ospf_schedule_abr_task (ospf
);
1322 ospf_area_import_list_unset (struct ospf
*ospf
, struct ospf_area
* area
)
1324 IMPORT_LIST (area
) = 0;
1326 if (IMPORT_NAME (area
))
1327 free (IMPORT_NAME (area
));
1329 IMPORT_NAME (area
) = NULL
;
1330 ospf_area_check_free (ospf
, area
->area_id
);
1332 ospf_schedule_abr_task (ospf
);
1338 ospf_timers_refresh_set (struct ospf
*ospf
, int interval
)
1342 if (ospf
->lsa_refresh_interval
== interval
)
1345 time_left
= ospf
->lsa_refresh_interval
-
1346 (quagga_time (NULL
) - ospf
->lsa_refresher_started
);
1348 if (time_left
> interval
)
1350 OSPF_TIMER_OFF (ospf
->t_lsa_refresher
);
1351 ospf
->t_lsa_refresher
=
1352 thread_add_timer (master
, ospf_lsa_refresh_walker
, ospf
, interval
);
1354 ospf
->lsa_refresh_interval
= interval
;
1360 ospf_timers_refresh_unset (struct ospf
*ospf
)
1364 time_left
= ospf
->lsa_refresh_interval
-
1365 (quagga_time (NULL
) - ospf
->lsa_refresher_started
);
1367 if (time_left
> OSPF_LSA_REFRESH_INTERVAL_DEFAULT
)
1369 OSPF_TIMER_OFF (ospf
->t_lsa_refresher
);
1370 ospf
->t_lsa_refresher
=
1371 thread_add_timer (master
, ospf_lsa_refresh_walker
, ospf
,
1372 OSPF_LSA_REFRESH_INTERVAL_DEFAULT
);
1375 ospf
->lsa_refresh_interval
= OSPF_LSA_REFRESH_INTERVAL_DEFAULT
;
1381 static struct ospf_nbr_nbma
*
1382 ospf_nbr_nbma_new (void)
1384 struct ospf_nbr_nbma
*nbr_nbma
;
1386 nbr_nbma
= XMALLOC (MTYPE_OSPF_NEIGHBOR_STATIC
,
1387 sizeof (struct ospf_nbr_nbma
));
1388 memset (nbr_nbma
, 0, sizeof (struct ospf_nbr_nbma
));
1390 nbr_nbma
->priority
= OSPF_NEIGHBOR_PRIORITY_DEFAULT
;
1391 nbr_nbma
->v_poll
= OSPF_POLL_INTERVAL_DEFAULT
;
1397 ospf_nbr_nbma_free (struct ospf_nbr_nbma
*nbr_nbma
)
1399 XFREE (MTYPE_OSPF_NEIGHBOR_STATIC
, nbr_nbma
);
1403 ospf_nbr_nbma_delete (struct ospf
*ospf
, struct ospf_nbr_nbma
*nbr_nbma
)
1405 struct route_node
*rn
;
1406 struct prefix_ipv4 p
;
1409 p
.prefix
= nbr_nbma
->addr
;
1410 p
.prefixlen
= IPV4_MAX_BITLEN
;
1412 rn
= route_node_lookup (ospf
->nbr_nbma
, (struct prefix
*)&p
);
1415 ospf_nbr_nbma_free (rn
->info
);
1417 route_unlock_node (rn
);
1418 route_unlock_node (rn
);
1423 ospf_nbr_nbma_down (struct ospf_nbr_nbma
*nbr_nbma
)
1425 OSPF_TIMER_OFF (nbr_nbma
->t_poll
);
1429 nbr_nbma
->nbr
->nbr_nbma
= NULL
;
1430 OSPF_NSM_EVENT_EXECUTE (nbr_nbma
->nbr
, NSM_KillNbr
);
1434 listnode_delete (nbr_nbma
->oi
->nbr_nbma
, nbr_nbma
);
1438 ospf_nbr_nbma_add (struct ospf_nbr_nbma
*nbr_nbma
,
1439 struct ospf_interface
*oi
)
1441 struct ospf_neighbor
*nbr
;
1442 struct route_node
*rn
;
1445 if (oi
->type
!= OSPF_IFTYPE_NBMA
)
1448 if (nbr_nbma
->nbr
!= NULL
)
1451 if (IPV4_ADDR_SAME (&oi
->nbr_self
->address
.u
.prefix4
, &nbr_nbma
->addr
))
1455 listnode_add (oi
->nbr_nbma
, nbr_nbma
);
1457 /* Get neighbor information from table. */
1459 p
.prefixlen
= IPV4_MAX_BITLEN
;
1460 p
.u
.prefix4
= nbr_nbma
->addr
;
1462 rn
= route_node_get (oi
->nbrs
, (struct prefix
*)&p
);
1466 nbr
->nbr_nbma
= nbr_nbma
;
1467 nbr_nbma
->nbr
= nbr
;
1469 route_unlock_node (rn
);
1473 nbr
= rn
->info
= ospf_nbr_new (oi
);
1474 nbr
->state
= NSM_Down
;
1475 nbr
->src
= nbr_nbma
->addr
;
1476 nbr
->nbr_nbma
= nbr_nbma
;
1477 nbr
->priority
= nbr_nbma
->priority
;
1480 nbr_nbma
->nbr
= nbr
;
1482 OSPF_NSM_EVENT_EXECUTE (nbr
, NSM_Start
);
1487 ospf_nbr_nbma_if_update (struct ospf
*ospf
, struct ospf_interface
*oi
)
1489 struct ospf_nbr_nbma
*nbr_nbma
;
1490 struct route_node
*rn
;
1491 struct prefix_ipv4 p
;
1493 if (oi
->type
!= OSPF_IFTYPE_NBMA
)
1496 for (rn
= route_top (ospf
->nbr_nbma
); rn
; rn
= route_next (rn
))
1497 if ((nbr_nbma
= rn
->info
))
1498 if (nbr_nbma
->oi
== NULL
&& nbr_nbma
->nbr
== NULL
)
1501 p
.prefix
= nbr_nbma
->addr
;
1502 p
.prefixlen
= IPV4_MAX_BITLEN
;
1504 if (prefix_match (oi
->address
, (struct prefix
*)&p
))
1505 ospf_nbr_nbma_add (nbr_nbma
, oi
);
1509 struct ospf_nbr_nbma
*
1510 ospf_nbr_nbma_lookup (struct ospf
*ospf
, struct in_addr nbr_addr
)
1512 struct route_node
*rn
;
1513 struct prefix_ipv4 p
;
1516 p
.prefix
= nbr_addr
;
1517 p
.prefixlen
= IPV4_MAX_BITLEN
;
1519 rn
= route_node_lookup (ospf
->nbr_nbma
, (struct prefix
*)&p
);
1522 route_unlock_node (rn
);
1528 struct ospf_nbr_nbma
*
1529 ospf_nbr_nbma_lookup_next (struct ospf
*ospf
, struct in_addr
*addr
, int first
)
1532 struct ospf_nbr_nbma
*nbr_nbma
;
1533 struct listnode
*node
;
1540 for (ALL_LIST_ELEMENTS_RO (ospf
->nbr_nbma
, node
, nbr_nbma
))
1544 *addr
= nbr_nbma
->addr
;
1547 else if (ntohl (nbr_nbma
->addr
.s_addr
) > ntohl (addr
->s_addr
))
1549 *addr
= nbr_nbma
->addr
;
1558 ospf_nbr_nbma_set (struct ospf
*ospf
, struct in_addr nbr_addr
)
1560 struct ospf_nbr_nbma
*nbr_nbma
;
1561 struct ospf_interface
*oi
;
1562 struct prefix_ipv4 p
;
1563 struct route_node
*rn
;
1564 struct listnode
*node
;
1566 nbr_nbma
= ospf_nbr_nbma_lookup (ospf
, nbr_addr
);
1570 nbr_nbma
= ospf_nbr_nbma_new ();
1571 nbr_nbma
->addr
= nbr_addr
;
1574 p
.prefix
= nbr_addr
;
1575 p
.prefixlen
= IPV4_MAX_BITLEN
;
1577 rn
= route_node_get (ospf
->nbr_nbma
, (struct prefix
*)&p
);
1578 rn
->info
= nbr_nbma
;
1580 for (ALL_LIST_ELEMENTS_RO (ospf
->oiflist
, node
, oi
))
1582 if (oi
->type
== OSPF_IFTYPE_NBMA
)
1583 if (prefix_match (oi
->address
, (struct prefix
*)&p
))
1585 ospf_nbr_nbma_add (nbr_nbma
, oi
);
1594 ospf_nbr_nbma_unset (struct ospf
*ospf
, struct in_addr nbr_addr
)
1596 struct ospf_nbr_nbma
*nbr_nbma
;
1598 nbr_nbma
= ospf_nbr_nbma_lookup (ospf
, nbr_addr
);
1599 if (nbr_nbma
== NULL
)
1602 ospf_nbr_nbma_down (nbr_nbma
);
1603 ospf_nbr_nbma_delete (ospf
, nbr_nbma
);
1609 ospf_nbr_nbma_priority_set (struct ospf
*ospf
, struct in_addr nbr_addr
,
1612 struct ospf_nbr_nbma
*nbr_nbma
;
1614 nbr_nbma
= ospf_nbr_nbma_lookup (ospf
, nbr_addr
);
1615 if (nbr_nbma
== NULL
)
1618 if (nbr_nbma
->priority
!= priority
)
1619 nbr_nbma
->priority
= priority
;
1625 ospf_nbr_nbma_priority_unset (struct ospf
*ospf
, struct in_addr nbr_addr
)
1627 struct ospf_nbr_nbma
*nbr_nbma
;
1629 nbr_nbma
= ospf_nbr_nbma_lookup (ospf
, nbr_addr
);
1630 if (nbr_nbma
== NULL
)
1633 if (nbr_nbma
!= OSPF_NEIGHBOR_PRIORITY_DEFAULT
)
1634 nbr_nbma
->priority
= OSPF_NEIGHBOR_PRIORITY_DEFAULT
;
1640 ospf_nbr_nbma_poll_interval_set (struct ospf
*ospf
, struct in_addr nbr_addr
,
1641 unsigned int interval
)
1643 struct ospf_nbr_nbma
*nbr_nbma
;
1645 nbr_nbma
= ospf_nbr_nbma_lookup (ospf
, nbr_addr
);
1646 if (nbr_nbma
== NULL
)
1649 if (nbr_nbma
->v_poll
!= interval
)
1651 nbr_nbma
->v_poll
= interval
;
1652 if (nbr_nbma
->oi
&& ospf_if_is_up (nbr_nbma
->oi
))
1654 OSPF_TIMER_OFF (nbr_nbma
->t_poll
);
1655 OSPF_POLL_TIMER_ON (nbr_nbma
->t_poll
, ospf_poll_timer
,
1664 ospf_nbr_nbma_poll_interval_unset (struct ospf
*ospf
, struct in_addr addr
)
1666 struct ospf_nbr_nbma
*nbr_nbma
;
1668 nbr_nbma
= ospf_nbr_nbma_lookup (ospf
, addr
);
1669 if (nbr_nbma
== NULL
)
1672 if (nbr_nbma
->v_poll
!= OSPF_POLL_INTERVAL_DEFAULT
)
1673 nbr_nbma
->v_poll
= OSPF_POLL_INTERVAL_DEFAULT
;
1681 memset (&ospf_master
, 0, sizeof (struct ospf_master
));
1684 om
->ospf
= list_new ();
1685 om
->master
= thread_master_create ();
1686 om
->start_time
= quagga_time (NULL
);