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
)
188 /* AdvRouter and Router ID is the same. */
189 if (IPV4_ADDR_SAME(&lsa
->data
->adv_router
,
192 OSPF_LSA_SELF_CHECKED
);
193 SET_FLAG(lsa
->flags
, OSPF_LSA_SELF
);
194 ospf_lsa_flush_schedule(ospf
, lsa
);
199 /* Originate each redistributed external route. */
200 for (type
= 0; type
< ZEBRA_ROUTE_MAX
; type
++)
201 thread_add_event(master
,
202 ospf_external_lsa_originate_timer
,
204 thread_add_event(master
, ospf_default_originate_timer
, ospf
, 0,
207 /* update router-lsa's for each area */
208 ospf_router_lsa_update(ospf
);
210 /* update ospf_interface's */
211 FOR_ALL_INTERFACES (vrf
, ifp
)
212 ospf_if_update(ospf
, ifp
);
216 /* For OSPF area sort by area id. */
217 static int ospf_area_id_cmp(struct ospf_area
*a1
, struct ospf_area
*a2
)
219 if (ntohl(a1
->area_id
.s_addr
) > ntohl(a2
->area_id
.s_addr
))
221 if (ntohl(a1
->area_id
.s_addr
) < ntohl(a2
->area_id
.s_addr
))
226 /* Allocate new ospf structure. */
227 static struct ospf
*ospf_new(u_short instance
, const char *name
)
230 struct vrf
*vrf
= NULL
;
232 struct ospf
*new = XCALLOC(MTYPE_OSPF_TOP
, sizeof(struct ospf
));
234 new->instance
= instance
;
235 new->router_id
.s_addr
= htonl(0);
236 new->router_id_static
.s_addr
= htonl(0);
239 new->vrf_id
= VRF_UNKNOWN
;
240 /* Freed in ospf_finish_final */
241 new->name
= XSTRDUP(MTYPE_OSPF_TOP
, name
);
242 vrf
= vrf_lookup_by_name(new->name
);
243 if (IS_DEBUG_OSPF_EVENT
)
244 zlog_debug("%s: Create new ospf instance with vrf_name %s vrf_id %d",
245 __PRETTY_FUNCTION__
, name
, new->vrf_id
);
247 ospf_vrf_link(new, vrf
);
249 new->vrf_id
= VRF_DEFAULT
;
250 vrf
= vrf_lookup_by_id(VRF_DEFAULT
);
251 ospf_vrf_link(new, vrf
);
253 ospf_zebra_vrf_register(new);
255 new->abr_type
= OSPF_ABR_DEFAULT
;
256 new->oiflist
= list_new();
257 new->vlinks
= list_new();
258 new->areas
= list_new();
259 new->areas
->cmp
= (int (*)(void *, void *))ospf_area_id_cmp
;
260 new->networks
= route_table_init();
261 new->nbr_nbma
= route_table_init();
263 new->lsdb
= ospf_lsdb_new();
265 new->default_originate
= DEFAULT_ORIGINATE_NONE
;
267 new->passive_interface_default
= OSPF_IF_ACTIVE
;
269 new->new_external_route
= route_table_init();
270 new->old_external_route
= route_table_init();
271 new->external_lsas
= route_table_init();
273 new->stub_router_startup_time
= OSPF_STUB_ROUTER_UNCONFIGURED
;
274 new->stub_router_shutdown_time
= OSPF_STUB_ROUTER_UNCONFIGURED
;
275 new->stub_router_admin_set
= OSPF_STUB_ROUTER_ADMINISTRATIVE_UNSET
;
277 /* Distribute parameter init. */
278 for (i
= 0; i
<= ZEBRA_ROUTE_MAX
; i
++) {
281 new->default_metric
= -1;
282 new->ref_bandwidth
= OSPF_DEFAULT_REF_BANDWIDTH
;
285 new->min_ls_interval
= OSPF_MIN_LS_INTERVAL
;
286 new->min_ls_arrival
= OSPF_MIN_LS_ARRIVAL
;
288 /* SPF timer value init. */
289 new->spf_delay
= OSPF_SPF_DELAY_DEFAULT
;
290 new->spf_holdtime
= OSPF_SPF_HOLDTIME_DEFAULT
;
291 new->spf_max_holdtime
= OSPF_SPF_MAX_HOLDTIME_DEFAULT
;
292 new->spf_hold_multiplier
= 1;
295 new->maxage_delay
= OSPF_LSA_MAXAGE_REMOVE_DELAY_DEFAULT
;
296 new->maxage_lsa
= route_table_init();
297 new->t_maxage_walker
= NULL
;
298 thread_add_timer(master
, ospf_lsa_maxage_walker
, new,
299 OSPF_LSA_MAXAGE_CHECK_INTERVAL
, &new->t_maxage_walker
);
301 /* Distance table init. */
302 new->distance_table
= route_table_init();
304 new->lsa_refresh_queue
.index
= 0;
305 new->lsa_refresh_interval
= OSPF_LSA_REFRESH_INTERVAL_DEFAULT
;
306 new->t_lsa_refresher
= NULL
;
307 thread_add_timer(master
, ospf_lsa_refresh_walker
, new,
308 new->lsa_refresh_interval
, &new->t_lsa_refresher
);
309 new->lsa_refresher_started
= monotime(NULL
);
311 if ((ospf_sock_init(new)) < 0) {
313 "ospf_new: fatal error: ospf_sock_init was unable to open "
317 if ((new->ibuf
= stream_new(OSPF_MAX_PACKET_SIZE
+ 1)) == NULL
) {
319 "ospf_new: fatal error: stream_new(%u) failed allocating ibuf",
320 OSPF_MAX_PACKET_SIZE
+ 1);
324 thread_add_read(master
, ospf_read
, new, new->fd
, &new->t_read
);
325 new->oi_write_q
= list_new();
326 new->write_oi_count
= OSPF_WRITE_INTERFACE_COUNT_DEFAULT
;
328 /* Enable "log-adjacency-changes" */
329 #if DFLT_OSPF_LOG_ADJACENCY_CHANGES
330 SET_FLAG(new->config
, OSPF_LOG_ADJACENCY_CHANGES
);
338 struct ospf
*ospf_lookup_instance(u_short instance
)
341 struct listnode
*node
, *nnode
;
343 if (listcount(om
->ospf
) == 0)
346 for (ALL_LIST_ELEMENTS(om
->ospf
, node
, nnode
, ospf
))
347 if ((ospf
->instance
== 0 && instance
== 0)
348 || (ospf
->instance
&& instance
349 && ospf
->instance
== instance
))
355 static int ospf_is_ready(struct ospf
*ospf
)
357 /* OSPF must be on and Router-ID must be configured. */
358 if (!ospf
|| ospf
->router_id
.s_addr
== 0)
364 static void ospf_add(struct ospf
*ospf
)
366 listnode_add(om
->ospf
, ospf
);
369 static void ospf_delete(struct ospf
*ospf
)
371 listnode_delete(om
->ospf
, ospf
);
374 struct ospf
*ospf_lookup_by_inst_name(u_short instance
, const char *name
)
376 struct ospf
*ospf
= NULL
;
377 struct listnode
*node
, *nnode
;
379 for (ALL_LIST_ELEMENTS(om
->ospf
, node
, nnode
, ospf
)) {
380 if ((ospf
->instance
== instance
) &&
381 ((ospf
->name
== NULL
&& name
== NULL
) ||
382 (ospf
->name
&& name
&& strcmp(ospf
->name
, name
) == 0)))
388 struct ospf
*ospf_get(u_short instance
, const char *name
)
392 /* vrf name provided call inst and name based api
393 * in case of no name pass default ospf instance */
395 ospf
= ospf_lookup_by_inst_name(instance
, name
);
397 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
400 ospf
= ospf_new(instance
, name
);
403 if (ospf
->router_id_static
.s_addr
== 0)
404 ospf_router_id_update(ospf
);
406 ospf_opaque_type11_lsa_init(ospf
);
412 struct ospf
*ospf_get_instance(u_short instance
)
416 ospf
= ospf_lookup_instance(instance
);
418 ospf
= ospf_new(instance
, NULL
/* VRF_DEFAULT*/);
421 if (ospf
->router_id_static
.s_addr
== 0) {
422 if (vrf_lookup_by_id(ospf
->vrf_id
))
423 ospf_router_id_update(ospf
);
425 if (IS_DEBUG_OSPF_EVENT
)
426 zlog_debug("%s: ospf VRF (id %d) is not active yet, skip router id update"
427 , __PRETTY_FUNCTION__
,
430 ospf_router_id_update(ospf
);
433 ospf_opaque_type11_lsa_init(ospf
);
439 struct ospf
*ospf_lookup_by_vrf_id(vrf_id_t vrf_id
)
441 struct vrf
*vrf
= NULL
;
443 vrf
= vrf_lookup_by_id(vrf_id
);
446 return (vrf
->info
) ? (struct ospf
*)vrf
->info
: NULL
;
450 /* It should only be used when processing incoming info update from zebra.
451 * Other situations, it is not sufficient to lookup the ospf instance by
452 * vrf_name only without using the instance number.
454 static struct ospf
*ospf_lookup_by_name(const char *vrf_name
)
456 struct ospf
*ospf
= NULL
;
457 struct listnode
*node
, *nnode
;
459 for (ALL_LIST_ELEMENTS(om
->ospf
, node
, nnode
, ospf
))
460 if ((ospf
->name
== NULL
&& vrf_name
== NULL
)
461 || (ospf
->name
&& vrf_name
&&
462 strcmp(ospf
->name
, vrf_name
) == 0))
467 /* Handle the second half of deferred shutdown. This is called either
468 * from the deferred-shutdown timer thread, or directly through
469 * ospf_deferred_shutdown_check.
471 * Function is to cleanup G-R state, if required then call ospf_finish_final
472 * to complete shutdown of this ospf instance. Possibly exit if the
473 * whole process is being shutdown and this was the last OSPF instance.
475 static void ospf_deferred_shutdown_finish(struct ospf
*ospf
)
477 ospf
->stub_router_shutdown_time
= OSPF_STUB_ROUTER_UNCONFIGURED
;
478 OSPF_TIMER_OFF(ospf
->t_deferred_shutdown
);
480 ospf_finish_final(ospf
);
482 /* *ospf is now invalid */
484 /* ospfd being shut-down? If so, was this the last ospf instance? */
485 if (CHECK_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
)
486 && (listcount(om
->ospf
) == 0)) {
493 /* Timer thread for G-R */
494 static int ospf_deferred_shutdown_timer(struct thread
*t
)
496 struct ospf
*ospf
= THREAD_ARG(t
);
498 ospf_deferred_shutdown_finish(ospf
);
503 /* Check whether deferred-shutdown must be scheduled, otherwise call
504 * down directly into second-half of instance shutdown.
506 static void ospf_deferred_shutdown_check(struct ospf
*ospf
)
508 unsigned long timeout
;
510 struct ospf_area
*area
;
512 /* deferred shutdown already running? */
513 if (ospf
->t_deferred_shutdown
)
516 /* Should we try push out max-metric LSAs? */
517 if (ospf
->stub_router_shutdown_time
!= OSPF_STUB_ROUTER_UNCONFIGURED
) {
518 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, ln
, area
)) {
519 SET_FLAG(area
->stub_router_state
,
520 OSPF_AREA_ADMIN_STUB_ROUTED
);
522 if (!CHECK_FLAG(area
->stub_router_state
,
523 OSPF_AREA_IS_STUB_ROUTED
))
524 ospf_router_lsa_update_area(area
);
526 timeout
= ospf
->stub_router_shutdown_time
;
528 /* No timer needed */
529 ospf_deferred_shutdown_finish(ospf
);
533 OSPF_TIMER_ON(ospf
->t_deferred_shutdown
, ospf_deferred_shutdown_timer
,
538 /* Shut down the entire process */
539 void ospf_terminate(void)
542 struct listnode
*node
, *nnode
;
544 /* shutdown already in progress */
545 if (CHECK_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
))
548 SET_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
);
550 /* exit immediately if OSPF not actually running */
551 if (listcount(om
->ospf
) == 0)
555 for (ALL_LIST_ELEMENTS(om
->ospf
, node
, nnode
, ospf
))
558 /* Deliberately go back up, hopefully to thread scheduler, as
559 * One or more ospf_finish()'s may have deferred shutdown to a timer
562 zclient_stop(zclient
);
563 zclient_free(zclient
);
568 void ospf_finish(struct ospf
*ospf
)
570 /* let deferred shutdown decide */
571 ospf_deferred_shutdown_check(ospf
);
573 /* if ospf_deferred_shutdown returns, then ospf_finish_final is
574 * deferred to expiry of G-S timer thread. Return back up, hopefully
575 * to thread scheduler.
580 /* Final cleanup of ospf instance */
581 static void ospf_finish_final(struct ospf
*ospf
)
583 struct vrf
*vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
584 struct route_node
*rn
;
585 struct ospf_nbr_nbma
*nbr_nbma
;
586 struct ospf_lsa
*lsa
;
587 struct interface
*ifp
;
588 struct ospf_interface
*oi
;
589 struct ospf_area
*area
;
590 struct ospf_vl_data
*vl_data
;
591 struct listnode
*node
, *nnode
;
593 u_short instance
= 0;
597 ospf_opaque_type11_lsa_term(ospf
);
599 ospf_flush_self_originated_lsas_now(ospf
);
601 /* Unregister redistribution */
602 for (i
= 0; i
< ZEBRA_ROUTE_MAX
; i
++) {
603 struct list
*red_list
;
604 struct ospf_redist
*red
;
606 red_list
= ospf
->redist
[i
];
610 for (ALL_LIST_ELEMENTS(red_list
, node
, nnode
, red
))
611 ospf_redistribute_unset(ospf
, i
, red
->instance
);
613 ospf_redistribute_default_unset(ospf
);
615 for (ALL_LIST_ELEMENTS(ospf
->areas
, node
, nnode
, area
))
616 ospf_remove_vls_through_area(ospf
, area
);
618 for (ALL_LIST_ELEMENTS(ospf
->vlinks
, node
, nnode
, vl_data
))
619 ospf_vl_delete(ospf
, vl_data
);
621 list_delete_and_null(&ospf
->vlinks
);
623 /* Remove any ospf interface config params */
624 FOR_ALL_INTERFACES (vrf
, ifp
) {
625 struct ospf_if_params
*params
;
627 params
= IF_DEF_PARAMS(ifp
);
628 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
))
629 UNSET_IF_PARAM(params
, if_area
);
632 /* Reset interface. */
633 for (ALL_LIST_ELEMENTS(ospf
->oiflist
, node
, nnode
, oi
))
635 list_delete_and_null(&ospf
->oiflist
);
637 /* De-Register VRF */
638 ospf_zebra_vrf_deregister(ospf
);
640 /* Clear static neighbors */
641 for (rn
= route_top(ospf
->nbr_nbma
); rn
; rn
= route_next(rn
))
642 if ((nbr_nbma
= rn
->info
)) {
643 OSPF_POLL_TIMER_OFF(nbr_nbma
->t_poll
);
646 nbr_nbma
->nbr
->nbr_nbma
= NULL
;
647 nbr_nbma
->nbr
= NULL
;
651 listnode_delete(nbr_nbma
->oi
->nbr_nbma
,
656 XFREE(MTYPE_OSPF_NEIGHBOR_STATIC
, nbr_nbma
);
659 route_table_finish(ospf
->nbr_nbma
);
661 /* Clear networks and Areas. */
662 for (rn
= route_top(ospf
->networks
); rn
; rn
= route_next(rn
)) {
663 struct ospf_network
*network
;
665 if ((network
= rn
->info
) != NULL
) {
666 ospf_network_free(ospf
, network
);
668 route_unlock_node(rn
);
671 route_table_finish(ospf
->networks
);
673 for (ALL_LIST_ELEMENTS(ospf
->areas
, node
, nnode
, area
)) {
674 listnode_delete(ospf
->areas
, area
);
675 ospf_area_free(area
);
678 /* Cancel all timers. */
679 OSPF_TIMER_OFF(ospf
->t_external_lsa
);
680 OSPF_TIMER_OFF(ospf
->t_spf_calc
);
681 OSPF_TIMER_OFF(ospf
->t_ase_calc
);
682 OSPF_TIMER_OFF(ospf
->t_maxage
);
683 OSPF_TIMER_OFF(ospf
->t_maxage_walker
);
684 OSPF_TIMER_OFF(ospf
->t_abr_task
);
685 OSPF_TIMER_OFF(ospf
->t_asbr_check
);
686 OSPF_TIMER_OFF(ospf
->t_distribute_update
);
687 OSPF_TIMER_OFF(ospf
->t_lsa_refresher
);
688 OSPF_TIMER_OFF(ospf
->t_read
);
689 OSPF_TIMER_OFF(ospf
->t_write
);
690 OSPF_TIMER_OFF(ospf
->t_opaque_lsa_self
);
693 stream_free(ospf
->ibuf
);
695 LSDB_LOOP(OPAQUE_AS_LSDB(ospf
), rn
, lsa
)
696 ospf_discard_from_db(ospf
, ospf
->lsdb
, lsa
);
697 LSDB_LOOP(EXTERNAL_LSDB(ospf
), rn
, lsa
)
698 ospf_discard_from_db(ospf
, ospf
->lsdb
, lsa
);
700 ospf_lsdb_delete_all(ospf
->lsdb
);
701 ospf_lsdb_free(ospf
->lsdb
);
703 for (rn
= route_top(ospf
->maxage_lsa
); rn
; rn
= route_next(rn
)) {
704 struct ospf_lsa
*lsa
;
706 if ((lsa
= rn
->info
) != NULL
) {
707 ospf_lsa_unlock(&lsa
);
710 route_unlock_node(rn
);
712 route_table_finish(ospf
->maxage_lsa
);
715 ospf_route_table_free(ospf
->old_table
);
716 if (ospf
->new_table
) {
717 ospf_route_delete(ospf
, ospf
->new_table
);
718 ospf_route_table_free(ospf
->new_table
);
721 ospf_rtrs_free(ospf
->old_rtrs
);
723 ospf_rtrs_free(ospf
->new_rtrs
);
724 if (ospf
->new_external_route
) {
725 ospf_route_delete(ospf
, ospf
->new_external_route
);
726 ospf_route_table_free(ospf
->new_external_route
);
728 if (ospf
->old_external_route
) {
729 ospf_route_delete(ospf
, ospf
->old_external_route
);
730 ospf_route_table_free(ospf
->old_external_route
);
732 if (ospf
->external_lsas
) {
733 ospf_ase_external_lsas_finish(ospf
->external_lsas
);
736 list_delete_and_null(&ospf
->areas
);
737 list_delete_and_null(&ospf
->oi_write_q
);
739 for (i
= ZEBRA_ROUTE_SYSTEM
; i
<= ZEBRA_ROUTE_MAX
; i
++) {
740 struct list
*ext_list
;
741 struct listnode
*node
;
742 struct ospf_external
*ext
;
744 ext_list
= ospf
->external
[i
];
748 for (ALL_LIST_ELEMENTS_RO(ext_list
, node
, ext
)) {
749 if (ext
->external_info
)
750 for (rn
= route_top(ext
->external_info
); rn
;
751 rn
= route_next(rn
)) {
752 if (rn
->info
== NULL
)
755 XFREE(MTYPE_OSPF_EXTERNAL_INFO
,
758 route_unlock_node(rn
);
763 ospf_distance_reset(ospf
);
764 route_table_finish(ospf
->distance_table
);
766 if (!CHECK_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
))
767 instance
= ospf
->instance
;
772 vrf
= vrf_lookup_by_name(ospf
->name
);
774 ospf_vrf_unlink(ospf
, vrf
);
775 XFREE(MTYPE_OSPF_TOP
, ospf
->name
);
777 vrf
= vrf_lookup_by_id(VRF_DEFAULT
);
779 ospf_vrf_unlink(ospf
, vrf
);
782 XFREE(MTYPE_OSPF_TOP
, ospf
);
784 if (!CHECK_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
))
785 ospf_get_instance(instance
);
789 /* allocate new OSPF Area object */
790 static struct ospf_area
*ospf_area_new(struct ospf
*ospf
,
791 struct in_addr area_id
)
793 struct ospf_area
*new;
795 /* Allocate new config_network. */
796 new = XCALLOC(MTYPE_OSPF_AREA
, sizeof(struct ospf_area
));
800 new->area_id
= area_id
;
801 new->area_id_fmt
= OSPF_AREA_ID_FMT_DOTTEDQUAD
;
803 new->external_routing
= OSPF_AREA_DEFAULT
;
804 new->default_cost
= 1;
805 new->auth_type
= OSPF_AUTH_NULL
;
808 new->lsdb
= ospf_lsdb_new();
810 /* Self-originated LSAs initialize. */
811 new->router_lsa_self
= NULL
;
813 ospf_opaque_type10_lsa_init(new);
815 new->oiflist
= list_new();
816 new->ranges
= route_table_init();
818 if (area_id
.s_addr
== OSPF_AREA_BACKBONE
)
819 ospf
->backbone
= new;
824 static void ospf_area_free(struct ospf_area
*area
)
826 struct route_node
*rn
;
827 struct ospf_lsa
*lsa
;
829 ospf_opaque_type10_lsa_term(area
);
832 LSDB_LOOP(ROUTER_LSDB(area
), rn
, lsa
)
833 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
834 LSDB_LOOP(NETWORK_LSDB(area
), rn
, lsa
)
835 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
836 LSDB_LOOP(SUMMARY_LSDB(area
), rn
, lsa
)
837 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
838 LSDB_LOOP(ASBR_SUMMARY_LSDB(area
), rn
, lsa
)
839 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
841 LSDB_LOOP(NSSA_LSDB(area
), rn
, lsa
)
842 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
843 LSDB_LOOP(OPAQUE_AREA_LSDB(area
), rn
, lsa
)
844 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
845 LSDB_LOOP(OPAQUE_LINK_LSDB(area
), rn
, lsa
)
846 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
848 ospf_opaque_type10_lsa_term(area
);
849 ospf_lsdb_delete_all(area
->lsdb
);
850 ospf_lsdb_free(area
->lsdb
);
852 ospf_lsa_unlock(&area
->router_lsa_self
);
854 route_table_finish(area
->ranges
);
855 list_delete_and_null(&area
->oiflist
);
857 if (EXPORT_NAME(area
))
858 free(EXPORT_NAME(area
));
860 if (IMPORT_NAME(area
))
861 free(IMPORT_NAME(area
));
864 OSPF_TIMER_OFF(area
->t_stub_router
);
865 OSPF_TIMER_OFF(area
->t_opaque_lsa_self
);
867 if (OSPF_IS_AREA_BACKBONE(area
))
868 area
->ospf
->backbone
= NULL
;
870 XFREE(MTYPE_OSPF_AREA
, area
);
873 void ospf_area_check_free(struct ospf
*ospf
, struct in_addr area_id
)
875 struct ospf_area
*area
;
877 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
878 if (area
&& listcount(area
->oiflist
) == 0 && area
->ranges
->top
== NULL
879 && area
->shortcut_configured
== OSPF_SHORTCUT_DEFAULT
880 && area
->external_routing
== OSPF_AREA_DEFAULT
881 && area
->no_summary
== 0 && area
->default_cost
== 1
882 && EXPORT_NAME(area
) == NULL
&& IMPORT_NAME(area
) == NULL
883 && area
->auth_type
== OSPF_AUTH_NULL
) {
884 listnode_delete(ospf
->areas
, area
);
885 ospf_area_free(area
);
889 struct ospf_area
*ospf_area_get(struct ospf
*ospf
, struct in_addr area_id
)
891 struct ospf_area
*area
;
893 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
895 area
= ospf_area_new(ospf
, area_id
);
896 listnode_add_sort(ospf
->areas
, area
);
897 ospf_check_abr_status(ospf
);
898 if (ospf
->stub_router_admin_set
899 == OSPF_STUB_ROUTER_ADMINISTRATIVE_SET
) {
900 SET_FLAG(area
->stub_router_state
,
901 OSPF_AREA_ADMIN_STUB_ROUTED
);
908 struct ospf_area
*ospf_area_lookup_by_area_id(struct ospf
*ospf
,
909 struct in_addr area_id
)
911 struct ospf_area
*area
;
912 struct listnode
*node
;
914 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
))
915 if (IPV4_ADDR_SAME(&area
->area_id
, &area_id
))
921 void ospf_area_add_if(struct ospf_area
*area
, struct ospf_interface
*oi
)
923 listnode_add(area
->oiflist
, oi
);
926 void ospf_area_del_if(struct ospf_area
*area
, struct ospf_interface
*oi
)
928 listnode_delete(area
->oiflist
, oi
);
932 static void add_ospf_interface(struct connected
*co
, struct ospf_area
*area
)
934 struct ospf_interface
*oi
;
936 oi
= ospf_if_new(area
->ospf
, co
->ifp
, co
->address
);
941 oi
->params
= ospf_lookup_if_params(co
->ifp
, oi
->address
->u
.prefix4
);
942 oi
->output_cost
= ospf_if_get_output_cost(oi
);
944 /* Relate ospf interface to ospf instance. */
945 oi
->ospf
= area
->ospf
;
947 /* update network type as interface flag */
948 /* If network type is specified previously,
949 skip network type setting. */
950 oi
->type
= IF_DEF_PARAMS(co
->ifp
)->type
;
952 /* Add pseudo neighbor. */
953 ospf_nbr_self_reset(oi
, oi
->ospf
->router_id
);
955 ospf_area_add_if(oi
->area
, oi
);
958 * if router_id is not configured, dont bring up
960 * ospf_router_id_update() will call ospf_if_update
961 * whenever r-id is configured instead.
963 if ((area
->ospf
->router_id
.s_addr
!= 0) && if_is_operative(co
->ifp
))
967 static void update_redistributed(struct ospf
*ospf
, int add_to_ospf
)
969 struct route_node
*rn
;
970 struct external_info
*ei
;
971 struct ospf_external
*ext
;
973 if (ospf_is_type_redistributed(ospf
, ZEBRA_ROUTE_CONNECT
, 0)) {
974 ext
= ospf_external_lookup(ospf
, ZEBRA_ROUTE_CONNECT
, 0);
975 if ((ext
) && EXTERNAL_INFO(ext
)) {
976 for (rn
= route_top(EXTERNAL_INFO(ext
)); rn
;
977 rn
= route_next(rn
)) {
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_no_summary_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
);
1507 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1510 ospf_area_no_summary_set(ospf
, area_id
);
1515 int ospf_area_nssa_set(struct ospf
*ospf
, struct in_addr area_id
)
1517 struct ospf_area
*area
;
1519 area
= ospf_area_get(ospf
, area_id
);
1520 if (ospf_area_vlink_count(ospf
, area
))
1523 if (area
->external_routing
!= OSPF_AREA_NSSA
) {
1524 ospf_area_type_set(area
, OSPF_AREA_NSSA
);
1527 /* set NSSA area defaults */
1528 area
->no_summary
= 0;
1529 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1530 area
->NSSATranslatorState
= OSPF_NSSA_TRANSLATE_DISABLED
;
1531 area
->NSSATranslatorStabilityInterval
=
1532 OSPF_NSSA_TRANS_STABLE_DEFAULT
;
1537 int ospf_area_nssa_unset(struct ospf
*ospf
, struct in_addr area_id
, int argc
)
1539 struct ospf_area
*area
;
1541 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1545 /* argc < 5 -> 'no area x nssa' */
1546 if (argc
< 5 && area
->external_routing
== OSPF_AREA_NSSA
) {
1548 /* set NSSA area defaults */
1549 area
->no_summary
= 0;
1550 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1551 area
->NSSATranslatorState
= OSPF_NSSA_TRANSLATE_DISABLED
;
1552 area
->NSSATranslatorStabilityInterval
=
1553 OSPF_NSSA_TRANS_STABLE_DEFAULT
;
1554 ospf_area_type_set(area
, OSPF_AREA_DEFAULT
);
1556 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1559 ospf_area_check_free(ospf
, area_id
);
1564 int ospf_area_nssa_translator_role_set(struct ospf
*ospf
,
1565 struct in_addr area_id
, int role
)
1567 struct ospf_area
*area
;
1569 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1573 area
->NSSATranslatorRole
= role
;
1579 /* XXX: unused? Leave for symmetry? */
1581 ospf_area_nssa_translator_role_unset (struct ospf
*ospf
,
1582 struct in_addr area_id
)
1584 struct ospf_area
*area
;
1586 area
= ospf_area_lookup_by_area_id (ospf
, area_id
);
1590 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1592 ospf_area_check_free (ospf
, area_id
);
1598 int ospf_area_export_list_set(struct ospf
*ospf
, struct ospf_area
*area
,
1599 const char *list_name
)
1601 struct access_list
*list
;
1602 list
= access_list_lookup(AFI_IP
, list_name
);
1604 EXPORT_LIST(area
) = list
;
1606 if (EXPORT_NAME(area
))
1607 free(EXPORT_NAME(area
));
1609 EXPORT_NAME(area
) = strdup(list_name
);
1610 ospf_schedule_abr_task(ospf
);
1615 int ospf_area_export_list_unset(struct ospf
*ospf
, struct ospf_area
*area
)
1618 EXPORT_LIST(area
) = 0;
1620 if (EXPORT_NAME(area
))
1621 free(EXPORT_NAME(area
));
1623 EXPORT_NAME(area
) = NULL
;
1625 ospf_area_check_free(ospf
, area
->area_id
);
1627 ospf_schedule_abr_task(ospf
);
1632 int ospf_area_import_list_set(struct ospf
*ospf
, struct ospf_area
*area
,
1635 struct access_list
*list
;
1636 list
= access_list_lookup(AFI_IP
, name
);
1638 IMPORT_LIST(area
) = list
;
1640 if (IMPORT_NAME(area
))
1641 free(IMPORT_NAME(area
));
1643 IMPORT_NAME(area
) = strdup(name
);
1644 ospf_schedule_abr_task(ospf
);
1649 int ospf_area_import_list_unset(struct ospf
*ospf
, struct ospf_area
*area
)
1651 IMPORT_LIST(area
) = 0;
1653 if (IMPORT_NAME(area
))
1654 free(IMPORT_NAME(area
));
1656 IMPORT_NAME(area
) = NULL
;
1657 ospf_area_check_free(ospf
, area
->area_id
);
1659 ospf_schedule_abr_task(ospf
);
1664 int ospf_timers_refresh_set(struct ospf
*ospf
, int interval
)
1668 if (ospf
->lsa_refresh_interval
== interval
)
1671 time_left
= ospf
->lsa_refresh_interval
1672 - (monotime(NULL
) - ospf
->lsa_refresher_started
);
1674 if (time_left
> interval
) {
1675 OSPF_TIMER_OFF(ospf
->t_lsa_refresher
);
1676 thread_add_timer(master
, ospf_lsa_refresh_walker
, ospf
,
1677 interval
, &ospf
->t_lsa_refresher
);
1679 ospf
->lsa_refresh_interval
= interval
;
1684 int ospf_timers_refresh_unset(struct ospf
*ospf
)
1688 time_left
= ospf
->lsa_refresh_interval
1689 - (monotime(NULL
) - ospf
->lsa_refresher_started
);
1691 if (time_left
> OSPF_LSA_REFRESH_INTERVAL_DEFAULT
) {
1692 OSPF_TIMER_OFF(ospf
->t_lsa_refresher
);
1693 ospf
->t_lsa_refresher
= NULL
;
1694 thread_add_timer(master
, ospf_lsa_refresh_walker
, ospf
,
1695 OSPF_LSA_REFRESH_INTERVAL_DEFAULT
,
1696 &ospf
->t_lsa_refresher
);
1699 ospf
->lsa_refresh_interval
= OSPF_LSA_REFRESH_INTERVAL_DEFAULT
;
1705 static struct ospf_nbr_nbma
*ospf_nbr_nbma_new(void)
1707 struct ospf_nbr_nbma
*nbr_nbma
;
1709 nbr_nbma
= XCALLOC(MTYPE_OSPF_NEIGHBOR_STATIC
,
1710 sizeof(struct ospf_nbr_nbma
));
1712 nbr_nbma
->priority
= OSPF_NEIGHBOR_PRIORITY_DEFAULT
;
1713 nbr_nbma
->v_poll
= OSPF_POLL_INTERVAL_DEFAULT
;
1718 static void ospf_nbr_nbma_free(struct ospf_nbr_nbma
*nbr_nbma
)
1720 XFREE(MTYPE_OSPF_NEIGHBOR_STATIC
, nbr_nbma
);
1723 static void ospf_nbr_nbma_delete(struct ospf
*ospf
,
1724 struct ospf_nbr_nbma
*nbr_nbma
)
1726 struct route_node
*rn
;
1727 struct prefix_ipv4 p
;
1730 p
.prefix
= nbr_nbma
->addr
;
1731 p
.prefixlen
= IPV4_MAX_BITLEN
;
1733 rn
= route_node_lookup(ospf
->nbr_nbma
, (struct prefix
*)&p
);
1735 ospf_nbr_nbma_free(rn
->info
);
1737 route_unlock_node(rn
);
1738 route_unlock_node(rn
);
1742 static void ospf_nbr_nbma_down(struct ospf_nbr_nbma
*nbr_nbma
)
1744 OSPF_TIMER_OFF(nbr_nbma
->t_poll
);
1746 if (nbr_nbma
->nbr
) {
1747 nbr_nbma
->nbr
->nbr_nbma
= NULL
;
1748 OSPF_NSM_EVENT_EXECUTE(nbr_nbma
->nbr
, NSM_KillNbr
);
1752 listnode_delete(nbr_nbma
->oi
->nbr_nbma
, nbr_nbma
);
1755 static void ospf_nbr_nbma_add(struct ospf_nbr_nbma
*nbr_nbma
,
1756 struct ospf_interface
*oi
)
1758 struct ospf_neighbor
*nbr
;
1759 struct route_node
*rn
;
1762 if (oi
->type
!= OSPF_IFTYPE_NBMA
)
1765 if (nbr_nbma
->nbr
!= NULL
)
1768 if (IPV4_ADDR_SAME(&oi
->nbr_self
->address
.u
.prefix4
, &nbr_nbma
->addr
))
1772 listnode_add(oi
->nbr_nbma
, nbr_nbma
);
1774 /* Get neighbor information from table. */
1776 p
.prefixlen
= IPV4_MAX_BITLEN
;
1777 p
.u
.prefix4
= nbr_nbma
->addr
;
1779 rn
= route_node_get(oi
->nbrs
, (struct prefix
*)&p
);
1782 nbr
->nbr_nbma
= nbr_nbma
;
1783 nbr_nbma
->nbr
= nbr
;
1785 route_unlock_node(rn
);
1787 nbr
= rn
->info
= ospf_nbr_new(oi
);
1788 nbr
->state
= NSM_Down
;
1789 nbr
->src
= nbr_nbma
->addr
;
1790 nbr
->nbr_nbma
= nbr_nbma
;
1791 nbr
->priority
= nbr_nbma
->priority
;
1794 nbr_nbma
->nbr
= nbr
;
1796 OSPF_NSM_EVENT_EXECUTE(nbr
, NSM_Start
);
1800 void ospf_nbr_nbma_if_update(struct ospf
*ospf
, struct ospf_interface
*oi
)
1802 struct ospf_nbr_nbma
*nbr_nbma
;
1803 struct route_node
*rn
;
1804 struct prefix_ipv4 p
;
1806 if (oi
->type
!= OSPF_IFTYPE_NBMA
)
1809 for (rn
= route_top(ospf
->nbr_nbma
); rn
; rn
= route_next(rn
))
1810 if ((nbr_nbma
= rn
->info
))
1811 if (nbr_nbma
->oi
== NULL
&& nbr_nbma
->nbr
== NULL
) {
1813 p
.prefix
= nbr_nbma
->addr
;
1814 p
.prefixlen
= IPV4_MAX_BITLEN
;
1816 if (prefix_match(oi
->address
,
1817 (struct prefix
*)&p
))
1818 ospf_nbr_nbma_add(nbr_nbma
, oi
);
1822 struct ospf_nbr_nbma
*ospf_nbr_nbma_lookup(struct ospf
*ospf
,
1823 struct in_addr nbr_addr
)
1825 struct route_node
*rn
;
1826 struct prefix_ipv4 p
;
1829 p
.prefix
= nbr_addr
;
1830 p
.prefixlen
= IPV4_MAX_BITLEN
;
1832 rn
= route_node_lookup(ospf
->nbr_nbma
, (struct prefix
*)&p
);
1834 route_unlock_node(rn
);
1840 struct ospf_nbr_nbma
*ospf_nbr_nbma_lookup_next(struct ospf
*ospf
,
1841 struct in_addr
*addr
, int first
)
1844 struct ospf_nbr_nbma
*nbr_nbma
;
1845 struct listnode
*node
;
1852 for (ALL_LIST_ELEMENTS_RO (ospf
->nbr_nbma
, node
, nbr_nbma
))
1856 *addr
= nbr_nbma
->addr
;
1859 else if (ntohl (nbr_nbma
->addr
.s_addr
) > ntohl (addr
->s_addr
))
1861 *addr
= nbr_nbma
->addr
;
1869 int ospf_nbr_nbma_set(struct ospf
*ospf
, struct in_addr nbr_addr
)
1871 struct ospf_nbr_nbma
*nbr_nbma
;
1872 struct ospf_interface
*oi
;
1873 struct prefix_ipv4 p
;
1874 struct route_node
*rn
;
1875 struct listnode
*node
;
1877 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
1881 nbr_nbma
= ospf_nbr_nbma_new();
1882 nbr_nbma
->addr
= nbr_addr
;
1885 p
.prefix
= nbr_addr
;
1886 p
.prefixlen
= IPV4_MAX_BITLEN
;
1888 rn
= route_node_get(ospf
->nbr_nbma
, (struct prefix
*)&p
);
1890 route_unlock_node(rn
);
1891 rn
->info
= nbr_nbma
;
1893 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
1894 if (oi
->type
== OSPF_IFTYPE_NBMA
)
1895 if (prefix_match(oi
->address
, (struct prefix
*)&p
)) {
1896 ospf_nbr_nbma_add(nbr_nbma
, oi
);
1904 int ospf_nbr_nbma_unset(struct ospf
*ospf
, struct in_addr nbr_addr
)
1906 struct ospf_nbr_nbma
*nbr_nbma
;
1908 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
1909 if (nbr_nbma
== NULL
)
1912 ospf_nbr_nbma_down(nbr_nbma
);
1913 ospf_nbr_nbma_delete(ospf
, nbr_nbma
);
1918 int ospf_nbr_nbma_priority_set(struct ospf
*ospf
, struct in_addr nbr_addr
,
1921 struct ospf_nbr_nbma
*nbr_nbma
;
1923 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
1924 if (nbr_nbma
== NULL
)
1927 if (nbr_nbma
->priority
!= priority
)
1928 nbr_nbma
->priority
= priority
;
1933 int ospf_nbr_nbma_priority_unset(struct ospf
*ospf
, struct in_addr nbr_addr
)
1935 struct ospf_nbr_nbma
*nbr_nbma
;
1937 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
1938 if (nbr_nbma
== NULL
)
1941 if (nbr_nbma
!= OSPF_NEIGHBOR_PRIORITY_DEFAULT
)
1942 nbr_nbma
->priority
= OSPF_NEIGHBOR_PRIORITY_DEFAULT
;
1947 int ospf_nbr_nbma_poll_interval_set(struct ospf
*ospf
, struct in_addr nbr_addr
,
1948 unsigned int interval
)
1950 struct ospf_nbr_nbma
*nbr_nbma
;
1952 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
1953 if (nbr_nbma
== NULL
)
1956 if (nbr_nbma
->v_poll
!= interval
) {
1957 nbr_nbma
->v_poll
= interval
;
1958 if (nbr_nbma
->oi
&& ospf_if_is_up(nbr_nbma
->oi
)) {
1959 OSPF_TIMER_OFF(nbr_nbma
->t_poll
);
1960 OSPF_POLL_TIMER_ON(nbr_nbma
->t_poll
, ospf_poll_timer
,
1968 int ospf_nbr_nbma_poll_interval_unset(struct ospf
*ospf
, struct in_addr addr
)
1970 struct ospf_nbr_nbma
*nbr_nbma
;
1972 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, addr
);
1973 if (nbr_nbma
== NULL
)
1976 if (nbr_nbma
->v_poll
!= OSPF_POLL_INTERVAL_DEFAULT
)
1977 nbr_nbma
->v_poll
= OSPF_POLL_INTERVAL_DEFAULT
;
1982 void ospf_master_init(struct thread_master
*master
)
1984 memset(&ospf_master
, 0, sizeof(struct ospf_master
));
1987 om
->ospf
= list_new();
1988 om
->master
= master
;
1991 /* Link OSPF instance to VRF. */
1992 void ospf_vrf_link(struct ospf
*ospf
, struct vrf
*vrf
)
1994 ospf
->vrf_id
= vrf
->vrf_id
;
1995 if (vrf
->info
!= (void *)ospf
)
1996 vrf
->info
= (void *)ospf
;
1999 /* Unlink OSPF instance from VRF. */
2000 void ospf_vrf_unlink(struct ospf
*ospf
, struct vrf
*vrf
)
2002 if (vrf
->info
== (void *)ospf
)
2004 ospf
->vrf_id
= VRF_UNKNOWN
;
2007 /* This is hook function for vrf create called as part of vrf_init */
2008 static int ospf_vrf_new(struct vrf
*vrf
)
2010 if (IS_DEBUG_OSPF_EVENT
)
2011 zlog_debug("%s: VRF Created: %s(%d)", __PRETTY_FUNCTION__
,
2012 vrf
->name
, vrf
->vrf_id
);
2017 /* This is hook function for vrf delete call as part of vrf_init */
2018 static int ospf_vrf_delete(struct vrf
*vrf
)
2020 if (IS_DEBUG_OSPF_EVENT
)
2021 zlog_debug("%s: VRF Deletion: %s(%d)", __PRETTY_FUNCTION__
,
2022 vrf
->name
, vrf
->vrf_id
);
2027 /* Enable OSPF VRF instance */
2028 static int ospf_vrf_enable(struct vrf
*vrf
)
2030 struct ospf
*ospf
= NULL
;
2031 vrf_id_t old_vrf_id
= VRF_DEFAULT
;
2033 if (IS_DEBUG_OSPF_EVENT
)
2034 zlog_debug("%s: VRF %s id %d enabled",
2035 __PRETTY_FUNCTION__
, vrf
->name
, vrf
->vrf_id
);
2037 ospf
= ospf_lookup_by_name(vrf
->name
);
2039 old_vrf_id
= ospf
->vrf_id
;
2040 /* We have instance configured, link to VRF and make it "up". */
2041 ospf_vrf_link(ospf
, vrf
);
2042 if (IS_DEBUG_OSPF_EVENT
)
2043 zlog_debug("%s: ospf linked to vrf %s vrf_id %d (old id %d)",
2044 __PRETTY_FUNCTION__
, vrf
->name
, ospf
->vrf_id
,
2047 if (old_vrf_id
!= ospf
->vrf_id
) {
2048 if (ospfd_privs
.change(ZPRIVS_RAISE
)) {
2049 zlog_err("ospf_sock_init: could not raise privs, %s",
2050 safe_strerror(errno
));
2052 if (ospf_bind_vrfdevice(ospf
, ospf
->fd
) < 0)
2054 if (ospfd_privs
.change(ZPRIVS_LOWER
)) {
2055 zlog_err("ospf_sock_init: could not lower privs, %s",
2056 safe_strerror(errno
));
2059 ospf
->oi_running
= 1;
2060 ospf_zebra_vrf_register(ospf
);
2061 ospf_router_id_update(ospf
);
2068 /* Disable OSPF VRF instance */
2069 static int ospf_vrf_disable(struct vrf
*vrf
)
2071 struct ospf
*ospf
= NULL
;
2072 vrf_id_t old_vrf_id
= VRF_UNKNOWN
;
2074 if (vrf
->vrf_id
== VRF_DEFAULT
)
2077 if (IS_DEBUG_OSPF_EVENT
)
2078 zlog_debug("%s: VRF %s id %d disabled.",
2079 __PRETTY_FUNCTION__
, vrf
->name
, vrf
->vrf_id
);
2081 ospf
= ospf_lookup_by_name(vrf
->name
);
2083 old_vrf_id
= ospf
->vrf_id
;
2085 /* We have instance configured, unlink
2086 * from VRF and make it "down".
2088 ospf_vrf_unlink(ospf
, vrf
);
2089 ospf
->oi_running
= 0;
2090 if (IS_DEBUG_OSPF_EVENT
)
2091 zlog_debug("%s: ospf old_vrf_id %d unlinked",
2092 __PRETTY_FUNCTION__
, old_vrf_id
);
2095 /* Note: This is a callback, the VRF will be deleted by the caller. */
2099 void ospf_vrf_init(void)
2101 vrf_init(ospf_vrf_new
, ospf_vrf_enable
,
2102 ospf_vrf_disable
, ospf_vrf_delete
);
2105 void ospf_vrf_terminate(void)
2110 const char *ospf_vrf_id_to_name(vrf_id_t vrf_id
)
2112 struct vrf
*vrf
= vrf_lookup_by_id(vrf_id
);
2114 return vrf
? vrf
->name
: "NIL";