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_network.h"
46 #include "ospfd/ospf_interface.h"
47 #include "ospfd/ospf_ism.h"
48 #include "ospfd/ospf_asbr.h"
49 #include "ospfd/ospf_lsa.h"
50 #include "ospfd/ospf_lsdb.h"
51 #include "ospfd/ospf_neighbor.h"
52 #include "ospfd/ospf_nsm.h"
53 #include "ospfd/ospf_spf.h"
54 #include "ospfd/ospf_packet.h"
55 #include "ospfd/ospf_dump.h"
56 #include "ospfd/ospf_route.h"
57 #include "ospfd/ospf_zebra.h"
58 #include "ospfd/ospf_abr.h"
59 #include "ospfd/ospf_flood.h"
60 #include "ospfd/ospf_ase.h"
61 #include "ospfd/ospf_ldp_sync.h"
62 #include "ospfd/ospf_gr_helper.h"
65 DEFINE_QOBJ_TYPE(ospf
);
67 /* OSPF process wide configuration. */
68 static struct ospf_master ospf_master
;
70 /* OSPF process wide configuration pointer to export. */
71 struct ospf_master
*om
;
73 unsigned short ospf_instance
;
75 extern struct zclient
*zclient
;
78 static void ospf_remove_vls_through_area(struct ospf
*, struct ospf_area
*);
79 static void ospf_network_free(struct ospf
*, struct ospf_network
*);
80 static void ospf_area_free(struct ospf_area
*);
81 static void ospf_network_run(struct prefix
*, struct ospf_area
*);
82 static void ospf_network_run_interface(struct ospf
*, struct interface
*,
83 struct prefix
*, struct ospf_area
*);
84 static void ospf_network_run_subnet(struct ospf
*, struct connected
*,
85 struct prefix
*, struct ospf_area
*);
86 static int ospf_network_match_iface(const struct connected
*,
87 const struct prefix
*);
88 static void ospf_finish_final(struct ospf
*);
90 #define OSPF_EXTERNAL_LSA_ORIGINATE_DELAY 1
92 int p_spaces_compare_func(const struct p_space
*a
, const struct p_space
*b
)
94 if (a
->protected_resource
->type
== OSPF_TI_LFA_LINK_PROTECTION
95 && b
->protected_resource
->type
== OSPF_TI_LFA_LINK_PROTECTION
)
96 return (a
->protected_resource
->link
->link_id
.s_addr
97 - b
->protected_resource
->link
->link_id
.s_addr
);
99 if (a
->protected_resource
->type
== OSPF_TI_LFA_NODE_PROTECTION
100 && b
->protected_resource
->type
== OSPF_TI_LFA_NODE_PROTECTION
)
101 return (a
->protected_resource
->router_id
.s_addr
102 - b
->protected_resource
->router_id
.s_addr
);
104 /* This should not happen */
108 int q_spaces_compare_func(const struct q_space
*a
, const struct q_space
*b
)
110 return (a
->root
->id
.s_addr
- b
->root
->id
.s_addr
);
113 DECLARE_RBTREE_UNIQ(p_spaces
, struct p_space
, p_spaces_item
,
114 p_spaces_compare_func
);
116 void ospf_process_refresh_data(struct ospf
*ospf
, bool reset
)
118 struct vrf
*vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
119 struct in_addr router_id
, router_id_old
;
120 struct ospf_interface
*oi
;
121 struct interface
*ifp
;
122 struct listnode
*node
, *nnode
;
123 struct ospf_area
*area
;
124 bool rid_change
= false;
126 if (!ospf
->oi_running
) {
127 if (IS_DEBUG_OSPF_EVENT
)
129 "Router ospf not configured -- Router-ID update postponed");
133 if (IS_DEBUG_OSPF_EVENT
)
134 zlog_debug("Router-ID[OLD:%pI4]: Update",
137 router_id_old
= ospf
->router_id
;
139 /* Select the router ID based on these priorities:
140 1. Statically assigned router ID is always the first choice.
141 2. If there is no statically assigned router ID, then try to stick
142 with the most recent value, since changing router ID's is very
144 3. Last choice: just go with whatever the zebra daemon recommends.
146 if (ospf
->router_id_static
.s_addr
!= INADDR_ANY
)
147 router_id
= ospf
->router_id_static
;
148 else if (ospf
->router_id
.s_addr
!= INADDR_ANY
)
149 router_id
= ospf
->router_id
;
151 router_id
= ospf
->router_id_zebra
;
153 if (IS_DEBUG_OSPF_EVENT
)
154 zlog_debug("Router-ID[OLD:%pI4]: Update to %pI4",
155 &ospf
->router_id
, &router_id
);
157 rid_change
= !(IPV4_ADDR_SAME(&router_id_old
, &router_id
));
158 if (rid_change
|| (reset
)) {
159 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
160 /* Some nbrs are identified by router_id, these needs
161 * to be rebuilt. Possible optimization would be to do
162 * oi->nbr_self->router_id = router_id for
163 * !(virtual | ptop) links
165 ospf_nbr_self_reset(oi
, router_id
);
168 * If the old router id was not set, but now it
169 * is and the interface is operative and the
170 * state is ISM_Down we should kick the state
171 * machine as that we processed the interfaces
172 * based upon the network statement( or intf config )
173 * but could not start it at that time.
175 if (if_is_operative(oi
->ifp
) && oi
->state
== ISM_Down
176 && router_id_old
.s_addr
== INADDR_ANY
)
180 /* Flush (inline) all the self originated LSAs */
181 ospf_flush_self_originated_lsas_now(ospf
);
183 ospf
->router_id
= router_id
;
184 if (IS_DEBUG_OSPF_EVENT
)
185 zlog_debug("Router-ID[NEW:%pI4]: Update",
188 /* Flush (inline) all external LSAs which now match the new
190 need to adjust the OSPF_LSA_SELF flag, so the flush doesn't
192 asserts in ospf_refresher_unregister_lsa(). This step is
194 because the current quagga code does look-up for
196 based on the self router-id alone but expects OSPF_LSA_SELF
200 struct route_node
*rn
;
201 struct ospf_lsa
*lsa
;
203 LSDB_LOOP (EXTERNAL_LSDB(ospf
), rn
, lsa
) {
204 /* AdvRouter and Router ID is the same. */
205 if (IPV4_ADDR_SAME(&lsa
->data
->adv_router
,
206 &ospf
->router_id
) && rid_change
) {
208 OSPF_LSA_SELF_CHECKED
);
209 SET_FLAG(lsa
->flags
, OSPF_LSA_SELF
);
210 ospf_lsa_flush_schedule(ospf
, lsa
);
212 /* The above flush will send immediately
213 * So discard the LSA to originate new
215 ospf_discard_from_db(ospf
, ospf
->lsdb
, lsa
);
218 LSDB_LOOP (OPAQUE_AS_LSDB(ospf
), rn
, lsa
)
219 ospf_discard_from_db(ospf
, ospf
->lsdb
, lsa
);
221 ospf_lsdb_delete_all(ospf
->lsdb
);
224 /* Delete the LSDB */
225 for (ALL_LIST_ELEMENTS(ospf
->areas
, node
, nnode
, area
))
226 ospf_area_lsdb_discard_delete(area
);
228 /* update router-lsa's for each area */
229 ospf_router_lsa_update(ospf
);
231 /* update ospf_interface's */
232 FOR_ALL_INTERFACES (vrf
, ifp
) {
236 ospf_if_update(ospf
, ifp
);
239 ospf_external_lsa_rid_change(ospf
);
242 ospf
->inst_shutdown
= 0;
245 void ospf_router_id_update(struct ospf
*ospf
)
247 ospf_process_refresh_data(ospf
, false);
250 void ospf_process_reset(struct ospf
*ospf
)
252 ospf_process_refresh_data(ospf
, true);
255 void ospf_neighbor_reset(struct ospf
*ospf
, struct in_addr nbr_id
,
258 struct route_node
*rn
;
259 struct ospf_neighbor
*nbr
;
260 struct ospf_interface
*oi
;
261 struct listnode
*node
;
263 /* Clear only a particular nbr with nbr router id as nbr_id */
264 if (nbr_str
!= NULL
) {
265 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
266 nbr
= ospf_nbr_lookup_by_routerid(oi
->nbrs
, &nbr_id
);
268 OSPF_NSM_EVENT_EXECUTE(nbr
, NSM_KillNbr
);
273 /* send Neighbor event KillNbr to all associated neighbors. */
274 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
275 for (rn
= route_top(oi
->nbrs
); rn
; rn
= route_next(rn
)) {
277 if (nbr
&& (nbr
!= oi
->nbr_self
))
278 OSPF_NSM_EVENT_EXECUTE(nbr
, NSM_KillNbr
);
283 /* For OSPF area sort by area id. */
284 static int ospf_area_id_cmp(struct ospf_area
*a1
, struct ospf_area
*a2
)
286 if (ntohl(a1
->area_id
.s_addr
) > ntohl(a2
->area_id
.s_addr
))
288 if (ntohl(a1
->area_id
.s_addr
) < ntohl(a2
->area_id
.s_addr
))
293 struct ospf
*ospf_new_alloc(unsigned short instance
, const char *name
)
296 struct vrf
*vrf
= NULL
;
298 struct ospf
*new = XCALLOC(MTYPE_OSPF_TOP
, sizeof(struct ospf
));
300 new->instance
= instance
;
301 new->router_id
.s_addr
= htonl(0);
302 new->router_id_static
.s_addr
= htonl(0);
304 vrf
= vrf_lookup_by_name(name
);
306 new->vrf_id
= vrf
->vrf_id
;
308 new->vrf_id
= VRF_UNKNOWN
;
309 /* Freed in ospf_finish_final */
310 new->name
= XSTRDUP(MTYPE_OSPF_TOP
, name
);
311 if (IS_DEBUG_OSPF_EVENT
)
313 "%s: Create new ospf instance with vrf_name %s vrf_id %u",
314 __func__
, name
, new->vrf_id
);
316 new->vrf_id
= VRF_DEFAULT
;
317 vrf
= vrf_lookup_by_id(VRF_DEFAULT
);
321 ospf_vrf_link(new, vrf
);
323 ospf_zebra_vrf_register(new);
325 new->abr_type
= OSPF_ABR_DEFAULT
;
326 new->oiflist
= list_new();
327 new->vlinks
= list_new();
328 new->areas
= list_new();
329 new->areas
->cmp
= (int (*)(void *, void *))ospf_area_id_cmp
;
330 new->networks
= route_table_init();
331 new->nbr_nbma
= route_table_init();
333 new->lsdb
= ospf_lsdb_new();
335 new->default_originate
= DEFAULT_ORIGINATE_NONE
;
337 new->passive_interface_default
= OSPF_IF_ACTIVE
;
339 new->new_external_route
= route_table_init();
340 new->old_external_route
= route_table_init();
341 new->external_lsas
= route_table_init();
343 new->stub_router_startup_time
= OSPF_STUB_ROUTER_UNCONFIGURED
;
344 new->stub_router_shutdown_time
= OSPF_STUB_ROUTER_UNCONFIGURED
;
345 new->stub_router_admin_set
= OSPF_STUB_ROUTER_ADMINISTRATIVE_UNSET
;
347 /* Distribute parameter init. */
348 for (i
= 0; i
<= ZEBRA_ROUTE_MAX
; i
++) {
351 new->default_metric
= -1;
352 new->ref_bandwidth
= OSPF_DEFAULT_REF_BANDWIDTH
;
355 new->min_ls_interval
= OSPF_MIN_LS_INTERVAL
;
356 new->min_ls_arrival
= OSPF_MIN_LS_ARRIVAL
;
358 /* SPF timer value init. */
359 new->spf_delay
= OSPF_SPF_DELAY_DEFAULT
;
360 new->spf_holdtime
= OSPF_SPF_HOLDTIME_DEFAULT
;
361 new->spf_max_holdtime
= OSPF_SPF_MAX_HOLDTIME_DEFAULT
;
362 new->spf_hold_multiplier
= 1;
365 new->maxage_delay
= OSPF_LSA_MAXAGE_REMOVE_DELAY_DEFAULT
;
366 new->maxage_lsa
= route_table_init();
367 new->t_maxage_walker
= NULL
;
369 /* Distance table init. */
370 new->distance_table
= route_table_init();
372 new->lsa_refresh_queue
.index
= 0;
373 new->lsa_refresh_interval
= OSPF_LSA_REFRESH_INTERVAL_DEFAULT
;
374 new->t_lsa_refresher
= NULL
;
375 new->lsa_refresher_started
= monotime(NULL
);
377 new->ibuf
= stream_new(OSPF_MAX_PACKET_SIZE
+ 1);
380 new->oi_write_q
= list_new();
381 new->write_oi_count
= OSPF_WRITE_INTERFACE_COUNT_DEFAULT
;
383 new->proactive_arp
= OSPF_PROACTIVE_ARP_DEFAULT
;
385 ospf_gr_helper_init(new);
387 ospf_asbr_external_aggregator_init(new);
396 /* Allocate new ospf structure. */
397 static struct ospf
*ospf_new(unsigned short instance
, const char *name
)
401 new = ospf_new_alloc(instance
, name
);
403 if ((ospf_sock_init(new)) < 0) {
404 if (new->vrf_id
!= VRF_UNKNOWN
)
407 "%s: ospf_sock_init is unable to open a socket",
412 thread_add_timer(master
, ospf_lsa_maxage_walker
, new,
413 OSPF_LSA_MAXAGE_CHECK_INTERVAL
, &new->t_maxage_walker
);
414 thread_add_timer(master
, ospf_lsa_refresh_walker
, new,
415 new->lsa_refresh_interval
, &new->t_lsa_refresher
);
417 thread_add_read(master
, ospf_read
, new, new->fd
, &new->t_read
);
422 struct ospf
*ospf_lookup_instance(unsigned short instance
)
425 struct listnode
*node
, *nnode
;
427 if (listcount(om
->ospf
) == 0)
430 for (ALL_LIST_ELEMENTS(om
->ospf
, node
, nnode
, ospf
))
431 if ((ospf
->instance
== 0 && instance
== 0)
432 || (ospf
->instance
&& instance
433 && ospf
->instance
== instance
))
439 static int ospf_is_ready(struct ospf
*ospf
)
441 /* OSPF must be on and Router-ID must be configured. */
442 if (!ospf
|| ospf
->router_id
.s_addr
== INADDR_ANY
)
448 static void ospf_add(struct ospf
*ospf
)
450 listnode_add(om
->ospf
, ospf
);
453 static void ospf_delete(struct ospf
*ospf
)
455 listnode_delete(om
->ospf
, ospf
);
458 struct ospf
*ospf_lookup_by_inst_name(unsigned short instance
, const char *name
)
460 struct ospf
*ospf
= NULL
;
461 struct listnode
*node
, *nnode
;
463 if (name
== NULL
|| strmatch(name
, VRF_DEFAULT_NAME
))
464 return ospf_lookup_by_vrf_id(VRF_DEFAULT
);
466 for (ALL_LIST_ELEMENTS(om
->ospf
, node
, nnode
, ospf
)) {
467 if ((ospf
->instance
== instance
)
468 && ((ospf
->name
== NULL
&& name
== NULL
)
469 || (ospf
->name
&& name
470 && strcmp(ospf
->name
, name
) == 0)))
476 static void ospf_init(struct ospf
*ospf
)
479 struct interface
*ifp
;
481 ospf_opaque_type11_lsa_init(ospf
);
483 if (ospf
->vrf_id
!= VRF_UNKNOWN
)
484 ospf
->oi_running
= 1;
486 /* Activate 'ip ospf area x' configured interfaces for given
487 * vrf. Activate area on vrf x aware interfaces.
488 * vrf_enable callback calls router_id_update which
489 * internally will call ospf_if_update to trigger
492 vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
494 FOR_ALL_INTERFACES (vrf
, ifp
) {
495 struct ospf_if_params
*params
;
496 struct route_node
*rn
;
499 params
= IF_DEF_PARAMS(ifp
);
500 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
))
503 for (rn
= route_top(IF_OIFS_PARAMS(ifp
)); rn
; rn
= route_next(rn
))
504 if ((params
= rn
->info
) && OSPF_IF_PARAM_CONFIGURED(params
, if_area
))
508 ospf_interface_area_set(ospf
, ifp
);
509 ospf
->if_ospf_cli_count
+= count
;
513 ospf_router_id_update(ospf
);
516 struct ospf
*ospf_lookup(unsigned short instance
, const char *name
)
521 ospf
= ospf_lookup_instance(instance
);
523 ospf
= ospf_lookup_by_inst_name(instance
, name
);
529 struct ospf
*ospf_get(unsigned short instance
, const char *name
, bool *created
)
533 ospf
= ospf_lookup(instance
, name
);
535 *created
= (ospf
== NULL
);
537 ospf
= ospf_new(instance
, name
);
546 struct ospf
*ospf_lookup_by_vrf_id(vrf_id_t vrf_id
)
548 struct vrf
*vrf
= NULL
;
550 vrf
= vrf_lookup_by_id(vrf_id
);
553 return (vrf
->info
) ? (struct ospf
*)vrf
->info
: NULL
;
556 /* It should only be used when processing incoming info update from zebra.
557 * Other situations, it is not sufficient to lookup the ospf instance by
558 * vrf_name only without using the instance number.
560 static struct ospf
*ospf_lookup_by_name(const char *vrf_name
)
562 struct ospf
*ospf
= NULL
;
563 struct listnode
*node
, *nnode
;
565 for (ALL_LIST_ELEMENTS(om
->ospf
, node
, nnode
, ospf
))
566 if ((ospf
->name
== NULL
&& vrf_name
== NULL
)
567 || (ospf
->name
&& vrf_name
568 && strcmp(ospf
->name
, vrf_name
) == 0))
573 /* Handle the second half of deferred shutdown. This is called either
574 * from the deferred-shutdown timer thread, or directly through
575 * ospf_deferred_shutdown_check.
577 * Function is to cleanup G-R state, if required then call ospf_finish_final
578 * to complete shutdown of this ospf instance. Possibly exit if the
579 * whole process is being shutdown and this was the last OSPF instance.
581 static void ospf_deferred_shutdown_finish(struct ospf
*ospf
)
583 ospf
->stub_router_shutdown_time
= OSPF_STUB_ROUTER_UNCONFIGURED
;
584 OSPF_TIMER_OFF(ospf
->t_deferred_shutdown
);
586 ospf_finish_final(ospf
);
588 /* *ospf is now invalid */
590 /* ospfd being shut-down? If so, was this the last ospf instance? */
591 if (CHECK_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
)
592 && (listcount(om
->ospf
) == 0)) {
599 /* Timer thread for G-R */
600 static int ospf_deferred_shutdown_timer(struct thread
*t
)
602 struct ospf
*ospf
= THREAD_ARG(t
);
604 ospf_deferred_shutdown_finish(ospf
);
609 /* Check whether deferred-shutdown must be scheduled, otherwise call
610 * down directly into second-half of instance shutdown.
612 static void ospf_deferred_shutdown_check(struct ospf
*ospf
)
614 unsigned long timeout
;
616 struct ospf_area
*area
;
618 /* deferred shutdown already running? */
619 if (ospf
->t_deferred_shutdown
)
622 /* Should we try push out max-metric LSAs? */
623 if (ospf
->stub_router_shutdown_time
!= OSPF_STUB_ROUTER_UNCONFIGURED
) {
624 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, ln
, area
)) {
625 SET_FLAG(area
->stub_router_state
,
626 OSPF_AREA_ADMIN_STUB_ROUTED
);
628 if (!CHECK_FLAG(area
->stub_router_state
,
629 OSPF_AREA_IS_STUB_ROUTED
))
630 ospf_router_lsa_update_area(area
);
632 timeout
= ospf
->stub_router_shutdown_time
;
634 /* No timer needed */
635 ospf_deferred_shutdown_finish(ospf
);
639 OSPF_TIMER_ON(ospf
->t_deferred_shutdown
, ospf_deferred_shutdown_timer
,
644 /* Shut down the entire process */
645 void ospf_terminate(void)
648 struct listnode
*node
, *nnode
;
650 /* shutdown already in progress */
651 if (CHECK_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
))
654 SET_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
);
656 /* Skip some steps if OSPF not actually running */
657 if (listcount(om
->ospf
) == 0)
661 for (ALL_LIST_ELEMENTS(om
->ospf
, node
, nnode
, ospf
))
664 /* Cleanup route maps */
667 /* reverse prefix_list_init */
668 prefix_list_add_hook(NULL
);
669 prefix_list_delete_hook(NULL
);
672 /* Cleanup vrf info */
673 ospf_vrf_terminate();
675 /* Deliberately go back up, hopefully to thread scheduler, as
676 * One or more ospf_finish()'s may have deferred shutdown to a timer
679 zclient_stop(zclient
);
680 zclient_free(zclient
);
686 void ospf_finish(struct ospf
*ospf
)
688 /* let deferred shutdown decide */
689 ospf_deferred_shutdown_check(ospf
);
691 /* if ospf_deferred_shutdown returns, then ospf_finish_final is
692 * deferred to expiry of G-S timer thread. Return back up, hopefully
693 * to thread scheduler.
698 /* Final cleanup of ospf instance */
699 static void ospf_finish_final(struct ospf
*ospf
)
702 struct route_node
*rn
;
703 struct ospf_nbr_nbma
*nbr_nbma
;
704 struct ospf_lsa
*lsa
;
705 struct ospf_interface
*oi
;
706 struct ospf_area
*area
;
707 struct ospf_vl_data
*vl_data
;
708 struct listnode
*node
, *nnode
;
713 ospf_opaque_type11_lsa_term(ospf
);
715 ospf_opaque_finish();
717 ospf_flush_self_originated_lsas_now(ospf
);
719 /* Unregister redistribution */
720 for (i
= 0; i
< ZEBRA_ROUTE_MAX
; i
++) {
721 struct list
*red_list
;
722 struct ospf_redist
*red
;
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 ospf_redistribute_default_set(ospf
, DEFAULT_ORIGINATE_NONE
, 0, 0);
735 for (ALL_LIST_ELEMENTS(ospf
->areas
, node
, nnode
, area
))
736 ospf_remove_vls_through_area(ospf
, area
);
738 for (ALL_LIST_ELEMENTS(ospf
->vlinks
, node
, nnode
, vl_data
))
739 ospf_vl_delete(ospf
, vl_data
);
741 list_delete(&ospf
->vlinks
);
743 /* shutdown LDP-Sync */
744 if (ospf
->vrf_id
== VRF_DEFAULT
)
745 ospf_ldp_sync_gbl_exit(ospf
, true);
747 /* Reset interface. */
748 for (ALL_LIST_ELEMENTS(ospf
->oiflist
, node
, nnode
, oi
))
750 list_delete(&ospf
->oiflist
);
751 ospf
->oi_running
= 0;
753 /* De-Register VRF */
754 ospf_zebra_vrf_deregister(ospf
);
756 /* Clear static neighbors */
757 for (rn
= route_top(ospf
->nbr_nbma
); rn
; rn
= route_next(rn
))
758 if ((nbr_nbma
= rn
->info
)) {
759 OSPF_POLL_TIMER_OFF(nbr_nbma
->t_poll
);
762 nbr_nbma
->nbr
->nbr_nbma
= NULL
;
763 nbr_nbma
->nbr
= NULL
;
767 listnode_delete(nbr_nbma
->oi
->nbr_nbma
,
772 XFREE(MTYPE_OSPF_NEIGHBOR_STATIC
, nbr_nbma
);
775 route_table_finish(ospf
->nbr_nbma
);
777 /* Clear networks and Areas. */
778 for (rn
= route_top(ospf
->networks
); rn
; rn
= route_next(rn
)) {
779 struct ospf_network
*network
;
781 if ((network
= rn
->info
) != NULL
) {
782 ospf_network_free(ospf
, network
);
784 route_unlock_node(rn
);
787 route_table_finish(ospf
->networks
);
789 for (ALL_LIST_ELEMENTS(ospf
->areas
, node
, nnode
, area
)) {
790 listnode_delete(ospf
->areas
, area
);
791 ospf_area_free(area
);
794 /* Cancel all timers. */
795 OSPF_TIMER_OFF(ospf
->t_read
);
796 OSPF_TIMER_OFF(ospf
->t_write
);
797 OSPF_TIMER_OFF(ospf
->t_spf_calc
);
798 OSPF_TIMER_OFF(ospf
->t_ase_calc
);
799 OSPF_TIMER_OFF(ospf
->t_maxage
);
800 OSPF_TIMER_OFF(ospf
->t_maxage_walker
);
801 OSPF_TIMER_OFF(ospf
->t_abr_task
);
802 OSPF_TIMER_OFF(ospf
->t_asbr_check
);
803 OSPF_TIMER_OFF(ospf
->t_distribute_update
);
804 OSPF_TIMER_OFF(ospf
->t_lsa_refresher
);
805 OSPF_TIMER_OFF(ospf
->t_opaque_lsa_self
);
806 OSPF_TIMER_OFF(ospf
->t_sr_update
);
807 OSPF_TIMER_OFF(ospf
->t_default_routemap_timer
);
808 OSPF_TIMER_OFF(ospf
->t_external_aggr
);
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
);
823 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 ospf_route_delete(ospf
, ospf
->new_table
);
831 ospf_route_table_free(ospf
->new_table
);
834 ospf_rtrs_free(ospf
->old_rtrs
);
836 ospf_rtrs_free(ospf
->new_rtrs
);
837 if (ospf
->new_external_route
) {
838 ospf_route_delete(ospf
, ospf
->new_external_route
);
839 ospf_route_table_free(ospf
->new_external_route
);
841 if (ospf
->old_external_route
) {
842 ospf_route_delete(ospf
, ospf
->old_external_route
);
843 ospf_route_table_free(ospf
->old_external_route
);
845 if (ospf
->external_lsas
) {
846 ospf_ase_external_lsas_finish(ospf
->external_lsas
);
849 for (i
= ZEBRA_ROUTE_SYSTEM
; i
<= ZEBRA_ROUTE_MAX
; i
++) {
850 struct list
*ext_list
;
851 struct ospf_external
*ext
;
853 ext_list
= ospf
->external
[i
];
857 for (ALL_LIST_ELEMENTS(ext_list
, node
, nnode
, ext
)) {
858 if (ext
->external_info
)
859 for (rn
= route_top(ext
->external_info
); rn
;
860 rn
= route_next(rn
)) {
861 if (rn
->info
== NULL
)
864 XFREE(MTYPE_OSPF_EXTERNAL_INFO
,
867 route_unlock_node(rn
);
870 ospf_external_del(ospf
, i
, ext
->instance
);
874 ospf_distance_reset(ospf
);
875 route_table_finish(ospf
->distance_table
);
877 /* Release extrenal Aggregator table */
878 for (rn
= route_top(ospf
->rt_aggr_tbl
); rn
; rn
= route_next(rn
)) {
879 struct ospf_external_aggr_rt
*aggr
;
884 ospf_external_aggregator_free(aggr
);
886 route_unlock_node(rn
);
890 route_table_finish(ospf
->rt_aggr_tbl
);
893 list_delete(&ospf
->areas
);
894 list_delete(&ospf
->oi_write_q
);
896 /* Reset GR helper data structers */
897 ospf_gr_helper_stop(ospf
);
900 stream_free(ospf
->ibuf
);
905 vrf
= vrf_lookup_by_name(ospf
->name
);
907 ospf_vrf_unlink(ospf
, vrf
);
908 XFREE(MTYPE_OSPF_TOP
, ospf
->name
);
910 vrf
= vrf_lookup_by_id(VRF_DEFAULT
);
912 ospf_vrf_unlink(ospf
, vrf
);
915 XFREE(MTYPE_OSPF_TOP
, ospf
);
919 /* allocate new OSPF Area object */
920 struct ospf_area
*ospf_area_new(struct ospf
*ospf
, struct in_addr area_id
)
922 struct ospf_area
*new;
924 /* Allocate new config_network. */
925 new = XCALLOC(MTYPE_OSPF_AREA
, sizeof(struct ospf_area
));
929 new->area_id
= area_id
;
930 new->area_id_fmt
= OSPF_AREA_ID_FMT_DOTTEDQUAD
;
932 new->external_routing
= OSPF_AREA_DEFAULT
;
933 new->default_cost
= 1;
934 new->auth_type
= OSPF_AUTH_NULL
;
937 new->lsdb
= ospf_lsdb_new();
939 /* Self-originated LSAs initialize. */
940 new->router_lsa_self
= NULL
;
942 ospf_opaque_type10_lsa_init(new);
944 new->oiflist
= list_new();
945 new->ranges
= route_table_init();
947 if (area_id
.s_addr
== OSPF_AREA_BACKBONE
)
948 ospf
->backbone
= new;
953 void ospf_area_lsdb_discard_delete(struct ospf_area
*area
)
955 struct route_node
*rn
;
956 struct ospf_lsa
*lsa
;
958 LSDB_LOOP (ROUTER_LSDB(area
), rn
, lsa
)
959 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
960 LSDB_LOOP (NETWORK_LSDB(area
), rn
, lsa
)
961 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
962 LSDB_LOOP (SUMMARY_LSDB(area
), rn
, lsa
)
963 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
964 LSDB_LOOP (ASBR_SUMMARY_LSDB(area
), rn
, lsa
)
965 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
967 LSDB_LOOP (NSSA_LSDB(area
), rn
, lsa
)
968 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
969 LSDB_LOOP (OPAQUE_AREA_LSDB(area
), rn
, lsa
)
970 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
971 LSDB_LOOP (OPAQUE_LINK_LSDB(area
), rn
, lsa
)
972 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
974 ospf_lsdb_delete_all(area
->lsdb
);
977 static void ospf_area_free(struct ospf_area
*area
)
979 ospf_opaque_type10_lsa_term(area
);
982 ospf_area_lsdb_discard_delete(area
);
984 ospf_lsdb_free(area
->lsdb
);
986 ospf_lsa_unlock(&area
->router_lsa_self
);
988 route_table_finish(area
->ranges
);
989 list_delete(&area
->oiflist
);
991 if (EXPORT_NAME(area
))
992 free(EXPORT_NAME(area
));
994 if (IMPORT_NAME(area
))
995 free(IMPORT_NAME(area
));
998 OSPF_TIMER_OFF(area
->t_stub_router
);
999 OSPF_TIMER_OFF(area
->t_opaque_lsa_self
);
1001 if (OSPF_IS_AREA_BACKBONE(area
))
1002 area
->ospf
->backbone
= NULL
;
1004 XFREE(MTYPE_OSPF_AREA
, area
);
1007 void ospf_area_check_free(struct ospf
*ospf
, struct in_addr area_id
)
1009 struct ospf_area
*area
;
1011 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1012 if (area
&& listcount(area
->oiflist
) == 0 && area
->ranges
->top
== NULL
1013 && !ospf_vl_count(ospf
, area
)
1014 && area
->shortcut_configured
== OSPF_SHORTCUT_DEFAULT
1015 && area
->external_routing
== OSPF_AREA_DEFAULT
1016 && area
->no_summary
== 0 && area
->default_cost
== 1
1017 && EXPORT_NAME(area
) == NULL
&& IMPORT_NAME(area
) == NULL
1018 && area
->auth_type
== OSPF_AUTH_NULL
) {
1019 listnode_delete(ospf
->areas
, area
);
1020 ospf_area_free(area
);
1024 struct ospf_area
*ospf_area_get(struct ospf
*ospf
, struct in_addr area_id
)
1026 struct ospf_area
*area
;
1028 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1030 area
= ospf_area_new(ospf
, area_id
);
1031 listnode_add_sort(ospf
->areas
, area
);
1032 ospf_check_abr_status(ospf
);
1033 if (ospf
->stub_router_admin_set
1034 == OSPF_STUB_ROUTER_ADMINISTRATIVE_SET
) {
1035 SET_FLAG(area
->stub_router_state
,
1036 OSPF_AREA_ADMIN_STUB_ROUTED
);
1043 struct ospf_area
*ospf_area_lookup_by_area_id(struct ospf
*ospf
,
1044 struct in_addr area_id
)
1046 struct ospf_area
*area
;
1047 struct listnode
*node
;
1049 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
))
1050 if (IPV4_ADDR_SAME(&area
->area_id
, &area_id
))
1056 void ospf_area_add_if(struct ospf_area
*area
, struct ospf_interface
*oi
)
1058 listnode_add(area
->oiflist
, oi
);
1061 void ospf_area_del_if(struct ospf_area
*area
, struct ospf_interface
*oi
)
1063 listnode_delete(area
->oiflist
, oi
);
1067 struct ospf_interface
*add_ospf_interface(struct connected
*co
,
1068 struct ospf_area
*area
)
1070 struct ospf_interface
*oi
;
1072 oi
= ospf_if_new(area
->ospf
, co
->ifp
, co
->address
);
1077 oi
->params
= ospf_lookup_if_params(co
->ifp
, oi
->address
->u
.prefix4
);
1078 oi
->output_cost
= ospf_if_get_output_cost(oi
);
1080 /* Relate ospf interface to ospf instance. */
1081 oi
->ospf
= area
->ospf
;
1083 /* update network type as interface flag */
1084 /* If network type is specified previously,
1085 skip network type setting. */
1086 oi
->type
= IF_DEF_PARAMS(co
->ifp
)->type
;
1088 /* Add pseudo neighbor. */
1089 ospf_nbr_self_reset(oi
, oi
->ospf
->router_id
);
1091 ospf_area_add_if(oi
->area
, oi
);
1093 /* if LDP-IGP Sync is configured globally inherit config */
1094 ospf_ldp_sync_if_init(oi
);
1097 * if router_id is not configured, dont bring up
1099 * ospf_router_id_update() will call ospf_if_update
1100 * whenever r-id is configured instead.
1102 if ((area
->ospf
->router_id
.s_addr
!= INADDR_ANY
)
1103 && if_is_operative(co
->ifp
))
1109 static void update_redistributed(struct ospf
*ospf
, int add_to_ospf
)
1111 struct route_node
*rn
;
1112 struct external_info
*ei
;
1113 struct ospf_external
*ext
;
1115 if (ospf_is_type_redistributed(ospf
, ZEBRA_ROUTE_CONNECT
, 0)) {
1116 ext
= ospf_external_lookup(ospf
, ZEBRA_ROUTE_CONNECT
, 0);
1117 if ((ext
) && EXTERNAL_INFO(ext
)) {
1118 for (rn
= route_top(EXTERNAL_INFO(ext
)); rn
;
1119 rn
= route_next(rn
)) {
1125 if (ospf_external_info_find_lsa(ospf
,
1127 if (!ospf_distribute_check_connected(
1129 ospf_external_lsa_flush(
1132 ei
->ifindex
/*, ei->nexthop */);
1134 if (!ospf_external_info_find_lsa(
1136 if (ospf_distribute_check_connected(
1138 ospf_external_lsa_originate(
1146 /* Config network statement related functions. */
1147 static struct ospf_network
*ospf_network_new(struct in_addr area_id
)
1149 struct ospf_network
*new;
1150 new = XCALLOC(MTYPE_OSPF_NETWORK
, sizeof(struct ospf_network
));
1152 new->area_id
= area_id
;
1153 new->area_id_fmt
= OSPF_AREA_ID_FMT_DOTTEDQUAD
;
1158 static void ospf_network_free(struct ospf
*ospf
, struct ospf_network
*network
)
1160 ospf_area_check_free(ospf
, network
->area_id
);
1161 ospf_schedule_abr_task(ospf
);
1162 XFREE(MTYPE_OSPF_NETWORK
, network
);
1165 int ospf_network_set(struct ospf
*ospf
, struct prefix_ipv4
*p
,
1166 struct in_addr area_id
, int df
)
1168 struct ospf_network
*network
;
1169 struct ospf_area
*area
;
1170 struct route_node
*rn
;
1172 rn
= route_node_get(ospf
->networks
, (struct prefix
*)p
);
1175 route_unlock_node(rn
);
1177 if (IPV4_ADDR_SAME(&area_id
, &network
->area_id
)) {
1180 /* There is already same network statement. */
1185 rn
->info
= network
= ospf_network_new(area_id
);
1186 network
->area_id_fmt
= df
;
1187 area
= ospf_area_get(ospf
, area_id
);
1188 ospf_area_display_format_set(ospf
, area
, df
);
1190 /* Run network config now. */
1191 ospf_network_run((struct prefix
*)p
, area
);
1193 /* Update connected redistribute. */
1194 update_redistributed(ospf
, 1); /* interfaces possibly added */
1196 ospf_area_check_free(ospf
, area_id
);
1201 int ospf_network_unset(struct ospf
*ospf
, struct prefix_ipv4
*p
,
1202 struct in_addr area_id
)
1204 struct route_node
*rn
;
1205 struct ospf_network
*network
;
1206 struct listnode
*node
, *nnode
;
1207 struct ospf_interface
*oi
;
1209 rn
= route_node_lookup(ospf
->networks
, (struct prefix
*)p
);
1214 route_unlock_node(rn
);
1215 if (!IPV4_ADDR_SAME(&area_id
, &network
->area_id
))
1218 ospf_network_free(ospf
, rn
->info
);
1220 route_unlock_node(rn
); /* initial reference */
1222 /* Find interfaces that are not configured already. */
1223 for (ALL_LIST_ELEMENTS(ospf
->oiflist
, node
, nnode
, oi
)) {
1225 if (oi
->type
== OSPF_IFTYPE_VIRTUALLINK
)
1228 ospf_network_run_subnet(ospf
, oi
->connected
, NULL
, NULL
);
1231 /* Update connected redistribute. */
1232 update_redistributed(ospf
, 0); /* interfaces possibly removed */
1233 ospf_area_check_free(ospf
, area_id
);
1238 /* Ensure there's an OSPF instance, as "ip ospf area" enabled OSPF means
1239 * there might not be any 'router ospf' config.
1241 * Otherwise, doesn't do anything different to ospf_if_update for now
1243 void ospf_interface_area_set(struct ospf
*ospf
, struct interface
*ifp
)
1248 ospf_if_update(ospf
, ifp
);
1249 /* if_update does a update_redistributed */
1254 void ospf_interface_area_unset(struct ospf
*ospf
, struct interface
*ifp
)
1256 struct route_node
*rn_oi
;
1259 return; /* Ospf not ready yet */
1261 /* Find interfaces that may need to be removed. */
1262 for (rn_oi
= route_top(IF_OIFS(ifp
)); rn_oi
;
1263 rn_oi
= route_next(rn_oi
)) {
1264 struct ospf_interface
*oi
= NULL
;
1266 if ((oi
= rn_oi
->info
) == NULL
)
1269 if (oi
->type
== OSPF_IFTYPE_VIRTUALLINK
)
1272 ospf_network_run_subnet(ospf
, oi
->connected
, NULL
, NULL
);
1275 /* Update connected redistribute. */
1276 update_redistributed(ospf
, 0); /* interfaces possibly removed */
1279 /* Check whether interface matches given network
1280 * returns: 1, true. 0, false
1282 static int ospf_network_match_iface(const struct connected
*co
,
1283 const struct prefix
*net
)
1285 /* new approach: more elegant and conceptually clean */
1286 return prefix_match_network_statement(net
, CONNECTED_PREFIX(co
));
1289 static void ospf_update_interface_area(struct connected
*co
,
1290 struct ospf_area
*area
)
1292 struct ospf_interface
*oi
= ospf_if_table_lookup(co
->ifp
, co
->address
);
1294 /* nothing to be done case */
1295 if (oi
&& oi
->area
== area
) {
1302 add_ospf_interface(co
, area
);
1305 /* Run OSPF for the given subnet, taking into account the following
1306 * possible sources of area configuration, in the given order of preference:
1308 * - Whether there is interface+address specific area configuration
1309 * - Whether there is a default area for the interface
1310 * - Whether there is an area given as a parameter.
1311 * - If no specific network prefix/area is supplied, whether there's
1312 * a matching network configured.
1314 static void ospf_network_run_subnet(struct ospf
*ospf
, struct connected
*co
,
1316 struct ospf_area
*given_area
)
1318 struct ospf_interface
*oi
;
1319 struct ospf_if_params
*params
;
1320 struct ospf_area
*area
= NULL
;
1321 struct route_node
*rn
;
1324 if (CHECK_FLAG(co
->flags
, ZEBRA_IFA_SECONDARY
))
1327 if (co
->address
->family
!= AF_INET
)
1330 /* Try determine the appropriate area for this interface + address
1331 * Start by checking interface config
1333 params
= ospf_lookup_if_params(co
->ifp
, co
->address
->u
.prefix4
);
1334 if (params
&& OSPF_IF_PARAM_CONFIGURED(params
, if_area
))
1335 area
= ospf_area_get(ospf
, params
->if_area
);
1337 params
= IF_DEF_PARAMS(co
->ifp
);
1338 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
))
1339 area
= ospf_area_get(ospf
, params
->if_area
);
1342 /* If we've found an interface and/or addr specific area, then we're
1346 ospf_update_interface_area(co
, area
);
1350 /* Otherwise, only remaining possibility is a matching network statement
1353 assert(given_area
!= NULL
);
1355 /* Which either was supplied as a parameter.. (e.g. cause a new
1356 * network/area was just added)..
1358 if (p
->family
== co
->address
->family
1359 && ospf_network_match_iface(co
, p
))
1360 ospf_update_interface_area(co
, given_area
);
1365 /* Else we have to search the existing network/area config to see
1368 for (rn
= route_top(ospf
->networks
); rn
; rn
= route_next(rn
))
1369 if (rn
->info
!= NULL
&& ospf_network_match_iface(co
, &rn
->p
)) {
1370 struct ospf_network
*network
=
1371 (struct ospf_network
*)rn
->info
;
1372 area
= ospf_area_get(ospf
, network
->area_id
);
1373 ospf_update_interface_area(co
, area
);
1377 /* If the subnet isn't in any area, deconfigure */
1378 if (!configed
&& (oi
= ospf_if_table_lookup(co
->ifp
, co
->address
)))
1382 static void ospf_network_run_interface(struct ospf
*ospf
, struct interface
*ifp
,
1384 struct ospf_area
*given_area
)
1386 struct listnode
*cnode
;
1387 struct connected
*co
;
1389 if (memcmp(ifp
->name
, "VLINK", 5) == 0)
1392 /* Network prefix without area is nonsensical */
1394 assert(given_area
!= NULL
);
1396 /* if interface prefix is match specified prefix,
1397 then create socket and join multicast group. */
1398 for (ALL_LIST_ELEMENTS_RO(ifp
->connected
, cnode
, co
))
1399 ospf_network_run_subnet(ospf
, co
, p
, given_area
);
1402 static void ospf_network_run(struct prefix
*p
, struct ospf_area
*area
)
1404 struct vrf
*vrf
= vrf_lookup_by_id(area
->ospf
->vrf_id
);
1405 struct interface
*ifp
;
1407 /* Schedule Router ID Update. */
1408 if (area
->ospf
->router_id
.s_addr
== INADDR_ANY
)
1409 ospf_router_id_update(area
->ospf
);
1411 /* Get target interface. */
1412 FOR_ALL_INTERFACES (vrf
, ifp
)
1413 ospf_network_run_interface(area
->ospf
, ifp
, p
, area
);
1416 void ospf_ls_upd_queue_empty(struct ospf_interface
*oi
)
1418 struct route_node
*rn
;
1419 struct listnode
*node
, *nnode
;
1421 struct ospf_lsa
*lsa
;
1423 /* empty ls update queue */
1424 for (rn
= route_top(oi
->ls_upd_queue
); rn
; rn
= route_next(rn
))
1425 if ((lst
= (struct list
*)rn
->info
)) {
1426 for (ALL_LIST_ELEMENTS(lst
, node
, nnode
, lsa
))
1427 ospf_lsa_unlock(&lsa
); /* oi->ls_upd_queue */
1432 /* remove update event */
1433 thread_cancel(&oi
->t_ls_upd_event
);
1436 void ospf_if_update(struct ospf
*ospf
, struct interface
*ifp
)
1442 if (IS_DEBUG_OSPF_EVENT
)
1444 "%s: interface %s ifp->vrf_id %u ospf vrf %s vrf_id %u router_id %pI4",
1445 __func__
, ifp
->name
, ifp
->vrf_id
,
1446 ospf_vrf_id_to_name(ospf
->vrf_id
), ospf
->vrf_id
,
1449 /* OSPF must be ready. */
1450 if (!ospf_is_ready(ospf
))
1453 ospf_network_run_interface(ospf
, ifp
, NULL
, NULL
);
1455 /* Update connected redistribute. */
1456 update_redistributed(ospf
, 1);
1460 void ospf_remove_vls_through_area(struct ospf
*ospf
, struct ospf_area
*area
)
1462 struct listnode
*node
, *nnode
;
1463 struct ospf_vl_data
*vl_data
;
1465 for (ALL_LIST_ELEMENTS(ospf
->vlinks
, node
, nnode
, vl_data
))
1466 if (IPV4_ADDR_SAME(&vl_data
->vl_area_id
, &area
->area_id
))
1467 ospf_vl_delete(ospf
, vl_data
);
1471 static const struct message ospf_area_type_msg
[] = {
1472 {OSPF_AREA_DEFAULT
, "Default"},
1473 {OSPF_AREA_STUB
, "Stub"},
1474 {OSPF_AREA_NSSA
, "NSSA"},
1477 static void ospf_area_type_set(struct ospf_area
*area
, int type
)
1479 struct listnode
*node
;
1480 struct ospf_interface
*oi
;
1482 if (area
->external_routing
== type
) {
1483 if (IS_DEBUG_OSPF_EVENT
)
1484 zlog_debug("Area[%pI4]: Types are the same, ignored.",
1489 area
->external_routing
= type
;
1491 if (IS_DEBUG_OSPF_EVENT
)
1492 zlog_debug("Area[%pI4]: Configured as %s",
1494 lookup_msg(ospf_area_type_msg
, type
, NULL
));
1496 switch (area
->external_routing
) {
1497 case OSPF_AREA_DEFAULT
:
1498 for (ALL_LIST_ELEMENTS_RO(area
->oiflist
, node
, oi
))
1499 if (oi
->nbr_self
!= NULL
) {
1500 UNSET_FLAG(oi
->nbr_self
->options
,
1502 SET_FLAG(oi
->nbr_self
->options
, OSPF_OPTION_E
);
1505 case OSPF_AREA_STUB
:
1506 for (ALL_LIST_ELEMENTS_RO(area
->oiflist
, node
, oi
))
1507 if (oi
->nbr_self
!= NULL
) {
1508 if (IS_DEBUG_OSPF_EVENT
)
1510 "setting options on %s accordingly",
1512 UNSET_FLAG(oi
->nbr_self
->options
,
1514 UNSET_FLAG(oi
->nbr_self
->options
,
1516 if (IS_DEBUG_OSPF_EVENT
)
1517 zlog_debug("options set on %s: %x",
1518 IF_NAME(oi
), OPTIONS(oi
));
1521 case OSPF_AREA_NSSA
:
1522 for (ALL_LIST_ELEMENTS_RO(area
->oiflist
, node
, oi
))
1523 if (oi
->nbr_self
!= NULL
) {
1525 "setting nssa options on %s accordingly",
1527 UNSET_FLAG(oi
->nbr_self
->options
,
1529 SET_FLAG(oi
->nbr_self
->options
, OSPF_OPTION_NP
);
1530 zlog_debug("options set on %s: %x", IF_NAME(oi
),
1538 ospf_router_lsa_update_area(area
);
1539 ospf_schedule_abr_task(area
->ospf
);
1542 int ospf_area_shortcut_set(struct ospf
*ospf
, struct ospf_area
*area
, int mode
)
1544 if (area
->shortcut_configured
== mode
)
1547 area
->shortcut_configured
= mode
;
1548 ospf_router_lsa_update_area(area
);
1549 ospf_schedule_abr_task(ospf
);
1551 ospf_area_check_free(ospf
, area
->area_id
);
1556 int ospf_area_shortcut_unset(struct ospf
*ospf
, struct ospf_area
*area
)
1558 area
->shortcut_configured
= OSPF_SHORTCUT_DEFAULT
;
1559 ospf_router_lsa_update_area(area
);
1560 ospf_area_check_free(ospf
, area
->area_id
);
1561 ospf_schedule_abr_task(ospf
);
1566 static int ospf_area_vlink_count(struct ospf
*ospf
, struct ospf_area
*area
)
1568 struct ospf_vl_data
*vl
;
1569 struct listnode
*node
;
1572 for (ALL_LIST_ELEMENTS_RO(ospf
->vlinks
, node
, vl
))
1573 if (IPV4_ADDR_SAME(&vl
->vl_area_id
, &area
->area_id
))
1579 int ospf_area_display_format_set(struct ospf
*ospf
, struct ospf_area
*area
,
1582 area
->area_id_fmt
= df
;
1587 int ospf_area_stub_set(struct ospf
*ospf
, struct in_addr area_id
)
1589 struct ospf_area
*area
;
1591 area
= ospf_area_get(ospf
, area_id
);
1592 if (ospf_area_vlink_count(ospf
, area
))
1595 if (area
->external_routing
!= OSPF_AREA_STUB
)
1596 ospf_area_type_set(area
, OSPF_AREA_STUB
);
1601 int ospf_area_stub_unset(struct ospf
*ospf
, struct in_addr area_id
)
1603 struct ospf_area
*area
;
1605 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1609 if (area
->external_routing
== OSPF_AREA_STUB
)
1610 ospf_area_type_set(area
, OSPF_AREA_DEFAULT
);
1612 ospf_area_check_free(ospf
, area_id
);
1617 int ospf_area_no_summary_set(struct ospf
*ospf
, struct in_addr area_id
)
1619 struct ospf_area
*area
;
1621 area
= ospf_area_get(ospf
, area_id
);
1622 area
->no_summary
= 1;
1627 int ospf_area_no_summary_unset(struct ospf
*ospf
, struct in_addr area_id
)
1629 struct ospf_area
*area
;
1631 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1635 area
->no_summary
= 0;
1636 ospf_area_check_free(ospf
, area_id
);
1641 int ospf_area_nssa_no_summary_set(struct ospf
*ospf
, struct in_addr area_id
)
1643 struct ospf_area
*area
;
1645 area
= ospf_area_get(ospf
, area_id
);
1646 if (ospf_area_vlink_count(ospf
, area
))
1649 if (area
->external_routing
!= OSPF_AREA_NSSA
) {
1650 ospf_area_type_set(area
, OSPF_AREA_NSSA
);
1652 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1655 ospf_area_no_summary_set(ospf
, area_id
);
1660 int ospf_area_nssa_set(struct ospf
*ospf
, struct in_addr area_id
)
1662 struct ospf_area
*area
;
1664 area
= ospf_area_get(ospf
, area_id
);
1665 if (ospf_area_vlink_count(ospf
, area
))
1668 if (area
->external_routing
!= OSPF_AREA_NSSA
) {
1669 ospf_area_type_set(area
, OSPF_AREA_NSSA
);
1672 /* set NSSA area defaults */
1673 area
->no_summary
= 0;
1674 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1675 area
->NSSATranslatorState
= OSPF_NSSA_TRANSLATE_DISABLED
;
1676 area
->NSSATranslatorStabilityInterval
=
1677 OSPF_NSSA_TRANS_STABLE_DEFAULT
;
1682 int ospf_area_nssa_unset(struct ospf
*ospf
, struct in_addr area_id
, int argc
)
1684 struct ospf_area
*area
;
1686 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1690 /* argc < 5 -> 'no area x nssa' */
1691 if (argc
< 5 && area
->external_routing
== OSPF_AREA_NSSA
) {
1693 /* set NSSA area defaults */
1694 area
->no_summary
= 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_translator_role_set(struct ospf
*ospf
,
1711 struct in_addr area_id
, int role
)
1713 struct ospf_area
*area
;
1715 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1719 if (role
!= area
->NSSATranslatorRole
) {
1720 if ((area
->NSSATranslatorRole
== OSPF_NSSA_ROLE_ALWAYS
)
1721 || (role
== OSPF_NSSA_ROLE_ALWAYS
)) {
1723 * if new role is OSPF_NSSA_ROLE_ALWAYS we need to set
1724 * Nt bit, if the role was OSPF_NSSA_ROLE_ALWAYS we need
1727 area
->NSSATranslatorRole
= role
;
1728 ospf_router_lsa_update_area(area
);
1730 area
->NSSATranslatorRole
= role
;
1736 int ospf_area_export_list_set(struct ospf
*ospf
, struct ospf_area
*area
,
1737 const char *list_name
)
1739 struct access_list
*list
;
1740 list
= access_list_lookup(AFI_IP
, list_name
);
1742 EXPORT_LIST(area
) = list
;
1744 if (EXPORT_NAME(area
))
1745 free(EXPORT_NAME(area
));
1747 EXPORT_NAME(area
) = strdup(list_name
);
1748 ospf_schedule_abr_task(ospf
);
1753 int ospf_area_export_list_unset(struct ospf
*ospf
, struct ospf_area
*area
)
1756 EXPORT_LIST(area
) = 0;
1758 if (EXPORT_NAME(area
))
1759 free(EXPORT_NAME(area
));
1761 EXPORT_NAME(area
) = NULL
;
1763 ospf_area_check_free(ospf
, area
->area_id
);
1765 ospf_schedule_abr_task(ospf
);
1770 int ospf_area_import_list_set(struct ospf
*ospf
, struct ospf_area
*area
,
1773 struct access_list
*list
;
1774 list
= access_list_lookup(AFI_IP
, name
);
1776 IMPORT_LIST(area
) = list
;
1778 if (IMPORT_NAME(area
))
1779 free(IMPORT_NAME(area
));
1781 IMPORT_NAME(area
) = strdup(name
);
1782 ospf_schedule_abr_task(ospf
);
1787 int ospf_area_import_list_unset(struct ospf
*ospf
, struct ospf_area
*area
)
1789 IMPORT_LIST(area
) = 0;
1791 if (IMPORT_NAME(area
))
1792 free(IMPORT_NAME(area
));
1794 IMPORT_NAME(area
) = NULL
;
1795 ospf_area_check_free(ospf
, area
->area_id
);
1797 ospf_schedule_abr_task(ospf
);
1802 int ospf_timers_refresh_set(struct ospf
*ospf
, int interval
)
1806 if (ospf
->lsa_refresh_interval
== interval
)
1809 time_left
= ospf
->lsa_refresh_interval
1810 - (monotime(NULL
) - ospf
->lsa_refresher_started
);
1812 if (time_left
> interval
) {
1813 OSPF_TIMER_OFF(ospf
->t_lsa_refresher
);
1814 thread_add_timer(master
, ospf_lsa_refresh_walker
, ospf
,
1815 interval
, &ospf
->t_lsa_refresher
);
1817 ospf
->lsa_refresh_interval
= interval
;
1822 int ospf_timers_refresh_unset(struct ospf
*ospf
)
1826 time_left
= ospf
->lsa_refresh_interval
1827 - (monotime(NULL
) - ospf
->lsa_refresher_started
);
1829 if (time_left
> OSPF_LSA_REFRESH_INTERVAL_DEFAULT
) {
1830 OSPF_TIMER_OFF(ospf
->t_lsa_refresher
);
1831 ospf
->t_lsa_refresher
= NULL
;
1832 thread_add_timer(master
, ospf_lsa_refresh_walker
, ospf
,
1833 OSPF_LSA_REFRESH_INTERVAL_DEFAULT
,
1834 &ospf
->t_lsa_refresher
);
1837 ospf
->lsa_refresh_interval
= OSPF_LSA_REFRESH_INTERVAL_DEFAULT
;
1843 static struct ospf_nbr_nbma
*ospf_nbr_nbma_new(void)
1845 struct ospf_nbr_nbma
*nbr_nbma
;
1847 nbr_nbma
= XCALLOC(MTYPE_OSPF_NEIGHBOR_STATIC
,
1848 sizeof(struct ospf_nbr_nbma
));
1850 nbr_nbma
->priority
= OSPF_NEIGHBOR_PRIORITY_DEFAULT
;
1851 nbr_nbma
->v_poll
= OSPF_POLL_INTERVAL_DEFAULT
;
1856 static void ospf_nbr_nbma_free(struct ospf_nbr_nbma
*nbr_nbma
)
1858 XFREE(MTYPE_OSPF_NEIGHBOR_STATIC
, nbr_nbma
);
1861 static void ospf_nbr_nbma_delete(struct ospf
*ospf
,
1862 struct ospf_nbr_nbma
*nbr_nbma
)
1864 struct route_node
*rn
;
1865 struct prefix_ipv4 p
;
1868 p
.prefix
= nbr_nbma
->addr
;
1869 p
.prefixlen
= IPV4_MAX_BITLEN
;
1871 rn
= route_node_lookup(ospf
->nbr_nbma
, (struct prefix
*)&p
);
1873 ospf_nbr_nbma_free(rn
->info
);
1875 route_unlock_node(rn
);
1876 route_unlock_node(rn
);
1880 static void ospf_nbr_nbma_down(struct ospf_nbr_nbma
*nbr_nbma
)
1882 OSPF_TIMER_OFF(nbr_nbma
->t_poll
);
1884 if (nbr_nbma
->nbr
) {
1885 nbr_nbma
->nbr
->nbr_nbma
= NULL
;
1886 OSPF_NSM_EVENT_EXECUTE(nbr_nbma
->nbr
, NSM_KillNbr
);
1890 listnode_delete(nbr_nbma
->oi
->nbr_nbma
, nbr_nbma
);
1893 static void ospf_nbr_nbma_add(struct ospf_nbr_nbma
*nbr_nbma
,
1894 struct ospf_interface
*oi
)
1896 struct ospf_neighbor
*nbr
;
1897 struct route_node
*rn
;
1900 if (oi
->type
!= OSPF_IFTYPE_NBMA
)
1903 if (nbr_nbma
->nbr
!= NULL
)
1906 if (IPV4_ADDR_SAME(&oi
->nbr_self
->address
.u
.prefix4
, &nbr_nbma
->addr
))
1910 listnode_add(oi
->nbr_nbma
, nbr_nbma
);
1912 /* Get neighbor information from table. */
1914 p
.prefixlen
= IPV4_MAX_BITLEN
;
1915 p
.u
.prefix4
= nbr_nbma
->addr
;
1917 rn
= route_node_get(oi
->nbrs
, &p
);
1920 nbr
->nbr_nbma
= nbr_nbma
;
1921 nbr_nbma
->nbr
= nbr
;
1923 route_unlock_node(rn
);
1925 nbr
= rn
->info
= ospf_nbr_new(oi
);
1926 nbr
->state
= NSM_Down
;
1927 nbr
->src
= nbr_nbma
->addr
;
1928 nbr
->nbr_nbma
= nbr_nbma
;
1929 nbr
->priority
= nbr_nbma
->priority
;
1932 nbr_nbma
->nbr
= nbr
;
1934 OSPF_NSM_EVENT_EXECUTE(nbr
, NSM_Start
);
1938 void ospf_nbr_nbma_if_update(struct ospf
*ospf
, struct ospf_interface
*oi
)
1940 struct ospf_nbr_nbma
*nbr_nbma
;
1941 struct route_node
*rn
;
1942 struct prefix_ipv4 p
;
1944 if (oi
->type
!= OSPF_IFTYPE_NBMA
)
1947 for (rn
= route_top(ospf
->nbr_nbma
); rn
; rn
= route_next(rn
))
1948 if ((nbr_nbma
= rn
->info
))
1949 if (nbr_nbma
->oi
== NULL
&& nbr_nbma
->nbr
== NULL
) {
1951 p
.prefix
= nbr_nbma
->addr
;
1952 p
.prefixlen
= IPV4_MAX_BITLEN
;
1954 if (prefix_match(oi
->address
,
1955 (struct prefix
*)&p
))
1956 ospf_nbr_nbma_add(nbr_nbma
, oi
);
1960 struct ospf_nbr_nbma
*ospf_nbr_nbma_lookup(struct ospf
*ospf
,
1961 struct in_addr nbr_addr
)
1963 struct route_node
*rn
;
1964 struct prefix_ipv4 p
;
1967 p
.prefix
= nbr_addr
;
1968 p
.prefixlen
= IPV4_MAX_BITLEN
;
1970 rn
= route_node_lookup(ospf
->nbr_nbma
, (struct prefix
*)&p
);
1972 route_unlock_node(rn
);
1978 int ospf_nbr_nbma_set(struct ospf
*ospf
, struct in_addr nbr_addr
)
1980 struct ospf_nbr_nbma
*nbr_nbma
;
1981 struct ospf_interface
*oi
;
1982 struct prefix_ipv4 p
;
1983 struct route_node
*rn
;
1984 struct listnode
*node
;
1986 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
1990 nbr_nbma
= ospf_nbr_nbma_new();
1991 nbr_nbma
->addr
= nbr_addr
;
1994 p
.prefix
= nbr_addr
;
1995 p
.prefixlen
= IPV4_MAX_BITLEN
;
1997 rn
= route_node_get(ospf
->nbr_nbma
, (struct prefix
*)&p
);
1999 route_unlock_node(rn
);
2000 rn
->info
= nbr_nbma
;
2002 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
2003 if (oi
->type
== OSPF_IFTYPE_NBMA
)
2004 if (prefix_match(oi
->address
, (struct prefix
*)&p
)) {
2005 ospf_nbr_nbma_add(nbr_nbma
, oi
);
2013 int ospf_nbr_nbma_unset(struct ospf
*ospf
, struct in_addr nbr_addr
)
2015 struct ospf_nbr_nbma
*nbr_nbma
;
2017 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
2018 if (nbr_nbma
== NULL
)
2021 ospf_nbr_nbma_down(nbr_nbma
);
2022 ospf_nbr_nbma_delete(ospf
, nbr_nbma
);
2027 int ospf_nbr_nbma_priority_set(struct ospf
*ospf
, struct in_addr nbr_addr
,
2030 struct ospf_nbr_nbma
*nbr_nbma
;
2032 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
2033 if (nbr_nbma
== NULL
)
2036 if (nbr_nbma
->priority
!= priority
)
2037 nbr_nbma
->priority
= priority
;
2042 int ospf_nbr_nbma_priority_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 if (nbr_nbma
!= OSPF_NEIGHBOR_PRIORITY_DEFAULT
)
2051 nbr_nbma
->priority
= OSPF_NEIGHBOR_PRIORITY_DEFAULT
;
2056 int ospf_nbr_nbma_poll_interval_set(struct ospf
*ospf
, struct in_addr nbr_addr
,
2057 unsigned int interval
)
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
->v_poll
!= interval
) {
2066 nbr_nbma
->v_poll
= interval
;
2067 if (nbr_nbma
->oi
&& ospf_if_is_up(nbr_nbma
->oi
)) {
2068 OSPF_TIMER_OFF(nbr_nbma
->t_poll
);
2069 OSPF_POLL_TIMER_ON(nbr_nbma
->t_poll
, ospf_poll_timer
,
2077 int ospf_nbr_nbma_poll_interval_unset(struct ospf
*ospf
, struct in_addr addr
)
2079 struct ospf_nbr_nbma
*nbr_nbma
;
2081 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, addr
);
2082 if (nbr_nbma
== NULL
)
2085 if (nbr_nbma
->v_poll
!= OSPF_POLL_INTERVAL_DEFAULT
)
2086 nbr_nbma
->v_poll
= OSPF_POLL_INTERVAL_DEFAULT
;
2091 void ospf_master_init(struct thread_master
*master
)
2093 memset(&ospf_master
, 0, sizeof(struct ospf_master
));
2096 om
->ospf
= list_new();
2097 om
->master
= master
;
2100 /* Link OSPF instance to VRF. */
2101 void ospf_vrf_link(struct ospf
*ospf
, struct vrf
*vrf
)
2103 ospf
->vrf_id
= vrf
->vrf_id
;
2104 if (vrf
->info
!= (void *)ospf
)
2105 vrf
->info
= (void *)ospf
;
2108 /* Unlink OSPF instance from VRF. */
2109 void ospf_vrf_unlink(struct ospf
*ospf
, struct vrf
*vrf
)
2111 if (vrf
->info
== (void *)ospf
)
2113 ospf
->vrf_id
= VRF_UNKNOWN
;
2116 /* This is hook function for vrf create called as part of vrf_init */
2117 static int ospf_vrf_new(struct vrf
*vrf
)
2119 if (IS_DEBUG_OSPF_EVENT
)
2120 zlog_debug("%s: VRF Created: %s(%u)", __func__
, vrf
->name
,
2126 /* This is hook function for vrf delete call as part of vrf_init */
2127 static int ospf_vrf_delete(struct vrf
*vrf
)
2129 if (IS_DEBUG_OSPF_EVENT
)
2130 zlog_debug("%s: VRF Deletion: %s(%u)", __func__
, vrf
->name
,
2136 static void ospf_set_redist_vrf_bitmaps(struct ospf
*ospf
)
2139 struct list
*red_list
;
2141 for (type
= 0; type
< ZEBRA_ROUTE_MAX
; type
++) {
2142 red_list
= ospf
->redist
[type
];
2145 if (IS_DEBUG_OSPF_EVENT
)
2147 "%s: setting redist vrf %d bitmap for type %d",
2148 __func__
, ospf
->vrf_id
, type
);
2149 vrf_bitmap_set(zclient
->redist
[AFI_IP
][type
], ospf
->vrf_id
);
2153 /* Enable OSPF VRF instance */
2154 static int ospf_vrf_enable(struct vrf
*vrf
)
2156 struct ospf
*ospf
= NULL
;
2157 vrf_id_t old_vrf_id
;
2160 if (IS_DEBUG_OSPF_EVENT
)
2161 zlog_debug("%s: VRF %s id %u enabled", __func__
, vrf
->name
,
2164 ospf
= ospf_lookup_by_name(vrf
->name
);
2166 if (ospf
->name
&& strmatch(vrf
->name
, VRF_DEFAULT_NAME
)) {
2167 XFREE(MTYPE_OSPF_TOP
, ospf
->name
);
2170 old_vrf_id
= ospf
->vrf_id
;
2171 /* We have instance configured, link to VRF and make it "up". */
2172 ospf_vrf_link(ospf
, vrf
);
2173 if (IS_DEBUG_OSPF_EVENT
)
2175 "%s: ospf linked to vrf %s vrf_id %u (old id %u)",
2176 __func__
, vrf
->name
, ospf
->vrf_id
, old_vrf_id
);
2178 if (old_vrf_id
!= ospf
->vrf_id
) {
2179 frr_with_privs(&ospfd_privs
) {
2180 /* stop zebra redist to us for old vrf */
2181 zclient_send_dereg_requests(zclient
,
2184 ospf_set_redist_vrf_bitmaps(ospf
);
2186 /* start zebra redist to us for new vrf */
2187 ospf_zebra_vrf_register(ospf
);
2189 ret
= ospf_sock_init(ospf
);
2191 if (ret
< 0 || ospf
->fd
<= 0)
2193 thread_add_read(master
, ospf_read
, ospf
, ospf
->fd
,
2195 ospf
->oi_running
= 1;
2196 ospf_router_id_update(ospf
);
2203 /* Disable OSPF VRF instance */
2204 static int ospf_vrf_disable(struct vrf
*vrf
)
2206 struct ospf
*ospf
= NULL
;
2207 vrf_id_t old_vrf_id
= VRF_UNKNOWN
;
2209 if (vrf
->vrf_id
== VRF_DEFAULT
)
2212 if (IS_DEBUG_OSPF_EVENT
)
2213 zlog_debug("%s: VRF %s id %d disabled.", __func__
, vrf
->name
,
2216 ospf
= ospf_lookup_by_name(vrf
->name
);
2218 old_vrf_id
= ospf
->vrf_id
;
2220 /* We have instance configured, unlink
2221 * from VRF and make it "down".
2223 ospf_vrf_unlink(ospf
, vrf
);
2224 ospf
->oi_running
= 0;
2225 if (IS_DEBUG_OSPF_EVENT
)
2226 zlog_debug("%s: ospf old_vrf_id %d unlinked", __func__
,
2228 thread_cancel(&ospf
->t_read
);
2233 /* Note: This is a callback, the VRF will be deleted by the caller. */
2237 void ospf_vrf_init(void)
2239 vrf_init(ospf_vrf_new
, ospf_vrf_enable
, ospf_vrf_disable
,
2240 ospf_vrf_delete
, ospf_vrf_enable
);
2243 void ospf_vrf_terminate(void)
2248 const char *ospf_vrf_id_to_name(vrf_id_t vrf_id
)
2250 struct vrf
*vrf
= vrf_lookup_by_id(vrf_id
);
2252 return vrf
? vrf
->name
: "NIL";
2255 const char *ospf_get_name(const struct ospf
*ospf
)
2260 return VRF_DEFAULT_NAME
;