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
;
299 if ((ospf_sock_init(new)) < 0) {
300 if (new->vrf_id
!= VRF_UNKNOWN
)
303 "%s: ospf_sock_init is unable to open a socket",
307 thread_add_read(master
, ospf_read
, new, new->fd
, &new->t_read
);
312 struct ospf
*ospf_lookup_instance(unsigned short instance
)
315 struct listnode
*node
, *nnode
;
317 if (listcount(om
->ospf
) == 0)
320 for (ALL_LIST_ELEMENTS(om
->ospf
, node
, nnode
, ospf
))
321 if ((ospf
->instance
== 0 && instance
== 0)
322 || (ospf
->instance
&& instance
323 && ospf
->instance
== instance
))
329 static int ospf_is_ready(struct ospf
*ospf
)
331 /* OSPF must be on and Router-ID must be configured. */
332 if (!ospf
|| ospf
->router_id
.s_addr
== INADDR_ANY
)
338 static void ospf_add(struct ospf
*ospf
)
340 listnode_add(om
->ospf
, ospf
);
343 static void ospf_delete(struct ospf
*ospf
)
345 listnode_delete(om
->ospf
, ospf
);
348 struct ospf
*ospf_lookup_by_inst_name(unsigned short instance
, const char *name
)
350 struct ospf
*ospf
= NULL
;
351 struct listnode
*node
, *nnode
;
353 if (name
== NULL
|| strmatch(name
, VRF_DEFAULT_NAME
))
354 return ospf_lookup_by_vrf_id(VRF_DEFAULT
);
356 for (ALL_LIST_ELEMENTS(om
->ospf
, node
, nnode
, ospf
)) {
357 if ((ospf
->instance
== instance
)
358 && ((ospf
->name
== NULL
&& name
== NULL
)
359 || (ospf
->name
&& name
360 && strcmp(ospf
->name
, name
) == 0)))
366 struct ospf
*ospf_get(unsigned short instance
, const char *name
, bool *created
)
370 /* vrf name provided call inst and name based api
371 * in case of no name pass default ospf instance */
373 ospf
= ospf_lookup_by_inst_name(instance
, name
);
375 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
377 *created
= (ospf
== NULL
);
379 ospf
= ospf_new(instance
, name
);
382 if (ospf
->router_id_static
.s_addr
== INADDR_ANY
)
383 ospf_router_id_update(ospf
);
385 ospf_opaque_type11_lsa_init(ospf
);
391 struct ospf
*ospf_get_instance(unsigned short instance
, bool *created
)
395 ospf
= ospf_lookup_instance(instance
);
396 *created
= (ospf
== NULL
);
398 ospf
= ospf_new(instance
, NULL
/* VRF_DEFAULT*/);
401 if (ospf
->router_id_static
.s_addr
== INADDR_ANY
)
402 ospf_router_id_update(ospf
);
404 ospf_opaque_type11_lsa_init(ospf
);
410 struct ospf
*ospf_lookup_by_vrf_id(vrf_id_t vrf_id
)
412 struct vrf
*vrf
= NULL
;
414 vrf
= vrf_lookup_by_id(vrf_id
);
417 return (vrf
->info
) ? (struct ospf
*)vrf
->info
: NULL
;
420 /* It should only be used when processing incoming info update from zebra.
421 * Other situations, it is not sufficient to lookup the ospf instance by
422 * vrf_name only without using the instance number.
424 static struct ospf
*ospf_lookup_by_name(const char *vrf_name
)
426 struct ospf
*ospf
= NULL
;
427 struct listnode
*node
, *nnode
;
429 for (ALL_LIST_ELEMENTS(om
->ospf
, node
, nnode
, ospf
))
430 if ((ospf
->name
== NULL
&& vrf_name
== NULL
)
431 || (ospf
->name
&& vrf_name
432 && strcmp(ospf
->name
, vrf_name
) == 0))
437 /* Handle the second half of deferred shutdown. This is called either
438 * from the deferred-shutdown timer thread, or directly through
439 * ospf_deferred_shutdown_check.
441 * Function is to cleanup G-R state, if required then call ospf_finish_final
442 * to complete shutdown of this ospf instance. Possibly exit if the
443 * whole process is being shutdown and this was the last OSPF instance.
445 static void ospf_deferred_shutdown_finish(struct ospf
*ospf
)
447 ospf
->stub_router_shutdown_time
= OSPF_STUB_ROUTER_UNCONFIGURED
;
448 OSPF_TIMER_OFF(ospf
->t_deferred_shutdown
);
450 ospf_finish_final(ospf
);
452 /* *ospf is now invalid */
454 /* ospfd being shut-down? If so, was this the last ospf instance? */
455 if (CHECK_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
)
456 && (listcount(om
->ospf
) == 0)) {
463 /* Timer thread for G-R */
464 static int ospf_deferred_shutdown_timer(struct thread
*t
)
466 struct ospf
*ospf
= THREAD_ARG(t
);
468 ospf_deferred_shutdown_finish(ospf
);
473 /* Check whether deferred-shutdown must be scheduled, otherwise call
474 * down directly into second-half of instance shutdown.
476 static void ospf_deferred_shutdown_check(struct ospf
*ospf
)
478 unsigned long timeout
;
480 struct ospf_area
*area
;
482 /* deferred shutdown already running? */
483 if (ospf
->t_deferred_shutdown
)
486 /* Should we try push out max-metric LSAs? */
487 if (ospf
->stub_router_shutdown_time
!= OSPF_STUB_ROUTER_UNCONFIGURED
) {
488 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, ln
, area
)) {
489 SET_FLAG(area
->stub_router_state
,
490 OSPF_AREA_ADMIN_STUB_ROUTED
);
492 if (!CHECK_FLAG(area
->stub_router_state
,
493 OSPF_AREA_IS_STUB_ROUTED
))
494 ospf_router_lsa_update_area(area
);
496 timeout
= ospf
->stub_router_shutdown_time
;
498 /* No timer needed */
499 ospf_deferred_shutdown_finish(ospf
);
503 OSPF_TIMER_ON(ospf
->t_deferred_shutdown
, ospf_deferred_shutdown_timer
,
508 /* Shut down the entire process */
509 void ospf_terminate(void)
512 struct listnode
*node
, *nnode
;
514 /* shutdown already in progress */
515 if (CHECK_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
))
518 SET_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
);
520 /* exit immediately if OSPF not actually running */
521 if (listcount(om
->ospf
) == 0)
525 for (ALL_LIST_ELEMENTS(om
->ospf
, node
, nnode
, ospf
))
528 /* Cleanup route maps */
531 /* reverse prefix_list_init */
532 prefix_list_add_hook(NULL
);
533 prefix_list_delete_hook(NULL
);
536 /* Cleanup vrf info */
537 ospf_vrf_terminate();
539 /* Deliberately go back up, hopefully to thread scheduler, as
540 * One or more ospf_finish()'s may have deferred shutdown to a timer
543 zclient_stop(zclient
);
544 zclient_free(zclient
);
549 void ospf_finish(struct ospf
*ospf
)
551 /* let deferred shutdown decide */
552 ospf_deferred_shutdown_check(ospf
);
554 /* if ospf_deferred_shutdown returns, then ospf_finish_final is
555 * deferred to expiry of G-S timer thread. Return back up, hopefully
556 * to thread scheduler.
561 /* Final cleanup of ospf instance */
562 static void ospf_finish_final(struct ospf
*ospf
)
564 struct vrf
*vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
565 struct route_node
*rn
;
566 struct ospf_nbr_nbma
*nbr_nbma
;
567 struct ospf_lsa
*lsa
;
568 struct interface
*ifp
;
569 struct ospf_interface
*oi
;
570 struct ospf_area
*area
;
571 struct ospf_vl_data
*vl_data
;
572 struct listnode
*node
, *nnode
;
577 ospf_opaque_type11_lsa_term(ospf
);
579 ospf_opaque_finish();
581 ospf_flush_self_originated_lsas_now(ospf
);
583 /* Unregister redistribution */
584 for (i
= 0; i
< ZEBRA_ROUTE_MAX
; i
++) {
585 struct list
*red_list
;
586 struct ospf_redist
*red
;
588 red_list
= ospf
->redist
[i
];
592 for (ALL_LIST_ELEMENTS(red_list
, node
, nnode
, red
)) {
593 ospf_redistribute_unset(ospf
, i
, red
->instance
);
594 ospf_redist_del(ospf
, i
, red
->instance
);
597 ospf_redistribute_default_set(ospf
, DEFAULT_ORIGINATE_NONE
, 0, 0);
599 for (ALL_LIST_ELEMENTS(ospf
->areas
, node
, nnode
, area
))
600 ospf_remove_vls_through_area(ospf
, area
);
602 for (ALL_LIST_ELEMENTS(ospf
->vlinks
, node
, nnode
, vl_data
))
603 ospf_vl_delete(ospf
, vl_data
);
605 list_delete(&ospf
->vlinks
);
607 /* Remove any ospf interface config params */
608 FOR_ALL_INTERFACES (vrf
, ifp
) {
609 struct ospf_if_params
*params
;
611 params
= IF_DEF_PARAMS(ifp
);
612 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
))
613 UNSET_IF_PARAM(params
, if_area
);
616 /* Reset interface. */
617 for (ALL_LIST_ELEMENTS(ospf
->oiflist
, node
, nnode
, oi
))
619 list_delete(&ospf
->oiflist
);
620 ospf
->oi_running
= 0;
622 /* De-Register VRF */
623 ospf_zebra_vrf_deregister(ospf
);
625 /* Clear static neighbors */
626 for (rn
= route_top(ospf
->nbr_nbma
); rn
; rn
= route_next(rn
))
627 if ((nbr_nbma
= rn
->info
)) {
628 OSPF_POLL_TIMER_OFF(nbr_nbma
->t_poll
);
631 nbr_nbma
->nbr
->nbr_nbma
= NULL
;
632 nbr_nbma
->nbr
= NULL
;
636 listnode_delete(nbr_nbma
->oi
->nbr_nbma
,
641 XFREE(MTYPE_OSPF_NEIGHBOR_STATIC
, nbr_nbma
);
644 route_table_finish(ospf
->nbr_nbma
);
646 /* Clear networks and Areas. */
647 for (rn
= route_top(ospf
->networks
); rn
; rn
= route_next(rn
)) {
648 struct ospf_network
*network
;
650 if ((network
= rn
->info
) != NULL
) {
651 ospf_network_free(ospf
, network
);
653 route_unlock_node(rn
);
656 route_table_finish(ospf
->networks
);
658 for (ALL_LIST_ELEMENTS(ospf
->areas
, node
, nnode
, area
)) {
659 listnode_delete(ospf
->areas
, area
);
660 ospf_area_free(area
);
663 /* Cancel all timers. */
664 OSPF_TIMER_OFF(ospf
->t_read
);
665 OSPF_TIMER_OFF(ospf
->t_write
);
666 OSPF_TIMER_OFF(ospf
->t_spf_calc
);
667 OSPF_TIMER_OFF(ospf
->t_ase_calc
);
668 OSPF_TIMER_OFF(ospf
->t_maxage
);
669 OSPF_TIMER_OFF(ospf
->t_maxage_walker
);
670 OSPF_TIMER_OFF(ospf
->t_abr_task
);
671 OSPF_TIMER_OFF(ospf
->t_asbr_check
);
672 OSPF_TIMER_OFF(ospf
->t_distribute_update
);
673 OSPF_TIMER_OFF(ospf
->t_lsa_refresher
);
674 OSPF_TIMER_OFF(ospf
->t_opaque_lsa_self
);
675 OSPF_TIMER_OFF(ospf
->t_sr_update
);
677 LSDB_LOOP (OPAQUE_AS_LSDB(ospf
), rn
, lsa
)
678 ospf_discard_from_db(ospf
, ospf
->lsdb
, lsa
);
679 LSDB_LOOP (EXTERNAL_LSDB(ospf
), rn
, lsa
)
680 ospf_discard_from_db(ospf
, ospf
->lsdb
, lsa
);
682 ospf_lsdb_delete_all(ospf
->lsdb
);
683 ospf_lsdb_free(ospf
->lsdb
);
685 for (rn
= route_top(ospf
->maxage_lsa
); rn
; rn
= route_next(rn
)) {
686 if ((lsa
= rn
->info
) != NULL
) {
687 ospf_lsa_unlock(&lsa
);
690 route_unlock_node(rn
);
692 route_table_finish(ospf
->maxage_lsa
);
695 ospf_route_table_free(ospf
->old_table
);
696 if (ospf
->new_table
) {
697 ospf_route_delete(ospf
, ospf
->new_table
);
698 ospf_route_table_free(ospf
->new_table
);
701 ospf_rtrs_free(ospf
->old_rtrs
);
703 ospf_rtrs_free(ospf
->new_rtrs
);
704 if (ospf
->new_external_route
) {
705 ospf_route_delete(ospf
, ospf
->new_external_route
);
706 ospf_route_table_free(ospf
->new_external_route
);
708 if (ospf
->old_external_route
) {
709 ospf_route_delete(ospf
, ospf
->old_external_route
);
710 ospf_route_table_free(ospf
->old_external_route
);
712 if (ospf
->external_lsas
) {
713 ospf_ase_external_lsas_finish(ospf
->external_lsas
);
716 for (i
= ZEBRA_ROUTE_SYSTEM
; i
<= ZEBRA_ROUTE_MAX
; i
++) {
717 struct list
*ext_list
;
718 struct ospf_external
*ext
;
720 ext_list
= ospf
->external
[i
];
724 for (ALL_LIST_ELEMENTS(ext_list
, node
, nnode
, ext
)) {
725 if (ext
->external_info
)
726 for (rn
= route_top(ext
->external_info
); rn
;
727 rn
= route_next(rn
)) {
728 if (rn
->info
== NULL
)
731 XFREE(MTYPE_OSPF_EXTERNAL_INFO
,
734 route_unlock_node(rn
);
737 ospf_external_del(ospf
, i
, ext
->instance
);
741 ospf_distance_reset(ospf
);
742 route_table_finish(ospf
->distance_table
);
744 list_delete(&ospf
->areas
);
745 list_delete(&ospf
->oi_write_q
);
748 stream_free(ospf
->ibuf
);
753 vrf
= vrf_lookup_by_name(ospf
->name
);
755 ospf_vrf_unlink(ospf
, vrf
);
756 XFREE(MTYPE_OSPF_TOP
, ospf
->name
);
758 vrf
= vrf_lookup_by_id(VRF_DEFAULT
);
760 ospf_vrf_unlink(ospf
, vrf
);
763 XFREE(MTYPE_OSPF_TOP
, ospf
);
767 /* allocate new OSPF Area object */
768 static struct ospf_area
*ospf_area_new(struct ospf
*ospf
,
769 struct in_addr area_id
)
771 struct ospf_area
*new;
773 /* Allocate new config_network. */
774 new = XCALLOC(MTYPE_OSPF_AREA
, sizeof(struct ospf_area
));
778 new->area_id
= area_id
;
779 new->area_id_fmt
= OSPF_AREA_ID_FMT_DOTTEDQUAD
;
781 new->external_routing
= OSPF_AREA_DEFAULT
;
782 new->default_cost
= 1;
783 new->auth_type
= OSPF_AUTH_NULL
;
786 new->lsdb
= ospf_lsdb_new();
788 /* Self-originated LSAs initialize. */
789 new->router_lsa_self
= NULL
;
791 ospf_opaque_type10_lsa_init(new);
793 new->oiflist
= list_new();
794 new->ranges
= route_table_init();
796 if (area_id
.s_addr
== OSPF_AREA_BACKBONE
)
797 ospf
->backbone
= new;
802 static void ospf_area_free(struct ospf_area
*area
)
804 struct route_node
*rn
;
805 struct ospf_lsa
*lsa
;
807 ospf_opaque_type10_lsa_term(area
);
810 LSDB_LOOP (ROUTER_LSDB(area
), rn
, lsa
)
811 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
812 LSDB_LOOP (NETWORK_LSDB(area
), rn
, lsa
)
813 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
814 LSDB_LOOP (SUMMARY_LSDB(area
), rn
, lsa
)
815 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
816 LSDB_LOOP (ASBR_SUMMARY_LSDB(area
), rn
, lsa
)
817 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
819 LSDB_LOOP (NSSA_LSDB(area
), rn
, lsa
)
820 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
821 LSDB_LOOP (OPAQUE_AREA_LSDB(area
), rn
, lsa
)
822 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
823 LSDB_LOOP (OPAQUE_LINK_LSDB(area
), rn
, lsa
)
824 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
826 ospf_lsdb_delete_all(area
->lsdb
);
827 ospf_lsdb_free(area
->lsdb
);
829 ospf_lsa_unlock(&area
->router_lsa_self
);
831 route_table_finish(area
->ranges
);
832 list_delete(&area
->oiflist
);
834 if (EXPORT_NAME(area
))
835 free(EXPORT_NAME(area
));
837 if (IMPORT_NAME(area
))
838 free(IMPORT_NAME(area
));
841 OSPF_TIMER_OFF(area
->t_stub_router
);
842 OSPF_TIMER_OFF(area
->t_opaque_lsa_self
);
844 if (OSPF_IS_AREA_BACKBONE(area
))
845 area
->ospf
->backbone
= NULL
;
847 XFREE(MTYPE_OSPF_AREA
, area
);
850 void ospf_area_check_free(struct ospf
*ospf
, struct in_addr area_id
)
852 struct ospf_area
*area
;
854 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
855 if (area
&& listcount(area
->oiflist
) == 0 && area
->ranges
->top
== NULL
856 && !ospf_vl_count(ospf
, area
)
857 && area
->shortcut_configured
== OSPF_SHORTCUT_DEFAULT
858 && area
->external_routing
== OSPF_AREA_DEFAULT
859 && area
->no_summary
== 0 && area
->default_cost
== 1
860 && EXPORT_NAME(area
) == NULL
&& IMPORT_NAME(area
) == NULL
861 && area
->auth_type
== OSPF_AUTH_NULL
) {
862 listnode_delete(ospf
->areas
, area
);
863 ospf_area_free(area
);
867 struct ospf_area
*ospf_area_get(struct ospf
*ospf
, struct in_addr area_id
)
869 struct ospf_area
*area
;
871 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
873 area
= ospf_area_new(ospf
, area_id
);
874 listnode_add_sort(ospf
->areas
, area
);
875 ospf_check_abr_status(ospf
);
876 if (ospf
->stub_router_admin_set
877 == OSPF_STUB_ROUTER_ADMINISTRATIVE_SET
) {
878 SET_FLAG(area
->stub_router_state
,
879 OSPF_AREA_ADMIN_STUB_ROUTED
);
886 struct ospf_area
*ospf_area_lookup_by_area_id(struct ospf
*ospf
,
887 struct in_addr area_id
)
889 struct ospf_area
*area
;
890 struct listnode
*node
;
892 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
))
893 if (IPV4_ADDR_SAME(&area
->area_id
, &area_id
))
899 void ospf_area_add_if(struct ospf_area
*area
, struct ospf_interface
*oi
)
901 listnode_add(area
->oiflist
, oi
);
904 void ospf_area_del_if(struct ospf_area
*area
, struct ospf_interface
*oi
)
906 listnode_delete(area
->oiflist
, oi
);
910 static void add_ospf_interface(struct connected
*co
, struct ospf_area
*area
)
912 struct ospf_interface
*oi
;
914 oi
= ospf_if_new(area
->ospf
, co
->ifp
, co
->address
);
919 oi
->params
= ospf_lookup_if_params(co
->ifp
, oi
->address
->u
.prefix4
);
920 oi
->output_cost
= ospf_if_get_output_cost(oi
);
922 /* Relate ospf interface to ospf instance. */
923 oi
->ospf
= area
->ospf
;
925 /* update network type as interface flag */
926 /* If network type is specified previously,
927 skip network type setting. */
928 oi
->type
= IF_DEF_PARAMS(co
->ifp
)->type
;
930 /* Add pseudo neighbor. */
931 ospf_nbr_self_reset(oi
, oi
->ospf
->router_id
);
933 ospf_area_add_if(oi
->area
, oi
);
936 * if router_id is not configured, dont bring up
938 * ospf_router_id_update() will call ospf_if_update
939 * whenever r-id is configured instead.
941 if ((area
->ospf
->router_id
.s_addr
!= INADDR_ANY
)
942 && if_is_operative(co
->ifp
))
946 static void update_redistributed(struct ospf
*ospf
, int add_to_ospf
)
948 struct route_node
*rn
;
949 struct external_info
*ei
;
950 struct ospf_external
*ext
;
952 if (ospf_is_type_redistributed(ospf
, ZEBRA_ROUTE_CONNECT
, 0)) {
953 ext
= ospf_external_lookup(ospf
, ZEBRA_ROUTE_CONNECT
, 0);
954 if ((ext
) && EXTERNAL_INFO(ext
)) {
955 for (rn
= route_top(EXTERNAL_INFO(ext
)); rn
;
956 rn
= route_next(rn
)) {
962 if (ospf_external_info_find_lsa(ospf
,
964 if (!ospf_distribute_check_connected(
966 ospf_external_lsa_flush(
969 ei
->ifindex
/*, ei->nexthop */);
971 if (!ospf_external_info_find_lsa(
973 if (ospf_distribute_check_connected(
975 ospf_external_lsa_originate(
983 /* Config network statement related functions. */
984 static struct ospf_network
*ospf_network_new(struct in_addr area_id
)
986 struct ospf_network
*new;
987 new = XCALLOC(MTYPE_OSPF_NETWORK
, sizeof(struct ospf_network
));
989 new->area_id
= area_id
;
990 new->area_id_fmt
= OSPF_AREA_ID_FMT_DOTTEDQUAD
;
995 static void ospf_network_free(struct ospf
*ospf
, struct ospf_network
*network
)
997 ospf_area_check_free(ospf
, network
->area_id
);
998 ospf_schedule_abr_task(ospf
);
999 XFREE(MTYPE_OSPF_NETWORK
, network
);
1002 int ospf_network_set(struct ospf
*ospf
, struct prefix_ipv4
*p
,
1003 struct in_addr area_id
, int df
)
1005 struct ospf_network
*network
;
1006 struct ospf_area
*area
;
1007 struct route_node
*rn
;
1009 rn
= route_node_get(ospf
->networks
, (struct prefix
*)p
);
1012 route_unlock_node(rn
);
1014 if (IPV4_ADDR_SAME(&area_id
, &network
->area_id
)) {
1017 /* There is already same network statement. */
1022 rn
->info
= network
= ospf_network_new(area_id
);
1023 network
->area_id_fmt
= df
;
1024 area
= ospf_area_get(ospf
, area_id
);
1025 ospf_area_display_format_set(ospf
, area
, df
);
1027 /* Run network config now. */
1028 ospf_network_run((struct prefix
*)p
, area
);
1030 /* Update connected redistribute. */
1031 update_redistributed(ospf
, 1); /* interfaces possibly added */
1033 ospf_area_check_free(ospf
, area_id
);
1038 int ospf_network_unset(struct ospf
*ospf
, struct prefix_ipv4
*p
,
1039 struct in_addr area_id
)
1041 struct route_node
*rn
;
1042 struct ospf_network
*network
;
1043 struct listnode
*node
, *nnode
;
1044 struct ospf_interface
*oi
;
1046 rn
= route_node_lookup(ospf
->networks
, (struct prefix
*)p
);
1051 route_unlock_node(rn
);
1052 if (!IPV4_ADDR_SAME(&area_id
, &network
->area_id
))
1055 ospf_network_free(ospf
, rn
->info
);
1057 route_unlock_node(rn
); /* initial reference */
1059 /* Find interfaces that are not configured already. */
1060 for (ALL_LIST_ELEMENTS(ospf
->oiflist
, node
, nnode
, oi
)) {
1062 if (oi
->type
== OSPF_IFTYPE_VIRTUALLINK
)
1065 ospf_network_run_subnet(ospf
, oi
->connected
, NULL
, NULL
);
1068 /* Update connected redistribute. */
1069 update_redistributed(ospf
, 0); /* interfaces possibly removed */
1070 ospf_area_check_free(ospf
, area_id
);
1075 /* Ensure there's an OSPF instance, as "ip ospf area" enabled OSPF means
1076 * there might not be any 'router ospf' config.
1078 * Otherwise, doesn't do anything different to ospf_if_update for now
1080 void ospf_interface_area_set(struct ospf
*ospf
, struct interface
*ifp
)
1085 ospf_if_update(ospf
, ifp
);
1086 /* if_update does a update_redistributed */
1091 void ospf_interface_area_unset(struct ospf
*ospf
, struct interface
*ifp
)
1093 struct route_node
*rn_oi
;
1096 return; /* Ospf not ready yet */
1098 /* Find interfaces that may need to be removed. */
1099 for (rn_oi
= route_top(IF_OIFS(ifp
)); rn_oi
;
1100 rn_oi
= route_next(rn_oi
)) {
1101 struct ospf_interface
*oi
= NULL
;
1103 if ((oi
= rn_oi
->info
) == NULL
)
1106 if (oi
->type
== OSPF_IFTYPE_VIRTUALLINK
)
1109 ospf_network_run_subnet(ospf
, oi
->connected
, NULL
, NULL
);
1112 /* Update connected redistribute. */
1113 update_redistributed(ospf
, 0); /* interfaces possibly removed */
1116 bool ospf_interface_area_is_already_set(struct ospf
*ospf
,
1117 struct interface
*ifp
)
1119 struct route_node
*rn_oi
;
1122 return false; /* Ospf not ready yet */
1124 /* Find interfaces that may need to be removed. */
1125 for (rn_oi
= route_top(IF_OIFS(ifp
)); rn_oi
;
1126 rn_oi
= route_next(rn_oi
)) {
1127 struct ospf_interface
*oi
= rn_oi
->info
;
1132 if (oi
->type
== OSPF_IFTYPE_VIRTUALLINK
)
1134 /* at least one route covered by interface
1135 * that implies already done
1142 /* Check whether interface matches given network
1143 * returns: 1, true. 0, false
1145 static int ospf_network_match_iface(const struct connected
*co
,
1146 const struct prefix
*net
)
1148 /* new approach: more elegant and conceptually clean */
1149 return prefix_match_network_statement(net
, CONNECTED_PREFIX(co
));
1152 static void ospf_update_interface_area(struct connected
*co
,
1153 struct ospf_area
*area
)
1155 struct ospf_interface
*oi
= ospf_if_table_lookup(co
->ifp
, co
->address
);
1157 /* nothing to be done case */
1158 if (oi
&& oi
->area
== area
) {
1165 add_ospf_interface(co
, area
);
1168 /* Run OSPF for the given subnet, taking into account the following
1169 * possible sources of area configuration, in the given order of preference:
1171 * - Whether there is interface+address specific area configuration
1172 * - Whether there is a default area for the interface
1173 * - Whether there is an area given as a parameter.
1174 * - If no specific network prefix/area is supplied, whether there's
1175 * a matching network configured.
1177 static void ospf_network_run_subnet(struct ospf
*ospf
, struct connected
*co
,
1179 struct ospf_area
*given_area
)
1181 struct ospf_interface
*oi
;
1182 struct ospf_if_params
*params
;
1183 struct ospf_area
*area
= NULL
;
1184 struct route_node
*rn
;
1187 if (CHECK_FLAG(co
->flags
, ZEBRA_IFA_SECONDARY
))
1190 if (co
->address
->family
!= AF_INET
)
1193 /* Try determine the appropriate area for this interface + address
1194 * Start by checking interface config
1196 params
= ospf_lookup_if_params(co
->ifp
, co
->address
->u
.prefix4
);
1197 if (params
&& OSPF_IF_PARAM_CONFIGURED(params
, if_area
))
1198 area
= ospf_area_get(ospf
, params
->if_area
);
1200 params
= IF_DEF_PARAMS(co
->ifp
);
1201 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
))
1202 area
= ospf_area_get(ospf
, params
->if_area
);
1205 /* If we've found an interface and/or addr specific area, then we're
1209 ospf_update_interface_area(co
, area
);
1213 /* Otherwise, only remaining possibility is a matching network statement
1216 assert(given_area
!= NULL
);
1218 /* Which either was supplied as a parameter.. (e.g. cause a new
1219 * network/area was just added)..
1221 if (p
->family
== co
->address
->family
1222 && ospf_network_match_iface(co
, p
))
1223 ospf_update_interface_area(co
, given_area
);
1228 /* Else we have to search the existing network/area config to see
1231 for (rn
= route_top(ospf
->networks
); rn
; rn
= route_next(rn
))
1232 if (rn
->info
!= NULL
&& ospf_network_match_iface(co
, &rn
->p
)) {
1233 struct ospf_network
*network
=
1234 (struct ospf_network
*)rn
->info
;
1235 area
= ospf_area_get(ospf
, network
->area_id
);
1236 ospf_update_interface_area(co
, area
);
1240 /* If the subnet isn't in any area, deconfigure */
1241 if (!configed
&& (oi
= ospf_if_table_lookup(co
->ifp
, co
->address
)))
1245 static void ospf_network_run_interface(struct ospf
*ospf
, struct interface
*ifp
,
1247 struct ospf_area
*given_area
)
1249 struct listnode
*cnode
;
1250 struct connected
*co
;
1252 if (memcmp(ifp
->name
, "VLINK", 5) == 0)
1255 /* Network prefix without area is nonsensical */
1257 assert(given_area
!= NULL
);
1259 /* if interface prefix is match specified prefix,
1260 then create socket and join multicast group. */
1261 for (ALL_LIST_ELEMENTS_RO(ifp
->connected
, cnode
, co
))
1262 ospf_network_run_subnet(ospf
, co
, p
, given_area
);
1265 static void ospf_network_run(struct prefix
*p
, struct ospf_area
*area
)
1267 struct vrf
*vrf
= vrf_lookup_by_id(area
->ospf
->vrf_id
);
1268 struct interface
*ifp
;
1270 /* Schedule Router ID Update. */
1271 if (area
->ospf
->router_id
.s_addr
== INADDR_ANY
)
1272 ospf_router_id_update(area
->ospf
);
1274 /* Get target interface. */
1275 FOR_ALL_INTERFACES (vrf
, ifp
)
1276 ospf_network_run_interface(area
->ospf
, ifp
, p
, area
);
1279 void ospf_ls_upd_queue_empty(struct ospf_interface
*oi
)
1281 struct route_node
*rn
;
1282 struct listnode
*node
, *nnode
;
1284 struct ospf_lsa
*lsa
;
1286 /* empty ls update queue */
1287 for (rn
= route_top(oi
->ls_upd_queue
); rn
; rn
= route_next(rn
))
1288 if ((lst
= (struct list
*)rn
->info
)) {
1289 for (ALL_LIST_ELEMENTS(lst
, node
, nnode
, lsa
))
1290 ospf_lsa_unlock(&lsa
); /* oi->ls_upd_queue */
1295 /* remove update event */
1296 if (oi
->t_ls_upd_event
) {
1297 thread_cancel(oi
->t_ls_upd_event
);
1298 oi
->t_ls_upd_event
= NULL
;
1302 void ospf_if_update(struct ospf
*ospf
, struct interface
*ifp
)
1308 if (IS_DEBUG_OSPF_EVENT
)
1310 "%s: interface %s ifp->vrf_id %u ospf vrf %s vrf_id %u router_id %s",
1311 __PRETTY_FUNCTION__
, ifp
->name
, ifp
->vrf_id
,
1312 ospf_vrf_id_to_name(ospf
->vrf_id
), ospf
->vrf_id
,
1313 inet_ntoa(ospf
->router_id
));
1315 /* OSPF must be ready. */
1316 if (!ospf_is_ready(ospf
))
1319 ospf_network_run_interface(ospf
, ifp
, NULL
, NULL
);
1321 /* Update connected redistribute. */
1322 update_redistributed(ospf
, 1);
1326 void ospf_remove_vls_through_area(struct ospf
*ospf
, struct ospf_area
*area
)
1328 struct listnode
*node
, *nnode
;
1329 struct ospf_vl_data
*vl_data
;
1331 for (ALL_LIST_ELEMENTS(ospf
->vlinks
, node
, nnode
, vl_data
))
1332 if (IPV4_ADDR_SAME(&vl_data
->vl_area_id
, &area
->area_id
))
1333 ospf_vl_delete(ospf
, vl_data
);
1337 static const struct message ospf_area_type_msg
[] = {
1338 {OSPF_AREA_DEFAULT
, "Default"},
1339 {OSPF_AREA_STUB
, "Stub"},
1340 {OSPF_AREA_NSSA
, "NSSA"},
1343 static void ospf_area_type_set(struct ospf_area
*area
, int type
)
1345 struct listnode
*node
;
1346 struct ospf_interface
*oi
;
1348 if (area
->external_routing
== type
) {
1349 if (IS_DEBUG_OSPF_EVENT
)
1350 zlog_debug("Area[%s]: Types are the same, ignored.",
1351 inet_ntoa(area
->area_id
));
1355 area
->external_routing
= type
;
1357 if (IS_DEBUG_OSPF_EVENT
)
1358 zlog_debug("Area[%s]: Configured as %s",
1359 inet_ntoa(area
->area_id
),
1360 lookup_msg(ospf_area_type_msg
, type
, NULL
));
1362 switch (area
->external_routing
) {
1363 case OSPF_AREA_DEFAULT
:
1364 for (ALL_LIST_ELEMENTS_RO(area
->oiflist
, node
, oi
))
1365 if (oi
->nbr_self
!= NULL
) {
1366 UNSET_FLAG(oi
->nbr_self
->options
,
1368 SET_FLAG(oi
->nbr_self
->options
, OSPF_OPTION_E
);
1371 case OSPF_AREA_STUB
:
1372 for (ALL_LIST_ELEMENTS_RO(area
->oiflist
, node
, oi
))
1373 if (oi
->nbr_self
!= NULL
) {
1374 if (IS_DEBUG_OSPF_EVENT
)
1376 "setting options on %s accordingly",
1378 UNSET_FLAG(oi
->nbr_self
->options
,
1380 UNSET_FLAG(oi
->nbr_self
->options
,
1382 if (IS_DEBUG_OSPF_EVENT
)
1383 zlog_debug("options set on %s: %x",
1384 IF_NAME(oi
), OPTIONS(oi
));
1387 case OSPF_AREA_NSSA
:
1388 for (ALL_LIST_ELEMENTS_RO(area
->oiflist
, node
, oi
))
1389 if (oi
->nbr_self
!= NULL
) {
1391 "setting nssa options on %s accordingly",
1393 UNSET_FLAG(oi
->nbr_self
->options
,
1395 SET_FLAG(oi
->nbr_self
->options
, OSPF_OPTION_NP
);
1396 zlog_debug("options set on %s: %x", IF_NAME(oi
),
1404 ospf_router_lsa_update_area(area
);
1405 ospf_schedule_abr_task(area
->ospf
);
1408 int ospf_area_shortcut_set(struct ospf
*ospf
, struct ospf_area
*area
, int mode
)
1410 if (area
->shortcut_configured
== mode
)
1413 area
->shortcut_configured
= mode
;
1414 ospf_router_lsa_update_area(area
);
1415 ospf_schedule_abr_task(ospf
);
1417 ospf_area_check_free(ospf
, area
->area_id
);
1422 int ospf_area_shortcut_unset(struct ospf
*ospf
, struct ospf_area
*area
)
1424 area
->shortcut_configured
= OSPF_SHORTCUT_DEFAULT
;
1425 ospf_router_lsa_update_area(area
);
1426 ospf_area_check_free(ospf
, area
->area_id
);
1427 ospf_schedule_abr_task(ospf
);
1432 static int ospf_area_vlink_count(struct ospf
*ospf
, struct ospf_area
*area
)
1434 struct ospf_vl_data
*vl
;
1435 struct listnode
*node
;
1438 for (ALL_LIST_ELEMENTS_RO(ospf
->vlinks
, node
, vl
))
1439 if (IPV4_ADDR_SAME(&vl
->vl_area_id
, &area
->area_id
))
1445 int ospf_area_display_format_set(struct ospf
*ospf
, struct ospf_area
*area
,
1448 area
->area_id_fmt
= df
;
1453 int ospf_area_stub_set(struct ospf
*ospf
, struct in_addr area_id
)
1455 struct ospf_area
*area
;
1457 area
= ospf_area_get(ospf
, area_id
);
1458 if (ospf_area_vlink_count(ospf
, area
))
1461 if (area
->external_routing
!= OSPF_AREA_STUB
)
1462 ospf_area_type_set(area
, OSPF_AREA_STUB
);
1467 int ospf_area_stub_unset(struct ospf
*ospf
, struct in_addr area_id
)
1469 struct ospf_area
*area
;
1471 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1475 if (area
->external_routing
== OSPF_AREA_STUB
)
1476 ospf_area_type_set(area
, OSPF_AREA_DEFAULT
);
1478 ospf_area_check_free(ospf
, area_id
);
1483 int ospf_area_no_summary_set(struct ospf
*ospf
, struct in_addr area_id
)
1485 struct ospf_area
*area
;
1487 area
= ospf_area_get(ospf
, area_id
);
1488 area
->no_summary
= 1;
1493 int ospf_area_no_summary_unset(struct ospf
*ospf
, struct in_addr area_id
)
1495 struct ospf_area
*area
;
1497 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1501 area
->no_summary
= 0;
1502 ospf_area_check_free(ospf
, area_id
);
1507 int ospf_area_nssa_no_summary_set(struct ospf
*ospf
, struct in_addr area_id
)
1509 struct ospf_area
*area
;
1511 area
= ospf_area_get(ospf
, area_id
);
1512 if (ospf_area_vlink_count(ospf
, area
))
1515 if (area
->external_routing
!= OSPF_AREA_NSSA
) {
1516 ospf_area_type_set(area
, OSPF_AREA_NSSA
);
1518 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1521 ospf_area_no_summary_set(ospf
, area_id
);
1526 int ospf_area_nssa_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
);
1538 /* set NSSA area defaults */
1539 area
->no_summary
= 0;
1540 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1541 area
->NSSATranslatorState
= OSPF_NSSA_TRANSLATE_DISABLED
;
1542 area
->NSSATranslatorStabilityInterval
=
1543 OSPF_NSSA_TRANS_STABLE_DEFAULT
;
1548 int ospf_area_nssa_unset(struct ospf
*ospf
, struct in_addr area_id
, int argc
)
1550 struct ospf_area
*area
;
1552 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1556 /* argc < 5 -> 'no area x nssa' */
1557 if (argc
< 5 && area
->external_routing
== OSPF_AREA_NSSA
) {
1559 /* set NSSA area defaults */
1560 area
->no_summary
= 0;
1561 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1562 area
->NSSATranslatorState
= OSPF_NSSA_TRANSLATE_DISABLED
;
1563 area
->NSSATranslatorStabilityInterval
=
1564 OSPF_NSSA_TRANS_STABLE_DEFAULT
;
1565 ospf_area_type_set(area
, OSPF_AREA_DEFAULT
);
1567 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1570 ospf_area_check_free(ospf
, area_id
);
1575 int ospf_area_nssa_translator_role_set(struct ospf
*ospf
,
1576 struct in_addr area_id
, int role
)
1578 struct ospf_area
*area
;
1580 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1584 area
->NSSATranslatorRole
= role
;
1590 /* XXX: unused? Leave for symmetry? */
1592 ospf_area_nssa_translator_role_unset (struct ospf
*ospf
,
1593 struct in_addr area_id
)
1595 struct ospf_area
*area
;
1597 area
= ospf_area_lookup_by_area_id (ospf
, area_id
);
1601 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1603 ospf_area_check_free (ospf
, area_id
);
1609 int ospf_area_export_list_set(struct ospf
*ospf
, struct ospf_area
*area
,
1610 const char *list_name
)
1612 struct access_list
*list
;
1613 list
= access_list_lookup(AFI_IP
, list_name
);
1615 EXPORT_LIST(area
) = list
;
1617 if (EXPORT_NAME(area
))
1618 free(EXPORT_NAME(area
));
1620 EXPORT_NAME(area
) = strdup(list_name
);
1621 ospf_schedule_abr_task(ospf
);
1626 int ospf_area_export_list_unset(struct ospf
*ospf
, struct ospf_area
*area
)
1629 EXPORT_LIST(area
) = 0;
1631 if (EXPORT_NAME(area
))
1632 free(EXPORT_NAME(area
));
1634 EXPORT_NAME(area
) = NULL
;
1636 ospf_area_check_free(ospf
, area
->area_id
);
1638 ospf_schedule_abr_task(ospf
);
1643 int ospf_area_import_list_set(struct ospf
*ospf
, struct ospf_area
*area
,
1646 struct access_list
*list
;
1647 list
= access_list_lookup(AFI_IP
, name
);
1649 IMPORT_LIST(area
) = list
;
1651 if (IMPORT_NAME(area
))
1652 free(IMPORT_NAME(area
));
1654 IMPORT_NAME(area
) = strdup(name
);
1655 ospf_schedule_abr_task(ospf
);
1660 int ospf_area_import_list_unset(struct ospf
*ospf
, struct ospf_area
*area
)
1662 IMPORT_LIST(area
) = 0;
1664 if (IMPORT_NAME(area
))
1665 free(IMPORT_NAME(area
));
1667 IMPORT_NAME(area
) = NULL
;
1668 ospf_area_check_free(ospf
, area
->area_id
);
1670 ospf_schedule_abr_task(ospf
);
1675 int ospf_timers_refresh_set(struct ospf
*ospf
, int interval
)
1679 if (ospf
->lsa_refresh_interval
== interval
)
1682 time_left
= ospf
->lsa_refresh_interval
1683 - (monotime(NULL
) - ospf
->lsa_refresher_started
);
1685 if (time_left
> interval
) {
1686 OSPF_TIMER_OFF(ospf
->t_lsa_refresher
);
1687 thread_add_timer(master
, ospf_lsa_refresh_walker
, ospf
,
1688 interval
, &ospf
->t_lsa_refresher
);
1690 ospf
->lsa_refresh_interval
= interval
;
1695 int ospf_timers_refresh_unset(struct ospf
*ospf
)
1699 time_left
= ospf
->lsa_refresh_interval
1700 - (monotime(NULL
) - ospf
->lsa_refresher_started
);
1702 if (time_left
> OSPF_LSA_REFRESH_INTERVAL_DEFAULT
) {
1703 OSPF_TIMER_OFF(ospf
->t_lsa_refresher
);
1704 ospf
->t_lsa_refresher
= NULL
;
1705 thread_add_timer(master
, ospf_lsa_refresh_walker
, ospf
,
1706 OSPF_LSA_REFRESH_INTERVAL_DEFAULT
,
1707 &ospf
->t_lsa_refresher
);
1710 ospf
->lsa_refresh_interval
= OSPF_LSA_REFRESH_INTERVAL_DEFAULT
;
1716 static struct ospf_nbr_nbma
*ospf_nbr_nbma_new(void)
1718 struct ospf_nbr_nbma
*nbr_nbma
;
1720 nbr_nbma
= XCALLOC(MTYPE_OSPF_NEIGHBOR_STATIC
,
1721 sizeof(struct ospf_nbr_nbma
));
1723 nbr_nbma
->priority
= OSPF_NEIGHBOR_PRIORITY_DEFAULT
;
1724 nbr_nbma
->v_poll
= OSPF_POLL_INTERVAL_DEFAULT
;
1729 static void ospf_nbr_nbma_free(struct ospf_nbr_nbma
*nbr_nbma
)
1731 XFREE(MTYPE_OSPF_NEIGHBOR_STATIC
, nbr_nbma
);
1734 static void ospf_nbr_nbma_delete(struct ospf
*ospf
,
1735 struct ospf_nbr_nbma
*nbr_nbma
)
1737 struct route_node
*rn
;
1738 struct prefix_ipv4 p
;
1741 p
.prefix
= nbr_nbma
->addr
;
1742 p
.prefixlen
= IPV4_MAX_BITLEN
;
1744 rn
= route_node_lookup(ospf
->nbr_nbma
, (struct prefix
*)&p
);
1746 ospf_nbr_nbma_free(rn
->info
);
1748 route_unlock_node(rn
);
1749 route_unlock_node(rn
);
1753 static void ospf_nbr_nbma_down(struct ospf_nbr_nbma
*nbr_nbma
)
1755 OSPF_TIMER_OFF(nbr_nbma
->t_poll
);
1757 if (nbr_nbma
->nbr
) {
1758 nbr_nbma
->nbr
->nbr_nbma
= NULL
;
1759 OSPF_NSM_EVENT_EXECUTE(nbr_nbma
->nbr
, NSM_KillNbr
);
1763 listnode_delete(nbr_nbma
->oi
->nbr_nbma
, nbr_nbma
);
1766 static void ospf_nbr_nbma_add(struct ospf_nbr_nbma
*nbr_nbma
,
1767 struct ospf_interface
*oi
)
1769 struct ospf_neighbor
*nbr
;
1770 struct route_node
*rn
;
1773 if (oi
->type
!= OSPF_IFTYPE_NBMA
)
1776 if (nbr_nbma
->nbr
!= NULL
)
1779 if (IPV4_ADDR_SAME(&oi
->nbr_self
->address
.u
.prefix4
, &nbr_nbma
->addr
))
1783 listnode_add(oi
->nbr_nbma
, nbr_nbma
);
1785 /* Get neighbor information from table. */
1787 p
.prefixlen
= IPV4_MAX_BITLEN
;
1788 p
.u
.prefix4
= nbr_nbma
->addr
;
1790 rn
= route_node_get(oi
->nbrs
, (struct prefix
*)&p
);
1793 nbr
->nbr_nbma
= nbr_nbma
;
1794 nbr_nbma
->nbr
= nbr
;
1796 route_unlock_node(rn
);
1798 nbr
= rn
->info
= ospf_nbr_new(oi
);
1799 nbr
->state
= NSM_Down
;
1800 nbr
->src
= nbr_nbma
->addr
;
1801 nbr
->nbr_nbma
= nbr_nbma
;
1802 nbr
->priority
= nbr_nbma
->priority
;
1805 nbr_nbma
->nbr
= nbr
;
1807 OSPF_NSM_EVENT_EXECUTE(nbr
, NSM_Start
);
1811 void ospf_nbr_nbma_if_update(struct ospf
*ospf
, struct ospf_interface
*oi
)
1813 struct ospf_nbr_nbma
*nbr_nbma
;
1814 struct route_node
*rn
;
1815 struct prefix_ipv4 p
;
1817 if (oi
->type
!= OSPF_IFTYPE_NBMA
)
1820 for (rn
= route_top(ospf
->nbr_nbma
); rn
; rn
= route_next(rn
))
1821 if ((nbr_nbma
= rn
->info
))
1822 if (nbr_nbma
->oi
== NULL
&& nbr_nbma
->nbr
== NULL
) {
1824 p
.prefix
= nbr_nbma
->addr
;
1825 p
.prefixlen
= IPV4_MAX_BITLEN
;
1827 if (prefix_match(oi
->address
,
1828 (struct prefix
*)&p
))
1829 ospf_nbr_nbma_add(nbr_nbma
, oi
);
1833 struct ospf_nbr_nbma
*ospf_nbr_nbma_lookup(struct ospf
*ospf
,
1834 struct in_addr nbr_addr
)
1836 struct route_node
*rn
;
1837 struct prefix_ipv4 p
;
1840 p
.prefix
= nbr_addr
;
1841 p
.prefixlen
= IPV4_MAX_BITLEN
;
1843 rn
= route_node_lookup(ospf
->nbr_nbma
, (struct prefix
*)&p
);
1845 route_unlock_node(rn
);
1851 struct ospf_nbr_nbma
*ospf_nbr_nbma_lookup_next(struct ospf
*ospf
,
1852 struct in_addr
*addr
, int first
)
1855 struct ospf_nbr_nbma
*nbr_nbma
;
1856 struct listnode
*node
;
1863 for (ALL_LIST_ELEMENTS_RO (ospf
->nbr_nbma
, node
, nbr_nbma
))
1867 *addr
= nbr_nbma
->addr
;
1870 else if (ntohl (nbr_nbma
->addr
.s_addr
) > ntohl (addr
->s_addr
))
1872 *addr
= nbr_nbma
->addr
;
1880 int ospf_nbr_nbma_set(struct ospf
*ospf
, struct in_addr nbr_addr
)
1882 struct ospf_nbr_nbma
*nbr_nbma
;
1883 struct ospf_interface
*oi
;
1884 struct prefix_ipv4 p
;
1885 struct route_node
*rn
;
1886 struct listnode
*node
;
1888 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
1892 nbr_nbma
= ospf_nbr_nbma_new();
1893 nbr_nbma
->addr
= nbr_addr
;
1896 p
.prefix
= nbr_addr
;
1897 p
.prefixlen
= IPV4_MAX_BITLEN
;
1899 rn
= route_node_get(ospf
->nbr_nbma
, (struct prefix
*)&p
);
1901 route_unlock_node(rn
);
1902 rn
->info
= nbr_nbma
;
1904 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
1905 if (oi
->type
== OSPF_IFTYPE_NBMA
)
1906 if (prefix_match(oi
->address
, (struct prefix
*)&p
)) {
1907 ospf_nbr_nbma_add(nbr_nbma
, oi
);
1915 int ospf_nbr_nbma_unset(struct ospf
*ospf
, struct in_addr nbr_addr
)
1917 struct ospf_nbr_nbma
*nbr_nbma
;
1919 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
1920 if (nbr_nbma
== NULL
)
1923 ospf_nbr_nbma_down(nbr_nbma
);
1924 ospf_nbr_nbma_delete(ospf
, nbr_nbma
);
1929 int ospf_nbr_nbma_priority_set(struct ospf
*ospf
, struct in_addr nbr_addr
,
1932 struct ospf_nbr_nbma
*nbr_nbma
;
1934 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
1935 if (nbr_nbma
== NULL
)
1938 if (nbr_nbma
->priority
!= priority
)
1939 nbr_nbma
->priority
= priority
;
1944 int ospf_nbr_nbma_priority_unset(struct ospf
*ospf
, struct in_addr nbr_addr
)
1946 struct ospf_nbr_nbma
*nbr_nbma
;
1948 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
1949 if (nbr_nbma
== NULL
)
1952 if (nbr_nbma
!= OSPF_NEIGHBOR_PRIORITY_DEFAULT
)
1953 nbr_nbma
->priority
= OSPF_NEIGHBOR_PRIORITY_DEFAULT
;
1958 int ospf_nbr_nbma_poll_interval_set(struct ospf
*ospf
, struct in_addr nbr_addr
,
1959 unsigned int interval
)
1961 struct ospf_nbr_nbma
*nbr_nbma
;
1963 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
1964 if (nbr_nbma
== NULL
)
1967 if (nbr_nbma
->v_poll
!= interval
) {
1968 nbr_nbma
->v_poll
= interval
;
1969 if (nbr_nbma
->oi
&& ospf_if_is_up(nbr_nbma
->oi
)) {
1970 OSPF_TIMER_OFF(nbr_nbma
->t_poll
);
1971 OSPF_POLL_TIMER_ON(nbr_nbma
->t_poll
, ospf_poll_timer
,
1979 int ospf_nbr_nbma_poll_interval_unset(struct ospf
*ospf
, struct in_addr addr
)
1981 struct ospf_nbr_nbma
*nbr_nbma
;
1983 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, addr
);
1984 if (nbr_nbma
== NULL
)
1987 if (nbr_nbma
->v_poll
!= OSPF_POLL_INTERVAL_DEFAULT
)
1988 nbr_nbma
->v_poll
= OSPF_POLL_INTERVAL_DEFAULT
;
1993 void ospf_master_init(struct thread_master
*master
)
1995 memset(&ospf_master
, 0, sizeof(struct ospf_master
));
1998 om
->ospf
= list_new();
1999 om
->master
= master
;
2002 /* Link OSPF instance to VRF. */
2003 void ospf_vrf_link(struct ospf
*ospf
, struct vrf
*vrf
)
2005 ospf
->vrf_id
= vrf
->vrf_id
;
2006 if (vrf
->info
!= (void *)ospf
)
2007 vrf
->info
= (void *)ospf
;
2010 /* Unlink OSPF instance from VRF. */
2011 void ospf_vrf_unlink(struct ospf
*ospf
, struct vrf
*vrf
)
2013 if (vrf
->info
== (void *)ospf
)
2015 ospf
->vrf_id
= VRF_UNKNOWN
;
2018 /* This is hook function for vrf create called as part of vrf_init */
2019 static int ospf_vrf_new(struct vrf
*vrf
)
2021 if (IS_DEBUG_OSPF_EVENT
)
2022 zlog_debug("%s: VRF Created: %s(%u)", __PRETTY_FUNCTION__
,
2023 vrf
->name
, vrf
->vrf_id
);
2028 /* This is hook function for vrf delete call as part of vrf_init */
2029 static int ospf_vrf_delete(struct vrf
*vrf
)
2031 if (IS_DEBUG_OSPF_EVENT
)
2032 zlog_debug("%s: VRF Deletion: %s(%u)", __PRETTY_FUNCTION__
,
2033 vrf
->name
, vrf
->vrf_id
);
2038 static void ospf_set_redist_vrf_bitmaps(struct ospf
*ospf
)
2041 struct list
*red_list
;
2043 for (type
= 0; type
< ZEBRA_ROUTE_MAX
; type
++) {
2044 red_list
= ospf
->redist
[type
];
2047 if (IS_DEBUG_OSPF_EVENT
)
2049 "%s: setting redist vrf %d bitmap for type %d",
2050 __func__
, ospf
->vrf_id
, type
);
2051 vrf_bitmap_set(zclient
->redist
[AFI_IP
][type
], ospf
->vrf_id
);
2055 /* Enable OSPF VRF instance */
2056 static int ospf_vrf_enable(struct vrf
*vrf
)
2058 struct ospf
*ospf
= NULL
;
2059 vrf_id_t old_vrf_id
;
2062 if (IS_DEBUG_OSPF_EVENT
)
2063 zlog_debug("%s: VRF %s id %u enabled", __PRETTY_FUNCTION__
,
2064 vrf
->name
, vrf
->vrf_id
);
2066 ospf
= ospf_lookup_by_name(vrf
->name
);
2068 if (ospf
->name
&& strmatch(vrf
->name
, VRF_DEFAULT_NAME
)) {
2069 XFREE(MTYPE_OSPF_TOP
, ospf
->name
);
2072 old_vrf_id
= ospf
->vrf_id
;
2073 /* We have instance configured, link to VRF and make it "up". */
2074 ospf_vrf_link(ospf
, vrf
);
2075 if (IS_DEBUG_OSPF_EVENT
)
2077 "%s: ospf linked to vrf %s vrf_id %u (old id %u)",
2078 __PRETTY_FUNCTION__
, vrf
->name
, ospf
->vrf_id
,
2081 if (old_vrf_id
!= ospf
->vrf_id
) {
2082 frr_with_privs(&ospfd_privs
) {
2083 /* stop zebra redist to us for old vrf */
2084 zclient_send_dereg_requests(zclient
,
2087 ospf_set_redist_vrf_bitmaps(ospf
);
2089 /* start zebra redist to us for new vrf */
2090 ospf_zebra_vrf_register(ospf
);
2092 ret
= ospf_sock_init(ospf
);
2094 if (ret
< 0 || ospf
->fd
<= 0)
2096 thread_add_read(master
, ospf_read
, ospf
, ospf
->fd
,
2098 ospf
->oi_running
= 1;
2099 ospf_router_id_update(ospf
);
2106 /* Disable OSPF VRF instance */
2107 static int ospf_vrf_disable(struct vrf
*vrf
)
2109 struct ospf
*ospf
= NULL
;
2110 vrf_id_t old_vrf_id
= VRF_UNKNOWN
;
2112 if (vrf
->vrf_id
== VRF_DEFAULT
)
2115 if (IS_DEBUG_OSPF_EVENT
)
2116 zlog_debug("%s: VRF %s id %d disabled.", __PRETTY_FUNCTION__
,
2117 vrf
->name
, vrf
->vrf_id
);
2119 ospf
= ospf_lookup_by_name(vrf
->name
);
2121 old_vrf_id
= ospf
->vrf_id
;
2123 /* We have instance configured, unlink
2124 * from VRF and make it "down".
2126 ospf_vrf_unlink(ospf
, vrf
);
2127 ospf
->oi_running
= 0;
2128 if (IS_DEBUG_OSPF_EVENT
)
2129 zlog_debug("%s: ospf old_vrf_id %d unlinked",
2130 __PRETTY_FUNCTION__
, old_vrf_id
);
2131 thread_cancel(ospf
->t_read
);
2136 /* Note: This is a callback, the VRF will be deleted by the caller. */
2140 void ospf_vrf_init(void)
2142 vrf_init(ospf_vrf_new
, ospf_vrf_enable
, ospf_vrf_disable
,
2143 ospf_vrf_delete
, ospf_vrf_enable
);
2146 void ospf_vrf_terminate(void)
2151 const char *ospf_vrf_id_to_name(vrf_id_t vrf_id
)
2153 struct vrf
*vrf
= vrf_lookup_by_id(vrf_id
);
2155 return vrf
? vrf
->name
: "NIL";
2158 const char *ospf_get_name(const struct ospf
*ospf
)
2163 return VRF_DEFAULT_NAME
;