1 /* OSPF version 2 daemon program.
2 * Copyright (C) 1999, 2000 Toshiaki Takada
4 * This file is part of GNU Zebra.
6 * GNU Zebra is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation; either version 2, or (at your option) any
11 * GNU Zebra is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
16 * You should have received a copy of the GNU General Public License along
17 * with this program; see the file COPYING; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
33 #include "sockunion.h" /* for inet_aton () */
41 #include "lib_errors.h"
43 #include "ospfd/ospfd.h"
44 #include "ospfd/ospf_network.h"
45 #include "ospfd/ospf_interface.h"
46 #include "ospfd/ospf_ism.h"
47 #include "ospfd/ospf_asbr.h"
48 #include "ospfd/ospf_lsa.h"
49 #include "ospfd/ospf_lsdb.h"
50 #include "ospfd/ospf_neighbor.h"
51 #include "ospfd/ospf_nsm.h"
52 #include "ospfd/ospf_spf.h"
53 #include "ospfd/ospf_packet.h"
54 #include "ospfd/ospf_dump.h"
55 #include "ospfd/ospf_route.h"
56 #include "ospfd/ospf_zebra.h"
57 #include "ospfd/ospf_abr.h"
58 #include "ospfd/ospf_flood.h"
59 #include "ospfd/ospf_ase.h"
62 DEFINE_QOBJ_TYPE(ospf
)
64 /* OSPF process wide configuration. */
65 static struct ospf_master ospf_master
;
67 /* OSPF process wide configuration pointer to export. */
68 struct ospf_master
*om
;
70 extern struct zclient
*zclient
;
73 static void ospf_remove_vls_through_area(struct ospf
*, struct ospf_area
*);
74 static void ospf_network_free(struct ospf
*, struct ospf_network
*);
75 static void ospf_area_free(struct ospf_area
*);
76 static void ospf_network_run(struct prefix
*, struct ospf_area
*);
77 static void ospf_network_run_interface(struct ospf
*, struct interface
*,
78 struct prefix
*, struct ospf_area
*);
79 static void ospf_network_run_subnet(struct ospf
*, struct connected
*,
80 struct prefix
*, struct ospf_area
*);
81 static int ospf_network_match_iface(const struct connected
*,
82 const struct prefix
*);
83 static void ospf_finish_final(struct ospf
*);
85 #define OSPF_EXTERNAL_LSA_ORIGINATE_DELAY 1
87 void ospf_router_id_update(struct ospf
*ospf
)
89 struct vrf
*vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
90 struct in_addr router_id
, router_id_old
;
91 struct ospf_interface
*oi
;
92 struct interface
*ifp
;
93 struct listnode
*node
;
96 if (!ospf
->oi_running
) {
97 if (IS_DEBUG_OSPF_EVENT
)
99 "Router ospf not configured -- Router-ID update postponed");
103 if (IS_DEBUG_OSPF_EVENT
)
104 zlog_debug("Router-ID[OLD:%s]: Update",
105 inet_ntoa(ospf
->router_id
));
107 router_id_old
= ospf
->router_id
;
109 /* Select the router ID based on these priorities:
110 1. Statically assigned router ID is always the first choice.
111 2. If there is no statically assigned router ID, then try to stick
112 with the most recent value, since changing router ID's is very
114 3. Last choice: just go with whatever the zebra daemon recommends.
116 if (ospf
->router_id_static
.s_addr
!= 0)
117 router_id
= ospf
->router_id_static
;
118 else if (ospf
->router_id
.s_addr
!= 0)
119 router_id
= ospf
->router_id
;
121 router_id
= ospf
->router_id_zebra
;
123 if (IS_DEBUG_OSPF_EVENT
)
124 zlog_debug("Router-ID[OLD:%s]: Update to %s",
125 inet_ntoa(ospf
->router_id
), inet_ntoa(router_id
));
127 if (!IPV4_ADDR_SAME(&router_id_old
, &router_id
)) {
129 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
130 /* Some nbrs are identified by router_id, these needs
131 * to be rebuilt. Possible optimization would be to do
132 * oi->nbr_self->router_id = router_id for
133 * !(virtual | ptop) links
135 ospf_nbr_self_reset(oi
, router_id
);
138 /* If AS-external-LSA is queued, then flush those LSAs. */
139 if (router_id_old
.s_addr
== 0 && ospf
->external_origin
) {
140 /* Originate each redistributed external route. */
141 for (type
= 0; type
< ZEBRA_ROUTE_MAX
; type
++)
142 if (ospf
->external_origin
& (1 << type
))
145 ospf_external_lsa_originate_timer
,
147 /* Originate Deafult. */
148 if (ospf
->external_origin
& (1 << ZEBRA_ROUTE_MAX
))
149 thread_add_event(master
,
150 ospf_default_originate_timer
,
153 ospf
->external_origin
= 0;
156 /* Flush (inline) all external LSAs based on the OSPF_LSA_SELF
159 struct route_node
*rn
;
160 struct ospf_lsa
*lsa
;
162 LSDB_LOOP (EXTERNAL_LSDB(ospf
), rn
, lsa
)
163 if (IS_LSA_SELF(lsa
))
164 ospf_lsa_flush_schedule(ospf
, lsa
);
167 ospf
->router_id
= router_id
;
168 if (IS_DEBUG_OSPF_EVENT
)
169 zlog_debug("Router-ID[NEW:%s]: Update",
170 inet_ntoa(ospf
->router_id
));
172 /* Flush (inline) all external LSAs which now match the new
174 need to adjust the OSPF_LSA_SELF flag, so the flush doesn't
176 asserts in ospf_refresher_unregister_lsa(). This step is
178 because the current quagga code does look-up for
180 based on the self router-id alone but expects OSPF_LSA_SELF
184 struct route_node
*rn
;
185 struct ospf_lsa
*lsa
;
187 LSDB_LOOP (EXTERNAL_LSDB(ospf
), rn
, lsa
) {
188 /* AdvRouter and Router ID is the same. */
189 if (IPV4_ADDR_SAME(&lsa
->data
->adv_router
,
192 OSPF_LSA_SELF_CHECKED
);
193 SET_FLAG(lsa
->flags
, OSPF_LSA_SELF
);
194 ospf_lsa_flush_schedule(ospf
, lsa
);
199 /* Originate each redistributed external route. */
200 for (type
= 0; type
< ZEBRA_ROUTE_MAX
; type
++)
201 thread_add_event(master
,
202 ospf_external_lsa_originate_timer
,
204 thread_add_event(master
, ospf_default_originate_timer
, ospf
, 0,
207 /* update router-lsa's for each area */
208 ospf_router_lsa_update(ospf
);
210 /* update ospf_interface's */
211 FOR_ALL_INTERFACES (vrf
, ifp
)
212 ospf_if_update(ospf
, ifp
);
216 /* For OSPF area sort by area id. */
217 static int ospf_area_id_cmp(struct ospf_area
*a1
, struct ospf_area
*a2
)
219 if (ntohl(a1
->area_id
.s_addr
) > ntohl(a2
->area_id
.s_addr
))
221 if (ntohl(a1
->area_id
.s_addr
) < ntohl(a2
->area_id
.s_addr
))
226 /* Allocate new ospf structure. */
227 static struct ospf
*ospf_new(unsigned short instance
, const char *name
)
230 struct vrf
*vrf
= NULL
;
232 struct ospf
*new = XCALLOC(MTYPE_OSPF_TOP
, sizeof(struct ospf
));
234 new->instance
= instance
;
235 new->router_id
.s_addr
= htonl(0);
236 new->router_id_static
.s_addr
= htonl(0);
237 if (name
&& !strmatch(name
, VRF_DEFAULT_NAME
)) {
238 new->vrf_id
= VRF_UNKNOWN
;
239 /* Freed in ospf_finish_final */
240 new->name
= XSTRDUP(MTYPE_OSPF_TOP
, name
);
241 if (IS_DEBUG_OSPF_EVENT
)
243 "%s: Create new ospf instance with vrf_name %s vrf_id %u",
244 __PRETTY_FUNCTION__
, name
, new->vrf_id
);
246 new->vrf_id
= VRF_DEFAULT
;
247 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 new->ibuf
= stream_new(OSPF_MAX_PACKET_SIZE
+ 1);
314 new->oi_write_q
= list_new();
315 new->write_oi_count
= OSPF_WRITE_INTERFACE_COUNT_DEFAULT
;
317 /* Enable "log-adjacency-changes" */
318 #if DFLT_OSPF_LOG_ADJACENCY_CHANGES
319 SET_FLAG(new->config
, OSPF_LOG_ADJACENCY_CHANGES
);
325 if ((ospf_sock_init(new)) < 0) {
326 if (new->vrf_id
!= VRF_UNKNOWN
)
329 "%s: ospf_sock_init is unable to open a socket",
333 thread_add_read(master
, ospf_read
, new, new->fd
, &new->t_read
);
338 struct ospf
*ospf_lookup_instance(unsigned 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(unsigned short instance
, const char *name
)
376 struct ospf
*ospf
= NULL
;
377 struct listnode
*node
, *nnode
;
379 if (name
== NULL
|| strmatch(name
, VRF_DEFAULT_NAME
))
380 return ospf_lookup_by_vrf_id(VRF_DEFAULT
);
382 for (ALL_LIST_ELEMENTS(om
->ospf
, node
, nnode
, ospf
)) {
383 if ((ospf
->instance
== instance
)
384 && ((ospf
->name
== NULL
&& name
== NULL
)
385 || (ospf
->name
&& name
386 && strcmp(ospf
->name
, name
) == 0)))
392 struct ospf
*ospf_get(unsigned short instance
, const char *name
)
396 /* vrf name provided call inst and name based api
397 * in case of no name pass default ospf instance */
399 ospf
= ospf_lookup_by_inst_name(instance
, name
);
401 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
404 ospf
= ospf_new(instance
, name
);
407 if (ospf
->router_id_static
.s_addr
== 0)
408 ospf_router_id_update(ospf
);
410 ospf_opaque_type11_lsa_init(ospf
);
416 struct ospf
*ospf_get_instance(unsigned short instance
)
420 ospf
= ospf_lookup_instance(instance
);
422 ospf
= ospf_new(instance
, NULL
/* VRF_DEFAULT*/);
425 if (ospf
->router_id_static
.s_addr
== 0) {
426 if (vrf_lookup_by_id(ospf
->vrf_id
))
427 ospf_router_id_update(ospf
);
429 if (IS_DEBUG_OSPF_EVENT
)
431 "%s: ospf VRF (id %d) is not active yet, skip router id update",
435 ospf_router_id_update(ospf
);
438 ospf_opaque_type11_lsa_init(ospf
);
444 struct ospf
*ospf_lookup_by_vrf_id(vrf_id_t vrf_id
)
446 struct vrf
*vrf
= NULL
;
448 vrf
= vrf_lookup_by_id(vrf_id
);
451 return (vrf
->info
) ? (struct ospf
*)vrf
->info
: NULL
;
454 /* It should only be used when processing incoming info update from zebra.
455 * Other situations, it is not sufficient to lookup the ospf instance by
456 * vrf_name only without using the instance number.
458 static struct ospf
*ospf_lookup_by_name(const char *vrf_name
)
460 struct ospf
*ospf
= NULL
;
461 struct listnode
*node
, *nnode
;
463 for (ALL_LIST_ELEMENTS(om
->ospf
, node
, nnode
, ospf
))
464 if ((ospf
->name
== NULL
&& vrf_name
== NULL
)
465 || (ospf
->name
&& vrf_name
466 && strcmp(ospf
->name
, vrf_name
) == 0))
471 /* Handle the second half of deferred shutdown. This is called either
472 * from the deferred-shutdown timer thread, or directly through
473 * ospf_deferred_shutdown_check.
475 * Function is to cleanup G-R state, if required then call ospf_finish_final
476 * to complete shutdown of this ospf instance. Possibly exit if the
477 * whole process is being shutdown and this was the last OSPF instance.
479 static void ospf_deferred_shutdown_finish(struct ospf
*ospf
)
481 ospf
->stub_router_shutdown_time
= OSPF_STUB_ROUTER_UNCONFIGURED
;
482 OSPF_TIMER_OFF(ospf
->t_deferred_shutdown
);
484 ospf_finish_final(ospf
);
486 /* *ospf is now invalid */
488 /* ospfd being shut-down? If so, was this the last ospf instance? */
489 if (CHECK_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
)
490 && (listcount(om
->ospf
) == 0)) {
497 /* Timer thread for G-R */
498 static int ospf_deferred_shutdown_timer(struct thread
*t
)
500 struct ospf
*ospf
= THREAD_ARG(t
);
502 ospf_deferred_shutdown_finish(ospf
);
507 /* Check whether deferred-shutdown must be scheduled, otherwise call
508 * down directly into second-half of instance shutdown.
510 static void ospf_deferred_shutdown_check(struct ospf
*ospf
)
512 unsigned long timeout
;
514 struct ospf_area
*area
;
516 /* deferred shutdown already running? */
517 if (ospf
->t_deferred_shutdown
)
520 /* Should we try push out max-metric LSAs? */
521 if (ospf
->stub_router_shutdown_time
!= OSPF_STUB_ROUTER_UNCONFIGURED
) {
522 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, ln
, area
)) {
523 SET_FLAG(area
->stub_router_state
,
524 OSPF_AREA_ADMIN_STUB_ROUTED
);
526 if (!CHECK_FLAG(area
->stub_router_state
,
527 OSPF_AREA_IS_STUB_ROUTED
))
528 ospf_router_lsa_update_area(area
);
530 timeout
= ospf
->stub_router_shutdown_time
;
532 /* No timer needed */
533 ospf_deferred_shutdown_finish(ospf
);
537 OSPF_TIMER_ON(ospf
->t_deferred_shutdown
, ospf_deferred_shutdown_timer
,
542 /* Shut down the entire process */
543 void ospf_terminate(void)
546 struct listnode
*node
, *nnode
;
548 /* shutdown already in progress */
549 if (CHECK_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
))
552 SET_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
);
554 /* exit immediately if OSPF not actually running */
555 if (listcount(om
->ospf
) == 0)
559 for (ALL_LIST_ELEMENTS(om
->ospf
, node
, nnode
, ospf
))
562 /* Cleanup route maps */
565 /* reverse prefix_list_init */
566 prefix_list_add_hook(NULL
);
567 prefix_list_delete_hook(NULL
);
570 /* Cleanup vrf info */
571 ospf_vrf_terminate();
573 /* Deliberately go back up, hopefully to thread scheduler, as
574 * One or more ospf_finish()'s may have deferred shutdown to a timer
577 zclient_stop(zclient
);
578 zclient_free(zclient
);
583 void ospf_finish(struct ospf
*ospf
)
585 /* let deferred shutdown decide */
586 ospf_deferred_shutdown_check(ospf
);
588 /* if ospf_deferred_shutdown returns, then ospf_finish_final is
589 * deferred to expiry of G-S timer thread. Return back up, hopefully
590 * to thread scheduler.
595 /* Final cleanup of ospf instance */
596 static void ospf_finish_final(struct ospf
*ospf
)
598 struct vrf
*vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
599 struct route_node
*rn
;
600 struct ospf_nbr_nbma
*nbr_nbma
;
601 struct ospf_lsa
*lsa
;
602 struct interface
*ifp
;
603 struct ospf_interface
*oi
;
604 struct ospf_area
*area
;
605 struct ospf_vl_data
*vl_data
;
606 struct listnode
*node
, *nnode
;
608 unsigned short instance
= 0;
612 ospf_opaque_type11_lsa_term(ospf
);
614 ospf_opaque_finish();
616 ospf_flush_self_originated_lsas_now(ospf
);
618 /* Unregister redistribution */
619 for (i
= 0; i
< ZEBRA_ROUTE_MAX
; i
++) {
620 struct list
*red_list
;
621 struct ospf_redist
*red
;
623 red_list
= ospf
->redist
[i
];
627 for (ALL_LIST_ELEMENTS(red_list
, node
, nnode
, red
))
628 ospf_redistribute_unset(ospf
, i
, red
->instance
);
630 ospf_redistribute_default_unset(ospf
);
632 for (ALL_LIST_ELEMENTS(ospf
->areas
, node
, nnode
, area
))
633 ospf_remove_vls_through_area(ospf
, area
);
635 for (ALL_LIST_ELEMENTS(ospf
->vlinks
, node
, nnode
, vl_data
))
636 ospf_vl_delete(ospf
, vl_data
);
638 list_delete(&ospf
->vlinks
);
640 /* Remove any ospf interface config params */
641 FOR_ALL_INTERFACES (vrf
, ifp
) {
642 struct ospf_if_params
*params
;
644 params
= IF_DEF_PARAMS(ifp
);
645 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
))
646 UNSET_IF_PARAM(params
, if_area
);
649 /* Reset interface. */
650 for (ALL_LIST_ELEMENTS(ospf
->oiflist
, node
, nnode
, oi
))
652 list_delete(&ospf
->oiflist
);
654 /* De-Register VRF */
655 ospf_zebra_vrf_deregister(ospf
);
657 /* Clear static neighbors */
658 for (rn
= route_top(ospf
->nbr_nbma
); rn
; rn
= route_next(rn
))
659 if ((nbr_nbma
= rn
->info
)) {
660 OSPF_POLL_TIMER_OFF(nbr_nbma
->t_poll
);
663 nbr_nbma
->nbr
->nbr_nbma
= NULL
;
664 nbr_nbma
->nbr
= NULL
;
668 listnode_delete(nbr_nbma
->oi
->nbr_nbma
,
673 XFREE(MTYPE_OSPF_NEIGHBOR_STATIC
, nbr_nbma
);
676 route_table_finish(ospf
->nbr_nbma
);
678 /* Clear networks and Areas. */
679 for (rn
= route_top(ospf
->networks
); rn
; rn
= route_next(rn
)) {
680 struct ospf_network
*network
;
682 if ((network
= rn
->info
) != NULL
) {
683 ospf_network_free(ospf
, network
);
685 route_unlock_node(rn
);
688 route_table_finish(ospf
->networks
);
690 for (ALL_LIST_ELEMENTS(ospf
->areas
, node
, nnode
, area
)) {
691 listnode_delete(ospf
->areas
, area
);
692 ospf_area_free(area
);
695 /* Cancel all timers. */
696 OSPF_TIMER_OFF(ospf
->t_external_lsa
);
697 OSPF_TIMER_OFF(ospf
->t_spf_calc
);
698 OSPF_TIMER_OFF(ospf
->t_ase_calc
);
699 OSPF_TIMER_OFF(ospf
->t_maxage
);
700 OSPF_TIMER_OFF(ospf
->t_maxage_walker
);
701 OSPF_TIMER_OFF(ospf
->t_abr_task
);
702 OSPF_TIMER_OFF(ospf
->t_asbr_check
);
703 OSPF_TIMER_OFF(ospf
->t_distribute_update
);
704 OSPF_TIMER_OFF(ospf
->t_lsa_refresher
);
705 OSPF_TIMER_OFF(ospf
->t_read
);
706 OSPF_TIMER_OFF(ospf
->t_write
);
707 OSPF_TIMER_OFF(ospf
->t_opaque_lsa_self
);
708 OSPF_TIMER_OFF(ospf
->t_sr_update
);
711 stream_free(ospf
->ibuf
);
713 LSDB_LOOP (OPAQUE_AS_LSDB(ospf
), rn
, lsa
)
714 ospf_discard_from_db(ospf
, ospf
->lsdb
, lsa
);
715 LSDB_LOOP (EXTERNAL_LSDB(ospf
), rn
, lsa
)
716 ospf_discard_from_db(ospf
, ospf
->lsdb
, lsa
);
718 ospf_lsdb_delete_all(ospf
->lsdb
);
719 ospf_lsdb_free(ospf
->lsdb
);
721 for (rn
= route_top(ospf
->maxage_lsa
); rn
; rn
= route_next(rn
)) {
722 if ((lsa
= rn
->info
) != NULL
) {
723 ospf_lsa_unlock(&lsa
);
726 route_unlock_node(rn
);
728 route_table_finish(ospf
->maxage_lsa
);
731 ospf_route_table_free(ospf
->old_table
);
732 if (ospf
->new_table
) {
733 ospf_route_delete(ospf
, ospf
->new_table
);
734 ospf_route_table_free(ospf
->new_table
);
737 ospf_rtrs_free(ospf
->old_rtrs
);
739 ospf_rtrs_free(ospf
->new_rtrs
);
740 if (ospf
->new_external_route
) {
741 ospf_route_delete(ospf
, ospf
->new_external_route
);
742 ospf_route_table_free(ospf
->new_external_route
);
744 if (ospf
->old_external_route
) {
745 ospf_route_delete(ospf
, ospf
->old_external_route
);
746 ospf_route_table_free(ospf
->old_external_route
);
748 if (ospf
->external_lsas
) {
749 ospf_ase_external_lsas_finish(ospf
->external_lsas
);
752 list_delete(&ospf
->areas
);
753 list_delete(&ospf
->oi_write_q
);
755 for (i
= ZEBRA_ROUTE_SYSTEM
; i
<= ZEBRA_ROUTE_MAX
; i
++) {
756 struct list
*ext_list
;
757 struct ospf_external
*ext
;
759 ext_list
= ospf
->external
[i
];
763 for (ALL_LIST_ELEMENTS_RO(ext_list
, node
, ext
)) {
764 if (ext
->external_info
)
765 for (rn
= route_top(ext
->external_info
); rn
;
766 rn
= route_next(rn
)) {
767 if (rn
->info
== NULL
)
770 XFREE(MTYPE_OSPF_EXTERNAL_INFO
,
773 route_unlock_node(rn
);
778 ospf_distance_reset(ospf
);
779 route_table_finish(ospf
->distance_table
);
781 if (!CHECK_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
))
782 instance
= ospf
->instance
;
787 vrf
= vrf_lookup_by_name(ospf
->name
);
789 ospf_vrf_unlink(ospf
, vrf
);
790 XFREE(MTYPE_OSPF_TOP
, ospf
->name
);
792 vrf
= vrf_lookup_by_id(VRF_DEFAULT
);
794 ospf_vrf_unlink(ospf
, vrf
);
797 XFREE(MTYPE_OSPF_TOP
, ospf
);
799 if (!CHECK_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
))
800 ospf_get_instance(instance
);
804 /* allocate new OSPF Area object */
805 static struct ospf_area
*ospf_area_new(struct ospf
*ospf
,
806 struct in_addr area_id
)
808 struct ospf_area
*new;
810 /* Allocate new config_network. */
811 new = XCALLOC(MTYPE_OSPF_AREA
, sizeof(struct ospf_area
));
815 new->area_id
= area_id
;
816 new->area_id_fmt
= OSPF_AREA_ID_FMT_DOTTEDQUAD
;
818 new->external_routing
= OSPF_AREA_DEFAULT
;
819 new->default_cost
= 1;
820 new->auth_type
= OSPF_AUTH_NULL
;
823 new->lsdb
= ospf_lsdb_new();
825 /* Self-originated LSAs initialize. */
826 new->router_lsa_self
= NULL
;
828 ospf_opaque_type10_lsa_init(new);
830 new->oiflist
= list_new();
831 new->ranges
= route_table_init();
833 if (area_id
.s_addr
== OSPF_AREA_BACKBONE
)
834 ospf
->backbone
= new;
839 static void ospf_area_free(struct ospf_area
*area
)
841 struct route_node
*rn
;
842 struct ospf_lsa
*lsa
;
844 ospf_opaque_type10_lsa_term(area
);
847 LSDB_LOOP (ROUTER_LSDB(area
), rn
, lsa
)
848 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
849 LSDB_LOOP (NETWORK_LSDB(area
), rn
, lsa
)
850 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
851 LSDB_LOOP (SUMMARY_LSDB(area
), rn
, lsa
)
852 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
853 LSDB_LOOP (ASBR_SUMMARY_LSDB(area
), rn
, lsa
)
854 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
856 LSDB_LOOP (NSSA_LSDB(area
), rn
, lsa
)
857 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
858 LSDB_LOOP (OPAQUE_AREA_LSDB(area
), rn
, lsa
)
859 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
860 LSDB_LOOP (OPAQUE_LINK_LSDB(area
), rn
, lsa
)
861 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
863 ospf_lsdb_delete_all(area
->lsdb
);
864 ospf_lsdb_free(area
->lsdb
);
866 ospf_lsa_unlock(&area
->router_lsa_self
);
868 route_table_finish(area
->ranges
);
869 list_delete(&area
->oiflist
);
871 if (EXPORT_NAME(area
))
872 free(EXPORT_NAME(area
));
874 if (IMPORT_NAME(area
))
875 free(IMPORT_NAME(area
));
878 OSPF_TIMER_OFF(area
->t_stub_router
);
879 OSPF_TIMER_OFF(area
->t_opaque_lsa_self
);
881 if (OSPF_IS_AREA_BACKBONE(area
))
882 area
->ospf
->backbone
= NULL
;
884 XFREE(MTYPE_OSPF_AREA
, area
);
887 void ospf_area_check_free(struct ospf
*ospf
, struct in_addr area_id
)
889 struct ospf_area
*area
;
891 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
892 if (area
&& listcount(area
->oiflist
) == 0 && area
->ranges
->top
== NULL
893 && !ospf_vl_count(ospf
, area
)
894 && area
->shortcut_configured
== OSPF_SHORTCUT_DEFAULT
895 && area
->external_routing
== OSPF_AREA_DEFAULT
896 && area
->no_summary
== 0 && area
->default_cost
== 1
897 && EXPORT_NAME(area
) == NULL
&& IMPORT_NAME(area
) == NULL
898 && area
->auth_type
== OSPF_AUTH_NULL
) {
899 listnode_delete(ospf
->areas
, area
);
900 ospf_area_free(area
);
904 struct ospf_area
*ospf_area_get(struct ospf
*ospf
, struct in_addr area_id
)
906 struct ospf_area
*area
;
908 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
910 area
= ospf_area_new(ospf
, area_id
);
911 listnode_add_sort(ospf
->areas
, area
);
912 ospf_check_abr_status(ospf
);
913 if (ospf
->stub_router_admin_set
914 == OSPF_STUB_ROUTER_ADMINISTRATIVE_SET
) {
915 SET_FLAG(area
->stub_router_state
,
916 OSPF_AREA_ADMIN_STUB_ROUTED
);
923 struct ospf_area
*ospf_area_lookup_by_area_id(struct ospf
*ospf
,
924 struct in_addr area_id
)
926 struct ospf_area
*area
;
927 struct listnode
*node
;
929 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
))
930 if (IPV4_ADDR_SAME(&area
->area_id
, &area_id
))
936 void ospf_area_add_if(struct ospf_area
*area
, struct ospf_interface
*oi
)
938 listnode_add(area
->oiflist
, oi
);
941 void ospf_area_del_if(struct ospf_area
*area
, struct ospf_interface
*oi
)
943 listnode_delete(area
->oiflist
, oi
);
947 static void add_ospf_interface(struct connected
*co
, struct ospf_area
*area
)
949 struct ospf_interface
*oi
;
951 oi
= ospf_if_new(area
->ospf
, co
->ifp
, co
->address
);
956 oi
->params
= ospf_lookup_if_params(co
->ifp
, oi
->address
->u
.prefix4
);
957 oi
->output_cost
= ospf_if_get_output_cost(oi
);
959 /* Relate ospf interface to ospf instance. */
960 oi
->ospf
= area
->ospf
;
962 /* update network type as interface flag */
963 /* If network type is specified previously,
964 skip network type setting. */
965 oi
->type
= IF_DEF_PARAMS(co
->ifp
)->type
;
967 /* Add pseudo neighbor. */
968 ospf_nbr_self_reset(oi
, oi
->ospf
->router_id
);
970 ospf_area_add_if(oi
->area
, oi
);
973 * if router_id is not configured, dont bring up
975 * ospf_router_id_update() will call ospf_if_update
976 * whenever r-id is configured instead.
978 if ((area
->ospf
->router_id
.s_addr
!= 0) && if_is_operative(co
->ifp
))
982 static void update_redistributed(struct ospf
*ospf
, int add_to_ospf
)
984 struct route_node
*rn
;
985 struct external_info
*ei
;
986 struct ospf_external
*ext
;
988 if (ospf_is_type_redistributed(ospf
, ZEBRA_ROUTE_CONNECT
, 0)) {
989 ext
= ospf_external_lookup(ospf
, ZEBRA_ROUTE_CONNECT
, 0);
990 if ((ext
) && EXTERNAL_INFO(ext
)) {
991 for (rn
= route_top(EXTERNAL_INFO(ext
)); rn
;
992 rn
= route_next(rn
)) {
998 if (ospf_external_info_find_lsa(ospf
,
1000 if (!ospf_distribute_check_connected(
1002 ospf_external_lsa_flush(
1005 ei
->ifindex
/*, ei->nexthop */);
1007 if (!ospf_external_info_find_lsa(
1009 if (ospf_distribute_check_connected(
1011 ospf_external_lsa_originate(
1019 /* Config network statement related functions. */
1020 static struct ospf_network
*ospf_network_new(struct in_addr area_id
)
1022 struct ospf_network
*new;
1023 new = XCALLOC(MTYPE_OSPF_NETWORK
, sizeof(struct ospf_network
));
1025 new->area_id
= area_id
;
1026 new->area_id_fmt
= OSPF_AREA_ID_FMT_DOTTEDQUAD
;
1031 static void ospf_network_free(struct ospf
*ospf
, struct ospf_network
*network
)
1033 ospf_area_check_free(ospf
, network
->area_id
);
1034 ospf_schedule_abr_task(ospf
);
1035 XFREE(MTYPE_OSPF_NETWORK
, network
);
1038 int ospf_network_set(struct ospf
*ospf
, struct prefix_ipv4
*p
,
1039 struct in_addr area_id
, int df
)
1041 struct ospf_network
*network
;
1042 struct ospf_area
*area
;
1043 struct route_node
*rn
;
1045 rn
= route_node_get(ospf
->networks
, (struct prefix
*)p
);
1048 route_unlock_node(rn
);
1050 if (IPV4_ADDR_SAME(&area_id
, &network
->area_id
)) {
1053 /* There is already same network statement. */
1058 rn
->info
= network
= ospf_network_new(area_id
);
1059 network
->area_id_fmt
= df
;
1060 area
= ospf_area_get(ospf
, area_id
);
1061 ospf_area_display_format_set(ospf
, area
, df
);
1063 /* Run network config now. */
1064 ospf_network_run((struct prefix
*)p
, area
);
1066 /* Update connected redistribute. */
1067 update_redistributed(ospf
, 1); /* interfaces possibly added */
1069 ospf_area_check_free(ospf
, area_id
);
1074 int ospf_network_unset(struct ospf
*ospf
, struct prefix_ipv4
*p
,
1075 struct in_addr area_id
)
1077 struct route_node
*rn
;
1078 struct ospf_network
*network
;
1079 struct listnode
*node
, *nnode
;
1080 struct ospf_interface
*oi
;
1082 rn
= route_node_lookup(ospf
->networks
, (struct prefix
*)p
);
1087 route_unlock_node(rn
);
1088 if (!IPV4_ADDR_SAME(&area_id
, &network
->area_id
))
1091 ospf_network_free(ospf
, rn
->info
);
1093 route_unlock_node(rn
); /* initial reference */
1095 /* Find interfaces that are not configured already. */
1096 for (ALL_LIST_ELEMENTS(ospf
->oiflist
, node
, nnode
, oi
)) {
1098 if (oi
->type
== OSPF_IFTYPE_VIRTUALLINK
)
1101 ospf_network_run_subnet(ospf
, oi
->connected
, NULL
, NULL
);
1104 /* Update connected redistribute. */
1105 update_redistributed(ospf
, 0); /* interfaces possibly removed */
1106 ospf_area_check_free(ospf
, area_id
);
1111 /* Ensure there's an OSPF instance, as "ip ospf area" enabled OSPF means
1112 * there might not be any 'router ospf' config.
1114 * Otherwise, doesn't do anything different to ospf_if_update for now
1116 void ospf_interface_area_set(struct ospf
*ospf
, struct interface
*ifp
)
1121 ospf_if_update(ospf
, ifp
);
1122 /* if_update does a update_redistributed */
1127 void ospf_interface_area_unset(struct ospf
*ospf
, struct interface
*ifp
)
1129 struct route_node
*rn_oi
;
1132 return; /* Ospf not ready yet */
1134 /* Find interfaces that may need to be removed. */
1135 for (rn_oi
= route_top(IF_OIFS(ifp
)); rn_oi
;
1136 rn_oi
= route_next(rn_oi
)) {
1137 struct ospf_interface
*oi
= NULL
;
1139 if ((oi
= rn_oi
->info
) == NULL
)
1142 if (oi
->type
== OSPF_IFTYPE_VIRTUALLINK
)
1145 ospf_network_run_subnet(ospf
, oi
->connected
, NULL
, NULL
);
1148 /* Update connected redistribute. */
1149 update_redistributed(ospf
, 0); /* interfaces possibly removed */
1152 bool ospf_interface_area_is_already_set(struct ospf
*ospf
,
1153 struct interface
*ifp
)
1155 struct route_node
*rn_oi
;
1158 return false; /* Ospf not ready yet */
1160 /* Find interfaces that may need to be removed. */
1161 for (rn_oi
= route_top(IF_OIFS(ifp
)); rn_oi
;
1162 rn_oi
= route_next(rn_oi
)) {
1163 struct ospf_interface
*oi
= rn_oi
->info
;
1168 if (oi
->type
== OSPF_IFTYPE_VIRTUALLINK
)
1170 /* at least one route covered by interface
1171 * that implies already done
1178 /* Check whether interface matches given network
1179 * returns: 1, true. 0, false
1181 static int ospf_network_match_iface(const struct connected
*co
,
1182 const struct prefix
*net
)
1184 /* new approach: more elegant and conceptually clean */
1185 return prefix_match_network_statement(net
, CONNECTED_PREFIX(co
));
1188 static void ospf_update_interface_area(struct connected
*co
,
1189 struct ospf_area
*area
)
1191 struct ospf_interface
*oi
= ospf_if_table_lookup(co
->ifp
, co
->address
);
1193 /* nothing to be done case */
1194 if (oi
&& oi
->area
== area
) {
1201 add_ospf_interface(co
, area
);
1204 /* Run OSPF for the given subnet, taking into account the following
1205 * possible sources of area configuration, in the given order of preference:
1207 * - Whether there is interface+address specific area configuration
1208 * - Whether there is a default area for the interface
1209 * - Whether there is an area given as a parameter.
1210 * - If no specific network prefix/area is supplied, whether there's
1211 * a matching network configured.
1213 static void ospf_network_run_subnet(struct ospf
*ospf
, struct connected
*co
,
1215 struct ospf_area
*given_area
)
1217 struct ospf_interface
*oi
;
1218 struct ospf_if_params
*params
;
1219 struct ospf_area
*area
= NULL
;
1220 struct route_node
*rn
;
1223 if (CHECK_FLAG(co
->flags
, ZEBRA_IFA_SECONDARY
))
1226 if (co
->address
->family
!= AF_INET
)
1229 /* Try determine the appropriate area for this interface + address
1230 * Start by checking interface config
1232 params
= ospf_lookup_if_params(co
->ifp
, co
->address
->u
.prefix4
);
1233 if (params
&& OSPF_IF_PARAM_CONFIGURED(params
, if_area
))
1234 area
= ospf_area_get(ospf
, params
->if_area
);
1236 params
= IF_DEF_PARAMS(co
->ifp
);
1237 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
))
1238 area
= ospf_area_get(ospf
, params
->if_area
);
1241 /* If we've found an interface and/or addr specific area, then we're
1245 ospf_update_interface_area(co
, area
);
1249 /* Otherwise, only remaining possibility is a matching network statement
1252 assert(given_area
!= NULL
);
1254 /* Which either was supplied as a parameter.. (e.g. cause a new
1255 * network/area was just added)..
1257 if (p
->family
== co
->address
->family
1258 && ospf_network_match_iface(co
, p
))
1259 ospf_update_interface_area(co
, given_area
);
1264 /* Else we have to search the existing network/area config to see
1267 for (rn
= route_top(ospf
->networks
); rn
; rn
= route_next(rn
))
1268 if (rn
->info
!= NULL
&& ospf_network_match_iface(co
, &rn
->p
)) {
1269 struct ospf_network
*network
=
1270 (struct ospf_network
*)rn
->info
;
1271 area
= ospf_area_get(ospf
, network
->area_id
);
1272 ospf_update_interface_area(co
, area
);
1276 /* If the subnet isn't in any area, deconfigure */
1277 if (!configed
&& (oi
= ospf_if_table_lookup(co
->ifp
, co
->address
)))
1281 static void ospf_network_run_interface(struct ospf
*ospf
, struct interface
*ifp
,
1283 struct ospf_area
*given_area
)
1285 struct listnode
*cnode
;
1286 struct connected
*co
;
1288 if (memcmp(ifp
->name
, "VLINK", 5) == 0)
1291 /* Network prefix without area is nonsensical */
1293 assert(given_area
!= NULL
);
1295 /* if interface prefix is match specified prefix,
1296 then create socket and join multicast group. */
1297 for (ALL_LIST_ELEMENTS_RO(ifp
->connected
, cnode
, co
))
1298 ospf_network_run_subnet(ospf
, co
, p
, given_area
);
1301 static void ospf_network_run(struct prefix
*p
, struct ospf_area
*area
)
1303 struct vrf
*vrf
= vrf_lookup_by_id(area
->ospf
->vrf_id
);
1304 struct interface
*ifp
;
1306 /* Schedule Router ID Update. */
1307 if (area
->ospf
->router_id
.s_addr
== 0)
1308 ospf_router_id_update(area
->ospf
);
1310 /* Get target interface. */
1311 FOR_ALL_INTERFACES (vrf
, ifp
)
1312 ospf_network_run_interface(area
->ospf
, ifp
, p
, area
);
1315 void ospf_ls_upd_queue_empty(struct ospf_interface
*oi
)
1317 struct route_node
*rn
;
1318 struct listnode
*node
, *nnode
;
1320 struct ospf_lsa
*lsa
;
1322 /* empty ls update queue */
1323 for (rn
= route_top(oi
->ls_upd_queue
); rn
; rn
= route_next(rn
))
1324 if ((lst
= (struct list
*)rn
->info
)) {
1325 for (ALL_LIST_ELEMENTS(lst
, node
, nnode
, lsa
))
1326 ospf_lsa_unlock(&lsa
); /* oi->ls_upd_queue */
1331 /* remove update event */
1332 if (oi
->t_ls_upd_event
) {
1333 thread_cancel(oi
->t_ls_upd_event
);
1334 oi
->t_ls_upd_event
= NULL
;
1338 void ospf_if_update(struct ospf
*ospf
, struct interface
*ifp
)
1344 if (IS_DEBUG_OSPF_EVENT
)
1346 "%s: interface %s ifp->vrf_id %u ospf vrf %s vrf_id %u router_id %s",
1347 __PRETTY_FUNCTION__
, ifp
->name
, ifp
->vrf_id
,
1348 ospf_vrf_id_to_name(ospf
->vrf_id
), ospf
->vrf_id
,
1349 inet_ntoa(ospf
->router_id
));
1351 /* OSPF must be ready. */
1352 if (!ospf_is_ready(ospf
))
1355 ospf_network_run_interface(ospf
, ifp
, NULL
, NULL
);
1357 /* Update connected redistribute. */
1358 update_redistributed(ospf
, 1);
1361 void ospf_remove_vls_through_area(struct ospf
*ospf
, struct ospf_area
*area
)
1363 struct listnode
*node
, *nnode
;
1364 struct ospf_vl_data
*vl_data
;
1366 for (ALL_LIST_ELEMENTS(ospf
->vlinks
, node
, nnode
, vl_data
))
1367 if (IPV4_ADDR_SAME(&vl_data
->vl_area_id
, &area
->area_id
))
1368 ospf_vl_delete(ospf
, vl_data
);
1372 static const struct message ospf_area_type_msg
[] = {
1373 {OSPF_AREA_DEFAULT
, "Default"},
1374 {OSPF_AREA_STUB
, "Stub"},
1375 {OSPF_AREA_NSSA
, "NSSA"},
1378 static void ospf_area_type_set(struct ospf_area
*area
, int type
)
1380 struct listnode
*node
;
1381 struct ospf_interface
*oi
;
1383 if (area
->external_routing
== type
) {
1384 if (IS_DEBUG_OSPF_EVENT
)
1385 zlog_debug("Area[%s]: Types are the same, ignored.",
1386 inet_ntoa(area
->area_id
));
1390 area
->external_routing
= type
;
1392 if (IS_DEBUG_OSPF_EVENT
)
1393 zlog_debug("Area[%s]: Configured as %s",
1394 inet_ntoa(area
->area_id
),
1395 lookup_msg(ospf_area_type_msg
, type
, NULL
));
1397 switch (area
->external_routing
) {
1398 case OSPF_AREA_DEFAULT
:
1399 for (ALL_LIST_ELEMENTS_RO(area
->oiflist
, node
, oi
))
1400 if (oi
->nbr_self
!= NULL
) {
1401 UNSET_FLAG(oi
->nbr_self
->options
,
1403 SET_FLAG(oi
->nbr_self
->options
, OSPF_OPTION_E
);
1406 case OSPF_AREA_STUB
:
1407 for (ALL_LIST_ELEMENTS_RO(area
->oiflist
, node
, oi
))
1408 if (oi
->nbr_self
!= NULL
) {
1409 if (IS_DEBUG_OSPF_EVENT
)
1411 "setting options on %s accordingly",
1413 UNSET_FLAG(oi
->nbr_self
->options
,
1415 UNSET_FLAG(oi
->nbr_self
->options
,
1417 if (IS_DEBUG_OSPF_EVENT
)
1418 zlog_debug("options set on %s: %x",
1419 IF_NAME(oi
), OPTIONS(oi
));
1422 case OSPF_AREA_NSSA
:
1423 for (ALL_LIST_ELEMENTS_RO(area
->oiflist
, node
, oi
))
1424 if (oi
->nbr_self
!= NULL
) {
1426 "setting nssa options on %s accordingly",
1428 UNSET_FLAG(oi
->nbr_self
->options
,
1430 SET_FLAG(oi
->nbr_self
->options
, OSPF_OPTION_NP
);
1431 zlog_debug("options set on %s: %x", IF_NAME(oi
),
1439 ospf_router_lsa_update_area(area
);
1440 ospf_schedule_abr_task(area
->ospf
);
1443 int ospf_area_shortcut_set(struct ospf
*ospf
, struct ospf_area
*area
, int mode
)
1445 if (area
->shortcut_configured
== mode
)
1448 area
->shortcut_configured
= mode
;
1449 ospf_router_lsa_update_area(area
);
1450 ospf_schedule_abr_task(ospf
);
1452 ospf_area_check_free(ospf
, area
->area_id
);
1457 int ospf_area_shortcut_unset(struct ospf
*ospf
, struct ospf_area
*area
)
1459 area
->shortcut_configured
= OSPF_SHORTCUT_DEFAULT
;
1460 ospf_router_lsa_update_area(area
);
1461 ospf_area_check_free(ospf
, area
->area_id
);
1462 ospf_schedule_abr_task(ospf
);
1467 static int ospf_area_vlink_count(struct ospf
*ospf
, struct ospf_area
*area
)
1469 struct ospf_vl_data
*vl
;
1470 struct listnode
*node
;
1473 for (ALL_LIST_ELEMENTS_RO(ospf
->vlinks
, node
, vl
))
1474 if (IPV4_ADDR_SAME(&vl
->vl_area_id
, &area
->area_id
))
1480 int ospf_area_display_format_set(struct ospf
*ospf
, struct ospf_area
*area
,
1483 area
->area_id_fmt
= df
;
1488 int ospf_area_stub_set(struct ospf
*ospf
, struct in_addr area_id
)
1490 struct ospf_area
*area
;
1492 area
= ospf_area_get(ospf
, area_id
);
1493 if (ospf_area_vlink_count(ospf
, area
))
1496 if (area
->external_routing
!= OSPF_AREA_STUB
)
1497 ospf_area_type_set(area
, OSPF_AREA_STUB
);
1502 int ospf_area_stub_unset(struct ospf
*ospf
, struct in_addr area_id
)
1504 struct ospf_area
*area
;
1506 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1510 if (area
->external_routing
== OSPF_AREA_STUB
)
1511 ospf_area_type_set(area
, OSPF_AREA_DEFAULT
);
1513 ospf_area_check_free(ospf
, area_id
);
1518 int ospf_area_no_summary_set(struct ospf
*ospf
, struct in_addr area_id
)
1520 struct ospf_area
*area
;
1522 area
= ospf_area_get(ospf
, area_id
);
1523 area
->no_summary
= 1;
1528 int ospf_area_no_summary_unset(struct ospf
*ospf
, struct in_addr area_id
)
1530 struct ospf_area
*area
;
1532 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1536 area
->no_summary
= 0;
1537 ospf_area_check_free(ospf
, area_id
);
1542 int ospf_area_nssa_no_summary_set(struct ospf
*ospf
, struct in_addr area_id
)
1544 struct ospf_area
*area
;
1546 area
= ospf_area_get(ospf
, area_id
);
1547 if (ospf_area_vlink_count(ospf
, area
))
1550 if (area
->external_routing
!= OSPF_AREA_NSSA
) {
1551 ospf_area_type_set(area
, OSPF_AREA_NSSA
);
1553 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1556 ospf_area_no_summary_set(ospf
, area_id
);
1561 int ospf_area_nssa_set(struct ospf
*ospf
, struct in_addr area_id
)
1563 struct ospf_area
*area
;
1565 area
= ospf_area_get(ospf
, area_id
);
1566 if (ospf_area_vlink_count(ospf
, area
))
1569 if (area
->external_routing
!= OSPF_AREA_NSSA
) {
1570 ospf_area_type_set(area
, OSPF_AREA_NSSA
);
1573 /* set NSSA area defaults */
1574 area
->no_summary
= 0;
1575 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1576 area
->NSSATranslatorState
= OSPF_NSSA_TRANSLATE_DISABLED
;
1577 area
->NSSATranslatorStabilityInterval
=
1578 OSPF_NSSA_TRANS_STABLE_DEFAULT
;
1583 int ospf_area_nssa_unset(struct ospf
*ospf
, struct in_addr area_id
, int argc
)
1585 struct ospf_area
*area
;
1587 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1591 /* argc < 5 -> 'no area x nssa' */
1592 if (argc
< 5 && area
->external_routing
== OSPF_AREA_NSSA
) {
1594 /* set NSSA area defaults */
1595 area
->no_summary
= 0;
1596 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1597 area
->NSSATranslatorState
= OSPF_NSSA_TRANSLATE_DISABLED
;
1598 area
->NSSATranslatorStabilityInterval
=
1599 OSPF_NSSA_TRANS_STABLE_DEFAULT
;
1600 ospf_area_type_set(area
, OSPF_AREA_DEFAULT
);
1602 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1605 ospf_area_check_free(ospf
, area_id
);
1610 int ospf_area_nssa_translator_role_set(struct ospf
*ospf
,
1611 struct in_addr area_id
, int role
)
1613 struct ospf_area
*area
;
1615 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1619 area
->NSSATranslatorRole
= role
;
1625 /* XXX: unused? Leave for symmetry? */
1627 ospf_area_nssa_translator_role_unset (struct ospf
*ospf
,
1628 struct in_addr area_id
)
1630 struct ospf_area
*area
;
1632 area
= ospf_area_lookup_by_area_id (ospf
, area_id
);
1636 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1638 ospf_area_check_free (ospf
, area_id
);
1644 int ospf_area_export_list_set(struct ospf
*ospf
, struct ospf_area
*area
,
1645 const char *list_name
)
1647 struct access_list
*list
;
1648 list
= access_list_lookup(AFI_IP
, list_name
);
1650 EXPORT_LIST(area
) = list
;
1652 if (EXPORT_NAME(area
))
1653 free(EXPORT_NAME(area
));
1655 EXPORT_NAME(area
) = strdup(list_name
);
1656 ospf_schedule_abr_task(ospf
);
1661 int ospf_area_export_list_unset(struct ospf
*ospf
, struct ospf_area
*area
)
1664 EXPORT_LIST(area
) = 0;
1666 if (EXPORT_NAME(area
))
1667 free(EXPORT_NAME(area
));
1669 EXPORT_NAME(area
) = NULL
;
1671 ospf_area_check_free(ospf
, area
->area_id
);
1673 ospf_schedule_abr_task(ospf
);
1678 int ospf_area_import_list_set(struct ospf
*ospf
, struct ospf_area
*area
,
1681 struct access_list
*list
;
1682 list
= access_list_lookup(AFI_IP
, name
);
1684 IMPORT_LIST(area
) = list
;
1686 if (IMPORT_NAME(area
))
1687 free(IMPORT_NAME(area
));
1689 IMPORT_NAME(area
) = strdup(name
);
1690 ospf_schedule_abr_task(ospf
);
1695 int ospf_area_import_list_unset(struct ospf
*ospf
, struct ospf_area
*area
)
1697 IMPORT_LIST(area
) = 0;
1699 if (IMPORT_NAME(area
))
1700 free(IMPORT_NAME(area
));
1702 IMPORT_NAME(area
) = NULL
;
1703 ospf_area_check_free(ospf
, area
->area_id
);
1705 ospf_schedule_abr_task(ospf
);
1710 int ospf_timers_refresh_set(struct ospf
*ospf
, int interval
)
1714 if (ospf
->lsa_refresh_interval
== interval
)
1717 time_left
= ospf
->lsa_refresh_interval
1718 - (monotime(NULL
) - ospf
->lsa_refresher_started
);
1720 if (time_left
> interval
) {
1721 OSPF_TIMER_OFF(ospf
->t_lsa_refresher
);
1722 thread_add_timer(master
, ospf_lsa_refresh_walker
, ospf
,
1723 interval
, &ospf
->t_lsa_refresher
);
1725 ospf
->lsa_refresh_interval
= interval
;
1730 int ospf_timers_refresh_unset(struct ospf
*ospf
)
1734 time_left
= ospf
->lsa_refresh_interval
1735 - (monotime(NULL
) - ospf
->lsa_refresher_started
);
1737 if (time_left
> OSPF_LSA_REFRESH_INTERVAL_DEFAULT
) {
1738 OSPF_TIMER_OFF(ospf
->t_lsa_refresher
);
1739 ospf
->t_lsa_refresher
= NULL
;
1740 thread_add_timer(master
, ospf_lsa_refresh_walker
, ospf
,
1741 OSPF_LSA_REFRESH_INTERVAL_DEFAULT
,
1742 &ospf
->t_lsa_refresher
);
1745 ospf
->lsa_refresh_interval
= OSPF_LSA_REFRESH_INTERVAL_DEFAULT
;
1751 static struct ospf_nbr_nbma
*ospf_nbr_nbma_new(void)
1753 struct ospf_nbr_nbma
*nbr_nbma
;
1755 nbr_nbma
= XCALLOC(MTYPE_OSPF_NEIGHBOR_STATIC
,
1756 sizeof(struct ospf_nbr_nbma
));
1758 nbr_nbma
->priority
= OSPF_NEIGHBOR_PRIORITY_DEFAULT
;
1759 nbr_nbma
->v_poll
= OSPF_POLL_INTERVAL_DEFAULT
;
1764 static void ospf_nbr_nbma_free(struct ospf_nbr_nbma
*nbr_nbma
)
1766 XFREE(MTYPE_OSPF_NEIGHBOR_STATIC
, nbr_nbma
);
1769 static void ospf_nbr_nbma_delete(struct ospf
*ospf
,
1770 struct ospf_nbr_nbma
*nbr_nbma
)
1772 struct route_node
*rn
;
1773 struct prefix_ipv4 p
;
1776 p
.prefix
= nbr_nbma
->addr
;
1777 p
.prefixlen
= IPV4_MAX_BITLEN
;
1779 rn
= route_node_lookup(ospf
->nbr_nbma
, (struct prefix
*)&p
);
1781 ospf_nbr_nbma_free(rn
->info
);
1783 route_unlock_node(rn
);
1784 route_unlock_node(rn
);
1788 static void ospf_nbr_nbma_down(struct ospf_nbr_nbma
*nbr_nbma
)
1790 OSPF_TIMER_OFF(nbr_nbma
->t_poll
);
1792 if (nbr_nbma
->nbr
) {
1793 nbr_nbma
->nbr
->nbr_nbma
= NULL
;
1794 OSPF_NSM_EVENT_EXECUTE(nbr_nbma
->nbr
, NSM_KillNbr
);
1798 listnode_delete(nbr_nbma
->oi
->nbr_nbma
, nbr_nbma
);
1801 static void ospf_nbr_nbma_add(struct ospf_nbr_nbma
*nbr_nbma
,
1802 struct ospf_interface
*oi
)
1804 struct ospf_neighbor
*nbr
;
1805 struct route_node
*rn
;
1808 if (oi
->type
!= OSPF_IFTYPE_NBMA
)
1811 if (nbr_nbma
->nbr
!= NULL
)
1814 if (IPV4_ADDR_SAME(&oi
->nbr_self
->address
.u
.prefix4
, &nbr_nbma
->addr
))
1818 listnode_add(oi
->nbr_nbma
, nbr_nbma
);
1820 /* Get neighbor information from table. */
1822 p
.prefixlen
= IPV4_MAX_BITLEN
;
1823 p
.u
.prefix4
= nbr_nbma
->addr
;
1825 rn
= route_node_get(oi
->nbrs
, (struct prefix
*)&p
);
1828 nbr
->nbr_nbma
= nbr_nbma
;
1829 nbr_nbma
->nbr
= nbr
;
1831 route_unlock_node(rn
);
1833 nbr
= rn
->info
= ospf_nbr_new(oi
);
1834 nbr
->state
= NSM_Down
;
1835 nbr
->src
= nbr_nbma
->addr
;
1836 nbr
->nbr_nbma
= nbr_nbma
;
1837 nbr
->priority
= nbr_nbma
->priority
;
1840 nbr_nbma
->nbr
= nbr
;
1842 OSPF_NSM_EVENT_EXECUTE(nbr
, NSM_Start
);
1846 void ospf_nbr_nbma_if_update(struct ospf
*ospf
, struct ospf_interface
*oi
)
1848 struct ospf_nbr_nbma
*nbr_nbma
;
1849 struct route_node
*rn
;
1850 struct prefix_ipv4 p
;
1852 if (oi
->type
!= OSPF_IFTYPE_NBMA
)
1855 for (rn
= route_top(ospf
->nbr_nbma
); rn
; rn
= route_next(rn
))
1856 if ((nbr_nbma
= rn
->info
))
1857 if (nbr_nbma
->oi
== NULL
&& nbr_nbma
->nbr
== NULL
) {
1859 p
.prefix
= nbr_nbma
->addr
;
1860 p
.prefixlen
= IPV4_MAX_BITLEN
;
1862 if (prefix_match(oi
->address
,
1863 (struct prefix
*)&p
))
1864 ospf_nbr_nbma_add(nbr_nbma
, oi
);
1868 struct ospf_nbr_nbma
*ospf_nbr_nbma_lookup(struct ospf
*ospf
,
1869 struct in_addr nbr_addr
)
1871 struct route_node
*rn
;
1872 struct prefix_ipv4 p
;
1875 p
.prefix
= nbr_addr
;
1876 p
.prefixlen
= IPV4_MAX_BITLEN
;
1878 rn
= route_node_lookup(ospf
->nbr_nbma
, (struct prefix
*)&p
);
1880 route_unlock_node(rn
);
1886 struct ospf_nbr_nbma
*ospf_nbr_nbma_lookup_next(struct ospf
*ospf
,
1887 struct in_addr
*addr
, int first
)
1890 struct ospf_nbr_nbma
*nbr_nbma
;
1891 struct listnode
*node
;
1898 for (ALL_LIST_ELEMENTS_RO (ospf
->nbr_nbma
, node
, nbr_nbma
))
1902 *addr
= nbr_nbma
->addr
;
1905 else if (ntohl (nbr_nbma
->addr
.s_addr
) > ntohl (addr
->s_addr
))
1907 *addr
= nbr_nbma
->addr
;
1915 int ospf_nbr_nbma_set(struct ospf
*ospf
, struct in_addr nbr_addr
)
1917 struct ospf_nbr_nbma
*nbr_nbma
;
1918 struct ospf_interface
*oi
;
1919 struct prefix_ipv4 p
;
1920 struct route_node
*rn
;
1921 struct listnode
*node
;
1923 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
1927 nbr_nbma
= ospf_nbr_nbma_new();
1928 nbr_nbma
->addr
= nbr_addr
;
1931 p
.prefix
= nbr_addr
;
1932 p
.prefixlen
= IPV4_MAX_BITLEN
;
1934 rn
= route_node_get(ospf
->nbr_nbma
, (struct prefix
*)&p
);
1936 route_unlock_node(rn
);
1937 rn
->info
= nbr_nbma
;
1939 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
1940 if (oi
->type
== OSPF_IFTYPE_NBMA
)
1941 if (prefix_match(oi
->address
, (struct prefix
*)&p
)) {
1942 ospf_nbr_nbma_add(nbr_nbma
, oi
);
1950 int ospf_nbr_nbma_unset(struct ospf
*ospf
, struct in_addr nbr_addr
)
1952 struct ospf_nbr_nbma
*nbr_nbma
;
1954 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
1955 if (nbr_nbma
== NULL
)
1958 ospf_nbr_nbma_down(nbr_nbma
);
1959 ospf_nbr_nbma_delete(ospf
, nbr_nbma
);
1964 int ospf_nbr_nbma_priority_set(struct ospf
*ospf
, struct in_addr nbr_addr
,
1967 struct ospf_nbr_nbma
*nbr_nbma
;
1969 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
1970 if (nbr_nbma
== NULL
)
1973 if (nbr_nbma
->priority
!= priority
)
1974 nbr_nbma
->priority
= priority
;
1979 int ospf_nbr_nbma_priority_unset(struct ospf
*ospf
, struct in_addr nbr_addr
)
1981 struct ospf_nbr_nbma
*nbr_nbma
;
1983 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
1984 if (nbr_nbma
== NULL
)
1987 if (nbr_nbma
!= OSPF_NEIGHBOR_PRIORITY_DEFAULT
)
1988 nbr_nbma
->priority
= OSPF_NEIGHBOR_PRIORITY_DEFAULT
;
1993 int ospf_nbr_nbma_poll_interval_set(struct ospf
*ospf
, struct in_addr nbr_addr
,
1994 unsigned int interval
)
1996 struct ospf_nbr_nbma
*nbr_nbma
;
1998 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
1999 if (nbr_nbma
== NULL
)
2002 if (nbr_nbma
->v_poll
!= interval
) {
2003 nbr_nbma
->v_poll
= interval
;
2004 if (nbr_nbma
->oi
&& ospf_if_is_up(nbr_nbma
->oi
)) {
2005 OSPF_TIMER_OFF(nbr_nbma
->t_poll
);
2006 OSPF_POLL_TIMER_ON(nbr_nbma
->t_poll
, ospf_poll_timer
,
2014 int ospf_nbr_nbma_poll_interval_unset(struct ospf
*ospf
, struct in_addr addr
)
2016 struct ospf_nbr_nbma
*nbr_nbma
;
2018 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, addr
);
2019 if (nbr_nbma
== NULL
)
2022 if (nbr_nbma
->v_poll
!= OSPF_POLL_INTERVAL_DEFAULT
)
2023 nbr_nbma
->v_poll
= OSPF_POLL_INTERVAL_DEFAULT
;
2028 void ospf_master_init(struct thread_master
*master
)
2030 memset(&ospf_master
, 0, sizeof(struct ospf_master
));
2033 om
->ospf
= list_new();
2034 om
->master
= master
;
2037 /* Link OSPF instance to VRF. */
2038 void ospf_vrf_link(struct ospf
*ospf
, struct vrf
*vrf
)
2040 ospf
->vrf_id
= vrf
->vrf_id
;
2041 if (vrf
->info
!= (void *)ospf
)
2042 vrf
->info
= (void *)ospf
;
2045 /* Unlink OSPF instance from VRF. */
2046 void ospf_vrf_unlink(struct ospf
*ospf
, struct vrf
*vrf
)
2048 if (vrf
->info
== (void *)ospf
)
2050 ospf
->vrf_id
= VRF_UNKNOWN
;
2053 /* This is hook function for vrf create called as part of vrf_init */
2054 static int ospf_vrf_new(struct vrf
*vrf
)
2056 if (IS_DEBUG_OSPF_EVENT
)
2057 zlog_debug("%s: VRF Created: %s(%u)", __PRETTY_FUNCTION__
,
2058 vrf
->name
, vrf
->vrf_id
);
2063 /* This is hook function for vrf delete call as part of vrf_init */
2064 static int ospf_vrf_delete(struct vrf
*vrf
)
2066 if (IS_DEBUG_OSPF_EVENT
)
2067 zlog_debug("%s: VRF Deletion: %s(%u)", __PRETTY_FUNCTION__
,
2068 vrf
->name
, vrf
->vrf_id
);
2073 static void ospf_set_redist_vrf_bitmaps(struct ospf
*ospf
)
2076 struct list
*red_list
;
2078 for (type
= 0; type
< ZEBRA_ROUTE_MAX
; type
++) {
2079 red_list
= ospf
->redist
[type
];
2082 if (IS_DEBUG_OSPF_EVENT
)
2084 "%s: setting redist vrf %d bitmap for type %d",
2085 __func__
, ospf
->vrf_id
, type
);
2086 vrf_bitmap_set(zclient
->redist
[AFI_IP
][type
], ospf
->vrf_id
);
2090 /* Enable OSPF VRF instance */
2091 static int ospf_vrf_enable(struct vrf
*vrf
)
2093 struct ospf
*ospf
= NULL
;
2094 vrf_id_t old_vrf_id
;
2097 if (IS_DEBUG_OSPF_EVENT
)
2098 zlog_debug("%s: VRF %s id %u enabled", __PRETTY_FUNCTION__
,
2099 vrf
->name
, vrf
->vrf_id
);
2101 ospf
= ospf_lookup_by_name(vrf
->name
);
2103 if (ospf
->name
&& strmatch(vrf
->name
, VRF_DEFAULT_NAME
)) {
2104 XFREE(MTYPE_OSPF_TOP
, ospf
->name
);
2107 old_vrf_id
= ospf
->vrf_id
;
2108 /* We have instance configured, link to VRF and make it "up". */
2109 ospf_vrf_link(ospf
, vrf
);
2110 if (IS_DEBUG_OSPF_EVENT
)
2112 "%s: ospf linked to vrf %s vrf_id %u (old id %u)",
2113 __PRETTY_FUNCTION__
, vrf
->name
, ospf
->vrf_id
,
2116 if (old_vrf_id
!= ospf
->vrf_id
) {
2117 frr_elevate_privs(&ospfd_privs
) {
2118 /* stop zebra redist to us for old vrf */
2119 zclient_send_dereg_requests(zclient
,
2122 ospf_set_redist_vrf_bitmaps(ospf
);
2124 /* start zebra redist to us for new vrf */
2125 ospf_zebra_vrf_register(ospf
);
2127 ret
= ospf_sock_init(ospf
);
2129 if (ret
< 0 || ospf
->fd
<= 0)
2131 thread_add_read(master
, ospf_read
, ospf
, ospf
->fd
,
2133 ospf
->oi_running
= 1;
2134 ospf_router_id_update(ospf
);
2141 /* Disable OSPF VRF instance */
2142 static int ospf_vrf_disable(struct vrf
*vrf
)
2144 struct ospf
*ospf
= NULL
;
2145 vrf_id_t old_vrf_id
= VRF_UNKNOWN
;
2147 if (vrf
->vrf_id
== VRF_DEFAULT
)
2150 if (IS_DEBUG_OSPF_EVENT
)
2151 zlog_debug("%s: VRF %s id %d disabled.", __PRETTY_FUNCTION__
,
2152 vrf
->name
, vrf
->vrf_id
);
2154 ospf
= ospf_lookup_by_name(vrf
->name
);
2156 old_vrf_id
= ospf
->vrf_id
;
2158 /* We have instance configured, unlink
2159 * from VRF and make it "down".
2161 ospf_vrf_unlink(ospf
, vrf
);
2162 ospf
->oi_running
= 0;
2163 if (IS_DEBUG_OSPF_EVENT
)
2164 zlog_debug("%s: ospf old_vrf_id %d unlinked",
2165 __PRETTY_FUNCTION__
, old_vrf_id
);
2166 thread_cancel(ospf
->t_read
);
2171 /* Note: This is a callback, the VRF will be deleted by the caller. */
2175 void ospf_vrf_init(void)
2177 vrf_init(ospf_vrf_new
, ospf_vrf_enable
, ospf_vrf_disable
,
2178 ospf_vrf_delete
, NULL
);
2181 void ospf_vrf_terminate(void)
2186 const char *ospf_vrf_id_to_name(vrf_id_t vrf_id
)
2188 struct vrf
*vrf
= vrf_lookup_by_id(vrf_id
);
2190 return vrf
? vrf
->name
: "NIL";