1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /* OSPF version 2 daemon program.
3 * Copyright (C) 1999, 2000 Toshiaki Takada
18 #include "sockunion.h" /* for inet_aton () */
26 #include "lib_errors.h"
29 #include "ospfd/ospfd.h"
30 #include "ospfd/ospf_bfd.h"
31 #include "ospfd/ospf_network.h"
32 #include "ospfd/ospf_interface.h"
33 #include "ospfd/ospf_ism.h"
34 #include "ospfd/ospf_asbr.h"
35 #include "ospfd/ospf_lsa.h"
36 #include "ospfd/ospf_lsdb.h"
37 #include "ospfd/ospf_neighbor.h"
38 #include "ospfd/ospf_nsm.h"
39 #include "ospfd/ospf_spf.h"
40 #include "ospfd/ospf_packet.h"
41 #include "ospfd/ospf_dump.h"
42 #include "ospfd/ospf_route.h"
43 #include "ospfd/ospf_zebra.h"
44 #include "ospfd/ospf_abr.h"
45 #include "ospfd/ospf_flood.h"
46 #include "ospfd/ospf_ase.h"
47 #include "ospfd/ospf_ldp_sync.h"
48 #include "ospfd/ospf_gr.h"
49 #include "ospfd/ospf_apiserver.h"
52 DEFINE_QOBJ_TYPE(ospf
);
54 /* OSPF process wide configuration. */
55 static struct ospf_master ospf_master
;
57 /* OSPF process wide configuration pointer to export. */
58 struct ospf_master
*om
;
60 unsigned short ospf_instance
;
62 extern struct zclient
*zclient
;
65 static void ospf_remove_vls_through_area(struct ospf
*, struct ospf_area
*);
66 static void ospf_network_free(struct ospf
*, struct ospf_network
*);
67 static void ospf_area_free(struct ospf_area
*);
68 static void ospf_network_run(struct prefix
*, struct ospf_area
*);
69 static void ospf_network_run_interface(struct ospf
*, struct interface
*,
70 struct prefix
*, struct ospf_area
*);
71 static void ospf_network_run_subnet(struct ospf
*, struct connected
*,
72 struct prefix
*, struct ospf_area
*);
73 static int ospf_network_match_iface(const struct connected
*,
74 const struct prefix
*);
75 static void ospf_finish_final(struct ospf
*);
77 /* API to clean refresh queues and LSAs */
78 static void ospf_free_refresh_queue(struct ospf
*ospf
)
80 for (int i
= 0; i
< OSPF_LSA_REFRESHER_SLOTS
; i
++) {
81 struct list
*list
= ospf
->lsa_refresh_queue
.qs
[i
];
82 struct listnode
*node
, *nnode
;
86 for (ALL_LIST_ELEMENTS(list
, node
, nnode
, lsa
)) {
87 listnode_delete(list
, lsa
);
88 lsa
->refresh_list
= -1;
89 ospf_lsa_unlock(&lsa
);
92 ospf
->lsa_refresh_queue
.qs
[i
] = NULL
;
96 #define OSPF_EXTERNAL_LSA_ORIGINATE_DELAY 1
98 int p_spaces_compare_func(const struct p_space
*a
, const struct p_space
*b
)
100 if (a
->protected_resource
->type
== OSPF_TI_LFA_LINK_PROTECTION
101 && b
->protected_resource
->type
== OSPF_TI_LFA_LINK_PROTECTION
)
102 return (a
->protected_resource
->link
->link_id
.s_addr
103 - b
->protected_resource
->link
->link_id
.s_addr
);
105 if (a
->protected_resource
->type
== OSPF_TI_LFA_NODE_PROTECTION
106 && b
->protected_resource
->type
== OSPF_TI_LFA_NODE_PROTECTION
)
107 return (a
->protected_resource
->router_id
.s_addr
108 - b
->protected_resource
->router_id
.s_addr
);
110 /* This should not happen */
114 int q_spaces_compare_func(const struct q_space
*a
, const struct q_space
*b
)
116 return (a
->root
->id
.s_addr
- b
->root
->id
.s_addr
);
119 DECLARE_RBTREE_UNIQ(p_spaces
, struct p_space
, p_spaces_item
,
120 p_spaces_compare_func
);
122 void ospf_process_refresh_data(struct ospf
*ospf
, bool reset
)
124 struct vrf
*vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
125 struct in_addr router_id
, router_id_old
;
126 struct ospf_interface
*oi
;
127 struct interface
*ifp
;
128 struct listnode
*node
, *nnode
;
129 struct ospf_area
*area
;
130 bool rid_change
= false;
132 if (!ospf
->oi_running
) {
133 if (IS_DEBUG_OSPF_EVENT
)
135 "Router ospf not configured -- Router-ID update postponed");
139 if (IS_DEBUG_OSPF_EVENT
)
140 zlog_debug("Router-ID[OLD:%pI4]: Update",
143 router_id_old
= ospf
->router_id
;
145 /* Select the router ID based on these priorities:
146 1. Statically assigned router ID is always the first choice.
147 2. If there is no statically assigned router ID, then try to stick
148 with the most recent value, since changing router ID's is very
150 3. Last choice: just go with whatever the zebra daemon recommends.
152 if (ospf
->router_id_static
.s_addr
!= INADDR_ANY
)
153 router_id
= ospf
->router_id_static
;
154 else if (ospf
->router_id
.s_addr
!= INADDR_ANY
)
155 router_id
= ospf
->router_id
;
157 router_id
= ospf
->router_id_zebra
;
159 if (IS_DEBUG_OSPF_EVENT
)
160 zlog_debug("Router-ID[OLD:%pI4]: Update to %pI4",
161 &ospf
->router_id
, &router_id
);
163 rid_change
= !(IPV4_ADDR_SAME(&router_id_old
, &router_id
));
164 if (rid_change
|| (reset
)) {
165 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
166 /* Some nbrs are identified by router_id, these needs
167 * to be rebuilt. Possible optimization would be to do
168 * oi->nbr_self->router_id = router_id for
169 * !(virtual | ptop) links
171 ospf_nbr_self_reset(oi
, router_id
);
174 * If the old router id was not set, but now it
175 * is and the interface is operative and the
176 * state is ISM_Down we should kick the state
177 * machine as that we processed the interfaces
178 * based upon the network statement( or intf config )
179 * but could not start it at that time.
181 if (if_is_operative(oi
->ifp
) && oi
->state
== ISM_Down
182 && router_id_old
.s_addr
== INADDR_ANY
)
186 /* Flush (inline) all the self originated LSAs */
187 ospf_flush_self_originated_lsas_now(ospf
);
189 ospf
->router_id
= router_id
;
190 if (IS_DEBUG_OSPF_EVENT
)
191 zlog_debug("Router-ID[NEW:%pI4]: Update",
194 /* Flush (inline) all external LSAs which now match the new
196 need to adjust the OSPF_LSA_SELF flag, so the flush doesn't
198 asserts in ospf_refresher_unregister_lsa(). This step is
200 because the current frr code does look-up for
202 based on the self router-id alone but expects OSPF_LSA_SELF
206 struct route_node
*rn
;
207 struct ospf_lsa
*lsa
;
209 LSDB_LOOP (EXTERNAL_LSDB(ospf
), rn
, lsa
) {
210 /* AdvRouter and Router ID is the same. */
211 if (IPV4_ADDR_SAME(&lsa
->data
->adv_router
,
212 &ospf
->router_id
) && rid_change
) {
214 OSPF_LSA_SELF_CHECKED
);
215 SET_FLAG(lsa
->flags
, OSPF_LSA_SELF
);
216 ospf_lsa_flush_schedule(ospf
, lsa
);
218 /* The above flush will send immediately
219 * So discard the LSA to originate new
221 ospf_discard_from_db(ospf
, ospf
->lsdb
, lsa
);
224 LSDB_LOOP (OPAQUE_AS_LSDB(ospf
), rn
, lsa
)
225 ospf_discard_from_db(ospf
, ospf
->lsdb
, lsa
);
227 ospf_lsdb_delete_all(ospf
->lsdb
);
230 /* Since the LSAs are deleted, need reset the aggr flag */
231 ospf_unset_all_aggr_flag(ospf
);
233 /* Delete the LSDB */
234 for (ALL_LIST_ELEMENTS(ospf
->areas
, node
, nnode
, area
))
235 ospf_area_lsdb_discard_delete(area
);
237 /* update router-lsa's for each area */
238 ospf_router_lsa_update(ospf
);
240 /* update ospf_interface's */
241 FOR_ALL_INTERFACES (vrf
, ifp
) {
245 ospf_if_update(ospf
, ifp
);
248 ospf_external_lsa_rid_change(ospf
);
250 #ifdef SUPPORT_OSPF_API
251 ospf_apiserver_clients_notify_router_id_change(router_id
);
255 ospf
->inst_shutdown
= 0;
258 void ospf_router_id_update(struct ospf
*ospf
)
260 ospf_process_refresh_data(ospf
, false);
263 void ospf_process_reset(struct ospf
*ospf
)
265 ospf_process_refresh_data(ospf
, true);
268 void ospf_neighbor_reset(struct ospf
*ospf
, struct in_addr nbr_id
,
271 struct route_node
*rn
;
272 struct ospf_neighbor
*nbr
;
273 struct ospf_interface
*oi
;
274 struct listnode
*node
;
276 /* Clear only a particular nbr with nbr router id as nbr_id */
277 if (nbr_str
!= NULL
) {
278 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
279 nbr
= ospf_nbr_lookup_by_routerid(oi
->nbrs
, &nbr_id
);
281 OSPF_NSM_EVENT_EXECUTE(nbr
, NSM_KillNbr
);
286 /* send Neighbor event KillNbr to all associated neighbors. */
287 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
288 for (rn
= route_top(oi
->nbrs
); rn
; rn
= route_next(rn
)) {
290 if (nbr
&& (nbr
!= oi
->nbr_self
))
291 OSPF_NSM_EVENT_EXECUTE(nbr
, NSM_KillNbr
);
296 /* For OSPF area sort by area id. */
297 static int ospf_area_id_cmp(struct ospf_area
*a1
, struct ospf_area
*a2
)
299 if (ntohl(a1
->area_id
.s_addr
) > ntohl(a2
->area_id
.s_addr
))
301 if (ntohl(a1
->area_id
.s_addr
) < ntohl(a2
->area_id
.s_addr
))
306 static void ospf_add(struct ospf
*ospf
)
308 listnode_add(om
->ospf
, ospf
);
311 static void ospf_delete(struct ospf
*ospf
)
313 listnode_delete(om
->ospf
, ospf
);
316 struct ospf
*ospf_new_alloc(unsigned short instance
, const char *name
)
319 struct vrf
*vrf
= NULL
;
321 struct ospf
*new = XCALLOC(MTYPE_OSPF_TOP
, sizeof(struct ospf
));
323 new->instance
= instance
;
324 new->router_id
.s_addr
= htonl(0);
325 new->router_id_static
.s_addr
= htonl(0);
327 vrf
= vrf_lookup_by_name(name
);
329 new->vrf_id
= vrf
->vrf_id
;
331 new->vrf_id
= VRF_UNKNOWN
;
333 /* Freed in ospf_finish_final */
334 new->name
= XSTRDUP(MTYPE_OSPF_TOP
, name
);
335 if (IS_DEBUG_OSPF_EVENT
)
337 "%s: Create new ospf instance with vrf_name %s vrf_id %u",
338 __func__
, name
, new->vrf_id
);
341 ospf_vrf_link(new, vrf
);
343 ospf_zebra_vrf_register(new);
345 new->abr_type
= OSPF_ABR_DEFAULT
;
346 new->oiflist
= list_new();
347 new->vlinks
= list_new();
348 new->areas
= list_new();
349 new->areas
->cmp
= (int (*)(void *, void *))ospf_area_id_cmp
;
350 new->networks
= route_table_init();
351 new->nbr_nbma
= route_table_init();
353 new->lsdb
= ospf_lsdb_new();
355 new->default_originate
= DEFAULT_ORIGINATE_NONE
;
357 new->passive_interface_default
= OSPF_IF_ACTIVE
;
359 new->new_external_route
= route_table_init();
360 new->old_external_route
= route_table_init();
361 new->external_lsas
= route_table_init();
363 new->stub_router_startup_time
= OSPF_STUB_ROUTER_UNCONFIGURED
;
364 new->stub_router_shutdown_time
= OSPF_STUB_ROUTER_UNCONFIGURED
;
365 new->stub_router_admin_set
= OSPF_STUB_ROUTER_ADMINISTRATIVE_UNSET
;
367 /* Distribute parameter init. */
368 for (i
= 0; i
<= ZEBRA_ROUTE_MAX
; i
++) {
371 new->default_metric
= -1;
372 new->ref_bandwidth
= OSPF_DEFAULT_REF_BANDWIDTH
;
375 new->min_ls_interval
= OSPF_MIN_LS_INTERVAL
;
376 new->min_ls_arrival
= OSPF_MIN_LS_ARRIVAL
;
378 /* SPF timer value init. */
379 new->spf_delay
= OSPF_SPF_DELAY_DEFAULT
;
380 new->spf_holdtime
= OSPF_SPF_HOLDTIME_DEFAULT
;
381 new->spf_max_holdtime
= OSPF_SPF_MAX_HOLDTIME_DEFAULT
;
382 new->spf_hold_multiplier
= 1;
385 new->maxage_delay
= OSPF_LSA_MAXAGE_REMOVE_DELAY_DEFAULT
;
386 new->maxage_lsa
= route_table_init();
387 new->t_maxage_walker
= NULL
;
388 thread_add_timer(master
, ospf_lsa_maxage_walker
, new,
389 OSPF_LSA_MAXAGE_CHECK_INTERVAL
, &new->t_maxage_walker
);
391 /* Max paths initialization */
392 new->max_multipath
= MULTIPATH_NUM
;
394 /* Distance table init. */
395 new->distance_table
= route_table_init();
397 new->lsa_refresh_queue
.index
= 0;
398 new->lsa_refresh_interval
= OSPF_LSA_REFRESH_INTERVAL_DEFAULT
;
399 new->lsa_refresh_timer
= OSPF_LS_REFRESH_TIME
;
400 new->t_lsa_refresher
= NULL
;
401 thread_add_timer(master
, ospf_lsa_refresh_walker
, new,
402 new->lsa_refresh_interval
, &new->t_lsa_refresher
);
403 new->lsa_refresher_started
= monotime(NULL
);
405 new->ibuf
= stream_new(OSPF_MAX_PACKET_SIZE
+ 1);
408 new->oi_write_q
= list_new();
409 new->write_oi_count
= OSPF_WRITE_INTERFACE_COUNT_DEFAULT
;
411 new->proactive_arp
= OSPF_PROACTIVE_ARP_DEFAULT
;
413 ospf_gr_helper_instance_init(new);
415 ospf_asbr_external_aggregator_init(new);
417 ospf_opaque_type11_lsa_init(new);
426 /* Allocate new ospf structure. */
427 static struct ospf
*ospf_new(unsigned short instance
, const char *name
)
431 new = ospf_new_alloc(instance
, name
);
434 if (new->vrf_id
== VRF_UNKNOWN
)
437 if ((ospf_sock_init(new)) < 0) {
438 flog_err(EC_LIB_SOCKET
,
439 "%s: ospf_sock_init is unable to open a socket",
444 thread_add_read(master
, ospf_read
, new, new->fd
, &new->t_read
);
447 ospf_router_id_update(new);
450 * Read from non-volatile memory whether this instance is performing a
451 * graceful restart or not.
453 ospf_gr_nvm_read(new);
455 new->fr_configured
= false;
460 struct ospf
*ospf_lookup_instance(unsigned short instance
)
463 struct listnode
*node
, *nnode
;
465 if (listcount(om
->ospf
) == 0)
468 for (ALL_LIST_ELEMENTS(om
->ospf
, node
, nnode
, ospf
))
469 if ((ospf
->instance
== 0 && instance
== 0)
470 || (ospf
->instance
&& instance
471 && ospf
->instance
== instance
))
477 static int ospf_is_ready(struct ospf
*ospf
)
479 /* OSPF must be on and Router-ID must be configured. */
480 if (!ospf
|| ospf
->router_id
.s_addr
== INADDR_ANY
)
486 struct ospf
*ospf_lookup_by_inst_name(unsigned short instance
, const char *name
)
488 struct ospf
*ospf
= NULL
;
489 struct listnode
*node
, *nnode
;
491 for (ALL_LIST_ELEMENTS(om
->ospf
, node
, nnode
, ospf
)) {
492 if ((ospf
->instance
== instance
)
493 && ((ospf
->name
== NULL
&& name
== NULL
)
494 || (ospf
->name
&& name
495 && strcmp(ospf
->name
, name
) == 0)))
501 struct ospf
*ospf_lookup(unsigned short instance
, const char *name
)
506 ospf
= ospf_lookup_instance(instance
);
508 ospf
= ospf_lookup_by_inst_name(instance
, name
);
514 struct ospf
*ospf_get(unsigned short instance
, const char *name
, bool *created
)
518 ospf
= ospf_lookup(instance
, name
);
520 *created
= (ospf
== NULL
);
522 ospf
= ospf_new(instance
, name
);
527 struct ospf
*ospf_lookup_by_vrf_id(vrf_id_t vrf_id
)
529 struct vrf
*vrf
= NULL
;
531 vrf
= vrf_lookup_by_id(vrf_id
);
534 return (vrf
->info
) ? (struct ospf
*)vrf
->info
: NULL
;
537 uint32_t ospf_count_area_params(struct ospf
*ospf
)
540 struct interface
*ifp
;
543 if (ospf
->vrf_id
!= VRF_UNKNOWN
) {
544 vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
546 FOR_ALL_INTERFACES (vrf
, ifp
) {
547 count
+= ospf_if_count_area_params(ifp
);
554 /* It should only be used when processing incoming info update from zebra.
555 * Other situations, it is not sufficient to lookup the ospf instance by
556 * vrf_name only without using the instance number.
558 static struct ospf
*ospf_lookup_by_name(const char *vrf_name
)
560 struct ospf
*ospf
= NULL
;
561 struct listnode
*node
, *nnode
;
563 for (ALL_LIST_ELEMENTS(om
->ospf
, node
, nnode
, ospf
))
564 if ((ospf
->name
== NULL
&& vrf_name
== NULL
)
565 || (ospf
->name
&& vrf_name
566 && strcmp(ospf
->name
, vrf_name
) == 0))
571 /* Handle the second half of deferred shutdown. This is called either
572 * from the deferred-shutdown timer thread, or directly through
573 * ospf_deferred_shutdown_check.
575 * Function is to cleanup G-R state, if required then call ospf_finish_final
576 * to complete shutdown of this ospf instance. Possibly exit if the
577 * whole process is being shutdown and this was the last OSPF instance.
579 static void ospf_deferred_shutdown_finish(struct ospf
*ospf
)
581 ospf
->stub_router_shutdown_time
= OSPF_STUB_ROUTER_UNCONFIGURED
;
582 THREAD_OFF(ospf
->t_deferred_shutdown
);
584 ospf_finish_final(ospf
);
586 /* *ospf is now invalid */
588 /* ospfd being shut-down? If so, was this the last ospf instance? */
589 if (CHECK_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
)
590 && (listcount(om
->ospf
) == 0)) {
598 /* Timer thread for G-R */
599 static void ospf_deferred_shutdown_timer(struct thread
*t
)
601 struct ospf
*ospf
= THREAD_ARG(t
);
603 ospf_deferred_shutdown_finish(ospf
);
606 /* Check whether deferred-shutdown must be scheduled, otherwise call
607 * down directly into second-half of instance shutdown.
609 static void ospf_deferred_shutdown_check(struct ospf
*ospf
)
611 unsigned long timeout
;
613 struct ospf_area
*area
;
615 /* deferred shutdown already running? */
616 if (ospf
->t_deferred_shutdown
)
619 /* Should we try push out max-metric LSAs? */
620 if (ospf
->stub_router_shutdown_time
!= OSPF_STUB_ROUTER_UNCONFIGURED
) {
621 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, ln
, area
)) {
622 SET_FLAG(area
->stub_router_state
,
623 OSPF_AREA_ADMIN_STUB_ROUTED
);
625 if (!CHECK_FLAG(area
->stub_router_state
,
626 OSPF_AREA_IS_STUB_ROUTED
))
627 ospf_router_lsa_update_area(area
);
629 timeout
= ospf
->stub_router_shutdown_time
;
631 /* No timer needed */
632 ospf_deferred_shutdown_finish(ospf
);
636 OSPF_TIMER_ON(ospf
->t_deferred_shutdown
, ospf_deferred_shutdown_timer
,
641 /* Shut down the entire process */
642 void ospf_terminate(void)
645 struct listnode
*node
, *nnode
;
647 /* shutdown already in progress */
648 if (CHECK_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
))
651 SET_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
);
653 /* Skip some steps if OSPF not actually running */
654 if (listcount(om
->ospf
) == 0)
657 for (ALL_LIST_ELEMENTS(om
->ospf
, node
, nnode
, ospf
))
661 ospf_gr_helper_stop();
663 /* Cleanup route maps */
666 /* reverse prefix_list_init */
667 prefix_list_add_hook(NULL
);
668 prefix_list_delete_hook(NULL
);
671 /* Cleanup vrf info */
672 ospf_vrf_terminate();
674 /* Deliberately go back up, hopefully to thread scheduler, as
675 * One or more ospf_finish()'s may have deferred shutdown to a timer
678 zclient_stop(zclient
);
679 zclient_free(zclient
);
685 void ospf_finish(struct ospf
*ospf
)
687 /* let deferred shutdown decide */
688 ospf_deferred_shutdown_check(ospf
);
690 /* if ospf_deferred_shutdown returns, then ospf_finish_final is
691 * deferred to expiry of G-S timer thread. Return back up, hopefully
692 * to thread scheduler.
697 /* Final cleanup of ospf instance */
698 static void ospf_finish_final(struct ospf
*ospf
)
700 struct vrf
*vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
701 struct route_node
*rn
;
702 struct ospf_nbr_nbma
*nbr_nbma
;
703 struct ospf_lsa
*lsa
;
704 struct ospf_interface
*oi
;
705 struct ospf_area
*area
;
706 struct ospf_vl_data
*vl_data
;
707 struct listnode
*node
, *nnode
;
708 struct ospf_redist
*red
;
713 ospf_opaque_type11_lsa_term(ospf
);
715 ospf_opaque_finish();
717 if (!ospf
->gr_info
.prepare_in_progress
)
718 ospf_flush_self_originated_lsas_now(ospf
);
720 /* Unregister redistribution */
721 for (i
= 0; i
< ZEBRA_ROUTE_MAX
; i
++) {
722 struct list
*red_list
;
724 red_list
= ospf
->redist
[i
];
728 for (ALL_LIST_ELEMENTS(red_list
, node
, nnode
, red
)) {
729 ospf_redistribute_unset(ospf
, i
, red
->instance
);
730 ospf_redist_del(ospf
, i
, red
->instance
);
733 red
= ospf_redist_lookup(ospf
, DEFAULT_ROUTE
, 0);
735 ospf_routemap_unset(red
);
736 ospf_redist_del(ospf
, DEFAULT_ROUTE
, 0);
737 ospf_redistribute_default_set(ospf
, DEFAULT_ORIGINATE_NONE
, 0, 0);
740 for (ALL_LIST_ELEMENTS(ospf
->areas
, node
, nnode
, area
))
741 ospf_remove_vls_through_area(ospf
, area
);
743 for (ALL_LIST_ELEMENTS(ospf
->vlinks
, node
, nnode
, vl_data
))
744 ospf_vl_delete(ospf
, vl_data
);
746 list_delete(&ospf
->vlinks
);
748 /* shutdown LDP-Sync */
749 if (ospf
->vrf_id
== VRF_DEFAULT
)
750 ospf_ldp_sync_gbl_exit(ospf
, true);
752 /* Reset interface. */
753 for (ALL_LIST_ELEMENTS(ospf
->oiflist
, node
, nnode
, oi
))
755 list_delete(&ospf
->oiflist
);
756 ospf
->oi_running
= 0;
758 /* De-Register VRF */
759 ospf_zebra_vrf_deregister(ospf
);
761 /* Clear static neighbors */
762 for (rn
= route_top(ospf
->nbr_nbma
); rn
; rn
= route_next(rn
))
763 if ((nbr_nbma
= rn
->info
)) {
764 THREAD_OFF(nbr_nbma
->t_poll
);
767 nbr_nbma
->nbr
->nbr_nbma
= NULL
;
768 nbr_nbma
->nbr
= NULL
;
772 listnode_delete(nbr_nbma
->oi
->nbr_nbma
,
777 XFREE(MTYPE_OSPF_NEIGHBOR_STATIC
, nbr_nbma
);
780 route_table_finish(ospf
->nbr_nbma
);
782 /* Clear networks and Areas. */
783 for (rn
= route_top(ospf
->networks
); rn
; rn
= route_next(rn
)) {
784 struct ospf_network
*network
;
786 if ((network
= rn
->info
) != NULL
) {
787 ospf_network_free(ospf
, network
);
789 route_unlock_node(rn
);
792 route_table_finish(ospf
->networks
);
794 for (ALL_LIST_ELEMENTS(ospf
->areas
, node
, nnode
, area
)) {
795 listnode_delete(ospf
->areas
, area
);
796 ospf_area_free(area
);
799 /* Cancel all timers. */
800 THREAD_OFF(ospf
->t_read
);
801 THREAD_OFF(ospf
->t_write
);
802 THREAD_OFF(ospf
->t_spf_calc
);
803 THREAD_OFF(ospf
->t_ase_calc
);
804 THREAD_OFF(ospf
->t_maxage
);
805 THREAD_OFF(ospf
->t_maxage_walker
);
806 THREAD_OFF(ospf
->t_abr_task
);
807 THREAD_OFF(ospf
->t_abr_fr
);
808 THREAD_OFF(ospf
->t_asbr_check
);
809 THREAD_OFF(ospf
->t_asbr_nssa_redist_update
);
810 THREAD_OFF(ospf
->t_distribute_update
);
811 THREAD_OFF(ospf
->t_lsa_refresher
);
812 THREAD_OFF(ospf
->t_opaque_lsa_self
);
813 THREAD_OFF(ospf
->t_sr_update
);
814 THREAD_OFF(ospf
->t_default_routemap_timer
);
815 THREAD_OFF(ospf
->t_external_aggr
);
816 THREAD_OFF(ospf
->gr_info
.t_grace_period
);
818 LSDB_LOOP (OPAQUE_AS_LSDB(ospf
), rn
, lsa
)
819 ospf_discard_from_db(ospf
, ospf
->lsdb
, lsa
);
820 LSDB_LOOP (EXTERNAL_LSDB(ospf
), rn
, lsa
)
821 ospf_discard_from_db(ospf
, ospf
->lsdb
, lsa
);
823 ospf_lsdb_delete_all(ospf
->lsdb
);
824 ospf_lsdb_free(ospf
->lsdb
);
826 for (rn
= route_top(ospf
->maxage_lsa
); rn
; rn
= route_next(rn
)) {
827 if ((lsa
= rn
->info
) != NULL
) {
828 ospf_lsa_unlock(&lsa
);
830 route_unlock_node(rn
);
833 route_table_finish(ospf
->maxage_lsa
);
836 ospf_route_table_free(ospf
->old_table
);
837 if (ospf
->new_table
) {
838 if (!ospf
->gr_info
.prepare_in_progress
)
839 ospf_route_delete(ospf
, ospf
->new_table
);
840 ospf_route_table_free(ospf
->new_table
);
843 ospf_rtrs_free(ospf
->oall_rtrs
);
845 ospf_rtrs_free(ospf
->all_rtrs
);
847 ospf_rtrs_free(ospf
->old_rtrs
);
849 ospf_rtrs_free(ospf
->new_rtrs
);
850 if (ospf
->new_external_route
) {
851 if (!ospf
->gr_info
.prepare_in_progress
)
852 ospf_route_delete(ospf
, ospf
->new_external_route
);
853 ospf_route_table_free(ospf
->new_external_route
);
855 if (ospf
->old_external_route
) {
856 if (!ospf
->gr_info
.prepare_in_progress
)
857 ospf_route_delete(ospf
, ospf
->old_external_route
);
858 ospf_route_table_free(ospf
->old_external_route
);
860 if (ospf
->external_lsas
) {
861 ospf_ase_external_lsas_finish(ospf
->external_lsas
);
864 for (i
= ZEBRA_ROUTE_SYSTEM
; i
<= ZEBRA_ROUTE_MAX
; i
++) {
865 struct list
*ext_list
;
866 struct ospf_external
*ext
;
868 ext_list
= ospf
->external
[i
];
872 for (ALL_LIST_ELEMENTS(ext_list
, node
, nnode
, ext
)) {
873 if (ext
->external_info
)
874 for (rn
= route_top(ext
->external_info
); rn
;
875 rn
= route_next(rn
)) {
876 if (rn
->info
== NULL
)
879 XFREE(MTYPE_OSPF_EXTERNAL_INFO
,
882 route_unlock_node(rn
);
885 ospf_external_del(ospf
, i
, ext
->instance
);
889 ospf_distance_reset(ospf
);
890 route_table_finish(ospf
->distance_table
);
892 /* Release extrenal Aggregator table */
893 for (rn
= route_top(ospf
->rt_aggr_tbl
); rn
; rn
= route_next(rn
)) {
894 struct ospf_external_aggr_rt
*aggr
;
899 ospf_external_aggregator_free(aggr
);
901 route_unlock_node(rn
);
905 route_table_finish(ospf
->rt_aggr_tbl
);
908 ospf_free_refresh_queue(ospf
);
910 list_delete(&ospf
->areas
);
911 list_delete(&ospf
->oi_write_q
);
913 /* Reset GR helper data structers */
914 ospf_gr_helper_instance_stop(ospf
);
917 stream_free(ospf
->ibuf
);
919 ospf
->max_multipath
= MULTIPATH_NUM
;
923 ospf_vrf_unlink(ospf
, vrf
);
925 XFREE(MTYPE_OSPF_TOP
, ospf
->name
);
926 XFREE(MTYPE_OSPF_TOP
, ospf
);
930 /* allocate new OSPF Area object */
931 struct ospf_area
*ospf_area_new(struct ospf
*ospf
, struct in_addr area_id
)
933 struct ospf_area
*new;
935 /* Allocate new config_network. */
936 new = XCALLOC(MTYPE_OSPF_AREA
, sizeof(struct ospf_area
));
940 new->area_id
= area_id
;
941 new->area_id_fmt
= OSPF_AREA_ID_FMT_DOTTEDQUAD
;
943 new->external_routing
= OSPF_AREA_DEFAULT
;
944 new->default_cost
= 1;
945 new->auth_type
= OSPF_AUTH_NULL
;
948 new->lsdb
= ospf_lsdb_new();
950 /* Self-originated LSAs initialize. */
951 new->router_lsa_self
= NULL
;
953 /* Initialize FR field */
954 new->fr_info
.enabled
= false;
955 new->fr_info
.configured
= false;
956 new->fr_info
.state_changed
= false;
957 new->fr_info
.router_lsas_recv_dc_bit
= 0;
958 new->fr_info
.indication_lsa_self
= NULL
;
959 new->fr_info
.area_ind_lsa_recvd
= false;
960 new->fr_info
.area_dc_clear
= false;
962 ospf_opaque_type10_lsa_init(new);
964 new->oiflist
= list_new();
965 new->ranges
= route_table_init();
967 if (area_id
.s_addr
== OSPF_AREA_BACKBONE
)
968 ospf
->backbone
= new;
973 void ospf_area_lsdb_discard_delete(struct ospf_area
*area
)
975 struct route_node
*rn
;
976 struct ospf_lsa
*lsa
;
978 LSDB_LOOP (ROUTER_LSDB(area
), rn
, lsa
)
979 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
980 LSDB_LOOP (NETWORK_LSDB(area
), rn
, lsa
)
981 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
982 LSDB_LOOP (SUMMARY_LSDB(area
), rn
, lsa
)
983 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
984 LSDB_LOOP (ASBR_SUMMARY_LSDB(area
), rn
, lsa
)
985 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
987 LSDB_LOOP (NSSA_LSDB(area
), rn
, lsa
)
988 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
989 LSDB_LOOP (OPAQUE_AREA_LSDB(area
), rn
, lsa
)
990 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
991 LSDB_LOOP (OPAQUE_LINK_LSDB(area
), rn
, lsa
)
992 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
994 ospf_lsdb_delete_all(area
->lsdb
);
997 static void ospf_area_free(struct ospf_area
*area
)
999 ospf_opaque_type10_lsa_term(area
);
1002 ospf_area_lsdb_discard_delete(area
);
1004 ospf_lsdb_free(area
->lsdb
);
1006 ospf_lsa_unlock(&area
->router_lsa_self
);
1008 route_table_finish(area
->ranges
);
1009 list_delete(&area
->oiflist
);
1011 if (EXPORT_NAME(area
))
1012 free(EXPORT_NAME(area
));
1014 if (IMPORT_NAME(area
))
1015 free(IMPORT_NAME(area
));
1018 THREAD_OFF(area
->t_stub_router
);
1019 THREAD_OFF(area
->t_opaque_lsa_self
);
1021 if (OSPF_IS_AREA_BACKBONE(area
))
1022 area
->ospf
->backbone
= NULL
;
1024 XFREE(MTYPE_OSPF_AREA
, area
);
1027 void ospf_area_check_free(struct ospf
*ospf
, struct in_addr area_id
)
1029 struct ospf_area
*area
;
1031 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1032 if (area
&& listcount(area
->oiflist
) == 0 && area
->ranges
->top
== NULL
1033 && !ospf_vl_count(ospf
, area
)
1034 && area
->shortcut_configured
== OSPF_SHORTCUT_DEFAULT
1035 && area
->external_routing
== OSPF_AREA_DEFAULT
1036 && area
->no_summary
== 0 && area
->default_cost
== 1
1037 && EXPORT_NAME(area
) == NULL
&& IMPORT_NAME(area
) == NULL
1038 && area
->auth_type
== OSPF_AUTH_NULL
) {
1039 listnode_delete(ospf
->areas
, area
);
1040 ospf_area_free(area
);
1044 struct ospf_area
*ospf_area_get(struct ospf
*ospf
, struct in_addr area_id
)
1046 struct ospf_area
*area
;
1048 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1050 area
= ospf_area_new(ospf
, area_id
);
1051 listnode_add_sort(ospf
->areas
, area
);
1052 ospf_check_abr_status(ospf
);
1053 if (ospf
->stub_router_admin_set
1054 == OSPF_STUB_ROUTER_ADMINISTRATIVE_SET
) {
1055 SET_FLAG(area
->stub_router_state
,
1056 OSPF_AREA_ADMIN_STUB_ROUTED
);
1063 struct ospf_area
*ospf_area_lookup_by_area_id(struct ospf
*ospf
,
1064 struct in_addr area_id
)
1066 struct ospf_area
*area
;
1067 struct listnode
*node
;
1069 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
))
1070 if (IPV4_ADDR_SAME(&area
->area_id
, &area_id
))
1076 void ospf_area_add_if(struct ospf_area
*area
, struct ospf_interface
*oi
)
1078 listnode_add(area
->oiflist
, oi
);
1081 void ospf_area_del_if(struct ospf_area
*area
, struct ospf_interface
*oi
)
1083 listnode_delete(area
->oiflist
, oi
);
1087 struct ospf_interface
*add_ospf_interface(struct connected
*co
,
1088 struct ospf_area
*area
)
1090 struct ospf_interface
*oi
;
1092 oi
= ospf_if_new(area
->ospf
, co
->ifp
, co
->address
);
1097 oi
->params
= ospf_lookup_if_params(co
->ifp
, oi
->address
->u
.prefix4
);
1098 oi
->output_cost
= ospf_if_get_output_cost(oi
);
1100 /* Relate ospf interface to ospf instance. */
1101 oi
->ospf
= area
->ospf
;
1103 /* update network type as interface flag */
1104 /* If network type is specified previously,
1105 skip network type setting. */
1106 oi
->type
= IF_DEF_PARAMS(co
->ifp
)->type
;
1107 oi
->ptp_dmvpn
= IF_DEF_PARAMS(co
->ifp
)->ptp_dmvpn
;
1109 /* Add pseudo neighbor. */
1110 ospf_nbr_self_reset(oi
, oi
->ospf
->router_id
);
1112 ospf_area_add_if(oi
->area
, oi
);
1114 /* if LDP-IGP Sync is configured globally inherit config */
1115 ospf_ldp_sync_if_init(oi
);
1118 * if router_id is not configured, don't bring up
1120 * ospf_router_id_update() will call ospf_if_update
1121 * whenever r-id is configured instead.
1123 if ((area
->ospf
->router_id
.s_addr
!= INADDR_ANY
)
1124 && if_is_operative(co
->ifp
))
1130 static void update_redistributed(struct ospf
*ospf
, int add_to_ospf
)
1132 struct route_node
*rn
;
1133 struct external_info
*ei
;
1134 struct ospf_external
*ext
;
1136 if (ospf_is_type_redistributed(ospf
, ZEBRA_ROUTE_CONNECT
, 0)) {
1137 ext
= ospf_external_lookup(ospf
, ZEBRA_ROUTE_CONNECT
, 0);
1138 if ((ext
) && EXTERNAL_INFO(ext
)) {
1139 for (rn
= route_top(EXTERNAL_INFO(ext
)); rn
;
1140 rn
= route_next(rn
)) {
1146 if (ospf_external_info_find_lsa(ospf
,
1148 if (!ospf_redistribute_check(
1150 ospf_external_lsa_flush(
1153 ei
->ifindex
/*, ei->nexthop */);
1155 if (!ospf_external_info_find_lsa(
1157 if (ospf_redistribute_check(
1159 ospf_external_lsa_originate(
1167 /* Config network statement related functions. */
1168 static struct ospf_network
*ospf_network_new(struct in_addr area_id
)
1170 struct ospf_network
*new;
1171 new = XCALLOC(MTYPE_OSPF_NETWORK
, sizeof(struct ospf_network
));
1173 new->area_id
= area_id
;
1174 new->area_id_fmt
= OSPF_AREA_ID_FMT_DOTTEDQUAD
;
1179 static void ospf_network_free(struct ospf
*ospf
, struct ospf_network
*network
)
1181 ospf_area_check_free(ospf
, network
->area_id
);
1182 ospf_schedule_abr_task(ospf
);
1183 XFREE(MTYPE_OSPF_NETWORK
, network
);
1186 int ospf_network_set(struct ospf
*ospf
, struct prefix_ipv4
*p
,
1187 struct in_addr area_id
, int df
)
1189 struct ospf_network
*network
;
1190 struct ospf_area
*area
;
1191 struct route_node
*rn
;
1193 rn
= route_node_get(ospf
->networks
, (struct prefix
*)p
);
1196 route_unlock_node(rn
);
1198 if (IPV4_ADDR_SAME(&area_id
, &network
->area_id
)) {
1201 /* There is already same network statement. */
1206 rn
->info
= network
= ospf_network_new(area_id
);
1207 network
->area_id_fmt
= df
;
1208 area
= ospf_area_get(ospf
, area_id
);
1209 ospf_area_display_format_set(ospf
, area
, df
);
1211 /* Run network config now. */
1212 ospf_network_run((struct prefix
*)p
, area
);
1214 /* Update connected redistribute. */
1215 update_redistributed(ospf
, 1); /* interfaces possibly added */
1217 ospf_area_check_free(ospf
, area_id
);
1222 int ospf_network_unset(struct ospf
*ospf
, struct prefix_ipv4
*p
,
1223 struct in_addr area_id
)
1225 struct route_node
*rn
;
1226 struct ospf_network
*network
;
1227 struct listnode
*node
, *nnode
;
1228 struct ospf_interface
*oi
;
1230 rn
= route_node_lookup(ospf
->networks
, (struct prefix
*)p
);
1235 route_unlock_node(rn
);
1236 if (!IPV4_ADDR_SAME(&area_id
, &network
->area_id
))
1239 ospf_network_free(ospf
, rn
->info
);
1241 route_unlock_node(rn
); /* initial reference */
1243 /* Find interfaces that are not configured already. */
1244 for (ALL_LIST_ELEMENTS(ospf
->oiflist
, node
, nnode
, oi
)) {
1246 if (oi
->type
== OSPF_IFTYPE_VIRTUALLINK
)
1249 ospf_network_run_subnet(ospf
, oi
->connected
, NULL
, NULL
);
1252 /* Update connected redistribute. */
1253 update_redistributed(ospf
, 0); /* interfaces possibly removed */
1254 ospf_area_check_free(ospf
, area_id
);
1259 /* Ensure there's an OSPF instance, as "ip ospf area" enabled OSPF means
1260 * there might not be any 'router ospf' config.
1262 * Otherwise, doesn't do anything different to ospf_if_update for now
1264 void ospf_interface_area_set(struct ospf
*ospf
, struct interface
*ifp
)
1269 ospf_if_update(ospf
, ifp
);
1270 /* if_update does a update_redistributed */
1275 void ospf_interface_area_unset(struct ospf
*ospf
, struct interface
*ifp
)
1277 struct route_node
*rn_oi
;
1280 return; /* Ospf not ready yet */
1282 /* Find interfaces that may need to be removed. */
1283 for (rn_oi
= route_top(IF_OIFS(ifp
)); rn_oi
;
1284 rn_oi
= route_next(rn_oi
)) {
1285 struct ospf_interface
*oi
= NULL
;
1287 if ((oi
= rn_oi
->info
) == NULL
)
1290 if (oi
->type
== OSPF_IFTYPE_VIRTUALLINK
)
1293 ospf_network_run_subnet(ospf
, oi
->connected
, NULL
, NULL
);
1296 /* Update connected redistribute. */
1297 update_redistributed(ospf
, 0); /* interfaces possibly removed */
1300 /* Check whether interface matches given network
1301 * returns: 1, true. 0, false
1303 static int ospf_network_match_iface(const struct connected
*co
,
1304 const struct prefix
*net
)
1306 /* new approach: more elegant and conceptually clean */
1307 return prefix_match_network_statement(net
, CONNECTED_PREFIX(co
));
1310 static void ospf_update_interface_area(struct connected
*co
,
1311 struct ospf_area
*area
)
1313 struct ospf_interface
*oi
= ospf_if_table_lookup(co
->ifp
, co
->address
);
1315 /* nothing to be done case */
1316 if (oi
&& oi
->area
== area
) {
1323 add_ospf_interface(co
, area
);
1326 /* Run OSPF for the given subnet, taking into account the following
1327 * possible sources of area configuration, in the given order of preference:
1329 * - Whether there is interface+address specific area configuration
1330 * - Whether there is a default area for the interface
1331 * - Whether there is an area given as a parameter.
1332 * - If no specific network prefix/area is supplied, whether there's
1333 * a matching network configured.
1335 static void ospf_network_run_subnet(struct ospf
*ospf
, struct connected
*co
,
1337 struct ospf_area
*given_area
)
1339 struct ospf_interface
*oi
;
1340 struct ospf_if_params
*params
;
1341 struct ospf_area
*area
= NULL
;
1342 struct route_node
*rn
;
1345 if (CHECK_FLAG(co
->flags
, ZEBRA_IFA_SECONDARY
))
1348 if (co
->address
->family
!= AF_INET
)
1351 /* Try determine the appropriate area for this interface + address
1352 * Start by checking interface config
1354 params
= ospf_lookup_if_params(co
->ifp
, co
->address
->u
.prefix4
);
1355 if (params
&& OSPF_IF_PARAM_CONFIGURED(params
, if_area
))
1356 area
= ospf_area_get(ospf
, params
->if_area
);
1358 params
= IF_DEF_PARAMS(co
->ifp
);
1359 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
))
1360 area
= ospf_area_get(ospf
, params
->if_area
);
1363 /* If we've found an interface and/or addr specific area, then we're
1367 ospf_update_interface_area(co
, area
);
1371 /* Otherwise, only remaining possibility is a matching network statement
1374 assert(given_area
!= NULL
);
1376 /* Which either was supplied as a parameter.. (e.g. cause a new
1377 * network/area was just added)..
1379 if (p
->family
== co
->address
->family
1380 && ospf_network_match_iface(co
, p
))
1381 ospf_update_interface_area(co
, given_area
);
1386 /* Else we have to search the existing network/area config to see
1389 for (rn
= route_top(ospf
->networks
); rn
; rn
= route_next(rn
))
1390 if (rn
->info
!= NULL
&& ospf_network_match_iface(co
, &rn
->p
)) {
1391 struct ospf_network
*network
=
1392 (struct ospf_network
*)rn
->info
;
1393 area
= ospf_area_get(ospf
, network
->area_id
);
1394 ospf_update_interface_area(co
, area
);
1398 /* If the subnet isn't in any area, deconfigure */
1399 if (!configed
&& (oi
= ospf_if_table_lookup(co
->ifp
, co
->address
)))
1403 static void ospf_network_run_interface(struct ospf
*ospf
, struct interface
*ifp
,
1405 struct ospf_area
*given_area
)
1407 struct listnode
*cnode
;
1408 struct connected
*co
;
1410 if (memcmp(ifp
->name
, "VLINK", 5) == 0)
1413 /* Network prefix without area is nonsensical */
1415 assert(given_area
!= NULL
);
1417 /* if interface prefix is match specified prefix,
1418 then create socket and join multicast group. */
1419 for (ALL_LIST_ELEMENTS_RO(ifp
->connected
, cnode
, co
))
1420 ospf_network_run_subnet(ospf
, co
, p
, given_area
);
1423 static void ospf_network_run(struct prefix
*p
, struct ospf_area
*area
)
1425 struct vrf
*vrf
= vrf_lookup_by_id(area
->ospf
->vrf_id
);
1426 struct interface
*ifp
;
1428 /* Schedule Router ID Update. */
1429 if (area
->ospf
->router_id
.s_addr
== INADDR_ANY
)
1430 ospf_router_id_update(area
->ospf
);
1432 /* Get target interface. */
1433 FOR_ALL_INTERFACES (vrf
, ifp
)
1434 ospf_network_run_interface(area
->ospf
, ifp
, p
, area
);
1437 void ospf_ls_upd_queue_empty(struct ospf_interface
*oi
)
1439 struct route_node
*rn
;
1440 struct listnode
*node
, *nnode
;
1442 struct ospf_lsa
*lsa
;
1444 /* empty ls update queue */
1445 for (rn
= route_top(oi
->ls_upd_queue
); rn
; rn
= route_next(rn
))
1446 if ((lst
= (struct list
*)rn
->info
)) {
1447 for (ALL_LIST_ELEMENTS(lst
, node
, nnode
, lsa
))
1448 ospf_lsa_unlock(&lsa
); /* oi->ls_upd_queue */
1453 /* remove update event */
1454 THREAD_OFF(oi
->t_ls_upd_event
);
1457 void ospf_if_update(struct ospf
*ospf
, struct interface
*ifp
)
1463 if (IS_DEBUG_OSPF_EVENT
)
1465 "%s: interface %s vrf %s(%u) ospf vrf %s vrf_id %u router_id %pI4",
1466 __func__
, ifp
->name
, ifp
->vrf
->name
, ifp
->vrf
->vrf_id
,
1467 ospf_vrf_id_to_name(ospf
->vrf_id
), ospf
->vrf_id
,
1470 /* OSPF must be ready. */
1471 if (!ospf_is_ready(ospf
))
1474 ospf_network_run_interface(ospf
, ifp
, NULL
, NULL
);
1476 /* Update connected redistribute. */
1477 update_redistributed(ospf
, 1);
1481 void ospf_remove_vls_through_area(struct ospf
*ospf
, struct ospf_area
*area
)
1483 struct listnode
*node
, *nnode
;
1484 struct ospf_vl_data
*vl_data
;
1486 for (ALL_LIST_ELEMENTS(ospf
->vlinks
, node
, nnode
, vl_data
))
1487 if (IPV4_ADDR_SAME(&vl_data
->vl_area_id
, &area
->area_id
))
1488 ospf_vl_delete(ospf
, vl_data
);
1492 static const struct message ospf_area_type_msg
[] = {
1493 {OSPF_AREA_DEFAULT
, "Default"},
1494 {OSPF_AREA_STUB
, "Stub"},
1495 {OSPF_AREA_NSSA
, "NSSA"},
1498 static void ospf_area_type_set(struct ospf_area
*area
, int type
)
1500 struct listnode
*node
;
1501 struct ospf_interface
*oi
;
1503 if (area
->external_routing
== type
) {
1504 if (IS_DEBUG_OSPF_EVENT
)
1505 zlog_debug("Area[%pI4]: Types are the same, ignored.",
1510 area
->external_routing
= type
;
1512 if (IS_DEBUG_OSPF_EVENT
)
1513 zlog_debug("Area[%pI4]: Configured as %s",
1515 lookup_msg(ospf_area_type_msg
, type
, NULL
));
1517 switch (area
->external_routing
) {
1518 case OSPF_AREA_DEFAULT
:
1519 for (ALL_LIST_ELEMENTS_RO(area
->oiflist
, node
, oi
))
1520 if (oi
->nbr_self
!= NULL
) {
1521 UNSET_FLAG(oi
->nbr_self
->options
,
1523 SET_FLAG(oi
->nbr_self
->options
, OSPF_OPTION_E
);
1526 case OSPF_AREA_STUB
:
1527 for (ALL_LIST_ELEMENTS_RO(area
->oiflist
, node
, oi
))
1528 if (oi
->nbr_self
!= NULL
) {
1529 if (IS_DEBUG_OSPF_EVENT
)
1531 "setting options on %s accordingly",
1533 UNSET_FLAG(oi
->nbr_self
->options
,
1535 UNSET_FLAG(oi
->nbr_self
->options
,
1537 if (IS_DEBUG_OSPF_EVENT
)
1538 zlog_debug("options set on %s: %x",
1539 IF_NAME(oi
), OPTIONS(oi
));
1542 case OSPF_AREA_NSSA
:
1543 for (ALL_LIST_ELEMENTS_RO(area
->oiflist
, node
, oi
))
1544 if (oi
->nbr_self
!= NULL
) {
1546 "setting nssa options on %s accordingly",
1548 UNSET_FLAG(oi
->nbr_self
->options
,
1550 SET_FLAG(oi
->nbr_self
->options
, OSPF_OPTION_NP
);
1551 zlog_debug("options set on %s: %x", IF_NAME(oi
),
1559 ospf_router_lsa_update_area(area
);
1560 ospf_schedule_abr_task(area
->ospf
);
1563 int ospf_area_shortcut_set(struct ospf
*ospf
, struct ospf_area
*area
, int mode
)
1565 if (area
->shortcut_configured
== mode
)
1568 area
->shortcut_configured
= mode
;
1569 ospf_router_lsa_update_area(area
);
1570 ospf_schedule_abr_task(ospf
);
1572 ospf_area_check_free(ospf
, area
->area_id
);
1577 int ospf_area_shortcut_unset(struct ospf
*ospf
, struct ospf_area
*area
)
1579 area
->shortcut_configured
= OSPF_SHORTCUT_DEFAULT
;
1580 ospf_router_lsa_update_area(area
);
1581 ospf_area_check_free(ospf
, area
->area_id
);
1582 ospf_schedule_abr_task(ospf
);
1587 static int ospf_area_vlink_count(struct ospf
*ospf
, struct ospf_area
*area
)
1589 struct ospf_vl_data
*vl
;
1590 struct listnode
*node
;
1593 for (ALL_LIST_ELEMENTS_RO(ospf
->vlinks
, node
, vl
))
1594 if (IPV4_ADDR_SAME(&vl
->vl_area_id
, &area
->area_id
))
1600 int ospf_area_display_format_set(struct ospf
*ospf
, struct ospf_area
*area
,
1603 area
->area_id_fmt
= df
;
1608 int ospf_area_stub_set(struct ospf
*ospf
, struct in_addr area_id
)
1610 struct ospf_area
*area
;
1612 area
= ospf_area_get(ospf
, area_id
);
1613 if (ospf_area_vlink_count(ospf
, area
))
1616 if (area
->external_routing
!= OSPF_AREA_STUB
)
1617 ospf_area_type_set(area
, OSPF_AREA_STUB
);
1622 int ospf_area_stub_unset(struct ospf
*ospf
, struct in_addr area_id
)
1624 struct ospf_area
*area
;
1626 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1630 if (area
->external_routing
== OSPF_AREA_STUB
)
1631 ospf_area_type_set(area
, OSPF_AREA_DEFAULT
);
1633 ospf_area_check_free(ospf
, area_id
);
1638 int ospf_area_no_summary_set(struct ospf
*ospf
, struct in_addr area_id
)
1640 struct ospf_area
*area
;
1642 area
= ospf_area_get(ospf
, area_id
);
1643 area
->no_summary
= 1;
1648 int ospf_area_no_summary_unset(struct ospf
*ospf
, struct in_addr area_id
)
1650 struct ospf_area
*area
;
1652 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1656 area
->no_summary
= 0;
1657 ospf_area_check_free(ospf
, area_id
);
1662 int ospf_area_nssa_no_summary_set(struct ospf
*ospf
, struct in_addr area_id
)
1664 struct ospf_area
*area
;
1666 area
= ospf_area_get(ospf
, area_id
);
1667 if (ospf_area_vlink_count(ospf
, area
))
1670 if (area
->external_routing
!= OSPF_AREA_NSSA
) {
1671 ospf_area_type_set(area
, OSPF_AREA_NSSA
);
1673 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1676 ospf_area_no_summary_set(ospf
, area_id
);
1681 int ospf_area_nssa_set(struct ospf
*ospf
, struct in_addr area_id
)
1683 struct ospf_area
*area
;
1685 area
= ospf_area_get(ospf
, area_id
);
1686 if (ospf_area_vlink_count(ospf
, area
))
1689 if (area
->external_routing
!= OSPF_AREA_NSSA
) {
1690 ospf_area_type_set(area
, OSPF_AREA_NSSA
);
1693 /* set NSSA area defaults */
1694 area
->no_summary
= 0;
1695 area
->suppress_fa
= 0;
1696 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1697 area
->NSSATranslatorState
= OSPF_NSSA_TRANSLATE_DISABLED
;
1698 area
->NSSATranslatorStabilityInterval
=
1699 OSPF_NSSA_TRANS_STABLE_DEFAULT
;
1704 int ospf_area_nssa_unset(struct ospf
*ospf
, struct in_addr area_id
, int argc
)
1706 struct ospf_area
*area
;
1708 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1712 /* argc < 5 -> 'no area x nssa' */
1713 if (argc
< 5 && area
->external_routing
== OSPF_AREA_NSSA
) {
1715 /* set NSSA area defaults */
1716 area
->no_summary
= 0;
1717 area
->suppress_fa
= 0;
1718 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1719 area
->NSSATranslatorState
= OSPF_NSSA_TRANSLATE_DISABLED
;
1720 area
->NSSATranslatorStabilityInterval
=
1721 OSPF_NSSA_TRANS_STABLE_DEFAULT
;
1722 ospf_area_type_set(area
, OSPF_AREA_DEFAULT
);
1724 ospf_area_nssa_translator_role_set(ospf
, area_id
,
1725 OSPF_NSSA_ROLE_CANDIDATE
);
1728 ospf_area_check_free(ospf
, area_id
);
1733 int ospf_area_nssa_suppress_fa_set(struct ospf
*ospf
, struct in_addr area_id
)
1735 struct ospf_area
*area
;
1737 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1741 area
->suppress_fa
= 1;
1746 int ospf_area_nssa_suppress_fa_unset(struct ospf
*ospf
, struct in_addr area_id
)
1748 struct ospf_area
*area
;
1750 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1754 area
->suppress_fa
= 0;
1759 int ospf_area_nssa_translator_role_set(struct ospf
*ospf
,
1760 struct in_addr area_id
, int role
)
1762 struct ospf_area
*area
;
1764 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1768 if (role
!= area
->NSSATranslatorRole
) {
1769 if ((area
->NSSATranslatorRole
== OSPF_NSSA_ROLE_ALWAYS
)
1770 || (role
== OSPF_NSSA_ROLE_ALWAYS
)) {
1772 * if new role is OSPF_NSSA_ROLE_ALWAYS we need to set
1773 * Nt bit, if the role was OSPF_NSSA_ROLE_ALWAYS we need
1776 area
->NSSATranslatorRole
= role
;
1777 ospf_router_lsa_update_area(area
);
1779 area
->NSSATranslatorRole
= role
;
1785 int ospf_area_export_list_set(struct ospf
*ospf
, struct ospf_area
*area
,
1786 const char *list_name
)
1788 struct access_list
*list
;
1789 list
= access_list_lookup(AFI_IP
, list_name
);
1791 EXPORT_LIST(area
) = list
;
1793 if (EXPORT_NAME(area
))
1794 free(EXPORT_NAME(area
));
1796 EXPORT_NAME(area
) = strdup(list_name
);
1797 ospf_schedule_abr_task(ospf
);
1802 int ospf_area_export_list_unset(struct ospf
*ospf
, struct ospf_area
*area
)
1805 EXPORT_LIST(area
) = 0;
1807 if (EXPORT_NAME(area
))
1808 free(EXPORT_NAME(area
));
1810 EXPORT_NAME(area
) = NULL
;
1812 ospf_area_check_free(ospf
, area
->area_id
);
1814 ospf_schedule_abr_task(ospf
);
1819 int ospf_area_import_list_set(struct ospf
*ospf
, struct ospf_area
*area
,
1822 struct access_list
*list
;
1823 list
= access_list_lookup(AFI_IP
, name
);
1825 IMPORT_LIST(area
) = list
;
1827 if (IMPORT_NAME(area
))
1828 free(IMPORT_NAME(area
));
1830 IMPORT_NAME(area
) = strdup(name
);
1831 ospf_schedule_abr_task(ospf
);
1836 int ospf_area_import_list_unset(struct ospf
*ospf
, struct ospf_area
*area
)
1838 IMPORT_LIST(area
) = 0;
1840 if (IMPORT_NAME(area
))
1841 free(IMPORT_NAME(area
));
1843 IMPORT_NAME(area
) = NULL
;
1844 ospf_area_check_free(ospf
, area
->area_id
);
1846 ospf_schedule_abr_task(ospf
);
1851 int ospf_timers_refresh_set(struct ospf
*ospf
, int interval
)
1855 if (ospf
->lsa_refresh_interval
== interval
)
1858 time_left
= ospf
->lsa_refresh_interval
1859 - (monotime(NULL
) - ospf
->lsa_refresher_started
);
1861 if (time_left
> interval
) {
1862 THREAD_OFF(ospf
->t_lsa_refresher
);
1863 thread_add_timer(master
, ospf_lsa_refresh_walker
, ospf
,
1864 interval
, &ospf
->t_lsa_refresher
);
1866 ospf
->lsa_refresh_interval
= interval
;
1871 int ospf_timers_refresh_unset(struct ospf
*ospf
)
1875 time_left
= ospf
->lsa_refresh_interval
1876 - (monotime(NULL
) - ospf
->lsa_refresher_started
);
1878 if (time_left
> OSPF_LSA_REFRESH_INTERVAL_DEFAULT
) {
1879 THREAD_OFF(ospf
->t_lsa_refresher
);
1880 ospf
->t_lsa_refresher
= NULL
;
1881 thread_add_timer(master
, ospf_lsa_refresh_walker
, ospf
,
1882 OSPF_LSA_REFRESH_INTERVAL_DEFAULT
,
1883 &ospf
->t_lsa_refresher
);
1886 ospf
->lsa_refresh_interval
= OSPF_LSA_REFRESH_INTERVAL_DEFAULT
;
1892 static struct ospf_nbr_nbma
*ospf_nbr_nbma_new(void)
1894 struct ospf_nbr_nbma
*nbr_nbma
;
1896 nbr_nbma
= XCALLOC(MTYPE_OSPF_NEIGHBOR_STATIC
,
1897 sizeof(struct ospf_nbr_nbma
));
1899 nbr_nbma
->priority
= OSPF_NEIGHBOR_PRIORITY_DEFAULT
;
1900 nbr_nbma
->v_poll
= OSPF_POLL_INTERVAL_DEFAULT
;
1905 static void ospf_nbr_nbma_free(struct ospf_nbr_nbma
*nbr_nbma
)
1907 XFREE(MTYPE_OSPF_NEIGHBOR_STATIC
, nbr_nbma
);
1910 static void ospf_nbr_nbma_delete(struct ospf
*ospf
,
1911 struct ospf_nbr_nbma
*nbr_nbma
)
1913 struct route_node
*rn
;
1914 struct prefix_ipv4 p
;
1917 p
.prefix
= nbr_nbma
->addr
;
1918 p
.prefixlen
= IPV4_MAX_BITLEN
;
1920 rn
= route_node_lookup(ospf
->nbr_nbma
, (struct prefix
*)&p
);
1922 ospf_nbr_nbma_free(rn
->info
);
1924 route_unlock_node(rn
);
1925 route_unlock_node(rn
);
1929 static void ospf_nbr_nbma_down(struct ospf_nbr_nbma
*nbr_nbma
)
1931 THREAD_OFF(nbr_nbma
->t_poll
);
1933 if (nbr_nbma
->nbr
) {
1934 nbr_nbma
->nbr
->nbr_nbma
= NULL
;
1935 OSPF_NSM_EVENT_EXECUTE(nbr_nbma
->nbr
, NSM_KillNbr
);
1939 listnode_delete(nbr_nbma
->oi
->nbr_nbma
, nbr_nbma
);
1942 static void ospf_nbr_nbma_add(struct ospf_nbr_nbma
*nbr_nbma
,
1943 struct ospf_interface
*oi
)
1945 struct ospf_neighbor
*nbr
;
1946 struct route_node
*rn
;
1949 if (oi
->type
!= OSPF_IFTYPE_NBMA
)
1952 if (nbr_nbma
->nbr
!= NULL
)
1955 if (IPV4_ADDR_SAME(&oi
->nbr_self
->address
.u
.prefix4
, &nbr_nbma
->addr
))
1959 listnode_add(oi
->nbr_nbma
, nbr_nbma
);
1961 /* Get neighbor information from table. */
1963 p
.prefixlen
= IPV4_MAX_BITLEN
;
1964 p
.u
.prefix4
= nbr_nbma
->addr
;
1966 rn
= route_node_get(oi
->nbrs
, &p
);
1969 nbr
->nbr_nbma
= nbr_nbma
;
1970 nbr_nbma
->nbr
= nbr
;
1972 route_unlock_node(rn
);
1974 nbr
= rn
->info
= ospf_nbr_new(oi
);
1975 nbr
->state
= NSM_Down
;
1976 nbr
->src
= nbr_nbma
->addr
;
1977 nbr
->nbr_nbma
= nbr_nbma
;
1978 nbr
->priority
= nbr_nbma
->priority
;
1981 nbr_nbma
->nbr
= nbr
;
1983 /* Configure BFD if interface has it. */
1984 ospf_neighbor_bfd_apply(nbr
);
1986 OSPF_NSM_EVENT_EXECUTE(nbr
, NSM_Start
);
1990 void ospf_nbr_nbma_if_update(struct ospf
*ospf
, struct ospf_interface
*oi
)
1992 struct ospf_nbr_nbma
*nbr_nbma
;
1993 struct route_node
*rn
;
1994 struct prefix_ipv4 p
;
1996 if (oi
->type
!= OSPF_IFTYPE_NBMA
)
1999 for (rn
= route_top(ospf
->nbr_nbma
); rn
; rn
= route_next(rn
))
2000 if ((nbr_nbma
= rn
->info
))
2001 if (nbr_nbma
->oi
== NULL
&& nbr_nbma
->nbr
== NULL
) {
2003 p
.prefix
= nbr_nbma
->addr
;
2004 p
.prefixlen
= IPV4_MAX_BITLEN
;
2006 if (prefix_match(oi
->address
,
2007 (struct prefix
*)&p
))
2008 ospf_nbr_nbma_add(nbr_nbma
, oi
);
2012 struct ospf_nbr_nbma
*ospf_nbr_nbma_lookup(struct ospf
*ospf
,
2013 struct in_addr nbr_addr
)
2015 struct route_node
*rn
;
2016 struct prefix_ipv4 p
;
2019 p
.prefix
= nbr_addr
;
2020 p
.prefixlen
= IPV4_MAX_BITLEN
;
2022 rn
= route_node_lookup(ospf
->nbr_nbma
, (struct prefix
*)&p
);
2024 route_unlock_node(rn
);
2030 int ospf_nbr_nbma_set(struct ospf
*ospf
, struct in_addr nbr_addr
)
2032 struct ospf_nbr_nbma
*nbr_nbma
;
2033 struct ospf_interface
*oi
;
2034 struct prefix_ipv4 p
;
2035 struct route_node
*rn
;
2036 struct listnode
*node
;
2038 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
2042 nbr_nbma
= ospf_nbr_nbma_new();
2043 nbr_nbma
->addr
= nbr_addr
;
2046 p
.prefix
= nbr_addr
;
2047 p
.prefixlen
= IPV4_MAX_BITLEN
;
2049 rn
= route_node_get(ospf
->nbr_nbma
, (struct prefix
*)&p
);
2051 route_unlock_node(rn
);
2052 rn
->info
= nbr_nbma
;
2054 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
2055 if (oi
->type
== OSPF_IFTYPE_NBMA
)
2056 if (prefix_match(oi
->address
, (struct prefix
*)&p
)) {
2057 ospf_nbr_nbma_add(nbr_nbma
, oi
);
2065 int ospf_nbr_nbma_unset(struct ospf
*ospf
, struct in_addr nbr_addr
)
2067 struct ospf_nbr_nbma
*nbr_nbma
;
2069 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
2070 if (nbr_nbma
== NULL
)
2073 ospf_nbr_nbma_down(nbr_nbma
);
2074 ospf_nbr_nbma_delete(ospf
, nbr_nbma
);
2079 int ospf_nbr_nbma_priority_set(struct ospf
*ospf
, struct in_addr nbr_addr
,
2082 struct ospf_nbr_nbma
*nbr_nbma
;
2084 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
2085 if (nbr_nbma
== NULL
)
2088 if (nbr_nbma
->priority
!= priority
)
2089 nbr_nbma
->priority
= priority
;
2094 int ospf_nbr_nbma_priority_unset(struct ospf
*ospf
, struct in_addr nbr_addr
)
2096 struct ospf_nbr_nbma
*nbr_nbma
;
2098 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
2099 if (nbr_nbma
== NULL
)
2102 if (nbr_nbma
!= OSPF_NEIGHBOR_PRIORITY_DEFAULT
)
2103 nbr_nbma
->priority
= OSPF_NEIGHBOR_PRIORITY_DEFAULT
;
2108 int ospf_nbr_nbma_poll_interval_set(struct ospf
*ospf
, struct in_addr nbr_addr
,
2109 unsigned int interval
)
2111 struct ospf_nbr_nbma
*nbr_nbma
;
2113 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
2114 if (nbr_nbma
== NULL
)
2117 if (nbr_nbma
->v_poll
!= interval
) {
2118 nbr_nbma
->v_poll
= interval
;
2119 if (nbr_nbma
->oi
&& ospf_if_is_up(nbr_nbma
->oi
)) {
2120 THREAD_OFF(nbr_nbma
->t_poll
);
2121 OSPF_POLL_TIMER_ON(nbr_nbma
->t_poll
, ospf_poll_timer
,
2129 int ospf_nbr_nbma_poll_interval_unset(struct ospf
*ospf
, struct in_addr addr
)
2131 struct ospf_nbr_nbma
*nbr_nbma
;
2133 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, addr
);
2134 if (nbr_nbma
== NULL
)
2137 if (nbr_nbma
->v_poll
!= OSPF_POLL_INTERVAL_DEFAULT
)
2138 nbr_nbma
->v_poll
= OSPF_POLL_INTERVAL_DEFAULT
;
2143 void ospf_master_init(struct thread_master
*master
)
2145 memset(&ospf_master
, 0, sizeof(ospf_master
));
2148 om
->ospf
= list_new();
2149 om
->master
= master
;
2152 /* Link OSPF instance to VRF. */
2153 void ospf_vrf_link(struct ospf
*ospf
, struct vrf
*vrf
)
2155 ospf
->vrf_id
= vrf
->vrf_id
;
2156 if (vrf
->info
!= (void *)ospf
)
2157 vrf
->info
= (void *)ospf
;
2160 /* Unlink OSPF instance from VRF. */
2161 void ospf_vrf_unlink(struct ospf
*ospf
, struct vrf
*vrf
)
2163 if (vrf
->info
== (void *)ospf
)
2165 ospf
->vrf_id
= VRF_UNKNOWN
;
2168 /* This is hook function for vrf create called as part of vrf_init */
2169 static int ospf_vrf_new(struct vrf
*vrf
)
2171 if (IS_DEBUG_OSPF_EVENT
)
2172 zlog_debug("%s: VRF Created: %s(%u)", __func__
, vrf
->name
,
2178 /* This is hook function for vrf delete call as part of vrf_init */
2179 static int ospf_vrf_delete(struct vrf
*vrf
)
2181 if (IS_DEBUG_OSPF_EVENT
)
2182 zlog_debug("%s: VRF Deletion: %s(%u)", __func__
, vrf
->name
,
2188 static void ospf_set_redist_vrf_bitmaps(struct ospf
*ospf
, bool set
)
2191 struct list
*red_list
;
2193 for (type
= 0; type
< ZEBRA_ROUTE_MAX
; type
++) {
2194 red_list
= ospf
->redist
[type
];
2197 if (IS_DEBUG_OSPF_EVENT
)
2199 "%s: setting redist vrf %d bitmap for type %d",
2200 __func__
, ospf
->vrf_id
, type
);
2202 vrf_bitmap_set(zclient
->redist
[AFI_IP
][type
],
2205 vrf_bitmap_unset(zclient
->redist
[AFI_IP
][type
],
2209 red_list
= ospf
->redist
[DEFAULT_ROUTE
];
2212 vrf_bitmap_set(zclient
->default_information
[AFI_IP
],
2215 vrf_bitmap_unset(zclient
->default_information
[AFI_IP
],
2220 /* Enable OSPF VRF instance */
2221 static int ospf_vrf_enable(struct vrf
*vrf
)
2223 struct ospf
*ospf
= NULL
;
2224 vrf_id_t old_vrf_id
;
2227 if (IS_DEBUG_OSPF_EVENT
)
2228 zlog_debug("%s: VRF %s id %u enabled", __func__
, vrf
->name
,
2231 ospf
= ospf_lookup_by_name(vrf
->name
);
2233 old_vrf_id
= ospf
->vrf_id
;
2234 /* We have instance configured, link to VRF and make it "up". */
2235 ospf_vrf_link(ospf
, vrf
);
2236 if (IS_DEBUG_OSPF_EVENT
)
2238 "%s: ospf linked to vrf %s vrf_id %u (old id %u)",
2239 __func__
, vrf
->name
, ospf
->vrf_id
, old_vrf_id
);
2241 if (old_vrf_id
!= ospf
->vrf_id
) {
2242 ospf_set_redist_vrf_bitmaps(ospf
, true);
2244 /* start zebra redist to us for new vrf */
2245 ospf_zebra_vrf_register(ospf
);
2247 ret
= ospf_sock_init(ospf
);
2248 if (ret
< 0 || ospf
->fd
<= 0)
2250 thread_add_read(master
, ospf_read
, ospf
, ospf
->fd
,
2252 ospf
->oi_running
= 1;
2253 ospf_router_id_update(ospf
);
2260 /* Disable OSPF VRF instance */
2261 static int ospf_vrf_disable(struct vrf
*vrf
)
2263 struct ospf
*ospf
= NULL
;
2264 vrf_id_t old_vrf_id
= VRF_UNKNOWN
;
2266 if (vrf
->vrf_id
== VRF_DEFAULT
)
2269 if (IS_DEBUG_OSPF_EVENT
)
2270 zlog_debug("%s: VRF %s id %d disabled.", __func__
, vrf
->name
,
2273 ospf
= ospf_lookup_by_name(vrf
->name
);
2275 old_vrf_id
= ospf
->vrf_id
;
2277 ospf_zebra_vrf_deregister(ospf
);
2279 ospf_set_redist_vrf_bitmaps(ospf
, false);
2281 /* We have instance configured, unlink
2282 * from VRF and make it "down".
2284 ospf_vrf_unlink(ospf
, vrf
);
2285 ospf
->oi_running
= 0;
2286 if (IS_DEBUG_OSPF_EVENT
)
2287 zlog_debug("%s: ospf old_vrf_id %d unlinked", __func__
,
2289 THREAD_OFF(ospf
->t_read
);
2294 /* Note: This is a callback, the VRF will be deleted by the caller. */
2298 void ospf_vrf_init(void)
2300 vrf_init(ospf_vrf_new
, ospf_vrf_enable
, ospf_vrf_disable
,
2304 void ospf_vrf_terminate(void)
2309 const char *ospf_vrf_id_to_name(vrf_id_t vrf_id
)
2311 struct vrf
*vrf
= vrf_lookup_by_id(vrf_id
);
2313 return vrf
? vrf
->name
: "NIL";
2316 const char *ospf_get_name(const struct ospf
*ospf
)
2321 return VRF_DEFAULT_NAME
;