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
;
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 /* Flush (inline) all external LSAs based on the OSPF_LSA_SELF
140 struct route_node
*rn
;
141 struct ospf_lsa
*lsa
;
143 LSDB_LOOP (EXTERNAL_LSDB(ospf
), rn
, lsa
)
144 if (IS_LSA_SELF(lsa
))
145 ospf_lsa_flush_schedule(ospf
, lsa
);
148 ospf
->router_id
= router_id
;
149 if (IS_DEBUG_OSPF_EVENT
)
150 zlog_debug("Router-ID[NEW:%s]: Update",
151 inet_ntoa(ospf
->router_id
));
153 /* Flush (inline) all external LSAs which now match the new
155 need to adjust the OSPF_LSA_SELF flag, so the flush doesn't
157 asserts in ospf_refresher_unregister_lsa(). This step is
159 because the current quagga code does look-up for
161 based on the self router-id alone but expects OSPF_LSA_SELF
165 struct route_node
*rn
;
166 struct ospf_lsa
*lsa
;
168 LSDB_LOOP (EXTERNAL_LSDB(ospf
), rn
, lsa
) {
169 /* AdvRouter and Router ID is the same. */
170 if (IPV4_ADDR_SAME(&lsa
->data
->adv_router
,
173 OSPF_LSA_SELF_CHECKED
);
174 SET_FLAG(lsa
->flags
, OSPF_LSA_SELF
);
175 ospf_lsa_flush_schedule(ospf
, lsa
);
180 /* update router-lsa's for each area */
181 ospf_router_lsa_update(ospf
);
183 /* update ospf_interface's */
184 FOR_ALL_INTERFACES (vrf
, ifp
)
185 ospf_if_update(ospf
, ifp
);
187 ospf_external_lsa_rid_change(ospf
);
191 /* For OSPF area sort by area id. */
192 static int ospf_area_id_cmp(struct ospf_area
*a1
, struct ospf_area
*a2
)
194 if (ntohl(a1
->area_id
.s_addr
) > ntohl(a2
->area_id
.s_addr
))
196 if (ntohl(a1
->area_id
.s_addr
) < ntohl(a2
->area_id
.s_addr
))
201 /* Allocate new ospf structure. */
202 static struct ospf
*ospf_new(unsigned short instance
, const char *name
)
205 struct vrf
*vrf
= NULL
;
207 struct ospf
*new = XCALLOC(MTYPE_OSPF_TOP
, sizeof(struct ospf
));
209 new->instance
= instance
;
210 new->router_id
.s_addr
= htonl(0);
211 new->router_id_static
.s_addr
= htonl(0);
213 vrf
= vrf_lookup_by_name(name
);
215 new->vrf_id
= vrf
->vrf_id
;
217 new->vrf_id
= VRF_UNKNOWN
;
218 /* Freed in ospf_finish_final */
219 new->name
= XSTRDUP(MTYPE_OSPF_TOP
, name
);
220 if (IS_DEBUG_OSPF_EVENT
)
222 "%s: Create new ospf instance with vrf_name %s vrf_id %u",
223 __PRETTY_FUNCTION__
, name
, new->vrf_id
);
225 new->vrf_id
= VRF_DEFAULT
;
226 vrf
= vrf_lookup_by_id(VRF_DEFAULT
);
230 ospf_vrf_link(new, vrf
);
232 ospf_zebra_vrf_register(new);
234 new->abr_type
= OSPF_ABR_DEFAULT
;
235 new->oiflist
= list_new();
236 new->vlinks
= list_new();
237 new->areas
= list_new();
238 new->areas
->cmp
= (int (*)(void *, void *))ospf_area_id_cmp
;
239 new->networks
= route_table_init();
240 new->nbr_nbma
= route_table_init();
242 new->lsdb
= ospf_lsdb_new();
244 new->default_originate
= DEFAULT_ORIGINATE_NONE
;
246 new->passive_interface_default
= OSPF_IF_ACTIVE
;
248 new->new_external_route
= route_table_init();
249 new->old_external_route
= route_table_init();
250 new->external_lsas
= route_table_init();
252 new->stub_router_startup_time
= OSPF_STUB_ROUTER_UNCONFIGURED
;
253 new->stub_router_shutdown_time
= OSPF_STUB_ROUTER_UNCONFIGURED
;
254 new->stub_router_admin_set
= OSPF_STUB_ROUTER_ADMINISTRATIVE_UNSET
;
256 /* Distribute parameter init. */
257 for (i
= 0; i
<= ZEBRA_ROUTE_MAX
; i
++) {
260 new->default_metric
= -1;
261 new->ref_bandwidth
= OSPF_DEFAULT_REF_BANDWIDTH
;
264 new->min_ls_interval
= OSPF_MIN_LS_INTERVAL
;
265 new->min_ls_arrival
= OSPF_MIN_LS_ARRIVAL
;
267 /* SPF timer value init. */
268 new->spf_delay
= OSPF_SPF_DELAY_DEFAULT
;
269 new->spf_holdtime
= OSPF_SPF_HOLDTIME_DEFAULT
;
270 new->spf_max_holdtime
= OSPF_SPF_MAX_HOLDTIME_DEFAULT
;
271 new->spf_hold_multiplier
= 1;
274 new->maxage_delay
= OSPF_LSA_MAXAGE_REMOVE_DELAY_DEFAULT
;
275 new->maxage_lsa
= route_table_init();
276 new->t_maxage_walker
= NULL
;
277 thread_add_timer(master
, ospf_lsa_maxage_walker
, new,
278 OSPF_LSA_MAXAGE_CHECK_INTERVAL
, &new->t_maxage_walker
);
280 /* Distance table init. */
281 new->distance_table
= route_table_init();
283 new->lsa_refresh_queue
.index
= 0;
284 new->lsa_refresh_interval
= OSPF_LSA_REFRESH_INTERVAL_DEFAULT
;
285 new->t_lsa_refresher
= NULL
;
286 thread_add_timer(master
, ospf_lsa_refresh_walker
, new,
287 new->lsa_refresh_interval
, &new->t_lsa_refresher
);
288 new->lsa_refresher_started
= monotime(NULL
);
290 new->ibuf
= stream_new(OSPF_MAX_PACKET_SIZE
+ 1);
293 new->oi_write_q
= list_new();
294 new->write_oi_count
= OSPF_WRITE_INTERFACE_COUNT_DEFAULT
;
296 /* Enable "log-adjacency-changes" */
297 #if DFLT_OSPF_LOG_ADJACENCY_CHANGES
298 SET_FLAG(new->config
, OSPF_LOG_ADJACENCY_CHANGES
);
304 if ((ospf_sock_init(new)) < 0) {
305 if (new->vrf_id
!= VRF_UNKNOWN
)
308 "%s: ospf_sock_init is unable to open a socket",
312 thread_add_read(master
, ospf_read
, new, new->fd
, &new->t_read
);
317 struct ospf
*ospf_lookup_instance(unsigned short instance
)
320 struct listnode
*node
, *nnode
;
322 if (listcount(om
->ospf
) == 0)
325 for (ALL_LIST_ELEMENTS(om
->ospf
, node
, nnode
, ospf
))
326 if ((ospf
->instance
== 0 && instance
== 0)
327 || (ospf
->instance
&& instance
328 && ospf
->instance
== instance
))
334 static int ospf_is_ready(struct ospf
*ospf
)
336 /* OSPF must be on and Router-ID must be configured. */
337 if (!ospf
|| ospf
->router_id
.s_addr
== 0)
343 static void ospf_add(struct ospf
*ospf
)
345 listnode_add(om
->ospf
, ospf
);
348 static void ospf_delete(struct ospf
*ospf
)
350 listnode_delete(om
->ospf
, ospf
);
353 struct ospf
*ospf_lookup_by_inst_name(unsigned short instance
, const char *name
)
355 struct ospf
*ospf
= NULL
;
356 struct listnode
*node
, *nnode
;
358 if (name
== NULL
|| strmatch(name
, VRF_DEFAULT_NAME
))
359 return ospf_lookup_by_vrf_id(VRF_DEFAULT
);
361 for (ALL_LIST_ELEMENTS(om
->ospf
, node
, nnode
, ospf
)) {
362 if ((ospf
->instance
== instance
)
363 && ((ospf
->name
== NULL
&& name
== NULL
)
364 || (ospf
->name
&& name
365 && strcmp(ospf
->name
, name
) == 0)))
371 struct ospf
*ospf_get(unsigned short instance
, const char *name
)
375 /* vrf name provided call inst and name based api
376 * in case of no name pass default ospf instance */
378 ospf
= ospf_lookup_by_inst_name(instance
, name
);
380 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
383 ospf
= ospf_new(instance
, name
);
386 if (ospf
->router_id_static
.s_addr
== 0)
387 ospf_router_id_update(ospf
);
389 ospf_opaque_type11_lsa_init(ospf
);
395 struct ospf
*ospf_get_instance(unsigned short instance
)
399 ospf
= ospf_lookup_instance(instance
);
401 ospf
= ospf_new(instance
, NULL
/* VRF_DEFAULT*/);
404 if (ospf
->router_id_static
.s_addr
== 0) {
405 if (vrf_lookup_by_id(ospf
->vrf_id
))
406 ospf_router_id_update(ospf
);
408 if (IS_DEBUG_OSPF_EVENT
)
410 "%s: ospf VRF (id %d) is not active yet, skip router id update",
414 ospf_router_id_update(ospf
);
417 ospf_opaque_type11_lsa_init(ospf
);
423 struct ospf
*ospf_lookup_by_vrf_id(vrf_id_t vrf_id
)
425 struct vrf
*vrf
= NULL
;
427 vrf
= vrf_lookup_by_id(vrf_id
);
430 return (vrf
->info
) ? (struct ospf
*)vrf
->info
: NULL
;
433 /* It should only be used when processing incoming info update from zebra.
434 * Other situations, it is not sufficient to lookup the ospf instance by
435 * vrf_name only without using the instance number.
437 static struct ospf
*ospf_lookup_by_name(const char *vrf_name
)
439 struct ospf
*ospf
= NULL
;
440 struct listnode
*node
, *nnode
;
442 for (ALL_LIST_ELEMENTS(om
->ospf
, node
, nnode
, ospf
))
443 if ((ospf
->name
== NULL
&& vrf_name
== NULL
)
444 || (ospf
->name
&& vrf_name
445 && strcmp(ospf
->name
, vrf_name
) == 0))
450 /* Handle the second half of deferred shutdown. This is called either
451 * from the deferred-shutdown timer thread, or directly through
452 * ospf_deferred_shutdown_check.
454 * Function is to cleanup G-R state, if required then call ospf_finish_final
455 * to complete shutdown of this ospf instance. Possibly exit if the
456 * whole process is being shutdown and this was the last OSPF instance.
458 static void ospf_deferred_shutdown_finish(struct ospf
*ospf
)
460 ospf
->stub_router_shutdown_time
= OSPF_STUB_ROUTER_UNCONFIGURED
;
461 OSPF_TIMER_OFF(ospf
->t_deferred_shutdown
);
463 ospf_finish_final(ospf
);
465 /* *ospf is now invalid */
467 /* ospfd being shut-down? If so, was this the last ospf instance? */
468 if (CHECK_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
)
469 && (listcount(om
->ospf
) == 0)) {
476 /* Timer thread for G-R */
477 static int ospf_deferred_shutdown_timer(struct thread
*t
)
479 struct ospf
*ospf
= THREAD_ARG(t
);
481 ospf_deferred_shutdown_finish(ospf
);
486 /* Check whether deferred-shutdown must be scheduled, otherwise call
487 * down directly into second-half of instance shutdown.
489 static void ospf_deferred_shutdown_check(struct ospf
*ospf
)
491 unsigned long timeout
;
493 struct ospf_area
*area
;
495 /* deferred shutdown already running? */
496 if (ospf
->t_deferred_shutdown
)
499 /* Should we try push out max-metric LSAs? */
500 if (ospf
->stub_router_shutdown_time
!= OSPF_STUB_ROUTER_UNCONFIGURED
) {
501 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, ln
, area
)) {
502 SET_FLAG(area
->stub_router_state
,
503 OSPF_AREA_ADMIN_STUB_ROUTED
);
505 if (!CHECK_FLAG(area
->stub_router_state
,
506 OSPF_AREA_IS_STUB_ROUTED
))
507 ospf_router_lsa_update_area(area
);
509 timeout
= ospf
->stub_router_shutdown_time
;
511 /* No timer needed */
512 ospf_deferred_shutdown_finish(ospf
);
516 OSPF_TIMER_ON(ospf
->t_deferred_shutdown
, ospf_deferred_shutdown_timer
,
521 /* Shut down the entire process */
522 void ospf_terminate(void)
525 struct listnode
*node
, *nnode
;
527 /* shutdown already in progress */
528 if (CHECK_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
))
531 SET_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
);
533 /* exit immediately if OSPF not actually running */
534 if (listcount(om
->ospf
) == 0)
538 for (ALL_LIST_ELEMENTS(om
->ospf
, node
, nnode
, ospf
))
541 /* Cleanup route maps */
544 /* reverse prefix_list_init */
545 prefix_list_add_hook(NULL
);
546 prefix_list_delete_hook(NULL
);
549 /* Cleanup vrf info */
550 ospf_vrf_terminate();
552 /* Deliberately go back up, hopefully to thread scheduler, as
553 * One or more ospf_finish()'s may have deferred shutdown to a timer
556 zclient_stop(zclient
);
557 zclient_free(zclient
);
562 void ospf_finish(struct ospf
*ospf
)
564 /* let deferred shutdown decide */
565 ospf_deferred_shutdown_check(ospf
);
567 /* if ospf_deferred_shutdown returns, then ospf_finish_final is
568 * deferred to expiry of G-S timer thread. Return back up, hopefully
569 * to thread scheduler.
574 /* Final cleanup of ospf instance */
575 static void ospf_finish_final(struct ospf
*ospf
)
577 struct vrf
*vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
578 struct route_node
*rn
;
579 struct ospf_nbr_nbma
*nbr_nbma
;
580 struct ospf_lsa
*lsa
;
581 struct interface
*ifp
;
582 struct ospf_interface
*oi
;
583 struct ospf_area
*area
;
584 struct ospf_vl_data
*vl_data
;
585 struct listnode
*node
, *nnode
;
587 unsigned short instance
= 0;
591 ospf_opaque_type11_lsa_term(ospf
);
593 ospf_opaque_finish();
595 ospf_flush_self_originated_lsas_now(ospf
);
597 /* Unregister redistribution */
598 for (i
= 0; i
< ZEBRA_ROUTE_MAX
; i
++) {
599 struct list
*red_list
;
600 struct ospf_redist
*red
;
602 red_list
= ospf
->redist
[i
];
606 for (ALL_LIST_ELEMENTS(red_list
, node
, nnode
, red
)) {
607 ospf_redistribute_unset(ospf
, i
, red
->instance
);
608 ospf_redist_del(ospf
, i
, red
->instance
);
611 ospf_redistribute_default_set(ospf
, DEFAULT_ORIGINATE_NONE
, 0, 0);
613 for (ALL_LIST_ELEMENTS(ospf
->areas
, node
, nnode
, area
))
614 ospf_remove_vls_through_area(ospf
, area
);
616 for (ALL_LIST_ELEMENTS(ospf
->vlinks
, node
, nnode
, vl_data
))
617 ospf_vl_delete(ospf
, vl_data
);
619 list_delete(&ospf
->vlinks
);
621 /* Remove any ospf interface config params */
622 FOR_ALL_INTERFACES (vrf
, ifp
) {
623 struct ospf_if_params
*params
;
625 params
= IF_DEF_PARAMS(ifp
);
626 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
))
627 UNSET_IF_PARAM(params
, if_area
);
630 /* Reset interface. */
631 for (ALL_LIST_ELEMENTS(ospf
->oiflist
, node
, nnode
, oi
))
633 list_delete(&ospf
->oiflist
);
634 ospf
->oi_running
= 0;
636 /* De-Register VRF */
637 ospf_zebra_vrf_deregister(ospf
);
639 /* Clear static neighbors */
640 for (rn
= route_top(ospf
->nbr_nbma
); rn
; rn
= route_next(rn
))
641 if ((nbr_nbma
= rn
->info
)) {
642 OSPF_POLL_TIMER_OFF(nbr_nbma
->t_poll
);
645 nbr_nbma
->nbr
->nbr_nbma
= NULL
;
646 nbr_nbma
->nbr
= NULL
;
650 listnode_delete(nbr_nbma
->oi
->nbr_nbma
,
655 XFREE(MTYPE_OSPF_NEIGHBOR_STATIC
, nbr_nbma
);
658 route_table_finish(ospf
->nbr_nbma
);
660 /* Clear networks and Areas. */
661 for (rn
= route_top(ospf
->networks
); rn
; rn
= route_next(rn
)) {
662 struct ospf_network
*network
;
664 if ((network
= rn
->info
) != NULL
) {
665 ospf_network_free(ospf
, network
);
667 route_unlock_node(rn
);
670 route_table_finish(ospf
->networks
);
672 for (ALL_LIST_ELEMENTS(ospf
->areas
, node
, nnode
, area
)) {
673 listnode_delete(ospf
->areas
, area
);
674 ospf_area_free(area
);
677 /* Cancel all timers. */
678 OSPF_TIMER_OFF(ospf
->t_read
);
679 OSPF_TIMER_OFF(ospf
->t_write
);
680 OSPF_TIMER_OFF(ospf
->t_spf_calc
);
681 OSPF_TIMER_OFF(ospf
->t_ase_calc
);
682 OSPF_TIMER_OFF(ospf
->t_maxage
);
683 OSPF_TIMER_OFF(ospf
->t_maxage_walker
);
684 OSPF_TIMER_OFF(ospf
->t_abr_task
);
685 OSPF_TIMER_OFF(ospf
->t_asbr_check
);
686 OSPF_TIMER_OFF(ospf
->t_distribute_update
);
687 OSPF_TIMER_OFF(ospf
->t_lsa_refresher
);
688 OSPF_TIMER_OFF(ospf
->t_opaque_lsa_self
);
689 OSPF_TIMER_OFF(ospf
->t_sr_update
);
691 LSDB_LOOP (OPAQUE_AS_LSDB(ospf
), rn
, lsa
)
692 ospf_discard_from_db(ospf
, ospf
->lsdb
, lsa
);
693 LSDB_LOOP (EXTERNAL_LSDB(ospf
), rn
, lsa
)
694 ospf_discard_from_db(ospf
, ospf
->lsdb
, lsa
);
696 ospf_lsdb_delete_all(ospf
->lsdb
);
697 ospf_lsdb_free(ospf
->lsdb
);
699 for (rn
= route_top(ospf
->maxage_lsa
); rn
; rn
= route_next(rn
)) {
700 if ((lsa
= rn
->info
) != NULL
) {
701 ospf_lsa_unlock(&lsa
);
704 route_unlock_node(rn
);
706 route_table_finish(ospf
->maxage_lsa
);
709 ospf_route_table_free(ospf
->old_table
);
710 if (ospf
->new_table
) {
711 ospf_route_delete(ospf
, ospf
->new_table
);
712 ospf_route_table_free(ospf
->new_table
);
715 ospf_rtrs_free(ospf
->old_rtrs
);
717 ospf_rtrs_free(ospf
->new_rtrs
);
718 if (ospf
->new_external_route
) {
719 ospf_route_delete(ospf
, ospf
->new_external_route
);
720 ospf_route_table_free(ospf
->new_external_route
);
722 if (ospf
->old_external_route
) {
723 ospf_route_delete(ospf
, ospf
->old_external_route
);
724 ospf_route_table_free(ospf
->old_external_route
);
726 if (ospf
->external_lsas
) {
727 ospf_ase_external_lsas_finish(ospf
->external_lsas
);
730 for (i
= ZEBRA_ROUTE_SYSTEM
; i
<= ZEBRA_ROUTE_MAX
; i
++) {
731 struct list
*ext_list
;
732 struct ospf_external
*ext
;
734 ext_list
= ospf
->external
[i
];
738 for (ALL_LIST_ELEMENTS(ext_list
, node
, nnode
, ext
)) {
739 if (ext
->external_info
)
740 for (rn
= route_top(ext
->external_info
); rn
;
741 rn
= route_next(rn
)) {
742 if (rn
->info
== NULL
)
745 XFREE(MTYPE_OSPF_EXTERNAL_INFO
,
748 route_unlock_node(rn
);
751 ospf_external_del(ospf
, i
, ext
->instance
);
755 ospf_distance_reset(ospf
);
756 route_table_finish(ospf
->distance_table
);
758 if (!CHECK_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
))
759 instance
= ospf
->instance
;
761 list_delete(&ospf
->areas
);
762 list_delete(&ospf
->oi_write_q
);
765 stream_free(ospf
->ibuf
);
770 vrf
= vrf_lookup_by_name(ospf
->name
);
772 ospf_vrf_unlink(ospf
, vrf
);
773 XFREE(MTYPE_OSPF_TOP
, ospf
->name
);
775 vrf
= vrf_lookup_by_id(VRF_DEFAULT
);
777 ospf_vrf_unlink(ospf
, vrf
);
780 XFREE(MTYPE_OSPF_TOP
, ospf
);
782 if (!CHECK_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
))
783 ospf_get_instance(instance
);
787 /* allocate new OSPF Area object */
788 static struct ospf_area
*ospf_area_new(struct ospf
*ospf
,
789 struct in_addr area_id
)
791 struct ospf_area
*new;
793 /* Allocate new config_network. */
794 new = XCALLOC(MTYPE_OSPF_AREA
, sizeof(struct ospf_area
));
798 new->area_id
= area_id
;
799 new->area_id_fmt
= OSPF_AREA_ID_FMT_DOTTEDQUAD
;
801 new->external_routing
= OSPF_AREA_DEFAULT
;
802 new->default_cost
= 1;
803 new->auth_type
= OSPF_AUTH_NULL
;
806 new->lsdb
= ospf_lsdb_new();
808 /* Self-originated LSAs initialize. */
809 new->router_lsa_self
= NULL
;
811 ospf_opaque_type10_lsa_init(new);
813 new->oiflist
= list_new();
814 new->ranges
= route_table_init();
816 if (area_id
.s_addr
== OSPF_AREA_BACKBONE
)
817 ospf
->backbone
= new;
822 static void ospf_area_free(struct ospf_area
*area
)
824 struct route_node
*rn
;
825 struct ospf_lsa
*lsa
;
827 ospf_opaque_type10_lsa_term(area
);
830 LSDB_LOOP (ROUTER_LSDB(area
), rn
, lsa
)
831 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
832 LSDB_LOOP (NETWORK_LSDB(area
), rn
, lsa
)
833 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
834 LSDB_LOOP (SUMMARY_LSDB(area
), rn
, lsa
)
835 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
836 LSDB_LOOP (ASBR_SUMMARY_LSDB(area
), rn
, lsa
)
837 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
839 LSDB_LOOP (NSSA_LSDB(area
), rn
, lsa
)
840 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
841 LSDB_LOOP (OPAQUE_AREA_LSDB(area
), rn
, lsa
)
842 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
843 LSDB_LOOP (OPAQUE_LINK_LSDB(area
), rn
, lsa
)
844 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
846 ospf_lsdb_delete_all(area
->lsdb
);
847 ospf_lsdb_free(area
->lsdb
);
849 ospf_lsa_unlock(&area
->router_lsa_self
);
851 route_table_finish(area
->ranges
);
852 list_delete(&area
->oiflist
);
854 if (EXPORT_NAME(area
))
855 free(EXPORT_NAME(area
));
857 if (IMPORT_NAME(area
))
858 free(IMPORT_NAME(area
));
861 OSPF_TIMER_OFF(area
->t_stub_router
);
862 OSPF_TIMER_OFF(area
->t_opaque_lsa_self
);
864 if (OSPF_IS_AREA_BACKBONE(area
))
865 area
->ospf
->backbone
= NULL
;
867 XFREE(MTYPE_OSPF_AREA
, area
);
870 void ospf_area_check_free(struct ospf
*ospf
, struct in_addr area_id
)
872 struct ospf_area
*area
;
874 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
875 if (area
&& listcount(area
->oiflist
) == 0 && area
->ranges
->top
== NULL
876 && !ospf_vl_count(ospf
, area
)
877 && area
->shortcut_configured
== OSPF_SHORTCUT_DEFAULT
878 && area
->external_routing
== OSPF_AREA_DEFAULT
879 && area
->no_summary
== 0 && area
->default_cost
== 1
880 && EXPORT_NAME(area
) == NULL
&& IMPORT_NAME(area
) == NULL
881 && area
->auth_type
== OSPF_AUTH_NULL
) {
882 listnode_delete(ospf
->areas
, area
);
883 ospf_area_free(area
);
887 struct ospf_area
*ospf_area_get(struct ospf
*ospf
, struct in_addr area_id
)
889 struct ospf_area
*area
;
891 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
893 area
= ospf_area_new(ospf
, area_id
);
894 listnode_add_sort(ospf
->areas
, area
);
895 ospf_check_abr_status(ospf
);
896 if (ospf
->stub_router_admin_set
897 == OSPF_STUB_ROUTER_ADMINISTRATIVE_SET
) {
898 SET_FLAG(area
->stub_router_state
,
899 OSPF_AREA_ADMIN_STUB_ROUTED
);
906 struct ospf_area
*ospf_area_lookup_by_area_id(struct ospf
*ospf
,
907 struct in_addr area_id
)
909 struct ospf_area
*area
;
910 struct listnode
*node
;
912 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
))
913 if (IPV4_ADDR_SAME(&area
->area_id
, &area_id
))
919 void ospf_area_add_if(struct ospf_area
*area
, struct ospf_interface
*oi
)
921 listnode_add(area
->oiflist
, oi
);
924 void ospf_area_del_if(struct ospf_area
*area
, struct ospf_interface
*oi
)
926 listnode_delete(area
->oiflist
, oi
);
930 static void add_ospf_interface(struct connected
*co
, struct ospf_area
*area
)
932 struct ospf_interface
*oi
;
934 oi
= ospf_if_new(area
->ospf
, co
->ifp
, co
->address
);
939 oi
->params
= ospf_lookup_if_params(co
->ifp
, oi
->address
->u
.prefix4
);
940 oi
->output_cost
= ospf_if_get_output_cost(oi
);
942 /* Relate ospf interface to ospf instance. */
943 oi
->ospf
= area
->ospf
;
945 /* update network type as interface flag */
946 /* If network type is specified previously,
947 skip network type setting. */
948 oi
->type
= IF_DEF_PARAMS(co
->ifp
)->type
;
950 /* Add pseudo neighbor. */
951 ospf_nbr_self_reset(oi
, oi
->ospf
->router_id
);
953 ospf_area_add_if(oi
->area
, oi
);
956 * if router_id is not configured, dont bring up
958 * ospf_router_id_update() will call ospf_if_update
959 * whenever r-id is configured instead.
961 if ((area
->ospf
->router_id
.s_addr
!= 0) && if_is_operative(co
->ifp
))
965 static void update_redistributed(struct ospf
*ospf
, int add_to_ospf
)
967 struct route_node
*rn
;
968 struct external_info
*ei
;
969 struct ospf_external
*ext
;
971 if (ospf_is_type_redistributed(ospf
, ZEBRA_ROUTE_CONNECT
, 0)) {
972 ext
= ospf_external_lookup(ospf
, ZEBRA_ROUTE_CONNECT
, 0);
973 if ((ext
) && EXTERNAL_INFO(ext
)) {
974 for (rn
= route_top(EXTERNAL_INFO(ext
)); rn
;
975 rn
= route_next(rn
)) {
981 if (ospf_external_info_find_lsa(ospf
,
983 if (!ospf_distribute_check_connected(
985 ospf_external_lsa_flush(
988 ei
->ifindex
/*, ei->nexthop */);
990 if (!ospf_external_info_find_lsa(
992 if (ospf_distribute_check_connected(
994 ospf_external_lsa_originate(
1002 /* Config network statement related functions. */
1003 static struct ospf_network
*ospf_network_new(struct in_addr area_id
)
1005 struct ospf_network
*new;
1006 new = XCALLOC(MTYPE_OSPF_NETWORK
, sizeof(struct ospf_network
));
1008 new->area_id
= area_id
;
1009 new->area_id_fmt
= OSPF_AREA_ID_FMT_DOTTEDQUAD
;
1014 static void ospf_network_free(struct ospf
*ospf
, struct ospf_network
*network
)
1016 ospf_area_check_free(ospf
, network
->area_id
);
1017 ospf_schedule_abr_task(ospf
);
1018 XFREE(MTYPE_OSPF_NETWORK
, network
);
1021 int ospf_network_set(struct ospf
*ospf
, struct prefix_ipv4
*p
,
1022 struct in_addr area_id
, int df
)
1024 struct ospf_network
*network
;
1025 struct ospf_area
*area
;
1026 struct route_node
*rn
;
1028 rn
= route_node_get(ospf
->networks
, (struct prefix
*)p
);
1031 route_unlock_node(rn
);
1033 if (IPV4_ADDR_SAME(&area_id
, &network
->area_id
)) {
1036 /* There is already same network statement. */
1041 rn
->info
= network
= ospf_network_new(area_id
);
1042 network
->area_id_fmt
= df
;
1043 area
= ospf_area_get(ospf
, area_id
);
1044 ospf_area_display_format_set(ospf
, area
, df
);
1046 /* Run network config now. */
1047 ospf_network_run((struct prefix
*)p
, area
);
1049 /* Update connected redistribute. */
1050 update_redistributed(ospf
, 1); /* interfaces possibly added */
1052 ospf_area_check_free(ospf
, area_id
);
1057 int ospf_network_unset(struct ospf
*ospf
, struct prefix_ipv4
*p
,
1058 struct in_addr area_id
)
1060 struct route_node
*rn
;
1061 struct ospf_network
*network
;
1062 struct listnode
*node
, *nnode
;
1063 struct ospf_interface
*oi
;
1065 rn
= route_node_lookup(ospf
->networks
, (struct prefix
*)p
);
1070 route_unlock_node(rn
);
1071 if (!IPV4_ADDR_SAME(&area_id
, &network
->area_id
))
1074 ospf_network_free(ospf
, rn
->info
);
1076 route_unlock_node(rn
); /* initial reference */
1078 /* Find interfaces that are not configured already. */
1079 for (ALL_LIST_ELEMENTS(ospf
->oiflist
, node
, nnode
, oi
)) {
1081 if (oi
->type
== OSPF_IFTYPE_VIRTUALLINK
)
1084 ospf_network_run_subnet(ospf
, oi
->connected
, NULL
, NULL
);
1087 /* Update connected redistribute. */
1088 update_redistributed(ospf
, 0); /* interfaces possibly removed */
1089 ospf_area_check_free(ospf
, area_id
);
1094 /* Ensure there's an OSPF instance, as "ip ospf area" enabled OSPF means
1095 * there might not be any 'router ospf' config.
1097 * Otherwise, doesn't do anything different to ospf_if_update for now
1099 void ospf_interface_area_set(struct ospf
*ospf
, struct interface
*ifp
)
1104 ospf_if_update(ospf
, ifp
);
1105 /* if_update does a update_redistributed */
1110 void ospf_interface_area_unset(struct ospf
*ospf
, struct interface
*ifp
)
1112 struct route_node
*rn_oi
;
1115 return; /* Ospf not ready yet */
1117 /* Find interfaces that may need to be removed. */
1118 for (rn_oi
= route_top(IF_OIFS(ifp
)); rn_oi
;
1119 rn_oi
= route_next(rn_oi
)) {
1120 struct ospf_interface
*oi
= NULL
;
1122 if ((oi
= rn_oi
->info
) == NULL
)
1125 if (oi
->type
== OSPF_IFTYPE_VIRTUALLINK
)
1128 ospf_network_run_subnet(ospf
, oi
->connected
, NULL
, NULL
);
1131 /* Update connected redistribute. */
1132 update_redistributed(ospf
, 0); /* interfaces possibly removed */
1135 bool ospf_interface_area_is_already_set(struct ospf
*ospf
,
1136 struct interface
*ifp
)
1138 struct route_node
*rn_oi
;
1141 return false; /* 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
= rn_oi
->info
;
1151 if (oi
->type
== OSPF_IFTYPE_VIRTUALLINK
)
1153 /* at least one route covered by interface
1154 * that implies already done
1161 /* Check whether interface matches given network
1162 * returns: 1, true. 0, false
1164 static int ospf_network_match_iface(const struct connected
*co
,
1165 const struct prefix
*net
)
1167 /* new approach: more elegant and conceptually clean */
1168 return prefix_match_network_statement(net
, CONNECTED_PREFIX(co
));
1171 static void ospf_update_interface_area(struct connected
*co
,
1172 struct ospf_area
*area
)
1174 struct ospf_interface
*oi
= ospf_if_table_lookup(co
->ifp
, co
->address
);
1176 /* nothing to be done case */
1177 if (oi
&& oi
->area
== area
) {
1184 add_ospf_interface(co
, area
);
1187 /* Run OSPF for the given subnet, taking into account the following
1188 * possible sources of area configuration, in the given order of preference:
1190 * - Whether there is interface+address specific area configuration
1191 * - Whether there is a default area for the interface
1192 * - Whether there is an area given as a parameter.
1193 * - If no specific network prefix/area is supplied, whether there's
1194 * a matching network configured.
1196 static void ospf_network_run_subnet(struct ospf
*ospf
, struct connected
*co
,
1198 struct ospf_area
*given_area
)
1200 struct ospf_interface
*oi
;
1201 struct ospf_if_params
*params
;
1202 struct ospf_area
*area
= NULL
;
1203 struct route_node
*rn
;
1206 if (CHECK_FLAG(co
->flags
, ZEBRA_IFA_SECONDARY
))
1209 if (co
->address
->family
!= AF_INET
)
1212 /* Try determine the appropriate area for this interface + address
1213 * Start by checking interface config
1215 params
= ospf_lookup_if_params(co
->ifp
, co
->address
->u
.prefix4
);
1216 if (params
&& OSPF_IF_PARAM_CONFIGURED(params
, if_area
))
1217 area
= ospf_area_get(ospf
, params
->if_area
);
1219 params
= IF_DEF_PARAMS(co
->ifp
);
1220 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
))
1221 area
= ospf_area_get(ospf
, params
->if_area
);
1224 /* If we've found an interface and/or addr specific area, then we're
1228 ospf_update_interface_area(co
, area
);
1232 /* Otherwise, only remaining possibility is a matching network statement
1235 assert(given_area
!= NULL
);
1237 /* Which either was supplied as a parameter.. (e.g. cause a new
1238 * network/area was just added)..
1240 if (p
->family
== co
->address
->family
1241 && ospf_network_match_iface(co
, p
))
1242 ospf_update_interface_area(co
, given_area
);
1247 /* Else we have to search the existing network/area config to see
1250 for (rn
= route_top(ospf
->networks
); rn
; rn
= route_next(rn
))
1251 if (rn
->info
!= NULL
&& ospf_network_match_iface(co
, &rn
->p
)) {
1252 struct ospf_network
*network
=
1253 (struct ospf_network
*)rn
->info
;
1254 area
= ospf_area_get(ospf
, network
->area_id
);
1255 ospf_update_interface_area(co
, area
);
1259 /* If the subnet isn't in any area, deconfigure */
1260 if (!configed
&& (oi
= ospf_if_table_lookup(co
->ifp
, co
->address
)))
1264 static void ospf_network_run_interface(struct ospf
*ospf
, struct interface
*ifp
,
1266 struct ospf_area
*given_area
)
1268 struct listnode
*cnode
;
1269 struct connected
*co
;
1271 if (memcmp(ifp
->name
, "VLINK", 5) == 0)
1274 /* Network prefix without area is nonsensical */
1276 assert(given_area
!= NULL
);
1278 /* if interface prefix is match specified prefix,
1279 then create socket and join multicast group. */
1280 for (ALL_LIST_ELEMENTS_RO(ifp
->connected
, cnode
, co
))
1281 ospf_network_run_subnet(ospf
, co
, p
, given_area
);
1284 static void ospf_network_run(struct prefix
*p
, struct ospf_area
*area
)
1286 struct vrf
*vrf
= vrf_lookup_by_id(area
->ospf
->vrf_id
);
1287 struct interface
*ifp
;
1289 /* Schedule Router ID Update. */
1290 if (area
->ospf
->router_id
.s_addr
== 0)
1291 ospf_router_id_update(area
->ospf
);
1293 /* Get target interface. */
1294 FOR_ALL_INTERFACES (vrf
, ifp
)
1295 ospf_network_run_interface(area
->ospf
, ifp
, p
, area
);
1298 void ospf_ls_upd_queue_empty(struct ospf_interface
*oi
)
1300 struct route_node
*rn
;
1301 struct listnode
*node
, *nnode
;
1303 struct ospf_lsa
*lsa
;
1305 /* empty ls update queue */
1306 for (rn
= route_top(oi
->ls_upd_queue
); rn
; rn
= route_next(rn
))
1307 if ((lst
= (struct list
*)rn
->info
)) {
1308 for (ALL_LIST_ELEMENTS(lst
, node
, nnode
, lsa
))
1309 ospf_lsa_unlock(&lsa
); /* oi->ls_upd_queue */
1314 /* remove update event */
1315 if (oi
->t_ls_upd_event
) {
1316 thread_cancel(oi
->t_ls_upd_event
);
1317 oi
->t_ls_upd_event
= NULL
;
1321 void ospf_if_update(struct ospf
*ospf
, struct interface
*ifp
)
1327 if (IS_DEBUG_OSPF_EVENT
)
1329 "%s: interface %s ifp->vrf_id %u ospf vrf %s vrf_id %u router_id %s",
1330 __PRETTY_FUNCTION__
, ifp
->name
, ifp
->vrf_id
,
1331 ospf_vrf_id_to_name(ospf
->vrf_id
), ospf
->vrf_id
,
1332 inet_ntoa(ospf
->router_id
));
1334 /* OSPF must be ready. */
1335 if (!ospf_is_ready(ospf
))
1338 ospf_network_run_interface(ospf
, ifp
, NULL
, NULL
);
1340 /* Update connected redistribute. */
1341 update_redistributed(ospf
, 1);
1345 void ospf_remove_vls_through_area(struct ospf
*ospf
, struct ospf_area
*area
)
1347 struct listnode
*node
, *nnode
;
1348 struct ospf_vl_data
*vl_data
;
1350 for (ALL_LIST_ELEMENTS(ospf
->vlinks
, node
, nnode
, vl_data
))
1351 if (IPV4_ADDR_SAME(&vl_data
->vl_area_id
, &area
->area_id
))
1352 ospf_vl_delete(ospf
, vl_data
);
1356 static const struct message ospf_area_type_msg
[] = {
1357 {OSPF_AREA_DEFAULT
, "Default"},
1358 {OSPF_AREA_STUB
, "Stub"},
1359 {OSPF_AREA_NSSA
, "NSSA"},
1362 static void ospf_area_type_set(struct ospf_area
*area
, int type
)
1364 struct listnode
*node
;
1365 struct ospf_interface
*oi
;
1367 if (area
->external_routing
== type
) {
1368 if (IS_DEBUG_OSPF_EVENT
)
1369 zlog_debug("Area[%s]: Types are the same, ignored.",
1370 inet_ntoa(area
->area_id
));
1374 area
->external_routing
= type
;
1376 if (IS_DEBUG_OSPF_EVENT
)
1377 zlog_debug("Area[%s]: Configured as %s",
1378 inet_ntoa(area
->area_id
),
1379 lookup_msg(ospf_area_type_msg
, type
, NULL
));
1381 switch (area
->external_routing
) {
1382 case OSPF_AREA_DEFAULT
:
1383 for (ALL_LIST_ELEMENTS_RO(area
->oiflist
, node
, oi
))
1384 if (oi
->nbr_self
!= NULL
) {
1385 UNSET_FLAG(oi
->nbr_self
->options
,
1387 SET_FLAG(oi
->nbr_self
->options
, OSPF_OPTION_E
);
1390 case OSPF_AREA_STUB
:
1391 for (ALL_LIST_ELEMENTS_RO(area
->oiflist
, node
, oi
))
1392 if (oi
->nbr_self
!= NULL
) {
1393 if (IS_DEBUG_OSPF_EVENT
)
1395 "setting options on %s accordingly",
1397 UNSET_FLAG(oi
->nbr_self
->options
,
1399 UNSET_FLAG(oi
->nbr_self
->options
,
1401 if (IS_DEBUG_OSPF_EVENT
)
1402 zlog_debug("options set on %s: %x",
1403 IF_NAME(oi
), OPTIONS(oi
));
1406 case OSPF_AREA_NSSA
:
1407 for (ALL_LIST_ELEMENTS_RO(area
->oiflist
, node
, oi
))
1408 if (oi
->nbr_self
!= NULL
) {
1410 "setting nssa options on %s accordingly",
1412 UNSET_FLAG(oi
->nbr_self
->options
,
1414 SET_FLAG(oi
->nbr_self
->options
, OSPF_OPTION_NP
);
1415 zlog_debug("options set on %s: %x", IF_NAME(oi
),
1423 ospf_router_lsa_update_area(area
);
1424 ospf_schedule_abr_task(area
->ospf
);
1427 int ospf_area_shortcut_set(struct ospf
*ospf
, struct ospf_area
*area
, int mode
)
1429 if (area
->shortcut_configured
== mode
)
1432 area
->shortcut_configured
= mode
;
1433 ospf_router_lsa_update_area(area
);
1434 ospf_schedule_abr_task(ospf
);
1436 ospf_area_check_free(ospf
, area
->area_id
);
1441 int ospf_area_shortcut_unset(struct ospf
*ospf
, struct ospf_area
*area
)
1443 area
->shortcut_configured
= OSPF_SHORTCUT_DEFAULT
;
1444 ospf_router_lsa_update_area(area
);
1445 ospf_area_check_free(ospf
, area
->area_id
);
1446 ospf_schedule_abr_task(ospf
);
1451 static int ospf_area_vlink_count(struct ospf
*ospf
, struct ospf_area
*area
)
1453 struct ospf_vl_data
*vl
;
1454 struct listnode
*node
;
1457 for (ALL_LIST_ELEMENTS_RO(ospf
->vlinks
, node
, vl
))
1458 if (IPV4_ADDR_SAME(&vl
->vl_area_id
, &area
->area_id
))
1464 int ospf_area_display_format_set(struct ospf
*ospf
, struct ospf_area
*area
,
1467 area
->area_id_fmt
= df
;
1472 int ospf_area_stub_set(struct ospf
*ospf
, struct in_addr area_id
)
1474 struct ospf_area
*area
;
1476 area
= ospf_area_get(ospf
, area_id
);
1477 if (ospf_area_vlink_count(ospf
, area
))
1480 if (area
->external_routing
!= OSPF_AREA_STUB
)
1481 ospf_area_type_set(area
, OSPF_AREA_STUB
);
1486 int ospf_area_stub_unset(struct ospf
*ospf
, struct in_addr area_id
)
1488 struct ospf_area
*area
;
1490 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1494 if (area
->external_routing
== OSPF_AREA_STUB
)
1495 ospf_area_type_set(area
, OSPF_AREA_DEFAULT
);
1497 ospf_area_check_free(ospf
, area_id
);
1502 int ospf_area_no_summary_set(struct ospf
*ospf
, struct in_addr area_id
)
1504 struct ospf_area
*area
;
1506 area
= ospf_area_get(ospf
, area_id
);
1507 area
->no_summary
= 1;
1512 int ospf_area_no_summary_unset(struct ospf
*ospf
, struct in_addr area_id
)
1514 struct ospf_area
*area
;
1516 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1520 area
->no_summary
= 0;
1521 ospf_area_check_free(ospf
, area_id
);
1526 int ospf_area_nssa_no_summary_set(struct ospf
*ospf
, struct in_addr area_id
)
1528 struct ospf_area
*area
;
1530 area
= ospf_area_get(ospf
, area_id
);
1531 if (ospf_area_vlink_count(ospf
, area
))
1534 if (area
->external_routing
!= OSPF_AREA_NSSA
) {
1535 ospf_area_type_set(area
, OSPF_AREA_NSSA
);
1537 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1540 ospf_area_no_summary_set(ospf
, area_id
);
1545 int ospf_area_nssa_set(struct ospf
*ospf
, struct in_addr area_id
)
1547 struct ospf_area
*area
;
1549 area
= ospf_area_get(ospf
, area_id
);
1550 if (ospf_area_vlink_count(ospf
, area
))
1553 if (area
->external_routing
!= OSPF_AREA_NSSA
) {
1554 ospf_area_type_set(area
, OSPF_AREA_NSSA
);
1557 /* set NSSA area defaults */
1558 area
->no_summary
= 0;
1559 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1560 area
->NSSATranslatorState
= OSPF_NSSA_TRANSLATE_DISABLED
;
1561 area
->NSSATranslatorStabilityInterval
=
1562 OSPF_NSSA_TRANS_STABLE_DEFAULT
;
1567 int ospf_area_nssa_unset(struct ospf
*ospf
, struct in_addr area_id
, int argc
)
1569 struct ospf_area
*area
;
1571 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1575 /* argc < 5 -> 'no area x nssa' */
1576 if (argc
< 5 && area
->external_routing
== OSPF_AREA_NSSA
) {
1578 /* set NSSA area defaults */
1579 area
->no_summary
= 0;
1580 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1581 area
->NSSATranslatorState
= OSPF_NSSA_TRANSLATE_DISABLED
;
1582 area
->NSSATranslatorStabilityInterval
=
1583 OSPF_NSSA_TRANS_STABLE_DEFAULT
;
1584 ospf_area_type_set(area
, OSPF_AREA_DEFAULT
);
1586 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1589 ospf_area_check_free(ospf
, area_id
);
1594 int ospf_area_nssa_translator_role_set(struct ospf
*ospf
,
1595 struct in_addr area_id
, int role
)
1597 struct ospf_area
*area
;
1599 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1603 area
->NSSATranslatorRole
= role
;
1609 /* XXX: unused? Leave for symmetry? */
1611 ospf_area_nssa_translator_role_unset (struct ospf
*ospf
,
1612 struct in_addr area_id
)
1614 struct ospf_area
*area
;
1616 area
= ospf_area_lookup_by_area_id (ospf
, area_id
);
1620 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1622 ospf_area_check_free (ospf
, area_id
);
1628 int ospf_area_export_list_set(struct ospf
*ospf
, struct ospf_area
*area
,
1629 const char *list_name
)
1631 struct access_list
*list
;
1632 list
= access_list_lookup(AFI_IP
, list_name
);
1634 EXPORT_LIST(area
) = list
;
1636 if (EXPORT_NAME(area
))
1637 free(EXPORT_NAME(area
));
1639 EXPORT_NAME(area
) = strdup(list_name
);
1640 ospf_schedule_abr_task(ospf
);
1645 int ospf_area_export_list_unset(struct ospf
*ospf
, struct ospf_area
*area
)
1648 EXPORT_LIST(area
) = 0;
1650 if (EXPORT_NAME(area
))
1651 free(EXPORT_NAME(area
));
1653 EXPORT_NAME(area
) = NULL
;
1655 ospf_area_check_free(ospf
, area
->area_id
);
1657 ospf_schedule_abr_task(ospf
);
1662 int ospf_area_import_list_set(struct ospf
*ospf
, struct ospf_area
*area
,
1665 struct access_list
*list
;
1666 list
= access_list_lookup(AFI_IP
, name
);
1668 IMPORT_LIST(area
) = list
;
1670 if (IMPORT_NAME(area
))
1671 free(IMPORT_NAME(area
));
1673 IMPORT_NAME(area
) = strdup(name
);
1674 ospf_schedule_abr_task(ospf
);
1679 int ospf_area_import_list_unset(struct ospf
*ospf
, struct ospf_area
*area
)
1681 IMPORT_LIST(area
) = 0;
1683 if (IMPORT_NAME(area
))
1684 free(IMPORT_NAME(area
));
1686 IMPORT_NAME(area
) = NULL
;
1687 ospf_area_check_free(ospf
, area
->area_id
);
1689 ospf_schedule_abr_task(ospf
);
1694 int ospf_timers_refresh_set(struct ospf
*ospf
, int interval
)
1698 if (ospf
->lsa_refresh_interval
== interval
)
1701 time_left
= ospf
->lsa_refresh_interval
1702 - (monotime(NULL
) - ospf
->lsa_refresher_started
);
1704 if (time_left
> interval
) {
1705 OSPF_TIMER_OFF(ospf
->t_lsa_refresher
);
1706 thread_add_timer(master
, ospf_lsa_refresh_walker
, ospf
,
1707 interval
, &ospf
->t_lsa_refresher
);
1709 ospf
->lsa_refresh_interval
= interval
;
1714 int ospf_timers_refresh_unset(struct ospf
*ospf
)
1718 time_left
= ospf
->lsa_refresh_interval
1719 - (monotime(NULL
) - ospf
->lsa_refresher_started
);
1721 if (time_left
> OSPF_LSA_REFRESH_INTERVAL_DEFAULT
) {
1722 OSPF_TIMER_OFF(ospf
->t_lsa_refresher
);
1723 ospf
->t_lsa_refresher
= NULL
;
1724 thread_add_timer(master
, ospf_lsa_refresh_walker
, ospf
,
1725 OSPF_LSA_REFRESH_INTERVAL_DEFAULT
,
1726 &ospf
->t_lsa_refresher
);
1729 ospf
->lsa_refresh_interval
= OSPF_LSA_REFRESH_INTERVAL_DEFAULT
;
1735 static struct ospf_nbr_nbma
*ospf_nbr_nbma_new(void)
1737 struct ospf_nbr_nbma
*nbr_nbma
;
1739 nbr_nbma
= XCALLOC(MTYPE_OSPF_NEIGHBOR_STATIC
,
1740 sizeof(struct ospf_nbr_nbma
));
1742 nbr_nbma
->priority
= OSPF_NEIGHBOR_PRIORITY_DEFAULT
;
1743 nbr_nbma
->v_poll
= OSPF_POLL_INTERVAL_DEFAULT
;
1748 static void ospf_nbr_nbma_free(struct ospf_nbr_nbma
*nbr_nbma
)
1750 XFREE(MTYPE_OSPF_NEIGHBOR_STATIC
, nbr_nbma
);
1753 static void ospf_nbr_nbma_delete(struct ospf
*ospf
,
1754 struct ospf_nbr_nbma
*nbr_nbma
)
1756 struct route_node
*rn
;
1757 struct prefix_ipv4 p
;
1760 p
.prefix
= nbr_nbma
->addr
;
1761 p
.prefixlen
= IPV4_MAX_BITLEN
;
1763 rn
= route_node_lookup(ospf
->nbr_nbma
, (struct prefix
*)&p
);
1765 ospf_nbr_nbma_free(rn
->info
);
1767 route_unlock_node(rn
);
1768 route_unlock_node(rn
);
1772 static void ospf_nbr_nbma_down(struct ospf_nbr_nbma
*nbr_nbma
)
1774 OSPF_TIMER_OFF(nbr_nbma
->t_poll
);
1776 if (nbr_nbma
->nbr
) {
1777 nbr_nbma
->nbr
->nbr_nbma
= NULL
;
1778 OSPF_NSM_EVENT_EXECUTE(nbr_nbma
->nbr
, NSM_KillNbr
);
1782 listnode_delete(nbr_nbma
->oi
->nbr_nbma
, nbr_nbma
);
1785 static void ospf_nbr_nbma_add(struct ospf_nbr_nbma
*nbr_nbma
,
1786 struct ospf_interface
*oi
)
1788 struct ospf_neighbor
*nbr
;
1789 struct route_node
*rn
;
1792 if (oi
->type
!= OSPF_IFTYPE_NBMA
)
1795 if (nbr_nbma
->nbr
!= NULL
)
1798 if (IPV4_ADDR_SAME(&oi
->nbr_self
->address
.u
.prefix4
, &nbr_nbma
->addr
))
1802 listnode_add(oi
->nbr_nbma
, nbr_nbma
);
1804 /* Get neighbor information from table. */
1806 p
.prefixlen
= IPV4_MAX_BITLEN
;
1807 p
.u
.prefix4
= nbr_nbma
->addr
;
1809 rn
= route_node_get(oi
->nbrs
, (struct prefix
*)&p
);
1812 nbr
->nbr_nbma
= nbr_nbma
;
1813 nbr_nbma
->nbr
= nbr
;
1815 route_unlock_node(rn
);
1817 nbr
= rn
->info
= ospf_nbr_new(oi
);
1818 nbr
->state
= NSM_Down
;
1819 nbr
->src
= nbr_nbma
->addr
;
1820 nbr
->nbr_nbma
= nbr_nbma
;
1821 nbr
->priority
= nbr_nbma
->priority
;
1824 nbr_nbma
->nbr
= nbr
;
1826 OSPF_NSM_EVENT_EXECUTE(nbr
, NSM_Start
);
1830 void ospf_nbr_nbma_if_update(struct ospf
*ospf
, struct ospf_interface
*oi
)
1832 struct ospf_nbr_nbma
*nbr_nbma
;
1833 struct route_node
*rn
;
1834 struct prefix_ipv4 p
;
1836 if (oi
->type
!= OSPF_IFTYPE_NBMA
)
1839 for (rn
= route_top(ospf
->nbr_nbma
); rn
; rn
= route_next(rn
))
1840 if ((nbr_nbma
= rn
->info
))
1841 if (nbr_nbma
->oi
== NULL
&& nbr_nbma
->nbr
== NULL
) {
1843 p
.prefix
= nbr_nbma
->addr
;
1844 p
.prefixlen
= IPV4_MAX_BITLEN
;
1846 if (prefix_match(oi
->address
,
1847 (struct prefix
*)&p
))
1848 ospf_nbr_nbma_add(nbr_nbma
, oi
);
1852 struct ospf_nbr_nbma
*ospf_nbr_nbma_lookup(struct ospf
*ospf
,
1853 struct in_addr nbr_addr
)
1855 struct route_node
*rn
;
1856 struct prefix_ipv4 p
;
1859 p
.prefix
= nbr_addr
;
1860 p
.prefixlen
= IPV4_MAX_BITLEN
;
1862 rn
= route_node_lookup(ospf
->nbr_nbma
, (struct prefix
*)&p
);
1864 route_unlock_node(rn
);
1870 struct ospf_nbr_nbma
*ospf_nbr_nbma_lookup_next(struct ospf
*ospf
,
1871 struct in_addr
*addr
, int first
)
1874 struct ospf_nbr_nbma
*nbr_nbma
;
1875 struct listnode
*node
;
1882 for (ALL_LIST_ELEMENTS_RO (ospf
->nbr_nbma
, node
, nbr_nbma
))
1886 *addr
= nbr_nbma
->addr
;
1889 else if (ntohl (nbr_nbma
->addr
.s_addr
) > ntohl (addr
->s_addr
))
1891 *addr
= nbr_nbma
->addr
;
1899 int ospf_nbr_nbma_set(struct ospf
*ospf
, struct in_addr nbr_addr
)
1901 struct ospf_nbr_nbma
*nbr_nbma
;
1902 struct ospf_interface
*oi
;
1903 struct prefix_ipv4 p
;
1904 struct route_node
*rn
;
1905 struct listnode
*node
;
1907 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
1911 nbr_nbma
= ospf_nbr_nbma_new();
1912 nbr_nbma
->addr
= nbr_addr
;
1915 p
.prefix
= nbr_addr
;
1916 p
.prefixlen
= IPV4_MAX_BITLEN
;
1918 rn
= route_node_get(ospf
->nbr_nbma
, (struct prefix
*)&p
);
1920 route_unlock_node(rn
);
1921 rn
->info
= nbr_nbma
;
1923 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
1924 if (oi
->type
== OSPF_IFTYPE_NBMA
)
1925 if (prefix_match(oi
->address
, (struct prefix
*)&p
)) {
1926 ospf_nbr_nbma_add(nbr_nbma
, oi
);
1934 int ospf_nbr_nbma_unset(struct ospf
*ospf
, struct in_addr nbr_addr
)
1936 struct ospf_nbr_nbma
*nbr_nbma
;
1938 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
1939 if (nbr_nbma
== NULL
)
1942 ospf_nbr_nbma_down(nbr_nbma
);
1943 ospf_nbr_nbma_delete(ospf
, nbr_nbma
);
1948 int ospf_nbr_nbma_priority_set(struct ospf
*ospf
, struct in_addr nbr_addr
,
1951 struct ospf_nbr_nbma
*nbr_nbma
;
1953 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
1954 if (nbr_nbma
== NULL
)
1957 if (nbr_nbma
->priority
!= priority
)
1958 nbr_nbma
->priority
= priority
;
1963 int ospf_nbr_nbma_priority_unset(struct ospf
*ospf
, struct in_addr nbr_addr
)
1965 struct ospf_nbr_nbma
*nbr_nbma
;
1967 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
1968 if (nbr_nbma
== NULL
)
1971 if (nbr_nbma
!= OSPF_NEIGHBOR_PRIORITY_DEFAULT
)
1972 nbr_nbma
->priority
= OSPF_NEIGHBOR_PRIORITY_DEFAULT
;
1977 int ospf_nbr_nbma_poll_interval_set(struct ospf
*ospf
, struct in_addr nbr_addr
,
1978 unsigned int interval
)
1980 struct ospf_nbr_nbma
*nbr_nbma
;
1982 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
1983 if (nbr_nbma
== NULL
)
1986 if (nbr_nbma
->v_poll
!= interval
) {
1987 nbr_nbma
->v_poll
= interval
;
1988 if (nbr_nbma
->oi
&& ospf_if_is_up(nbr_nbma
->oi
)) {
1989 OSPF_TIMER_OFF(nbr_nbma
->t_poll
);
1990 OSPF_POLL_TIMER_ON(nbr_nbma
->t_poll
, ospf_poll_timer
,
1998 int ospf_nbr_nbma_poll_interval_unset(struct ospf
*ospf
, struct in_addr addr
)
2000 struct ospf_nbr_nbma
*nbr_nbma
;
2002 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, addr
);
2003 if (nbr_nbma
== NULL
)
2006 if (nbr_nbma
->v_poll
!= OSPF_POLL_INTERVAL_DEFAULT
)
2007 nbr_nbma
->v_poll
= OSPF_POLL_INTERVAL_DEFAULT
;
2012 void ospf_master_init(struct thread_master
*master
)
2014 memset(&ospf_master
, 0, sizeof(struct ospf_master
));
2017 om
->ospf
= list_new();
2018 om
->master
= master
;
2021 /* Link OSPF instance to VRF. */
2022 void ospf_vrf_link(struct ospf
*ospf
, struct vrf
*vrf
)
2024 ospf
->vrf_id
= vrf
->vrf_id
;
2025 if (vrf
->info
!= (void *)ospf
)
2026 vrf
->info
= (void *)ospf
;
2029 /* Unlink OSPF instance from VRF. */
2030 void ospf_vrf_unlink(struct ospf
*ospf
, struct vrf
*vrf
)
2032 if (vrf
->info
== (void *)ospf
)
2034 ospf
->vrf_id
= VRF_UNKNOWN
;
2037 /* This is hook function for vrf create called as part of vrf_init */
2038 static int ospf_vrf_new(struct vrf
*vrf
)
2040 if (IS_DEBUG_OSPF_EVENT
)
2041 zlog_debug("%s: VRF Created: %s(%u)", __PRETTY_FUNCTION__
,
2042 vrf
->name
, vrf
->vrf_id
);
2047 /* This is hook function for vrf delete call as part of vrf_init */
2048 static int ospf_vrf_delete(struct vrf
*vrf
)
2050 if (IS_DEBUG_OSPF_EVENT
)
2051 zlog_debug("%s: VRF Deletion: %s(%u)", __PRETTY_FUNCTION__
,
2052 vrf
->name
, vrf
->vrf_id
);
2057 static void ospf_set_redist_vrf_bitmaps(struct ospf
*ospf
)
2060 struct list
*red_list
;
2062 for (type
= 0; type
< ZEBRA_ROUTE_MAX
; type
++) {
2063 red_list
= ospf
->redist
[type
];
2066 if (IS_DEBUG_OSPF_EVENT
)
2068 "%s: setting redist vrf %d bitmap for type %d",
2069 __func__
, ospf
->vrf_id
, type
);
2070 vrf_bitmap_set(zclient
->redist
[AFI_IP
][type
], ospf
->vrf_id
);
2074 /* Enable OSPF VRF instance */
2075 static int ospf_vrf_enable(struct vrf
*vrf
)
2077 struct ospf
*ospf
= NULL
;
2078 vrf_id_t old_vrf_id
;
2081 if (IS_DEBUG_OSPF_EVENT
)
2082 zlog_debug("%s: VRF %s id %u enabled", __PRETTY_FUNCTION__
,
2083 vrf
->name
, vrf
->vrf_id
);
2085 ospf
= ospf_lookup_by_name(vrf
->name
);
2087 if (ospf
->name
&& strmatch(vrf
->name
, VRF_DEFAULT_NAME
)) {
2088 XFREE(MTYPE_OSPF_TOP
, ospf
->name
);
2091 old_vrf_id
= ospf
->vrf_id
;
2092 /* We have instance configured, link to VRF and make it "up". */
2093 ospf_vrf_link(ospf
, vrf
);
2094 if (IS_DEBUG_OSPF_EVENT
)
2096 "%s: ospf linked to vrf %s vrf_id %u (old id %u)",
2097 __PRETTY_FUNCTION__
, vrf
->name
, ospf
->vrf_id
,
2100 if (old_vrf_id
!= ospf
->vrf_id
) {
2101 frr_with_privs(&ospfd_privs
) {
2102 /* stop zebra redist to us for old vrf */
2103 zclient_send_dereg_requests(zclient
,
2106 ospf_set_redist_vrf_bitmaps(ospf
);
2108 /* start zebra redist to us for new vrf */
2109 ospf_zebra_vrf_register(ospf
);
2111 ret
= ospf_sock_init(ospf
);
2113 if (ret
< 0 || ospf
->fd
<= 0)
2115 thread_add_read(master
, ospf_read
, ospf
, ospf
->fd
,
2117 ospf
->oi_running
= 1;
2118 ospf_router_id_update(ospf
);
2125 /* Disable OSPF VRF instance */
2126 static int ospf_vrf_disable(struct vrf
*vrf
)
2128 struct ospf
*ospf
= NULL
;
2129 vrf_id_t old_vrf_id
= VRF_UNKNOWN
;
2131 if (vrf
->vrf_id
== VRF_DEFAULT
)
2134 if (IS_DEBUG_OSPF_EVENT
)
2135 zlog_debug("%s: VRF %s id %d disabled.", __PRETTY_FUNCTION__
,
2136 vrf
->name
, vrf
->vrf_id
);
2138 ospf
= ospf_lookup_by_name(vrf
->name
);
2140 old_vrf_id
= ospf
->vrf_id
;
2142 /* We have instance configured, unlink
2143 * from VRF and make it "down".
2145 ospf_vrf_unlink(ospf
, vrf
);
2146 ospf
->oi_running
= 0;
2147 if (IS_DEBUG_OSPF_EVENT
)
2148 zlog_debug("%s: ospf old_vrf_id %d unlinked",
2149 __PRETTY_FUNCTION__
, old_vrf_id
);
2150 thread_cancel(ospf
->t_read
);
2155 /* Note: This is a callback, the VRF will be deleted by the caller. */
2159 void ospf_vrf_init(void)
2161 vrf_init(ospf_vrf_new
, ospf_vrf_enable
, ospf_vrf_disable
,
2162 ospf_vrf_delete
, ospf_vrf_enable
);
2165 void ospf_vrf_terminate(void)
2170 const char *ospf_vrf_id_to_name(vrf_id_t vrf_id
)
2172 struct vrf
*vrf
= vrf_lookup_by_id(vrf_id
);
2174 return vrf
? vrf
->name
: "NIL";