1 /* OSPF version 2 daemon program.
2 * Copyright (C) 1999, 2000 Toshiaki Takada
4 * This file is part of GNU Zebra.
6 * GNU Zebra is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation; either version 2, or (at your option) any
11 * GNU Zebra is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
16 * You should have received a copy of the GNU General Public License along
17 * with this program; see the file COPYING; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
33 #include "sockunion.h" /* for inet_aton () */
41 #include "lib_errors.h"
43 #include "ospfd/ospfd.h"
44 #include "ospfd/ospf_network.h"
45 #include "ospfd/ospf_interface.h"
46 #include "ospfd/ospf_ism.h"
47 #include "ospfd/ospf_asbr.h"
48 #include "ospfd/ospf_lsa.h"
49 #include "ospfd/ospf_lsdb.h"
50 #include "ospfd/ospf_neighbor.h"
51 #include "ospfd/ospf_nsm.h"
52 #include "ospfd/ospf_spf.h"
53 #include "ospfd/ospf_packet.h"
54 #include "ospfd/ospf_dump.h"
55 #include "ospfd/ospf_route.h"
56 #include "ospfd/ospf_zebra.h"
57 #include "ospfd/ospf_abr.h"
58 #include "ospfd/ospf_flood.h"
59 #include "ospfd/ospf_ase.h"
62 DEFINE_QOBJ_TYPE(ospf
)
64 /* OSPF process wide configuration. */
65 static struct ospf_master ospf_master
;
67 /* OSPF process wide configuration pointer to export. */
68 struct ospf_master
*om
;
70 extern struct zclient
*zclient
;
73 static void ospf_remove_vls_through_area(struct ospf
*, struct ospf_area
*);
74 static void ospf_network_free(struct ospf
*, struct ospf_network
*);
75 static void ospf_area_free(struct ospf_area
*);
76 static void ospf_network_run(struct prefix
*, struct ospf_area
*);
77 static void ospf_network_run_interface(struct ospf
*, struct interface
*,
78 struct prefix
*, struct ospf_area
*);
79 static void ospf_network_run_subnet(struct ospf
*, struct connected
*,
80 struct prefix
*, struct ospf_area
*);
81 static int ospf_network_match_iface(const struct connected
*,
82 const struct prefix
*);
83 static void ospf_finish_final(struct ospf
*);
85 #define OSPF_EXTERNAL_LSA_ORIGINATE_DELAY 1
87 void ospf_router_id_update(struct ospf
*ospf
)
89 struct vrf
*vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
90 struct in_addr router_id
, router_id_old
;
91 struct ospf_interface
*oi
;
92 struct interface
*ifp
;
93 struct listnode
*node
;
96 if (!ospf
->oi_running
) {
97 if (IS_DEBUG_OSPF_EVENT
)
99 "Router ospf not configured -- Router-ID update postponed");
103 if (IS_DEBUG_OSPF_EVENT
)
104 zlog_debug("Router-ID[OLD:%s]: Update",
105 inet_ntoa(ospf
->router_id
));
107 router_id_old
= ospf
->router_id
;
109 /* Select the router ID based on these priorities:
110 1. Statically assigned router ID is always the first choice.
111 2. If there is no statically assigned router ID, then try to stick
112 with the most recent value, since changing router ID's is very
114 3. Last choice: just go with whatever the zebra daemon recommends.
116 if (ospf
->router_id_static
.s_addr
!= 0)
117 router_id
= ospf
->router_id_static
;
118 else if (ospf
->router_id
.s_addr
!= 0)
119 router_id
= ospf
->router_id
;
121 router_id
= ospf
->router_id_zebra
;
123 if (IS_DEBUG_OSPF_EVENT
)
124 zlog_debug("Router-ID[OLD:%s]: Update to %s",
125 inet_ntoa(ospf
->router_id
), inet_ntoa(router_id
));
127 if (!IPV4_ADDR_SAME(&router_id_old
, &router_id
)) {
129 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
130 /* Some nbrs are identified by router_id, these needs
131 * to be rebuilt. Possible optimization would be to do
132 * oi->nbr_self->router_id = router_id for
133 * !(virtual | ptop) links
135 ospf_nbr_self_reset(oi
, router_id
);
138 /* If AS-external-LSA is queued, then flush those LSAs. */
139 if (router_id_old
.s_addr
== 0 && ospf
->external_origin
) {
140 /* Originate each redistributed external route. */
141 for (type
= 0; type
< ZEBRA_ROUTE_MAX
; type
++)
142 if (ospf
->external_origin
& (1 << type
))
145 ospf_external_lsa_originate_timer
,
147 /* Originate Deafult. */
148 if (ospf
->external_origin
& (1 << ZEBRA_ROUTE_MAX
))
149 thread_add_event(master
,
150 ospf_default_originate_timer
,
153 ospf
->external_origin
= 0;
156 /* Flush (inline) all external LSAs based on the OSPF_LSA_SELF
159 struct route_node
*rn
;
160 struct ospf_lsa
*lsa
;
162 LSDB_LOOP (EXTERNAL_LSDB(ospf
), rn
, lsa
)
163 if (IS_LSA_SELF(lsa
))
164 ospf_lsa_flush_schedule(ospf
, lsa
);
167 ospf
->router_id
= router_id
;
168 if (IS_DEBUG_OSPF_EVENT
)
169 zlog_debug("Router-ID[NEW:%s]: Update",
170 inet_ntoa(ospf
->router_id
));
172 /* Flush (inline) all external LSAs which now match the new
174 need to adjust the OSPF_LSA_SELF flag, so the flush doesn't
176 asserts in ospf_refresher_unregister_lsa(). This step is
178 because the current quagga code does look-up for
180 based on the self router-id alone but expects OSPF_LSA_SELF
184 struct route_node
*rn
;
185 struct ospf_lsa
*lsa
;
187 LSDB_LOOP (EXTERNAL_LSDB(ospf
), rn
, lsa
) {
188 /* AdvRouter and Router ID is the same. */
189 if (IPV4_ADDR_SAME(&lsa
->data
->adv_router
,
192 OSPF_LSA_SELF_CHECKED
);
193 SET_FLAG(lsa
->flags
, OSPF_LSA_SELF
);
194 ospf_lsa_flush_schedule(ospf
, lsa
);
199 /* Originate each redistributed external route. */
200 for (type
= 0; type
< ZEBRA_ROUTE_MAX
; type
++)
201 thread_add_event(master
,
202 ospf_external_lsa_originate_timer
,
204 thread_add_event(master
, ospf_default_originate_timer
, ospf
, 0,
207 /* update router-lsa's for each area */
208 ospf_router_lsa_update(ospf
);
210 /* update ospf_interface's */
211 FOR_ALL_INTERFACES (vrf
, ifp
)
212 ospf_if_update(ospf
, ifp
);
216 /* For OSPF area sort by area id. */
217 static int ospf_area_id_cmp(struct ospf_area
*a1
, struct ospf_area
*a2
)
219 if (ntohl(a1
->area_id
.s_addr
) > ntohl(a2
->area_id
.s_addr
))
221 if (ntohl(a1
->area_id
.s_addr
) < ntohl(a2
->area_id
.s_addr
))
226 /* Allocate new ospf structure. */
227 static struct ospf
*ospf_new(unsigned short instance
, const char *name
)
230 struct vrf
*vrf
= NULL
;
232 struct ospf
*new = XCALLOC(MTYPE_OSPF_TOP
, sizeof(struct ospf
));
234 new->instance
= instance
;
235 new->router_id
.s_addr
= htonl(0);
236 new->router_id_static
.s_addr
= htonl(0);
238 vrf
= vrf_lookup_by_name(name
);
240 new->vrf_id
= vrf
->vrf_id
;
242 new->vrf_id
= VRF_UNKNOWN
;
243 /* Freed in ospf_finish_final */
244 new->name
= XSTRDUP(MTYPE_OSPF_TOP
, name
);
245 if (IS_DEBUG_OSPF_EVENT
)
247 "%s: Create new ospf instance with vrf_name %s vrf_id %u",
248 __PRETTY_FUNCTION__
, name
, new->vrf_id
);
250 new->vrf_id
= VRF_DEFAULT
;
251 vrf
= vrf_lookup_by_id(VRF_DEFAULT
);
255 ospf_vrf_link(new, vrf
);
257 ospf_zebra_vrf_register(new);
259 new->abr_type
= OSPF_ABR_DEFAULT
;
260 new->oiflist
= list_new();
261 new->vlinks
= list_new();
262 new->areas
= list_new();
263 new->areas
->cmp
= (int (*)(void *, void *))ospf_area_id_cmp
;
264 new->networks
= route_table_init();
265 new->nbr_nbma
= route_table_init();
267 new->lsdb
= ospf_lsdb_new();
269 new->default_originate
= DEFAULT_ORIGINATE_NONE
;
271 new->passive_interface_default
= OSPF_IF_ACTIVE
;
273 new->new_external_route
= route_table_init();
274 new->old_external_route
= route_table_init();
275 new->external_lsas
= route_table_init();
277 new->stub_router_startup_time
= OSPF_STUB_ROUTER_UNCONFIGURED
;
278 new->stub_router_shutdown_time
= OSPF_STUB_ROUTER_UNCONFIGURED
;
279 new->stub_router_admin_set
= OSPF_STUB_ROUTER_ADMINISTRATIVE_UNSET
;
281 /* Distribute parameter init. */
282 for (i
= 0; i
<= ZEBRA_ROUTE_MAX
; i
++) {
285 new->default_metric
= -1;
286 new->ref_bandwidth
= OSPF_DEFAULT_REF_BANDWIDTH
;
289 new->min_ls_interval
= OSPF_MIN_LS_INTERVAL
;
290 new->min_ls_arrival
= OSPF_MIN_LS_ARRIVAL
;
292 /* SPF timer value init. */
293 new->spf_delay
= OSPF_SPF_DELAY_DEFAULT
;
294 new->spf_holdtime
= OSPF_SPF_HOLDTIME_DEFAULT
;
295 new->spf_max_holdtime
= OSPF_SPF_MAX_HOLDTIME_DEFAULT
;
296 new->spf_hold_multiplier
= 1;
299 new->maxage_delay
= OSPF_LSA_MAXAGE_REMOVE_DELAY_DEFAULT
;
300 new->maxage_lsa
= route_table_init();
301 new->t_maxage_walker
= NULL
;
302 thread_add_timer(master
, ospf_lsa_maxage_walker
, new,
303 OSPF_LSA_MAXAGE_CHECK_INTERVAL
, &new->t_maxage_walker
);
305 /* Distance table init. */
306 new->distance_table
= route_table_init();
308 new->lsa_refresh_queue
.index
= 0;
309 new->lsa_refresh_interval
= OSPF_LSA_REFRESH_INTERVAL_DEFAULT
;
310 new->t_lsa_refresher
= NULL
;
311 thread_add_timer(master
, ospf_lsa_refresh_walker
, new,
312 new->lsa_refresh_interval
, &new->t_lsa_refresher
);
313 new->lsa_refresher_started
= monotime(NULL
);
315 new->ibuf
= stream_new(OSPF_MAX_PACKET_SIZE
+ 1);
318 new->oi_write_q
= list_new();
319 new->write_oi_count
= OSPF_WRITE_INTERFACE_COUNT_DEFAULT
;
321 /* Enable "log-adjacency-changes" */
322 #if DFLT_OSPF_LOG_ADJACENCY_CHANGES
323 SET_FLAG(new->config
, OSPF_LOG_ADJACENCY_CHANGES
);
329 if ((ospf_sock_init(new)) < 0) {
330 if (new->vrf_id
!= VRF_UNKNOWN
)
333 "%s: ospf_sock_init is unable to open a socket",
337 thread_add_read(master
, ospf_read
, new, new->fd
, &new->t_read
);
342 struct ospf
*ospf_lookup_instance(unsigned short instance
)
345 struct listnode
*node
, *nnode
;
347 if (listcount(om
->ospf
) == 0)
350 for (ALL_LIST_ELEMENTS(om
->ospf
, node
, nnode
, ospf
))
351 if ((ospf
->instance
== 0 && instance
== 0)
352 || (ospf
->instance
&& instance
353 && ospf
->instance
== instance
))
359 static int ospf_is_ready(struct ospf
*ospf
)
361 /* OSPF must be on and Router-ID must be configured. */
362 if (!ospf
|| ospf
->router_id
.s_addr
== 0)
368 static void ospf_add(struct ospf
*ospf
)
370 listnode_add(om
->ospf
, ospf
);
373 static void ospf_delete(struct ospf
*ospf
)
375 listnode_delete(om
->ospf
, ospf
);
378 struct ospf
*ospf_lookup_by_inst_name(unsigned short instance
, const char *name
)
380 struct ospf
*ospf
= NULL
;
381 struct listnode
*node
, *nnode
;
383 if (name
== NULL
|| strmatch(name
, VRF_DEFAULT_NAME
))
384 return ospf_lookup_by_vrf_id(VRF_DEFAULT
);
386 for (ALL_LIST_ELEMENTS(om
->ospf
, node
, nnode
, ospf
)) {
387 if ((ospf
->instance
== instance
)
388 && ((ospf
->name
== NULL
&& name
== NULL
)
389 || (ospf
->name
&& name
390 && strcmp(ospf
->name
, name
) == 0)))
396 struct ospf
*ospf_get(unsigned short instance
, const char *name
)
400 /* vrf name provided call inst and name based api
401 * in case of no name pass default ospf instance */
403 ospf
= ospf_lookup_by_inst_name(instance
, name
);
405 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
408 ospf
= ospf_new(instance
, name
);
411 if (ospf
->router_id_static
.s_addr
== 0)
412 ospf_router_id_update(ospf
);
414 ospf_opaque_type11_lsa_init(ospf
);
420 struct ospf
*ospf_get_instance(unsigned short instance
)
424 ospf
= ospf_lookup_instance(instance
);
426 ospf
= ospf_new(instance
, NULL
/* VRF_DEFAULT*/);
429 if (ospf
->router_id_static
.s_addr
== 0) {
430 if (vrf_lookup_by_id(ospf
->vrf_id
))
431 ospf_router_id_update(ospf
);
433 if (IS_DEBUG_OSPF_EVENT
)
435 "%s: ospf VRF (id %d) is not active yet, skip router id update",
439 ospf_router_id_update(ospf
);
442 ospf_opaque_type11_lsa_init(ospf
);
448 struct ospf
*ospf_lookup_by_vrf_id(vrf_id_t vrf_id
)
450 struct vrf
*vrf
= NULL
;
452 vrf
= vrf_lookup_by_id(vrf_id
);
455 return (vrf
->info
) ? (struct ospf
*)vrf
->info
: NULL
;
458 /* It should only be used when processing incoming info update from zebra.
459 * Other situations, it is not sufficient to lookup the ospf instance by
460 * vrf_name only without using the instance number.
462 static struct ospf
*ospf_lookup_by_name(const char *vrf_name
)
464 struct ospf
*ospf
= NULL
;
465 struct listnode
*node
, *nnode
;
467 for (ALL_LIST_ELEMENTS(om
->ospf
, node
, nnode
, ospf
))
468 if ((ospf
->name
== NULL
&& vrf_name
== NULL
)
469 || (ospf
->name
&& vrf_name
470 && strcmp(ospf
->name
, vrf_name
) == 0))
475 /* Handle the second half of deferred shutdown. This is called either
476 * from the deferred-shutdown timer thread, or directly through
477 * ospf_deferred_shutdown_check.
479 * Function is to cleanup G-R state, if required then call ospf_finish_final
480 * to complete shutdown of this ospf instance. Possibly exit if the
481 * whole process is being shutdown and this was the last OSPF instance.
483 static void ospf_deferred_shutdown_finish(struct ospf
*ospf
)
485 ospf
->stub_router_shutdown_time
= OSPF_STUB_ROUTER_UNCONFIGURED
;
486 OSPF_TIMER_OFF(ospf
->t_deferred_shutdown
);
488 ospf_finish_final(ospf
);
490 /* *ospf is now invalid */
492 /* ospfd being shut-down? If so, was this the last ospf instance? */
493 if (CHECK_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
)
494 && (listcount(om
->ospf
) == 0)) {
501 /* Timer thread for G-R */
502 static int ospf_deferred_shutdown_timer(struct thread
*t
)
504 struct ospf
*ospf
= THREAD_ARG(t
);
506 ospf_deferred_shutdown_finish(ospf
);
511 /* Check whether deferred-shutdown must be scheduled, otherwise call
512 * down directly into second-half of instance shutdown.
514 static void ospf_deferred_shutdown_check(struct ospf
*ospf
)
516 unsigned long timeout
;
518 struct ospf_area
*area
;
520 /* deferred shutdown already running? */
521 if (ospf
->t_deferred_shutdown
)
524 /* Should we try push out max-metric LSAs? */
525 if (ospf
->stub_router_shutdown_time
!= OSPF_STUB_ROUTER_UNCONFIGURED
) {
526 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, ln
, area
)) {
527 SET_FLAG(area
->stub_router_state
,
528 OSPF_AREA_ADMIN_STUB_ROUTED
);
530 if (!CHECK_FLAG(area
->stub_router_state
,
531 OSPF_AREA_IS_STUB_ROUTED
))
532 ospf_router_lsa_update_area(area
);
534 timeout
= ospf
->stub_router_shutdown_time
;
536 /* No timer needed */
537 ospf_deferred_shutdown_finish(ospf
);
541 OSPF_TIMER_ON(ospf
->t_deferred_shutdown
, ospf_deferred_shutdown_timer
,
546 /* Shut down the entire process */
547 void ospf_terminate(void)
550 struct listnode
*node
, *nnode
;
552 /* shutdown already in progress */
553 if (CHECK_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
))
556 SET_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
);
558 /* exit immediately if OSPF not actually running */
559 if (listcount(om
->ospf
) == 0)
563 for (ALL_LIST_ELEMENTS(om
->ospf
, node
, nnode
, ospf
))
566 /* Cleanup route maps */
569 /* reverse prefix_list_init */
570 prefix_list_add_hook(NULL
);
571 prefix_list_delete_hook(NULL
);
574 /* Cleanup vrf info */
575 ospf_vrf_terminate();
577 /* Deliberately go back up, hopefully to thread scheduler, as
578 * One or more ospf_finish()'s may have deferred shutdown to a timer
581 zclient_stop(zclient
);
582 zclient_free(zclient
);
587 void ospf_finish(struct ospf
*ospf
)
589 /* let deferred shutdown decide */
590 ospf_deferred_shutdown_check(ospf
);
592 /* if ospf_deferred_shutdown returns, then ospf_finish_final is
593 * deferred to expiry of G-S timer thread. Return back up, hopefully
594 * to thread scheduler.
599 /* Final cleanup of ospf instance */
600 static void ospf_finish_final(struct ospf
*ospf
)
602 struct vrf
*vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
603 struct route_node
*rn
;
604 struct ospf_nbr_nbma
*nbr_nbma
;
605 struct ospf_lsa
*lsa
;
606 struct interface
*ifp
;
607 struct ospf_interface
*oi
;
608 struct ospf_area
*area
;
609 struct ospf_vl_data
*vl_data
;
610 struct listnode
*node
, *nnode
;
612 unsigned short instance
= 0;
616 ospf_opaque_type11_lsa_term(ospf
);
618 ospf_opaque_finish();
620 ospf_flush_self_originated_lsas_now(ospf
);
622 /* Unregister redistribution */
623 for (i
= 0; i
< ZEBRA_ROUTE_MAX
; i
++) {
624 struct list
*red_list
;
625 struct ospf_redist
*red
;
627 red_list
= ospf
->redist
[i
];
631 for (ALL_LIST_ELEMENTS(red_list
, node
, nnode
, red
))
632 ospf_redistribute_unset(ospf
, i
, red
->instance
);
634 ospf_redistribute_default_unset(ospf
);
636 for (ALL_LIST_ELEMENTS(ospf
->areas
, node
, nnode
, area
))
637 ospf_remove_vls_through_area(ospf
, area
);
639 for (ALL_LIST_ELEMENTS(ospf
->vlinks
, node
, nnode
, vl_data
))
640 ospf_vl_delete(ospf
, vl_data
);
642 list_delete(&ospf
->vlinks
);
644 /* Remove any ospf interface config params */
645 FOR_ALL_INTERFACES (vrf
, ifp
) {
646 struct ospf_if_params
*params
;
648 params
= IF_DEF_PARAMS(ifp
);
649 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
))
650 UNSET_IF_PARAM(params
, if_area
);
653 /* Reset interface. */
654 for (ALL_LIST_ELEMENTS(ospf
->oiflist
, node
, nnode
, oi
))
656 list_delete(&ospf
->oiflist
);
658 /* De-Register VRF */
659 ospf_zebra_vrf_deregister(ospf
);
661 /* Clear static neighbors */
662 for (rn
= route_top(ospf
->nbr_nbma
); rn
; rn
= route_next(rn
))
663 if ((nbr_nbma
= rn
->info
)) {
664 OSPF_POLL_TIMER_OFF(nbr_nbma
->t_poll
);
667 nbr_nbma
->nbr
->nbr_nbma
= NULL
;
668 nbr_nbma
->nbr
= NULL
;
672 listnode_delete(nbr_nbma
->oi
->nbr_nbma
,
677 XFREE(MTYPE_OSPF_NEIGHBOR_STATIC
, nbr_nbma
);
680 route_table_finish(ospf
->nbr_nbma
);
682 /* Clear networks and Areas. */
683 for (rn
= route_top(ospf
->networks
); rn
; rn
= route_next(rn
)) {
684 struct ospf_network
*network
;
686 if ((network
= rn
->info
) != NULL
) {
687 ospf_network_free(ospf
, network
);
689 route_unlock_node(rn
);
692 route_table_finish(ospf
->networks
);
694 for (ALL_LIST_ELEMENTS(ospf
->areas
, node
, nnode
, area
)) {
695 listnode_delete(ospf
->areas
, area
);
696 ospf_area_free(area
);
699 /* Cancel all timers. */
700 OSPF_TIMER_OFF(ospf
->t_external_lsa
);
701 OSPF_TIMER_OFF(ospf
->t_spf_calc
);
702 OSPF_TIMER_OFF(ospf
->t_ase_calc
);
703 OSPF_TIMER_OFF(ospf
->t_maxage
);
704 OSPF_TIMER_OFF(ospf
->t_maxage_walker
);
705 OSPF_TIMER_OFF(ospf
->t_abr_task
);
706 OSPF_TIMER_OFF(ospf
->t_asbr_check
);
707 OSPF_TIMER_OFF(ospf
->t_distribute_update
);
708 OSPF_TIMER_OFF(ospf
->t_lsa_refresher
);
709 OSPF_TIMER_OFF(ospf
->t_read
);
710 OSPF_TIMER_OFF(ospf
->t_write
);
711 OSPF_TIMER_OFF(ospf
->t_opaque_lsa_self
);
712 OSPF_TIMER_OFF(ospf
->t_sr_update
);
715 stream_free(ospf
->ibuf
);
717 LSDB_LOOP (OPAQUE_AS_LSDB(ospf
), rn
, lsa
)
718 ospf_discard_from_db(ospf
, ospf
->lsdb
, lsa
);
719 LSDB_LOOP (EXTERNAL_LSDB(ospf
), rn
, lsa
)
720 ospf_discard_from_db(ospf
, ospf
->lsdb
, lsa
);
722 ospf_lsdb_delete_all(ospf
->lsdb
);
723 ospf_lsdb_free(ospf
->lsdb
);
725 for (rn
= route_top(ospf
->maxage_lsa
); rn
; rn
= route_next(rn
)) {
726 if ((lsa
= rn
->info
) != NULL
) {
727 ospf_lsa_unlock(&lsa
);
730 route_unlock_node(rn
);
732 route_table_finish(ospf
->maxage_lsa
);
735 ospf_route_table_free(ospf
->old_table
);
736 if (ospf
->new_table
) {
737 ospf_route_delete(ospf
, ospf
->new_table
);
738 ospf_route_table_free(ospf
->new_table
);
741 ospf_rtrs_free(ospf
->old_rtrs
);
743 ospf_rtrs_free(ospf
->new_rtrs
);
744 if (ospf
->new_external_route
) {
745 ospf_route_delete(ospf
, ospf
->new_external_route
);
746 ospf_route_table_free(ospf
->new_external_route
);
748 if (ospf
->old_external_route
) {
749 ospf_route_delete(ospf
, ospf
->old_external_route
);
750 ospf_route_table_free(ospf
->old_external_route
);
752 if (ospf
->external_lsas
) {
753 ospf_ase_external_lsas_finish(ospf
->external_lsas
);
756 list_delete(&ospf
->areas
);
757 list_delete(&ospf
->oi_write_q
);
759 for (i
= ZEBRA_ROUTE_SYSTEM
; i
<= ZEBRA_ROUTE_MAX
; i
++) {
760 struct list
*ext_list
;
761 struct ospf_external
*ext
;
763 ext_list
= ospf
->external
[i
];
767 for (ALL_LIST_ELEMENTS_RO(ext_list
, node
, ext
)) {
768 if (ext
->external_info
)
769 for (rn
= route_top(ext
->external_info
); rn
;
770 rn
= route_next(rn
)) {
771 if (rn
->info
== NULL
)
774 XFREE(MTYPE_OSPF_EXTERNAL_INFO
,
777 route_unlock_node(rn
);
782 ospf_distance_reset(ospf
);
783 route_table_finish(ospf
->distance_table
);
785 if (!CHECK_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
))
786 instance
= ospf
->instance
;
791 vrf
= vrf_lookup_by_name(ospf
->name
);
793 ospf_vrf_unlink(ospf
, vrf
);
794 XFREE(MTYPE_OSPF_TOP
, ospf
->name
);
796 vrf
= vrf_lookup_by_id(VRF_DEFAULT
);
798 ospf_vrf_unlink(ospf
, vrf
);
801 XFREE(MTYPE_OSPF_TOP
, ospf
);
803 if (!CHECK_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
))
804 ospf_get_instance(instance
);
808 /* allocate new OSPF Area object */
809 static struct ospf_area
*ospf_area_new(struct ospf
*ospf
,
810 struct in_addr area_id
)
812 struct ospf_area
*new;
814 /* Allocate new config_network. */
815 new = XCALLOC(MTYPE_OSPF_AREA
, sizeof(struct ospf_area
));
819 new->area_id
= area_id
;
820 new->area_id_fmt
= OSPF_AREA_ID_FMT_DOTTEDQUAD
;
822 new->external_routing
= OSPF_AREA_DEFAULT
;
823 new->default_cost
= 1;
824 new->auth_type
= OSPF_AUTH_NULL
;
827 new->lsdb
= ospf_lsdb_new();
829 /* Self-originated LSAs initialize. */
830 new->router_lsa_self
= NULL
;
832 ospf_opaque_type10_lsa_init(new);
834 new->oiflist
= list_new();
835 new->ranges
= route_table_init();
837 if (area_id
.s_addr
== OSPF_AREA_BACKBONE
)
838 ospf
->backbone
= new;
843 static void ospf_area_free(struct ospf_area
*area
)
845 struct route_node
*rn
;
846 struct ospf_lsa
*lsa
;
848 ospf_opaque_type10_lsa_term(area
);
851 LSDB_LOOP (ROUTER_LSDB(area
), rn
, lsa
)
852 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
853 LSDB_LOOP (NETWORK_LSDB(area
), rn
, lsa
)
854 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
855 LSDB_LOOP (SUMMARY_LSDB(area
), rn
, lsa
)
856 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
857 LSDB_LOOP (ASBR_SUMMARY_LSDB(area
), rn
, lsa
)
858 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
860 LSDB_LOOP (NSSA_LSDB(area
), rn
, lsa
)
861 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
862 LSDB_LOOP (OPAQUE_AREA_LSDB(area
), rn
, lsa
)
863 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
864 LSDB_LOOP (OPAQUE_LINK_LSDB(area
), rn
, lsa
)
865 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
867 ospf_lsdb_delete_all(area
->lsdb
);
868 ospf_lsdb_free(area
->lsdb
);
870 ospf_lsa_unlock(&area
->router_lsa_self
);
872 route_table_finish(area
->ranges
);
873 list_delete(&area
->oiflist
);
875 if (EXPORT_NAME(area
))
876 free(EXPORT_NAME(area
));
878 if (IMPORT_NAME(area
))
879 free(IMPORT_NAME(area
));
882 OSPF_TIMER_OFF(area
->t_stub_router
);
883 OSPF_TIMER_OFF(area
->t_opaque_lsa_self
);
885 if (OSPF_IS_AREA_BACKBONE(area
))
886 area
->ospf
->backbone
= NULL
;
888 XFREE(MTYPE_OSPF_AREA
, area
);
891 void ospf_area_check_free(struct ospf
*ospf
, struct in_addr area_id
)
893 struct ospf_area
*area
;
895 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
896 if (area
&& listcount(area
->oiflist
) == 0 && area
->ranges
->top
== NULL
897 && !ospf_vl_count(ospf
, area
)
898 && area
->shortcut_configured
== OSPF_SHORTCUT_DEFAULT
899 && area
->external_routing
== OSPF_AREA_DEFAULT
900 && area
->no_summary
== 0 && area
->default_cost
== 1
901 && EXPORT_NAME(area
) == NULL
&& IMPORT_NAME(area
) == NULL
902 && area
->auth_type
== OSPF_AUTH_NULL
) {
903 listnode_delete(ospf
->areas
, area
);
904 ospf_area_free(area
);
908 struct ospf_area
*ospf_area_get(struct ospf
*ospf
, struct in_addr area_id
)
910 struct ospf_area
*area
;
912 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
914 area
= ospf_area_new(ospf
, area_id
);
915 listnode_add_sort(ospf
->areas
, area
);
916 ospf_check_abr_status(ospf
);
917 if (ospf
->stub_router_admin_set
918 == OSPF_STUB_ROUTER_ADMINISTRATIVE_SET
) {
919 SET_FLAG(area
->stub_router_state
,
920 OSPF_AREA_ADMIN_STUB_ROUTED
);
927 struct ospf_area
*ospf_area_lookup_by_area_id(struct ospf
*ospf
,
928 struct in_addr area_id
)
930 struct ospf_area
*area
;
931 struct listnode
*node
;
933 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
))
934 if (IPV4_ADDR_SAME(&area
->area_id
, &area_id
))
940 void ospf_area_add_if(struct ospf_area
*area
, struct ospf_interface
*oi
)
942 listnode_add(area
->oiflist
, oi
);
945 void ospf_area_del_if(struct ospf_area
*area
, struct ospf_interface
*oi
)
947 listnode_delete(area
->oiflist
, oi
);
951 static void add_ospf_interface(struct connected
*co
, struct ospf_area
*area
)
953 struct ospf_interface
*oi
;
955 oi
= ospf_if_new(area
->ospf
, co
->ifp
, co
->address
);
960 oi
->params
= ospf_lookup_if_params(co
->ifp
, oi
->address
->u
.prefix4
);
961 oi
->output_cost
= ospf_if_get_output_cost(oi
);
963 /* Relate ospf interface to ospf instance. */
964 oi
->ospf
= area
->ospf
;
966 /* update network type as interface flag */
967 /* If network type is specified previously,
968 skip network type setting. */
969 oi
->type
= IF_DEF_PARAMS(co
->ifp
)->type
;
971 /* Add pseudo neighbor. */
972 ospf_nbr_self_reset(oi
, oi
->ospf
->router_id
);
974 ospf_area_add_if(oi
->area
, oi
);
977 * if router_id is not configured, dont bring up
979 * ospf_router_id_update() will call ospf_if_update
980 * whenever r-id is configured instead.
982 if ((area
->ospf
->router_id
.s_addr
!= 0) && if_is_operative(co
->ifp
))
986 static void update_redistributed(struct ospf
*ospf
, int add_to_ospf
)
988 struct route_node
*rn
;
989 struct external_info
*ei
;
990 struct ospf_external
*ext
;
992 if (ospf_is_type_redistributed(ospf
, ZEBRA_ROUTE_CONNECT
, 0)) {
993 ext
= ospf_external_lookup(ospf
, ZEBRA_ROUTE_CONNECT
, 0);
994 if ((ext
) && EXTERNAL_INFO(ext
)) {
995 for (rn
= route_top(EXTERNAL_INFO(ext
)); rn
;
996 rn
= route_next(rn
)) {
1002 if (ospf_external_info_find_lsa(ospf
,
1004 if (!ospf_distribute_check_connected(
1006 ospf_external_lsa_flush(
1009 ei
->ifindex
/*, ei->nexthop */);
1011 if (!ospf_external_info_find_lsa(
1013 if (ospf_distribute_check_connected(
1015 ospf_external_lsa_originate(
1023 /* Config network statement related functions. */
1024 static struct ospf_network
*ospf_network_new(struct in_addr area_id
)
1026 struct ospf_network
*new;
1027 new = XCALLOC(MTYPE_OSPF_NETWORK
, sizeof(struct ospf_network
));
1029 new->area_id
= area_id
;
1030 new->area_id_fmt
= OSPF_AREA_ID_FMT_DOTTEDQUAD
;
1035 static void ospf_network_free(struct ospf
*ospf
, struct ospf_network
*network
)
1037 ospf_area_check_free(ospf
, network
->area_id
);
1038 ospf_schedule_abr_task(ospf
);
1039 XFREE(MTYPE_OSPF_NETWORK
, network
);
1042 int ospf_network_set(struct ospf
*ospf
, struct prefix_ipv4
*p
,
1043 struct in_addr area_id
, int df
)
1045 struct ospf_network
*network
;
1046 struct ospf_area
*area
;
1047 struct route_node
*rn
;
1049 rn
= route_node_get(ospf
->networks
, (struct prefix
*)p
);
1052 route_unlock_node(rn
);
1054 if (IPV4_ADDR_SAME(&area_id
, &network
->area_id
)) {
1057 /* There is already same network statement. */
1062 rn
->info
= network
= ospf_network_new(area_id
);
1063 network
->area_id_fmt
= df
;
1064 area
= ospf_area_get(ospf
, area_id
);
1065 ospf_area_display_format_set(ospf
, area
, df
);
1067 /* Run network config now. */
1068 ospf_network_run((struct prefix
*)p
, area
);
1070 /* Update connected redistribute. */
1071 update_redistributed(ospf
, 1); /* interfaces possibly added */
1073 ospf_area_check_free(ospf
, area_id
);
1078 int ospf_network_unset(struct ospf
*ospf
, struct prefix_ipv4
*p
,
1079 struct in_addr area_id
)
1081 struct route_node
*rn
;
1082 struct ospf_network
*network
;
1083 struct listnode
*node
, *nnode
;
1084 struct ospf_interface
*oi
;
1086 rn
= route_node_lookup(ospf
->networks
, (struct prefix
*)p
);
1091 route_unlock_node(rn
);
1092 if (!IPV4_ADDR_SAME(&area_id
, &network
->area_id
))
1095 ospf_network_free(ospf
, rn
->info
);
1097 route_unlock_node(rn
); /* initial reference */
1099 /* Find interfaces that are not configured already. */
1100 for (ALL_LIST_ELEMENTS(ospf
->oiflist
, node
, nnode
, oi
)) {
1102 if (oi
->type
== OSPF_IFTYPE_VIRTUALLINK
)
1105 ospf_network_run_subnet(ospf
, oi
->connected
, NULL
, NULL
);
1108 /* Update connected redistribute. */
1109 update_redistributed(ospf
, 0); /* interfaces possibly removed */
1110 ospf_area_check_free(ospf
, area_id
);
1115 /* Ensure there's an OSPF instance, as "ip ospf area" enabled OSPF means
1116 * there might not be any 'router ospf' config.
1118 * Otherwise, doesn't do anything different to ospf_if_update for now
1120 void ospf_interface_area_set(struct ospf
*ospf
, struct interface
*ifp
)
1125 ospf_if_update(ospf
, ifp
);
1126 /* if_update does a update_redistributed */
1131 void ospf_interface_area_unset(struct ospf
*ospf
, struct interface
*ifp
)
1133 struct route_node
*rn_oi
;
1136 return; /* Ospf not ready yet */
1138 /* Find interfaces that may need to be removed. */
1139 for (rn_oi
= route_top(IF_OIFS(ifp
)); rn_oi
;
1140 rn_oi
= route_next(rn_oi
)) {
1141 struct ospf_interface
*oi
= NULL
;
1143 if ((oi
= rn_oi
->info
) == NULL
)
1146 if (oi
->type
== OSPF_IFTYPE_VIRTUALLINK
)
1149 ospf_network_run_subnet(ospf
, oi
->connected
, NULL
, NULL
);
1152 /* Update connected redistribute. */
1153 update_redistributed(ospf
, 0); /* interfaces possibly removed */
1156 bool ospf_interface_area_is_already_set(struct ospf
*ospf
,
1157 struct interface
*ifp
)
1159 struct route_node
*rn_oi
;
1162 return false; /* Ospf not ready yet */
1164 /* Find interfaces that may need to be removed. */
1165 for (rn_oi
= route_top(IF_OIFS(ifp
)); rn_oi
;
1166 rn_oi
= route_next(rn_oi
)) {
1167 struct ospf_interface
*oi
= rn_oi
->info
;
1172 if (oi
->type
== OSPF_IFTYPE_VIRTUALLINK
)
1174 /* at least one route covered by interface
1175 * that implies already done
1182 /* Check whether interface matches given network
1183 * returns: 1, true. 0, false
1185 static int ospf_network_match_iface(const struct connected
*co
,
1186 const struct prefix
*net
)
1188 /* new approach: more elegant and conceptually clean */
1189 return prefix_match_network_statement(net
, CONNECTED_PREFIX(co
));
1192 static void ospf_update_interface_area(struct connected
*co
,
1193 struct ospf_area
*area
)
1195 struct ospf_interface
*oi
= ospf_if_table_lookup(co
->ifp
, co
->address
);
1197 /* nothing to be done case */
1198 if (oi
&& oi
->area
== area
) {
1205 add_ospf_interface(co
, area
);
1208 /* Run OSPF for the given subnet, taking into account the following
1209 * possible sources of area configuration, in the given order of preference:
1211 * - Whether there is interface+address specific area configuration
1212 * - Whether there is a default area for the interface
1213 * - Whether there is an area given as a parameter.
1214 * - If no specific network prefix/area is supplied, whether there's
1215 * a matching network configured.
1217 static void ospf_network_run_subnet(struct ospf
*ospf
, struct connected
*co
,
1219 struct ospf_area
*given_area
)
1221 struct ospf_interface
*oi
;
1222 struct ospf_if_params
*params
;
1223 struct ospf_area
*area
= NULL
;
1224 struct route_node
*rn
;
1227 if (CHECK_FLAG(co
->flags
, ZEBRA_IFA_SECONDARY
))
1230 if (co
->address
->family
!= AF_INET
)
1233 /* Try determine the appropriate area for this interface + address
1234 * Start by checking interface config
1236 params
= ospf_lookup_if_params(co
->ifp
, co
->address
->u
.prefix4
);
1237 if (params
&& OSPF_IF_PARAM_CONFIGURED(params
, if_area
))
1238 area
= ospf_area_get(ospf
, params
->if_area
);
1240 params
= IF_DEF_PARAMS(co
->ifp
);
1241 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
))
1242 area
= ospf_area_get(ospf
, params
->if_area
);
1245 /* If we've found an interface and/or addr specific area, then we're
1249 ospf_update_interface_area(co
, area
);
1253 /* Otherwise, only remaining possibility is a matching network statement
1256 assert(given_area
!= NULL
);
1258 /* Which either was supplied as a parameter.. (e.g. cause a new
1259 * network/area was just added)..
1261 if (p
->family
== co
->address
->family
1262 && ospf_network_match_iface(co
, p
))
1263 ospf_update_interface_area(co
, given_area
);
1268 /* Else we have to search the existing network/area config to see
1271 for (rn
= route_top(ospf
->networks
); rn
; rn
= route_next(rn
))
1272 if (rn
->info
!= NULL
&& ospf_network_match_iface(co
, &rn
->p
)) {
1273 struct ospf_network
*network
=
1274 (struct ospf_network
*)rn
->info
;
1275 area
= ospf_area_get(ospf
, network
->area_id
);
1276 ospf_update_interface_area(co
, area
);
1280 /* If the subnet isn't in any area, deconfigure */
1281 if (!configed
&& (oi
= ospf_if_table_lookup(co
->ifp
, co
->address
)))
1285 static void ospf_network_run_interface(struct ospf
*ospf
, struct interface
*ifp
,
1287 struct ospf_area
*given_area
)
1289 struct listnode
*cnode
;
1290 struct connected
*co
;
1292 if (memcmp(ifp
->name
, "VLINK", 5) == 0)
1295 /* Network prefix without area is nonsensical */
1297 assert(given_area
!= NULL
);
1299 /* if interface prefix is match specified prefix,
1300 then create socket and join multicast group. */
1301 for (ALL_LIST_ELEMENTS_RO(ifp
->connected
, cnode
, co
))
1302 ospf_network_run_subnet(ospf
, co
, p
, given_area
);
1305 static void ospf_network_run(struct prefix
*p
, struct ospf_area
*area
)
1307 struct vrf
*vrf
= vrf_lookup_by_id(area
->ospf
->vrf_id
);
1308 struct interface
*ifp
;
1310 /* Schedule Router ID Update. */
1311 if (area
->ospf
->router_id
.s_addr
== 0)
1312 ospf_router_id_update(area
->ospf
);
1314 /* Get target interface. */
1315 FOR_ALL_INTERFACES (vrf
, ifp
)
1316 ospf_network_run_interface(area
->ospf
, ifp
, p
, area
);
1319 void ospf_ls_upd_queue_empty(struct ospf_interface
*oi
)
1321 struct route_node
*rn
;
1322 struct listnode
*node
, *nnode
;
1324 struct ospf_lsa
*lsa
;
1326 /* empty ls update queue */
1327 for (rn
= route_top(oi
->ls_upd_queue
); rn
; rn
= route_next(rn
))
1328 if ((lst
= (struct list
*)rn
->info
)) {
1329 for (ALL_LIST_ELEMENTS(lst
, node
, nnode
, lsa
))
1330 ospf_lsa_unlock(&lsa
); /* oi->ls_upd_queue */
1335 /* remove update event */
1336 if (oi
->t_ls_upd_event
) {
1337 thread_cancel(oi
->t_ls_upd_event
);
1338 oi
->t_ls_upd_event
= NULL
;
1342 void ospf_if_update(struct ospf
*ospf
, struct interface
*ifp
)
1348 if (IS_DEBUG_OSPF_EVENT
)
1350 "%s: interface %s ifp->vrf_id %u ospf vrf %s vrf_id %u router_id %s",
1351 __PRETTY_FUNCTION__
, ifp
->name
, ifp
->vrf_id
,
1352 ospf_vrf_id_to_name(ospf
->vrf_id
), ospf
->vrf_id
,
1353 inet_ntoa(ospf
->router_id
));
1355 /* OSPF must be ready. */
1356 if (!ospf_is_ready(ospf
))
1359 ospf_network_run_interface(ospf
, ifp
, NULL
, NULL
);
1361 /* Update connected redistribute. */
1362 update_redistributed(ospf
, 1);
1365 void ospf_remove_vls_through_area(struct ospf
*ospf
, struct ospf_area
*area
)
1367 struct listnode
*node
, *nnode
;
1368 struct ospf_vl_data
*vl_data
;
1370 for (ALL_LIST_ELEMENTS(ospf
->vlinks
, node
, nnode
, vl_data
))
1371 if (IPV4_ADDR_SAME(&vl_data
->vl_area_id
, &area
->area_id
))
1372 ospf_vl_delete(ospf
, vl_data
);
1376 static const struct message ospf_area_type_msg
[] = {
1377 {OSPF_AREA_DEFAULT
, "Default"},
1378 {OSPF_AREA_STUB
, "Stub"},
1379 {OSPF_AREA_NSSA
, "NSSA"},
1382 static void ospf_area_type_set(struct ospf_area
*area
, int type
)
1384 struct listnode
*node
;
1385 struct ospf_interface
*oi
;
1387 if (area
->external_routing
== type
) {
1388 if (IS_DEBUG_OSPF_EVENT
)
1389 zlog_debug("Area[%s]: Types are the same, ignored.",
1390 inet_ntoa(area
->area_id
));
1394 area
->external_routing
= type
;
1396 if (IS_DEBUG_OSPF_EVENT
)
1397 zlog_debug("Area[%s]: Configured as %s",
1398 inet_ntoa(area
->area_id
),
1399 lookup_msg(ospf_area_type_msg
, type
, NULL
));
1401 switch (area
->external_routing
) {
1402 case OSPF_AREA_DEFAULT
:
1403 for (ALL_LIST_ELEMENTS_RO(area
->oiflist
, node
, oi
))
1404 if (oi
->nbr_self
!= NULL
) {
1405 UNSET_FLAG(oi
->nbr_self
->options
,
1407 SET_FLAG(oi
->nbr_self
->options
, OSPF_OPTION_E
);
1410 case OSPF_AREA_STUB
:
1411 for (ALL_LIST_ELEMENTS_RO(area
->oiflist
, node
, oi
))
1412 if (oi
->nbr_self
!= NULL
) {
1413 if (IS_DEBUG_OSPF_EVENT
)
1415 "setting options on %s accordingly",
1417 UNSET_FLAG(oi
->nbr_self
->options
,
1419 UNSET_FLAG(oi
->nbr_self
->options
,
1421 if (IS_DEBUG_OSPF_EVENT
)
1422 zlog_debug("options set on %s: %x",
1423 IF_NAME(oi
), OPTIONS(oi
));
1426 case OSPF_AREA_NSSA
:
1427 for (ALL_LIST_ELEMENTS_RO(area
->oiflist
, node
, oi
))
1428 if (oi
->nbr_self
!= NULL
) {
1430 "setting nssa options on %s accordingly",
1432 UNSET_FLAG(oi
->nbr_self
->options
,
1434 SET_FLAG(oi
->nbr_self
->options
, OSPF_OPTION_NP
);
1435 zlog_debug("options set on %s: %x", IF_NAME(oi
),
1443 ospf_router_lsa_update_area(area
);
1444 ospf_schedule_abr_task(area
->ospf
);
1447 int ospf_area_shortcut_set(struct ospf
*ospf
, struct ospf_area
*area
, int mode
)
1449 if (area
->shortcut_configured
== mode
)
1452 area
->shortcut_configured
= mode
;
1453 ospf_router_lsa_update_area(area
);
1454 ospf_schedule_abr_task(ospf
);
1456 ospf_area_check_free(ospf
, area
->area_id
);
1461 int ospf_area_shortcut_unset(struct ospf
*ospf
, struct ospf_area
*area
)
1463 area
->shortcut_configured
= OSPF_SHORTCUT_DEFAULT
;
1464 ospf_router_lsa_update_area(area
);
1465 ospf_area_check_free(ospf
, area
->area_id
);
1466 ospf_schedule_abr_task(ospf
);
1471 static int ospf_area_vlink_count(struct ospf
*ospf
, struct ospf_area
*area
)
1473 struct ospf_vl_data
*vl
;
1474 struct listnode
*node
;
1477 for (ALL_LIST_ELEMENTS_RO(ospf
->vlinks
, node
, vl
))
1478 if (IPV4_ADDR_SAME(&vl
->vl_area_id
, &area
->area_id
))
1484 int ospf_area_display_format_set(struct ospf
*ospf
, struct ospf_area
*area
,
1487 area
->area_id_fmt
= df
;
1492 int ospf_area_stub_set(struct ospf
*ospf
, struct in_addr area_id
)
1494 struct ospf_area
*area
;
1496 area
= ospf_area_get(ospf
, area_id
);
1497 if (ospf_area_vlink_count(ospf
, area
))
1500 if (area
->external_routing
!= OSPF_AREA_STUB
)
1501 ospf_area_type_set(area
, OSPF_AREA_STUB
);
1506 int ospf_area_stub_unset(struct ospf
*ospf
, struct in_addr area_id
)
1508 struct ospf_area
*area
;
1510 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1514 if (area
->external_routing
== OSPF_AREA_STUB
)
1515 ospf_area_type_set(area
, OSPF_AREA_DEFAULT
);
1517 ospf_area_check_free(ospf
, area_id
);
1522 int ospf_area_no_summary_set(struct ospf
*ospf
, struct in_addr area_id
)
1524 struct ospf_area
*area
;
1526 area
= ospf_area_get(ospf
, area_id
);
1527 area
->no_summary
= 1;
1532 int ospf_area_no_summary_unset(struct ospf
*ospf
, struct in_addr area_id
)
1534 struct ospf_area
*area
;
1536 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1540 area
->no_summary
= 0;
1541 ospf_area_check_free(ospf
, area_id
);
1546 int ospf_area_nssa_no_summary_set(struct ospf
*ospf
, struct in_addr area_id
)
1548 struct ospf_area
*area
;
1550 area
= ospf_area_get(ospf
, area_id
);
1551 if (ospf_area_vlink_count(ospf
, area
))
1554 if (area
->external_routing
!= OSPF_AREA_NSSA
) {
1555 ospf_area_type_set(area
, OSPF_AREA_NSSA
);
1557 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1560 ospf_area_no_summary_set(ospf
, area_id
);
1565 int ospf_area_nssa_set(struct ospf
*ospf
, struct in_addr area_id
)
1567 struct ospf_area
*area
;
1569 area
= ospf_area_get(ospf
, area_id
);
1570 if (ospf_area_vlink_count(ospf
, area
))
1573 if (area
->external_routing
!= OSPF_AREA_NSSA
) {
1574 ospf_area_type_set(area
, OSPF_AREA_NSSA
);
1577 /* set NSSA area defaults */
1578 area
->no_summary
= 0;
1579 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1580 area
->NSSATranslatorState
= OSPF_NSSA_TRANSLATE_DISABLED
;
1581 area
->NSSATranslatorStabilityInterval
=
1582 OSPF_NSSA_TRANS_STABLE_DEFAULT
;
1587 int ospf_area_nssa_unset(struct ospf
*ospf
, struct in_addr area_id
, int argc
)
1589 struct ospf_area
*area
;
1591 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1595 /* argc < 5 -> 'no area x nssa' */
1596 if (argc
< 5 && area
->external_routing
== OSPF_AREA_NSSA
) {
1598 /* set NSSA area defaults */
1599 area
->no_summary
= 0;
1600 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1601 area
->NSSATranslatorState
= OSPF_NSSA_TRANSLATE_DISABLED
;
1602 area
->NSSATranslatorStabilityInterval
=
1603 OSPF_NSSA_TRANS_STABLE_DEFAULT
;
1604 ospf_area_type_set(area
, OSPF_AREA_DEFAULT
);
1606 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1609 ospf_area_check_free(ospf
, area_id
);
1614 int ospf_area_nssa_translator_role_set(struct ospf
*ospf
,
1615 struct in_addr area_id
, int role
)
1617 struct ospf_area
*area
;
1619 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1623 area
->NSSATranslatorRole
= role
;
1629 /* XXX: unused? Leave for symmetry? */
1631 ospf_area_nssa_translator_role_unset (struct ospf
*ospf
,
1632 struct in_addr area_id
)
1634 struct ospf_area
*area
;
1636 area
= ospf_area_lookup_by_area_id (ospf
, area_id
);
1640 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1642 ospf_area_check_free (ospf
, area_id
);
1648 int ospf_area_export_list_set(struct ospf
*ospf
, struct ospf_area
*area
,
1649 const char *list_name
)
1651 struct access_list
*list
;
1652 list
= access_list_lookup(AFI_IP
, list_name
);
1654 EXPORT_LIST(area
) = list
;
1656 if (EXPORT_NAME(area
))
1657 free(EXPORT_NAME(area
));
1659 EXPORT_NAME(area
) = strdup(list_name
);
1660 ospf_schedule_abr_task(ospf
);
1665 int ospf_area_export_list_unset(struct ospf
*ospf
, struct ospf_area
*area
)
1668 EXPORT_LIST(area
) = 0;
1670 if (EXPORT_NAME(area
))
1671 free(EXPORT_NAME(area
));
1673 EXPORT_NAME(area
) = NULL
;
1675 ospf_area_check_free(ospf
, area
->area_id
);
1677 ospf_schedule_abr_task(ospf
);
1682 int ospf_area_import_list_set(struct ospf
*ospf
, struct ospf_area
*area
,
1685 struct access_list
*list
;
1686 list
= access_list_lookup(AFI_IP
, name
);
1688 IMPORT_LIST(area
) = list
;
1690 if (IMPORT_NAME(area
))
1691 free(IMPORT_NAME(area
));
1693 IMPORT_NAME(area
) = strdup(name
);
1694 ospf_schedule_abr_task(ospf
);
1699 int ospf_area_import_list_unset(struct ospf
*ospf
, struct ospf_area
*area
)
1701 IMPORT_LIST(area
) = 0;
1703 if (IMPORT_NAME(area
))
1704 free(IMPORT_NAME(area
));
1706 IMPORT_NAME(area
) = NULL
;
1707 ospf_area_check_free(ospf
, area
->area_id
);
1709 ospf_schedule_abr_task(ospf
);
1714 int ospf_timers_refresh_set(struct ospf
*ospf
, int interval
)
1718 if (ospf
->lsa_refresh_interval
== interval
)
1721 time_left
= ospf
->lsa_refresh_interval
1722 - (monotime(NULL
) - ospf
->lsa_refresher_started
);
1724 if (time_left
> interval
) {
1725 OSPF_TIMER_OFF(ospf
->t_lsa_refresher
);
1726 thread_add_timer(master
, ospf_lsa_refresh_walker
, ospf
,
1727 interval
, &ospf
->t_lsa_refresher
);
1729 ospf
->lsa_refresh_interval
= interval
;
1734 int ospf_timers_refresh_unset(struct ospf
*ospf
)
1738 time_left
= ospf
->lsa_refresh_interval
1739 - (monotime(NULL
) - ospf
->lsa_refresher_started
);
1741 if (time_left
> OSPF_LSA_REFRESH_INTERVAL_DEFAULT
) {
1742 OSPF_TIMER_OFF(ospf
->t_lsa_refresher
);
1743 ospf
->t_lsa_refresher
= NULL
;
1744 thread_add_timer(master
, ospf_lsa_refresh_walker
, ospf
,
1745 OSPF_LSA_REFRESH_INTERVAL_DEFAULT
,
1746 &ospf
->t_lsa_refresher
);
1749 ospf
->lsa_refresh_interval
= OSPF_LSA_REFRESH_INTERVAL_DEFAULT
;
1755 static struct ospf_nbr_nbma
*ospf_nbr_nbma_new(void)
1757 struct ospf_nbr_nbma
*nbr_nbma
;
1759 nbr_nbma
= XCALLOC(MTYPE_OSPF_NEIGHBOR_STATIC
,
1760 sizeof(struct ospf_nbr_nbma
));
1762 nbr_nbma
->priority
= OSPF_NEIGHBOR_PRIORITY_DEFAULT
;
1763 nbr_nbma
->v_poll
= OSPF_POLL_INTERVAL_DEFAULT
;
1768 static void ospf_nbr_nbma_free(struct ospf_nbr_nbma
*nbr_nbma
)
1770 XFREE(MTYPE_OSPF_NEIGHBOR_STATIC
, nbr_nbma
);
1773 static void ospf_nbr_nbma_delete(struct ospf
*ospf
,
1774 struct ospf_nbr_nbma
*nbr_nbma
)
1776 struct route_node
*rn
;
1777 struct prefix_ipv4 p
;
1780 p
.prefix
= nbr_nbma
->addr
;
1781 p
.prefixlen
= IPV4_MAX_BITLEN
;
1783 rn
= route_node_lookup(ospf
->nbr_nbma
, (struct prefix
*)&p
);
1785 ospf_nbr_nbma_free(rn
->info
);
1787 route_unlock_node(rn
);
1788 route_unlock_node(rn
);
1792 static void ospf_nbr_nbma_down(struct ospf_nbr_nbma
*nbr_nbma
)
1794 OSPF_TIMER_OFF(nbr_nbma
->t_poll
);
1796 if (nbr_nbma
->nbr
) {
1797 nbr_nbma
->nbr
->nbr_nbma
= NULL
;
1798 OSPF_NSM_EVENT_EXECUTE(nbr_nbma
->nbr
, NSM_KillNbr
);
1802 listnode_delete(nbr_nbma
->oi
->nbr_nbma
, nbr_nbma
);
1805 static void ospf_nbr_nbma_add(struct ospf_nbr_nbma
*nbr_nbma
,
1806 struct ospf_interface
*oi
)
1808 struct ospf_neighbor
*nbr
;
1809 struct route_node
*rn
;
1812 if (oi
->type
!= OSPF_IFTYPE_NBMA
)
1815 if (nbr_nbma
->nbr
!= NULL
)
1818 if (IPV4_ADDR_SAME(&oi
->nbr_self
->address
.u
.prefix4
, &nbr_nbma
->addr
))
1822 listnode_add(oi
->nbr_nbma
, nbr_nbma
);
1824 /* Get neighbor information from table. */
1826 p
.prefixlen
= IPV4_MAX_BITLEN
;
1827 p
.u
.prefix4
= nbr_nbma
->addr
;
1829 rn
= route_node_get(oi
->nbrs
, (struct prefix
*)&p
);
1832 nbr
->nbr_nbma
= nbr_nbma
;
1833 nbr_nbma
->nbr
= nbr
;
1835 route_unlock_node(rn
);
1837 nbr
= rn
->info
= ospf_nbr_new(oi
);
1838 nbr
->state
= NSM_Down
;
1839 nbr
->src
= nbr_nbma
->addr
;
1840 nbr
->nbr_nbma
= nbr_nbma
;
1841 nbr
->priority
= nbr_nbma
->priority
;
1844 nbr_nbma
->nbr
= nbr
;
1846 OSPF_NSM_EVENT_EXECUTE(nbr
, NSM_Start
);
1850 void ospf_nbr_nbma_if_update(struct ospf
*ospf
, struct ospf_interface
*oi
)
1852 struct ospf_nbr_nbma
*nbr_nbma
;
1853 struct route_node
*rn
;
1854 struct prefix_ipv4 p
;
1856 if (oi
->type
!= OSPF_IFTYPE_NBMA
)
1859 for (rn
= route_top(ospf
->nbr_nbma
); rn
; rn
= route_next(rn
))
1860 if ((nbr_nbma
= rn
->info
))
1861 if (nbr_nbma
->oi
== NULL
&& nbr_nbma
->nbr
== NULL
) {
1863 p
.prefix
= nbr_nbma
->addr
;
1864 p
.prefixlen
= IPV4_MAX_BITLEN
;
1866 if (prefix_match(oi
->address
,
1867 (struct prefix
*)&p
))
1868 ospf_nbr_nbma_add(nbr_nbma
, oi
);
1872 struct ospf_nbr_nbma
*ospf_nbr_nbma_lookup(struct ospf
*ospf
,
1873 struct in_addr nbr_addr
)
1875 struct route_node
*rn
;
1876 struct prefix_ipv4 p
;
1879 p
.prefix
= nbr_addr
;
1880 p
.prefixlen
= IPV4_MAX_BITLEN
;
1882 rn
= route_node_lookup(ospf
->nbr_nbma
, (struct prefix
*)&p
);
1884 route_unlock_node(rn
);
1890 struct ospf_nbr_nbma
*ospf_nbr_nbma_lookup_next(struct ospf
*ospf
,
1891 struct in_addr
*addr
, int first
)
1894 struct ospf_nbr_nbma
*nbr_nbma
;
1895 struct listnode
*node
;
1902 for (ALL_LIST_ELEMENTS_RO (ospf
->nbr_nbma
, node
, nbr_nbma
))
1906 *addr
= nbr_nbma
->addr
;
1909 else if (ntohl (nbr_nbma
->addr
.s_addr
) > ntohl (addr
->s_addr
))
1911 *addr
= nbr_nbma
->addr
;
1919 int ospf_nbr_nbma_set(struct ospf
*ospf
, struct in_addr nbr_addr
)
1921 struct ospf_nbr_nbma
*nbr_nbma
;
1922 struct ospf_interface
*oi
;
1923 struct prefix_ipv4 p
;
1924 struct route_node
*rn
;
1925 struct listnode
*node
;
1927 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
1931 nbr_nbma
= ospf_nbr_nbma_new();
1932 nbr_nbma
->addr
= nbr_addr
;
1935 p
.prefix
= nbr_addr
;
1936 p
.prefixlen
= IPV4_MAX_BITLEN
;
1938 rn
= route_node_get(ospf
->nbr_nbma
, (struct prefix
*)&p
);
1940 route_unlock_node(rn
);
1941 rn
->info
= nbr_nbma
;
1943 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
1944 if (oi
->type
== OSPF_IFTYPE_NBMA
)
1945 if (prefix_match(oi
->address
, (struct prefix
*)&p
)) {
1946 ospf_nbr_nbma_add(nbr_nbma
, oi
);
1954 int ospf_nbr_nbma_unset(struct ospf
*ospf
, struct in_addr nbr_addr
)
1956 struct ospf_nbr_nbma
*nbr_nbma
;
1958 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
1959 if (nbr_nbma
== NULL
)
1962 ospf_nbr_nbma_down(nbr_nbma
);
1963 ospf_nbr_nbma_delete(ospf
, nbr_nbma
);
1968 int ospf_nbr_nbma_priority_set(struct ospf
*ospf
, struct in_addr nbr_addr
,
1971 struct ospf_nbr_nbma
*nbr_nbma
;
1973 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
1974 if (nbr_nbma
== NULL
)
1977 if (nbr_nbma
->priority
!= priority
)
1978 nbr_nbma
->priority
= priority
;
1983 int ospf_nbr_nbma_priority_unset(struct ospf
*ospf
, struct in_addr nbr_addr
)
1985 struct ospf_nbr_nbma
*nbr_nbma
;
1987 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
1988 if (nbr_nbma
== NULL
)
1991 if (nbr_nbma
!= OSPF_NEIGHBOR_PRIORITY_DEFAULT
)
1992 nbr_nbma
->priority
= OSPF_NEIGHBOR_PRIORITY_DEFAULT
;
1997 int ospf_nbr_nbma_poll_interval_set(struct ospf
*ospf
, struct in_addr nbr_addr
,
1998 unsigned int interval
)
2000 struct ospf_nbr_nbma
*nbr_nbma
;
2002 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
2003 if (nbr_nbma
== NULL
)
2006 if (nbr_nbma
->v_poll
!= interval
) {
2007 nbr_nbma
->v_poll
= interval
;
2008 if (nbr_nbma
->oi
&& ospf_if_is_up(nbr_nbma
->oi
)) {
2009 OSPF_TIMER_OFF(nbr_nbma
->t_poll
);
2010 OSPF_POLL_TIMER_ON(nbr_nbma
->t_poll
, ospf_poll_timer
,
2018 int ospf_nbr_nbma_poll_interval_unset(struct ospf
*ospf
, struct in_addr addr
)
2020 struct ospf_nbr_nbma
*nbr_nbma
;
2022 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, addr
);
2023 if (nbr_nbma
== NULL
)
2026 if (nbr_nbma
->v_poll
!= OSPF_POLL_INTERVAL_DEFAULT
)
2027 nbr_nbma
->v_poll
= OSPF_POLL_INTERVAL_DEFAULT
;
2032 void ospf_master_init(struct thread_master
*master
)
2034 memset(&ospf_master
, 0, sizeof(struct ospf_master
));
2037 om
->ospf
= list_new();
2038 om
->master
= master
;
2041 /* Link OSPF instance to VRF. */
2042 void ospf_vrf_link(struct ospf
*ospf
, struct vrf
*vrf
)
2044 ospf
->vrf_id
= vrf
->vrf_id
;
2045 if (vrf
->info
!= (void *)ospf
)
2046 vrf
->info
= (void *)ospf
;
2049 /* Unlink OSPF instance from VRF. */
2050 void ospf_vrf_unlink(struct ospf
*ospf
, struct vrf
*vrf
)
2052 if (vrf
->info
== (void *)ospf
)
2054 ospf
->vrf_id
= VRF_UNKNOWN
;
2057 /* This is hook function for vrf create called as part of vrf_init */
2058 static int ospf_vrf_new(struct vrf
*vrf
)
2060 if (IS_DEBUG_OSPF_EVENT
)
2061 zlog_debug("%s: VRF Created: %s(%u)", __PRETTY_FUNCTION__
,
2062 vrf
->name
, vrf
->vrf_id
);
2067 /* This is hook function for vrf delete call as part of vrf_init */
2068 static int ospf_vrf_delete(struct vrf
*vrf
)
2070 if (IS_DEBUG_OSPF_EVENT
)
2071 zlog_debug("%s: VRF Deletion: %s(%u)", __PRETTY_FUNCTION__
,
2072 vrf
->name
, vrf
->vrf_id
);
2077 static void ospf_set_redist_vrf_bitmaps(struct ospf
*ospf
)
2080 struct list
*red_list
;
2082 for (type
= 0; type
< ZEBRA_ROUTE_MAX
; type
++) {
2083 red_list
= ospf
->redist
[type
];
2086 if (IS_DEBUG_OSPF_EVENT
)
2088 "%s: setting redist vrf %d bitmap for type %d",
2089 __func__
, ospf
->vrf_id
, type
);
2090 vrf_bitmap_set(zclient
->redist
[AFI_IP
][type
], ospf
->vrf_id
);
2094 /* Enable OSPF VRF instance */
2095 static int ospf_vrf_enable(struct vrf
*vrf
)
2097 struct ospf
*ospf
= NULL
;
2098 vrf_id_t old_vrf_id
;
2101 if (IS_DEBUG_OSPF_EVENT
)
2102 zlog_debug("%s: VRF %s id %u enabled", __PRETTY_FUNCTION__
,
2103 vrf
->name
, vrf
->vrf_id
);
2105 ospf
= ospf_lookup_by_name(vrf
->name
);
2107 if (ospf
->name
&& strmatch(vrf
->name
, VRF_DEFAULT_NAME
)) {
2108 XFREE(MTYPE_OSPF_TOP
, ospf
->name
);
2111 old_vrf_id
= ospf
->vrf_id
;
2112 /* We have instance configured, link to VRF and make it "up". */
2113 ospf_vrf_link(ospf
, vrf
);
2114 if (IS_DEBUG_OSPF_EVENT
)
2116 "%s: ospf linked to vrf %s vrf_id %u (old id %u)",
2117 __PRETTY_FUNCTION__
, vrf
->name
, ospf
->vrf_id
,
2120 if (old_vrf_id
!= ospf
->vrf_id
) {
2121 frr_elevate_privs(&ospfd_privs
) {
2122 /* stop zebra redist to us for old vrf */
2123 zclient_send_dereg_requests(zclient
,
2126 ospf_set_redist_vrf_bitmaps(ospf
);
2128 /* start zebra redist to us for new vrf */
2129 ospf_zebra_vrf_register(ospf
);
2131 ret
= ospf_sock_init(ospf
);
2133 if (ret
< 0 || ospf
->fd
<= 0)
2135 thread_add_read(master
, ospf_read
, ospf
, ospf
->fd
,
2137 ospf
->oi_running
= 1;
2138 ospf_router_id_update(ospf
);
2145 /* Disable OSPF VRF instance */
2146 static int ospf_vrf_disable(struct vrf
*vrf
)
2148 struct ospf
*ospf
= NULL
;
2149 vrf_id_t old_vrf_id
= VRF_UNKNOWN
;
2151 if (vrf
->vrf_id
== VRF_DEFAULT
)
2154 if (IS_DEBUG_OSPF_EVENT
)
2155 zlog_debug("%s: VRF %s id %d disabled.", __PRETTY_FUNCTION__
,
2156 vrf
->name
, vrf
->vrf_id
);
2158 ospf
= ospf_lookup_by_name(vrf
->name
);
2160 old_vrf_id
= ospf
->vrf_id
;
2162 /* We have instance configured, unlink
2163 * from VRF and make it "down".
2165 ospf_vrf_unlink(ospf
, vrf
);
2166 ospf
->oi_running
= 0;
2167 if (IS_DEBUG_OSPF_EVENT
)
2168 zlog_debug("%s: ospf old_vrf_id %d unlinked",
2169 __PRETTY_FUNCTION__
, old_vrf_id
);
2170 thread_cancel(ospf
->t_read
);
2175 /* Note: This is a callback, the VRF will be deleted by the caller. */
2179 void ospf_vrf_init(void)
2181 vrf_init(ospf_vrf_new
, ospf_vrf_enable
, ospf_vrf_disable
,
2182 ospf_vrf_delete
, NULL
);
2185 void ospf_vrf_terminate(void)
2190 const char *ospf_vrf_id_to_name(vrf_id_t vrf_id
)
2192 struct vrf
*vrf
= vrf_lookup_by_id(vrf_id
);
2194 return vrf
? vrf
->name
: "NIL";