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 "ospfd/ospfd.h"
42 #include "ospfd/ospf_network.h"
43 #include "ospfd/ospf_interface.h"
44 #include "ospfd/ospf_ism.h"
45 #include "ospfd/ospf_asbr.h"
46 #include "ospfd/ospf_lsa.h"
47 #include "ospfd/ospf_lsdb.h"
48 #include "ospfd/ospf_neighbor.h"
49 #include "ospfd/ospf_nsm.h"
50 #include "ospfd/ospf_spf.h"
51 #include "ospfd/ospf_packet.h"
52 #include "ospfd/ospf_dump.h"
53 #include "ospfd/ospf_zebra.h"
54 #include "ospfd/ospf_abr.h"
55 #include "ospfd/ospf_flood.h"
56 #include "ospfd/ospf_route.h"
57 #include "ospfd/ospf_ase.h"
60 DEFINE_QOBJ_TYPE(ospf
)
62 /* OSPF process wide configuration. */
63 static struct ospf_master ospf_master
;
65 /* OSPF process wide configuration pointer to export. */
66 struct ospf_master
*om
;
68 extern struct zclient
*zclient
;
69 extern struct in_addr router_id_zebra
;
70 extern struct zebra_privs_t ospfd_privs
;
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
= 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
),
126 inet_ntoa(router_id_old
));
128 if (!IPV4_ADDR_SAME(&router_id_old
, &router_id
)) {
130 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
131 /* Some nbrs are identified by router_id, these needs
132 * to be rebuilt. Possible optimization would be to do
133 * oi->nbr_self->router_id = router_id for
134 * !(virtual | ptop) links
136 ospf_nbr_self_reset(oi
, router_id
);
139 /* If AS-external-LSA is queued, then flush those LSAs. */
140 if (router_id_old
.s_addr
== 0 && ospf
->external_origin
) {
141 /* Originate each redistributed external route. */
142 for (type
= 0; type
< ZEBRA_ROUTE_MAX
; type
++)
143 if (ospf
->external_origin
& (1 << type
))
146 ospf_external_lsa_originate_timer
,
148 /* Originate Deafult. */
149 if (ospf
->external_origin
& (1 << ZEBRA_ROUTE_MAX
))
150 thread_add_event(master
,
151 ospf_default_originate_timer
,
154 ospf
->external_origin
= 0;
157 /* Flush (inline) all external LSAs based on the OSPF_LSA_SELF
160 struct route_node
*rn
;
161 struct ospf_lsa
*lsa
;
163 LSDB_LOOP(EXTERNAL_LSDB(ospf
), rn
, lsa
)
164 if (IS_LSA_SELF(lsa
))
165 ospf_lsa_flush_schedule(ospf
, lsa
);
168 ospf
->router_id
= router_id
;
169 if (IS_DEBUG_OSPF_EVENT
)
170 zlog_debug("Router-ID[NEW:%s]: Update",
171 inet_ntoa(ospf
->router_id
));
173 /* Flush (inline) all external LSAs which now match the new
175 need to adjust the OSPF_LSA_SELF flag, so the flush doesnt
177 asserts in ospf_refresher_unregister_lsa(). This step is
179 because the current quagga code does look-up for
181 based on the self router-id alone but expects OSPF_LSA_SELF
185 struct route_node
*rn
;
186 struct ospf_lsa
*lsa
;
188 LSDB_LOOP(EXTERNAL_LSDB(ospf
), rn
, lsa
)
190 /* AdvRouter and Router ID is the same. */
191 if (IPV4_ADDR_SAME(&lsa
->data
->adv_router
,
194 OSPF_LSA_SELF_CHECKED
);
195 SET_FLAG(lsa
->flags
, OSPF_LSA_SELF
);
196 ospf_lsa_flush_schedule(ospf
, lsa
);
201 /* Originate each redistributed external route. */
202 for (type
= 0; type
< ZEBRA_ROUTE_MAX
; type
++)
203 thread_add_event(master
,
204 ospf_external_lsa_originate_timer
,
206 thread_add_event(master
, ospf_default_originate_timer
, ospf
, 0,
209 /* update router-lsa's for each area */
210 ospf_router_lsa_update(ospf
);
212 /* update ospf_interface's */
213 FOR_ALL_INTERFACES (vrf
, ifp
)
214 ospf_if_update(ospf
, ifp
);
218 /* For OSPF area sort by area id. */
219 static int ospf_area_id_cmp(struct ospf_area
*a1
, struct ospf_area
*a2
)
221 if (ntohl(a1
->area_id
.s_addr
) > ntohl(a2
->area_id
.s_addr
))
223 if (ntohl(a1
->area_id
.s_addr
) < ntohl(a2
->area_id
.s_addr
))
228 /* Allocate new ospf structure. */
229 static struct ospf
*ospf_new(u_short instance
, const char *name
)
232 struct vrf
*vrf
= NULL
;
234 struct ospf
*new = XCALLOC(MTYPE_OSPF_TOP
, sizeof(struct ospf
));
236 new->instance
= instance
;
237 new->router_id
.s_addr
= htonl(0);
238 new->router_id_static
.s_addr
= htonl(0);
241 new->vrf_id
= VRF_UNKNOWN
;
242 /* Freed in ospf_finish_final */
243 new->name
= XSTRDUP(MTYPE_OSPF_TOP
, name
);
244 vrf
= vrf_lookup_by_name(new->name
);
245 if (IS_DEBUG_OSPF_EVENT
)
246 zlog_debug("%s: Create new ospf instance with vrf_name %s vrf_id %d",
247 __PRETTY_FUNCTION__
, name
, new->vrf_id
);
249 ospf_vrf_link(new, vrf
);
251 new->vrf_id
= VRF_DEFAULT
;
252 vrf
= vrf_lookup_by_id(VRF_DEFAULT
);
253 ospf_vrf_link(new, vrf
);
255 ospf_zebra_vrf_register(new);
257 new->abr_type
= OSPF_ABR_DEFAULT
;
258 new->oiflist
= list_new();
259 new->vlinks
= list_new();
260 new->areas
= list_new();
261 new->areas
->cmp
= (int (*)(void *, void *))ospf_area_id_cmp
;
262 new->networks
= route_table_init();
263 new->nbr_nbma
= route_table_init();
265 new->lsdb
= ospf_lsdb_new();
267 new->default_originate
= DEFAULT_ORIGINATE_NONE
;
269 new->passive_interface_default
= OSPF_IF_ACTIVE
;
271 new->new_external_route
= route_table_init();
272 new->old_external_route
= route_table_init();
273 new->external_lsas
= route_table_init();
275 new->stub_router_startup_time
= OSPF_STUB_ROUTER_UNCONFIGURED
;
276 new->stub_router_shutdown_time
= OSPF_STUB_ROUTER_UNCONFIGURED
;
277 new->stub_router_admin_set
= OSPF_STUB_ROUTER_ADMINISTRATIVE_UNSET
;
279 /* Distribute parameter init. */
280 for (i
= 0; i
<= ZEBRA_ROUTE_MAX
; i
++) {
283 new->default_metric
= -1;
284 new->ref_bandwidth
= OSPF_DEFAULT_REF_BANDWIDTH
;
287 new->min_ls_interval
= OSPF_MIN_LS_INTERVAL
;
288 new->min_ls_arrival
= OSPF_MIN_LS_ARRIVAL
;
290 /* SPF timer value init. */
291 new->spf_delay
= OSPF_SPF_DELAY_DEFAULT
;
292 new->spf_holdtime
= OSPF_SPF_HOLDTIME_DEFAULT
;
293 new->spf_max_holdtime
= OSPF_SPF_MAX_HOLDTIME_DEFAULT
;
294 new->spf_hold_multiplier
= 1;
297 new->maxage_delay
= OSPF_LSA_MAXAGE_REMOVE_DELAY_DEFAULT
;
298 new->maxage_lsa
= route_table_init();
299 new->t_maxage_walker
= NULL
;
300 thread_add_timer(master
, ospf_lsa_maxage_walker
, new,
301 OSPF_LSA_MAXAGE_CHECK_INTERVAL
, &new->t_maxage_walker
);
303 /* Distance table init. */
304 new->distance_table
= route_table_init();
306 new->lsa_refresh_queue
.index
= 0;
307 new->lsa_refresh_interval
= OSPF_LSA_REFRESH_INTERVAL_DEFAULT
;
308 new->t_lsa_refresher
= NULL
;
309 thread_add_timer(master
, ospf_lsa_refresh_walker
, new,
310 new->lsa_refresh_interval
, &new->t_lsa_refresher
);
311 new->lsa_refresher_started
= monotime(NULL
);
313 if ((ospf_sock_init(new)) < 0) {
315 "ospf_new: fatal error: ospf_sock_init was unable to open "
319 if ((new->ibuf
= stream_new(OSPF_MAX_PACKET_SIZE
+ 1)) == NULL
) {
321 "ospf_new: fatal error: stream_new(%u) failed allocating ibuf",
322 OSPF_MAX_PACKET_SIZE
+ 1);
326 thread_add_read(master
, ospf_read
, new, new->fd
, &new->t_read
);
327 new->oi_write_q
= list_new();
328 new->write_oi_count
= OSPF_WRITE_INTERFACE_COUNT_DEFAULT
;
330 /* Enable "log-adjacency-changes" */
331 #if DFLT_OSPF_LOG_ADJACENCY_CHANGES
332 SET_FLAG(new->config
, OSPF_LOG_ADJACENCY_CHANGES
);
340 struct ospf
*ospf_lookup_instance(u_short instance
)
343 struct listnode
*node
, *nnode
;
345 if (listcount(om
->ospf
) == 0)
348 for (ALL_LIST_ELEMENTS(om
->ospf
, node
, nnode
, ospf
))
349 if ((ospf
->instance
== 0 && instance
== 0)
350 || (ospf
->instance
&& instance
351 && ospf
->instance
== instance
))
357 static int ospf_is_ready(struct ospf
*ospf
)
359 /* OSPF must be on and Router-ID must be configured. */
360 if (!ospf
|| ospf
->router_id
.s_addr
== 0)
366 static void ospf_add(struct ospf
*ospf
)
368 listnode_add(om
->ospf
, ospf
);
371 static void ospf_delete(struct ospf
*ospf
)
373 listnode_delete(om
->ospf
, ospf
);
376 struct ospf
*ospf_lookup_by_inst_name(u_short instance
, const char *name
)
378 struct ospf
*ospf
= NULL
;
379 struct listnode
*node
, *nnode
;
381 for (ALL_LIST_ELEMENTS(om
->ospf
, node
, nnode
, ospf
)) {
382 if ((ospf
->instance
== instance
) &&
383 ((ospf
->name
== NULL
&& name
== NULL
) ||
384 (ospf
->name
&& name
&& strcmp(ospf
->name
, name
) == 0)))
390 struct ospf
*ospf_get(u_short instance
, const char *name
)
394 /* vrf name provided call inst and name based api
395 * in case of no name pass default ospf instance */
397 ospf
= ospf_lookup_by_inst_name(instance
, name
);
399 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
402 ospf
= ospf_new(instance
, name
);
405 if (ospf
->router_id_static
.s_addr
== 0)
406 ospf_router_id_update(ospf
);
408 ospf_opaque_type11_lsa_init(ospf
);
414 struct ospf
*ospf_get_instance(u_short instance
)
418 ospf
= ospf_lookup_instance(instance
);
420 ospf
= ospf_new(instance
, NULL
/* VRF_DEFAULT*/);
423 if (ospf
->router_id_static
.s_addr
== 0) {
424 if (vrf_lookup_by_id(ospf
->vrf_id
))
425 ospf_router_id_update(ospf
);
427 if (IS_DEBUG_OSPF_EVENT
)
428 zlog_debug("%s: ospf VRF (id %d) is not active yet, skip router id update"
429 , __PRETTY_FUNCTION__
,
432 ospf_router_id_update(ospf
);
435 ospf_opaque_type11_lsa_init(ospf
);
441 struct ospf
*ospf_lookup_by_vrf_id(vrf_id_t vrf_id
)
443 struct vrf
*vrf
= NULL
;
445 vrf
= vrf_lookup_by_id(vrf_id
);
448 return (vrf
->info
) ? (struct ospf
*)vrf
->info
: NULL
;
452 /* It should only be used when processing incoming info update from zebra.
453 * Other situations, it is not sufficient to lookup the ospf instance by
454 * vrf_name only without using the instance number.
456 static struct ospf
*ospf_lookup_by_name(const char *vrf_name
)
458 struct ospf
*ospf
= NULL
;
459 struct listnode
*node
, *nnode
;
461 for (ALL_LIST_ELEMENTS(om
->ospf
, node
, nnode
, ospf
))
462 if ((ospf
->name
== NULL
&& vrf_name
== NULL
)
463 || (ospf
->name
&& vrf_name
&&
464 strcmp(ospf
->name
, vrf_name
) == 0))
469 /* Handle the second half of deferred shutdown. This is called either
470 * from the deferred-shutdown timer thread, or directly through
471 * ospf_deferred_shutdown_check.
473 * Function is to cleanup G-R state, if required then call ospf_finish_final
474 * to complete shutdown of this ospf instance. Possibly exit if the
475 * whole process is being shutdown and this was the last OSPF instance.
477 static void ospf_deferred_shutdown_finish(struct ospf
*ospf
)
479 ospf
->stub_router_shutdown_time
= OSPF_STUB_ROUTER_UNCONFIGURED
;
480 OSPF_TIMER_OFF(ospf
->t_deferred_shutdown
);
482 ospf_finish_final(ospf
);
484 /* *ospf is now invalid */
486 /* ospfd being shut-down? If so, was this the last ospf instance? */
487 if (CHECK_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
)
488 && (listcount(om
->ospf
) == 0)) {
495 /* Timer thread for G-R */
496 static int ospf_deferred_shutdown_timer(struct thread
*t
)
498 struct ospf
*ospf
= THREAD_ARG(t
);
500 ospf_deferred_shutdown_finish(ospf
);
505 /* Check whether deferred-shutdown must be scheduled, otherwise call
506 * down directly into second-half of instance shutdown.
508 static void ospf_deferred_shutdown_check(struct ospf
*ospf
)
510 unsigned long timeout
;
512 struct ospf_area
*area
;
514 /* deferred shutdown already running? */
515 if (ospf
->t_deferred_shutdown
)
518 /* Should we try push out max-metric LSAs? */
519 if (ospf
->stub_router_shutdown_time
!= OSPF_STUB_ROUTER_UNCONFIGURED
) {
520 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, ln
, area
)) {
521 SET_FLAG(area
->stub_router_state
,
522 OSPF_AREA_ADMIN_STUB_ROUTED
);
524 if (!CHECK_FLAG(area
->stub_router_state
,
525 OSPF_AREA_IS_STUB_ROUTED
))
526 ospf_router_lsa_update_area(area
);
528 timeout
= ospf
->stub_router_shutdown_time
;
530 /* No timer needed */
531 ospf_deferred_shutdown_finish(ospf
);
535 OSPF_TIMER_ON(ospf
->t_deferred_shutdown
, ospf_deferred_shutdown_timer
,
540 /* Shut down the entire process */
541 void ospf_terminate(void)
544 struct listnode
*node
, *nnode
;
546 /* shutdown already in progress */
547 if (CHECK_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
))
550 SET_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
);
552 /* exit immediately if OSPF not actually running */
553 if (listcount(om
->ospf
) == 0)
557 for (ALL_LIST_ELEMENTS(om
->ospf
, node
, nnode
, ospf
))
560 /* Deliberately go back up, hopefully to thread scheduler, as
561 * One or more ospf_finish()'s may have deferred shutdown to a timer
564 zclient_stop(zclient
);
565 zclient_free(zclient
);
570 void ospf_finish(struct ospf
*ospf
)
572 /* let deferred shutdown decide */
573 ospf_deferred_shutdown_check(ospf
);
575 /* if ospf_deferred_shutdown returns, then ospf_finish_final is
576 * deferred to expiry of G-S timer thread. Return back up, hopefully
577 * to thread scheduler.
582 /* Final cleanup of ospf instance */
583 static void ospf_finish_final(struct ospf
*ospf
)
585 struct vrf
*vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
586 struct route_node
*rn
;
587 struct ospf_nbr_nbma
*nbr_nbma
;
588 struct ospf_lsa
*lsa
;
589 struct interface
*ifp
;
590 struct ospf_interface
*oi
;
591 struct ospf_area
*area
;
592 struct ospf_vl_data
*vl_data
;
593 struct listnode
*node
, *nnode
;
595 u_short instance
= 0;
599 ospf_opaque_type11_lsa_term(ospf
);
601 /* be nice if this worked, but it doesn't */
602 /*ospf_flush_self_originated_lsas_now (ospf);*/
604 /* Unregister redistribution */
605 for (i
= 0; i
< ZEBRA_ROUTE_MAX
; i
++) {
606 struct list
*red_list
;
607 struct ospf_redist
*red
;
609 red_list
= ospf
->redist
[i
];
613 for (ALL_LIST_ELEMENTS(red_list
, node
, nnode
, red
))
614 ospf_redistribute_unset(ospf
, i
, red
->instance
);
616 ospf_redistribute_default_unset(ospf
);
618 for (ALL_LIST_ELEMENTS(ospf
->areas
, node
, nnode
, area
))
619 ospf_remove_vls_through_area(ospf
, area
);
621 for (ALL_LIST_ELEMENTS(ospf
->vlinks
, node
, nnode
, vl_data
))
622 ospf_vl_delete(ospf
, vl_data
);
624 list_delete_and_null(&ospf
->vlinks
);
626 /* Remove any ospf interface config params */
627 FOR_ALL_INTERFACES (vrf
, ifp
) {
628 struct ospf_if_params
*params
;
630 params
= IF_DEF_PARAMS(ifp
);
631 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
))
632 UNSET_IF_PARAM(params
, if_area
);
635 /* Reset interface. */
636 for (ALL_LIST_ELEMENTS(ospf
->oiflist
, node
, nnode
, oi
))
638 list_delete_and_null(&ospf
->oiflist
);
640 /* De-Register VRF */
641 ospf_zebra_vrf_deregister(ospf
);
643 /* Clear static neighbors */
644 for (rn
= route_top(ospf
->nbr_nbma
); rn
; rn
= route_next(rn
))
645 if ((nbr_nbma
= rn
->info
)) {
646 OSPF_POLL_TIMER_OFF(nbr_nbma
->t_poll
);
649 nbr_nbma
->nbr
->nbr_nbma
= NULL
;
650 nbr_nbma
->nbr
= NULL
;
654 listnode_delete(nbr_nbma
->oi
->nbr_nbma
,
659 XFREE(MTYPE_OSPF_NEIGHBOR_STATIC
, nbr_nbma
);
662 route_table_finish(ospf
->nbr_nbma
);
664 /* Clear networks and Areas. */
665 for (rn
= route_top(ospf
->networks
); rn
; rn
= route_next(rn
)) {
666 struct ospf_network
*network
;
668 if ((network
= rn
->info
) != NULL
) {
669 ospf_network_free(ospf
, network
);
671 route_unlock_node(rn
);
674 route_table_finish(ospf
->networks
);
676 for (ALL_LIST_ELEMENTS(ospf
->areas
, node
, nnode
, area
)) {
677 listnode_delete(ospf
->areas
, area
);
678 ospf_area_free(area
);
681 /* Cancel all timers. */
682 OSPF_TIMER_OFF(ospf
->t_external_lsa
);
683 OSPF_TIMER_OFF(ospf
->t_spf_calc
);
684 OSPF_TIMER_OFF(ospf
->t_ase_calc
);
685 OSPF_TIMER_OFF(ospf
->t_maxage
);
686 OSPF_TIMER_OFF(ospf
->t_maxage_walker
);
687 OSPF_TIMER_OFF(ospf
->t_abr_task
);
688 OSPF_TIMER_OFF(ospf
->t_asbr_check
);
689 OSPF_TIMER_OFF(ospf
->t_distribute_update
);
690 OSPF_TIMER_OFF(ospf
->t_lsa_refresher
);
691 OSPF_TIMER_OFF(ospf
->t_read
);
692 OSPF_TIMER_OFF(ospf
->t_write
);
693 OSPF_TIMER_OFF(ospf
->t_opaque_lsa_self
);
696 stream_free(ospf
->ibuf
);
698 LSDB_LOOP(OPAQUE_AS_LSDB(ospf
), rn
, lsa
)
699 ospf_discard_from_db(ospf
, ospf
->lsdb
, lsa
);
700 LSDB_LOOP(EXTERNAL_LSDB(ospf
), rn
, lsa
)
701 ospf_discard_from_db(ospf
, ospf
->lsdb
, lsa
);
703 ospf_lsdb_delete_all(ospf
->lsdb
);
704 ospf_lsdb_free(ospf
->lsdb
);
706 for (rn
= route_top(ospf
->maxage_lsa
); rn
; rn
= route_next(rn
)) {
707 struct ospf_lsa
*lsa
;
709 if ((lsa
= rn
->info
) != NULL
) {
710 ospf_lsa_unlock(&lsa
);
713 route_unlock_node(rn
);
715 route_table_finish(ospf
->maxage_lsa
);
718 ospf_route_table_free(ospf
->old_table
);
719 if (ospf
->new_table
) {
720 ospf_route_delete(ospf
, ospf
->new_table
);
721 ospf_route_table_free(ospf
->new_table
);
724 ospf_rtrs_free(ospf
->old_rtrs
);
726 ospf_rtrs_free(ospf
->new_rtrs
);
727 if (ospf
->new_external_route
) {
728 ospf_route_delete(ospf
, ospf
->new_external_route
);
729 ospf_route_table_free(ospf
->new_external_route
);
731 if (ospf
->old_external_route
) {
732 ospf_route_delete(ospf
, ospf
->old_external_route
);
733 ospf_route_table_free(ospf
->old_external_route
);
735 if (ospf
->external_lsas
) {
736 ospf_ase_external_lsas_finish(ospf
->external_lsas
);
739 list_delete_and_null(&ospf
->areas
);
740 list_delete_and_null(&ospf
->oi_write_q
);
742 for (i
= ZEBRA_ROUTE_SYSTEM
; i
<= ZEBRA_ROUTE_MAX
; i
++) {
743 struct list
*ext_list
;
744 struct listnode
*node
;
745 struct ospf_external
*ext
;
747 ext_list
= om
->external
[i
];
751 for (ALL_LIST_ELEMENTS_RO(ext_list
, node
, ext
)) {
752 if (ext
->external_info
)
753 for (rn
= route_top(ext
->external_info
); rn
;
754 rn
= route_next(rn
)) {
755 if (rn
->info
== NULL
)
758 XFREE(MTYPE_OSPF_EXTERNAL_INFO
,
761 route_unlock_node(rn
);
766 ospf_distance_reset(ospf
);
767 route_table_finish(ospf
->distance_table
);
769 if (!CHECK_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
))
770 instance
= ospf
->instance
;
775 vrf
= vrf_lookup_by_name(ospf
->name
);
777 ospf_vrf_unlink(ospf
, vrf
);
778 XFREE(MTYPE_OSPF_TOP
, ospf
->name
);
780 vrf
= vrf_lookup_by_id(VRF_DEFAULT
);
782 ospf_vrf_unlink(ospf
, vrf
);
785 XFREE(MTYPE_OSPF_TOP
, ospf
);
787 if (!CHECK_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
))
788 ospf_get_instance(instance
);
792 /* allocate new OSPF Area object */
793 static struct ospf_area
*ospf_area_new(struct ospf
*ospf
,
794 struct in_addr area_id
)
796 struct ospf_area
*new;
798 /* Allocate new config_network. */
799 new = XCALLOC(MTYPE_OSPF_AREA
, sizeof(struct ospf_area
));
803 new->area_id
= area_id
;
804 new->area_id_fmt
= OSPF_AREA_ID_FMT_DOTTEDQUAD
;
806 new->external_routing
= OSPF_AREA_DEFAULT
;
807 new->default_cost
= 1;
808 new->auth_type
= OSPF_AUTH_NULL
;
811 new->lsdb
= ospf_lsdb_new();
813 /* Self-originated LSAs initialize. */
814 new->router_lsa_self
= NULL
;
816 ospf_opaque_type10_lsa_init(new);
818 new->oiflist
= list_new();
819 new->ranges
= route_table_init();
821 if (area_id
.s_addr
== OSPF_AREA_BACKBONE
)
822 ospf
->backbone
= new;
827 static void ospf_area_free(struct ospf_area
*area
)
829 struct route_node
*rn
;
830 struct ospf_lsa
*lsa
;
832 ospf_opaque_type10_lsa_term(area
);
835 LSDB_LOOP(ROUTER_LSDB(area
), rn
, lsa
)
836 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
837 LSDB_LOOP(NETWORK_LSDB(area
), rn
, lsa
)
838 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
839 LSDB_LOOP(SUMMARY_LSDB(area
), rn
, lsa
)
840 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
841 LSDB_LOOP(ASBR_SUMMARY_LSDB(area
), rn
, lsa
)
842 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
844 LSDB_LOOP(NSSA_LSDB(area
), rn
, lsa
)
845 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
846 LSDB_LOOP(OPAQUE_AREA_LSDB(area
), rn
, lsa
)
847 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
848 LSDB_LOOP(OPAQUE_LINK_LSDB(area
), rn
, lsa
)
849 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
851 ospf_opaque_type10_lsa_term(area
);
852 ospf_lsdb_delete_all(area
->lsdb
);
853 ospf_lsdb_free(area
->lsdb
);
855 ospf_lsa_unlock(&area
->router_lsa_self
);
857 route_table_finish(area
->ranges
);
858 list_delete_and_null(&area
->oiflist
);
860 if (EXPORT_NAME(area
))
861 free(EXPORT_NAME(area
));
863 if (IMPORT_NAME(area
))
864 free(IMPORT_NAME(area
));
867 OSPF_TIMER_OFF(area
->t_stub_router
);
868 OSPF_TIMER_OFF(area
->t_opaque_lsa_self
);
870 if (OSPF_IS_AREA_BACKBONE(area
))
871 area
->ospf
->backbone
= NULL
;
873 XFREE(MTYPE_OSPF_AREA
, area
);
876 void ospf_area_check_free(struct ospf
*ospf
, struct in_addr area_id
)
878 struct ospf_area
*area
;
880 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
881 if (area
&& listcount(area
->oiflist
) == 0 && area
->ranges
->top
== NULL
882 && area
->shortcut_configured
== OSPF_SHORTCUT_DEFAULT
883 && area
->external_routing
== OSPF_AREA_DEFAULT
884 && area
->no_summary
== 0 && area
->default_cost
== 1
885 && EXPORT_NAME(area
) == NULL
&& IMPORT_NAME(area
) == NULL
886 && area
->auth_type
== OSPF_AUTH_NULL
) {
887 listnode_delete(ospf
->areas
, area
);
888 ospf_area_free(area
);
892 struct ospf_area
*ospf_area_get(struct ospf
*ospf
, struct in_addr area_id
)
894 struct ospf_area
*area
;
896 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
898 area
= ospf_area_new(ospf
, area_id
);
899 listnode_add_sort(ospf
->areas
, area
);
900 ospf_check_abr_status(ospf
);
901 if (ospf
->stub_router_admin_set
902 == OSPF_STUB_ROUTER_ADMINISTRATIVE_SET
) {
903 SET_FLAG(area
->stub_router_state
,
904 OSPF_AREA_ADMIN_STUB_ROUTED
);
911 struct ospf_area
*ospf_area_lookup_by_area_id(struct ospf
*ospf
,
912 struct in_addr area_id
)
914 struct ospf_area
*area
;
915 struct listnode
*node
;
917 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
))
918 if (IPV4_ADDR_SAME(&area
->area_id
, &area_id
))
924 void ospf_area_add_if(struct ospf_area
*area
, struct ospf_interface
*oi
)
926 listnode_add(area
->oiflist
, oi
);
929 void ospf_area_del_if(struct ospf_area
*area
, struct ospf_interface
*oi
)
931 listnode_delete(area
->oiflist
, oi
);
935 static void add_ospf_interface(struct connected
*co
, struct ospf_area
*area
)
937 struct ospf_interface
*oi
;
939 oi
= ospf_if_new(area
->ospf
, co
->ifp
, co
->address
);
944 oi
->params
= ospf_lookup_if_params(co
->ifp
, oi
->address
->u
.prefix4
);
945 oi
->output_cost
= ospf_if_get_output_cost(oi
);
947 /* Relate ospf interface to ospf instance. */
948 oi
->ospf
= area
->ospf
;
950 /* update network type as interface flag */
951 /* If network type is specified previously,
952 skip network type setting. */
953 oi
->type
= IF_DEF_PARAMS(co
->ifp
)->type
;
955 /* Add pseudo neighbor. */
956 ospf_nbr_self_reset(oi
, oi
->ospf
->router_id
);
958 ospf_area_add_if(oi
->area
, oi
);
961 * if router_id is not configured, dont bring up
963 * ospf_router_id_update() will call ospf_if_update
964 * whenever r-id is configured instead.
966 if ((area
->ospf
->router_id
.s_addr
!= 0) && if_is_operative(co
->ifp
))
970 static void update_redistributed(struct ospf
*ospf
, int add_to_ospf
)
972 struct route_node
*rn
;
973 struct external_info
*ei
;
974 struct ospf_external
*ext
;
976 if (ospf_is_type_redistributed(ospf
, ZEBRA_ROUTE_CONNECT
, 0))
977 if ((ext
= ospf_external_lookup(ZEBRA_ROUTE_CONNECT
, 0))
978 && EXTERNAL_INFO(ext
)) {
979 for (rn
= route_top(EXTERNAL_INFO(ext
)); rn
;
980 rn
= route_next(rn
)) {
981 if ((ei
= rn
->info
) != NULL
) {
983 if (ospf_external_info_find_lsa(
985 if (!ospf_distribute_check_connected(
987 ospf_external_lsa_flush(
991 ei
->ifindex
/*, ei->nexthop */);
993 if (!ospf_external_info_find_lsa(
995 if (ospf_distribute_check_connected(
997 ospf_external_lsa_originate(
1006 /* Config network statement related functions. */
1007 static struct ospf_network
*ospf_network_new(struct in_addr area_id
)
1009 struct ospf_network
*new;
1010 new = XCALLOC(MTYPE_OSPF_NETWORK
, sizeof(struct ospf_network
));
1012 new->area_id
= area_id
;
1013 new->area_id_fmt
= OSPF_AREA_ID_FMT_DOTTEDQUAD
;
1018 static void ospf_network_free(struct ospf
*ospf
, struct ospf_network
*network
)
1020 ospf_area_check_free(ospf
, network
->area_id
);
1021 ospf_schedule_abr_task(ospf
);
1022 XFREE(MTYPE_OSPF_NETWORK
, network
);
1025 int ospf_network_set(struct ospf
*ospf
, struct prefix_ipv4
*p
,
1026 struct in_addr area_id
, int df
)
1028 struct ospf_network
*network
;
1029 struct ospf_area
*area
;
1030 struct route_node
*rn
;
1032 rn
= route_node_get(ospf
->networks
, (struct prefix
*)p
);
1034 /* There is already same network statement. */
1035 route_unlock_node(rn
);
1039 rn
->info
= network
= ospf_network_new(area_id
);
1040 network
->area_id_fmt
= df
;
1041 area
= ospf_area_get(ospf
, area_id
);
1042 ospf_area_display_format_set(ospf
, area
, df
);
1044 /* Run network config now. */
1045 ospf_network_run((struct prefix
*)p
, area
);
1047 /* Update connected redistribute. */
1048 update_redistributed(ospf
, 1); /* interfaces possibly added */
1050 ospf_area_check_free(ospf
, area_id
);
1055 int ospf_network_unset(struct ospf
*ospf
, struct prefix_ipv4
*p
,
1056 struct in_addr area_id
)
1058 struct route_node
*rn
;
1059 struct ospf_network
*network
;
1060 struct listnode
*node
, *nnode
;
1061 struct ospf_interface
*oi
;
1063 rn
= route_node_lookup(ospf
->networks
, (struct prefix
*)p
);
1068 route_unlock_node(rn
);
1069 if (!IPV4_ADDR_SAME(&area_id
, &network
->area_id
))
1072 ospf_network_free(ospf
, rn
->info
);
1074 route_unlock_node(rn
); /* initial reference */
1076 /* Find interfaces that are not configured already. */
1077 for (ALL_LIST_ELEMENTS(ospf
->oiflist
, node
, nnode
, oi
)) {
1079 if (oi
->type
== OSPF_IFTYPE_VIRTUALLINK
)
1082 ospf_network_run_subnet(ospf
, oi
->connected
, NULL
, NULL
);
1085 /* Update connected redistribute. */
1086 update_redistributed(ospf
, 0); /* interfaces possibly removed */
1087 ospf_area_check_free(ospf
, area_id
);
1092 /* Ensure there's an OSPF instance, as "ip ospf area" enabled OSPF means
1093 * there might not be any 'router ospf' config.
1095 * Otherwise, doesn't do anything different to ospf_if_update for now
1097 void ospf_interface_area_set(struct ospf
*ospf
, struct interface
*ifp
)
1102 ospf_if_update(ospf
, ifp
);
1103 /* if_update does a update_redistributed */
1108 void ospf_interface_area_unset(struct ospf
*ospf
, struct interface
*ifp
)
1110 struct route_node
*rn_oi
;
1113 return; /* Ospf not ready yet */
1115 /* Find interfaces that may need to be removed. */
1116 for (rn_oi
= route_top(IF_OIFS(ifp
)); rn_oi
;
1117 rn_oi
= route_next(rn_oi
)) {
1118 struct ospf_interface
*oi
= NULL
;
1120 if ((oi
= rn_oi
->info
) == NULL
)
1123 if (oi
->type
== OSPF_IFTYPE_VIRTUALLINK
)
1126 ospf_network_run_subnet(ospf
, oi
->connected
, NULL
, NULL
);
1129 /* Update connected redistribute. */
1130 update_redistributed(ospf
, 0); /* interfaces possibly removed */
1133 /* Check whether interface matches given network
1134 * returns: 1, true. 0, false
1136 static int ospf_network_match_iface(const struct connected
*co
,
1137 const struct prefix
*net
)
1139 /* new approach: more elegant and conceptually clean */
1140 return prefix_match_network_statement(net
, CONNECTED_PREFIX(co
));
1143 static void ospf_update_interface_area(struct connected
*co
,
1144 struct ospf_area
*area
)
1146 struct ospf_interface
*oi
= ospf_if_table_lookup(co
->ifp
, co
->address
);
1148 /* nothing to be done case */
1149 if (oi
&& oi
->area
== area
) {
1156 add_ospf_interface(co
, area
);
1159 /* Run OSPF for the given subnet, taking into account the following
1160 * possible sources of area configuration, in the given order of preference:
1162 * - Whether there is interface+address specific area configuration
1163 * - Whether there is a default area for the interface
1164 * - Whether there is an area given as a parameter.
1165 * - If no specific network prefix/area is supplied, whether there's
1166 * a matching network configured.
1168 static void ospf_network_run_subnet(struct ospf
*ospf
, struct connected
*co
,
1170 struct ospf_area
*given_area
)
1172 struct ospf_interface
*oi
;
1173 struct ospf_if_params
*params
;
1174 struct ospf_area
*area
= NULL
;
1175 struct route_node
*rn
;
1178 if (CHECK_FLAG(co
->flags
, ZEBRA_IFA_SECONDARY
))
1181 if (co
->address
->family
!= AF_INET
)
1184 /* Try determine the appropriate area for this interface + address
1185 * Start by checking interface config
1187 params
= ospf_lookup_if_params(co
->ifp
, co
->address
->u
.prefix4
);
1188 if (params
&& OSPF_IF_PARAM_CONFIGURED(params
, if_area
))
1189 area
= ospf_area_get(ospf
, params
->if_area
);
1191 params
= IF_DEF_PARAMS(co
->ifp
);
1192 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
))
1193 area
= ospf_area_get(ospf
, params
->if_area
);
1196 /* If we've found an interface and/or addr specific area, then we're
1200 ospf_update_interface_area(co
, area
);
1204 /* Otherwise, only remaining possibility is a matching network statement
1207 assert(given_area
!= NULL
);
1209 /* Which either was supplied as a parameter.. (e.g. cause a new
1210 * network/area was just added)..
1212 if (p
->family
== co
->address
->family
1213 && ospf_network_match_iface(co
, p
))
1214 ospf_update_interface_area(co
, given_area
);
1219 /* Else we have to search the existing network/area config to see
1222 for (rn
= route_top(ospf
->networks
); rn
; rn
= route_next(rn
))
1223 if (rn
->info
!= NULL
&& ospf_network_match_iface(co
, &rn
->p
)) {
1224 struct ospf_network
*network
=
1225 (struct ospf_network
*)rn
->info
;
1226 area
= ospf_area_get(ospf
, network
->area_id
);
1227 ospf_update_interface_area(co
, area
);
1231 /* If the subnet isn't in any area, deconfigure */
1232 if (!configed
&& (oi
= ospf_if_table_lookup(co
->ifp
, co
->address
)))
1236 static void ospf_network_run_interface(struct ospf
*ospf
, struct interface
*ifp
,
1238 struct ospf_area
*given_area
)
1240 struct listnode
*cnode
;
1241 struct connected
*co
;
1243 if (memcmp(ifp
->name
, "VLINK", 5) == 0)
1246 /* Network prefix without area is nonsensical */
1248 assert(given_area
!= NULL
);
1250 /* if interface prefix is match specified prefix,
1251 then create socket and join multicast group. */
1252 for (ALL_LIST_ELEMENTS_RO(ifp
->connected
, cnode
, co
))
1253 ospf_network_run_subnet(ospf
, co
, p
, given_area
);
1256 static void ospf_network_run(struct prefix
*p
, struct ospf_area
*area
)
1258 struct vrf
*vrf
= vrf_lookup_by_id(area
->ospf
->vrf_id
);
1259 struct interface
*ifp
;
1261 /* Schedule Router ID Update. */
1262 if (area
->ospf
->router_id
.s_addr
== 0)
1263 ospf_router_id_update(area
->ospf
);
1265 /* Get target interface. */
1266 FOR_ALL_INTERFACES (vrf
, ifp
)
1267 ospf_network_run_interface(area
->ospf
, ifp
, p
, area
);
1270 void ospf_ls_upd_queue_empty(struct ospf_interface
*oi
)
1272 struct route_node
*rn
;
1273 struct listnode
*node
, *nnode
;
1275 struct ospf_lsa
*lsa
;
1277 /* empty ls update queue */
1278 for (rn
= route_top(oi
->ls_upd_queue
); rn
; rn
= route_next(rn
))
1279 if ((lst
= (struct list
*)rn
->info
)) {
1280 for (ALL_LIST_ELEMENTS(lst
, node
, nnode
, lsa
))
1281 ospf_lsa_unlock(&lsa
); /* oi->ls_upd_queue */
1282 list_delete_and_null(&lst
);
1286 /* remove update event */
1287 if (oi
->t_ls_upd_event
) {
1288 thread_cancel(oi
->t_ls_upd_event
);
1289 oi
->t_ls_upd_event
= NULL
;
1293 void ospf_if_update(struct ospf
*ospf
, struct interface
*ifp
)
1299 if (IS_DEBUG_OSPF_EVENT
)
1300 zlog_debug("%s: interface %s ifp->vrf_id %u ospf vrf %s vrf_id %u router_id %s",
1301 __PRETTY_FUNCTION__
, ifp
->name
, ifp
->vrf_id
,
1302 ospf_vrf_id_to_name(ospf
->vrf_id
), ospf
->vrf_id
,
1303 inet_ntoa(ospf
->router_id
));
1305 /* OSPF must be ready. */
1306 if (!ospf_is_ready(ospf
))
1309 ospf_network_run_interface(ospf
, ifp
, NULL
, NULL
);
1311 /* Update connected redistribute. */
1312 update_redistributed(ospf
, 1);
1315 void ospf_remove_vls_through_area(struct ospf
*ospf
, struct ospf_area
*area
)
1317 struct listnode
*node
, *nnode
;
1318 struct ospf_vl_data
*vl_data
;
1320 for (ALL_LIST_ELEMENTS(ospf
->vlinks
, node
, nnode
, vl_data
))
1321 if (IPV4_ADDR_SAME(&vl_data
->vl_area_id
, &area
->area_id
))
1322 ospf_vl_delete(ospf
, vl_data
);
1326 static const struct message ospf_area_type_msg
[] = {
1327 {OSPF_AREA_DEFAULT
, "Default"},
1328 {OSPF_AREA_STUB
, "Stub"},
1329 {OSPF_AREA_NSSA
, "NSSA"},
1332 static void ospf_area_type_set(struct ospf_area
*area
, int type
)
1334 struct listnode
*node
;
1335 struct ospf_interface
*oi
;
1337 if (area
->external_routing
== type
) {
1338 if (IS_DEBUG_OSPF_EVENT
)
1339 zlog_debug("Area[%s]: Types are the same, ignored.",
1340 inet_ntoa(area
->area_id
));
1344 area
->external_routing
= type
;
1346 if (IS_DEBUG_OSPF_EVENT
)
1347 zlog_debug("Area[%s]: Configured as %s",
1348 inet_ntoa(area
->area_id
),
1349 lookup_msg(ospf_area_type_msg
, type
, NULL
));
1351 switch (area
->external_routing
) {
1352 case OSPF_AREA_DEFAULT
:
1353 for (ALL_LIST_ELEMENTS_RO(area
->oiflist
, node
, oi
))
1354 if (oi
->nbr_self
!= NULL
) {
1355 UNSET_FLAG(oi
->nbr_self
->options
,
1357 SET_FLAG(oi
->nbr_self
->options
, OSPF_OPTION_E
);
1360 case OSPF_AREA_STUB
:
1361 for (ALL_LIST_ELEMENTS_RO(area
->oiflist
, node
, oi
))
1362 if (oi
->nbr_self
!= NULL
) {
1363 if (IS_DEBUG_OSPF_EVENT
)
1365 "setting options on %s accordingly",
1367 UNSET_FLAG(oi
->nbr_self
->options
,
1369 UNSET_FLAG(oi
->nbr_self
->options
,
1371 if (IS_DEBUG_OSPF_EVENT
)
1372 zlog_debug("options set on %s: %x",
1373 IF_NAME(oi
), OPTIONS(oi
));
1376 case OSPF_AREA_NSSA
:
1377 for (ALL_LIST_ELEMENTS_RO(area
->oiflist
, node
, oi
))
1378 if (oi
->nbr_self
!= NULL
) {
1380 "setting nssa options on %s accordingly",
1382 UNSET_FLAG(oi
->nbr_self
->options
,
1384 SET_FLAG(oi
->nbr_self
->options
, OSPF_OPTION_NP
);
1385 zlog_debug("options set on %s: %x", IF_NAME(oi
),
1393 ospf_router_lsa_update_area(area
);
1394 ospf_schedule_abr_task(area
->ospf
);
1397 int ospf_area_shortcut_set(struct ospf
*ospf
, struct ospf_area
*area
, int mode
)
1399 if (area
->shortcut_configured
== mode
)
1402 area
->shortcut_configured
= mode
;
1403 ospf_router_lsa_update_area(area
);
1404 ospf_schedule_abr_task(ospf
);
1406 ospf_area_check_free(ospf
, area
->area_id
);
1411 int ospf_area_shortcut_unset(struct ospf
*ospf
, struct ospf_area
*area
)
1413 area
->shortcut_configured
= OSPF_SHORTCUT_DEFAULT
;
1414 ospf_router_lsa_update_area(area
);
1415 ospf_area_check_free(ospf
, area
->area_id
);
1416 ospf_schedule_abr_task(ospf
);
1421 static int ospf_area_vlink_count(struct ospf
*ospf
, struct ospf_area
*area
)
1423 struct ospf_vl_data
*vl
;
1424 struct listnode
*node
;
1427 for (ALL_LIST_ELEMENTS_RO(ospf
->vlinks
, node
, vl
))
1428 if (IPV4_ADDR_SAME(&vl
->vl_area_id
, &area
->area_id
))
1434 int ospf_area_display_format_set(struct ospf
*ospf
, struct ospf_area
*area
,
1437 area
->area_id_fmt
= df
;
1442 int ospf_area_stub_set(struct ospf
*ospf
, struct in_addr area_id
)
1444 struct ospf_area
*area
;
1446 area
= ospf_area_get(ospf
, area_id
);
1447 if (ospf_area_vlink_count(ospf
, area
))
1450 if (area
->external_routing
!= OSPF_AREA_STUB
)
1451 ospf_area_type_set(area
, OSPF_AREA_STUB
);
1456 int ospf_area_stub_unset(struct ospf
*ospf
, struct in_addr area_id
)
1458 struct ospf_area
*area
;
1460 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1464 if (area
->external_routing
== OSPF_AREA_STUB
)
1465 ospf_area_type_set(area
, OSPF_AREA_DEFAULT
);
1467 ospf_area_check_free(ospf
, area_id
);
1472 int ospf_area_no_summary_set(struct ospf
*ospf
, struct in_addr area_id
)
1474 struct ospf_area
*area
;
1476 area
= ospf_area_get(ospf
, area_id
);
1477 area
->no_summary
= 1;
1482 int ospf_area_no_summary_unset(struct ospf
*ospf
, struct in_addr area_id
)
1484 struct ospf_area
*area
;
1486 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1490 area
->no_summary
= 0;
1491 ospf_area_check_free(ospf
, area_id
);
1496 int ospf_area_nssa_set(struct ospf
*ospf
, struct in_addr area_id
)
1498 struct ospf_area
*area
;
1500 area
= ospf_area_get(ospf
, area_id
);
1501 if (ospf_area_vlink_count(ospf
, area
))
1504 if (area
->external_routing
!= OSPF_AREA_NSSA
) {
1505 ospf_area_type_set(area
, OSPF_AREA_NSSA
);
1509 /* set NSSA area defaults */
1510 area
->no_summary
= 0;
1511 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1512 area
->NSSATranslatorState
= OSPF_NSSA_TRANSLATE_DISABLED
;
1513 area
->NSSATranslatorStabilityInterval
= OSPF_NSSA_TRANS_STABLE_DEFAULT
;
1518 int ospf_area_nssa_unset(struct ospf
*ospf
, struct in_addr area_id
)
1520 struct ospf_area
*area
;
1522 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1526 if (area
->external_routing
== OSPF_AREA_NSSA
) {
1528 ospf_area_type_set(area
, OSPF_AREA_DEFAULT
);
1531 ospf_area_check_free(ospf
, area_id
);
1536 int ospf_area_nssa_translator_role_set(struct ospf
*ospf
,
1537 struct in_addr area_id
, int role
)
1539 struct ospf_area
*area
;
1541 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1545 area
->NSSATranslatorRole
= role
;
1551 /* XXX: unused? Leave for symmetry? */
1553 ospf_area_nssa_translator_role_unset (struct ospf
*ospf
,
1554 struct in_addr area_id
)
1556 struct ospf_area
*area
;
1558 area
= ospf_area_lookup_by_area_id (ospf
, area_id
);
1562 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1564 ospf_area_check_free (ospf
, area_id
);
1570 int ospf_area_export_list_set(struct ospf
*ospf
, struct ospf_area
*area
,
1571 const char *list_name
)
1573 struct access_list
*list
;
1574 list
= access_list_lookup(AFI_IP
, list_name
);
1576 EXPORT_LIST(area
) = list
;
1578 if (EXPORT_NAME(area
))
1579 free(EXPORT_NAME(area
));
1581 EXPORT_NAME(area
) = strdup(list_name
);
1582 ospf_schedule_abr_task(ospf
);
1587 int ospf_area_export_list_unset(struct ospf
*ospf
, struct ospf_area
*area
)
1590 EXPORT_LIST(area
) = 0;
1592 if (EXPORT_NAME(area
))
1593 free(EXPORT_NAME(area
));
1595 EXPORT_NAME(area
) = NULL
;
1597 ospf_area_check_free(ospf
, area
->area_id
);
1599 ospf_schedule_abr_task(ospf
);
1604 int ospf_area_import_list_set(struct ospf
*ospf
, struct ospf_area
*area
,
1607 struct access_list
*list
;
1608 list
= access_list_lookup(AFI_IP
, name
);
1610 IMPORT_LIST(area
) = list
;
1612 if (IMPORT_NAME(area
))
1613 free(IMPORT_NAME(area
));
1615 IMPORT_NAME(area
) = strdup(name
);
1616 ospf_schedule_abr_task(ospf
);
1621 int ospf_area_import_list_unset(struct ospf
*ospf
, struct ospf_area
*area
)
1623 IMPORT_LIST(area
) = 0;
1625 if (IMPORT_NAME(area
))
1626 free(IMPORT_NAME(area
));
1628 IMPORT_NAME(area
) = NULL
;
1629 ospf_area_check_free(ospf
, area
->area_id
);
1631 ospf_schedule_abr_task(ospf
);
1636 int ospf_timers_refresh_set(struct ospf
*ospf
, int interval
)
1640 if (ospf
->lsa_refresh_interval
== interval
)
1643 time_left
= ospf
->lsa_refresh_interval
1644 - (monotime(NULL
) - ospf
->lsa_refresher_started
);
1646 if (time_left
> interval
) {
1647 OSPF_TIMER_OFF(ospf
->t_lsa_refresher
);
1648 thread_add_timer(master
, ospf_lsa_refresh_walker
, ospf
,
1649 interval
, &ospf
->t_lsa_refresher
);
1651 ospf
->lsa_refresh_interval
= interval
;
1656 int ospf_timers_refresh_unset(struct ospf
*ospf
)
1660 time_left
= ospf
->lsa_refresh_interval
1661 - (monotime(NULL
) - ospf
->lsa_refresher_started
);
1663 if (time_left
> OSPF_LSA_REFRESH_INTERVAL_DEFAULT
) {
1664 OSPF_TIMER_OFF(ospf
->t_lsa_refresher
);
1665 ospf
->t_lsa_refresher
= NULL
;
1666 thread_add_timer(master
, ospf_lsa_refresh_walker
, ospf
,
1667 OSPF_LSA_REFRESH_INTERVAL_DEFAULT
,
1668 &ospf
->t_lsa_refresher
);
1671 ospf
->lsa_refresh_interval
= OSPF_LSA_REFRESH_INTERVAL_DEFAULT
;
1677 static struct ospf_nbr_nbma
*ospf_nbr_nbma_new(void)
1679 struct ospf_nbr_nbma
*nbr_nbma
;
1681 nbr_nbma
= XCALLOC(MTYPE_OSPF_NEIGHBOR_STATIC
,
1682 sizeof(struct ospf_nbr_nbma
));
1684 nbr_nbma
->priority
= OSPF_NEIGHBOR_PRIORITY_DEFAULT
;
1685 nbr_nbma
->v_poll
= OSPF_POLL_INTERVAL_DEFAULT
;
1690 static void ospf_nbr_nbma_free(struct ospf_nbr_nbma
*nbr_nbma
)
1692 XFREE(MTYPE_OSPF_NEIGHBOR_STATIC
, nbr_nbma
);
1695 static void ospf_nbr_nbma_delete(struct ospf
*ospf
,
1696 struct ospf_nbr_nbma
*nbr_nbma
)
1698 struct route_node
*rn
;
1699 struct prefix_ipv4 p
;
1702 p
.prefix
= nbr_nbma
->addr
;
1703 p
.prefixlen
= IPV4_MAX_BITLEN
;
1705 rn
= route_node_lookup(ospf
->nbr_nbma
, (struct prefix
*)&p
);
1707 ospf_nbr_nbma_free(rn
->info
);
1709 route_unlock_node(rn
);
1710 route_unlock_node(rn
);
1714 static void ospf_nbr_nbma_down(struct ospf_nbr_nbma
*nbr_nbma
)
1716 OSPF_TIMER_OFF(nbr_nbma
->t_poll
);
1718 if (nbr_nbma
->nbr
) {
1719 nbr_nbma
->nbr
->nbr_nbma
= NULL
;
1720 OSPF_NSM_EVENT_EXECUTE(nbr_nbma
->nbr
, NSM_KillNbr
);
1724 listnode_delete(nbr_nbma
->oi
->nbr_nbma
, nbr_nbma
);
1727 static void ospf_nbr_nbma_add(struct ospf_nbr_nbma
*nbr_nbma
,
1728 struct ospf_interface
*oi
)
1730 struct ospf_neighbor
*nbr
;
1731 struct route_node
*rn
;
1734 if (oi
->type
!= OSPF_IFTYPE_NBMA
)
1737 if (nbr_nbma
->nbr
!= NULL
)
1740 if (IPV4_ADDR_SAME(&oi
->nbr_self
->address
.u
.prefix4
, &nbr_nbma
->addr
))
1744 listnode_add(oi
->nbr_nbma
, nbr_nbma
);
1746 /* Get neighbor information from table. */
1748 p
.prefixlen
= IPV4_MAX_BITLEN
;
1749 p
.u
.prefix4
= nbr_nbma
->addr
;
1751 rn
= route_node_get(oi
->nbrs
, (struct prefix
*)&p
);
1754 nbr
->nbr_nbma
= nbr_nbma
;
1755 nbr_nbma
->nbr
= nbr
;
1757 route_unlock_node(rn
);
1759 nbr
= rn
->info
= ospf_nbr_new(oi
);
1760 nbr
->state
= NSM_Down
;
1761 nbr
->src
= nbr_nbma
->addr
;
1762 nbr
->nbr_nbma
= nbr_nbma
;
1763 nbr
->priority
= nbr_nbma
->priority
;
1766 nbr_nbma
->nbr
= nbr
;
1768 OSPF_NSM_EVENT_EXECUTE(nbr
, NSM_Start
);
1772 void ospf_nbr_nbma_if_update(struct ospf
*ospf
, struct ospf_interface
*oi
)
1774 struct ospf_nbr_nbma
*nbr_nbma
;
1775 struct route_node
*rn
;
1776 struct prefix_ipv4 p
;
1778 if (oi
->type
!= OSPF_IFTYPE_NBMA
)
1781 for (rn
= route_top(ospf
->nbr_nbma
); rn
; rn
= route_next(rn
))
1782 if ((nbr_nbma
= rn
->info
))
1783 if (nbr_nbma
->oi
== NULL
&& nbr_nbma
->nbr
== NULL
) {
1785 p
.prefix
= nbr_nbma
->addr
;
1786 p
.prefixlen
= IPV4_MAX_BITLEN
;
1788 if (prefix_match(oi
->address
,
1789 (struct prefix
*)&p
))
1790 ospf_nbr_nbma_add(nbr_nbma
, oi
);
1794 struct ospf_nbr_nbma
*ospf_nbr_nbma_lookup(struct ospf
*ospf
,
1795 struct in_addr nbr_addr
)
1797 struct route_node
*rn
;
1798 struct prefix_ipv4 p
;
1801 p
.prefix
= nbr_addr
;
1802 p
.prefixlen
= IPV4_MAX_BITLEN
;
1804 rn
= route_node_lookup(ospf
->nbr_nbma
, (struct prefix
*)&p
);
1806 route_unlock_node(rn
);
1812 struct ospf_nbr_nbma
*ospf_nbr_nbma_lookup_next(struct ospf
*ospf
,
1813 struct in_addr
*addr
, int first
)
1816 struct ospf_nbr_nbma
*nbr_nbma
;
1817 struct listnode
*node
;
1824 for (ALL_LIST_ELEMENTS_RO (ospf
->nbr_nbma
, node
, nbr_nbma
))
1828 *addr
= nbr_nbma
->addr
;
1831 else if (ntohl (nbr_nbma
->addr
.s_addr
) > ntohl (addr
->s_addr
))
1833 *addr
= nbr_nbma
->addr
;
1841 int ospf_nbr_nbma_set(struct ospf
*ospf
, struct in_addr nbr_addr
)
1843 struct ospf_nbr_nbma
*nbr_nbma
;
1844 struct ospf_interface
*oi
;
1845 struct prefix_ipv4 p
;
1846 struct route_node
*rn
;
1847 struct listnode
*node
;
1849 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
1853 nbr_nbma
= ospf_nbr_nbma_new();
1854 nbr_nbma
->addr
= nbr_addr
;
1857 p
.prefix
= nbr_addr
;
1858 p
.prefixlen
= IPV4_MAX_BITLEN
;
1860 rn
= route_node_get(ospf
->nbr_nbma
, (struct prefix
*)&p
);
1862 route_unlock_node(rn
);
1863 rn
->info
= nbr_nbma
;
1865 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
1866 if (oi
->type
== OSPF_IFTYPE_NBMA
)
1867 if (prefix_match(oi
->address
, (struct prefix
*)&p
)) {
1868 ospf_nbr_nbma_add(nbr_nbma
, oi
);
1876 int ospf_nbr_nbma_unset(struct ospf
*ospf
, struct in_addr nbr_addr
)
1878 struct ospf_nbr_nbma
*nbr_nbma
;
1880 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
1881 if (nbr_nbma
== NULL
)
1884 ospf_nbr_nbma_down(nbr_nbma
);
1885 ospf_nbr_nbma_delete(ospf
, nbr_nbma
);
1890 int ospf_nbr_nbma_priority_set(struct ospf
*ospf
, struct in_addr nbr_addr
,
1893 struct ospf_nbr_nbma
*nbr_nbma
;
1895 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
1896 if (nbr_nbma
== NULL
)
1899 if (nbr_nbma
->priority
!= priority
)
1900 nbr_nbma
->priority
= priority
;
1905 int ospf_nbr_nbma_priority_unset(struct ospf
*ospf
, struct in_addr nbr_addr
)
1907 struct ospf_nbr_nbma
*nbr_nbma
;
1909 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
1910 if (nbr_nbma
== NULL
)
1913 if (nbr_nbma
!= OSPF_NEIGHBOR_PRIORITY_DEFAULT
)
1914 nbr_nbma
->priority
= OSPF_NEIGHBOR_PRIORITY_DEFAULT
;
1919 int ospf_nbr_nbma_poll_interval_set(struct ospf
*ospf
, struct in_addr nbr_addr
,
1920 unsigned int interval
)
1922 struct ospf_nbr_nbma
*nbr_nbma
;
1924 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
1925 if (nbr_nbma
== NULL
)
1928 if (nbr_nbma
->v_poll
!= interval
) {
1929 nbr_nbma
->v_poll
= interval
;
1930 if (nbr_nbma
->oi
&& ospf_if_is_up(nbr_nbma
->oi
)) {
1931 OSPF_TIMER_OFF(nbr_nbma
->t_poll
);
1932 OSPF_POLL_TIMER_ON(nbr_nbma
->t_poll
, ospf_poll_timer
,
1940 int ospf_nbr_nbma_poll_interval_unset(struct ospf
*ospf
, struct in_addr addr
)
1942 struct ospf_nbr_nbma
*nbr_nbma
;
1944 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, addr
);
1945 if (nbr_nbma
== NULL
)
1948 if (nbr_nbma
->v_poll
!= OSPF_POLL_INTERVAL_DEFAULT
)
1949 nbr_nbma
->v_poll
= OSPF_POLL_INTERVAL_DEFAULT
;
1954 void ospf_master_init(struct thread_master
*master
)
1956 memset(&ospf_master
, 0, sizeof(struct ospf_master
));
1959 om
->ospf
= list_new();
1960 om
->master
= master
;
1963 /* Link OSPF instance to VRF. */
1964 void ospf_vrf_link(struct ospf
*ospf
, struct vrf
*vrf
)
1966 ospf
->vrf_id
= vrf
->vrf_id
;
1967 if (vrf
->info
!= (void *)ospf
)
1968 vrf
->info
= (void *)ospf
;
1971 /* Unlink OSPF instance from VRF. */
1972 void ospf_vrf_unlink(struct ospf
*ospf
, struct vrf
*vrf
)
1974 if (vrf
->info
== (void *)ospf
)
1976 ospf
->vrf_id
= VRF_UNKNOWN
;
1979 /* This is hook function for vrf create called as part of vrf_init */
1980 static int ospf_vrf_new(struct vrf
*vrf
)
1982 if (IS_DEBUG_OSPF_EVENT
)
1983 zlog_debug("%s: VRF Created: %s(%d)", __PRETTY_FUNCTION__
,
1984 vrf
->name
, vrf
->vrf_id
);
1989 /* This is hook function for vrf delete call as part of vrf_init */
1990 static int ospf_vrf_delete(struct vrf
*vrf
)
1992 if (IS_DEBUG_OSPF_EVENT
)
1993 zlog_debug("%s: VRF Deletion: %s(%d)", __PRETTY_FUNCTION__
,
1994 vrf
->name
, vrf
->vrf_id
);
1999 /* Enable OSPF VRF instance */
2000 static int ospf_vrf_enable(struct vrf
*vrf
)
2002 struct ospf
*ospf
= NULL
;
2003 vrf_id_t old_vrf_id
= VRF_DEFAULT
;
2005 if (IS_DEBUG_OSPF_EVENT
)
2006 zlog_debug("%s: VRF %s id %d enabled",
2007 __PRETTY_FUNCTION__
, vrf
->name
, vrf
->vrf_id
);
2009 ospf
= ospf_lookup_by_name(vrf
->name
);
2011 old_vrf_id
= ospf
->vrf_id
;
2012 /* We have instance configured, link to VRF and make it "up". */
2013 ospf_vrf_link(ospf
, vrf
);
2014 if (IS_DEBUG_OSPF_EVENT
)
2015 zlog_debug("%s: ospf linked to vrf %s vrf_id %d (old id %d)",
2016 __PRETTY_FUNCTION__
, vrf
->name
, ospf
->vrf_id
,
2019 if (old_vrf_id
!= ospf
->vrf_id
) {
2020 if (ospfd_privs
.change(ZPRIVS_RAISE
)) {
2021 zlog_err("ospf_sock_init: could not raise privs, %s",
2022 safe_strerror(errno
));
2024 if (ospf_bind_vrfdevice(ospf
, ospf
->fd
) < 0)
2026 if (ospfd_privs
.change(ZPRIVS_LOWER
)) {
2027 zlog_err("ospf_sock_init: could not lower privs, %s",
2028 safe_strerror(errno
));
2031 ospf
->oi_running
= 1;
2032 ospf_router_id_update(ospf
);
2039 /* Disable OSPF VRF instance */
2040 static int ospf_vrf_disable(struct vrf
*vrf
)
2042 struct ospf
*ospf
= NULL
;
2043 vrf_id_t old_vrf_id
= VRF_UNKNOWN
;
2045 if (vrf
->vrf_id
== VRF_DEFAULT
)
2048 if (IS_DEBUG_OSPF_EVENT
)
2049 zlog_debug("%s: VRF %s id %d disabled.",
2050 __PRETTY_FUNCTION__
, vrf
->name
, vrf
->vrf_id
);
2052 ospf
= ospf_lookup_by_name(vrf
->name
);
2054 old_vrf_id
= ospf
->vrf_id
;
2056 /* We have instance configured, unlink
2057 * from VRF and make it "down".
2059 ospf_vrf_unlink(ospf
, vrf
);
2060 ospf
->oi_running
= 0;
2061 if (IS_DEBUG_OSPF_EVENT
)
2062 zlog_debug("%s: ospf old_vrf_id %d unlinked",
2063 __PRETTY_FUNCTION__
, old_vrf_id
);
2066 /* Note: This is a callback, the VRF will be deleted by the caller. */
2070 void ospf_vrf_init(void)
2072 vrf_init(ospf_vrf_new
, ospf_vrf_enable
,
2073 ospf_vrf_disable
, ospf_vrf_delete
);
2076 void ospf_vrf_terminate(void)
2081 const char *ospf_vrf_id_to_name(vrf_id_t vrf_id
)
2083 struct vrf
*vrf
= vrf_lookup_by_id(vrf_id
);
2085 return vrf
? vrf
->name
: "NIL";