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 () */
41 #include "lib_errors.h"
43 #include "ospfd/ospfd.h"
44 #include "ospfd/ospf_network.h"
45 #include "ospfd/ospf_interface.h"
46 #include "ospfd/ospf_ism.h"
47 #include "ospfd/ospf_asbr.h"
48 #include "ospfd/ospf_lsa.h"
49 #include "ospfd/ospf_lsdb.h"
50 #include "ospfd/ospf_neighbor.h"
51 #include "ospfd/ospf_nsm.h"
52 #include "ospfd/ospf_spf.h"
53 #include "ospfd/ospf_packet.h"
54 #include "ospfd/ospf_dump.h"
55 #include "ospfd/ospf_route.h"
56 #include "ospfd/ospf_zebra.h"
57 #include "ospfd/ospf_abr.h"
58 #include "ospfd/ospf_flood.h"
59 #include "ospfd/ospf_ase.h"
62 DEFINE_QOBJ_TYPE(ospf
)
64 /* OSPF process wide configuration. */
65 static struct ospf_master ospf_master
;
67 /* OSPF process wide configuration pointer to export. */
68 struct ospf_master
*om
;
70 extern struct zclient
*zclient
;
73 static void ospf_remove_vls_through_area(struct ospf
*, struct ospf_area
*);
74 static void ospf_network_free(struct ospf
*, struct ospf_network
*);
75 static void ospf_area_free(struct ospf_area
*);
76 static void ospf_network_run(struct prefix
*, struct ospf_area
*);
77 static void ospf_network_run_interface(struct ospf
*, struct interface
*,
78 struct prefix
*, struct ospf_area
*);
79 static void ospf_network_run_subnet(struct ospf
*, struct connected
*,
80 struct prefix
*, struct ospf_area
*);
81 static int ospf_network_match_iface(const struct connected
*,
82 const struct prefix
*);
83 static void ospf_finish_final(struct ospf
*);
85 #define OSPF_EXTERNAL_LSA_ORIGINATE_DELAY 1
87 void ospf_router_id_update(struct ospf
*ospf
)
89 struct vrf
*vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
90 struct in_addr router_id
, router_id_old
;
91 struct ospf_interface
*oi
;
92 struct interface
*ifp
;
93 struct listnode
*node
;
96 if (!ospf
->oi_running
) {
97 if (IS_DEBUG_OSPF_EVENT
)
99 "Router ospf not configured -- Router-ID update postponed");
103 if (IS_DEBUG_OSPF_EVENT
)
104 zlog_debug("Router-ID[OLD:%s]: Update",
105 inet_ntoa(ospf
->router_id
));
107 router_id_old
= ospf
->router_id
;
109 /* Select the router ID based on these priorities:
110 1. Statically assigned router ID is always the first choice.
111 2. If there is no statically assigned router ID, then try to stick
112 with the most recent value, since changing router ID's is very
114 3. Last choice: just go with whatever the zebra daemon recommends.
116 if (ospf
->router_id_static
.s_addr
!= 0)
117 router_id
= ospf
->router_id_static
;
118 else if (ospf
->router_id
.s_addr
!= 0)
119 router_id
= ospf
->router_id
;
121 router_id
= ospf
->router_id_zebra
;
123 if (IS_DEBUG_OSPF_EVENT
)
124 zlog_debug("Router-ID[OLD:%s]: Update to %s",
125 inet_ntoa(ospf
->router_id
), inet_ntoa(router_id
));
127 if (!IPV4_ADDR_SAME(&router_id_old
, &router_id
)) {
129 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
130 /* Some nbrs are identified by router_id, these needs
131 * to be rebuilt. Possible optimization would be to do
132 * oi->nbr_self->router_id = router_id for
133 * !(virtual | ptop) links
135 ospf_nbr_self_reset(oi
, router_id
);
138 /* If AS-external-LSA is queued, then flush those LSAs. */
139 if (router_id_old
.s_addr
== 0 && ospf
->external_origin
) {
140 /* Originate each redistributed external route. */
141 for (type
= 0; type
< ZEBRA_ROUTE_MAX
; type
++)
142 if (ospf
->external_origin
& (1 << type
))
145 ospf_external_lsa_originate_timer
,
147 /* Originate Deafult. */
148 if (ospf
->external_origin
& (1 << ZEBRA_ROUTE_MAX
))
149 thread_add_event(master
,
150 ospf_default_originate_timer
,
153 ospf
->external_origin
= 0;
156 /* Flush (inline) all external LSAs based on the OSPF_LSA_SELF
159 struct route_node
*rn
;
160 struct ospf_lsa
*lsa
;
162 LSDB_LOOP (EXTERNAL_LSDB(ospf
), rn
, lsa
)
163 if (IS_LSA_SELF(lsa
))
164 ospf_lsa_flush_schedule(ospf
, lsa
);
167 ospf
->router_id
= router_id
;
168 if (IS_DEBUG_OSPF_EVENT
)
169 zlog_debug("Router-ID[NEW:%s]: Update",
170 inet_ntoa(ospf
->router_id
));
172 /* Flush (inline) all external LSAs which now match the new
174 need to adjust the OSPF_LSA_SELF flag, so the flush doesn't
176 asserts in ospf_refresher_unregister_lsa(). This step is
178 because the current quagga code does look-up for
180 based on the self router-id alone but expects OSPF_LSA_SELF
184 struct route_node
*rn
;
185 struct ospf_lsa
*lsa
;
187 LSDB_LOOP (EXTERNAL_LSDB(ospf
), rn
, lsa
) {
188 /* AdvRouter and Router ID is the same. */
189 if (IPV4_ADDR_SAME(&lsa
->data
->adv_router
,
192 OSPF_LSA_SELF_CHECKED
);
193 SET_FLAG(lsa
->flags
, OSPF_LSA_SELF
);
194 ospf_lsa_flush_schedule(ospf
, lsa
);
199 /* Originate each redistributed external route. */
200 for (type
= 0; type
< ZEBRA_ROUTE_MAX
; type
++)
201 thread_add_event(master
,
202 ospf_external_lsa_originate_timer
,
204 thread_add_event(master
, ospf_default_originate_timer
, ospf
, 0,
207 /* update router-lsa's for each area */
208 ospf_router_lsa_update(ospf
);
210 /* update ospf_interface's */
211 FOR_ALL_INTERFACES (vrf
, ifp
)
212 ospf_if_update(ospf
, ifp
);
216 /* For OSPF area sort by area id. */
217 static int ospf_area_id_cmp(struct ospf_area
*a1
, struct ospf_area
*a2
)
219 if (ntohl(a1
->area_id
.s_addr
) > ntohl(a2
->area_id
.s_addr
))
221 if (ntohl(a1
->area_id
.s_addr
) < ntohl(a2
->area_id
.s_addr
))
226 /* Allocate new ospf structure. */
227 static struct ospf
*ospf_new(unsigned short instance
, const char *name
)
230 struct vrf
*vrf
= NULL
;
232 struct ospf
*new = XCALLOC(MTYPE_OSPF_TOP
, sizeof(struct ospf
));
234 new->instance
= instance
;
235 new->router_id
.s_addr
= htonl(0);
236 new->router_id_static
.s_addr
= htonl(0);
238 vrf
= vrf_lookup_by_name(name
);
240 new->vrf_id
= vrf
->vrf_id
;
242 new->vrf_id
= VRF_UNKNOWN
;
243 /* Freed in ospf_finish_final */
244 new->name
= XSTRDUP(MTYPE_OSPF_TOP
, name
);
245 if (IS_DEBUG_OSPF_EVENT
)
247 "%s: Create new ospf instance with vrf_name %s vrf_id %u",
248 __PRETTY_FUNCTION__
, name
, new->vrf_id
);
250 new->vrf_id
= VRF_DEFAULT
;
251 vrf
= vrf_lookup_by_id(VRF_DEFAULT
);
255 ospf_vrf_link(new, vrf
);
257 ospf_zebra_vrf_register(new);
259 new->abr_type
= OSPF_ABR_DEFAULT
;
260 new->oiflist
= list_new();
261 new->vlinks
= list_new();
262 new->areas
= list_new();
263 new->areas
->cmp
= (int (*)(void *, void *))ospf_area_id_cmp
;
264 new->networks
= route_table_init();
265 new->nbr_nbma
= route_table_init();
267 new->lsdb
= ospf_lsdb_new();
269 new->default_originate
= DEFAULT_ORIGINATE_NONE
;
271 new->passive_interface_default
= OSPF_IF_ACTIVE
;
273 new->new_external_route
= route_table_init();
274 new->old_external_route
= route_table_init();
275 new->external_lsas
= route_table_init();
277 new->stub_router_startup_time
= OSPF_STUB_ROUTER_UNCONFIGURED
;
278 new->stub_router_shutdown_time
= OSPF_STUB_ROUTER_UNCONFIGURED
;
279 new->stub_router_admin_set
= OSPF_STUB_ROUTER_ADMINISTRATIVE_UNSET
;
281 /* Distribute parameter init. */
282 for (i
= 0; i
<= ZEBRA_ROUTE_MAX
; i
++) {
285 new->default_metric
= -1;
286 new->ref_bandwidth
= OSPF_DEFAULT_REF_BANDWIDTH
;
289 new->min_ls_interval
= OSPF_MIN_LS_INTERVAL
;
290 new->min_ls_arrival
= OSPF_MIN_LS_ARRIVAL
;
292 /* SPF timer value init. */
293 new->spf_delay
= OSPF_SPF_DELAY_DEFAULT
;
294 new->spf_holdtime
= OSPF_SPF_HOLDTIME_DEFAULT
;
295 new->spf_max_holdtime
= OSPF_SPF_MAX_HOLDTIME_DEFAULT
;
296 new->spf_hold_multiplier
= 1;
299 new->maxage_delay
= OSPF_LSA_MAXAGE_REMOVE_DELAY_DEFAULT
;
300 new->maxage_lsa
= route_table_init();
301 new->t_maxage_walker
= NULL
;
302 thread_add_timer(master
, ospf_lsa_maxage_walker
, new,
303 OSPF_LSA_MAXAGE_CHECK_INTERVAL
, &new->t_maxage_walker
);
305 /* Distance table init. */
306 new->distance_table
= route_table_init();
308 new->lsa_refresh_queue
.index
= 0;
309 new->lsa_refresh_interval
= OSPF_LSA_REFRESH_INTERVAL_DEFAULT
;
310 new->t_lsa_refresher
= NULL
;
311 thread_add_timer(master
, ospf_lsa_refresh_walker
, new,
312 new->lsa_refresh_interval
, &new->t_lsa_refresher
);
313 new->lsa_refresher_started
= monotime(NULL
);
315 new->ibuf
= stream_new(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
)
333 "%s: ospf_sock_init is unable to open a socket",
337 thread_add_read(master
, ospf_read
, new, new->fd
, &new->t_read
);
342 struct ospf
*ospf_lookup_instance(unsigned short instance
)
345 struct listnode
*node
, *nnode
;
347 if (listcount(om
->ospf
) == 0)
350 for (ALL_LIST_ELEMENTS(om
->ospf
, node
, nnode
, ospf
))
351 if ((ospf
->instance
== 0 && instance
== 0)
352 || (ospf
->instance
&& instance
353 && ospf
->instance
== instance
))
359 static int ospf_is_ready(struct ospf
*ospf
)
361 /* OSPF must be on and Router-ID must be configured. */
362 if (!ospf
|| ospf
->router_id
.s_addr
== 0)
368 static void ospf_add(struct ospf
*ospf
)
370 listnode_add(om
->ospf
, ospf
);
373 static void ospf_delete(struct ospf
*ospf
)
375 listnode_delete(om
->ospf
, ospf
);
378 struct ospf
*ospf_lookup_by_inst_name(unsigned short instance
, const char *name
)
380 struct ospf
*ospf
= NULL
;
381 struct listnode
*node
, *nnode
;
383 if (name
== NULL
|| strmatch(name
, VRF_DEFAULT_NAME
))
384 return ospf_lookup_by_vrf_id(VRF_DEFAULT
);
386 for (ALL_LIST_ELEMENTS(om
->ospf
, node
, nnode
, ospf
)) {
387 if ((ospf
->instance
== instance
)
388 && ((ospf
->name
== NULL
&& name
== NULL
)
389 || (ospf
->name
&& name
390 && strcmp(ospf
->name
, name
) == 0)))
396 struct ospf
*ospf_get(unsigned short instance
, const char *name
)
400 /* vrf name provided call inst and name based api
401 * in case of no name pass default ospf instance */
403 ospf
= ospf_lookup_by_inst_name(instance
, name
);
405 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
408 ospf
= ospf_new(instance
, name
);
411 if (ospf
->router_id_static
.s_addr
== 0)
412 ospf_router_id_update(ospf
);
414 ospf_opaque_type11_lsa_init(ospf
);
420 struct ospf
*ospf_get_instance(unsigned short instance
)
424 ospf
= ospf_lookup_instance(instance
);
426 ospf
= ospf_new(instance
, NULL
/* VRF_DEFAULT*/);
429 if (ospf
->router_id_static
.s_addr
== 0) {
430 if (vrf_lookup_by_id(ospf
->vrf_id
))
431 ospf_router_id_update(ospf
);
433 if (IS_DEBUG_OSPF_EVENT
)
435 "%s: ospf VRF (id %d) is not active yet, skip router id update",
439 ospf_router_id_update(ospf
);
442 ospf_opaque_type11_lsa_init(ospf
);
448 struct ospf
*ospf_lookup_by_vrf_id(vrf_id_t vrf_id
)
450 struct vrf
*vrf
= NULL
;
452 vrf
= vrf_lookup_by_id(vrf_id
);
455 return ospf_lookup_by_vrf(vrf
);
458 struct ospf
*ospf_lookup_by_vrf(struct vrf
*vrf
)
460 return (vrf
->info
) ? (struct ospf
*)vrf
->info
: NULL
;
463 /* It should only be used when processing incoming info update from zebra.
464 * Other situations, it is not sufficient to lookup the ospf instance by
465 * vrf_name only without using the instance number.
467 static struct ospf
*ospf_lookup_by_name(const char *vrf_name
)
469 struct ospf
*ospf
= NULL
;
470 struct listnode
*node
, *nnode
;
472 for (ALL_LIST_ELEMENTS(om
->ospf
, node
, nnode
, ospf
))
473 if ((ospf
->name
== NULL
&& vrf_name
== NULL
)
474 || (ospf
->name
&& vrf_name
475 && strcmp(ospf
->name
, vrf_name
) == 0))
480 /* Handle the second half of deferred shutdown. This is called either
481 * from the deferred-shutdown timer thread, or directly through
482 * ospf_deferred_shutdown_check.
484 * Function is to cleanup G-R state, if required then call ospf_finish_final
485 * to complete shutdown of this ospf instance. Possibly exit if the
486 * whole process is being shutdown and this was the last OSPF instance.
488 static void ospf_deferred_shutdown_finish(struct ospf
*ospf
)
490 ospf
->stub_router_shutdown_time
= OSPF_STUB_ROUTER_UNCONFIGURED
;
491 OSPF_TIMER_OFF(ospf
->t_deferred_shutdown
);
493 ospf_finish_final(ospf
);
495 /* *ospf is now invalid */
497 /* ospfd being shut-down? If so, was this the last ospf instance? */
498 if (CHECK_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
)
499 && (listcount(om
->ospf
) == 0)) {
506 /* Timer thread for G-R */
507 static int ospf_deferred_shutdown_timer(struct thread
*t
)
509 struct ospf
*ospf
= THREAD_ARG(t
);
511 ospf_deferred_shutdown_finish(ospf
);
516 /* Check whether deferred-shutdown must be scheduled, otherwise call
517 * down directly into second-half of instance shutdown.
519 static void ospf_deferred_shutdown_check(struct ospf
*ospf
)
521 unsigned long timeout
;
523 struct ospf_area
*area
;
525 /* deferred shutdown already running? */
526 if (ospf
->t_deferred_shutdown
)
529 /* Should we try push out max-metric LSAs? */
530 if (ospf
->stub_router_shutdown_time
!= OSPF_STUB_ROUTER_UNCONFIGURED
) {
531 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, ln
, area
)) {
532 SET_FLAG(area
->stub_router_state
,
533 OSPF_AREA_ADMIN_STUB_ROUTED
);
535 if (!CHECK_FLAG(area
->stub_router_state
,
536 OSPF_AREA_IS_STUB_ROUTED
))
537 ospf_router_lsa_update_area(area
);
539 timeout
= ospf
->stub_router_shutdown_time
;
541 /* No timer needed */
542 ospf_deferred_shutdown_finish(ospf
);
546 OSPF_TIMER_ON(ospf
->t_deferred_shutdown
, ospf_deferred_shutdown_timer
,
551 /* Shut down the entire process */
552 void ospf_terminate(void)
555 struct listnode
*node
, *nnode
;
557 /* shutdown already in progress */
558 if (CHECK_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
))
561 SET_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
);
563 /* exit immediately if OSPF not actually running */
564 if (listcount(om
->ospf
) == 0)
568 for (ALL_LIST_ELEMENTS(om
->ospf
, node
, nnode
, ospf
))
571 /* Cleanup route maps */
574 /* reverse prefix_list_init */
575 prefix_list_add_hook(NULL
);
576 prefix_list_delete_hook(NULL
);
579 /* Cleanup vrf info */
580 ospf_vrf_terminate();
582 /* Deliberately go back up, hopefully to thread scheduler, as
583 * One or more ospf_finish()'s may have deferred shutdown to a timer
586 zclient_stop(zclient
);
587 zclient_free(zclient
);
592 void ospf_finish(struct ospf
*ospf
)
594 /* let deferred shutdown decide */
595 ospf_deferred_shutdown_check(ospf
);
597 /* if ospf_deferred_shutdown returns, then ospf_finish_final is
598 * deferred to expiry of G-S timer thread. Return back up, hopefully
599 * to thread scheduler.
604 /* Final cleanup of ospf instance */
605 static void ospf_finish_final(struct ospf
*ospf
)
607 struct vrf
*vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
608 struct route_node
*rn
;
609 struct ospf_nbr_nbma
*nbr_nbma
;
610 struct ospf_lsa
*lsa
;
611 struct interface
*ifp
;
612 struct ospf_interface
*oi
;
613 struct ospf_area
*area
;
614 struct ospf_vl_data
*vl_data
;
615 struct listnode
*node
, *nnode
;
617 unsigned short instance
= 0;
621 ospf_opaque_type11_lsa_term(ospf
);
623 ospf_opaque_finish();
625 ospf_flush_self_originated_lsas_now(ospf
);
627 /* Unregister redistribution */
628 for (i
= 0; i
< ZEBRA_ROUTE_MAX
; i
++) {
629 struct list
*red_list
;
630 struct ospf_redist
*red
;
632 red_list
= ospf
->redist
[i
];
636 for (ALL_LIST_ELEMENTS(red_list
, node
, nnode
, red
))
637 ospf_redistribute_unset(ospf
, i
, red
->instance
);
639 ospf_redistribute_default_unset(ospf
);
641 for (ALL_LIST_ELEMENTS(ospf
->areas
, node
, nnode
, area
))
642 ospf_remove_vls_through_area(ospf
, area
);
644 for (ALL_LIST_ELEMENTS(ospf
->vlinks
, node
, nnode
, vl_data
))
645 ospf_vl_delete(ospf
, vl_data
);
647 list_delete(&ospf
->vlinks
);
649 /* Remove any ospf interface config params */
650 FOR_ALL_INTERFACES (vrf
, ifp
) {
651 struct ospf_if_params
*params
;
653 params
= IF_DEF_PARAMS(ifp
);
654 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
))
655 UNSET_IF_PARAM(params
, if_area
);
658 /* Reset interface. */
659 for (ALL_LIST_ELEMENTS(ospf
->oiflist
, node
, nnode
, oi
))
661 list_delete(&ospf
->oiflist
);
663 /* De-Register VRF */
664 ospf_zebra_vrf_deregister(ospf
);
666 /* Clear static neighbors */
667 for (rn
= route_top(ospf
->nbr_nbma
); rn
; rn
= route_next(rn
))
668 if ((nbr_nbma
= rn
->info
)) {
669 OSPF_POLL_TIMER_OFF(nbr_nbma
->t_poll
);
672 nbr_nbma
->nbr
->nbr_nbma
= NULL
;
673 nbr_nbma
->nbr
= NULL
;
677 listnode_delete(nbr_nbma
->oi
->nbr_nbma
,
682 XFREE(MTYPE_OSPF_NEIGHBOR_STATIC
, nbr_nbma
);
685 route_table_finish(ospf
->nbr_nbma
);
687 /* Clear networks and Areas. */
688 for (rn
= route_top(ospf
->networks
); rn
; rn
= route_next(rn
)) {
689 struct ospf_network
*network
;
691 if ((network
= rn
->info
) != NULL
) {
692 ospf_network_free(ospf
, network
);
694 route_unlock_node(rn
);
697 route_table_finish(ospf
->networks
);
699 for (ALL_LIST_ELEMENTS(ospf
->areas
, node
, nnode
, area
)) {
700 listnode_delete(ospf
->areas
, area
);
701 ospf_area_free(area
);
704 /* Cancel all timers. */
705 OSPF_TIMER_OFF(ospf
->t_external_lsa
);
706 OSPF_TIMER_OFF(ospf
->t_spf_calc
);
707 OSPF_TIMER_OFF(ospf
->t_ase_calc
);
708 OSPF_TIMER_OFF(ospf
->t_maxage
);
709 OSPF_TIMER_OFF(ospf
->t_maxage_walker
);
710 OSPF_TIMER_OFF(ospf
->t_abr_task
);
711 OSPF_TIMER_OFF(ospf
->t_asbr_check
);
712 OSPF_TIMER_OFF(ospf
->t_distribute_update
);
713 OSPF_TIMER_OFF(ospf
->t_lsa_refresher
);
714 OSPF_TIMER_OFF(ospf
->t_read
);
715 OSPF_TIMER_OFF(ospf
->t_write
);
716 OSPF_TIMER_OFF(ospf
->t_opaque_lsa_self
);
717 OSPF_TIMER_OFF(ospf
->t_sr_update
);
720 stream_free(ospf
->ibuf
);
722 LSDB_LOOP (OPAQUE_AS_LSDB(ospf
), rn
, lsa
)
723 ospf_discard_from_db(ospf
, ospf
->lsdb
, lsa
);
724 LSDB_LOOP (EXTERNAL_LSDB(ospf
), rn
, lsa
)
725 ospf_discard_from_db(ospf
, ospf
->lsdb
, lsa
);
727 ospf_lsdb_delete_all(ospf
->lsdb
);
728 ospf_lsdb_free(ospf
->lsdb
);
730 for (rn
= route_top(ospf
->maxage_lsa
); rn
; rn
= route_next(rn
)) {
731 if ((lsa
= rn
->info
) != NULL
) {
732 ospf_lsa_unlock(&lsa
);
735 route_unlock_node(rn
);
737 route_table_finish(ospf
->maxage_lsa
);
740 ospf_route_table_free(ospf
->old_table
);
741 if (ospf
->new_table
) {
742 ospf_route_delete(ospf
, ospf
->new_table
);
743 ospf_route_table_free(ospf
->new_table
);
746 ospf_rtrs_free(ospf
->old_rtrs
);
748 ospf_rtrs_free(ospf
->new_rtrs
);
749 if (ospf
->new_external_route
) {
750 ospf_route_delete(ospf
, ospf
->new_external_route
);
751 ospf_route_table_free(ospf
->new_external_route
);
753 if (ospf
->old_external_route
) {
754 ospf_route_delete(ospf
, ospf
->old_external_route
);
755 ospf_route_table_free(ospf
->old_external_route
);
757 if (ospf
->external_lsas
) {
758 ospf_ase_external_lsas_finish(ospf
->external_lsas
);
761 list_delete(&ospf
->areas
);
762 list_delete(&ospf
->oi_write_q
);
764 for (i
= ZEBRA_ROUTE_SYSTEM
; i
<= ZEBRA_ROUTE_MAX
; i
++) {
765 struct list
*ext_list
;
766 struct ospf_external
*ext
;
768 ext_list
= ospf
->external
[i
];
772 for (ALL_LIST_ELEMENTS_RO(ext_list
, node
, ext
)) {
773 if (ext
->external_info
)
774 for (rn
= route_top(ext
->external_info
); rn
;
775 rn
= route_next(rn
)) {
776 if (rn
->info
== NULL
)
779 XFREE(MTYPE_OSPF_EXTERNAL_INFO
,
782 route_unlock_node(rn
);
787 ospf_distance_reset(ospf
);
788 route_table_finish(ospf
->distance_table
);
790 if (!CHECK_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
))
791 instance
= ospf
->instance
;
796 vrf
= vrf_lookup_by_name(ospf
->name
);
798 ospf_vrf_unlink(ospf
, vrf
);
799 XFREE(MTYPE_OSPF_TOP
, ospf
->name
);
801 vrf
= vrf_lookup_by_id(VRF_DEFAULT
);
803 ospf_vrf_unlink(ospf
, vrf
);
806 XFREE(MTYPE_OSPF_TOP
, ospf
);
808 if (!CHECK_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
))
809 ospf_get_instance(instance
);
813 /* allocate new OSPF Area object */
814 static struct ospf_area
*ospf_area_new(struct ospf
*ospf
,
815 struct in_addr area_id
)
817 struct ospf_area
*new;
819 /* Allocate new config_network. */
820 new = XCALLOC(MTYPE_OSPF_AREA
, sizeof(struct ospf_area
));
824 new->area_id
= area_id
;
825 new->area_id_fmt
= OSPF_AREA_ID_FMT_DOTTEDQUAD
;
827 new->external_routing
= OSPF_AREA_DEFAULT
;
828 new->default_cost
= 1;
829 new->auth_type
= OSPF_AUTH_NULL
;
832 new->lsdb
= ospf_lsdb_new();
834 /* Self-originated LSAs initialize. */
835 new->router_lsa_self
= NULL
;
837 ospf_opaque_type10_lsa_init(new);
839 new->oiflist
= list_new();
840 new->ranges
= route_table_init();
842 if (area_id
.s_addr
== OSPF_AREA_BACKBONE
)
843 ospf
->backbone
= new;
848 static void ospf_area_free(struct ospf_area
*area
)
850 struct route_node
*rn
;
851 struct ospf_lsa
*lsa
;
853 ospf_opaque_type10_lsa_term(area
);
856 LSDB_LOOP (ROUTER_LSDB(area
), rn
, lsa
)
857 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
858 LSDB_LOOP (NETWORK_LSDB(area
), rn
, lsa
)
859 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
860 LSDB_LOOP (SUMMARY_LSDB(area
), rn
, lsa
)
861 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
862 LSDB_LOOP (ASBR_SUMMARY_LSDB(area
), rn
, lsa
)
863 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
865 LSDB_LOOP (NSSA_LSDB(area
), rn
, lsa
)
866 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
867 LSDB_LOOP (OPAQUE_AREA_LSDB(area
), rn
, lsa
)
868 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
869 LSDB_LOOP (OPAQUE_LINK_LSDB(area
), rn
, lsa
)
870 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
872 ospf_lsdb_delete_all(area
->lsdb
);
873 ospf_lsdb_free(area
->lsdb
);
875 ospf_lsa_unlock(&area
->router_lsa_self
);
877 route_table_finish(area
->ranges
);
878 list_delete(&area
->oiflist
);
880 if (EXPORT_NAME(area
))
881 free(EXPORT_NAME(area
));
883 if (IMPORT_NAME(area
))
884 free(IMPORT_NAME(area
));
887 OSPF_TIMER_OFF(area
->t_stub_router
);
888 OSPF_TIMER_OFF(area
->t_opaque_lsa_self
);
890 if (OSPF_IS_AREA_BACKBONE(area
))
891 area
->ospf
->backbone
= NULL
;
893 XFREE(MTYPE_OSPF_AREA
, area
);
896 void ospf_area_check_free(struct ospf
*ospf
, struct in_addr area_id
)
898 struct ospf_area
*area
;
900 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
901 if (area
&& listcount(area
->oiflist
) == 0 && area
->ranges
->top
== NULL
902 && !ospf_vl_count(ospf
, area
)
903 && area
->shortcut_configured
== OSPF_SHORTCUT_DEFAULT
904 && area
->external_routing
== OSPF_AREA_DEFAULT
905 && area
->no_summary
== 0 && area
->default_cost
== 1
906 && EXPORT_NAME(area
) == NULL
&& IMPORT_NAME(area
) == NULL
907 && area
->auth_type
== OSPF_AUTH_NULL
) {
908 listnode_delete(ospf
->areas
, area
);
909 ospf_area_free(area
);
913 struct ospf_area
*ospf_area_get(struct ospf
*ospf
, struct in_addr area_id
)
915 struct ospf_area
*area
;
917 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
919 area
= ospf_area_new(ospf
, area_id
);
920 listnode_add_sort(ospf
->areas
, area
);
921 ospf_check_abr_status(ospf
);
922 if (ospf
->stub_router_admin_set
923 == OSPF_STUB_ROUTER_ADMINISTRATIVE_SET
) {
924 SET_FLAG(area
->stub_router_state
,
925 OSPF_AREA_ADMIN_STUB_ROUTED
);
932 struct ospf_area
*ospf_area_lookup_by_area_id(struct ospf
*ospf
,
933 struct in_addr area_id
)
935 struct ospf_area
*area
;
936 struct listnode
*node
;
938 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
))
939 if (IPV4_ADDR_SAME(&area
->area_id
, &area_id
))
945 void ospf_area_add_if(struct ospf_area
*area
, struct ospf_interface
*oi
)
947 listnode_add(area
->oiflist
, oi
);
950 void ospf_area_del_if(struct ospf_area
*area
, struct ospf_interface
*oi
)
952 listnode_delete(area
->oiflist
, oi
);
956 static void add_ospf_interface(struct connected
*co
, struct ospf_area
*area
)
958 struct ospf_interface
*oi
;
960 oi
= ospf_if_new(area
->ospf
, co
->ifp
, co
->address
);
965 oi
->params
= ospf_lookup_if_params(co
->ifp
, oi
->address
->u
.prefix4
);
966 oi
->output_cost
= ospf_if_get_output_cost(oi
);
968 /* Relate ospf interface to ospf instance. */
969 oi
->ospf
= area
->ospf
;
971 /* update network type as interface flag */
972 /* If network type is specified previously,
973 skip network type setting. */
974 oi
->type
= IF_DEF_PARAMS(co
->ifp
)->type
;
976 /* Add pseudo neighbor. */
977 ospf_nbr_self_reset(oi
, oi
->ospf
->router_id
);
979 ospf_area_add_if(oi
->area
, oi
);
982 * if router_id is not configured, dont bring up
984 * ospf_router_id_update() will call ospf_if_update
985 * whenever r-id is configured instead.
987 if ((area
->ospf
->router_id
.s_addr
!= 0) && if_is_operative(co
->ifp
))
991 static void update_redistributed(struct ospf
*ospf
, int add_to_ospf
)
993 struct route_node
*rn
;
994 struct external_info
*ei
;
995 struct ospf_external
*ext
;
997 if (ospf_is_type_redistributed(ospf
, ZEBRA_ROUTE_CONNECT
, 0)) {
998 ext
= ospf_external_lookup(ospf
, ZEBRA_ROUTE_CONNECT
, 0);
999 if ((ext
) && EXTERNAL_INFO(ext
)) {
1000 for (rn
= route_top(EXTERNAL_INFO(ext
)); rn
;
1001 rn
= route_next(rn
)) {
1007 if (ospf_external_info_find_lsa(ospf
,
1009 if (!ospf_distribute_check_connected(
1011 ospf_external_lsa_flush(
1014 ei
->ifindex
/*, ei->nexthop */);
1016 if (!ospf_external_info_find_lsa(
1018 if (ospf_distribute_check_connected(
1020 ospf_external_lsa_originate(
1028 /* Config network statement related functions. */
1029 static struct ospf_network
*ospf_network_new(struct in_addr area_id
)
1031 struct ospf_network
*new;
1032 new = XCALLOC(MTYPE_OSPF_NETWORK
, sizeof(struct ospf_network
));
1034 new->area_id
= area_id
;
1035 new->area_id_fmt
= OSPF_AREA_ID_FMT_DOTTEDQUAD
;
1040 static void ospf_network_free(struct ospf
*ospf
, struct ospf_network
*network
)
1042 ospf_area_check_free(ospf
, network
->area_id
);
1043 ospf_schedule_abr_task(ospf
);
1044 XFREE(MTYPE_OSPF_NETWORK
, network
);
1047 int ospf_network_set(struct ospf
*ospf
, struct prefix_ipv4
*p
,
1048 struct in_addr area_id
, int df
)
1050 struct ospf_network
*network
;
1051 struct ospf_area
*area
;
1052 struct route_node
*rn
;
1054 rn
= route_node_get(ospf
->networks
, (struct prefix
*)p
);
1057 route_unlock_node(rn
);
1059 if (IPV4_ADDR_SAME(&area_id
, &network
->area_id
)) {
1062 /* There is already same network statement. */
1067 rn
->info
= network
= ospf_network_new(area_id
);
1068 network
->area_id_fmt
= df
;
1069 area
= ospf_area_get(ospf
, area_id
);
1070 ospf_area_display_format_set(ospf
, area
, df
);
1072 /* Run network config now. */
1073 ospf_network_run((struct prefix
*)p
, area
);
1075 /* Update connected redistribute. */
1076 update_redistributed(ospf
, 1); /* interfaces possibly added */
1078 ospf_area_check_free(ospf
, area_id
);
1083 int ospf_network_unset(struct ospf
*ospf
, struct prefix_ipv4
*p
,
1084 struct in_addr area_id
)
1086 struct route_node
*rn
;
1087 struct ospf_network
*network
;
1088 struct listnode
*node
, *nnode
;
1089 struct ospf_interface
*oi
;
1091 rn
= route_node_lookup(ospf
->networks
, (struct prefix
*)p
);
1096 route_unlock_node(rn
);
1097 if (!IPV4_ADDR_SAME(&area_id
, &network
->area_id
))
1100 ospf_network_free(ospf
, rn
->info
);
1102 route_unlock_node(rn
); /* initial reference */
1104 /* Find interfaces that are not configured already. */
1105 for (ALL_LIST_ELEMENTS(ospf
->oiflist
, node
, nnode
, oi
)) {
1107 if (oi
->type
== OSPF_IFTYPE_VIRTUALLINK
)
1110 ospf_network_run_subnet(ospf
, oi
->connected
, NULL
, NULL
);
1113 /* Update connected redistribute. */
1114 update_redistributed(ospf
, 0); /* interfaces possibly removed */
1115 ospf_area_check_free(ospf
, area_id
);
1120 /* Ensure there's an OSPF instance, as "ip ospf area" enabled OSPF means
1121 * there might not be any 'router ospf' config.
1123 * Otherwise, doesn't do anything different to ospf_if_update for now
1125 void ospf_interface_area_set(struct ospf
*ospf
, struct interface
*ifp
)
1130 ospf_if_update(ospf
, ifp
);
1131 /* if_update does a update_redistributed */
1136 void ospf_interface_area_unset(struct ospf
*ospf
, struct interface
*ifp
)
1138 struct route_node
*rn_oi
;
1141 return; /* Ospf not ready yet */
1143 /* Find interfaces that may need to be removed. */
1144 for (rn_oi
= route_top(IF_OIFS(ifp
)); rn_oi
;
1145 rn_oi
= route_next(rn_oi
)) {
1146 struct ospf_interface
*oi
= NULL
;
1148 if ((oi
= rn_oi
->info
) == NULL
)
1151 if (oi
->type
== OSPF_IFTYPE_VIRTUALLINK
)
1154 ospf_network_run_subnet(ospf
, oi
->connected
, NULL
, NULL
);
1157 /* Update connected redistribute. */
1158 update_redistributed(ospf
, 0); /* interfaces possibly removed */
1161 bool ospf_interface_area_is_already_set(struct ospf
*ospf
,
1162 struct interface
*ifp
)
1164 struct route_node
*rn_oi
;
1167 return false; /* Ospf not ready yet */
1169 /* Find interfaces that may need to be removed. */
1170 for (rn_oi
= route_top(IF_OIFS(ifp
)); rn_oi
;
1171 rn_oi
= route_next(rn_oi
)) {
1172 struct ospf_interface
*oi
= rn_oi
->info
;
1177 if (oi
->type
== OSPF_IFTYPE_VIRTUALLINK
)
1179 /* at least one route covered by interface
1180 * that implies already done
1187 /* Check whether interface matches given network
1188 * returns: 1, true. 0, false
1190 static int ospf_network_match_iface(const struct connected
*co
,
1191 const struct prefix
*net
)
1193 /* new approach: more elegant and conceptually clean */
1194 return prefix_match_network_statement(net
, CONNECTED_PREFIX(co
));
1197 static void ospf_update_interface_area(struct connected
*co
,
1198 struct ospf_area
*area
)
1200 struct ospf_interface
*oi
= ospf_if_table_lookup(co
->ifp
, co
->address
);
1202 /* nothing to be done case */
1203 if (oi
&& oi
->area
== area
) {
1210 add_ospf_interface(co
, area
);
1213 /* Run OSPF for the given subnet, taking into account the following
1214 * possible sources of area configuration, in the given order of preference:
1216 * - Whether there is interface+address specific area configuration
1217 * - Whether there is a default area for the interface
1218 * - Whether there is an area given as a parameter.
1219 * - If no specific network prefix/area is supplied, whether there's
1220 * a matching network configured.
1222 static void ospf_network_run_subnet(struct ospf
*ospf
, struct connected
*co
,
1224 struct ospf_area
*given_area
)
1226 struct ospf_interface
*oi
;
1227 struct ospf_if_params
*params
;
1228 struct ospf_area
*area
= NULL
;
1229 struct route_node
*rn
;
1232 if (CHECK_FLAG(co
->flags
, ZEBRA_IFA_SECONDARY
))
1235 if (co
->address
->family
!= AF_INET
)
1238 /* Try determine the appropriate area for this interface + address
1239 * Start by checking interface config
1241 params
= ospf_lookup_if_params(co
->ifp
, co
->address
->u
.prefix4
);
1242 if (params
&& OSPF_IF_PARAM_CONFIGURED(params
, if_area
))
1243 area
= ospf_area_get(ospf
, params
->if_area
);
1245 params
= IF_DEF_PARAMS(co
->ifp
);
1246 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
))
1247 area
= ospf_area_get(ospf
, params
->if_area
);
1250 /* If we've found an interface and/or addr specific area, then we're
1254 ospf_update_interface_area(co
, area
);
1258 /* Otherwise, only remaining possibility is a matching network statement
1261 assert(given_area
!= NULL
);
1263 /* Which either was supplied as a parameter.. (e.g. cause a new
1264 * network/area was just added)..
1266 if (p
->family
== co
->address
->family
1267 && ospf_network_match_iface(co
, p
))
1268 ospf_update_interface_area(co
, given_area
);
1273 /* Else we have to search the existing network/area config to see
1276 for (rn
= route_top(ospf
->networks
); rn
; rn
= route_next(rn
))
1277 if (rn
->info
!= NULL
&& ospf_network_match_iface(co
, &rn
->p
)) {
1278 struct ospf_network
*network
=
1279 (struct ospf_network
*)rn
->info
;
1280 area
= ospf_area_get(ospf
, network
->area_id
);
1281 ospf_update_interface_area(co
, area
);
1285 /* If the subnet isn't in any area, deconfigure */
1286 if (!configed
&& (oi
= ospf_if_table_lookup(co
->ifp
, co
->address
)))
1290 static void ospf_network_run_interface(struct ospf
*ospf
, struct interface
*ifp
,
1292 struct ospf_area
*given_area
)
1294 struct listnode
*cnode
;
1295 struct connected
*co
;
1297 if (memcmp(ifp
->name
, "VLINK", 5) == 0)
1300 /* Network prefix without area is nonsensical */
1302 assert(given_area
!= NULL
);
1304 /* if interface prefix is match specified prefix,
1305 then create socket and join multicast group. */
1306 for (ALL_LIST_ELEMENTS_RO(ifp
->connected
, cnode
, co
))
1307 ospf_network_run_subnet(ospf
, co
, p
, given_area
);
1310 static void ospf_network_run(struct prefix
*p
, struct ospf_area
*area
)
1312 struct vrf
*vrf
= vrf_lookup_by_id(area
->ospf
->vrf_id
);
1313 struct interface
*ifp
;
1315 /* Schedule Router ID Update. */
1316 if (area
->ospf
->router_id
.s_addr
== 0)
1317 ospf_router_id_update(area
->ospf
);
1319 /* Get target interface. */
1320 FOR_ALL_INTERFACES (vrf
, ifp
)
1321 ospf_network_run_interface(area
->ospf
, ifp
, p
, area
);
1324 void ospf_ls_upd_queue_empty(struct ospf_interface
*oi
)
1326 struct route_node
*rn
;
1327 struct listnode
*node
, *nnode
;
1329 struct ospf_lsa
*lsa
;
1331 /* empty ls update queue */
1332 for (rn
= route_top(oi
->ls_upd_queue
); rn
; rn
= route_next(rn
))
1333 if ((lst
= (struct list
*)rn
->info
)) {
1334 for (ALL_LIST_ELEMENTS(lst
, node
, nnode
, lsa
))
1335 ospf_lsa_unlock(&lsa
); /* oi->ls_upd_queue */
1340 /* remove update event */
1341 if (oi
->t_ls_upd_event
) {
1342 thread_cancel(oi
->t_ls_upd_event
);
1343 oi
->t_ls_upd_event
= NULL
;
1347 void ospf_if_update(struct ospf
*ospf
, struct interface
*ifp
)
1353 if (IS_DEBUG_OSPF_EVENT
)
1355 "%s: interface %s ifp->vrf->vrf_id %u ospf vrf %s vrf_id %u router_id %s",
1356 __PRETTY_FUNCTION__
, ifp
->name
, vrf_to_id(ifp
->vrf
),
1357 ospf_vrf_id_to_name(ospf
->vrf_id
), ospf
->vrf_id
,
1358 inet_ntoa(ospf
->router_id
));
1360 /* OSPF must be ready. */
1361 if (!ospf_is_ready(ospf
))
1364 ospf_network_run_interface(ospf
, ifp
, NULL
, NULL
);
1366 /* Update connected redistribute. */
1367 update_redistributed(ospf
, 1);
1370 void ospf_remove_vls_through_area(struct ospf
*ospf
, struct ospf_area
*area
)
1372 struct listnode
*node
, *nnode
;
1373 struct ospf_vl_data
*vl_data
;
1375 for (ALL_LIST_ELEMENTS(ospf
->vlinks
, node
, nnode
, vl_data
))
1376 if (IPV4_ADDR_SAME(&vl_data
->vl_area_id
, &area
->area_id
))
1377 ospf_vl_delete(ospf
, vl_data
);
1381 static const struct message ospf_area_type_msg
[] = {
1382 {OSPF_AREA_DEFAULT
, "Default"},
1383 {OSPF_AREA_STUB
, "Stub"},
1384 {OSPF_AREA_NSSA
, "NSSA"},
1387 static void ospf_area_type_set(struct ospf_area
*area
, int type
)
1389 struct listnode
*node
;
1390 struct ospf_interface
*oi
;
1392 if (area
->external_routing
== type
) {
1393 if (IS_DEBUG_OSPF_EVENT
)
1394 zlog_debug("Area[%s]: Types are the same, ignored.",
1395 inet_ntoa(area
->area_id
));
1399 area
->external_routing
= type
;
1401 if (IS_DEBUG_OSPF_EVENT
)
1402 zlog_debug("Area[%s]: Configured as %s",
1403 inet_ntoa(area
->area_id
),
1404 lookup_msg(ospf_area_type_msg
, type
, NULL
));
1406 switch (area
->external_routing
) {
1407 case OSPF_AREA_DEFAULT
:
1408 for (ALL_LIST_ELEMENTS_RO(area
->oiflist
, node
, oi
))
1409 if (oi
->nbr_self
!= NULL
) {
1410 UNSET_FLAG(oi
->nbr_self
->options
,
1412 SET_FLAG(oi
->nbr_self
->options
, OSPF_OPTION_E
);
1415 case OSPF_AREA_STUB
:
1416 for (ALL_LIST_ELEMENTS_RO(area
->oiflist
, node
, oi
))
1417 if (oi
->nbr_self
!= NULL
) {
1418 if (IS_DEBUG_OSPF_EVENT
)
1420 "setting options on %s accordingly",
1422 UNSET_FLAG(oi
->nbr_self
->options
,
1424 UNSET_FLAG(oi
->nbr_self
->options
,
1426 if (IS_DEBUG_OSPF_EVENT
)
1427 zlog_debug("options set on %s: %x",
1428 IF_NAME(oi
), OPTIONS(oi
));
1431 case OSPF_AREA_NSSA
:
1432 for (ALL_LIST_ELEMENTS_RO(area
->oiflist
, node
, oi
))
1433 if (oi
->nbr_self
!= NULL
) {
1435 "setting nssa options on %s accordingly",
1437 UNSET_FLAG(oi
->nbr_self
->options
,
1439 SET_FLAG(oi
->nbr_self
->options
, OSPF_OPTION_NP
);
1440 zlog_debug("options set on %s: %x", IF_NAME(oi
),
1448 ospf_router_lsa_update_area(area
);
1449 ospf_schedule_abr_task(area
->ospf
);
1452 int ospf_area_shortcut_set(struct ospf
*ospf
, struct ospf_area
*area
, int mode
)
1454 if (area
->shortcut_configured
== mode
)
1457 area
->shortcut_configured
= mode
;
1458 ospf_router_lsa_update_area(area
);
1459 ospf_schedule_abr_task(ospf
);
1461 ospf_area_check_free(ospf
, area
->area_id
);
1466 int ospf_area_shortcut_unset(struct ospf
*ospf
, struct ospf_area
*area
)
1468 area
->shortcut_configured
= OSPF_SHORTCUT_DEFAULT
;
1469 ospf_router_lsa_update_area(area
);
1470 ospf_area_check_free(ospf
, area
->area_id
);
1471 ospf_schedule_abr_task(ospf
);
1476 static int ospf_area_vlink_count(struct ospf
*ospf
, struct ospf_area
*area
)
1478 struct ospf_vl_data
*vl
;
1479 struct listnode
*node
;
1482 for (ALL_LIST_ELEMENTS_RO(ospf
->vlinks
, node
, vl
))
1483 if (IPV4_ADDR_SAME(&vl
->vl_area_id
, &area
->area_id
))
1489 int ospf_area_display_format_set(struct ospf
*ospf
, struct ospf_area
*area
,
1492 area
->area_id_fmt
= df
;
1497 int ospf_area_stub_set(struct ospf
*ospf
, struct in_addr area_id
)
1499 struct ospf_area
*area
;
1501 area
= ospf_area_get(ospf
, area_id
);
1502 if (ospf_area_vlink_count(ospf
, area
))
1505 if (area
->external_routing
!= OSPF_AREA_STUB
)
1506 ospf_area_type_set(area
, OSPF_AREA_STUB
);
1511 int ospf_area_stub_unset(struct ospf
*ospf
, struct in_addr area_id
)
1513 struct ospf_area
*area
;
1515 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1519 if (area
->external_routing
== OSPF_AREA_STUB
)
1520 ospf_area_type_set(area
, OSPF_AREA_DEFAULT
);
1522 ospf_area_check_free(ospf
, area_id
);
1527 int ospf_area_no_summary_set(struct ospf
*ospf
, struct in_addr area_id
)
1529 struct ospf_area
*area
;
1531 area
= ospf_area_get(ospf
, area_id
);
1532 area
->no_summary
= 1;
1537 int ospf_area_no_summary_unset(struct ospf
*ospf
, struct in_addr area_id
)
1539 struct ospf_area
*area
;
1541 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1545 area
->no_summary
= 0;
1546 ospf_area_check_free(ospf
, area_id
);
1551 int ospf_area_nssa_no_summary_set(struct ospf
*ospf
, struct in_addr area_id
)
1553 struct ospf_area
*area
;
1555 area
= ospf_area_get(ospf
, area_id
);
1556 if (ospf_area_vlink_count(ospf
, area
))
1559 if (area
->external_routing
!= OSPF_AREA_NSSA
) {
1560 ospf_area_type_set(area
, OSPF_AREA_NSSA
);
1562 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1565 ospf_area_no_summary_set(ospf
, area_id
);
1570 int ospf_area_nssa_set(struct ospf
*ospf
, struct in_addr area_id
)
1572 struct ospf_area
*area
;
1574 area
= ospf_area_get(ospf
, area_id
);
1575 if (ospf_area_vlink_count(ospf
, area
))
1578 if (area
->external_routing
!= OSPF_AREA_NSSA
) {
1579 ospf_area_type_set(area
, OSPF_AREA_NSSA
);
1582 /* set NSSA area defaults */
1583 area
->no_summary
= 0;
1584 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1585 area
->NSSATranslatorState
= OSPF_NSSA_TRANSLATE_DISABLED
;
1586 area
->NSSATranslatorStabilityInterval
=
1587 OSPF_NSSA_TRANS_STABLE_DEFAULT
;
1592 int ospf_area_nssa_unset(struct ospf
*ospf
, struct in_addr area_id
, int argc
)
1594 struct ospf_area
*area
;
1596 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1600 /* argc < 5 -> 'no area x nssa' */
1601 if (argc
< 5 && area
->external_routing
== OSPF_AREA_NSSA
) {
1603 /* set NSSA area defaults */
1604 area
->no_summary
= 0;
1605 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1606 area
->NSSATranslatorState
= OSPF_NSSA_TRANSLATE_DISABLED
;
1607 area
->NSSATranslatorStabilityInterval
=
1608 OSPF_NSSA_TRANS_STABLE_DEFAULT
;
1609 ospf_area_type_set(area
, OSPF_AREA_DEFAULT
);
1611 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1614 ospf_area_check_free(ospf
, area_id
);
1619 int ospf_area_nssa_translator_role_set(struct ospf
*ospf
,
1620 struct in_addr area_id
, int role
)
1622 struct ospf_area
*area
;
1624 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1628 area
->NSSATranslatorRole
= role
;
1634 /* XXX: unused? Leave for symmetry? */
1636 ospf_area_nssa_translator_role_unset (struct ospf
*ospf
,
1637 struct in_addr area_id
)
1639 struct ospf_area
*area
;
1641 area
= ospf_area_lookup_by_area_id (ospf
, area_id
);
1645 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1647 ospf_area_check_free (ospf
, area_id
);
1653 int ospf_area_export_list_set(struct ospf
*ospf
, struct ospf_area
*area
,
1654 const char *list_name
)
1656 struct access_list
*list
;
1657 list
= access_list_lookup(AFI_IP
, list_name
);
1659 EXPORT_LIST(area
) = list
;
1661 if (EXPORT_NAME(area
))
1662 free(EXPORT_NAME(area
));
1664 EXPORT_NAME(area
) = strdup(list_name
);
1665 ospf_schedule_abr_task(ospf
);
1670 int ospf_area_export_list_unset(struct ospf
*ospf
, struct ospf_area
*area
)
1673 EXPORT_LIST(area
) = 0;
1675 if (EXPORT_NAME(area
))
1676 free(EXPORT_NAME(area
));
1678 EXPORT_NAME(area
) = NULL
;
1680 ospf_area_check_free(ospf
, area
->area_id
);
1682 ospf_schedule_abr_task(ospf
);
1687 int ospf_area_import_list_set(struct ospf
*ospf
, struct ospf_area
*area
,
1690 struct access_list
*list
;
1691 list
= access_list_lookup(AFI_IP
, name
);
1693 IMPORT_LIST(area
) = list
;
1695 if (IMPORT_NAME(area
))
1696 free(IMPORT_NAME(area
));
1698 IMPORT_NAME(area
) = strdup(name
);
1699 ospf_schedule_abr_task(ospf
);
1704 int ospf_area_import_list_unset(struct ospf
*ospf
, struct ospf_area
*area
)
1706 IMPORT_LIST(area
) = 0;
1708 if (IMPORT_NAME(area
))
1709 free(IMPORT_NAME(area
));
1711 IMPORT_NAME(area
) = NULL
;
1712 ospf_area_check_free(ospf
, area
->area_id
);
1714 ospf_schedule_abr_task(ospf
);
1719 int ospf_timers_refresh_set(struct ospf
*ospf
, int interval
)
1723 if (ospf
->lsa_refresh_interval
== interval
)
1726 time_left
= ospf
->lsa_refresh_interval
1727 - (monotime(NULL
) - ospf
->lsa_refresher_started
);
1729 if (time_left
> interval
) {
1730 OSPF_TIMER_OFF(ospf
->t_lsa_refresher
);
1731 thread_add_timer(master
, ospf_lsa_refresh_walker
, ospf
,
1732 interval
, &ospf
->t_lsa_refresher
);
1734 ospf
->lsa_refresh_interval
= interval
;
1739 int ospf_timers_refresh_unset(struct ospf
*ospf
)
1743 time_left
= ospf
->lsa_refresh_interval
1744 - (monotime(NULL
) - ospf
->lsa_refresher_started
);
1746 if (time_left
> OSPF_LSA_REFRESH_INTERVAL_DEFAULT
) {
1747 OSPF_TIMER_OFF(ospf
->t_lsa_refresher
);
1748 ospf
->t_lsa_refresher
= NULL
;
1749 thread_add_timer(master
, ospf_lsa_refresh_walker
, ospf
,
1750 OSPF_LSA_REFRESH_INTERVAL_DEFAULT
,
1751 &ospf
->t_lsa_refresher
);
1754 ospf
->lsa_refresh_interval
= OSPF_LSA_REFRESH_INTERVAL_DEFAULT
;
1760 static struct ospf_nbr_nbma
*ospf_nbr_nbma_new(void)
1762 struct ospf_nbr_nbma
*nbr_nbma
;
1764 nbr_nbma
= XCALLOC(MTYPE_OSPF_NEIGHBOR_STATIC
,
1765 sizeof(struct ospf_nbr_nbma
));
1767 nbr_nbma
->priority
= OSPF_NEIGHBOR_PRIORITY_DEFAULT
;
1768 nbr_nbma
->v_poll
= OSPF_POLL_INTERVAL_DEFAULT
;
1773 static void ospf_nbr_nbma_free(struct ospf_nbr_nbma
*nbr_nbma
)
1775 XFREE(MTYPE_OSPF_NEIGHBOR_STATIC
, nbr_nbma
);
1778 static void ospf_nbr_nbma_delete(struct ospf
*ospf
,
1779 struct ospf_nbr_nbma
*nbr_nbma
)
1781 struct route_node
*rn
;
1782 struct prefix_ipv4 p
;
1785 p
.prefix
= nbr_nbma
->addr
;
1786 p
.prefixlen
= IPV4_MAX_BITLEN
;
1788 rn
= route_node_lookup(ospf
->nbr_nbma
, (struct prefix
*)&p
);
1790 ospf_nbr_nbma_free(rn
->info
);
1792 route_unlock_node(rn
);
1793 route_unlock_node(rn
);
1797 static void ospf_nbr_nbma_down(struct ospf_nbr_nbma
*nbr_nbma
)
1799 OSPF_TIMER_OFF(nbr_nbma
->t_poll
);
1801 if (nbr_nbma
->nbr
) {
1802 nbr_nbma
->nbr
->nbr_nbma
= NULL
;
1803 OSPF_NSM_EVENT_EXECUTE(nbr_nbma
->nbr
, NSM_KillNbr
);
1807 listnode_delete(nbr_nbma
->oi
->nbr_nbma
, nbr_nbma
);
1810 static void ospf_nbr_nbma_add(struct ospf_nbr_nbma
*nbr_nbma
,
1811 struct ospf_interface
*oi
)
1813 struct ospf_neighbor
*nbr
;
1814 struct route_node
*rn
;
1817 if (oi
->type
!= OSPF_IFTYPE_NBMA
)
1820 if (nbr_nbma
->nbr
!= NULL
)
1823 if (IPV4_ADDR_SAME(&oi
->nbr_self
->address
.u
.prefix4
, &nbr_nbma
->addr
))
1827 listnode_add(oi
->nbr_nbma
, nbr_nbma
);
1829 /* Get neighbor information from table. */
1831 p
.prefixlen
= IPV4_MAX_BITLEN
;
1832 p
.u
.prefix4
= nbr_nbma
->addr
;
1834 rn
= route_node_get(oi
->nbrs
, (struct prefix
*)&p
);
1837 nbr
->nbr_nbma
= nbr_nbma
;
1838 nbr_nbma
->nbr
= nbr
;
1840 route_unlock_node(rn
);
1842 nbr
= rn
->info
= ospf_nbr_new(oi
);
1843 nbr
->state
= NSM_Down
;
1844 nbr
->src
= nbr_nbma
->addr
;
1845 nbr
->nbr_nbma
= nbr_nbma
;
1846 nbr
->priority
= nbr_nbma
->priority
;
1849 nbr_nbma
->nbr
= nbr
;
1851 OSPF_NSM_EVENT_EXECUTE(nbr
, NSM_Start
);
1855 void ospf_nbr_nbma_if_update(struct ospf
*ospf
, struct ospf_interface
*oi
)
1857 struct ospf_nbr_nbma
*nbr_nbma
;
1858 struct route_node
*rn
;
1859 struct prefix_ipv4 p
;
1861 if (oi
->type
!= OSPF_IFTYPE_NBMA
)
1864 for (rn
= route_top(ospf
->nbr_nbma
); rn
; rn
= route_next(rn
))
1865 if ((nbr_nbma
= rn
->info
))
1866 if (nbr_nbma
->oi
== NULL
&& nbr_nbma
->nbr
== NULL
) {
1868 p
.prefix
= nbr_nbma
->addr
;
1869 p
.prefixlen
= IPV4_MAX_BITLEN
;
1871 if (prefix_match(oi
->address
,
1872 (struct prefix
*)&p
))
1873 ospf_nbr_nbma_add(nbr_nbma
, oi
);
1877 struct ospf_nbr_nbma
*ospf_nbr_nbma_lookup(struct ospf
*ospf
,
1878 struct in_addr nbr_addr
)
1880 struct route_node
*rn
;
1881 struct prefix_ipv4 p
;
1884 p
.prefix
= nbr_addr
;
1885 p
.prefixlen
= IPV4_MAX_BITLEN
;
1887 rn
= route_node_lookup(ospf
->nbr_nbma
, (struct prefix
*)&p
);
1889 route_unlock_node(rn
);
1895 struct ospf_nbr_nbma
*ospf_nbr_nbma_lookup_next(struct ospf
*ospf
,
1896 struct in_addr
*addr
, int first
)
1899 struct ospf_nbr_nbma
*nbr_nbma
;
1900 struct listnode
*node
;
1907 for (ALL_LIST_ELEMENTS_RO (ospf
->nbr_nbma
, node
, nbr_nbma
))
1911 *addr
= nbr_nbma
->addr
;
1914 else if (ntohl (nbr_nbma
->addr
.s_addr
) > ntohl (addr
->s_addr
))
1916 *addr
= nbr_nbma
->addr
;
1924 int ospf_nbr_nbma_set(struct ospf
*ospf
, struct in_addr nbr_addr
)
1926 struct ospf_nbr_nbma
*nbr_nbma
;
1927 struct ospf_interface
*oi
;
1928 struct prefix_ipv4 p
;
1929 struct route_node
*rn
;
1930 struct listnode
*node
;
1932 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
1936 nbr_nbma
= ospf_nbr_nbma_new();
1937 nbr_nbma
->addr
= nbr_addr
;
1940 p
.prefix
= nbr_addr
;
1941 p
.prefixlen
= IPV4_MAX_BITLEN
;
1943 rn
= route_node_get(ospf
->nbr_nbma
, (struct prefix
*)&p
);
1945 route_unlock_node(rn
);
1946 rn
->info
= nbr_nbma
;
1948 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
1949 if (oi
->type
== OSPF_IFTYPE_NBMA
)
1950 if (prefix_match(oi
->address
, (struct prefix
*)&p
)) {
1951 ospf_nbr_nbma_add(nbr_nbma
, oi
);
1959 int ospf_nbr_nbma_unset(struct ospf
*ospf
, struct in_addr nbr_addr
)
1961 struct ospf_nbr_nbma
*nbr_nbma
;
1963 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
1964 if (nbr_nbma
== NULL
)
1967 ospf_nbr_nbma_down(nbr_nbma
);
1968 ospf_nbr_nbma_delete(ospf
, nbr_nbma
);
1973 int ospf_nbr_nbma_priority_set(struct ospf
*ospf
, struct in_addr nbr_addr
,
1976 struct ospf_nbr_nbma
*nbr_nbma
;
1978 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
1979 if (nbr_nbma
== NULL
)
1982 if (nbr_nbma
->priority
!= priority
)
1983 nbr_nbma
->priority
= priority
;
1988 int ospf_nbr_nbma_priority_unset(struct ospf
*ospf
, struct in_addr nbr_addr
)
1990 struct ospf_nbr_nbma
*nbr_nbma
;
1992 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
1993 if (nbr_nbma
== NULL
)
1996 if (nbr_nbma
!= OSPF_NEIGHBOR_PRIORITY_DEFAULT
)
1997 nbr_nbma
->priority
= OSPF_NEIGHBOR_PRIORITY_DEFAULT
;
2002 int ospf_nbr_nbma_poll_interval_set(struct ospf
*ospf
, struct in_addr nbr_addr
,
2003 unsigned int interval
)
2005 struct ospf_nbr_nbma
*nbr_nbma
;
2007 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
2008 if (nbr_nbma
== NULL
)
2011 if (nbr_nbma
->v_poll
!= interval
) {
2012 nbr_nbma
->v_poll
= interval
;
2013 if (nbr_nbma
->oi
&& ospf_if_is_up(nbr_nbma
->oi
)) {
2014 OSPF_TIMER_OFF(nbr_nbma
->t_poll
);
2015 OSPF_POLL_TIMER_ON(nbr_nbma
->t_poll
, ospf_poll_timer
,
2023 int ospf_nbr_nbma_poll_interval_unset(struct ospf
*ospf
, struct in_addr addr
)
2025 struct ospf_nbr_nbma
*nbr_nbma
;
2027 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, addr
);
2028 if (nbr_nbma
== NULL
)
2031 if (nbr_nbma
->v_poll
!= OSPF_POLL_INTERVAL_DEFAULT
)
2032 nbr_nbma
->v_poll
= OSPF_POLL_INTERVAL_DEFAULT
;
2037 void ospf_master_init(struct thread_master
*master
)
2039 memset(&ospf_master
, 0, sizeof(struct ospf_master
));
2042 om
->ospf
= list_new();
2043 om
->master
= master
;
2046 /* Link OSPF instance to VRF. */
2047 void ospf_vrf_link(struct ospf
*ospf
, struct vrf
*vrf
)
2049 ospf
->vrf_id
= vrf
->vrf_id
;
2050 if (vrf
->info
!= (void *)ospf
)
2051 vrf
->info
= (void *)ospf
;
2054 /* Unlink OSPF instance from VRF. */
2055 void ospf_vrf_unlink(struct ospf
*ospf
, struct vrf
*vrf
)
2057 if (vrf
->info
== (void *)ospf
)
2059 ospf
->vrf_id
= VRF_UNKNOWN
;
2062 /* This is hook function for vrf create called as part of vrf_init */
2063 static int ospf_vrf_new(struct vrf
*vrf
)
2065 if (IS_DEBUG_OSPF_EVENT
)
2066 zlog_debug("%s: VRF Created: %s(%u)", __PRETTY_FUNCTION__
,
2067 vrf
->name
, vrf
->vrf_id
);
2072 /* This is hook function for vrf delete call as part of vrf_init */
2073 static int ospf_vrf_delete(struct vrf
*vrf
)
2075 if (IS_DEBUG_OSPF_EVENT
)
2076 zlog_debug("%s: VRF Deletion: %s(%u)", __PRETTY_FUNCTION__
,
2077 vrf
->name
, vrf
->vrf_id
);
2082 static void ospf_set_redist_vrf_bitmaps(struct ospf
*ospf
)
2085 struct list
*red_list
;
2087 for (type
= 0; type
< ZEBRA_ROUTE_MAX
; type
++) {
2088 red_list
= ospf
->redist
[type
];
2091 if (IS_DEBUG_OSPF_EVENT
)
2093 "%s: setting redist vrf %d bitmap for type %d",
2094 __func__
, ospf
->vrf_id
, type
);
2095 vrf_bitmap_set(zclient
->redist
[AFI_IP
][type
], ospf
->vrf_id
);
2099 /* Enable OSPF VRF instance */
2100 static int ospf_vrf_enable(struct vrf
*vrf
)
2102 struct ospf
*ospf
= NULL
;
2103 vrf_id_t old_vrf_id
;
2106 if (IS_DEBUG_OSPF_EVENT
)
2107 zlog_debug("%s: VRF %s id %u enabled", __PRETTY_FUNCTION__
,
2108 vrf
->name
, vrf
->vrf_id
);
2110 ospf
= ospf_lookup_by_name(vrf
->name
);
2112 if (ospf
->name
&& strmatch(vrf
->name
, VRF_DEFAULT_NAME
)) {
2113 XFREE(MTYPE_OSPF_TOP
, ospf
->name
);
2116 old_vrf_id
= ospf
->vrf_id
;
2117 /* We have instance configured, link to VRF and make it "up". */
2118 ospf_vrf_link(ospf
, vrf
);
2119 if (IS_DEBUG_OSPF_EVENT
)
2121 "%s: ospf linked to vrf %s vrf_id %u (old id %u)",
2122 __PRETTY_FUNCTION__
, vrf
->name
, ospf
->vrf_id
,
2125 if (old_vrf_id
!= ospf
->vrf_id
) {
2126 frr_elevate_privs(&ospfd_privs
) {
2127 /* stop zebra redist to us for old vrf */
2128 zclient_send_dereg_requests(zclient
,
2131 ospf_set_redist_vrf_bitmaps(ospf
);
2133 /* start zebra redist to us for new vrf */
2134 ospf_zebra_vrf_register(ospf
);
2136 ret
= ospf_sock_init(ospf
);
2138 if (ret
< 0 || ospf
->fd
<= 0)
2140 thread_add_read(master
, ospf_read
, ospf
, ospf
->fd
,
2142 ospf
->oi_running
= 1;
2143 ospf_router_id_update(ospf
);
2150 /* Disable OSPF VRF instance */
2151 static int ospf_vrf_disable(struct vrf
*vrf
)
2153 struct ospf
*ospf
= NULL
;
2154 vrf_id_t old_vrf_id
= VRF_UNKNOWN
;
2156 if (vrf
->vrf_id
== VRF_DEFAULT
)
2159 if (IS_DEBUG_OSPF_EVENT
)
2160 zlog_debug("%s: VRF %s id %d disabled.", __PRETTY_FUNCTION__
,
2161 vrf
->name
, vrf
->vrf_id
);
2163 ospf
= ospf_lookup_by_name(vrf
->name
);
2165 old_vrf_id
= ospf
->vrf_id
;
2167 /* We have instance configured, unlink
2168 * from VRF and make it "down".
2170 ospf_vrf_unlink(ospf
, vrf
);
2171 ospf
->oi_running
= 0;
2172 if (IS_DEBUG_OSPF_EVENT
)
2173 zlog_debug("%s: ospf old_vrf_id %d unlinked",
2174 __PRETTY_FUNCTION__
, old_vrf_id
);
2175 thread_cancel(ospf
->t_read
);
2180 /* Note: This is a callback, the VRF will be deleted by the caller. */
2184 void ospf_vrf_init(void)
2186 vrf_init(ospf_vrf_new
, ospf_vrf_enable
, ospf_vrf_disable
,
2187 ospf_vrf_delete
, NULL
);
2190 void ospf_vrf_terminate(void)
2195 const char *ospf_vrf_id_to_name(vrf_id_t vrf_id
)
2197 struct vrf
*vrf
= vrf_lookup_by_id(vrf_id
);
2199 return vrf
? vrf
->name
: "NIL";