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
;
71 static void ospf_remove_vls_through_area(struct ospf
*, struct ospf_area
*);
72 static void ospf_network_free(struct ospf
*, struct ospf_network
*);
73 static void ospf_area_free(struct ospf_area
*);
74 static void ospf_network_run(struct prefix
*, struct ospf_area
*);
75 static void ospf_network_run_interface(struct ospf
*, struct interface
*,
76 struct prefix
*, struct ospf_area
*);
77 static void ospf_network_run_subnet(struct ospf
*, struct connected
*,
78 struct prefix
*, struct ospf_area
*);
79 static int ospf_network_match_iface(const struct connected
*,
80 const struct prefix
*);
81 static void ospf_finish_final(struct ospf
*);
83 #define OSPF_EXTERNAL_LSA_ORIGINATE_DELAY 1
85 void ospf_router_id_update(struct ospf
*ospf
)
87 struct vrf
*vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
88 struct in_addr router_id
, router_id_old
;
89 struct ospf_interface
*oi
;
90 struct interface
*ifp
;
91 struct listnode
*node
;
94 if (!ospf
->oi_running
) {
95 if (IS_DEBUG_OSPF_EVENT
)
97 "Router ospf not configured -- Router-ID update postponed");
101 if (IS_DEBUG_OSPF_EVENT
)
102 zlog_debug("Router-ID[OLD:%s]: Update",
103 inet_ntoa(ospf
->router_id
));
105 router_id_old
= ospf
->router_id
;
107 /* Select the router ID based on these priorities:
108 1. Statically assigned router ID is always the first choice.
109 2. If there is no statically assigned router ID, then try to stick
110 with the most recent value, since changing router ID's is very
112 3. Last choice: just go with whatever the zebra daemon recommends.
114 if (ospf
->router_id_static
.s_addr
!= 0)
115 router_id
= ospf
->router_id_static
;
116 else if (ospf
->router_id
.s_addr
!= 0)
117 router_id
= ospf
->router_id
;
119 router_id
= ospf
->router_id_zebra
;
121 if (IS_DEBUG_OSPF_EVENT
)
122 zlog_debug("Router-ID[OLD:%s]: Update to %s",
123 inet_ntoa(ospf
->router_id
),
124 inet_ntoa(router_id
));
126 if (!IPV4_ADDR_SAME(&router_id_old
, &router_id
)) {
128 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
129 /* Some nbrs are identified by router_id, these needs
130 * to be rebuilt. Possible optimization would be to do
131 * oi->nbr_self->router_id = router_id for
132 * !(virtual | ptop) links
134 ospf_nbr_self_reset(oi
, router_id
);
137 /* If AS-external-LSA is queued, then flush those LSAs. */
138 if (router_id_old
.s_addr
== 0 && ospf
->external_origin
) {
139 /* Originate each redistributed external route. */
140 for (type
= 0; type
< ZEBRA_ROUTE_MAX
; type
++)
141 if (ospf
->external_origin
& (1 << type
))
144 ospf_external_lsa_originate_timer
,
146 /* Originate Deafult. */
147 if (ospf
->external_origin
& (1 << ZEBRA_ROUTE_MAX
))
148 thread_add_event(master
,
149 ospf_default_originate_timer
,
152 ospf
->external_origin
= 0;
155 /* Flush (inline) all external LSAs based on the OSPF_LSA_SELF
158 struct route_node
*rn
;
159 struct ospf_lsa
*lsa
;
161 LSDB_LOOP(EXTERNAL_LSDB(ospf
), rn
, lsa
)
162 if (IS_LSA_SELF(lsa
))
163 ospf_lsa_flush_schedule(ospf
, lsa
);
166 ospf
->router_id
= router_id
;
167 if (IS_DEBUG_OSPF_EVENT
)
168 zlog_debug("Router-ID[NEW:%s]: Update",
169 inet_ntoa(ospf
->router_id
));
171 /* Flush (inline) all external LSAs which now match the new
173 need to adjust the OSPF_LSA_SELF flag, so the flush doesnt
175 asserts in ospf_refresher_unregister_lsa(). This step is
177 because the current quagga code does look-up for
179 based on the self router-id alone but expects OSPF_LSA_SELF
183 struct route_node
*rn
;
184 struct ospf_lsa
*lsa
;
186 LSDB_LOOP (EXTERNAL_LSDB(ospf
), rn
, lsa
) {
187 /* AdvRouter and Router ID is the same. */
188 if (IPV4_ADDR_SAME(&lsa
->data
->adv_router
,
191 OSPF_LSA_SELF_CHECKED
);
192 SET_FLAG(lsa
->flags
, OSPF_LSA_SELF
);
193 ospf_lsa_flush_schedule(ospf
, lsa
);
198 /* Originate each redistributed external route. */
199 for (type
= 0; type
< ZEBRA_ROUTE_MAX
; type
++)
200 thread_add_event(master
,
201 ospf_external_lsa_originate_timer
,
203 thread_add_event(master
, ospf_default_originate_timer
, ospf
, 0,
206 /* update router-lsa's for each area */
207 ospf_router_lsa_update(ospf
);
209 /* update ospf_interface's */
210 FOR_ALL_INTERFACES (vrf
, ifp
)
211 ospf_if_update(ospf
, ifp
);
215 /* For OSPF area sort by area id. */
216 static int ospf_area_id_cmp(struct ospf_area
*a1
, struct ospf_area
*a2
)
218 if (ntohl(a1
->area_id
.s_addr
) > ntohl(a2
->area_id
.s_addr
))
220 if (ntohl(a1
->area_id
.s_addr
) < ntohl(a2
->area_id
.s_addr
))
225 /* Allocate new ospf structure. */
226 static struct ospf
*ospf_new(u_short instance
, const char *name
)
229 struct vrf
*vrf
= NULL
;
231 struct ospf
*new = XCALLOC(MTYPE_OSPF_TOP
, sizeof(struct ospf
));
233 new->instance
= instance
;
234 new->router_id
.s_addr
= htonl(0);
235 new->router_id_static
.s_addr
= htonl(0);
238 new->vrf_id
= VRF_UNKNOWN
;
239 /* Freed in ospf_finish_final */
240 new->name
= XSTRDUP(MTYPE_OSPF_TOP
, name
);
241 vrf
= vrf_lookup_by_name(new->name
);
242 if (IS_DEBUG_OSPF_EVENT
)
243 zlog_debug("%s: Create new ospf instance with vrf_name %s vrf_id %u",
244 __PRETTY_FUNCTION__
, name
, new->vrf_id
);
246 ospf_vrf_link(new, vrf
);
248 new->vrf_id
= VRF_DEFAULT
;
249 vrf
= vrf_lookup_by_id(VRF_DEFAULT
);
250 ospf_vrf_link(new, vrf
);
252 ospf_zebra_vrf_register(new);
254 new->abr_type
= OSPF_ABR_DEFAULT
;
255 new->oiflist
= list_new();
256 new->vlinks
= list_new();
257 new->areas
= list_new();
258 new->areas
->cmp
= (int (*)(void *, void *))ospf_area_id_cmp
;
259 new->networks
= route_table_init();
260 new->nbr_nbma
= route_table_init();
262 new->lsdb
= ospf_lsdb_new();
264 new->default_originate
= DEFAULT_ORIGINATE_NONE
;
266 new->passive_interface_default
= OSPF_IF_ACTIVE
;
268 new->new_external_route
= route_table_init();
269 new->old_external_route
= route_table_init();
270 new->external_lsas
= route_table_init();
272 new->stub_router_startup_time
= OSPF_STUB_ROUTER_UNCONFIGURED
;
273 new->stub_router_shutdown_time
= OSPF_STUB_ROUTER_UNCONFIGURED
;
274 new->stub_router_admin_set
= OSPF_STUB_ROUTER_ADMINISTRATIVE_UNSET
;
276 /* Distribute parameter init. */
277 for (i
= 0; i
<= ZEBRA_ROUTE_MAX
; i
++) {
280 new->default_metric
= -1;
281 new->ref_bandwidth
= OSPF_DEFAULT_REF_BANDWIDTH
;
284 new->min_ls_interval
= OSPF_MIN_LS_INTERVAL
;
285 new->min_ls_arrival
= OSPF_MIN_LS_ARRIVAL
;
287 /* SPF timer value init. */
288 new->spf_delay
= OSPF_SPF_DELAY_DEFAULT
;
289 new->spf_holdtime
= OSPF_SPF_HOLDTIME_DEFAULT
;
290 new->spf_max_holdtime
= OSPF_SPF_MAX_HOLDTIME_DEFAULT
;
291 new->spf_hold_multiplier
= 1;
294 new->maxage_delay
= OSPF_LSA_MAXAGE_REMOVE_DELAY_DEFAULT
;
295 new->maxage_lsa
= route_table_init();
296 new->t_maxage_walker
= NULL
;
297 thread_add_timer(master
, ospf_lsa_maxage_walker
, new,
298 OSPF_LSA_MAXAGE_CHECK_INTERVAL
, &new->t_maxage_walker
);
300 /* Distance table init. */
301 new->distance_table
= route_table_init();
303 new->lsa_refresh_queue
.index
= 0;
304 new->lsa_refresh_interval
= OSPF_LSA_REFRESH_INTERVAL_DEFAULT
;
305 new->t_lsa_refresher
= NULL
;
306 thread_add_timer(master
, ospf_lsa_refresh_walker
, new,
307 new->lsa_refresh_interval
, &new->t_lsa_refresher
);
308 new->lsa_refresher_started
= monotime(NULL
);
310 if ((ospf_sock_init(new)) < 0) {
312 "ospf_new: fatal error: ospf_sock_init was unable to open "
316 if ((new->ibuf
= stream_new(OSPF_MAX_PACKET_SIZE
+ 1)) == NULL
) {
318 "ospf_new: fatal error: stream_new(%u) failed allocating ibuf",
319 OSPF_MAX_PACKET_SIZE
+ 1);
323 thread_add_read(master
, ospf_read
, new, new->fd
, &new->t_read
);
324 new->oi_write_q
= list_new();
325 new->write_oi_count
= OSPF_WRITE_INTERFACE_COUNT_DEFAULT
;
327 /* Enable "log-adjacency-changes" */
328 #if DFLT_OSPF_LOG_ADJACENCY_CHANGES
329 SET_FLAG(new->config
, OSPF_LOG_ADJACENCY_CHANGES
);
337 struct ospf
*ospf_lookup_instance(u_short instance
)
340 struct listnode
*node
, *nnode
;
342 if (listcount(om
->ospf
) == 0)
345 for (ALL_LIST_ELEMENTS(om
->ospf
, node
, nnode
, ospf
))
346 if ((ospf
->instance
== 0 && instance
== 0)
347 || (ospf
->instance
&& instance
348 && ospf
->instance
== instance
))
354 static int ospf_is_ready(struct ospf
*ospf
)
356 /* OSPF must be on and Router-ID must be configured. */
357 if (!ospf
|| ospf
->router_id
.s_addr
== 0)
363 static void ospf_add(struct ospf
*ospf
)
365 listnode_add(om
->ospf
, ospf
);
368 static void ospf_delete(struct ospf
*ospf
)
370 listnode_delete(om
->ospf
, ospf
);
373 struct ospf
*ospf_lookup_by_inst_name(u_short instance
, const char *name
)
375 struct ospf
*ospf
= NULL
;
376 struct listnode
*node
, *nnode
;
378 for (ALL_LIST_ELEMENTS(om
->ospf
, node
, nnode
, ospf
)) {
379 if ((ospf
->instance
== instance
) &&
380 ((ospf
->name
== NULL
&& name
== NULL
) ||
381 (ospf
->name
&& name
&& strcmp(ospf
->name
, name
) == 0)))
387 struct ospf
*ospf_get(u_short instance
, const char *name
)
391 /* vrf name provided call inst and name based api
392 * in case of no name pass default ospf instance */
394 ospf
= ospf_lookup_by_inst_name(instance
, name
);
396 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
399 ospf
= ospf_new(instance
, name
);
402 if (ospf
->router_id_static
.s_addr
== 0)
403 ospf_router_id_update(ospf
);
405 ospf_opaque_type11_lsa_init(ospf
);
411 struct ospf
*ospf_get_instance(u_short instance
)
415 ospf
= ospf_lookup_instance(instance
);
417 ospf
= ospf_new(instance
, NULL
/* VRF_DEFAULT*/);
420 if (ospf
->router_id_static
.s_addr
== 0) {
421 if (vrf_lookup_by_id(ospf
->vrf_id
))
422 ospf_router_id_update(ospf
);
424 if (IS_DEBUG_OSPF_EVENT
)
425 zlog_debug("%s: ospf VRF (id %d) is not active yet, skip router id update"
426 , __PRETTY_FUNCTION__
,
429 ospf_router_id_update(ospf
);
432 ospf_opaque_type11_lsa_init(ospf
);
438 struct ospf
*ospf_lookup_by_vrf_id(vrf_id_t vrf_id
)
440 struct vrf
*vrf
= NULL
;
442 vrf
= vrf_lookup_by_id(vrf_id
);
445 return (vrf
->info
) ? (struct ospf
*)vrf
->info
: NULL
;
449 /* It should only be used when processing incoming info update from zebra.
450 * Other situations, it is not sufficient to lookup the ospf instance by
451 * vrf_name only without using the instance number.
453 static struct ospf
*ospf_lookup_by_name(const char *vrf_name
)
455 struct ospf
*ospf
= NULL
;
456 struct listnode
*node
, *nnode
;
458 for (ALL_LIST_ELEMENTS(om
->ospf
, node
, nnode
, ospf
))
459 if ((ospf
->name
== NULL
&& vrf_name
== NULL
)
460 || (ospf
->name
&& vrf_name
&&
461 strcmp(ospf
->name
, vrf_name
) == 0))
466 /* Handle the second half of deferred shutdown. This is called either
467 * from the deferred-shutdown timer thread, or directly through
468 * ospf_deferred_shutdown_check.
470 * Function is to cleanup G-R state, if required then call ospf_finish_final
471 * to complete shutdown of this ospf instance. Possibly exit if the
472 * whole process is being shutdown and this was the last OSPF instance.
474 static void ospf_deferred_shutdown_finish(struct ospf
*ospf
)
476 ospf
->stub_router_shutdown_time
= OSPF_STUB_ROUTER_UNCONFIGURED
;
477 OSPF_TIMER_OFF(ospf
->t_deferred_shutdown
);
479 ospf_finish_final(ospf
);
481 /* *ospf is now invalid */
483 /* ospfd being shut-down? If so, was this the last ospf instance? */
484 if (CHECK_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
)
485 && (listcount(om
->ospf
) == 0)) {
492 /* Timer thread for G-R */
493 static int ospf_deferred_shutdown_timer(struct thread
*t
)
495 struct ospf
*ospf
= THREAD_ARG(t
);
497 ospf_deferred_shutdown_finish(ospf
);
502 /* Check whether deferred-shutdown must be scheduled, otherwise call
503 * down directly into second-half of instance shutdown.
505 static void ospf_deferred_shutdown_check(struct ospf
*ospf
)
507 unsigned long timeout
;
509 struct ospf_area
*area
;
511 /* deferred shutdown already running? */
512 if (ospf
->t_deferred_shutdown
)
515 /* Should we try push out max-metric LSAs? */
516 if (ospf
->stub_router_shutdown_time
!= OSPF_STUB_ROUTER_UNCONFIGURED
) {
517 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, ln
, area
)) {
518 SET_FLAG(area
->stub_router_state
,
519 OSPF_AREA_ADMIN_STUB_ROUTED
);
521 if (!CHECK_FLAG(area
->stub_router_state
,
522 OSPF_AREA_IS_STUB_ROUTED
))
523 ospf_router_lsa_update_area(area
);
525 timeout
= ospf
->stub_router_shutdown_time
;
527 /* No timer needed */
528 ospf_deferred_shutdown_finish(ospf
);
532 OSPF_TIMER_ON(ospf
->t_deferred_shutdown
, ospf_deferred_shutdown_timer
,
537 /* Shut down the entire process */
538 void ospf_terminate(void)
541 struct listnode
*node
, *nnode
;
543 /* shutdown already in progress */
544 if (CHECK_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
))
547 SET_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
);
549 /* exit immediately if OSPF not actually running */
550 if (listcount(om
->ospf
) == 0)
554 for (ALL_LIST_ELEMENTS(om
->ospf
, node
, nnode
, ospf
))
557 /* Deliberately go back up, hopefully to thread scheduler, as
558 * One or more ospf_finish()'s may have deferred shutdown to a timer
561 zclient_stop(zclient
);
562 zclient_free(zclient
);
567 void ospf_finish(struct ospf
*ospf
)
569 /* let deferred shutdown decide */
570 ospf_deferred_shutdown_check(ospf
);
572 /* if ospf_deferred_shutdown returns, then ospf_finish_final is
573 * deferred to expiry of G-S timer thread. Return back up, hopefully
574 * to thread scheduler.
579 /* Final cleanup of ospf instance */
580 static void ospf_finish_final(struct ospf
*ospf
)
582 struct vrf
*vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
583 struct route_node
*rn
;
584 struct ospf_nbr_nbma
*nbr_nbma
;
585 struct ospf_lsa
*lsa
;
586 struct interface
*ifp
;
587 struct ospf_interface
*oi
;
588 struct ospf_area
*area
;
589 struct ospf_vl_data
*vl_data
;
590 struct listnode
*node
, *nnode
;
592 u_short instance
= 0;
596 ospf_opaque_type11_lsa_term(ospf
);
598 ospf_flush_self_originated_lsas_now(ospf
);
600 /* Unregister redistribution */
601 for (i
= 0; i
< ZEBRA_ROUTE_MAX
; i
++) {
602 struct list
*red_list
;
603 struct ospf_redist
*red
;
605 red_list
= ospf
->redist
[i
];
609 for (ALL_LIST_ELEMENTS(red_list
, node
, nnode
, red
))
610 ospf_redistribute_unset(ospf
, i
, red
->instance
);
612 ospf_redistribute_default_unset(ospf
);
614 for (ALL_LIST_ELEMENTS(ospf
->areas
, node
, nnode
, area
))
615 ospf_remove_vls_through_area(ospf
, area
);
617 for (ALL_LIST_ELEMENTS(ospf
->vlinks
, node
, nnode
, vl_data
))
618 ospf_vl_delete(ospf
, vl_data
);
620 list_delete_and_null(&ospf
->vlinks
);
622 /* Remove any ospf interface config params */
623 FOR_ALL_INTERFACES (vrf
, ifp
) {
624 struct ospf_if_params
*params
;
626 params
= IF_DEF_PARAMS(ifp
);
627 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
))
628 UNSET_IF_PARAM(params
, if_area
);
631 /* Reset interface. */
632 for (ALL_LIST_ELEMENTS(ospf
->oiflist
, node
, nnode
, oi
))
634 list_delete_and_null(&ospf
->oiflist
);
636 /* De-Register VRF */
637 ospf_zebra_vrf_deregister(ospf
);
639 /* Clear static neighbors */
640 for (rn
= route_top(ospf
->nbr_nbma
); rn
; rn
= route_next(rn
))
641 if ((nbr_nbma
= rn
->info
)) {
642 OSPF_POLL_TIMER_OFF(nbr_nbma
->t_poll
);
645 nbr_nbma
->nbr
->nbr_nbma
= NULL
;
646 nbr_nbma
->nbr
= NULL
;
650 listnode_delete(nbr_nbma
->oi
->nbr_nbma
,
655 XFREE(MTYPE_OSPF_NEIGHBOR_STATIC
, nbr_nbma
);
658 route_table_finish(ospf
->nbr_nbma
);
660 /* Clear networks and Areas. */
661 for (rn
= route_top(ospf
->networks
); rn
; rn
= route_next(rn
)) {
662 struct ospf_network
*network
;
664 if ((network
= rn
->info
) != NULL
) {
665 ospf_network_free(ospf
, network
);
667 route_unlock_node(rn
);
670 route_table_finish(ospf
->networks
);
672 for (ALL_LIST_ELEMENTS(ospf
->areas
, node
, nnode
, area
)) {
673 listnode_delete(ospf
->areas
, area
);
674 ospf_area_free(area
);
677 /* Cancel all timers. */
678 OSPF_TIMER_OFF(ospf
->t_external_lsa
);
679 OSPF_TIMER_OFF(ospf
->t_spf_calc
);
680 OSPF_TIMER_OFF(ospf
->t_ase_calc
);
681 OSPF_TIMER_OFF(ospf
->t_maxage
);
682 OSPF_TIMER_OFF(ospf
->t_maxage_walker
);
683 OSPF_TIMER_OFF(ospf
->t_abr_task
);
684 OSPF_TIMER_OFF(ospf
->t_asbr_check
);
685 OSPF_TIMER_OFF(ospf
->t_distribute_update
);
686 OSPF_TIMER_OFF(ospf
->t_lsa_refresher
);
687 OSPF_TIMER_OFF(ospf
->t_read
);
688 OSPF_TIMER_OFF(ospf
->t_write
);
689 OSPF_TIMER_OFF(ospf
->t_opaque_lsa_self
);
692 stream_free(ospf
->ibuf
);
694 LSDB_LOOP(OPAQUE_AS_LSDB(ospf
), rn
, lsa
)
695 ospf_discard_from_db(ospf
, ospf
->lsdb
, lsa
);
696 LSDB_LOOP(EXTERNAL_LSDB(ospf
), rn
, lsa
)
697 ospf_discard_from_db(ospf
, ospf
->lsdb
, lsa
);
699 ospf_lsdb_delete_all(ospf
->lsdb
);
700 ospf_lsdb_free(ospf
->lsdb
);
702 for (rn
= route_top(ospf
->maxage_lsa
); rn
; rn
= route_next(rn
)) {
703 struct ospf_lsa
*lsa
;
705 if ((lsa
= rn
->info
) != NULL
) {
706 ospf_lsa_unlock(&lsa
);
709 route_unlock_node(rn
);
711 route_table_finish(ospf
->maxage_lsa
);
714 ospf_route_table_free(ospf
->old_table
);
715 if (ospf
->new_table
) {
716 ospf_route_delete(ospf
, ospf
->new_table
);
717 ospf_route_table_free(ospf
->new_table
);
720 ospf_rtrs_free(ospf
->old_rtrs
);
722 ospf_rtrs_free(ospf
->new_rtrs
);
723 if (ospf
->new_external_route
) {
724 ospf_route_delete(ospf
, ospf
->new_external_route
);
725 ospf_route_table_free(ospf
->new_external_route
);
727 if (ospf
->old_external_route
) {
728 ospf_route_delete(ospf
, ospf
->old_external_route
);
729 ospf_route_table_free(ospf
->old_external_route
);
731 if (ospf
->external_lsas
) {
732 ospf_ase_external_lsas_finish(ospf
->external_lsas
);
735 list_delete_and_null(&ospf
->areas
);
736 list_delete_and_null(&ospf
->oi_write_q
);
738 for (i
= ZEBRA_ROUTE_SYSTEM
; i
<= ZEBRA_ROUTE_MAX
; i
++) {
739 struct list
*ext_list
;
740 struct listnode
*node
;
741 struct ospf_external
*ext
;
743 ext_list
= ospf
->external
[i
];
747 for (ALL_LIST_ELEMENTS_RO(ext_list
, node
, ext
)) {
748 if (ext
->external_info
)
749 for (rn
= route_top(ext
->external_info
); rn
;
750 rn
= route_next(rn
)) {
751 if (rn
->info
== NULL
)
754 XFREE(MTYPE_OSPF_EXTERNAL_INFO
,
757 route_unlock_node(rn
);
762 ospf_distance_reset(ospf
);
763 route_table_finish(ospf
->distance_table
);
765 if (!CHECK_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
))
766 instance
= ospf
->instance
;
771 vrf
= vrf_lookup_by_name(ospf
->name
);
773 ospf_vrf_unlink(ospf
, vrf
);
774 XFREE(MTYPE_OSPF_TOP
, ospf
->name
);
776 vrf
= vrf_lookup_by_id(VRF_DEFAULT
);
778 ospf_vrf_unlink(ospf
, vrf
);
781 XFREE(MTYPE_OSPF_TOP
, ospf
);
783 if (!CHECK_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
))
784 ospf_get_instance(instance
);
788 /* allocate new OSPF Area object */
789 static struct ospf_area
*ospf_area_new(struct ospf
*ospf
,
790 struct in_addr area_id
)
792 struct ospf_area
*new;
794 /* Allocate new config_network. */
795 new = XCALLOC(MTYPE_OSPF_AREA
, sizeof(struct ospf_area
));
799 new->area_id
= area_id
;
800 new->area_id_fmt
= OSPF_AREA_ID_FMT_DOTTEDQUAD
;
802 new->external_routing
= OSPF_AREA_DEFAULT
;
803 new->default_cost
= 1;
804 new->auth_type
= OSPF_AUTH_NULL
;
807 new->lsdb
= ospf_lsdb_new();
809 /* Self-originated LSAs initialize. */
810 new->router_lsa_self
= NULL
;
812 ospf_opaque_type10_lsa_init(new);
814 new->oiflist
= list_new();
815 new->ranges
= route_table_init();
817 if (area_id
.s_addr
== OSPF_AREA_BACKBONE
)
818 ospf
->backbone
= new;
823 static void ospf_area_free(struct ospf_area
*area
)
825 struct route_node
*rn
;
826 struct ospf_lsa
*lsa
;
828 ospf_opaque_type10_lsa_term(area
);
831 LSDB_LOOP(ROUTER_LSDB(area
), rn
, lsa
)
832 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
833 LSDB_LOOP(NETWORK_LSDB(area
), rn
, lsa
)
834 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
835 LSDB_LOOP(SUMMARY_LSDB(area
), rn
, lsa
)
836 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
837 LSDB_LOOP(ASBR_SUMMARY_LSDB(area
), rn
, lsa
)
838 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
840 LSDB_LOOP(NSSA_LSDB(area
), rn
, lsa
)
841 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
842 LSDB_LOOP(OPAQUE_AREA_LSDB(area
), rn
, lsa
)
843 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
844 LSDB_LOOP(OPAQUE_LINK_LSDB(area
), rn
, lsa
)
845 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
847 ospf_opaque_type10_lsa_term(area
);
848 ospf_lsdb_delete_all(area
->lsdb
);
849 ospf_lsdb_free(area
->lsdb
);
851 ospf_lsa_unlock(&area
->router_lsa_self
);
853 route_table_finish(area
->ranges
);
854 list_delete_and_null(&area
->oiflist
);
856 if (EXPORT_NAME(area
))
857 free(EXPORT_NAME(area
));
859 if (IMPORT_NAME(area
))
860 free(IMPORT_NAME(area
));
863 OSPF_TIMER_OFF(area
->t_stub_router
);
864 OSPF_TIMER_OFF(area
->t_opaque_lsa_self
);
866 if (OSPF_IS_AREA_BACKBONE(area
))
867 area
->ospf
->backbone
= NULL
;
869 XFREE(MTYPE_OSPF_AREA
, area
);
872 void ospf_area_check_free(struct ospf
*ospf
, struct in_addr area_id
)
874 struct ospf_area
*area
;
876 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
877 if (area
&& listcount(area
->oiflist
) == 0 && area
->ranges
->top
== NULL
878 && area
->shortcut_configured
== OSPF_SHORTCUT_DEFAULT
879 && area
->external_routing
== OSPF_AREA_DEFAULT
880 && area
->no_summary
== 0 && area
->default_cost
== 1
881 && EXPORT_NAME(area
) == NULL
&& IMPORT_NAME(area
) == NULL
882 && area
->auth_type
== OSPF_AUTH_NULL
) {
883 listnode_delete(ospf
->areas
, area
);
884 ospf_area_free(area
);
888 struct ospf_area
*ospf_area_get(struct ospf
*ospf
, struct in_addr area_id
)
890 struct ospf_area
*area
;
892 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
894 area
= ospf_area_new(ospf
, area_id
);
895 listnode_add_sort(ospf
->areas
, area
);
896 ospf_check_abr_status(ospf
);
897 if (ospf
->stub_router_admin_set
898 == OSPF_STUB_ROUTER_ADMINISTRATIVE_SET
) {
899 SET_FLAG(area
->stub_router_state
,
900 OSPF_AREA_ADMIN_STUB_ROUTED
);
907 struct ospf_area
*ospf_area_lookup_by_area_id(struct ospf
*ospf
,
908 struct in_addr area_id
)
910 struct ospf_area
*area
;
911 struct listnode
*node
;
913 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
))
914 if (IPV4_ADDR_SAME(&area
->area_id
, &area_id
))
920 void ospf_area_add_if(struct ospf_area
*area
, struct ospf_interface
*oi
)
922 listnode_add(area
->oiflist
, oi
);
925 void ospf_area_del_if(struct ospf_area
*area
, struct ospf_interface
*oi
)
927 listnode_delete(area
->oiflist
, oi
);
931 static void add_ospf_interface(struct connected
*co
, struct ospf_area
*area
)
933 struct ospf_interface
*oi
;
935 oi
= ospf_if_new(area
->ospf
, co
->ifp
, co
->address
);
940 oi
->params
= ospf_lookup_if_params(co
->ifp
, oi
->address
->u
.prefix4
);
941 oi
->output_cost
= ospf_if_get_output_cost(oi
);
943 /* Relate ospf interface to ospf instance. */
944 oi
->ospf
= area
->ospf
;
946 /* update network type as interface flag */
947 /* If network type is specified previously,
948 skip network type setting. */
949 oi
->type
= IF_DEF_PARAMS(co
->ifp
)->type
;
951 /* Add pseudo neighbor. */
952 ospf_nbr_self_reset(oi
, oi
->ospf
->router_id
);
954 ospf_area_add_if(oi
->area
, oi
);
957 * if router_id is not configured, dont bring up
959 * ospf_router_id_update() will call ospf_if_update
960 * whenever r-id is configured instead.
962 if ((area
->ospf
->router_id
.s_addr
!= 0) && if_is_operative(co
->ifp
))
966 static void update_redistributed(struct ospf
*ospf
, int add_to_ospf
)
968 struct route_node
*rn
;
969 struct external_info
*ei
;
970 struct ospf_external
*ext
;
972 if (ospf_is_type_redistributed(ospf
, ZEBRA_ROUTE_CONNECT
, 0)) {
973 ext
= ospf_external_lookup(ospf
, ZEBRA_ROUTE_CONNECT
, 0);
974 if ((ext
) && EXTERNAL_INFO(ext
)) {
975 for (rn
= route_top(EXTERNAL_INFO(ext
)); rn
;
976 rn
= route_next(rn
)) {
982 if (ospf_external_info_find_lsa(
984 if (!ospf_distribute_check_connected(
986 ospf_external_lsa_flush(
990 ei
->ifindex
/*, ei->nexthop */);
992 if (!ospf_external_info_find_lsa(
994 if (ospf_distribute_check_connected(
996 ospf_external_lsa_originate(
1005 /* Config network statement related functions. */
1006 static struct ospf_network
*ospf_network_new(struct in_addr area_id
)
1008 struct ospf_network
*new;
1009 new = XCALLOC(MTYPE_OSPF_NETWORK
, sizeof(struct ospf_network
));
1011 new->area_id
= area_id
;
1012 new->area_id_fmt
= OSPF_AREA_ID_FMT_DOTTEDQUAD
;
1017 static void ospf_network_free(struct ospf
*ospf
, struct ospf_network
*network
)
1019 ospf_area_check_free(ospf
, network
->area_id
);
1020 ospf_schedule_abr_task(ospf
);
1021 XFREE(MTYPE_OSPF_NETWORK
, network
);
1024 int ospf_network_set(struct ospf
*ospf
, struct prefix_ipv4
*p
,
1025 struct in_addr area_id
, int df
)
1027 struct ospf_network
*network
;
1028 struct ospf_area
*area
;
1029 struct route_node
*rn
;
1031 rn
= route_node_get(ospf
->networks
, (struct prefix
*)p
);
1034 route_unlock_node(rn
);
1036 if (IPV4_ADDR_SAME(&area_id
, &network
->area_id
)) {
1039 /* There is already same network statement. */
1044 rn
->info
= network
= ospf_network_new(area_id
);
1045 network
->area_id_fmt
= df
;
1046 area
= ospf_area_get(ospf
, area_id
);
1047 ospf_area_display_format_set(ospf
, area
, df
);
1049 /* Run network config now. */
1050 ospf_network_run((struct prefix
*)p
, area
);
1052 /* Update connected redistribute. */
1053 update_redistributed(ospf
, 1); /* interfaces possibly added */
1055 ospf_area_check_free(ospf
, area_id
);
1060 int ospf_network_unset(struct ospf
*ospf
, struct prefix_ipv4
*p
,
1061 struct in_addr area_id
)
1063 struct route_node
*rn
;
1064 struct ospf_network
*network
;
1065 struct listnode
*node
, *nnode
;
1066 struct ospf_interface
*oi
;
1068 rn
= route_node_lookup(ospf
->networks
, (struct prefix
*)p
);
1073 route_unlock_node(rn
);
1074 if (!IPV4_ADDR_SAME(&area_id
, &network
->area_id
))
1077 ospf_network_free(ospf
, rn
->info
);
1079 route_unlock_node(rn
); /* initial reference */
1081 /* Find interfaces that are not configured already. */
1082 for (ALL_LIST_ELEMENTS(ospf
->oiflist
, node
, nnode
, oi
)) {
1084 if (oi
->type
== OSPF_IFTYPE_VIRTUALLINK
)
1087 ospf_network_run_subnet(ospf
, oi
->connected
, NULL
, NULL
);
1090 /* Update connected redistribute. */
1091 update_redistributed(ospf
, 0); /* interfaces possibly removed */
1092 ospf_area_check_free(ospf
, area_id
);
1097 /* Ensure there's an OSPF instance, as "ip ospf area" enabled OSPF means
1098 * there might not be any 'router ospf' config.
1100 * Otherwise, doesn't do anything different to ospf_if_update for now
1102 void ospf_interface_area_set(struct ospf
*ospf
, struct interface
*ifp
)
1107 ospf_if_update(ospf
, ifp
);
1108 /* if_update does a update_redistributed */
1113 void ospf_interface_area_unset(struct ospf
*ospf
, struct interface
*ifp
)
1115 struct route_node
*rn_oi
;
1118 return; /* Ospf not ready yet */
1120 /* Find interfaces that may need to be removed. */
1121 for (rn_oi
= route_top(IF_OIFS(ifp
)); rn_oi
;
1122 rn_oi
= route_next(rn_oi
)) {
1123 struct ospf_interface
*oi
= NULL
;
1125 if ((oi
= rn_oi
->info
) == NULL
)
1128 if (oi
->type
== OSPF_IFTYPE_VIRTUALLINK
)
1131 ospf_network_run_subnet(ospf
, oi
->connected
, NULL
, NULL
);
1134 /* Update connected redistribute. */
1135 update_redistributed(ospf
, 0); /* interfaces possibly removed */
1138 /* Check whether interface matches given network
1139 * returns: 1, true. 0, false
1141 static int ospf_network_match_iface(const struct connected
*co
,
1142 const struct prefix
*net
)
1144 /* new approach: more elegant and conceptually clean */
1145 return prefix_match_network_statement(net
, CONNECTED_PREFIX(co
));
1148 static void ospf_update_interface_area(struct connected
*co
,
1149 struct ospf_area
*area
)
1151 struct ospf_interface
*oi
= ospf_if_table_lookup(co
->ifp
, co
->address
);
1153 /* nothing to be done case */
1154 if (oi
&& oi
->area
== area
) {
1161 add_ospf_interface(co
, area
);
1164 /* Run OSPF for the given subnet, taking into account the following
1165 * possible sources of area configuration, in the given order of preference:
1167 * - Whether there is interface+address specific area configuration
1168 * - Whether there is a default area for the interface
1169 * - Whether there is an area given as a parameter.
1170 * - If no specific network prefix/area is supplied, whether there's
1171 * a matching network configured.
1173 static void ospf_network_run_subnet(struct ospf
*ospf
, struct connected
*co
,
1175 struct ospf_area
*given_area
)
1177 struct ospf_interface
*oi
;
1178 struct ospf_if_params
*params
;
1179 struct ospf_area
*area
= NULL
;
1180 struct route_node
*rn
;
1183 if (CHECK_FLAG(co
->flags
, ZEBRA_IFA_SECONDARY
))
1186 if (co
->address
->family
!= AF_INET
)
1189 /* Try determine the appropriate area for this interface + address
1190 * Start by checking interface config
1192 params
= ospf_lookup_if_params(co
->ifp
, co
->address
->u
.prefix4
);
1193 if (params
&& OSPF_IF_PARAM_CONFIGURED(params
, if_area
))
1194 area
= ospf_area_get(ospf
, params
->if_area
);
1196 params
= IF_DEF_PARAMS(co
->ifp
);
1197 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
))
1198 area
= ospf_area_get(ospf
, params
->if_area
);
1201 /* If we've found an interface and/or addr specific area, then we're
1205 ospf_update_interface_area(co
, area
);
1209 /* Otherwise, only remaining possibility is a matching network statement
1212 assert(given_area
!= NULL
);
1214 /* Which either was supplied as a parameter.. (e.g. cause a new
1215 * network/area was just added)..
1217 if (p
->family
== co
->address
->family
1218 && ospf_network_match_iface(co
, p
))
1219 ospf_update_interface_area(co
, given_area
);
1224 /* Else we have to search the existing network/area config to see
1227 for (rn
= route_top(ospf
->networks
); rn
; rn
= route_next(rn
))
1228 if (rn
->info
!= NULL
&& ospf_network_match_iface(co
, &rn
->p
)) {
1229 struct ospf_network
*network
=
1230 (struct ospf_network
*)rn
->info
;
1231 area
= ospf_area_get(ospf
, network
->area_id
);
1232 ospf_update_interface_area(co
, area
);
1236 /* If the subnet isn't in any area, deconfigure */
1237 if (!configed
&& (oi
= ospf_if_table_lookup(co
->ifp
, co
->address
)))
1241 static void ospf_network_run_interface(struct ospf
*ospf
, struct interface
*ifp
,
1243 struct ospf_area
*given_area
)
1245 struct listnode
*cnode
;
1246 struct connected
*co
;
1248 if (memcmp(ifp
->name
, "VLINK", 5) == 0)
1251 /* Network prefix without area is nonsensical */
1253 assert(given_area
!= NULL
);
1255 /* if interface prefix is match specified prefix,
1256 then create socket and join multicast group. */
1257 for (ALL_LIST_ELEMENTS_RO(ifp
->connected
, cnode
, co
))
1258 ospf_network_run_subnet(ospf
, co
, p
, given_area
);
1261 static void ospf_network_run(struct prefix
*p
, struct ospf_area
*area
)
1263 struct vrf
*vrf
= vrf_lookup_by_id(area
->ospf
->vrf_id
);
1264 struct interface
*ifp
;
1266 /* Schedule Router ID Update. */
1267 if (area
->ospf
->router_id
.s_addr
== 0)
1268 ospf_router_id_update(area
->ospf
);
1270 /* Get target interface. */
1271 FOR_ALL_INTERFACES (vrf
, ifp
)
1272 ospf_network_run_interface(area
->ospf
, ifp
, p
, area
);
1275 void ospf_ls_upd_queue_empty(struct ospf_interface
*oi
)
1277 struct route_node
*rn
;
1278 struct listnode
*node
, *nnode
;
1280 struct ospf_lsa
*lsa
;
1282 /* empty ls update queue */
1283 for (rn
= route_top(oi
->ls_upd_queue
); rn
; rn
= route_next(rn
))
1284 if ((lst
= (struct list
*)rn
->info
)) {
1285 for (ALL_LIST_ELEMENTS(lst
, node
, nnode
, lsa
))
1286 ospf_lsa_unlock(&lsa
); /* oi->ls_upd_queue */
1287 list_delete_and_null(&lst
);
1291 /* remove update event */
1292 if (oi
->t_ls_upd_event
) {
1293 thread_cancel(oi
->t_ls_upd_event
);
1294 oi
->t_ls_upd_event
= NULL
;
1298 void ospf_if_update(struct ospf
*ospf
, struct interface
*ifp
)
1304 if (IS_DEBUG_OSPF_EVENT
)
1305 zlog_debug("%s: interface %s ifp->vrf_id %u ospf vrf %s vrf_id %u router_id %s",
1306 __PRETTY_FUNCTION__
, ifp
->name
, ifp
->vrf_id
,
1307 ospf_vrf_id_to_name(ospf
->vrf_id
), ospf
->vrf_id
,
1308 inet_ntoa(ospf
->router_id
));
1310 /* OSPF must be ready. */
1311 if (!ospf_is_ready(ospf
))
1314 ospf_network_run_interface(ospf
, ifp
, NULL
, NULL
);
1316 /* Update connected redistribute. */
1317 update_redistributed(ospf
, 1);
1320 void ospf_remove_vls_through_area(struct ospf
*ospf
, struct ospf_area
*area
)
1322 struct listnode
*node
, *nnode
;
1323 struct ospf_vl_data
*vl_data
;
1325 for (ALL_LIST_ELEMENTS(ospf
->vlinks
, node
, nnode
, vl_data
))
1326 if (IPV4_ADDR_SAME(&vl_data
->vl_area_id
, &area
->area_id
))
1327 ospf_vl_delete(ospf
, vl_data
);
1331 static const struct message ospf_area_type_msg
[] = {
1332 {OSPF_AREA_DEFAULT
, "Default"},
1333 {OSPF_AREA_STUB
, "Stub"},
1334 {OSPF_AREA_NSSA
, "NSSA"},
1337 static void ospf_area_type_set(struct ospf_area
*area
, int type
)
1339 struct listnode
*node
;
1340 struct ospf_interface
*oi
;
1342 if (area
->external_routing
== type
) {
1343 if (IS_DEBUG_OSPF_EVENT
)
1344 zlog_debug("Area[%s]: Types are the same, ignored.",
1345 inet_ntoa(area
->area_id
));
1349 area
->external_routing
= type
;
1351 if (IS_DEBUG_OSPF_EVENT
)
1352 zlog_debug("Area[%s]: Configured as %s",
1353 inet_ntoa(area
->area_id
),
1354 lookup_msg(ospf_area_type_msg
, type
, NULL
));
1356 switch (area
->external_routing
) {
1357 case OSPF_AREA_DEFAULT
:
1358 for (ALL_LIST_ELEMENTS_RO(area
->oiflist
, node
, oi
))
1359 if (oi
->nbr_self
!= NULL
) {
1360 UNSET_FLAG(oi
->nbr_self
->options
,
1362 SET_FLAG(oi
->nbr_self
->options
, OSPF_OPTION_E
);
1365 case OSPF_AREA_STUB
:
1366 for (ALL_LIST_ELEMENTS_RO(area
->oiflist
, node
, oi
))
1367 if (oi
->nbr_self
!= NULL
) {
1368 if (IS_DEBUG_OSPF_EVENT
)
1370 "setting options on %s accordingly",
1372 UNSET_FLAG(oi
->nbr_self
->options
,
1374 UNSET_FLAG(oi
->nbr_self
->options
,
1376 if (IS_DEBUG_OSPF_EVENT
)
1377 zlog_debug("options set on %s: %x",
1378 IF_NAME(oi
), OPTIONS(oi
));
1381 case OSPF_AREA_NSSA
:
1382 for (ALL_LIST_ELEMENTS_RO(area
->oiflist
, node
, oi
))
1383 if (oi
->nbr_self
!= NULL
) {
1385 "setting nssa options on %s accordingly",
1387 UNSET_FLAG(oi
->nbr_self
->options
,
1389 SET_FLAG(oi
->nbr_self
->options
, OSPF_OPTION_NP
);
1390 zlog_debug("options set on %s: %x", IF_NAME(oi
),
1398 ospf_router_lsa_update_area(area
);
1399 ospf_schedule_abr_task(area
->ospf
);
1402 int ospf_area_shortcut_set(struct ospf
*ospf
, struct ospf_area
*area
, int mode
)
1404 if (area
->shortcut_configured
== mode
)
1407 area
->shortcut_configured
= mode
;
1408 ospf_router_lsa_update_area(area
);
1409 ospf_schedule_abr_task(ospf
);
1411 ospf_area_check_free(ospf
, area
->area_id
);
1416 int ospf_area_shortcut_unset(struct ospf
*ospf
, struct ospf_area
*area
)
1418 area
->shortcut_configured
= OSPF_SHORTCUT_DEFAULT
;
1419 ospf_router_lsa_update_area(area
);
1420 ospf_area_check_free(ospf
, area
->area_id
);
1421 ospf_schedule_abr_task(ospf
);
1426 static int ospf_area_vlink_count(struct ospf
*ospf
, struct ospf_area
*area
)
1428 struct ospf_vl_data
*vl
;
1429 struct listnode
*node
;
1432 for (ALL_LIST_ELEMENTS_RO(ospf
->vlinks
, node
, vl
))
1433 if (IPV4_ADDR_SAME(&vl
->vl_area_id
, &area
->area_id
))
1439 int ospf_area_display_format_set(struct ospf
*ospf
, struct ospf_area
*area
,
1442 area
->area_id_fmt
= df
;
1447 int ospf_area_stub_set(struct ospf
*ospf
, struct in_addr area_id
)
1449 struct ospf_area
*area
;
1451 area
= ospf_area_get(ospf
, area_id
);
1452 if (ospf_area_vlink_count(ospf
, area
))
1455 if (area
->external_routing
!= OSPF_AREA_STUB
)
1456 ospf_area_type_set(area
, OSPF_AREA_STUB
);
1461 int ospf_area_stub_unset(struct ospf
*ospf
, struct in_addr area_id
)
1463 struct ospf_area
*area
;
1465 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1469 if (area
->external_routing
== OSPF_AREA_STUB
)
1470 ospf_area_type_set(area
, OSPF_AREA_DEFAULT
);
1472 ospf_area_check_free(ospf
, area_id
);
1477 int ospf_area_no_summary_set(struct ospf
*ospf
, struct in_addr area_id
)
1479 struct ospf_area
*area
;
1481 area
= ospf_area_get(ospf
, area_id
);
1482 area
->no_summary
= 1;
1487 int ospf_area_no_summary_unset(struct ospf
*ospf
, struct in_addr area_id
)
1489 struct ospf_area
*area
;
1491 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1495 area
->no_summary
= 0;
1496 ospf_area_check_free(ospf
, area_id
);
1501 int ospf_area_nssa_no_summary_set(struct ospf
*ospf
, struct in_addr area_id
)
1503 struct ospf_area
*area
;
1505 area
= ospf_area_get(ospf
, area_id
);
1506 if (ospf_area_vlink_count(ospf
, area
))
1509 if (area
->external_routing
!= OSPF_AREA_NSSA
) {
1510 ospf_area_type_set(area
, OSPF_AREA_NSSA
);
1512 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1515 ospf_area_no_summary_set(ospf
, area_id
);
1520 int ospf_area_nssa_set(struct ospf
*ospf
, struct in_addr area_id
)
1522 struct ospf_area
*area
;
1524 area
= ospf_area_get(ospf
, area_id
);
1525 if (ospf_area_vlink_count(ospf
, area
))
1528 if (area
->external_routing
!= OSPF_AREA_NSSA
) {
1529 ospf_area_type_set(area
, OSPF_AREA_NSSA
);
1532 /* set NSSA area defaults */
1533 area
->no_summary
= 0;
1534 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1535 area
->NSSATranslatorState
= OSPF_NSSA_TRANSLATE_DISABLED
;
1536 area
->NSSATranslatorStabilityInterval
=
1537 OSPF_NSSA_TRANS_STABLE_DEFAULT
;
1542 int ospf_area_nssa_unset(struct ospf
*ospf
, struct in_addr area_id
, int argc
)
1544 struct ospf_area
*area
;
1546 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1550 /* argc < 5 -> 'no area x nssa' */
1551 if (argc
< 5 && area
->external_routing
== OSPF_AREA_NSSA
) {
1553 /* set NSSA area defaults */
1554 area
->no_summary
= 0;
1555 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1556 area
->NSSATranslatorState
= OSPF_NSSA_TRANSLATE_DISABLED
;
1557 area
->NSSATranslatorStabilityInterval
=
1558 OSPF_NSSA_TRANS_STABLE_DEFAULT
;
1559 ospf_area_type_set(area
, OSPF_AREA_DEFAULT
);
1561 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1564 ospf_area_check_free(ospf
, area_id
);
1569 int ospf_area_nssa_translator_role_set(struct ospf
*ospf
,
1570 struct in_addr area_id
, int role
)
1572 struct ospf_area
*area
;
1574 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1578 area
->NSSATranslatorRole
= role
;
1584 /* XXX: unused? Leave for symmetry? */
1586 ospf_area_nssa_translator_role_unset (struct ospf
*ospf
,
1587 struct in_addr area_id
)
1589 struct ospf_area
*area
;
1591 area
= ospf_area_lookup_by_area_id (ospf
, area_id
);
1595 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1597 ospf_area_check_free (ospf
, area_id
);
1603 int ospf_area_export_list_set(struct ospf
*ospf
, struct ospf_area
*area
,
1604 const char *list_name
)
1606 struct access_list
*list
;
1607 list
= access_list_lookup(AFI_IP
, list_name
);
1609 EXPORT_LIST(area
) = list
;
1611 if (EXPORT_NAME(area
))
1612 free(EXPORT_NAME(area
));
1614 EXPORT_NAME(area
) = strdup(list_name
);
1615 ospf_schedule_abr_task(ospf
);
1620 int ospf_area_export_list_unset(struct ospf
*ospf
, struct ospf_area
*area
)
1623 EXPORT_LIST(area
) = 0;
1625 if (EXPORT_NAME(area
))
1626 free(EXPORT_NAME(area
));
1628 EXPORT_NAME(area
) = NULL
;
1630 ospf_area_check_free(ospf
, area
->area_id
);
1632 ospf_schedule_abr_task(ospf
);
1637 int ospf_area_import_list_set(struct ospf
*ospf
, struct ospf_area
*area
,
1640 struct access_list
*list
;
1641 list
= access_list_lookup(AFI_IP
, name
);
1643 IMPORT_LIST(area
) = list
;
1645 if (IMPORT_NAME(area
))
1646 free(IMPORT_NAME(area
));
1648 IMPORT_NAME(area
) = strdup(name
);
1649 ospf_schedule_abr_task(ospf
);
1654 int ospf_area_import_list_unset(struct ospf
*ospf
, struct ospf_area
*area
)
1656 IMPORT_LIST(area
) = 0;
1658 if (IMPORT_NAME(area
))
1659 free(IMPORT_NAME(area
));
1661 IMPORT_NAME(area
) = NULL
;
1662 ospf_area_check_free(ospf
, area
->area_id
);
1664 ospf_schedule_abr_task(ospf
);
1669 int ospf_timers_refresh_set(struct ospf
*ospf
, int interval
)
1673 if (ospf
->lsa_refresh_interval
== interval
)
1676 time_left
= ospf
->lsa_refresh_interval
1677 - (monotime(NULL
) - ospf
->lsa_refresher_started
);
1679 if (time_left
> interval
) {
1680 OSPF_TIMER_OFF(ospf
->t_lsa_refresher
);
1681 thread_add_timer(master
, ospf_lsa_refresh_walker
, ospf
,
1682 interval
, &ospf
->t_lsa_refresher
);
1684 ospf
->lsa_refresh_interval
= interval
;
1689 int ospf_timers_refresh_unset(struct ospf
*ospf
)
1693 time_left
= ospf
->lsa_refresh_interval
1694 - (monotime(NULL
) - ospf
->lsa_refresher_started
);
1696 if (time_left
> OSPF_LSA_REFRESH_INTERVAL_DEFAULT
) {
1697 OSPF_TIMER_OFF(ospf
->t_lsa_refresher
);
1698 ospf
->t_lsa_refresher
= NULL
;
1699 thread_add_timer(master
, ospf_lsa_refresh_walker
, ospf
,
1700 OSPF_LSA_REFRESH_INTERVAL_DEFAULT
,
1701 &ospf
->t_lsa_refresher
);
1704 ospf
->lsa_refresh_interval
= OSPF_LSA_REFRESH_INTERVAL_DEFAULT
;
1710 static struct ospf_nbr_nbma
*ospf_nbr_nbma_new(void)
1712 struct ospf_nbr_nbma
*nbr_nbma
;
1714 nbr_nbma
= XCALLOC(MTYPE_OSPF_NEIGHBOR_STATIC
,
1715 sizeof(struct ospf_nbr_nbma
));
1717 nbr_nbma
->priority
= OSPF_NEIGHBOR_PRIORITY_DEFAULT
;
1718 nbr_nbma
->v_poll
= OSPF_POLL_INTERVAL_DEFAULT
;
1723 static void ospf_nbr_nbma_free(struct ospf_nbr_nbma
*nbr_nbma
)
1725 XFREE(MTYPE_OSPF_NEIGHBOR_STATIC
, nbr_nbma
);
1728 static void ospf_nbr_nbma_delete(struct ospf
*ospf
,
1729 struct ospf_nbr_nbma
*nbr_nbma
)
1731 struct route_node
*rn
;
1732 struct prefix_ipv4 p
;
1735 p
.prefix
= nbr_nbma
->addr
;
1736 p
.prefixlen
= IPV4_MAX_BITLEN
;
1738 rn
= route_node_lookup(ospf
->nbr_nbma
, (struct prefix
*)&p
);
1740 ospf_nbr_nbma_free(rn
->info
);
1742 route_unlock_node(rn
);
1743 route_unlock_node(rn
);
1747 static void ospf_nbr_nbma_down(struct ospf_nbr_nbma
*nbr_nbma
)
1749 OSPF_TIMER_OFF(nbr_nbma
->t_poll
);
1751 if (nbr_nbma
->nbr
) {
1752 nbr_nbma
->nbr
->nbr_nbma
= NULL
;
1753 OSPF_NSM_EVENT_EXECUTE(nbr_nbma
->nbr
, NSM_KillNbr
);
1757 listnode_delete(nbr_nbma
->oi
->nbr_nbma
, nbr_nbma
);
1760 static void ospf_nbr_nbma_add(struct ospf_nbr_nbma
*nbr_nbma
,
1761 struct ospf_interface
*oi
)
1763 struct ospf_neighbor
*nbr
;
1764 struct route_node
*rn
;
1767 if (oi
->type
!= OSPF_IFTYPE_NBMA
)
1770 if (nbr_nbma
->nbr
!= NULL
)
1773 if (IPV4_ADDR_SAME(&oi
->nbr_self
->address
.u
.prefix4
, &nbr_nbma
->addr
))
1777 listnode_add(oi
->nbr_nbma
, nbr_nbma
);
1779 /* Get neighbor information from table. */
1781 p
.prefixlen
= IPV4_MAX_BITLEN
;
1782 p
.u
.prefix4
= nbr_nbma
->addr
;
1784 rn
= route_node_get(oi
->nbrs
, (struct prefix
*)&p
);
1787 nbr
->nbr_nbma
= nbr_nbma
;
1788 nbr_nbma
->nbr
= nbr
;
1790 route_unlock_node(rn
);
1792 nbr
= rn
->info
= ospf_nbr_new(oi
);
1793 nbr
->state
= NSM_Down
;
1794 nbr
->src
= nbr_nbma
->addr
;
1795 nbr
->nbr_nbma
= nbr_nbma
;
1796 nbr
->priority
= nbr_nbma
->priority
;
1799 nbr_nbma
->nbr
= nbr
;
1801 OSPF_NSM_EVENT_EXECUTE(nbr
, NSM_Start
);
1805 void ospf_nbr_nbma_if_update(struct ospf
*ospf
, struct ospf_interface
*oi
)
1807 struct ospf_nbr_nbma
*nbr_nbma
;
1808 struct route_node
*rn
;
1809 struct prefix_ipv4 p
;
1811 if (oi
->type
!= OSPF_IFTYPE_NBMA
)
1814 for (rn
= route_top(ospf
->nbr_nbma
); rn
; rn
= route_next(rn
))
1815 if ((nbr_nbma
= rn
->info
))
1816 if (nbr_nbma
->oi
== NULL
&& nbr_nbma
->nbr
== NULL
) {
1818 p
.prefix
= nbr_nbma
->addr
;
1819 p
.prefixlen
= IPV4_MAX_BITLEN
;
1821 if (prefix_match(oi
->address
,
1822 (struct prefix
*)&p
))
1823 ospf_nbr_nbma_add(nbr_nbma
, oi
);
1827 struct ospf_nbr_nbma
*ospf_nbr_nbma_lookup(struct ospf
*ospf
,
1828 struct in_addr nbr_addr
)
1830 struct route_node
*rn
;
1831 struct prefix_ipv4 p
;
1834 p
.prefix
= nbr_addr
;
1835 p
.prefixlen
= IPV4_MAX_BITLEN
;
1837 rn
= route_node_lookup(ospf
->nbr_nbma
, (struct prefix
*)&p
);
1839 route_unlock_node(rn
);
1845 struct ospf_nbr_nbma
*ospf_nbr_nbma_lookup_next(struct ospf
*ospf
,
1846 struct in_addr
*addr
, int first
)
1849 struct ospf_nbr_nbma
*nbr_nbma
;
1850 struct listnode
*node
;
1857 for (ALL_LIST_ELEMENTS_RO (ospf
->nbr_nbma
, node
, nbr_nbma
))
1861 *addr
= nbr_nbma
->addr
;
1864 else if (ntohl (nbr_nbma
->addr
.s_addr
) > ntohl (addr
->s_addr
))
1866 *addr
= nbr_nbma
->addr
;
1874 int ospf_nbr_nbma_set(struct ospf
*ospf
, struct in_addr nbr_addr
)
1876 struct ospf_nbr_nbma
*nbr_nbma
;
1877 struct ospf_interface
*oi
;
1878 struct prefix_ipv4 p
;
1879 struct route_node
*rn
;
1880 struct listnode
*node
;
1882 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
1886 nbr_nbma
= ospf_nbr_nbma_new();
1887 nbr_nbma
->addr
= nbr_addr
;
1890 p
.prefix
= nbr_addr
;
1891 p
.prefixlen
= IPV4_MAX_BITLEN
;
1893 rn
= route_node_get(ospf
->nbr_nbma
, (struct prefix
*)&p
);
1895 route_unlock_node(rn
);
1896 rn
->info
= nbr_nbma
;
1898 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
1899 if (oi
->type
== OSPF_IFTYPE_NBMA
)
1900 if (prefix_match(oi
->address
, (struct prefix
*)&p
)) {
1901 ospf_nbr_nbma_add(nbr_nbma
, oi
);
1909 int ospf_nbr_nbma_unset(struct ospf
*ospf
, struct in_addr nbr_addr
)
1911 struct ospf_nbr_nbma
*nbr_nbma
;
1913 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
1914 if (nbr_nbma
== NULL
)
1917 ospf_nbr_nbma_down(nbr_nbma
);
1918 ospf_nbr_nbma_delete(ospf
, nbr_nbma
);
1923 int ospf_nbr_nbma_priority_set(struct ospf
*ospf
, struct in_addr nbr_addr
,
1926 struct ospf_nbr_nbma
*nbr_nbma
;
1928 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
1929 if (nbr_nbma
== NULL
)
1932 if (nbr_nbma
->priority
!= priority
)
1933 nbr_nbma
->priority
= priority
;
1938 int ospf_nbr_nbma_priority_unset(struct ospf
*ospf
, struct in_addr nbr_addr
)
1940 struct ospf_nbr_nbma
*nbr_nbma
;
1942 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
1943 if (nbr_nbma
== NULL
)
1946 if (nbr_nbma
!= OSPF_NEIGHBOR_PRIORITY_DEFAULT
)
1947 nbr_nbma
->priority
= OSPF_NEIGHBOR_PRIORITY_DEFAULT
;
1952 int ospf_nbr_nbma_poll_interval_set(struct ospf
*ospf
, struct in_addr nbr_addr
,
1953 unsigned int interval
)
1955 struct ospf_nbr_nbma
*nbr_nbma
;
1957 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
1958 if (nbr_nbma
== NULL
)
1961 if (nbr_nbma
->v_poll
!= interval
) {
1962 nbr_nbma
->v_poll
= interval
;
1963 if (nbr_nbma
->oi
&& ospf_if_is_up(nbr_nbma
->oi
)) {
1964 OSPF_TIMER_OFF(nbr_nbma
->t_poll
);
1965 OSPF_POLL_TIMER_ON(nbr_nbma
->t_poll
, ospf_poll_timer
,
1973 int ospf_nbr_nbma_poll_interval_unset(struct ospf
*ospf
, struct in_addr addr
)
1975 struct ospf_nbr_nbma
*nbr_nbma
;
1977 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, addr
);
1978 if (nbr_nbma
== NULL
)
1981 if (nbr_nbma
->v_poll
!= OSPF_POLL_INTERVAL_DEFAULT
)
1982 nbr_nbma
->v_poll
= OSPF_POLL_INTERVAL_DEFAULT
;
1987 void ospf_master_init(struct thread_master
*master
)
1989 memset(&ospf_master
, 0, sizeof(struct ospf_master
));
1992 om
->ospf
= list_new();
1993 om
->master
= master
;
1996 /* Link OSPF instance to VRF. */
1997 void ospf_vrf_link(struct ospf
*ospf
, struct vrf
*vrf
)
1999 ospf
->vrf_id
= vrf
->vrf_id
;
2000 if (vrf
->info
!= (void *)ospf
)
2001 vrf
->info
= (void *)ospf
;
2004 /* Unlink OSPF instance from VRF. */
2005 void ospf_vrf_unlink(struct ospf
*ospf
, struct vrf
*vrf
)
2007 if (vrf
->info
== (void *)ospf
)
2009 ospf
->vrf_id
= VRF_UNKNOWN
;
2012 /* This is hook function for vrf create called as part of vrf_init */
2013 static int ospf_vrf_new(struct vrf
*vrf
)
2015 if (IS_DEBUG_OSPF_EVENT
)
2016 zlog_debug("%s: VRF Created: %s(%u)", __PRETTY_FUNCTION__
,
2017 vrf
->name
, vrf
->vrf_id
);
2022 /* This is hook function for vrf delete call as part of vrf_init */
2023 static int ospf_vrf_delete(struct vrf
*vrf
)
2025 if (IS_DEBUG_OSPF_EVENT
)
2026 zlog_debug("%s: VRF Deletion: %s(%u)", __PRETTY_FUNCTION__
,
2027 vrf
->name
, vrf
->vrf_id
);
2032 /* Enable OSPF VRF instance */
2033 static int ospf_vrf_enable(struct vrf
*vrf
)
2035 struct ospf
*ospf
= NULL
;
2036 vrf_id_t old_vrf_id
= VRF_DEFAULT
;
2038 if (IS_DEBUG_OSPF_EVENT
)
2039 zlog_debug("%s: VRF %s id %u enabled",
2040 __PRETTY_FUNCTION__
, vrf
->name
, vrf
->vrf_id
);
2042 ospf
= ospf_lookup_by_name(vrf
->name
);
2044 old_vrf_id
= ospf
->vrf_id
;
2045 /* We have instance configured, link to VRF and make it "up". */
2046 ospf_vrf_link(ospf
, vrf
);
2047 if (IS_DEBUG_OSPF_EVENT
)
2048 zlog_debug("%s: ospf linked to vrf %s vrf_id %u (old id %u)",
2049 __PRETTY_FUNCTION__
, vrf
->name
, ospf
->vrf_id
,
2052 if (old_vrf_id
!= ospf
->vrf_id
) {
2053 if (ospfd_privs
.change(ZPRIVS_RAISE
)) {
2054 zlog_err("ospf_sock_init: could not raise privs, %s",
2055 safe_strerror(errno
));
2057 if (ospf_bind_vrfdevice(ospf
, ospf
->fd
) < 0)
2059 if (ospfd_privs
.change(ZPRIVS_LOWER
)) {
2060 zlog_err("ospf_sock_init: could not lower privs, %s",
2061 safe_strerror(errno
));
2064 ospf
->oi_running
= 1;
2065 ospf_zebra_vrf_register(ospf
);
2066 ospf_router_id_update(ospf
);
2073 /* Disable OSPF VRF instance */
2074 static int ospf_vrf_disable(struct vrf
*vrf
)
2076 struct ospf
*ospf
= NULL
;
2077 vrf_id_t old_vrf_id
= VRF_UNKNOWN
;
2079 if (vrf
->vrf_id
== VRF_DEFAULT
)
2082 if (IS_DEBUG_OSPF_EVENT
)
2083 zlog_debug("%s: VRF %s id %d disabled.",
2084 __PRETTY_FUNCTION__
, vrf
->name
, vrf
->vrf_id
);
2086 ospf
= ospf_lookup_by_name(vrf
->name
);
2088 old_vrf_id
= ospf
->vrf_id
;
2090 /* We have instance configured, unlink
2091 * from VRF and make it "down".
2093 ospf_vrf_unlink(ospf
, vrf
);
2094 ospf
->oi_running
= 0;
2095 if (IS_DEBUG_OSPF_EVENT
)
2096 zlog_debug("%s: ospf old_vrf_id %d unlinked",
2097 __PRETTY_FUNCTION__
, old_vrf_id
);
2100 /* Note: This is a callback, the VRF will be deleted by the caller. */
2104 void ospf_vrf_init(void)
2106 vrf_init(ospf_vrf_new
, ospf_vrf_enable
,
2107 ospf_vrf_disable
, ospf_vrf_delete
);
2110 void ospf_vrf_terminate(void)
2115 const char *ospf_vrf_id_to_name(vrf_id_t vrf_id
)
2117 struct vrf
*vrf
= vrf_lookup_by_id(vrf_id
);
2119 return vrf
? vrf
->name
: "NIL";