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 along
17 * with this program; see the file COPYING; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
33 #include "sockunion.h" /* for inet_aton () */
42 #include "ospfd/ospfd.h"
43 #include "ospfd/ospf_network.h"
44 #include "ospfd/ospf_interface.h"
45 #include "ospfd/ospf_ism.h"
46 #include "ospfd/ospf_asbr.h"
47 #include "ospfd/ospf_lsa.h"
48 #include "ospfd/ospf_lsdb.h"
49 #include "ospfd/ospf_neighbor.h"
50 #include "ospfd/ospf_nsm.h"
51 #include "ospfd/ospf_spf.h"
52 #include "ospfd/ospf_packet.h"
53 #include "ospfd/ospf_dump.h"
54 #include "ospfd/ospf_zebra.h"
55 #include "ospfd/ospf_abr.h"
56 #include "ospfd/ospf_flood.h"
57 #include "ospfd/ospf_route.h"
58 #include "ospfd/ospf_ase.h"
61 DEFINE_QOBJ_TYPE(ospf
)
63 /* OSPF process wide configuration. */
64 static struct ospf_master ospf_master
;
66 /* OSPF process wide configuration pointer to export. */
67 struct ospf_master
*om
;
69 extern struct zclient
*zclient
;
72 static void ospf_remove_vls_through_area(struct ospf
*, struct ospf_area
*);
73 static void ospf_network_free(struct ospf
*, struct ospf_network
*);
74 static void ospf_area_free(struct ospf_area
*);
75 static void ospf_network_run(struct prefix
*, struct ospf_area
*);
76 static void ospf_network_run_interface(struct ospf
*, struct interface
*,
77 struct prefix
*, struct ospf_area
*);
78 static void ospf_network_run_subnet(struct ospf
*, struct connected
*,
79 struct prefix
*, struct ospf_area
*);
80 static int ospf_network_match_iface(const struct connected
*,
81 const struct prefix
*);
82 static void ospf_finish_final(struct ospf
*);
84 #define OSPF_EXTERNAL_LSA_ORIGINATE_DELAY 1
86 void ospf_router_id_update(struct ospf
*ospf
)
88 struct vrf
*vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
89 struct in_addr router_id
, router_id_old
;
90 struct ospf_interface
*oi
;
91 struct interface
*ifp
;
92 struct listnode
*node
;
95 if (!ospf
->oi_running
) {
96 if (IS_DEBUG_OSPF_EVENT
)
98 "Router ospf not configured -- Router-ID update postponed");
102 if (IS_DEBUG_OSPF_EVENT
)
103 zlog_debug("Router-ID[OLD:%s]: Update",
104 inet_ntoa(ospf
->router_id
));
106 router_id_old
= ospf
->router_id
;
108 /* Select the router ID based on these priorities:
109 1. Statically assigned router ID is always the first choice.
110 2. If there is no statically assigned router ID, then try to stick
111 with the most recent value, since changing router ID's is very
113 3. Last choice: just go with whatever the zebra daemon recommends.
115 if (ospf
->router_id_static
.s_addr
!= 0)
116 router_id
= ospf
->router_id_static
;
117 else if (ospf
->router_id
.s_addr
!= 0)
118 router_id
= ospf
->router_id
;
120 router_id
= ospf
->router_id_zebra
;
122 if (IS_DEBUG_OSPF_EVENT
)
123 zlog_debug("Router-ID[OLD:%s]: Update to %s",
124 inet_ntoa(ospf
->router_id
), inet_ntoa(router_id
));
126 if (!IPV4_ADDR_SAME(&router_id_old
, &router_id
)) {
128 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
129 /* Some nbrs are identified by router_id, these needs
130 * to be rebuilt. Possible optimization would be to do
131 * oi->nbr_self->router_id = router_id for
132 * !(virtual | ptop) links
134 ospf_nbr_self_reset(oi
, router_id
);
137 /* If AS-external-LSA is queued, then flush those LSAs. */
138 if (router_id_old
.s_addr
== 0 && ospf
->external_origin
) {
139 /* Originate each redistributed external route. */
140 for (type
= 0; type
< ZEBRA_ROUTE_MAX
; type
++)
141 if (ospf
->external_origin
& (1 << type
))
144 ospf_external_lsa_originate_timer
,
146 /* Originate Deafult. */
147 if (ospf
->external_origin
& (1 << ZEBRA_ROUTE_MAX
))
148 thread_add_event(master
,
149 ospf_default_originate_timer
,
152 ospf
->external_origin
= 0;
155 /* Flush (inline) all external LSAs based on the OSPF_LSA_SELF
158 struct route_node
*rn
;
159 struct ospf_lsa
*lsa
;
161 LSDB_LOOP (EXTERNAL_LSDB(ospf
), rn
, lsa
)
162 if (IS_LSA_SELF(lsa
))
163 ospf_lsa_flush_schedule(ospf
, lsa
);
166 ospf
->router_id
= router_id
;
167 if (IS_DEBUG_OSPF_EVENT
)
168 zlog_debug("Router-ID[NEW:%s]: Update",
169 inet_ntoa(ospf
->router_id
));
171 /* Flush (inline) all external LSAs which now match the new
173 need to adjust the OSPF_LSA_SELF flag, so the flush doesnt
175 asserts in ospf_refresher_unregister_lsa(). This step is
177 because the current quagga code does look-up for
179 based on the self router-id alone but expects OSPF_LSA_SELF
183 struct route_node
*rn
;
184 struct ospf_lsa
*lsa
;
186 LSDB_LOOP (EXTERNAL_LSDB(ospf
), rn
, lsa
) {
187 /* AdvRouter and Router ID is the same. */
188 if (IPV4_ADDR_SAME(&lsa
->data
->adv_router
,
191 OSPF_LSA_SELF_CHECKED
);
192 SET_FLAG(lsa
->flags
, OSPF_LSA_SELF
);
193 ospf_lsa_flush_schedule(ospf
, lsa
);
198 /* Originate each redistributed external route. */
199 for (type
= 0; type
< ZEBRA_ROUTE_MAX
; type
++)
200 thread_add_event(master
,
201 ospf_external_lsa_originate_timer
,
203 thread_add_event(master
, ospf_default_originate_timer
, ospf
, 0,
206 /* update router-lsa's for each area */
207 ospf_router_lsa_update(ospf
);
209 /* update ospf_interface's */
210 FOR_ALL_INTERFACES (vrf
, ifp
)
211 ospf_if_update(ospf
, ifp
);
215 /* For OSPF area sort by area id. */
216 static int ospf_area_id_cmp(struct ospf_area
*a1
, struct ospf_area
*a2
)
218 if (ntohl(a1
->area_id
.s_addr
) > ntohl(a2
->area_id
.s_addr
))
220 if (ntohl(a1
->area_id
.s_addr
) < ntohl(a2
->area_id
.s_addr
))
225 /* Allocate new ospf structure. */
226 static struct ospf
*ospf_new(unsigned short instance
, const char *name
)
229 struct vrf
*vrf
= NULL
;
231 struct ospf
*new = XCALLOC(MTYPE_OSPF_TOP
, sizeof(struct ospf
));
233 new->instance
= instance
;
234 new->router_id
.s_addr
= htonl(0);
235 new->router_id_static
.s_addr
= htonl(0);
238 new->vrf_id
= VRF_UNKNOWN
;
239 /* Freed in ospf_finish_final */
240 new->name
= XSTRDUP(MTYPE_OSPF_TOP
, name
);
241 vrf
= vrf_lookup_by_name(new->name
);
242 if (IS_DEBUG_OSPF_EVENT
)
244 "%s: Create new ospf instance with vrf_name %s vrf_id %u",
245 __PRETTY_FUNCTION__
, name
, new->vrf_id
);
247 ospf_vrf_link(new, vrf
);
249 new->vrf_id
= VRF_DEFAULT
;
250 vrf
= vrf_lookup_by_id(VRF_DEFAULT
);
251 ospf_vrf_link(new, vrf
);
253 ospf_zebra_vrf_register(new);
255 new->abr_type
= OSPF_ABR_DEFAULT
;
256 new->oiflist
= list_new();
257 new->vlinks
= list_new();
258 new->areas
= list_new();
259 new->areas
->cmp
= (int (*)(void *, void *))ospf_area_id_cmp
;
260 new->networks
= route_table_init();
261 new->nbr_nbma
= route_table_init();
263 new->lsdb
= ospf_lsdb_new();
265 new->default_originate
= DEFAULT_ORIGINATE_NONE
;
267 new->passive_interface_default
= OSPF_IF_ACTIVE
;
269 new->new_external_route
= route_table_init();
270 new->old_external_route
= route_table_init();
271 new->external_lsas
= route_table_init();
273 new->stub_router_startup_time
= OSPF_STUB_ROUTER_UNCONFIGURED
;
274 new->stub_router_shutdown_time
= OSPF_STUB_ROUTER_UNCONFIGURED
;
275 new->stub_router_admin_set
= OSPF_STUB_ROUTER_ADMINISTRATIVE_UNSET
;
277 /* Distribute parameter init. */
278 for (i
= 0; i
<= ZEBRA_ROUTE_MAX
; i
++) {
281 new->default_metric
= -1;
282 new->ref_bandwidth
= OSPF_DEFAULT_REF_BANDWIDTH
;
285 new->min_ls_interval
= OSPF_MIN_LS_INTERVAL
;
286 new->min_ls_arrival
= OSPF_MIN_LS_ARRIVAL
;
288 /* SPF timer value init. */
289 new->spf_delay
= OSPF_SPF_DELAY_DEFAULT
;
290 new->spf_holdtime
= OSPF_SPF_HOLDTIME_DEFAULT
;
291 new->spf_max_holdtime
= OSPF_SPF_MAX_HOLDTIME_DEFAULT
;
292 new->spf_hold_multiplier
= 1;
295 new->maxage_delay
= OSPF_LSA_MAXAGE_REMOVE_DELAY_DEFAULT
;
296 new->maxage_lsa
= route_table_init();
297 new->t_maxage_walker
= NULL
;
298 thread_add_timer(master
, ospf_lsa_maxage_walker
, new,
299 OSPF_LSA_MAXAGE_CHECK_INTERVAL
, &new->t_maxage_walker
);
301 /* Distance table init. */
302 new->distance_table
= route_table_init();
304 new->lsa_refresh_queue
.index
= 0;
305 new->lsa_refresh_interval
= OSPF_LSA_REFRESH_INTERVAL_DEFAULT
;
306 new->t_lsa_refresher
= NULL
;
307 thread_add_timer(master
, ospf_lsa_refresh_walker
, new,
308 new->lsa_refresh_interval
, &new->t_lsa_refresher
);
309 new->lsa_refresher_started
= monotime(NULL
);
311 if ((new->ibuf
= stream_new(OSPF_MAX_PACKET_SIZE
+ 1)) == NULL
) {
313 "ospf_new: fatal error: stream_new(%u) failed allocating ibuf",
314 OSPF_MAX_PACKET_SIZE
+ 1);
318 new->oi_write_q
= list_new();
319 new->write_oi_count
= OSPF_WRITE_INTERFACE_COUNT_DEFAULT
;
321 /* Enable "log-adjacency-changes" */
322 #if DFLT_OSPF_LOG_ADJACENCY_CHANGES
323 SET_FLAG(new->config
, OSPF_LOG_ADJACENCY_CHANGES
);
329 if ((ospf_sock_init(new)) < 0) {
330 if (new->vrf_id
!= VRF_UNKNOWN
)
332 "%s: ospf_sock_init is unable to open a socket",
336 thread_add_read(master
, ospf_read
, new, new->fd
, &new->t_read
);
341 struct ospf
*ospf_lookup_instance(unsigned short instance
)
344 struct listnode
*node
, *nnode
;
346 if (listcount(om
->ospf
) == 0)
349 for (ALL_LIST_ELEMENTS(om
->ospf
, node
, nnode
, ospf
))
350 if ((ospf
->instance
== 0 && instance
== 0)
351 || (ospf
->instance
&& instance
352 && ospf
->instance
== instance
))
358 static int ospf_is_ready(struct ospf
*ospf
)
360 /* OSPF must be on and Router-ID must be configured. */
361 if (!ospf
|| ospf
->router_id
.s_addr
== 0)
367 static void ospf_add(struct ospf
*ospf
)
369 listnode_add(om
->ospf
, ospf
);
372 static void ospf_delete(struct ospf
*ospf
)
374 listnode_delete(om
->ospf
, ospf
);
377 struct ospf
*ospf_lookup_by_inst_name(unsigned short instance
, const char *name
)
379 struct ospf
*ospf
= NULL
;
380 struct listnode
*node
, *nnode
;
382 for (ALL_LIST_ELEMENTS(om
->ospf
, node
, nnode
, ospf
)) {
383 if ((ospf
->instance
== instance
)
384 && ((ospf
->name
== NULL
&& name
== NULL
)
385 || (ospf
->name
&& name
386 && strcmp(ospf
->name
, name
) == 0)))
392 struct ospf
*ospf_get(unsigned short instance
, const char *name
)
396 /* vrf name provided call inst and name based api
397 * in case of no name pass default ospf instance */
399 ospf
= ospf_lookup_by_inst_name(instance
, name
);
401 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
404 ospf
= ospf_new(instance
, name
);
407 if (ospf
->router_id_static
.s_addr
== 0)
408 ospf_router_id_update(ospf
);
410 ospf_opaque_type11_lsa_init(ospf
);
416 struct ospf
*ospf_get_instance(unsigned short instance
)
420 ospf
= ospf_lookup_instance(instance
);
422 ospf
= ospf_new(instance
, NULL
/* VRF_DEFAULT*/);
425 if (ospf
->router_id_static
.s_addr
== 0) {
426 if (vrf_lookup_by_id(ospf
->vrf_id
))
427 ospf_router_id_update(ospf
);
429 if (IS_DEBUG_OSPF_EVENT
)
431 "%s: ospf VRF (id %d) is not active yet, skip router id update",
435 ospf_router_id_update(ospf
);
438 ospf_opaque_type11_lsa_init(ospf
);
444 struct ospf
*ospf_lookup_by_vrf_id(vrf_id_t vrf_id
)
446 struct vrf
*vrf
= NULL
;
448 vrf
= vrf_lookup_by_id(vrf_id
);
451 return (vrf
->info
) ? (struct ospf
*)vrf
->info
: NULL
;
454 /* It should only be used when processing incoming info update from zebra.
455 * Other situations, it is not sufficient to lookup the ospf instance by
456 * vrf_name only without using the instance number.
458 static struct ospf
*ospf_lookup_by_name(const char *vrf_name
)
460 struct ospf
*ospf
= NULL
;
461 struct listnode
*node
, *nnode
;
463 for (ALL_LIST_ELEMENTS(om
->ospf
, node
, nnode
, ospf
))
464 if ((ospf
->name
== NULL
&& vrf_name
== NULL
)
465 || (ospf
->name
&& vrf_name
466 && strcmp(ospf
->name
, vrf_name
) == 0))
471 /* Handle the second half of deferred shutdown. This is called either
472 * from the deferred-shutdown timer thread, or directly through
473 * ospf_deferred_shutdown_check.
475 * Function is to cleanup G-R state, if required then call ospf_finish_final
476 * to complete shutdown of this ospf instance. Possibly exit if the
477 * whole process is being shutdown and this was the last OSPF instance.
479 static void ospf_deferred_shutdown_finish(struct ospf
*ospf
)
481 ospf
->stub_router_shutdown_time
= OSPF_STUB_ROUTER_UNCONFIGURED
;
482 OSPF_TIMER_OFF(ospf
->t_deferred_shutdown
);
484 ospf_finish_final(ospf
);
486 /* *ospf is now invalid */
488 /* ospfd being shut-down? If so, was this the last ospf instance? */
489 if (CHECK_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
)
490 && (listcount(om
->ospf
) == 0)) {
497 /* Timer thread for G-R */
498 static int ospf_deferred_shutdown_timer(struct thread
*t
)
500 struct ospf
*ospf
= THREAD_ARG(t
);
502 ospf_deferred_shutdown_finish(ospf
);
507 /* Check whether deferred-shutdown must be scheduled, otherwise call
508 * down directly into second-half of instance shutdown.
510 static void ospf_deferred_shutdown_check(struct ospf
*ospf
)
512 unsigned long timeout
;
514 struct ospf_area
*area
;
516 /* deferred shutdown already running? */
517 if (ospf
->t_deferred_shutdown
)
520 /* Should we try push out max-metric LSAs? */
521 if (ospf
->stub_router_shutdown_time
!= OSPF_STUB_ROUTER_UNCONFIGURED
) {
522 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, ln
, area
)) {
523 SET_FLAG(area
->stub_router_state
,
524 OSPF_AREA_ADMIN_STUB_ROUTED
);
526 if (!CHECK_FLAG(area
->stub_router_state
,
527 OSPF_AREA_IS_STUB_ROUTED
))
528 ospf_router_lsa_update_area(area
);
530 timeout
= ospf
->stub_router_shutdown_time
;
532 /* No timer needed */
533 ospf_deferred_shutdown_finish(ospf
);
537 OSPF_TIMER_ON(ospf
->t_deferred_shutdown
, ospf_deferred_shutdown_timer
,
542 /* Shut down the entire process */
543 void ospf_terminate(void)
546 struct listnode
*node
, *nnode
;
548 /* shutdown already in progress */
549 if (CHECK_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
))
552 SET_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
);
554 /* exit immediately if OSPF not actually running */
555 if (listcount(om
->ospf
) == 0)
559 for (ALL_LIST_ELEMENTS(om
->ospf
, node
, nnode
, ospf
))
562 /* Cleanup route maps */
563 route_map_add_hook(NULL
);
564 route_map_delete_hook(NULL
);
565 route_map_event_hook(NULL
);
568 /* reverse prefix_list_init */
569 prefix_list_add_hook(NULL
);
570 prefix_list_delete_hook(NULL
);
573 /* Cleanup vrf info */
574 ospf_vrf_terminate();
576 /* Deliberately go back up, hopefully to thread scheduler, as
577 * One or more ospf_finish()'s may have deferred shutdown to a timer
580 zclient_stop(zclient
);
581 zclient_free(zclient
);
586 void ospf_finish(struct ospf
*ospf
)
588 /* let deferred shutdown decide */
589 ospf_deferred_shutdown_check(ospf
);
591 /* if ospf_deferred_shutdown returns, then ospf_finish_final is
592 * deferred to expiry of G-S timer thread. Return back up, hopefully
593 * to thread scheduler.
598 /* Final cleanup of ospf instance */
599 static void ospf_finish_final(struct ospf
*ospf
)
601 struct vrf
*vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
602 struct route_node
*rn
;
603 struct ospf_nbr_nbma
*nbr_nbma
;
604 struct ospf_lsa
*lsa
;
605 struct interface
*ifp
;
606 struct ospf_interface
*oi
;
607 struct ospf_area
*area
;
608 struct ospf_vl_data
*vl_data
;
609 struct listnode
*node
, *nnode
;
611 unsigned short instance
= 0;
615 ospf_opaque_type11_lsa_term(ospf
);
617 ospf_opaque_finish();
619 ospf_flush_self_originated_lsas_now(ospf
);
621 /* Unregister redistribution */
622 for (i
= 0; i
< ZEBRA_ROUTE_MAX
; i
++) {
623 struct list
*red_list
;
624 struct ospf_redist
*red
;
626 red_list
= ospf
->redist
[i
];
630 for (ALL_LIST_ELEMENTS(red_list
, node
, nnode
, red
))
631 ospf_redistribute_unset(ospf
, i
, red
->instance
);
633 ospf_redistribute_default_unset(ospf
);
635 for (ALL_LIST_ELEMENTS(ospf
->areas
, node
, nnode
, area
))
636 ospf_remove_vls_through_area(ospf
, area
);
638 for (ALL_LIST_ELEMENTS(ospf
->vlinks
, node
, nnode
, vl_data
))
639 ospf_vl_delete(ospf
, vl_data
);
641 list_delete_and_null(&ospf
->vlinks
);
643 /* Remove any ospf interface config params */
644 FOR_ALL_INTERFACES (vrf
, ifp
) {
645 struct ospf_if_params
*params
;
647 params
= IF_DEF_PARAMS(ifp
);
648 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
))
649 UNSET_IF_PARAM(params
, if_area
);
652 /* Reset interface. */
653 for (ALL_LIST_ELEMENTS(ospf
->oiflist
, node
, nnode
, oi
))
655 list_delete_and_null(&ospf
->oiflist
);
657 /* De-Register VRF */
658 ospf_zebra_vrf_deregister(ospf
);
660 /* Clear static neighbors */
661 for (rn
= route_top(ospf
->nbr_nbma
); rn
; rn
= route_next(rn
))
662 if ((nbr_nbma
= rn
->info
)) {
663 OSPF_POLL_TIMER_OFF(nbr_nbma
->t_poll
);
666 nbr_nbma
->nbr
->nbr_nbma
= NULL
;
667 nbr_nbma
->nbr
= NULL
;
671 listnode_delete(nbr_nbma
->oi
->nbr_nbma
,
676 XFREE(MTYPE_OSPF_NEIGHBOR_STATIC
, nbr_nbma
);
679 route_table_finish(ospf
->nbr_nbma
);
681 /* Clear networks and Areas. */
682 for (rn
= route_top(ospf
->networks
); rn
; rn
= route_next(rn
)) {
683 struct ospf_network
*network
;
685 if ((network
= rn
->info
) != NULL
) {
686 ospf_network_free(ospf
, network
);
688 route_unlock_node(rn
);
691 route_table_finish(ospf
->networks
);
693 for (ALL_LIST_ELEMENTS(ospf
->areas
, node
, nnode
, area
)) {
694 listnode_delete(ospf
->areas
, area
);
695 ospf_area_free(area
);
698 /* Cancel all timers. */
699 OSPF_TIMER_OFF(ospf
->t_external_lsa
);
700 OSPF_TIMER_OFF(ospf
->t_spf_calc
);
701 OSPF_TIMER_OFF(ospf
->t_ase_calc
);
702 OSPF_TIMER_OFF(ospf
->t_maxage
);
703 OSPF_TIMER_OFF(ospf
->t_maxage_walker
);
704 OSPF_TIMER_OFF(ospf
->t_abr_task
);
705 OSPF_TIMER_OFF(ospf
->t_asbr_check
);
706 OSPF_TIMER_OFF(ospf
->t_distribute_update
);
707 OSPF_TIMER_OFF(ospf
->t_lsa_refresher
);
708 OSPF_TIMER_OFF(ospf
->t_read
);
709 OSPF_TIMER_OFF(ospf
->t_write
);
710 OSPF_TIMER_OFF(ospf
->t_opaque_lsa_self
);
711 OSPF_TIMER_OFF(ospf
->t_sr_update
);
714 stream_free(ospf
->ibuf
);
716 LSDB_LOOP (OPAQUE_AS_LSDB(ospf
), rn
, lsa
)
717 ospf_discard_from_db(ospf
, ospf
->lsdb
, lsa
);
718 LSDB_LOOP (EXTERNAL_LSDB(ospf
), rn
, lsa
)
719 ospf_discard_from_db(ospf
, ospf
->lsdb
, lsa
);
721 ospf_lsdb_delete_all(ospf
->lsdb
);
722 ospf_lsdb_free(ospf
->lsdb
);
724 for (rn
= route_top(ospf
->maxage_lsa
); rn
; rn
= route_next(rn
)) {
725 struct ospf_lsa
*lsa
;
727 if ((lsa
= rn
->info
) != NULL
) {
728 ospf_lsa_unlock(&lsa
);
731 route_unlock_node(rn
);
733 route_table_finish(ospf
->maxage_lsa
);
736 ospf_route_table_free(ospf
->old_table
);
737 if (ospf
->new_table
) {
738 ospf_route_delete(ospf
, ospf
->new_table
);
739 ospf_route_table_free(ospf
->new_table
);
742 ospf_rtrs_free(ospf
->old_rtrs
);
744 ospf_rtrs_free(ospf
->new_rtrs
);
745 if (ospf
->new_external_route
) {
746 ospf_route_delete(ospf
, ospf
->new_external_route
);
747 ospf_route_table_free(ospf
->new_external_route
);
749 if (ospf
->old_external_route
) {
750 ospf_route_delete(ospf
, ospf
->old_external_route
);
751 ospf_route_table_free(ospf
->old_external_route
);
753 if (ospf
->external_lsas
) {
754 ospf_ase_external_lsas_finish(ospf
->external_lsas
);
757 list_delete_and_null(&ospf
->areas
);
758 list_delete_and_null(&ospf
->oi_write_q
);
760 for (i
= ZEBRA_ROUTE_SYSTEM
; i
<= ZEBRA_ROUTE_MAX
; i
++) {
761 struct list
*ext_list
;
762 struct listnode
*node
;
763 struct ospf_external
*ext
;
765 ext_list
= ospf
->external
[i
];
769 for (ALL_LIST_ELEMENTS_RO(ext_list
, node
, ext
)) {
770 if (ext
->external_info
)
771 for (rn
= route_top(ext
->external_info
); rn
;
772 rn
= route_next(rn
)) {
773 if (rn
->info
== NULL
)
776 XFREE(MTYPE_OSPF_EXTERNAL_INFO
,
779 route_unlock_node(rn
);
784 ospf_distance_reset(ospf
);
785 route_table_finish(ospf
->distance_table
);
787 if (!CHECK_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
))
788 instance
= ospf
->instance
;
793 vrf
= vrf_lookup_by_name(ospf
->name
);
795 ospf_vrf_unlink(ospf
, vrf
);
796 XFREE(MTYPE_OSPF_TOP
, ospf
->name
);
798 vrf
= vrf_lookup_by_id(VRF_DEFAULT
);
800 ospf_vrf_unlink(ospf
, vrf
);
803 XFREE(MTYPE_OSPF_TOP
, ospf
);
805 if (!CHECK_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
))
806 ospf_get_instance(instance
);
810 /* allocate new OSPF Area object */
811 static struct ospf_area
*ospf_area_new(struct ospf
*ospf
,
812 struct in_addr area_id
)
814 struct ospf_area
*new;
816 /* Allocate new config_network. */
817 new = XCALLOC(MTYPE_OSPF_AREA
, sizeof(struct ospf_area
));
821 new->area_id
= area_id
;
822 new->area_id_fmt
= OSPF_AREA_ID_FMT_DOTTEDQUAD
;
824 new->external_routing
= OSPF_AREA_DEFAULT
;
825 new->default_cost
= 1;
826 new->auth_type
= OSPF_AUTH_NULL
;
829 new->lsdb
= ospf_lsdb_new();
831 /* Self-originated LSAs initialize. */
832 new->router_lsa_self
= NULL
;
834 ospf_opaque_type10_lsa_init(new);
836 new->oiflist
= list_new();
837 new->ranges
= route_table_init();
839 if (area_id
.s_addr
== OSPF_AREA_BACKBONE
)
840 ospf
->backbone
= new;
845 static void ospf_area_free(struct ospf_area
*area
)
847 struct route_node
*rn
;
848 struct ospf_lsa
*lsa
;
850 ospf_opaque_type10_lsa_term(area
);
853 LSDB_LOOP (ROUTER_LSDB(area
), rn
, lsa
)
854 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
855 LSDB_LOOP (NETWORK_LSDB(area
), rn
, lsa
)
856 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
857 LSDB_LOOP (SUMMARY_LSDB(area
), rn
, lsa
)
858 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
859 LSDB_LOOP (ASBR_SUMMARY_LSDB(area
), rn
, lsa
)
860 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
862 LSDB_LOOP (NSSA_LSDB(area
), rn
, lsa
)
863 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
864 LSDB_LOOP (OPAQUE_AREA_LSDB(area
), rn
, lsa
)
865 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
866 LSDB_LOOP (OPAQUE_LINK_LSDB(area
), rn
, lsa
)
867 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
869 ospf_lsdb_delete_all(area
->lsdb
);
870 ospf_lsdb_free(area
->lsdb
);
872 ospf_lsa_unlock(&area
->router_lsa_self
);
874 route_table_finish(area
->ranges
);
875 list_delete_and_null(&area
->oiflist
);
877 if (EXPORT_NAME(area
))
878 free(EXPORT_NAME(area
));
880 if (IMPORT_NAME(area
))
881 free(IMPORT_NAME(area
));
884 OSPF_TIMER_OFF(area
->t_stub_router
);
885 OSPF_TIMER_OFF(area
->t_opaque_lsa_self
);
887 if (OSPF_IS_AREA_BACKBONE(area
))
888 area
->ospf
->backbone
= NULL
;
890 XFREE(MTYPE_OSPF_AREA
, area
);
893 void ospf_area_check_free(struct ospf
*ospf
, struct in_addr area_id
)
895 struct ospf_area
*area
;
897 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
898 if (area
&& listcount(area
->oiflist
) == 0 && area
->ranges
->top
== NULL
899 && area
->shortcut_configured
== OSPF_SHORTCUT_DEFAULT
900 && area
->external_routing
== OSPF_AREA_DEFAULT
901 && area
->no_summary
== 0 && area
->default_cost
== 1
902 && EXPORT_NAME(area
) == NULL
&& IMPORT_NAME(area
) == NULL
903 && area
->auth_type
== OSPF_AUTH_NULL
) {
904 listnode_delete(ospf
->areas
, area
);
905 ospf_area_free(area
);
909 struct ospf_area
*ospf_area_get(struct ospf
*ospf
, struct in_addr area_id
)
911 struct ospf_area
*area
;
913 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
915 area
= ospf_area_new(ospf
, area_id
);
916 listnode_add_sort(ospf
->areas
, area
);
917 ospf_check_abr_status(ospf
);
918 if (ospf
->stub_router_admin_set
919 == OSPF_STUB_ROUTER_ADMINISTRATIVE_SET
) {
920 SET_FLAG(area
->stub_router_state
,
921 OSPF_AREA_ADMIN_STUB_ROUTED
);
928 struct ospf_area
*ospf_area_lookup_by_area_id(struct ospf
*ospf
,
929 struct in_addr area_id
)
931 struct ospf_area
*area
;
932 struct listnode
*node
;
934 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
))
935 if (IPV4_ADDR_SAME(&area
->area_id
, &area_id
))
941 void ospf_area_add_if(struct ospf_area
*area
, struct ospf_interface
*oi
)
943 listnode_add(area
->oiflist
, oi
);
946 void ospf_area_del_if(struct ospf_area
*area
, struct ospf_interface
*oi
)
948 listnode_delete(area
->oiflist
, oi
);
952 static void add_ospf_interface(struct connected
*co
, struct ospf_area
*area
)
954 struct ospf_interface
*oi
;
956 oi
= ospf_if_new(area
->ospf
, co
->ifp
, co
->address
);
961 oi
->params
= ospf_lookup_if_params(co
->ifp
, oi
->address
->u
.prefix4
);
962 oi
->output_cost
= ospf_if_get_output_cost(oi
);
964 /* Relate ospf interface to ospf instance. */
965 oi
->ospf
= area
->ospf
;
967 /* update network type as interface flag */
968 /* If network type is specified previously,
969 skip network type setting. */
970 oi
->type
= IF_DEF_PARAMS(co
->ifp
)->type
;
972 /* Add pseudo neighbor. */
973 ospf_nbr_self_reset(oi
, oi
->ospf
->router_id
);
975 ospf_area_add_if(oi
->area
, oi
);
978 * if router_id is not configured, dont bring up
980 * ospf_router_id_update() will call ospf_if_update
981 * whenever r-id is configured instead.
983 if ((area
->ospf
->router_id
.s_addr
!= 0) && if_is_operative(co
->ifp
))
987 static void update_redistributed(struct ospf
*ospf
, int add_to_ospf
)
989 struct route_node
*rn
;
990 struct external_info
*ei
;
991 struct ospf_external
*ext
;
993 if (ospf_is_type_redistributed(ospf
, ZEBRA_ROUTE_CONNECT
, 0)) {
994 ext
= ospf_external_lookup(ospf
, ZEBRA_ROUTE_CONNECT
, 0);
995 if ((ext
) && EXTERNAL_INFO(ext
)) {
996 for (rn
= route_top(EXTERNAL_INFO(ext
)); rn
;
997 rn
= route_next(rn
)) {
1003 if (ospf_external_info_find_lsa(ospf
,
1005 if (!ospf_distribute_check_connected(
1007 ospf_external_lsa_flush(
1010 ei
->ifindex
/*, ei->nexthop */);
1012 if (!ospf_external_info_find_lsa(
1014 if (ospf_distribute_check_connected(
1016 ospf_external_lsa_originate(
1024 /* Config network statement related functions. */
1025 static struct ospf_network
*ospf_network_new(struct in_addr area_id
)
1027 struct ospf_network
*new;
1028 new = XCALLOC(MTYPE_OSPF_NETWORK
, sizeof(struct ospf_network
));
1030 new->area_id
= area_id
;
1031 new->area_id_fmt
= OSPF_AREA_ID_FMT_DOTTEDQUAD
;
1036 static void ospf_network_free(struct ospf
*ospf
, struct ospf_network
*network
)
1038 ospf_area_check_free(ospf
, network
->area_id
);
1039 ospf_schedule_abr_task(ospf
);
1040 XFREE(MTYPE_OSPF_NETWORK
, network
);
1043 int ospf_network_set(struct ospf
*ospf
, struct prefix_ipv4
*p
,
1044 struct in_addr area_id
, int df
)
1046 struct ospf_network
*network
;
1047 struct ospf_area
*area
;
1048 struct route_node
*rn
;
1050 rn
= route_node_get(ospf
->networks
, (struct prefix
*)p
);
1053 route_unlock_node(rn
);
1055 if (IPV4_ADDR_SAME(&area_id
, &network
->area_id
)) {
1058 /* There is already same network statement. */
1063 rn
->info
= network
= ospf_network_new(area_id
);
1064 network
->area_id_fmt
= df
;
1065 area
= ospf_area_get(ospf
, area_id
);
1066 ospf_area_display_format_set(ospf
, area
, df
);
1068 /* Run network config now. */
1069 ospf_network_run((struct prefix
*)p
, area
);
1071 /* Update connected redistribute. */
1072 update_redistributed(ospf
, 1); /* interfaces possibly added */
1074 ospf_area_check_free(ospf
, area_id
);
1079 int ospf_network_unset(struct ospf
*ospf
, struct prefix_ipv4
*p
,
1080 struct in_addr area_id
)
1082 struct route_node
*rn
;
1083 struct ospf_network
*network
;
1084 struct listnode
*node
, *nnode
;
1085 struct ospf_interface
*oi
;
1087 rn
= route_node_lookup(ospf
->networks
, (struct prefix
*)p
);
1092 route_unlock_node(rn
);
1093 if (!IPV4_ADDR_SAME(&area_id
, &network
->area_id
))
1096 ospf_network_free(ospf
, rn
->info
);
1098 route_unlock_node(rn
); /* initial reference */
1100 /* Find interfaces that are not configured already. */
1101 for (ALL_LIST_ELEMENTS(ospf
->oiflist
, node
, nnode
, oi
)) {
1103 if (oi
->type
== OSPF_IFTYPE_VIRTUALLINK
)
1106 ospf_network_run_subnet(ospf
, oi
->connected
, NULL
, NULL
);
1109 /* Update connected redistribute. */
1110 update_redistributed(ospf
, 0); /* interfaces possibly removed */
1111 ospf_area_check_free(ospf
, area_id
);
1116 /* Ensure there's an OSPF instance, as "ip ospf area" enabled OSPF means
1117 * there might not be any 'router ospf' config.
1119 * Otherwise, doesn't do anything different to ospf_if_update for now
1121 void ospf_interface_area_set(struct ospf
*ospf
, struct interface
*ifp
)
1126 ospf_if_update(ospf
, ifp
);
1127 /* if_update does a update_redistributed */
1132 void ospf_interface_area_unset(struct ospf
*ospf
, struct interface
*ifp
)
1134 struct route_node
*rn_oi
;
1137 return; /* Ospf not ready yet */
1139 /* Find interfaces that may need to be removed. */
1140 for (rn_oi
= route_top(IF_OIFS(ifp
)); rn_oi
;
1141 rn_oi
= route_next(rn_oi
)) {
1142 struct ospf_interface
*oi
= NULL
;
1144 if ((oi
= rn_oi
->info
) == NULL
)
1147 if (oi
->type
== OSPF_IFTYPE_VIRTUALLINK
)
1150 ospf_network_run_subnet(ospf
, oi
->connected
, NULL
, NULL
);
1153 /* Update connected redistribute. */
1154 update_redistributed(ospf
, 0); /* interfaces possibly removed */
1157 /* Check whether interface matches given network
1158 * returns: 1, true. 0, false
1160 static int ospf_network_match_iface(const struct connected
*co
,
1161 const struct prefix
*net
)
1163 /* new approach: more elegant and conceptually clean */
1164 return prefix_match_network_statement(net
, CONNECTED_PREFIX(co
));
1167 static void ospf_update_interface_area(struct connected
*co
,
1168 struct ospf_area
*area
)
1170 struct ospf_interface
*oi
= ospf_if_table_lookup(co
->ifp
, co
->address
);
1172 /* nothing to be done case */
1173 if (oi
&& oi
->area
== area
) {
1180 add_ospf_interface(co
, area
);
1183 /* Run OSPF for the given subnet, taking into account the following
1184 * possible sources of area configuration, in the given order of preference:
1186 * - Whether there is interface+address specific area configuration
1187 * - Whether there is a default area for the interface
1188 * - Whether there is an area given as a parameter.
1189 * - If no specific network prefix/area is supplied, whether there's
1190 * a matching network configured.
1192 static void ospf_network_run_subnet(struct ospf
*ospf
, struct connected
*co
,
1194 struct ospf_area
*given_area
)
1196 struct ospf_interface
*oi
;
1197 struct ospf_if_params
*params
;
1198 struct ospf_area
*area
= NULL
;
1199 struct route_node
*rn
;
1202 if (CHECK_FLAG(co
->flags
, ZEBRA_IFA_SECONDARY
))
1205 if (co
->address
->family
!= AF_INET
)
1208 /* Try determine the appropriate area for this interface + address
1209 * Start by checking interface config
1211 params
= ospf_lookup_if_params(co
->ifp
, co
->address
->u
.prefix4
);
1212 if (params
&& OSPF_IF_PARAM_CONFIGURED(params
, if_area
))
1213 area
= ospf_area_get(ospf
, params
->if_area
);
1215 params
= IF_DEF_PARAMS(co
->ifp
);
1216 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
))
1217 area
= ospf_area_get(ospf
, params
->if_area
);
1220 /* If we've found an interface and/or addr specific area, then we're
1224 ospf_update_interface_area(co
, area
);
1228 /* Otherwise, only remaining possibility is a matching network statement
1231 assert(given_area
!= NULL
);
1233 /* Which either was supplied as a parameter.. (e.g. cause a new
1234 * network/area was just added)..
1236 if (p
->family
== co
->address
->family
1237 && ospf_network_match_iface(co
, p
))
1238 ospf_update_interface_area(co
, given_area
);
1243 /* Else we have to search the existing network/area config to see
1246 for (rn
= route_top(ospf
->networks
); rn
; rn
= route_next(rn
))
1247 if (rn
->info
!= NULL
&& ospf_network_match_iface(co
, &rn
->p
)) {
1248 struct ospf_network
*network
=
1249 (struct ospf_network
*)rn
->info
;
1250 area
= ospf_area_get(ospf
, network
->area_id
);
1251 ospf_update_interface_area(co
, area
);
1255 /* If the subnet isn't in any area, deconfigure */
1256 if (!configed
&& (oi
= ospf_if_table_lookup(co
->ifp
, co
->address
)))
1260 static void ospf_network_run_interface(struct ospf
*ospf
, struct interface
*ifp
,
1262 struct ospf_area
*given_area
)
1264 struct listnode
*cnode
;
1265 struct connected
*co
;
1267 if (memcmp(ifp
->name
, "VLINK", 5) == 0)
1270 /* Network prefix without area is nonsensical */
1272 assert(given_area
!= NULL
);
1274 /* if interface prefix is match specified prefix,
1275 then create socket and join multicast group. */
1276 for (ALL_LIST_ELEMENTS_RO(ifp
->connected
, cnode
, co
))
1277 ospf_network_run_subnet(ospf
, co
, p
, given_area
);
1280 static void ospf_network_run(struct prefix
*p
, struct ospf_area
*area
)
1282 struct vrf
*vrf
= vrf_lookup_by_id(area
->ospf
->vrf_id
);
1283 struct interface
*ifp
;
1285 /* Schedule Router ID Update. */
1286 if (area
->ospf
->router_id
.s_addr
== 0)
1287 ospf_router_id_update(area
->ospf
);
1289 /* Get target interface. */
1290 FOR_ALL_INTERFACES (vrf
, ifp
)
1291 ospf_network_run_interface(area
->ospf
, ifp
, p
, area
);
1294 void ospf_ls_upd_queue_empty(struct ospf_interface
*oi
)
1296 struct route_node
*rn
;
1297 struct listnode
*node
, *nnode
;
1299 struct ospf_lsa
*lsa
;
1301 /* empty ls update queue */
1302 for (rn
= route_top(oi
->ls_upd_queue
); rn
; rn
= route_next(rn
))
1303 if ((lst
= (struct list
*)rn
->info
)) {
1304 for (ALL_LIST_ELEMENTS(lst
, node
, nnode
, lsa
))
1305 ospf_lsa_unlock(&lsa
); /* oi->ls_upd_queue */
1306 list_delete_and_null(&lst
);
1310 /* remove update event */
1311 if (oi
->t_ls_upd_event
) {
1312 thread_cancel(oi
->t_ls_upd_event
);
1313 oi
->t_ls_upd_event
= NULL
;
1317 void ospf_if_update(struct ospf
*ospf
, struct interface
*ifp
)
1323 if (IS_DEBUG_OSPF_EVENT
)
1325 "%s: interface %s ifp->vrf_id %u ospf vrf %s vrf_id %u router_id %s",
1326 __PRETTY_FUNCTION__
, ifp
->name
, ifp
->vrf_id
,
1327 ospf_vrf_id_to_name(ospf
->vrf_id
), ospf
->vrf_id
,
1328 inet_ntoa(ospf
->router_id
));
1330 /* OSPF must be ready. */
1331 if (!ospf_is_ready(ospf
))
1334 ospf_network_run_interface(ospf
, ifp
, NULL
, NULL
);
1336 /* Update connected redistribute. */
1337 update_redistributed(ospf
, 1);
1340 void ospf_remove_vls_through_area(struct ospf
*ospf
, struct ospf_area
*area
)
1342 struct listnode
*node
, *nnode
;
1343 struct ospf_vl_data
*vl_data
;
1345 for (ALL_LIST_ELEMENTS(ospf
->vlinks
, node
, nnode
, vl_data
))
1346 if (IPV4_ADDR_SAME(&vl_data
->vl_area_id
, &area
->area_id
))
1347 ospf_vl_delete(ospf
, vl_data
);
1351 static const struct message ospf_area_type_msg
[] = {
1352 {OSPF_AREA_DEFAULT
, "Default"},
1353 {OSPF_AREA_STUB
, "Stub"},
1354 {OSPF_AREA_NSSA
, "NSSA"},
1357 static void ospf_area_type_set(struct ospf_area
*area
, int type
)
1359 struct listnode
*node
;
1360 struct ospf_interface
*oi
;
1362 if (area
->external_routing
== type
) {
1363 if (IS_DEBUG_OSPF_EVENT
)
1364 zlog_debug("Area[%s]: Types are the same, ignored.",
1365 inet_ntoa(area
->area_id
));
1369 area
->external_routing
= type
;
1371 if (IS_DEBUG_OSPF_EVENT
)
1372 zlog_debug("Area[%s]: Configured as %s",
1373 inet_ntoa(area
->area_id
),
1374 lookup_msg(ospf_area_type_msg
, type
, NULL
));
1376 switch (area
->external_routing
) {
1377 case OSPF_AREA_DEFAULT
:
1378 for (ALL_LIST_ELEMENTS_RO(area
->oiflist
, node
, oi
))
1379 if (oi
->nbr_self
!= NULL
) {
1380 UNSET_FLAG(oi
->nbr_self
->options
,
1382 SET_FLAG(oi
->nbr_self
->options
, OSPF_OPTION_E
);
1385 case OSPF_AREA_STUB
:
1386 for (ALL_LIST_ELEMENTS_RO(area
->oiflist
, node
, oi
))
1387 if (oi
->nbr_self
!= NULL
) {
1388 if (IS_DEBUG_OSPF_EVENT
)
1390 "setting options on %s accordingly",
1392 UNSET_FLAG(oi
->nbr_self
->options
,
1394 UNSET_FLAG(oi
->nbr_self
->options
,
1396 if (IS_DEBUG_OSPF_EVENT
)
1397 zlog_debug("options set on %s: %x",
1398 IF_NAME(oi
), OPTIONS(oi
));
1401 case OSPF_AREA_NSSA
:
1402 for (ALL_LIST_ELEMENTS_RO(area
->oiflist
, node
, oi
))
1403 if (oi
->nbr_self
!= NULL
) {
1405 "setting nssa options on %s accordingly",
1407 UNSET_FLAG(oi
->nbr_self
->options
,
1409 SET_FLAG(oi
->nbr_self
->options
, OSPF_OPTION_NP
);
1410 zlog_debug("options set on %s: %x", IF_NAME(oi
),
1418 ospf_router_lsa_update_area(area
);
1419 ospf_schedule_abr_task(area
->ospf
);
1422 int ospf_area_shortcut_set(struct ospf
*ospf
, struct ospf_area
*area
, int mode
)
1424 if (area
->shortcut_configured
== mode
)
1427 area
->shortcut_configured
= mode
;
1428 ospf_router_lsa_update_area(area
);
1429 ospf_schedule_abr_task(ospf
);
1431 ospf_area_check_free(ospf
, area
->area_id
);
1436 int ospf_area_shortcut_unset(struct ospf
*ospf
, struct ospf_area
*area
)
1438 area
->shortcut_configured
= OSPF_SHORTCUT_DEFAULT
;
1439 ospf_router_lsa_update_area(area
);
1440 ospf_area_check_free(ospf
, area
->area_id
);
1441 ospf_schedule_abr_task(ospf
);
1446 static int ospf_area_vlink_count(struct ospf
*ospf
, struct ospf_area
*area
)
1448 struct ospf_vl_data
*vl
;
1449 struct listnode
*node
;
1452 for (ALL_LIST_ELEMENTS_RO(ospf
->vlinks
, node
, vl
))
1453 if (IPV4_ADDR_SAME(&vl
->vl_area_id
, &area
->area_id
))
1459 int ospf_area_display_format_set(struct ospf
*ospf
, struct ospf_area
*area
,
1462 area
->area_id_fmt
= df
;
1467 int ospf_area_stub_set(struct ospf
*ospf
, struct in_addr area_id
)
1469 struct ospf_area
*area
;
1471 area
= ospf_area_get(ospf
, area_id
);
1472 if (ospf_area_vlink_count(ospf
, area
))
1475 if (area
->external_routing
!= OSPF_AREA_STUB
)
1476 ospf_area_type_set(area
, OSPF_AREA_STUB
);
1481 int ospf_area_stub_unset(struct ospf
*ospf
, struct in_addr area_id
)
1483 struct ospf_area
*area
;
1485 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1489 if (area
->external_routing
== OSPF_AREA_STUB
)
1490 ospf_area_type_set(area
, OSPF_AREA_DEFAULT
);
1492 ospf_area_check_free(ospf
, area_id
);
1497 int ospf_area_no_summary_set(struct ospf
*ospf
, struct in_addr area_id
)
1499 struct ospf_area
*area
;
1501 area
= ospf_area_get(ospf
, area_id
);
1502 area
->no_summary
= 1;
1507 int ospf_area_no_summary_unset(struct ospf
*ospf
, struct in_addr area_id
)
1509 struct ospf_area
*area
;
1511 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1515 area
->no_summary
= 0;
1516 ospf_area_check_free(ospf
, area_id
);
1521 int ospf_area_nssa_no_summary_set(struct ospf
*ospf
, struct in_addr area_id
)
1523 struct ospf_area
*area
;
1525 area
= ospf_area_get(ospf
, area_id
);
1526 if (ospf_area_vlink_count(ospf
, area
))
1529 if (area
->external_routing
!= OSPF_AREA_NSSA
) {
1530 ospf_area_type_set(area
, OSPF_AREA_NSSA
);
1532 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1535 ospf_area_no_summary_set(ospf
, area_id
);
1540 int ospf_area_nssa_set(struct ospf
*ospf
, struct in_addr area_id
)
1542 struct ospf_area
*area
;
1544 area
= ospf_area_get(ospf
, area_id
);
1545 if (ospf_area_vlink_count(ospf
, area
))
1548 if (area
->external_routing
!= OSPF_AREA_NSSA
) {
1549 ospf_area_type_set(area
, OSPF_AREA_NSSA
);
1552 /* set NSSA area defaults */
1553 area
->no_summary
= 0;
1554 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1555 area
->NSSATranslatorState
= OSPF_NSSA_TRANSLATE_DISABLED
;
1556 area
->NSSATranslatorStabilityInterval
=
1557 OSPF_NSSA_TRANS_STABLE_DEFAULT
;
1562 int ospf_area_nssa_unset(struct ospf
*ospf
, struct in_addr area_id
, int argc
)
1564 struct ospf_area
*area
;
1566 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1570 /* argc < 5 -> 'no area x nssa' */
1571 if (argc
< 5 && area
->external_routing
== OSPF_AREA_NSSA
) {
1573 /* set NSSA area defaults */
1574 area
->no_summary
= 0;
1575 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1576 area
->NSSATranslatorState
= OSPF_NSSA_TRANSLATE_DISABLED
;
1577 area
->NSSATranslatorStabilityInterval
=
1578 OSPF_NSSA_TRANS_STABLE_DEFAULT
;
1579 ospf_area_type_set(area
, OSPF_AREA_DEFAULT
);
1581 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1584 ospf_area_check_free(ospf
, area_id
);
1589 int ospf_area_nssa_translator_role_set(struct ospf
*ospf
,
1590 struct in_addr area_id
, int role
)
1592 struct ospf_area
*area
;
1594 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1598 area
->NSSATranslatorRole
= role
;
1604 /* XXX: unused? Leave for symmetry? */
1606 ospf_area_nssa_translator_role_unset (struct ospf
*ospf
,
1607 struct in_addr area_id
)
1609 struct ospf_area
*area
;
1611 area
= ospf_area_lookup_by_area_id (ospf
, area_id
);
1615 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1617 ospf_area_check_free (ospf
, area_id
);
1623 int ospf_area_export_list_set(struct ospf
*ospf
, struct ospf_area
*area
,
1624 const char *list_name
)
1626 struct access_list
*list
;
1627 list
= access_list_lookup(AFI_IP
, list_name
);
1629 EXPORT_LIST(area
) = list
;
1631 if (EXPORT_NAME(area
))
1632 free(EXPORT_NAME(area
));
1634 EXPORT_NAME(area
) = strdup(list_name
);
1635 ospf_schedule_abr_task(ospf
);
1640 int ospf_area_export_list_unset(struct ospf
*ospf
, struct ospf_area
*area
)
1643 EXPORT_LIST(area
) = 0;
1645 if (EXPORT_NAME(area
))
1646 free(EXPORT_NAME(area
));
1648 EXPORT_NAME(area
) = NULL
;
1650 ospf_area_check_free(ospf
, area
->area_id
);
1652 ospf_schedule_abr_task(ospf
);
1657 int ospf_area_import_list_set(struct ospf
*ospf
, struct ospf_area
*area
,
1660 struct access_list
*list
;
1661 list
= access_list_lookup(AFI_IP
, name
);
1663 IMPORT_LIST(area
) = list
;
1665 if (IMPORT_NAME(area
))
1666 free(IMPORT_NAME(area
));
1668 IMPORT_NAME(area
) = strdup(name
);
1669 ospf_schedule_abr_task(ospf
);
1674 int ospf_area_import_list_unset(struct ospf
*ospf
, struct ospf_area
*area
)
1676 IMPORT_LIST(area
) = 0;
1678 if (IMPORT_NAME(area
))
1679 free(IMPORT_NAME(area
));
1681 IMPORT_NAME(area
) = NULL
;
1682 ospf_area_check_free(ospf
, area
->area_id
);
1684 ospf_schedule_abr_task(ospf
);
1689 int ospf_timers_refresh_set(struct ospf
*ospf
, int interval
)
1693 if (ospf
->lsa_refresh_interval
== interval
)
1696 time_left
= ospf
->lsa_refresh_interval
1697 - (monotime(NULL
) - ospf
->lsa_refresher_started
);
1699 if (time_left
> interval
) {
1700 OSPF_TIMER_OFF(ospf
->t_lsa_refresher
);
1701 thread_add_timer(master
, ospf_lsa_refresh_walker
, ospf
,
1702 interval
, &ospf
->t_lsa_refresher
);
1704 ospf
->lsa_refresh_interval
= interval
;
1709 int ospf_timers_refresh_unset(struct ospf
*ospf
)
1713 time_left
= ospf
->lsa_refresh_interval
1714 - (monotime(NULL
) - ospf
->lsa_refresher_started
);
1716 if (time_left
> OSPF_LSA_REFRESH_INTERVAL_DEFAULT
) {
1717 OSPF_TIMER_OFF(ospf
->t_lsa_refresher
);
1718 ospf
->t_lsa_refresher
= NULL
;
1719 thread_add_timer(master
, ospf_lsa_refresh_walker
, ospf
,
1720 OSPF_LSA_REFRESH_INTERVAL_DEFAULT
,
1721 &ospf
->t_lsa_refresher
);
1724 ospf
->lsa_refresh_interval
= OSPF_LSA_REFRESH_INTERVAL_DEFAULT
;
1730 static struct ospf_nbr_nbma
*ospf_nbr_nbma_new(void)
1732 struct ospf_nbr_nbma
*nbr_nbma
;
1734 nbr_nbma
= XCALLOC(MTYPE_OSPF_NEIGHBOR_STATIC
,
1735 sizeof(struct ospf_nbr_nbma
));
1737 nbr_nbma
->priority
= OSPF_NEIGHBOR_PRIORITY_DEFAULT
;
1738 nbr_nbma
->v_poll
= OSPF_POLL_INTERVAL_DEFAULT
;
1743 static void ospf_nbr_nbma_free(struct ospf_nbr_nbma
*nbr_nbma
)
1745 XFREE(MTYPE_OSPF_NEIGHBOR_STATIC
, nbr_nbma
);
1748 static void ospf_nbr_nbma_delete(struct ospf
*ospf
,
1749 struct ospf_nbr_nbma
*nbr_nbma
)
1751 struct route_node
*rn
;
1752 struct prefix_ipv4 p
;
1755 p
.prefix
= nbr_nbma
->addr
;
1756 p
.prefixlen
= IPV4_MAX_BITLEN
;
1758 rn
= route_node_lookup(ospf
->nbr_nbma
, (struct prefix
*)&p
);
1760 ospf_nbr_nbma_free(rn
->info
);
1762 route_unlock_node(rn
);
1763 route_unlock_node(rn
);
1767 static void ospf_nbr_nbma_down(struct ospf_nbr_nbma
*nbr_nbma
)
1769 OSPF_TIMER_OFF(nbr_nbma
->t_poll
);
1771 if (nbr_nbma
->nbr
) {
1772 nbr_nbma
->nbr
->nbr_nbma
= NULL
;
1773 OSPF_NSM_EVENT_EXECUTE(nbr_nbma
->nbr
, NSM_KillNbr
);
1777 listnode_delete(nbr_nbma
->oi
->nbr_nbma
, nbr_nbma
);
1780 static void ospf_nbr_nbma_add(struct ospf_nbr_nbma
*nbr_nbma
,
1781 struct ospf_interface
*oi
)
1783 struct ospf_neighbor
*nbr
;
1784 struct route_node
*rn
;
1787 if (oi
->type
!= OSPF_IFTYPE_NBMA
)
1790 if (nbr_nbma
->nbr
!= NULL
)
1793 if (IPV4_ADDR_SAME(&oi
->nbr_self
->address
.u
.prefix4
, &nbr_nbma
->addr
))
1797 listnode_add(oi
->nbr_nbma
, nbr_nbma
);
1799 /* Get neighbor information from table. */
1801 p
.prefixlen
= IPV4_MAX_BITLEN
;
1802 p
.u
.prefix4
= nbr_nbma
->addr
;
1804 rn
= route_node_get(oi
->nbrs
, (struct prefix
*)&p
);
1807 nbr
->nbr_nbma
= nbr_nbma
;
1808 nbr_nbma
->nbr
= nbr
;
1810 route_unlock_node(rn
);
1812 nbr
= rn
->info
= ospf_nbr_new(oi
);
1813 nbr
->state
= NSM_Down
;
1814 nbr
->src
= nbr_nbma
->addr
;
1815 nbr
->nbr_nbma
= nbr_nbma
;
1816 nbr
->priority
= nbr_nbma
->priority
;
1819 nbr_nbma
->nbr
= nbr
;
1821 OSPF_NSM_EVENT_EXECUTE(nbr
, NSM_Start
);
1825 void ospf_nbr_nbma_if_update(struct ospf
*ospf
, struct ospf_interface
*oi
)
1827 struct ospf_nbr_nbma
*nbr_nbma
;
1828 struct route_node
*rn
;
1829 struct prefix_ipv4 p
;
1831 if (oi
->type
!= OSPF_IFTYPE_NBMA
)
1834 for (rn
= route_top(ospf
->nbr_nbma
); rn
; rn
= route_next(rn
))
1835 if ((nbr_nbma
= rn
->info
))
1836 if (nbr_nbma
->oi
== NULL
&& nbr_nbma
->nbr
== NULL
) {
1838 p
.prefix
= nbr_nbma
->addr
;
1839 p
.prefixlen
= IPV4_MAX_BITLEN
;
1841 if (prefix_match(oi
->address
,
1842 (struct prefix
*)&p
))
1843 ospf_nbr_nbma_add(nbr_nbma
, oi
);
1847 struct ospf_nbr_nbma
*ospf_nbr_nbma_lookup(struct ospf
*ospf
,
1848 struct in_addr nbr_addr
)
1850 struct route_node
*rn
;
1851 struct prefix_ipv4 p
;
1854 p
.prefix
= nbr_addr
;
1855 p
.prefixlen
= IPV4_MAX_BITLEN
;
1857 rn
= route_node_lookup(ospf
->nbr_nbma
, (struct prefix
*)&p
);
1859 route_unlock_node(rn
);
1865 struct ospf_nbr_nbma
*ospf_nbr_nbma_lookup_next(struct ospf
*ospf
,
1866 struct in_addr
*addr
, int first
)
1869 struct ospf_nbr_nbma
*nbr_nbma
;
1870 struct listnode
*node
;
1877 for (ALL_LIST_ELEMENTS_RO (ospf
->nbr_nbma
, node
, nbr_nbma
))
1881 *addr
= nbr_nbma
->addr
;
1884 else if (ntohl (nbr_nbma
->addr
.s_addr
) > ntohl (addr
->s_addr
))
1886 *addr
= nbr_nbma
->addr
;
1894 int ospf_nbr_nbma_set(struct ospf
*ospf
, struct in_addr nbr_addr
)
1896 struct ospf_nbr_nbma
*nbr_nbma
;
1897 struct ospf_interface
*oi
;
1898 struct prefix_ipv4 p
;
1899 struct route_node
*rn
;
1900 struct listnode
*node
;
1902 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
1906 nbr_nbma
= ospf_nbr_nbma_new();
1907 nbr_nbma
->addr
= nbr_addr
;
1910 p
.prefix
= nbr_addr
;
1911 p
.prefixlen
= IPV4_MAX_BITLEN
;
1913 rn
= route_node_get(ospf
->nbr_nbma
, (struct prefix
*)&p
);
1915 route_unlock_node(rn
);
1916 rn
->info
= nbr_nbma
;
1918 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
1919 if (oi
->type
== OSPF_IFTYPE_NBMA
)
1920 if (prefix_match(oi
->address
, (struct prefix
*)&p
)) {
1921 ospf_nbr_nbma_add(nbr_nbma
, oi
);
1929 int ospf_nbr_nbma_unset(struct ospf
*ospf
, struct in_addr nbr_addr
)
1931 struct ospf_nbr_nbma
*nbr_nbma
;
1933 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
1934 if (nbr_nbma
== NULL
)
1937 ospf_nbr_nbma_down(nbr_nbma
);
1938 ospf_nbr_nbma_delete(ospf
, nbr_nbma
);
1943 int ospf_nbr_nbma_priority_set(struct ospf
*ospf
, struct in_addr nbr_addr
,
1946 struct ospf_nbr_nbma
*nbr_nbma
;
1948 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
1949 if (nbr_nbma
== NULL
)
1952 if (nbr_nbma
->priority
!= priority
)
1953 nbr_nbma
->priority
= priority
;
1958 int ospf_nbr_nbma_priority_unset(struct ospf
*ospf
, struct in_addr nbr_addr
)
1960 struct ospf_nbr_nbma
*nbr_nbma
;
1962 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
1963 if (nbr_nbma
== NULL
)
1966 if (nbr_nbma
!= OSPF_NEIGHBOR_PRIORITY_DEFAULT
)
1967 nbr_nbma
->priority
= OSPF_NEIGHBOR_PRIORITY_DEFAULT
;
1972 int ospf_nbr_nbma_poll_interval_set(struct ospf
*ospf
, struct in_addr nbr_addr
,
1973 unsigned int interval
)
1975 struct ospf_nbr_nbma
*nbr_nbma
;
1977 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
1978 if (nbr_nbma
== NULL
)
1981 if (nbr_nbma
->v_poll
!= interval
) {
1982 nbr_nbma
->v_poll
= interval
;
1983 if (nbr_nbma
->oi
&& ospf_if_is_up(nbr_nbma
->oi
)) {
1984 OSPF_TIMER_OFF(nbr_nbma
->t_poll
);
1985 OSPF_POLL_TIMER_ON(nbr_nbma
->t_poll
, ospf_poll_timer
,
1993 int ospf_nbr_nbma_poll_interval_unset(struct ospf
*ospf
, struct in_addr addr
)
1995 struct ospf_nbr_nbma
*nbr_nbma
;
1997 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, addr
);
1998 if (nbr_nbma
== NULL
)
2001 if (nbr_nbma
->v_poll
!= OSPF_POLL_INTERVAL_DEFAULT
)
2002 nbr_nbma
->v_poll
= OSPF_POLL_INTERVAL_DEFAULT
;
2007 void ospf_master_init(struct thread_master
*master
)
2009 memset(&ospf_master
, 0, sizeof(struct ospf_master
));
2012 om
->ospf
= list_new();
2013 om
->master
= master
;
2016 /* Link OSPF instance to VRF. */
2017 void ospf_vrf_link(struct ospf
*ospf
, struct vrf
*vrf
)
2019 ospf
->vrf_id
= vrf
->vrf_id
;
2020 if (vrf
->info
!= (void *)ospf
)
2021 vrf
->info
= (void *)ospf
;
2024 /* Unlink OSPF instance from VRF. */
2025 void ospf_vrf_unlink(struct ospf
*ospf
, struct vrf
*vrf
)
2027 if (vrf
->info
== (void *)ospf
)
2029 ospf
->vrf_id
= VRF_UNKNOWN
;
2032 /* This is hook function for vrf create called as part of vrf_init */
2033 static int ospf_vrf_new(struct vrf
*vrf
)
2035 if (IS_DEBUG_OSPF_EVENT
)
2036 zlog_debug("%s: VRF Created: %s(%u)", __PRETTY_FUNCTION__
,
2037 vrf
->name
, vrf
->vrf_id
);
2042 /* This is hook function for vrf delete call as part of vrf_init */
2043 static int ospf_vrf_delete(struct vrf
*vrf
)
2045 if (IS_DEBUG_OSPF_EVENT
)
2046 zlog_debug("%s: VRF Deletion: %s(%u)", __PRETTY_FUNCTION__
,
2047 vrf
->name
, vrf
->vrf_id
);
2052 static void ospf_set_redist_vrf_bitmaps(struct ospf
*ospf
)
2055 struct list
*red_list
;
2057 for (type
= 0; type
< ZEBRA_ROUTE_MAX
; type
++) {
2058 red_list
= ospf
->redist
[type
];
2061 if (IS_DEBUG_OSPF_EVENT
)
2063 "%s: setting redist vrf %d bitmap for type %d",
2064 __func__
, ospf
->vrf_id
, type
);
2065 vrf_bitmap_set(zclient
->redist
[AFI_IP
][type
], ospf
->vrf_id
);
2069 /* Enable OSPF VRF instance */
2070 static int ospf_vrf_enable(struct vrf
*vrf
)
2072 struct ospf
*ospf
= NULL
;
2073 vrf_id_t old_vrf_id
;
2076 if (IS_DEBUG_OSPF_EVENT
)
2077 zlog_debug("%s: VRF %s id %u enabled", __PRETTY_FUNCTION__
,
2078 vrf
->name
, vrf
->vrf_id
);
2080 ospf
= ospf_lookup_by_name(vrf
->name
);
2082 old_vrf_id
= ospf
->vrf_id
;
2083 /* We have instance configured, link to VRF and make it "up". */
2084 ospf_vrf_link(ospf
, vrf
);
2085 if (IS_DEBUG_OSPF_EVENT
)
2087 "%s: ospf linked to vrf %s vrf_id %u (old id %u)",
2088 __PRETTY_FUNCTION__
, vrf
->name
, ospf
->vrf_id
,
2091 if (old_vrf_id
!= ospf
->vrf_id
) {
2092 if (ospfd_privs
.change(ZPRIVS_RAISE
)) {
2094 "ospf_sock_init: could not raise privs, %s",
2095 safe_strerror(errno
));
2098 /* stop zebra redist to us for old vrf */
2099 zclient_send_dereg_requests(zclient
, old_vrf_id
);
2101 ospf_set_redist_vrf_bitmaps(ospf
);
2103 /* start zebra redist to us for new vrf */
2104 ospf_zebra_vrf_register(ospf
);
2106 ret
= ospf_sock_init(ospf
);
2107 if (ospfd_privs
.change(ZPRIVS_LOWER
)) {
2109 "ospf_sock_init: could not lower privs, %s",
2110 safe_strerror(errno
));
2112 if (ret
< 0 || ospf
->fd
<= 0)
2114 thread_add_read(master
, ospf_read
, ospf
, ospf
->fd
,
2116 ospf
->oi_running
= 1;
2117 ospf_router_id_update(ospf
);
2124 /* Disable OSPF VRF instance */
2125 static int ospf_vrf_disable(struct vrf
*vrf
)
2127 struct ospf
*ospf
= NULL
;
2128 vrf_id_t old_vrf_id
= VRF_UNKNOWN
;
2130 if (vrf
->vrf_id
== VRF_DEFAULT
)
2133 if (IS_DEBUG_OSPF_EVENT
)
2134 zlog_debug("%s: VRF %s id %d disabled.", __PRETTY_FUNCTION__
,
2135 vrf
->name
, vrf
->vrf_id
);
2137 ospf
= ospf_lookup_by_name(vrf
->name
);
2139 old_vrf_id
= ospf
->vrf_id
;
2141 /* We have instance configured, unlink
2142 * from VRF and make it "down".
2144 ospf_vrf_unlink(ospf
, vrf
);
2145 ospf
->oi_running
= 0;
2146 if (IS_DEBUG_OSPF_EVENT
)
2147 zlog_debug("%s: ospf old_vrf_id %d unlinked",
2148 __PRETTY_FUNCTION__
, old_vrf_id
);
2149 thread_cancel(ospf
->t_read
);
2154 /* Note: This is a callback, the VRF will be deleted by the caller. */
2158 void ospf_vrf_init(void)
2160 vrf_init(ospf_vrf_new
, ospf_vrf_enable
, ospf_vrf_disable
,
2164 void ospf_vrf_terminate(void)
2169 const char *ospf_vrf_id_to_name(vrf_id_t vrf_id
)
2171 struct vrf
*vrf
= vrf_lookup_by_id(vrf_id
);
2173 return vrf
? vrf
->name
: "NIL";