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"
44 #include "ospfd/ospfd.h"
45 #include "ospfd/ospf_bfd.h"
46 #include "ospfd/ospf_network.h"
47 #include "ospfd/ospf_interface.h"
48 #include "ospfd/ospf_ism.h"
49 #include "ospfd/ospf_asbr.h"
50 #include "ospfd/ospf_lsa.h"
51 #include "ospfd/ospf_lsdb.h"
52 #include "ospfd/ospf_neighbor.h"
53 #include "ospfd/ospf_nsm.h"
54 #include "ospfd/ospf_spf.h"
55 #include "ospfd/ospf_packet.h"
56 #include "ospfd/ospf_dump.h"
57 #include "ospfd/ospf_route.h"
58 #include "ospfd/ospf_zebra.h"
59 #include "ospfd/ospf_abr.h"
60 #include "ospfd/ospf_flood.h"
61 #include "ospfd/ospf_ase.h"
62 #include "ospfd/ospf_ldp_sync.h"
63 #include "ospfd/ospf_gr.h"
64 #include "ospfd/ospf_apiserver.h"
67 DEFINE_QOBJ_TYPE(ospf
);
69 /* OSPF process wide configuration. */
70 static struct ospf_master ospf_master
;
72 /* OSPF process wide configuration pointer to export. */
73 struct ospf_master
*om
;
75 unsigned short ospf_instance
;
77 extern struct zclient
*zclient
;
80 static void ospf_remove_vls_through_area(struct ospf
*, struct ospf_area
*);
81 static void ospf_network_free(struct ospf
*, struct ospf_network
*);
82 static void ospf_area_free(struct ospf_area
*);
83 static void ospf_network_run(struct prefix
*, struct ospf_area
*);
84 static void ospf_network_run_interface(struct ospf
*, struct interface
*,
85 struct prefix
*, struct ospf_area
*);
86 static void ospf_network_run_subnet(struct ospf
*, struct connected
*,
87 struct prefix
*, struct ospf_area
*);
88 static int ospf_network_match_iface(const struct connected
*,
89 const struct prefix
*);
90 static void ospf_finish_final(struct ospf
*);
92 #define OSPF_EXTERNAL_LSA_ORIGINATE_DELAY 1
94 int p_spaces_compare_func(const struct p_space
*a
, const struct p_space
*b
)
96 if (a
->protected_resource
->type
== OSPF_TI_LFA_LINK_PROTECTION
97 && b
->protected_resource
->type
== OSPF_TI_LFA_LINK_PROTECTION
)
98 return (a
->protected_resource
->link
->link_id
.s_addr
99 - b
->protected_resource
->link
->link_id
.s_addr
);
101 if (a
->protected_resource
->type
== OSPF_TI_LFA_NODE_PROTECTION
102 && b
->protected_resource
->type
== OSPF_TI_LFA_NODE_PROTECTION
)
103 return (a
->protected_resource
->router_id
.s_addr
104 - b
->protected_resource
->router_id
.s_addr
);
106 /* This should not happen */
110 int q_spaces_compare_func(const struct q_space
*a
, const struct q_space
*b
)
112 return (a
->root
->id
.s_addr
- b
->root
->id
.s_addr
);
115 DECLARE_RBTREE_UNIQ(p_spaces
, struct p_space
, p_spaces_item
,
116 p_spaces_compare_func
);
118 void ospf_process_refresh_data(struct ospf
*ospf
, bool reset
)
120 struct vrf
*vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
121 struct in_addr router_id
, router_id_old
;
122 struct ospf_interface
*oi
;
123 struct interface
*ifp
;
124 struct listnode
*node
, *nnode
;
125 struct ospf_area
*area
;
126 bool rid_change
= false;
128 if (!ospf
->oi_running
) {
129 if (IS_DEBUG_OSPF_EVENT
)
131 "Router ospf not configured -- Router-ID update postponed");
135 if (IS_DEBUG_OSPF_EVENT
)
136 zlog_debug("Router-ID[OLD:%pI4]: Update",
139 router_id_old
= ospf
->router_id
;
141 /* Select the router ID based on these priorities:
142 1. Statically assigned router ID is always the first choice.
143 2. If there is no statically assigned router ID, then try to stick
144 with the most recent value, since changing router ID's is very
146 3. Last choice: just go with whatever the zebra daemon recommends.
148 if (ospf
->router_id_static
.s_addr
!= INADDR_ANY
)
149 router_id
= ospf
->router_id_static
;
150 else if (ospf
->router_id
.s_addr
!= INADDR_ANY
)
151 router_id
= ospf
->router_id
;
153 router_id
= ospf
->router_id_zebra
;
155 if (IS_DEBUG_OSPF_EVENT
)
156 zlog_debug("Router-ID[OLD:%pI4]: Update to %pI4",
157 &ospf
->router_id
, &router_id
);
159 rid_change
= !(IPV4_ADDR_SAME(&router_id_old
, &router_id
));
160 if (rid_change
|| (reset
)) {
161 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
162 /* Some nbrs are identified by router_id, these needs
163 * to be rebuilt. Possible optimization would be to do
164 * oi->nbr_self->router_id = router_id for
165 * !(virtual | ptop) links
167 ospf_nbr_self_reset(oi
, router_id
);
170 * If the old router id was not set, but now it
171 * is and the interface is operative and the
172 * state is ISM_Down we should kick the state
173 * machine as that we processed the interfaces
174 * based upon the network statement( or intf config )
175 * but could not start it at that time.
177 if (if_is_operative(oi
->ifp
) && oi
->state
== ISM_Down
178 && router_id_old
.s_addr
== INADDR_ANY
)
182 /* Flush (inline) all the self originated LSAs */
183 ospf_flush_self_originated_lsas_now(ospf
);
185 ospf
->router_id
= router_id
;
186 if (IS_DEBUG_OSPF_EVENT
)
187 zlog_debug("Router-ID[NEW:%pI4]: Update",
190 /* Flush (inline) all external LSAs which now match the new
192 need to adjust the OSPF_LSA_SELF flag, so the flush doesn't
194 asserts in ospf_refresher_unregister_lsa(). This step is
196 because the current frr code does look-up for
198 based on the self router-id alone but expects OSPF_LSA_SELF
202 struct route_node
*rn
;
203 struct ospf_lsa
*lsa
;
205 LSDB_LOOP (EXTERNAL_LSDB(ospf
), rn
, lsa
) {
206 /* AdvRouter and Router ID is the same. */
207 if (IPV4_ADDR_SAME(&lsa
->data
->adv_router
,
208 &ospf
->router_id
) && rid_change
) {
210 OSPF_LSA_SELF_CHECKED
);
211 SET_FLAG(lsa
->flags
, OSPF_LSA_SELF
);
212 ospf_lsa_flush_schedule(ospf
, lsa
);
214 /* The above flush will send immediately
215 * So discard the LSA to originate new
217 ospf_discard_from_db(ospf
, ospf
->lsdb
, lsa
);
220 LSDB_LOOP (OPAQUE_AS_LSDB(ospf
), rn
, lsa
)
221 ospf_discard_from_db(ospf
, ospf
->lsdb
, lsa
);
223 ospf_lsdb_delete_all(ospf
->lsdb
);
226 /* Since the LSAs are deleted, need reset the aggr flag */
227 ospf_unset_all_aggr_flag(ospf
);
229 /* Delete the LSDB */
230 for (ALL_LIST_ELEMENTS(ospf
->areas
, node
, nnode
, area
))
231 ospf_area_lsdb_discard_delete(area
);
233 /* update router-lsa's for each area */
234 ospf_router_lsa_update(ospf
);
236 /* update ospf_interface's */
237 FOR_ALL_INTERFACES (vrf
, ifp
) {
241 ospf_if_update(ospf
, ifp
);
244 ospf_external_lsa_rid_change(ospf
);
246 #ifdef SUPPORT_OSPF_API
247 ospf_apiserver_clients_notify_router_id_change(router_id
);
251 ospf
->inst_shutdown
= 0;
254 void ospf_router_id_update(struct ospf
*ospf
)
256 ospf_process_refresh_data(ospf
, false);
259 void ospf_process_reset(struct ospf
*ospf
)
261 ospf_process_refresh_data(ospf
, true);
264 void ospf_neighbor_reset(struct ospf
*ospf
, struct in_addr nbr_id
,
267 struct route_node
*rn
;
268 struct ospf_neighbor
*nbr
;
269 struct ospf_interface
*oi
;
270 struct listnode
*node
;
272 /* Clear only a particular nbr with nbr router id as nbr_id */
273 if (nbr_str
!= NULL
) {
274 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
275 nbr
= ospf_nbr_lookup_by_routerid(oi
->nbrs
, &nbr_id
);
277 OSPF_NSM_EVENT_EXECUTE(nbr
, NSM_KillNbr
);
282 /* send Neighbor event KillNbr to all associated neighbors. */
283 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
284 for (rn
= route_top(oi
->nbrs
); rn
; rn
= route_next(rn
)) {
286 if (nbr
&& (nbr
!= oi
->nbr_self
))
287 OSPF_NSM_EVENT_EXECUTE(nbr
, NSM_KillNbr
);
292 /* For OSPF area sort by area id. */
293 static int ospf_area_id_cmp(struct ospf_area
*a1
, struct ospf_area
*a2
)
295 if (ntohl(a1
->area_id
.s_addr
) > ntohl(a2
->area_id
.s_addr
))
297 if (ntohl(a1
->area_id
.s_addr
) < ntohl(a2
->area_id
.s_addr
))
302 static void ospf_add(struct ospf
*ospf
)
304 listnode_add(om
->ospf
, ospf
);
307 static void ospf_delete(struct ospf
*ospf
)
309 listnode_delete(om
->ospf
, ospf
);
312 struct ospf
*ospf_new_alloc(unsigned short instance
, const char *name
)
315 struct vrf
*vrf
= NULL
;
317 struct ospf
*new = XCALLOC(MTYPE_OSPF_TOP
, sizeof(struct ospf
));
319 new->instance
= instance
;
320 new->router_id
.s_addr
= htonl(0);
321 new->router_id_static
.s_addr
= htonl(0);
323 vrf
= vrf_lookup_by_name(name
);
325 new->vrf_id
= vrf
->vrf_id
;
327 new->vrf_id
= VRF_UNKNOWN
;
329 /* Freed in ospf_finish_final */
330 new->name
= XSTRDUP(MTYPE_OSPF_TOP
, name
);
331 if (IS_DEBUG_OSPF_EVENT
)
333 "%s: Create new ospf instance with vrf_name %s vrf_id %u",
334 __func__
, name
, new->vrf_id
);
337 ospf_vrf_link(new, vrf
);
339 ospf_zebra_vrf_register(new);
341 new->abr_type
= OSPF_ABR_DEFAULT
;
342 new->oiflist
= list_new();
343 new->vlinks
= list_new();
344 new->areas
= list_new();
345 new->areas
->cmp
= (int (*)(void *, void *))ospf_area_id_cmp
;
346 new->networks
= route_table_init();
347 new->nbr_nbma
= route_table_init();
349 new->lsdb
= ospf_lsdb_new();
351 new->default_originate
= DEFAULT_ORIGINATE_NONE
;
353 new->passive_interface_default
= OSPF_IF_ACTIVE
;
355 new->new_external_route
= route_table_init();
356 new->old_external_route
= route_table_init();
357 new->external_lsas
= route_table_init();
359 new->stub_router_startup_time
= OSPF_STUB_ROUTER_UNCONFIGURED
;
360 new->stub_router_shutdown_time
= OSPF_STUB_ROUTER_UNCONFIGURED
;
361 new->stub_router_admin_set
= OSPF_STUB_ROUTER_ADMINISTRATIVE_UNSET
;
363 /* Distribute parameter init. */
364 for (i
= 0; i
<= ZEBRA_ROUTE_MAX
; i
++) {
367 new->default_metric
= -1;
368 new->ref_bandwidth
= OSPF_DEFAULT_REF_BANDWIDTH
;
371 new->min_ls_interval
= OSPF_MIN_LS_INTERVAL
;
372 new->min_ls_arrival
= OSPF_MIN_LS_ARRIVAL
;
374 /* SPF timer value init. */
375 new->spf_delay
= OSPF_SPF_DELAY_DEFAULT
;
376 new->spf_holdtime
= OSPF_SPF_HOLDTIME_DEFAULT
;
377 new->spf_max_holdtime
= OSPF_SPF_MAX_HOLDTIME_DEFAULT
;
378 new->spf_hold_multiplier
= 1;
381 new->maxage_delay
= OSPF_LSA_MAXAGE_REMOVE_DELAY_DEFAULT
;
382 new->maxage_lsa
= route_table_init();
383 new->t_maxage_walker
= NULL
;
384 thread_add_timer(master
, ospf_lsa_maxage_walker
, new,
385 OSPF_LSA_MAXAGE_CHECK_INTERVAL
, &new->t_maxage_walker
);
387 /* Max paths initialization */
388 new->max_multipath
= MULTIPATH_NUM
;
390 /* Distance table init. */
391 new->distance_table
= route_table_init();
393 new->lsa_refresh_queue
.index
= 0;
394 new->lsa_refresh_interval
= OSPF_LSA_REFRESH_INTERVAL_DEFAULT
;
395 new->t_lsa_refresher
= NULL
;
396 thread_add_timer(master
, ospf_lsa_refresh_walker
, new,
397 new->lsa_refresh_interval
, &new->t_lsa_refresher
);
398 new->lsa_refresher_started
= monotime(NULL
);
400 new->ibuf
= stream_new(OSPF_MAX_PACKET_SIZE
+ 1);
403 new->oi_write_q
= list_new();
404 new->write_oi_count
= OSPF_WRITE_INTERFACE_COUNT_DEFAULT
;
406 new->proactive_arp
= OSPF_PROACTIVE_ARP_DEFAULT
;
408 ospf_gr_helper_instance_init(new);
410 ospf_asbr_external_aggregator_init(new);
412 ospf_opaque_type11_lsa_init(new);
421 /* Allocate new ospf structure. */
422 static struct ospf
*ospf_new(unsigned short instance
, const char *name
)
426 new = ospf_new_alloc(instance
, name
);
429 if (new->vrf_id
== VRF_UNKNOWN
)
432 if ((ospf_sock_init(new)) < 0) {
433 flog_err(EC_LIB_SOCKET
,
434 "%s: ospf_sock_init is unable to open a socket",
439 thread_add_read(master
, ospf_read
, new, new->fd
, &new->t_read
);
442 ospf_router_id_update(new);
445 * Read from non-volatile memory whether this instance is performing a
446 * graceful restart or not.
448 ospf_gr_nvm_read(new);
453 struct ospf
*ospf_lookup_instance(unsigned short instance
)
456 struct listnode
*node
, *nnode
;
458 if (listcount(om
->ospf
) == 0)
461 for (ALL_LIST_ELEMENTS(om
->ospf
, node
, nnode
, ospf
))
462 if ((ospf
->instance
== 0 && instance
== 0)
463 || (ospf
->instance
&& instance
464 && ospf
->instance
== instance
))
470 static int ospf_is_ready(struct ospf
*ospf
)
472 /* OSPF must be on and Router-ID must be configured. */
473 if (!ospf
|| ospf
->router_id
.s_addr
== INADDR_ANY
)
479 struct ospf
*ospf_lookup_by_inst_name(unsigned short instance
, const char *name
)
481 struct ospf
*ospf
= NULL
;
482 struct listnode
*node
, *nnode
;
484 for (ALL_LIST_ELEMENTS(om
->ospf
, node
, nnode
, ospf
)) {
485 if ((ospf
->instance
== instance
)
486 && ((ospf
->name
== NULL
&& name
== NULL
)
487 || (ospf
->name
&& name
488 && strcmp(ospf
->name
, name
) == 0)))
494 struct ospf
*ospf_lookup(unsigned short instance
, const char *name
)
499 ospf
= ospf_lookup_instance(instance
);
501 ospf
= ospf_lookup_by_inst_name(instance
, name
);
507 struct ospf
*ospf_get(unsigned short instance
, const char *name
, bool *created
)
511 ospf
= ospf_lookup(instance
, name
);
513 *created
= (ospf
== NULL
);
515 ospf
= ospf_new(instance
, name
);
520 struct ospf
*ospf_lookup_by_vrf_id(vrf_id_t vrf_id
)
522 struct vrf
*vrf
= NULL
;
524 vrf
= vrf_lookup_by_id(vrf_id
);
527 return (vrf
->info
) ? (struct ospf
*)vrf
->info
: NULL
;
530 uint32_t ospf_count_area_params(struct ospf
*ospf
)
533 struct interface
*ifp
;
536 if (ospf
->vrf_id
!= VRF_UNKNOWN
) {
537 vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
539 FOR_ALL_INTERFACES (vrf
, ifp
) {
540 count
+= ospf_if_count_area_params(ifp
);
547 /* It should only be used when processing incoming info update from zebra.
548 * Other situations, it is not sufficient to lookup the ospf instance by
549 * vrf_name only without using the instance number.
551 static struct ospf
*ospf_lookup_by_name(const char *vrf_name
)
553 struct ospf
*ospf
= NULL
;
554 struct listnode
*node
, *nnode
;
556 for (ALL_LIST_ELEMENTS(om
->ospf
, node
, nnode
, ospf
))
557 if ((ospf
->name
== NULL
&& vrf_name
== NULL
)
558 || (ospf
->name
&& vrf_name
559 && strcmp(ospf
->name
, vrf_name
) == 0))
564 /* Handle the second half of deferred shutdown. This is called either
565 * from the deferred-shutdown timer thread, or directly through
566 * ospf_deferred_shutdown_check.
568 * Function is to cleanup G-R state, if required then call ospf_finish_final
569 * to complete shutdown of this ospf instance. Possibly exit if the
570 * whole process is being shutdown and this was the last OSPF instance.
572 static void ospf_deferred_shutdown_finish(struct ospf
*ospf
)
574 ospf
->stub_router_shutdown_time
= OSPF_STUB_ROUTER_UNCONFIGURED
;
575 THREAD_OFF(ospf
->t_deferred_shutdown
);
577 ospf_finish_final(ospf
);
579 /* *ospf is now invalid */
581 /* ospfd being shut-down? If so, was this the last ospf instance? */
582 if (CHECK_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
)
583 && (listcount(om
->ospf
) == 0)) {
591 /* Timer thread for G-R */
592 static void ospf_deferred_shutdown_timer(struct thread
*t
)
594 struct ospf
*ospf
= THREAD_ARG(t
);
596 ospf_deferred_shutdown_finish(ospf
);
599 /* Check whether deferred-shutdown must be scheduled, otherwise call
600 * down directly into second-half of instance shutdown.
602 static void ospf_deferred_shutdown_check(struct ospf
*ospf
)
604 unsigned long timeout
;
606 struct ospf_area
*area
;
608 /* deferred shutdown already running? */
609 if (ospf
->t_deferred_shutdown
)
612 /* Should we try push out max-metric LSAs? */
613 if (ospf
->stub_router_shutdown_time
!= OSPF_STUB_ROUTER_UNCONFIGURED
) {
614 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, ln
, area
)) {
615 SET_FLAG(area
->stub_router_state
,
616 OSPF_AREA_ADMIN_STUB_ROUTED
);
618 if (!CHECK_FLAG(area
->stub_router_state
,
619 OSPF_AREA_IS_STUB_ROUTED
))
620 ospf_router_lsa_update_area(area
);
622 timeout
= ospf
->stub_router_shutdown_time
;
624 /* No timer needed */
625 ospf_deferred_shutdown_finish(ospf
);
629 OSPF_TIMER_ON(ospf
->t_deferred_shutdown
, ospf_deferred_shutdown_timer
,
634 /* Shut down the entire process */
635 void ospf_terminate(void)
638 struct listnode
*node
, *nnode
;
640 /* shutdown already in progress */
641 if (CHECK_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
))
644 SET_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
);
646 /* Skip some steps if OSPF not actually running */
647 if (listcount(om
->ospf
) == 0)
650 for (ALL_LIST_ELEMENTS(om
->ospf
, node
, nnode
, ospf
))
654 ospf_gr_helper_stop();
656 /* Cleanup route maps */
659 /* reverse prefix_list_init */
660 prefix_list_add_hook(NULL
);
661 prefix_list_delete_hook(NULL
);
664 /* Cleanup vrf info */
665 ospf_vrf_terminate();
667 /* Deliberately go back up, hopefully to thread scheduler, as
668 * One or more ospf_finish()'s may have deferred shutdown to a timer
671 zclient_stop(zclient
);
672 zclient_free(zclient
);
678 void ospf_finish(struct ospf
*ospf
)
680 /* let deferred shutdown decide */
681 ospf_deferred_shutdown_check(ospf
);
683 /* if ospf_deferred_shutdown returns, then ospf_finish_final is
684 * deferred to expiry of G-S timer thread. Return back up, hopefully
685 * to thread scheduler.
690 /* Final cleanup of ospf instance */
691 static void ospf_finish_final(struct ospf
*ospf
)
693 struct vrf
*vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
694 struct route_node
*rn
;
695 struct ospf_nbr_nbma
*nbr_nbma
;
696 struct ospf_lsa
*lsa
;
697 struct ospf_interface
*oi
;
698 struct ospf_area
*area
;
699 struct ospf_vl_data
*vl_data
;
700 struct listnode
*node
, *nnode
;
701 struct ospf_redist
*red
;
706 ospf_opaque_type11_lsa_term(ospf
);
708 ospf_opaque_finish();
710 if (!ospf
->gr_info
.prepare_in_progress
)
711 ospf_flush_self_originated_lsas_now(ospf
);
713 /* Unregister redistribution */
714 for (i
= 0; i
< ZEBRA_ROUTE_MAX
; i
++) {
715 struct list
*red_list
;
717 red_list
= ospf
->redist
[i
];
721 for (ALL_LIST_ELEMENTS(red_list
, node
, nnode
, red
)) {
722 ospf_redistribute_unset(ospf
, i
, red
->instance
);
723 ospf_redist_del(ospf
, i
, red
->instance
);
726 red
= ospf_redist_lookup(ospf
, DEFAULT_ROUTE
, 0);
728 ospf_routemap_unset(red
);
729 ospf_redist_del(ospf
, DEFAULT_ROUTE
, 0);
730 ospf_redistribute_default_set(ospf
, DEFAULT_ORIGINATE_NONE
, 0, 0);
733 for (ALL_LIST_ELEMENTS(ospf
->areas
, node
, nnode
, area
))
734 ospf_remove_vls_through_area(ospf
, area
);
736 for (ALL_LIST_ELEMENTS(ospf
->vlinks
, node
, nnode
, vl_data
))
737 ospf_vl_delete(ospf
, vl_data
);
739 list_delete(&ospf
->vlinks
);
741 /* shutdown LDP-Sync */
742 if (ospf
->vrf_id
== VRF_DEFAULT
)
743 ospf_ldp_sync_gbl_exit(ospf
, true);
745 /* Reset interface. */
746 for (ALL_LIST_ELEMENTS(ospf
->oiflist
, node
, nnode
, oi
))
748 list_delete(&ospf
->oiflist
);
749 ospf
->oi_running
= 0;
751 /* De-Register VRF */
752 ospf_zebra_vrf_deregister(ospf
);
754 /* Clear static neighbors */
755 for (rn
= route_top(ospf
->nbr_nbma
); rn
; rn
= route_next(rn
))
756 if ((nbr_nbma
= rn
->info
)) {
757 THREAD_OFF(nbr_nbma
->t_poll
);
760 nbr_nbma
->nbr
->nbr_nbma
= NULL
;
761 nbr_nbma
->nbr
= NULL
;
765 listnode_delete(nbr_nbma
->oi
->nbr_nbma
,
770 XFREE(MTYPE_OSPF_NEIGHBOR_STATIC
, nbr_nbma
);
773 route_table_finish(ospf
->nbr_nbma
);
775 /* Clear networks and Areas. */
776 for (rn
= route_top(ospf
->networks
); rn
; rn
= route_next(rn
)) {
777 struct ospf_network
*network
;
779 if ((network
= rn
->info
) != NULL
) {
780 ospf_network_free(ospf
, network
);
782 route_unlock_node(rn
);
785 route_table_finish(ospf
->networks
);
787 for (ALL_LIST_ELEMENTS(ospf
->areas
, node
, nnode
, area
)) {
788 listnode_delete(ospf
->areas
, area
);
789 ospf_area_free(area
);
792 /* Cancel all timers. */
793 THREAD_OFF(ospf
->t_read
);
794 THREAD_OFF(ospf
->t_write
);
795 THREAD_OFF(ospf
->t_spf_calc
);
796 THREAD_OFF(ospf
->t_ase_calc
);
797 THREAD_OFF(ospf
->t_maxage
);
798 THREAD_OFF(ospf
->t_maxage_walker
);
799 THREAD_OFF(ospf
->t_abr_task
);
800 THREAD_OFF(ospf
->t_asbr_check
);
801 THREAD_OFF(ospf
->t_asbr_nssa_redist_update
);
802 THREAD_OFF(ospf
->t_distribute_update
);
803 THREAD_OFF(ospf
->t_lsa_refresher
);
804 THREAD_OFF(ospf
->t_opaque_lsa_self
);
805 THREAD_OFF(ospf
->t_sr_update
);
806 THREAD_OFF(ospf
->t_default_routemap_timer
);
807 THREAD_OFF(ospf
->t_external_aggr
);
808 THREAD_OFF(ospf
->gr_info
.t_grace_period
);
810 LSDB_LOOP (OPAQUE_AS_LSDB(ospf
), rn
, lsa
)
811 ospf_discard_from_db(ospf
, ospf
->lsdb
, lsa
);
812 LSDB_LOOP (EXTERNAL_LSDB(ospf
), rn
, lsa
)
813 ospf_discard_from_db(ospf
, ospf
->lsdb
, lsa
);
815 ospf_lsdb_delete_all(ospf
->lsdb
);
816 ospf_lsdb_free(ospf
->lsdb
);
818 for (rn
= route_top(ospf
->maxage_lsa
); rn
; rn
= route_next(rn
)) {
819 if ((lsa
= rn
->info
) != NULL
) {
820 ospf_lsa_unlock(&lsa
);
822 route_unlock_node(rn
);
825 route_table_finish(ospf
->maxage_lsa
);
828 ospf_route_table_free(ospf
->old_table
);
829 if (ospf
->new_table
) {
830 if (!ospf
->gr_info
.prepare_in_progress
)
831 ospf_route_delete(ospf
, ospf
->new_table
);
832 ospf_route_table_free(ospf
->new_table
);
835 ospf_rtrs_free(ospf
->old_rtrs
);
837 ospf_rtrs_free(ospf
->new_rtrs
);
838 if (ospf
->new_external_route
) {
839 if (!ospf
->gr_info
.prepare_in_progress
)
840 ospf_route_delete(ospf
, ospf
->new_external_route
);
841 ospf_route_table_free(ospf
->new_external_route
);
843 if (ospf
->old_external_route
) {
844 if (!ospf
->gr_info
.prepare_in_progress
)
845 ospf_route_delete(ospf
, ospf
->old_external_route
);
846 ospf_route_table_free(ospf
->old_external_route
);
848 if (ospf
->external_lsas
) {
849 ospf_ase_external_lsas_finish(ospf
->external_lsas
);
852 for (i
= ZEBRA_ROUTE_SYSTEM
; i
<= ZEBRA_ROUTE_MAX
; i
++) {
853 struct list
*ext_list
;
854 struct ospf_external
*ext
;
856 ext_list
= ospf
->external
[i
];
860 for (ALL_LIST_ELEMENTS(ext_list
, node
, nnode
, ext
)) {
861 if (ext
->external_info
)
862 for (rn
= route_top(ext
->external_info
); rn
;
863 rn
= route_next(rn
)) {
864 if (rn
->info
== NULL
)
867 XFREE(MTYPE_OSPF_EXTERNAL_INFO
,
870 route_unlock_node(rn
);
873 ospf_external_del(ospf
, i
, ext
->instance
);
877 ospf_distance_reset(ospf
);
878 route_table_finish(ospf
->distance_table
);
880 /* Release extrenal Aggregator table */
881 for (rn
= route_top(ospf
->rt_aggr_tbl
); rn
; rn
= route_next(rn
)) {
882 struct ospf_external_aggr_rt
*aggr
;
887 ospf_external_aggregator_free(aggr
);
889 route_unlock_node(rn
);
893 route_table_finish(ospf
->rt_aggr_tbl
);
896 list_delete(&ospf
->areas
);
897 list_delete(&ospf
->oi_write_q
);
899 /* Reset GR helper data structers */
900 ospf_gr_helper_instance_stop(ospf
);
903 stream_free(ospf
->ibuf
);
905 ospf
->max_multipath
= MULTIPATH_NUM
;
909 ospf_vrf_unlink(ospf
, vrf
);
911 XFREE(MTYPE_OSPF_TOP
, ospf
->name
);
912 XFREE(MTYPE_OSPF_TOP
, ospf
);
916 /* allocate new OSPF Area object */
917 struct ospf_area
*ospf_area_new(struct ospf
*ospf
, struct in_addr area_id
)
919 struct ospf_area
*new;
921 /* Allocate new config_network. */
922 new = XCALLOC(MTYPE_OSPF_AREA
, sizeof(struct ospf_area
));
926 new->area_id
= area_id
;
927 new->area_id_fmt
= OSPF_AREA_ID_FMT_DOTTEDQUAD
;
929 new->external_routing
= OSPF_AREA_DEFAULT
;
930 new->default_cost
= 1;
931 new->auth_type
= OSPF_AUTH_NULL
;
934 new->lsdb
= ospf_lsdb_new();
936 /* Self-originated LSAs initialize. */
937 new->router_lsa_self
= NULL
;
939 ospf_opaque_type10_lsa_init(new);
941 new->oiflist
= list_new();
942 new->ranges
= route_table_init();
944 if (area_id
.s_addr
== OSPF_AREA_BACKBONE
)
945 ospf
->backbone
= new;
950 void ospf_area_lsdb_discard_delete(struct ospf_area
*area
)
952 struct route_node
*rn
;
953 struct ospf_lsa
*lsa
;
955 LSDB_LOOP (ROUTER_LSDB(area
), rn
, lsa
)
956 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
957 LSDB_LOOP (NETWORK_LSDB(area
), rn
, lsa
)
958 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
959 LSDB_LOOP (SUMMARY_LSDB(area
), rn
, lsa
)
960 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
961 LSDB_LOOP (ASBR_SUMMARY_LSDB(area
), rn
, lsa
)
962 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
964 LSDB_LOOP (NSSA_LSDB(area
), rn
, lsa
)
965 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
966 LSDB_LOOP (OPAQUE_AREA_LSDB(area
), rn
, lsa
)
967 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
968 LSDB_LOOP (OPAQUE_LINK_LSDB(area
), rn
, lsa
)
969 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
971 ospf_lsdb_delete_all(area
->lsdb
);
974 static void ospf_area_free(struct ospf_area
*area
)
976 ospf_opaque_type10_lsa_term(area
);
979 ospf_area_lsdb_discard_delete(area
);
981 ospf_lsdb_free(area
->lsdb
);
983 ospf_lsa_unlock(&area
->router_lsa_self
);
985 route_table_finish(area
->ranges
);
986 list_delete(&area
->oiflist
);
988 if (EXPORT_NAME(area
))
989 free(EXPORT_NAME(area
));
991 if (IMPORT_NAME(area
))
992 free(IMPORT_NAME(area
));
995 THREAD_OFF(area
->t_stub_router
);
996 THREAD_OFF(area
->t_opaque_lsa_self
);
998 if (OSPF_IS_AREA_BACKBONE(area
))
999 area
->ospf
->backbone
= NULL
;
1001 XFREE(MTYPE_OSPF_AREA
, area
);
1004 void ospf_area_check_free(struct ospf
*ospf
, struct in_addr area_id
)
1006 struct ospf_area
*area
;
1008 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1009 if (area
&& listcount(area
->oiflist
) == 0 && area
->ranges
->top
== NULL
1010 && !ospf_vl_count(ospf
, area
)
1011 && area
->shortcut_configured
== OSPF_SHORTCUT_DEFAULT
1012 && area
->external_routing
== OSPF_AREA_DEFAULT
1013 && area
->no_summary
== 0 && area
->default_cost
== 1
1014 && EXPORT_NAME(area
) == NULL
&& IMPORT_NAME(area
) == NULL
1015 && area
->auth_type
== OSPF_AUTH_NULL
) {
1016 listnode_delete(ospf
->areas
, area
);
1017 ospf_area_free(area
);
1021 struct ospf_area
*ospf_area_get(struct ospf
*ospf
, struct in_addr area_id
)
1023 struct ospf_area
*area
;
1025 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1027 area
= ospf_area_new(ospf
, area_id
);
1028 listnode_add_sort(ospf
->areas
, area
);
1029 ospf_check_abr_status(ospf
);
1030 if (ospf
->stub_router_admin_set
1031 == OSPF_STUB_ROUTER_ADMINISTRATIVE_SET
) {
1032 SET_FLAG(area
->stub_router_state
,
1033 OSPF_AREA_ADMIN_STUB_ROUTED
);
1040 struct ospf_area
*ospf_area_lookup_by_area_id(struct ospf
*ospf
,
1041 struct in_addr area_id
)
1043 struct ospf_area
*area
;
1044 struct listnode
*node
;
1046 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
))
1047 if (IPV4_ADDR_SAME(&area
->area_id
, &area_id
))
1053 void ospf_area_add_if(struct ospf_area
*area
, struct ospf_interface
*oi
)
1055 listnode_add(area
->oiflist
, oi
);
1058 void ospf_area_del_if(struct ospf_area
*area
, struct ospf_interface
*oi
)
1060 listnode_delete(area
->oiflist
, oi
);
1064 struct ospf_interface
*add_ospf_interface(struct connected
*co
,
1065 struct ospf_area
*area
)
1067 struct ospf_interface
*oi
;
1069 oi
= ospf_if_new(area
->ospf
, co
->ifp
, co
->address
);
1074 oi
->params
= ospf_lookup_if_params(co
->ifp
, oi
->address
->u
.prefix4
);
1075 oi
->output_cost
= ospf_if_get_output_cost(oi
);
1077 /* Relate ospf interface to ospf instance. */
1078 oi
->ospf
= area
->ospf
;
1080 /* update network type as interface flag */
1081 /* If network type is specified previously,
1082 skip network type setting. */
1083 oi
->type
= IF_DEF_PARAMS(co
->ifp
)->type
;
1084 oi
->ptp_dmvpn
= IF_DEF_PARAMS(co
->ifp
)->ptp_dmvpn
;
1086 /* Add pseudo neighbor. */
1087 ospf_nbr_self_reset(oi
, oi
->ospf
->router_id
);
1089 ospf_area_add_if(oi
->area
, oi
);
1091 /* if LDP-IGP Sync is configured globally inherit config */
1092 ospf_ldp_sync_if_init(oi
);
1095 * if router_id is not configured, don't bring up
1097 * ospf_router_id_update() will call ospf_if_update
1098 * whenever r-id is configured instead.
1100 if ((area
->ospf
->router_id
.s_addr
!= INADDR_ANY
)
1101 && if_is_operative(co
->ifp
))
1107 static void update_redistributed(struct ospf
*ospf
, int add_to_ospf
)
1109 struct route_node
*rn
;
1110 struct external_info
*ei
;
1111 struct ospf_external
*ext
;
1113 if (ospf_is_type_redistributed(ospf
, ZEBRA_ROUTE_CONNECT
, 0)) {
1114 ext
= ospf_external_lookup(ospf
, ZEBRA_ROUTE_CONNECT
, 0);
1115 if ((ext
) && EXTERNAL_INFO(ext
)) {
1116 for (rn
= route_top(EXTERNAL_INFO(ext
)); rn
;
1117 rn
= route_next(rn
)) {
1123 if (ospf_external_info_find_lsa(ospf
,
1125 if (!ospf_redistribute_check(
1127 ospf_external_lsa_flush(
1130 ei
->ifindex
/*, ei->nexthop */);
1132 if (!ospf_external_info_find_lsa(
1134 if (ospf_redistribute_check(
1136 ospf_external_lsa_originate(
1144 /* Config network statement related functions. */
1145 static struct ospf_network
*ospf_network_new(struct in_addr area_id
)
1147 struct ospf_network
*new;
1148 new = XCALLOC(MTYPE_OSPF_NETWORK
, sizeof(struct ospf_network
));
1150 new->area_id
= area_id
;
1151 new->area_id_fmt
= OSPF_AREA_ID_FMT_DOTTEDQUAD
;
1156 static void ospf_network_free(struct ospf
*ospf
, struct ospf_network
*network
)
1158 ospf_area_check_free(ospf
, network
->area_id
);
1159 ospf_schedule_abr_task(ospf
);
1160 XFREE(MTYPE_OSPF_NETWORK
, network
);
1163 int ospf_network_set(struct ospf
*ospf
, struct prefix_ipv4
*p
,
1164 struct in_addr area_id
, int df
)
1166 struct ospf_network
*network
;
1167 struct ospf_area
*area
;
1168 struct route_node
*rn
;
1170 rn
= route_node_get(ospf
->networks
, (struct prefix
*)p
);
1173 route_unlock_node(rn
);
1175 if (IPV4_ADDR_SAME(&area_id
, &network
->area_id
)) {
1178 /* There is already same network statement. */
1183 rn
->info
= network
= ospf_network_new(area_id
);
1184 network
->area_id_fmt
= df
;
1185 area
= ospf_area_get(ospf
, area_id
);
1186 ospf_area_display_format_set(ospf
, area
, df
);
1188 /* Run network config now. */
1189 ospf_network_run((struct prefix
*)p
, area
);
1191 /* Update connected redistribute. */
1192 update_redistributed(ospf
, 1); /* interfaces possibly added */
1194 ospf_area_check_free(ospf
, area_id
);
1199 int ospf_network_unset(struct ospf
*ospf
, struct prefix_ipv4
*p
,
1200 struct in_addr area_id
)
1202 struct route_node
*rn
;
1203 struct ospf_network
*network
;
1204 struct listnode
*node
, *nnode
;
1205 struct ospf_interface
*oi
;
1207 rn
= route_node_lookup(ospf
->networks
, (struct prefix
*)p
);
1212 route_unlock_node(rn
);
1213 if (!IPV4_ADDR_SAME(&area_id
, &network
->area_id
))
1216 ospf_network_free(ospf
, rn
->info
);
1218 route_unlock_node(rn
); /* initial reference */
1220 /* Find interfaces that are not configured already. */
1221 for (ALL_LIST_ELEMENTS(ospf
->oiflist
, node
, nnode
, oi
)) {
1223 if (oi
->type
== OSPF_IFTYPE_VIRTUALLINK
)
1226 ospf_network_run_subnet(ospf
, oi
->connected
, NULL
, NULL
);
1229 /* Update connected redistribute. */
1230 update_redistributed(ospf
, 0); /* interfaces possibly removed */
1231 ospf_area_check_free(ospf
, area_id
);
1236 /* Ensure there's an OSPF instance, as "ip ospf area" enabled OSPF means
1237 * there might not be any 'router ospf' config.
1239 * Otherwise, doesn't do anything different to ospf_if_update for now
1241 void ospf_interface_area_set(struct ospf
*ospf
, struct interface
*ifp
)
1246 ospf_if_update(ospf
, ifp
);
1247 /* if_update does a update_redistributed */
1252 void ospf_interface_area_unset(struct ospf
*ospf
, struct interface
*ifp
)
1254 struct route_node
*rn_oi
;
1257 return; /* Ospf not ready yet */
1259 /* Find interfaces that may need to be removed. */
1260 for (rn_oi
= route_top(IF_OIFS(ifp
)); rn_oi
;
1261 rn_oi
= route_next(rn_oi
)) {
1262 struct ospf_interface
*oi
= NULL
;
1264 if ((oi
= rn_oi
->info
) == NULL
)
1267 if (oi
->type
== OSPF_IFTYPE_VIRTUALLINK
)
1270 ospf_network_run_subnet(ospf
, oi
->connected
, NULL
, NULL
);
1273 /* Update connected redistribute. */
1274 update_redistributed(ospf
, 0); /* interfaces possibly removed */
1277 /* Check whether interface matches given network
1278 * returns: 1, true. 0, false
1280 static int ospf_network_match_iface(const struct connected
*co
,
1281 const struct prefix
*net
)
1283 /* new approach: more elegant and conceptually clean */
1284 return prefix_match_network_statement(net
, CONNECTED_PREFIX(co
));
1287 static void ospf_update_interface_area(struct connected
*co
,
1288 struct ospf_area
*area
)
1290 struct ospf_interface
*oi
= ospf_if_table_lookup(co
->ifp
, co
->address
);
1292 /* nothing to be done case */
1293 if (oi
&& oi
->area
== area
) {
1300 add_ospf_interface(co
, area
);
1303 /* Run OSPF for the given subnet, taking into account the following
1304 * possible sources of area configuration, in the given order of preference:
1306 * - Whether there is interface+address specific area configuration
1307 * - Whether there is a default area for the interface
1308 * - Whether there is an area given as a parameter.
1309 * - If no specific network prefix/area is supplied, whether there's
1310 * a matching network configured.
1312 static void ospf_network_run_subnet(struct ospf
*ospf
, struct connected
*co
,
1314 struct ospf_area
*given_area
)
1316 struct ospf_interface
*oi
;
1317 struct ospf_if_params
*params
;
1318 struct ospf_area
*area
= NULL
;
1319 struct route_node
*rn
;
1322 if (CHECK_FLAG(co
->flags
, ZEBRA_IFA_SECONDARY
))
1325 if (co
->address
->family
!= AF_INET
)
1328 /* Try determine the appropriate area for this interface + address
1329 * Start by checking interface config
1331 params
= ospf_lookup_if_params(co
->ifp
, co
->address
->u
.prefix4
);
1332 if (params
&& OSPF_IF_PARAM_CONFIGURED(params
, if_area
))
1333 area
= ospf_area_get(ospf
, params
->if_area
);
1335 params
= IF_DEF_PARAMS(co
->ifp
);
1336 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
))
1337 area
= ospf_area_get(ospf
, params
->if_area
);
1340 /* If we've found an interface and/or addr specific area, then we're
1344 ospf_update_interface_area(co
, area
);
1348 /* Otherwise, only remaining possibility is a matching network statement
1351 assert(given_area
!= NULL
);
1353 /* Which either was supplied as a parameter.. (e.g. cause a new
1354 * network/area was just added)..
1356 if (p
->family
== co
->address
->family
1357 && ospf_network_match_iface(co
, p
))
1358 ospf_update_interface_area(co
, given_area
);
1363 /* Else we have to search the existing network/area config to see
1366 for (rn
= route_top(ospf
->networks
); rn
; rn
= route_next(rn
))
1367 if (rn
->info
!= NULL
&& ospf_network_match_iface(co
, &rn
->p
)) {
1368 struct ospf_network
*network
=
1369 (struct ospf_network
*)rn
->info
;
1370 area
= ospf_area_get(ospf
, network
->area_id
);
1371 ospf_update_interface_area(co
, area
);
1375 /* If the subnet isn't in any area, deconfigure */
1376 if (!configed
&& (oi
= ospf_if_table_lookup(co
->ifp
, co
->address
)))
1380 static void ospf_network_run_interface(struct ospf
*ospf
, struct interface
*ifp
,
1382 struct ospf_area
*given_area
)
1384 struct listnode
*cnode
;
1385 struct connected
*co
;
1387 if (memcmp(ifp
->name
, "VLINK", 5) == 0)
1390 /* Network prefix without area is nonsensical */
1392 assert(given_area
!= NULL
);
1394 /* if interface prefix is match specified prefix,
1395 then create socket and join multicast group. */
1396 for (ALL_LIST_ELEMENTS_RO(ifp
->connected
, cnode
, co
))
1397 ospf_network_run_subnet(ospf
, co
, p
, given_area
);
1400 static void ospf_network_run(struct prefix
*p
, struct ospf_area
*area
)
1402 struct vrf
*vrf
= vrf_lookup_by_id(area
->ospf
->vrf_id
);
1403 struct interface
*ifp
;
1405 /* Schedule Router ID Update. */
1406 if (area
->ospf
->router_id
.s_addr
== INADDR_ANY
)
1407 ospf_router_id_update(area
->ospf
);
1409 /* Get target interface. */
1410 FOR_ALL_INTERFACES (vrf
, ifp
)
1411 ospf_network_run_interface(area
->ospf
, ifp
, p
, area
);
1414 void ospf_ls_upd_queue_empty(struct ospf_interface
*oi
)
1416 struct route_node
*rn
;
1417 struct listnode
*node
, *nnode
;
1419 struct ospf_lsa
*lsa
;
1421 /* empty ls update queue */
1422 for (rn
= route_top(oi
->ls_upd_queue
); rn
; rn
= route_next(rn
))
1423 if ((lst
= (struct list
*)rn
->info
)) {
1424 for (ALL_LIST_ELEMENTS(lst
, node
, nnode
, lsa
))
1425 ospf_lsa_unlock(&lsa
); /* oi->ls_upd_queue */
1430 /* remove update event */
1431 THREAD_OFF(oi
->t_ls_upd_event
);
1434 void ospf_if_update(struct ospf
*ospf
, struct interface
*ifp
)
1440 if (IS_DEBUG_OSPF_EVENT
)
1442 "%s: interface %s vrf %s(%u) ospf vrf %s vrf_id %u router_id %pI4",
1443 __func__
, ifp
->name
, ifp
->vrf
->name
, ifp
->vrf
->vrf_id
,
1444 ospf_vrf_id_to_name(ospf
->vrf_id
), ospf
->vrf_id
,
1447 /* OSPF must be ready. */
1448 if (!ospf_is_ready(ospf
))
1451 ospf_network_run_interface(ospf
, ifp
, NULL
, NULL
);
1453 /* Update connected redistribute. */
1454 update_redistributed(ospf
, 1);
1458 void ospf_remove_vls_through_area(struct ospf
*ospf
, struct ospf_area
*area
)
1460 struct listnode
*node
, *nnode
;
1461 struct ospf_vl_data
*vl_data
;
1463 for (ALL_LIST_ELEMENTS(ospf
->vlinks
, node
, nnode
, vl_data
))
1464 if (IPV4_ADDR_SAME(&vl_data
->vl_area_id
, &area
->area_id
))
1465 ospf_vl_delete(ospf
, vl_data
);
1469 static const struct message ospf_area_type_msg
[] = {
1470 {OSPF_AREA_DEFAULT
, "Default"},
1471 {OSPF_AREA_STUB
, "Stub"},
1472 {OSPF_AREA_NSSA
, "NSSA"},
1475 static void ospf_area_type_set(struct ospf_area
*area
, int type
)
1477 struct listnode
*node
;
1478 struct ospf_interface
*oi
;
1480 if (area
->external_routing
== type
) {
1481 if (IS_DEBUG_OSPF_EVENT
)
1482 zlog_debug("Area[%pI4]: Types are the same, ignored.",
1487 area
->external_routing
= type
;
1489 if (IS_DEBUG_OSPF_EVENT
)
1490 zlog_debug("Area[%pI4]: Configured as %s",
1492 lookup_msg(ospf_area_type_msg
, type
, NULL
));
1494 switch (area
->external_routing
) {
1495 case OSPF_AREA_DEFAULT
:
1496 for (ALL_LIST_ELEMENTS_RO(area
->oiflist
, node
, oi
))
1497 if (oi
->nbr_self
!= NULL
) {
1498 UNSET_FLAG(oi
->nbr_self
->options
,
1500 SET_FLAG(oi
->nbr_self
->options
, OSPF_OPTION_E
);
1503 case OSPF_AREA_STUB
:
1504 for (ALL_LIST_ELEMENTS_RO(area
->oiflist
, node
, oi
))
1505 if (oi
->nbr_self
!= NULL
) {
1506 if (IS_DEBUG_OSPF_EVENT
)
1508 "setting options on %s accordingly",
1510 UNSET_FLAG(oi
->nbr_self
->options
,
1512 UNSET_FLAG(oi
->nbr_self
->options
,
1514 if (IS_DEBUG_OSPF_EVENT
)
1515 zlog_debug("options set on %s: %x",
1516 IF_NAME(oi
), OPTIONS(oi
));
1519 case OSPF_AREA_NSSA
:
1520 for (ALL_LIST_ELEMENTS_RO(area
->oiflist
, node
, oi
))
1521 if (oi
->nbr_self
!= NULL
) {
1523 "setting nssa options on %s accordingly",
1525 UNSET_FLAG(oi
->nbr_self
->options
,
1527 SET_FLAG(oi
->nbr_self
->options
, OSPF_OPTION_NP
);
1528 zlog_debug("options set on %s: %x", IF_NAME(oi
),
1536 ospf_router_lsa_update_area(area
);
1537 ospf_schedule_abr_task(area
->ospf
);
1540 int ospf_area_shortcut_set(struct ospf
*ospf
, struct ospf_area
*area
, int mode
)
1542 if (area
->shortcut_configured
== mode
)
1545 area
->shortcut_configured
= mode
;
1546 ospf_router_lsa_update_area(area
);
1547 ospf_schedule_abr_task(ospf
);
1549 ospf_area_check_free(ospf
, area
->area_id
);
1554 int ospf_area_shortcut_unset(struct ospf
*ospf
, struct ospf_area
*area
)
1556 area
->shortcut_configured
= OSPF_SHORTCUT_DEFAULT
;
1557 ospf_router_lsa_update_area(area
);
1558 ospf_area_check_free(ospf
, area
->area_id
);
1559 ospf_schedule_abr_task(ospf
);
1564 static int ospf_area_vlink_count(struct ospf
*ospf
, struct ospf_area
*area
)
1566 struct ospf_vl_data
*vl
;
1567 struct listnode
*node
;
1570 for (ALL_LIST_ELEMENTS_RO(ospf
->vlinks
, node
, vl
))
1571 if (IPV4_ADDR_SAME(&vl
->vl_area_id
, &area
->area_id
))
1577 int ospf_area_display_format_set(struct ospf
*ospf
, struct ospf_area
*area
,
1580 area
->area_id_fmt
= df
;
1585 int ospf_area_stub_set(struct ospf
*ospf
, struct in_addr area_id
)
1587 struct ospf_area
*area
;
1589 area
= ospf_area_get(ospf
, area_id
);
1590 if (ospf_area_vlink_count(ospf
, area
))
1593 if (area
->external_routing
!= OSPF_AREA_STUB
)
1594 ospf_area_type_set(area
, OSPF_AREA_STUB
);
1599 int ospf_area_stub_unset(struct ospf
*ospf
, struct in_addr area_id
)
1601 struct ospf_area
*area
;
1603 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1607 if (area
->external_routing
== OSPF_AREA_STUB
)
1608 ospf_area_type_set(area
, OSPF_AREA_DEFAULT
);
1610 ospf_area_check_free(ospf
, area_id
);
1615 int ospf_area_no_summary_set(struct ospf
*ospf
, struct in_addr area_id
)
1617 struct ospf_area
*area
;
1619 area
= ospf_area_get(ospf
, area_id
);
1620 area
->no_summary
= 1;
1625 int ospf_area_no_summary_unset(struct ospf
*ospf
, struct in_addr area_id
)
1627 struct ospf_area
*area
;
1629 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1633 area
->no_summary
= 0;
1634 ospf_area_check_free(ospf
, area_id
);
1639 int ospf_area_nssa_no_summary_set(struct ospf
*ospf
, struct in_addr area_id
)
1641 struct ospf_area
*area
;
1643 area
= ospf_area_get(ospf
, area_id
);
1644 if (ospf_area_vlink_count(ospf
, area
))
1647 if (area
->external_routing
!= OSPF_AREA_NSSA
) {
1648 ospf_area_type_set(area
, OSPF_AREA_NSSA
);
1650 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1653 ospf_area_no_summary_set(ospf
, area_id
);
1658 int ospf_area_nssa_set(struct ospf
*ospf
, struct in_addr area_id
)
1660 struct ospf_area
*area
;
1662 area
= ospf_area_get(ospf
, area_id
);
1663 if (ospf_area_vlink_count(ospf
, area
))
1666 if (area
->external_routing
!= OSPF_AREA_NSSA
) {
1667 ospf_area_type_set(area
, OSPF_AREA_NSSA
);
1670 /* set NSSA area defaults */
1671 area
->no_summary
= 0;
1672 area
->suppress_fa
= 0;
1673 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1674 area
->NSSATranslatorState
= OSPF_NSSA_TRANSLATE_DISABLED
;
1675 area
->NSSATranslatorStabilityInterval
=
1676 OSPF_NSSA_TRANS_STABLE_DEFAULT
;
1681 int ospf_area_nssa_unset(struct ospf
*ospf
, struct in_addr area_id
, int argc
)
1683 struct ospf_area
*area
;
1685 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1689 /* argc < 5 -> 'no area x nssa' */
1690 if (argc
< 5 && area
->external_routing
== OSPF_AREA_NSSA
) {
1692 /* set NSSA area defaults */
1693 area
->no_summary
= 0;
1694 area
->suppress_fa
= 0;
1695 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1696 area
->NSSATranslatorState
= OSPF_NSSA_TRANSLATE_DISABLED
;
1697 area
->NSSATranslatorStabilityInterval
=
1698 OSPF_NSSA_TRANS_STABLE_DEFAULT
;
1699 ospf_area_type_set(area
, OSPF_AREA_DEFAULT
);
1701 ospf_area_nssa_translator_role_set(ospf
, area_id
,
1702 OSPF_NSSA_ROLE_CANDIDATE
);
1705 ospf_area_check_free(ospf
, area_id
);
1710 int ospf_area_nssa_suppress_fa_set(struct ospf
*ospf
, struct in_addr area_id
)
1712 struct ospf_area
*area
;
1714 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1718 area
->suppress_fa
= 1;
1723 int ospf_area_nssa_suppress_fa_unset(struct ospf
*ospf
, struct in_addr area_id
)
1725 struct ospf_area
*area
;
1727 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1731 area
->suppress_fa
= 0;
1736 int ospf_area_nssa_translator_role_set(struct ospf
*ospf
,
1737 struct in_addr area_id
, int role
)
1739 struct ospf_area
*area
;
1741 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1745 if (role
!= area
->NSSATranslatorRole
) {
1746 if ((area
->NSSATranslatorRole
== OSPF_NSSA_ROLE_ALWAYS
)
1747 || (role
== OSPF_NSSA_ROLE_ALWAYS
)) {
1749 * if new role is OSPF_NSSA_ROLE_ALWAYS we need to set
1750 * Nt bit, if the role was OSPF_NSSA_ROLE_ALWAYS we need
1753 area
->NSSATranslatorRole
= role
;
1754 ospf_router_lsa_update_area(area
);
1756 area
->NSSATranslatorRole
= role
;
1762 int ospf_area_export_list_set(struct ospf
*ospf
, struct ospf_area
*area
,
1763 const char *list_name
)
1765 struct access_list
*list
;
1766 list
= access_list_lookup(AFI_IP
, list_name
);
1768 EXPORT_LIST(area
) = list
;
1770 if (EXPORT_NAME(area
))
1771 free(EXPORT_NAME(area
));
1773 EXPORT_NAME(area
) = strdup(list_name
);
1774 ospf_schedule_abr_task(ospf
);
1779 int ospf_area_export_list_unset(struct ospf
*ospf
, struct ospf_area
*area
)
1782 EXPORT_LIST(area
) = 0;
1784 if (EXPORT_NAME(area
))
1785 free(EXPORT_NAME(area
));
1787 EXPORT_NAME(area
) = NULL
;
1789 ospf_area_check_free(ospf
, area
->area_id
);
1791 ospf_schedule_abr_task(ospf
);
1796 int ospf_area_import_list_set(struct ospf
*ospf
, struct ospf_area
*area
,
1799 struct access_list
*list
;
1800 list
= access_list_lookup(AFI_IP
, name
);
1802 IMPORT_LIST(area
) = list
;
1804 if (IMPORT_NAME(area
))
1805 free(IMPORT_NAME(area
));
1807 IMPORT_NAME(area
) = strdup(name
);
1808 ospf_schedule_abr_task(ospf
);
1813 int ospf_area_import_list_unset(struct ospf
*ospf
, struct ospf_area
*area
)
1815 IMPORT_LIST(area
) = 0;
1817 if (IMPORT_NAME(area
))
1818 free(IMPORT_NAME(area
));
1820 IMPORT_NAME(area
) = NULL
;
1821 ospf_area_check_free(ospf
, area
->area_id
);
1823 ospf_schedule_abr_task(ospf
);
1828 int ospf_timers_refresh_set(struct ospf
*ospf
, int interval
)
1832 if (ospf
->lsa_refresh_interval
== interval
)
1835 time_left
= ospf
->lsa_refresh_interval
1836 - (monotime(NULL
) - ospf
->lsa_refresher_started
);
1838 if (time_left
> interval
) {
1839 THREAD_OFF(ospf
->t_lsa_refresher
);
1840 thread_add_timer(master
, ospf_lsa_refresh_walker
, ospf
,
1841 interval
, &ospf
->t_lsa_refresher
);
1843 ospf
->lsa_refresh_interval
= interval
;
1848 int ospf_timers_refresh_unset(struct ospf
*ospf
)
1852 time_left
= ospf
->lsa_refresh_interval
1853 - (monotime(NULL
) - ospf
->lsa_refresher_started
);
1855 if (time_left
> OSPF_LSA_REFRESH_INTERVAL_DEFAULT
) {
1856 THREAD_OFF(ospf
->t_lsa_refresher
);
1857 ospf
->t_lsa_refresher
= NULL
;
1858 thread_add_timer(master
, ospf_lsa_refresh_walker
, ospf
,
1859 OSPF_LSA_REFRESH_INTERVAL_DEFAULT
,
1860 &ospf
->t_lsa_refresher
);
1863 ospf
->lsa_refresh_interval
= OSPF_LSA_REFRESH_INTERVAL_DEFAULT
;
1869 static struct ospf_nbr_nbma
*ospf_nbr_nbma_new(void)
1871 struct ospf_nbr_nbma
*nbr_nbma
;
1873 nbr_nbma
= XCALLOC(MTYPE_OSPF_NEIGHBOR_STATIC
,
1874 sizeof(struct ospf_nbr_nbma
));
1876 nbr_nbma
->priority
= OSPF_NEIGHBOR_PRIORITY_DEFAULT
;
1877 nbr_nbma
->v_poll
= OSPF_POLL_INTERVAL_DEFAULT
;
1882 static void ospf_nbr_nbma_free(struct ospf_nbr_nbma
*nbr_nbma
)
1884 XFREE(MTYPE_OSPF_NEIGHBOR_STATIC
, nbr_nbma
);
1887 static void ospf_nbr_nbma_delete(struct ospf
*ospf
,
1888 struct ospf_nbr_nbma
*nbr_nbma
)
1890 struct route_node
*rn
;
1891 struct prefix_ipv4 p
;
1894 p
.prefix
= nbr_nbma
->addr
;
1895 p
.prefixlen
= IPV4_MAX_BITLEN
;
1897 rn
= route_node_lookup(ospf
->nbr_nbma
, (struct prefix
*)&p
);
1899 ospf_nbr_nbma_free(rn
->info
);
1901 route_unlock_node(rn
);
1902 route_unlock_node(rn
);
1906 static void ospf_nbr_nbma_down(struct ospf_nbr_nbma
*nbr_nbma
)
1908 THREAD_OFF(nbr_nbma
->t_poll
);
1910 if (nbr_nbma
->nbr
) {
1911 nbr_nbma
->nbr
->nbr_nbma
= NULL
;
1912 OSPF_NSM_EVENT_EXECUTE(nbr_nbma
->nbr
, NSM_KillNbr
);
1916 listnode_delete(nbr_nbma
->oi
->nbr_nbma
, nbr_nbma
);
1919 static void ospf_nbr_nbma_add(struct ospf_nbr_nbma
*nbr_nbma
,
1920 struct ospf_interface
*oi
)
1922 struct ospf_neighbor
*nbr
;
1923 struct route_node
*rn
;
1926 if (oi
->type
!= OSPF_IFTYPE_NBMA
)
1929 if (nbr_nbma
->nbr
!= NULL
)
1932 if (IPV4_ADDR_SAME(&oi
->nbr_self
->address
.u
.prefix4
, &nbr_nbma
->addr
))
1936 listnode_add(oi
->nbr_nbma
, nbr_nbma
);
1938 /* Get neighbor information from table. */
1940 p
.prefixlen
= IPV4_MAX_BITLEN
;
1941 p
.u
.prefix4
= nbr_nbma
->addr
;
1943 rn
= route_node_get(oi
->nbrs
, &p
);
1946 nbr
->nbr_nbma
= nbr_nbma
;
1947 nbr_nbma
->nbr
= nbr
;
1949 route_unlock_node(rn
);
1951 nbr
= rn
->info
= ospf_nbr_new(oi
);
1952 nbr
->state
= NSM_Down
;
1953 nbr
->src
= nbr_nbma
->addr
;
1954 nbr
->nbr_nbma
= nbr_nbma
;
1955 nbr
->priority
= nbr_nbma
->priority
;
1958 nbr_nbma
->nbr
= nbr
;
1960 /* Configure BFD if interface has it. */
1961 ospf_neighbor_bfd_apply(nbr
);
1963 OSPF_NSM_EVENT_EXECUTE(nbr
, NSM_Start
);
1967 void ospf_nbr_nbma_if_update(struct ospf
*ospf
, struct ospf_interface
*oi
)
1969 struct ospf_nbr_nbma
*nbr_nbma
;
1970 struct route_node
*rn
;
1971 struct prefix_ipv4 p
;
1973 if (oi
->type
!= OSPF_IFTYPE_NBMA
)
1976 for (rn
= route_top(ospf
->nbr_nbma
); rn
; rn
= route_next(rn
))
1977 if ((nbr_nbma
= rn
->info
))
1978 if (nbr_nbma
->oi
== NULL
&& nbr_nbma
->nbr
== NULL
) {
1980 p
.prefix
= nbr_nbma
->addr
;
1981 p
.prefixlen
= IPV4_MAX_BITLEN
;
1983 if (prefix_match(oi
->address
,
1984 (struct prefix
*)&p
))
1985 ospf_nbr_nbma_add(nbr_nbma
, oi
);
1989 struct ospf_nbr_nbma
*ospf_nbr_nbma_lookup(struct ospf
*ospf
,
1990 struct in_addr nbr_addr
)
1992 struct route_node
*rn
;
1993 struct prefix_ipv4 p
;
1996 p
.prefix
= nbr_addr
;
1997 p
.prefixlen
= IPV4_MAX_BITLEN
;
1999 rn
= route_node_lookup(ospf
->nbr_nbma
, (struct prefix
*)&p
);
2001 route_unlock_node(rn
);
2007 int ospf_nbr_nbma_set(struct ospf
*ospf
, struct in_addr nbr_addr
)
2009 struct ospf_nbr_nbma
*nbr_nbma
;
2010 struct ospf_interface
*oi
;
2011 struct prefix_ipv4 p
;
2012 struct route_node
*rn
;
2013 struct listnode
*node
;
2015 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
2019 nbr_nbma
= ospf_nbr_nbma_new();
2020 nbr_nbma
->addr
= nbr_addr
;
2023 p
.prefix
= nbr_addr
;
2024 p
.prefixlen
= IPV4_MAX_BITLEN
;
2026 rn
= route_node_get(ospf
->nbr_nbma
, (struct prefix
*)&p
);
2028 route_unlock_node(rn
);
2029 rn
->info
= nbr_nbma
;
2031 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
2032 if (oi
->type
== OSPF_IFTYPE_NBMA
)
2033 if (prefix_match(oi
->address
, (struct prefix
*)&p
)) {
2034 ospf_nbr_nbma_add(nbr_nbma
, oi
);
2042 int ospf_nbr_nbma_unset(struct ospf
*ospf
, struct in_addr nbr_addr
)
2044 struct ospf_nbr_nbma
*nbr_nbma
;
2046 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
2047 if (nbr_nbma
== NULL
)
2050 ospf_nbr_nbma_down(nbr_nbma
);
2051 ospf_nbr_nbma_delete(ospf
, nbr_nbma
);
2056 int ospf_nbr_nbma_priority_set(struct ospf
*ospf
, struct in_addr nbr_addr
,
2059 struct ospf_nbr_nbma
*nbr_nbma
;
2061 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
2062 if (nbr_nbma
== NULL
)
2065 if (nbr_nbma
->priority
!= priority
)
2066 nbr_nbma
->priority
= priority
;
2071 int ospf_nbr_nbma_priority_unset(struct ospf
*ospf
, struct in_addr nbr_addr
)
2073 struct ospf_nbr_nbma
*nbr_nbma
;
2075 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
2076 if (nbr_nbma
== NULL
)
2079 if (nbr_nbma
!= OSPF_NEIGHBOR_PRIORITY_DEFAULT
)
2080 nbr_nbma
->priority
= OSPF_NEIGHBOR_PRIORITY_DEFAULT
;
2085 int ospf_nbr_nbma_poll_interval_set(struct ospf
*ospf
, struct in_addr nbr_addr
,
2086 unsigned int interval
)
2088 struct ospf_nbr_nbma
*nbr_nbma
;
2090 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
2091 if (nbr_nbma
== NULL
)
2094 if (nbr_nbma
->v_poll
!= interval
) {
2095 nbr_nbma
->v_poll
= interval
;
2096 if (nbr_nbma
->oi
&& ospf_if_is_up(nbr_nbma
->oi
)) {
2097 THREAD_OFF(nbr_nbma
->t_poll
);
2098 OSPF_POLL_TIMER_ON(nbr_nbma
->t_poll
, ospf_poll_timer
,
2106 int ospf_nbr_nbma_poll_interval_unset(struct ospf
*ospf
, struct in_addr addr
)
2108 struct ospf_nbr_nbma
*nbr_nbma
;
2110 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, addr
);
2111 if (nbr_nbma
== NULL
)
2114 if (nbr_nbma
->v_poll
!= OSPF_POLL_INTERVAL_DEFAULT
)
2115 nbr_nbma
->v_poll
= OSPF_POLL_INTERVAL_DEFAULT
;
2120 void ospf_master_init(struct thread_master
*master
)
2122 memset(&ospf_master
, 0, sizeof(ospf_master
));
2125 om
->ospf
= list_new();
2126 om
->master
= master
;
2129 /* Link OSPF instance to VRF. */
2130 void ospf_vrf_link(struct ospf
*ospf
, struct vrf
*vrf
)
2132 ospf
->vrf_id
= vrf
->vrf_id
;
2133 if (vrf
->info
!= (void *)ospf
)
2134 vrf
->info
= (void *)ospf
;
2137 /* Unlink OSPF instance from VRF. */
2138 void ospf_vrf_unlink(struct ospf
*ospf
, struct vrf
*vrf
)
2140 if (vrf
->info
== (void *)ospf
)
2142 ospf
->vrf_id
= VRF_UNKNOWN
;
2145 /* This is hook function for vrf create called as part of vrf_init */
2146 static int ospf_vrf_new(struct vrf
*vrf
)
2148 if (IS_DEBUG_OSPF_EVENT
)
2149 zlog_debug("%s: VRF Created: %s(%u)", __func__
, vrf
->name
,
2155 /* This is hook function for vrf delete call as part of vrf_init */
2156 static int ospf_vrf_delete(struct vrf
*vrf
)
2158 if (IS_DEBUG_OSPF_EVENT
)
2159 zlog_debug("%s: VRF Deletion: %s(%u)", __func__
, vrf
->name
,
2165 static void ospf_set_redist_vrf_bitmaps(struct ospf
*ospf
, bool set
)
2168 struct list
*red_list
;
2170 for (type
= 0; type
< ZEBRA_ROUTE_MAX
; type
++) {
2171 red_list
= ospf
->redist
[type
];
2174 if (IS_DEBUG_OSPF_EVENT
)
2176 "%s: setting redist vrf %d bitmap for type %d",
2177 __func__
, ospf
->vrf_id
, type
);
2179 vrf_bitmap_set(zclient
->redist
[AFI_IP
][type
],
2182 vrf_bitmap_unset(zclient
->redist
[AFI_IP
][type
],
2186 red_list
= ospf
->redist
[DEFAULT_ROUTE
];
2189 vrf_bitmap_set(zclient
->default_information
[AFI_IP
],
2192 vrf_bitmap_unset(zclient
->default_information
[AFI_IP
],
2197 /* Enable OSPF VRF instance */
2198 static int ospf_vrf_enable(struct vrf
*vrf
)
2200 struct ospf
*ospf
= NULL
;
2201 vrf_id_t old_vrf_id
;
2204 if (IS_DEBUG_OSPF_EVENT
)
2205 zlog_debug("%s: VRF %s id %u enabled", __func__
, vrf
->name
,
2208 ospf
= ospf_lookup_by_name(vrf
->name
);
2210 old_vrf_id
= ospf
->vrf_id
;
2211 /* We have instance configured, link to VRF and make it "up". */
2212 ospf_vrf_link(ospf
, vrf
);
2213 if (IS_DEBUG_OSPF_EVENT
)
2215 "%s: ospf linked to vrf %s vrf_id %u (old id %u)",
2216 __func__
, vrf
->name
, ospf
->vrf_id
, old_vrf_id
);
2218 if (old_vrf_id
!= ospf
->vrf_id
) {
2219 ospf_set_redist_vrf_bitmaps(ospf
, true);
2221 /* start zebra redist to us for new vrf */
2222 ospf_zebra_vrf_register(ospf
);
2224 ret
= ospf_sock_init(ospf
);
2225 if (ret
< 0 || ospf
->fd
<= 0)
2227 thread_add_read(master
, ospf_read
, ospf
, ospf
->fd
,
2229 ospf
->oi_running
= 1;
2230 ospf_router_id_update(ospf
);
2237 /* Disable OSPF VRF instance */
2238 static int ospf_vrf_disable(struct vrf
*vrf
)
2240 struct ospf
*ospf
= NULL
;
2241 vrf_id_t old_vrf_id
= VRF_UNKNOWN
;
2243 if (vrf
->vrf_id
== VRF_DEFAULT
)
2246 if (IS_DEBUG_OSPF_EVENT
)
2247 zlog_debug("%s: VRF %s id %d disabled.", __func__
, vrf
->name
,
2250 ospf
= ospf_lookup_by_name(vrf
->name
);
2252 old_vrf_id
= ospf
->vrf_id
;
2254 ospf_zebra_vrf_deregister(ospf
);
2256 ospf_set_redist_vrf_bitmaps(ospf
, false);
2258 /* We have instance configured, unlink
2259 * from VRF and make it "down".
2261 ospf_vrf_unlink(ospf
, vrf
);
2262 ospf
->oi_running
= 0;
2263 if (IS_DEBUG_OSPF_EVENT
)
2264 zlog_debug("%s: ospf old_vrf_id %d unlinked", __func__
,
2266 THREAD_OFF(ospf
->t_read
);
2271 /* Note: This is a callback, the VRF will be deleted by the caller. */
2275 void ospf_vrf_init(void)
2277 vrf_init(ospf_vrf_new
, ospf_vrf_enable
, ospf_vrf_disable
,
2281 void ospf_vrf_terminate(void)
2286 const char *ospf_vrf_id_to_name(vrf_id_t vrf_id
)
2288 struct vrf
*vrf
= vrf_lookup_by_id(vrf_id
);
2290 return vrf
? vrf
->name
: "NIL";
2293 const char *ospf_get_name(const struct ospf
*ospf
)
2298 return VRF_DEFAULT_NAME
;