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 () */
42 #include "ospfd/ospfd.h"
43 #include "ospfd/ospf_network.h"
44 #include "ospfd/ospf_interface.h"
45 #include "ospfd/ospf_ism.h"
46 #include "ospfd/ospf_asbr.h"
47 #include "ospfd/ospf_lsa.h"
48 #include "ospfd/ospf_lsdb.h"
49 #include "ospfd/ospf_neighbor.h"
50 #include "ospfd/ospf_nsm.h"
51 #include "ospfd/ospf_spf.h"
52 #include "ospfd/ospf_packet.h"
53 #include "ospfd/ospf_dump.h"
54 #include "ospfd/ospf_zebra.h"
55 #include "ospfd/ospf_abr.h"
56 #include "ospfd/ospf_flood.h"
57 #include "ospfd/ospf_route.h"
58 #include "ospfd/ospf_ase.h"
61 DEFINE_QOBJ_TYPE(ospf
)
63 /* OSPF process wide configuration. */
64 static struct ospf_master ospf_master
;
66 /* OSPF process wide configuration pointer to export. */
67 struct ospf_master
*om
;
69 extern struct zclient
*zclient
;
72 static void ospf_remove_vls_through_area(struct ospf
*, struct ospf_area
*);
73 static void ospf_network_free(struct ospf
*, struct ospf_network
*);
74 static void ospf_area_free(struct ospf_area
*);
75 static void ospf_network_run(struct prefix
*, struct ospf_area
*);
76 static void ospf_network_run_interface(struct ospf
*, struct interface
*,
77 struct prefix
*, struct ospf_area
*);
78 static void ospf_network_run_subnet(struct ospf
*, struct connected
*,
79 struct prefix
*, struct ospf_area
*);
80 static int ospf_network_match_iface(const struct connected
*,
81 const struct prefix
*);
82 static void ospf_finish_final(struct ospf
*);
84 #define OSPF_EXTERNAL_LSA_ORIGINATE_DELAY 1
86 void ospf_router_id_update(struct ospf
*ospf
)
88 struct vrf
*vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
89 struct in_addr router_id
, router_id_old
;
90 struct ospf_interface
*oi
;
91 struct interface
*ifp
;
92 struct listnode
*node
;
95 if (!ospf
->oi_running
) {
96 if (IS_DEBUG_OSPF_EVENT
)
98 "Router ospf not configured -- Router-ID update postponed");
102 if (IS_DEBUG_OSPF_EVENT
)
103 zlog_debug("Router-ID[OLD:%s]: Update",
104 inet_ntoa(ospf
->router_id
));
106 router_id_old
= ospf
->router_id
;
108 /* Select the router ID based on these priorities:
109 1. Statically assigned router ID is always the first choice.
110 2. If there is no statically assigned router ID, then try to stick
111 with the most recent value, since changing router ID's is very
113 3. Last choice: just go with whatever the zebra daemon recommends.
115 if (ospf
->router_id_static
.s_addr
!= 0)
116 router_id
= ospf
->router_id_static
;
117 else if (ospf
->router_id
.s_addr
!= 0)
118 router_id
= ospf
->router_id
;
120 router_id
= ospf
->router_id_zebra
;
122 if (IS_DEBUG_OSPF_EVENT
)
123 zlog_debug("Router-ID[OLD:%s]: Update to %s",
124 inet_ntoa(ospf
->router_id
), inet_ntoa(router_id
));
126 if (!IPV4_ADDR_SAME(&router_id_old
, &router_id
)) {
128 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
129 /* Some nbrs are identified by router_id, these needs
130 * to be rebuilt. Possible optimization would be to do
131 * oi->nbr_self->router_id = router_id for
132 * !(virtual | ptop) links
134 ospf_nbr_self_reset(oi
, router_id
);
137 /* If AS-external-LSA is queued, then flush those LSAs. */
138 if (router_id_old
.s_addr
== 0 && ospf
->external_origin
) {
139 /* Originate each redistributed external route. */
140 for (type
= 0; type
< ZEBRA_ROUTE_MAX
; type
++)
141 if (ospf
->external_origin
& (1 << type
))
144 ospf_external_lsa_originate_timer
,
146 /* Originate Deafult. */
147 if (ospf
->external_origin
& (1 << ZEBRA_ROUTE_MAX
))
148 thread_add_event(master
,
149 ospf_default_originate_timer
,
152 ospf
->external_origin
= 0;
155 /* Flush (inline) all external LSAs based on the OSPF_LSA_SELF
158 struct route_node
*rn
;
159 struct ospf_lsa
*lsa
;
161 LSDB_LOOP (EXTERNAL_LSDB(ospf
), rn
, lsa
)
162 if (IS_LSA_SELF(lsa
))
163 ospf_lsa_flush_schedule(ospf
, lsa
);
166 ospf
->router_id
= router_id
;
167 if (IS_DEBUG_OSPF_EVENT
)
168 zlog_debug("Router-ID[NEW:%s]: Update",
169 inet_ntoa(ospf
->router_id
));
171 /* Flush (inline) all external LSAs which now match the new
173 need to adjust the OSPF_LSA_SELF flag, so the flush doesnt
175 asserts in ospf_refresher_unregister_lsa(). This step is
177 because the current quagga code does look-up for
179 based on the self router-id alone but expects OSPF_LSA_SELF
183 struct route_node
*rn
;
184 struct ospf_lsa
*lsa
;
186 LSDB_LOOP (EXTERNAL_LSDB(ospf
), rn
, lsa
) {
187 /* AdvRouter and Router ID is the same. */
188 if (IPV4_ADDR_SAME(&lsa
->data
->adv_router
,
191 OSPF_LSA_SELF_CHECKED
);
192 SET_FLAG(lsa
->flags
, OSPF_LSA_SELF
);
193 ospf_lsa_flush_schedule(ospf
, lsa
);
198 /* Originate each redistributed external route. */
199 for (type
= 0; type
< ZEBRA_ROUTE_MAX
; type
++)
200 thread_add_event(master
,
201 ospf_external_lsa_originate_timer
,
203 thread_add_event(master
, ospf_default_originate_timer
, ospf
, 0,
206 /* update router-lsa's for each area */
207 ospf_router_lsa_update(ospf
);
209 /* update ospf_interface's */
210 FOR_ALL_INTERFACES (vrf
, ifp
)
211 ospf_if_update(ospf
, ifp
);
215 /* For OSPF area sort by area id. */
216 static int ospf_area_id_cmp(struct ospf_area
*a1
, struct ospf_area
*a2
)
218 if (ntohl(a1
->area_id
.s_addr
) > ntohl(a2
->area_id
.s_addr
))
220 if (ntohl(a1
->area_id
.s_addr
) < ntohl(a2
->area_id
.s_addr
))
225 /* Allocate new ospf structure. */
226 static struct ospf
*ospf_new(unsigned short instance
, const char *name
)
229 struct vrf
*vrf
= NULL
;
231 struct ospf
*new = XCALLOC(MTYPE_OSPF_TOP
, sizeof(struct ospf
));
233 new->instance
= instance
;
234 new->router_id
.s_addr
= htonl(0);
235 new->router_id_static
.s_addr
= htonl(0);
238 new->vrf_id
= VRF_UNKNOWN
;
239 /* Freed in ospf_finish_final */
240 new->name
= XSTRDUP(MTYPE_OSPF_TOP
, name
);
241 vrf
= vrf_lookup_by_name(new->name
);
242 if (IS_DEBUG_OSPF_EVENT
)
244 "%s: Create new ospf instance with vrf_name %s vrf_id %u",
245 __PRETTY_FUNCTION__
, name
, new->vrf_id
);
247 new->vrf_id
= VRF_DEFAULT
;
248 vrf
= vrf_lookup_by_id(VRF_DEFAULT
);
252 ospf_vrf_link(new, vrf
);
254 ospf_zebra_vrf_register(new);
256 new->abr_type
= OSPF_ABR_DEFAULT
;
257 new->oiflist
= list_new();
258 new->vlinks
= list_new();
259 new->areas
= list_new();
260 new->areas
->cmp
= (int (*)(void *, void *))ospf_area_id_cmp
;
261 new->networks
= route_table_init();
262 new->nbr_nbma
= route_table_init();
264 new->lsdb
= ospf_lsdb_new();
266 new->default_originate
= DEFAULT_ORIGINATE_NONE
;
268 new->passive_interface_default
= OSPF_IF_ACTIVE
;
270 new->new_external_route
= route_table_init();
271 new->old_external_route
= route_table_init();
272 new->external_lsas
= route_table_init();
274 new->stub_router_startup_time
= OSPF_STUB_ROUTER_UNCONFIGURED
;
275 new->stub_router_shutdown_time
= OSPF_STUB_ROUTER_UNCONFIGURED
;
276 new->stub_router_admin_set
= OSPF_STUB_ROUTER_ADMINISTRATIVE_UNSET
;
278 /* Distribute parameter init. */
279 for (i
= 0; i
<= ZEBRA_ROUTE_MAX
; i
++) {
282 new->default_metric
= -1;
283 new->ref_bandwidth
= OSPF_DEFAULT_REF_BANDWIDTH
;
286 new->min_ls_interval
= OSPF_MIN_LS_INTERVAL
;
287 new->min_ls_arrival
= OSPF_MIN_LS_ARRIVAL
;
289 /* SPF timer value init. */
290 new->spf_delay
= OSPF_SPF_DELAY_DEFAULT
;
291 new->spf_holdtime
= OSPF_SPF_HOLDTIME_DEFAULT
;
292 new->spf_max_holdtime
= OSPF_SPF_MAX_HOLDTIME_DEFAULT
;
293 new->spf_hold_multiplier
= 1;
296 new->maxage_delay
= OSPF_LSA_MAXAGE_REMOVE_DELAY_DEFAULT
;
297 new->maxage_lsa
= route_table_init();
298 new->t_maxage_walker
= NULL
;
299 thread_add_timer(master
, ospf_lsa_maxage_walker
, new,
300 OSPF_LSA_MAXAGE_CHECK_INTERVAL
, &new->t_maxage_walker
);
302 /* Distance table init. */
303 new->distance_table
= route_table_init();
305 new->lsa_refresh_queue
.index
= 0;
306 new->lsa_refresh_interval
= OSPF_LSA_REFRESH_INTERVAL_DEFAULT
;
307 new->t_lsa_refresher
= NULL
;
308 thread_add_timer(master
, ospf_lsa_refresh_walker
, new,
309 new->lsa_refresh_interval
, &new->t_lsa_refresher
);
310 new->lsa_refresher_started
= monotime(NULL
);
312 if ((new->ibuf
= stream_new(OSPF_MAX_PACKET_SIZE
+ 1)) == NULL
) {
314 "ospf_new: fatal error: stream_new(%u) failed allocating ibuf",
315 OSPF_MAX_PACKET_SIZE
+ 1);
319 new->oi_write_q
= list_new();
320 new->write_oi_count
= OSPF_WRITE_INTERFACE_COUNT_DEFAULT
;
322 /* Enable "log-adjacency-changes" */
323 #if DFLT_OSPF_LOG_ADJACENCY_CHANGES
324 SET_FLAG(new->config
, OSPF_LOG_ADJACENCY_CHANGES
);
330 if ((ospf_sock_init(new)) < 0) {
331 if (new->vrf_id
!= VRF_UNKNOWN
)
333 "%s: ospf_sock_init is unable to open a socket",
337 thread_add_read(master
, ospf_read
, new, new->fd
, &new->t_read
);
342 struct ospf
*ospf_lookup_instance(unsigned short instance
)
345 struct listnode
*node
, *nnode
;
347 if (listcount(om
->ospf
) == 0)
350 for (ALL_LIST_ELEMENTS(om
->ospf
, node
, nnode
, ospf
))
351 if ((ospf
->instance
== 0 && instance
== 0)
352 || (ospf
->instance
&& instance
353 && ospf
->instance
== instance
))
359 static int ospf_is_ready(struct ospf
*ospf
)
361 /* OSPF must be on and Router-ID must be configured. */
362 if (!ospf
|| ospf
->router_id
.s_addr
== 0)
368 static void ospf_add(struct ospf
*ospf
)
370 listnode_add(om
->ospf
, ospf
);
373 static void ospf_delete(struct ospf
*ospf
)
375 listnode_delete(om
->ospf
, ospf
);
378 struct ospf
*ospf_lookup_by_inst_name(unsigned short instance
, const char *name
)
380 struct ospf
*ospf
= NULL
;
381 struct listnode
*node
, *nnode
;
383 for (ALL_LIST_ELEMENTS(om
->ospf
, node
, nnode
, ospf
)) {
384 if ((ospf
->instance
== instance
)
385 && ((ospf
->name
== NULL
&& name
== NULL
)
386 || (ospf
->name
&& name
387 && strcmp(ospf
->name
, name
) == 0)))
393 struct ospf
*ospf_get(unsigned short instance
, const char *name
)
397 /* vrf name provided call inst and name based api
398 * in case of no name pass default ospf instance */
400 ospf
= ospf_lookup_by_inst_name(instance
, name
);
402 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
405 ospf
= ospf_new(instance
, name
);
408 if (ospf
->router_id_static
.s_addr
== 0)
409 ospf_router_id_update(ospf
);
411 ospf_opaque_type11_lsa_init(ospf
);
417 struct ospf
*ospf_get_instance(unsigned short instance
)
421 ospf
= ospf_lookup_instance(instance
);
423 ospf
= ospf_new(instance
, NULL
/* VRF_DEFAULT*/);
426 if (ospf
->router_id_static
.s_addr
== 0) {
427 if (vrf_lookup_by_id(ospf
->vrf_id
))
428 ospf_router_id_update(ospf
);
430 if (IS_DEBUG_OSPF_EVENT
)
432 "%s: ospf VRF (id %d) is not active yet, skip router id update",
436 ospf_router_id_update(ospf
);
439 ospf_opaque_type11_lsa_init(ospf
);
445 struct ospf
*ospf_lookup_by_vrf_id(vrf_id_t vrf_id
)
447 struct vrf
*vrf
= NULL
;
449 vrf
= vrf_lookup_by_id(vrf_id
);
452 return (vrf
->info
) ? (struct ospf
*)vrf
->info
: NULL
;
455 /* It should only be used when processing incoming info update from zebra.
456 * Other situations, it is not sufficient to lookup the ospf instance by
457 * vrf_name only without using the instance number.
459 static struct ospf
*ospf_lookup_by_name(const char *vrf_name
)
461 struct ospf
*ospf
= NULL
;
462 struct listnode
*node
, *nnode
;
464 for (ALL_LIST_ELEMENTS(om
->ospf
, node
, nnode
, ospf
))
465 if ((ospf
->name
== NULL
&& vrf_name
== NULL
)
466 || (ospf
->name
&& vrf_name
467 && strcmp(ospf
->name
, vrf_name
) == 0))
472 /* Handle the second half of deferred shutdown. This is called either
473 * from the deferred-shutdown timer thread, or directly through
474 * ospf_deferred_shutdown_check.
476 * Function is to cleanup G-R state, if required then call ospf_finish_final
477 * to complete shutdown of this ospf instance. Possibly exit if the
478 * whole process is being shutdown and this was the last OSPF instance.
480 static void ospf_deferred_shutdown_finish(struct ospf
*ospf
)
482 ospf
->stub_router_shutdown_time
= OSPF_STUB_ROUTER_UNCONFIGURED
;
483 OSPF_TIMER_OFF(ospf
->t_deferred_shutdown
);
485 ospf_finish_final(ospf
);
487 /* *ospf is now invalid */
489 /* ospfd being shut-down? If so, was this the last ospf instance? */
490 if (CHECK_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
)
491 && (listcount(om
->ospf
) == 0)) {
498 /* Timer thread for G-R */
499 static int ospf_deferred_shutdown_timer(struct thread
*t
)
501 struct ospf
*ospf
= THREAD_ARG(t
);
503 ospf_deferred_shutdown_finish(ospf
);
508 /* Check whether deferred-shutdown must be scheduled, otherwise call
509 * down directly into second-half of instance shutdown.
511 static void ospf_deferred_shutdown_check(struct ospf
*ospf
)
513 unsigned long timeout
;
515 struct ospf_area
*area
;
517 /* deferred shutdown already running? */
518 if (ospf
->t_deferred_shutdown
)
521 /* Should we try push out max-metric LSAs? */
522 if (ospf
->stub_router_shutdown_time
!= OSPF_STUB_ROUTER_UNCONFIGURED
) {
523 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, ln
, area
)) {
524 SET_FLAG(area
->stub_router_state
,
525 OSPF_AREA_ADMIN_STUB_ROUTED
);
527 if (!CHECK_FLAG(area
->stub_router_state
,
528 OSPF_AREA_IS_STUB_ROUTED
))
529 ospf_router_lsa_update_area(area
);
531 timeout
= ospf
->stub_router_shutdown_time
;
533 /* No timer needed */
534 ospf_deferred_shutdown_finish(ospf
);
538 OSPF_TIMER_ON(ospf
->t_deferred_shutdown
, ospf_deferred_shutdown_timer
,
543 /* Shut down the entire process */
544 void ospf_terminate(void)
547 struct listnode
*node
, *nnode
;
549 /* shutdown already in progress */
550 if (CHECK_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
))
553 SET_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
);
555 /* exit immediately if OSPF not actually running */
556 if (listcount(om
->ospf
) == 0)
560 for (ALL_LIST_ELEMENTS(om
->ospf
, node
, nnode
, ospf
))
563 /* Cleanup route maps */
564 route_map_add_hook(NULL
);
565 route_map_delete_hook(NULL
);
566 route_map_event_hook(NULL
);
569 /* reverse prefix_list_init */
570 prefix_list_add_hook(NULL
);
571 prefix_list_delete_hook(NULL
);
574 /* Cleanup vrf info */
575 ospf_vrf_terminate();
577 /* Deliberately go back up, hopefully to thread scheduler, as
578 * One or more ospf_finish()'s may have deferred shutdown to a timer
581 zclient_stop(zclient
);
582 zclient_free(zclient
);
587 void ospf_finish(struct ospf
*ospf
)
589 /* let deferred shutdown decide */
590 ospf_deferred_shutdown_check(ospf
);
592 /* if ospf_deferred_shutdown returns, then ospf_finish_final is
593 * deferred to expiry of G-S timer thread. Return back up, hopefully
594 * to thread scheduler.
599 /* Final cleanup of ospf instance */
600 static void ospf_finish_final(struct ospf
*ospf
)
602 struct vrf
*vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
603 struct route_node
*rn
;
604 struct ospf_nbr_nbma
*nbr_nbma
;
605 struct ospf_lsa
*lsa
;
606 struct interface
*ifp
;
607 struct ospf_interface
*oi
;
608 struct ospf_area
*area
;
609 struct ospf_vl_data
*vl_data
;
610 struct listnode
*node
, *nnode
;
612 unsigned short instance
= 0;
616 ospf_opaque_type11_lsa_term(ospf
);
618 ospf_opaque_finish();
620 ospf_flush_self_originated_lsas_now(ospf
);
622 /* Unregister redistribution */
623 for (i
= 0; i
< ZEBRA_ROUTE_MAX
; i
++) {
624 struct list
*red_list
;
625 struct ospf_redist
*red
;
627 red_list
= ospf
->redist
[i
];
631 for (ALL_LIST_ELEMENTS(red_list
, node
, nnode
, red
))
632 ospf_redistribute_unset(ospf
, i
, red
->instance
);
634 ospf_redistribute_default_unset(ospf
);
636 for (ALL_LIST_ELEMENTS(ospf
->areas
, node
, nnode
, area
))
637 ospf_remove_vls_through_area(ospf
, area
);
639 for (ALL_LIST_ELEMENTS(ospf
->vlinks
, node
, nnode
, vl_data
))
640 ospf_vl_delete(ospf
, vl_data
);
642 list_delete_and_null(&ospf
->vlinks
);
644 /* Remove any ospf interface config params */
645 FOR_ALL_INTERFACES (vrf
, ifp
) {
646 struct ospf_if_params
*params
;
648 params
= IF_DEF_PARAMS(ifp
);
649 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
))
650 UNSET_IF_PARAM(params
, if_area
);
653 /* Reset interface. */
654 for (ALL_LIST_ELEMENTS(ospf
->oiflist
, node
, nnode
, oi
))
656 list_delete_and_null(&ospf
->oiflist
);
658 /* De-Register VRF */
659 ospf_zebra_vrf_deregister(ospf
);
661 /* Clear static neighbors */
662 for (rn
= route_top(ospf
->nbr_nbma
); rn
; rn
= route_next(rn
))
663 if ((nbr_nbma
= rn
->info
)) {
664 OSPF_POLL_TIMER_OFF(nbr_nbma
->t_poll
);
667 nbr_nbma
->nbr
->nbr_nbma
= NULL
;
668 nbr_nbma
->nbr
= NULL
;
672 listnode_delete(nbr_nbma
->oi
->nbr_nbma
,
677 XFREE(MTYPE_OSPF_NEIGHBOR_STATIC
, nbr_nbma
);
680 route_table_finish(ospf
->nbr_nbma
);
682 /* Clear networks and Areas. */
683 for (rn
= route_top(ospf
->networks
); rn
; rn
= route_next(rn
)) {
684 struct ospf_network
*network
;
686 if ((network
= rn
->info
) != NULL
) {
687 ospf_network_free(ospf
, network
);
689 route_unlock_node(rn
);
692 route_table_finish(ospf
->networks
);
694 for (ALL_LIST_ELEMENTS(ospf
->areas
, node
, nnode
, area
)) {
695 listnode_delete(ospf
->areas
, area
);
696 ospf_area_free(area
);
699 /* Cancel all timers. */
700 OSPF_TIMER_OFF(ospf
->t_external_lsa
);
701 OSPF_TIMER_OFF(ospf
->t_spf_calc
);
702 OSPF_TIMER_OFF(ospf
->t_ase_calc
);
703 OSPF_TIMER_OFF(ospf
->t_maxage
);
704 OSPF_TIMER_OFF(ospf
->t_maxage_walker
);
705 OSPF_TIMER_OFF(ospf
->t_abr_task
);
706 OSPF_TIMER_OFF(ospf
->t_asbr_check
);
707 OSPF_TIMER_OFF(ospf
->t_distribute_update
);
708 OSPF_TIMER_OFF(ospf
->t_lsa_refresher
);
709 OSPF_TIMER_OFF(ospf
->t_read
);
710 OSPF_TIMER_OFF(ospf
->t_write
);
711 OSPF_TIMER_OFF(ospf
->t_opaque_lsa_self
);
712 OSPF_TIMER_OFF(ospf
->t_sr_update
);
715 stream_free(ospf
->ibuf
);
717 LSDB_LOOP (OPAQUE_AS_LSDB(ospf
), rn
, lsa
)
718 ospf_discard_from_db(ospf
, ospf
->lsdb
, lsa
);
719 LSDB_LOOP (EXTERNAL_LSDB(ospf
), rn
, lsa
)
720 ospf_discard_from_db(ospf
, ospf
->lsdb
, lsa
);
722 ospf_lsdb_delete_all(ospf
->lsdb
);
723 ospf_lsdb_free(ospf
->lsdb
);
725 for (rn
= route_top(ospf
->maxage_lsa
); rn
; rn
= route_next(rn
)) {
726 struct ospf_lsa
*lsa
;
728 if ((lsa
= rn
->info
) != NULL
) {
729 ospf_lsa_unlock(&lsa
);
732 route_unlock_node(rn
);
734 route_table_finish(ospf
->maxage_lsa
);
737 ospf_route_table_free(ospf
->old_table
);
738 if (ospf
->new_table
) {
739 ospf_route_delete(ospf
, ospf
->new_table
);
740 ospf_route_table_free(ospf
->new_table
);
743 ospf_rtrs_free(ospf
->old_rtrs
);
745 ospf_rtrs_free(ospf
->new_rtrs
);
746 if (ospf
->new_external_route
) {
747 ospf_route_delete(ospf
, ospf
->new_external_route
);
748 ospf_route_table_free(ospf
->new_external_route
);
750 if (ospf
->old_external_route
) {
751 ospf_route_delete(ospf
, ospf
->old_external_route
);
752 ospf_route_table_free(ospf
->old_external_route
);
754 if (ospf
->external_lsas
) {
755 ospf_ase_external_lsas_finish(ospf
->external_lsas
);
758 list_delete_and_null(&ospf
->areas
);
759 list_delete_and_null(&ospf
->oi_write_q
);
761 for (i
= ZEBRA_ROUTE_SYSTEM
; i
<= ZEBRA_ROUTE_MAX
; i
++) {
762 struct list
*ext_list
;
763 struct listnode
*node
;
764 struct ospf_external
*ext
;
766 ext_list
= ospf
->external
[i
];
770 for (ALL_LIST_ELEMENTS_RO(ext_list
, node
, ext
)) {
771 if (ext
->external_info
)
772 for (rn
= route_top(ext
->external_info
); rn
;
773 rn
= route_next(rn
)) {
774 if (rn
->info
== NULL
)
777 XFREE(MTYPE_OSPF_EXTERNAL_INFO
,
780 route_unlock_node(rn
);
785 ospf_distance_reset(ospf
);
786 route_table_finish(ospf
->distance_table
);
788 if (!CHECK_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
))
789 instance
= ospf
->instance
;
794 vrf
= vrf_lookup_by_name(ospf
->name
);
796 ospf_vrf_unlink(ospf
, vrf
);
797 XFREE(MTYPE_OSPF_TOP
, ospf
->name
);
799 vrf
= vrf_lookup_by_id(VRF_DEFAULT
);
801 ospf_vrf_unlink(ospf
, vrf
);
804 XFREE(MTYPE_OSPF_TOP
, ospf
);
806 if (!CHECK_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
))
807 ospf_get_instance(instance
);
811 /* allocate new OSPF Area object */
812 static struct ospf_area
*ospf_area_new(struct ospf
*ospf
,
813 struct in_addr area_id
)
815 struct ospf_area
*new;
817 /* Allocate new config_network. */
818 new = XCALLOC(MTYPE_OSPF_AREA
, sizeof(struct ospf_area
));
822 new->area_id
= area_id
;
823 new->area_id_fmt
= OSPF_AREA_ID_FMT_DOTTEDQUAD
;
825 new->external_routing
= OSPF_AREA_DEFAULT
;
826 new->default_cost
= 1;
827 new->auth_type
= OSPF_AUTH_NULL
;
830 new->lsdb
= ospf_lsdb_new();
832 /* Self-originated LSAs initialize. */
833 new->router_lsa_self
= NULL
;
835 ospf_opaque_type10_lsa_init(new);
837 new->oiflist
= list_new();
838 new->ranges
= route_table_init();
840 if (area_id
.s_addr
== OSPF_AREA_BACKBONE
)
841 ospf
->backbone
= new;
846 static void ospf_area_free(struct ospf_area
*area
)
848 struct route_node
*rn
;
849 struct ospf_lsa
*lsa
;
851 ospf_opaque_type10_lsa_term(area
);
854 LSDB_LOOP (ROUTER_LSDB(area
), rn
, lsa
)
855 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
856 LSDB_LOOP (NETWORK_LSDB(area
), rn
, lsa
)
857 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
858 LSDB_LOOP (SUMMARY_LSDB(area
), rn
, lsa
)
859 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
860 LSDB_LOOP (ASBR_SUMMARY_LSDB(area
), rn
, lsa
)
861 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
863 LSDB_LOOP (NSSA_LSDB(area
), rn
, lsa
)
864 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
865 LSDB_LOOP (OPAQUE_AREA_LSDB(area
), rn
, lsa
)
866 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
867 LSDB_LOOP (OPAQUE_LINK_LSDB(area
), rn
, lsa
)
868 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
870 ospf_lsdb_delete_all(area
->lsdb
);
871 ospf_lsdb_free(area
->lsdb
);
873 ospf_lsa_unlock(&area
->router_lsa_self
);
875 route_table_finish(area
->ranges
);
876 list_delete_and_null(&area
->oiflist
);
878 if (EXPORT_NAME(area
))
879 free(EXPORT_NAME(area
));
881 if (IMPORT_NAME(area
))
882 free(IMPORT_NAME(area
));
885 OSPF_TIMER_OFF(area
->t_stub_router
);
886 OSPF_TIMER_OFF(area
->t_opaque_lsa_self
);
888 if (OSPF_IS_AREA_BACKBONE(area
))
889 area
->ospf
->backbone
= NULL
;
891 XFREE(MTYPE_OSPF_AREA
, area
);
894 void ospf_area_check_free(struct ospf
*ospf
, struct in_addr area_id
)
896 struct ospf_area
*area
;
898 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
899 if (area
&& listcount(area
->oiflist
) == 0 && area
->ranges
->top
== NULL
900 && area
->shortcut_configured
== OSPF_SHORTCUT_DEFAULT
901 && area
->external_routing
== OSPF_AREA_DEFAULT
902 && area
->no_summary
== 0 && area
->default_cost
== 1
903 && EXPORT_NAME(area
) == NULL
&& IMPORT_NAME(area
) == NULL
904 && area
->auth_type
== OSPF_AUTH_NULL
) {
905 listnode_delete(ospf
->areas
, area
);
906 ospf_area_free(area
);
910 struct ospf_area
*ospf_area_get(struct ospf
*ospf
, struct in_addr area_id
)
912 struct ospf_area
*area
;
914 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
916 area
= ospf_area_new(ospf
, area_id
);
917 listnode_add_sort(ospf
->areas
, area
);
918 ospf_check_abr_status(ospf
);
919 if (ospf
->stub_router_admin_set
920 == OSPF_STUB_ROUTER_ADMINISTRATIVE_SET
) {
921 SET_FLAG(area
->stub_router_state
,
922 OSPF_AREA_ADMIN_STUB_ROUTED
);
929 struct ospf_area
*ospf_area_lookup_by_area_id(struct ospf
*ospf
,
930 struct in_addr area_id
)
932 struct ospf_area
*area
;
933 struct listnode
*node
;
935 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
))
936 if (IPV4_ADDR_SAME(&area
->area_id
, &area_id
))
942 void ospf_area_add_if(struct ospf_area
*area
, struct ospf_interface
*oi
)
944 listnode_add(area
->oiflist
, oi
);
947 void ospf_area_del_if(struct ospf_area
*area
, struct ospf_interface
*oi
)
949 listnode_delete(area
->oiflist
, oi
);
953 static void add_ospf_interface(struct connected
*co
, struct ospf_area
*area
)
955 struct ospf_interface
*oi
;
957 oi
= ospf_if_new(area
->ospf
, co
->ifp
, co
->address
);
962 oi
->params
= ospf_lookup_if_params(co
->ifp
, oi
->address
->u
.prefix4
);
963 oi
->output_cost
= ospf_if_get_output_cost(oi
);
965 /* Relate ospf interface to ospf instance. */
966 oi
->ospf
= area
->ospf
;
968 /* update network type as interface flag */
969 /* If network type is specified previously,
970 skip network type setting. */
971 oi
->type
= IF_DEF_PARAMS(co
->ifp
)->type
;
973 /* Add pseudo neighbor. */
974 ospf_nbr_self_reset(oi
, oi
->ospf
->router_id
);
976 ospf_area_add_if(oi
->area
, oi
);
979 * if router_id is not configured, dont bring up
981 * ospf_router_id_update() will call ospf_if_update
982 * whenever r-id is configured instead.
984 if ((area
->ospf
->router_id
.s_addr
!= 0) && if_is_operative(co
->ifp
))
988 static void update_redistributed(struct ospf
*ospf
, int add_to_ospf
)
990 struct route_node
*rn
;
991 struct external_info
*ei
;
992 struct ospf_external
*ext
;
994 if (ospf_is_type_redistributed(ospf
, ZEBRA_ROUTE_CONNECT
, 0)) {
995 ext
= ospf_external_lookup(ospf
, ZEBRA_ROUTE_CONNECT
, 0);
996 if ((ext
) && EXTERNAL_INFO(ext
)) {
997 for (rn
= route_top(EXTERNAL_INFO(ext
)); rn
;
998 rn
= route_next(rn
)) {
1004 if (ospf_external_info_find_lsa(ospf
,
1006 if (!ospf_distribute_check_connected(
1008 ospf_external_lsa_flush(
1011 ei
->ifindex
/*, ei->nexthop */);
1013 if (!ospf_external_info_find_lsa(
1015 if (ospf_distribute_check_connected(
1017 ospf_external_lsa_originate(
1025 /* Config network statement related functions. */
1026 static struct ospf_network
*ospf_network_new(struct in_addr area_id
)
1028 struct ospf_network
*new;
1029 new = XCALLOC(MTYPE_OSPF_NETWORK
, sizeof(struct ospf_network
));
1031 new->area_id
= area_id
;
1032 new->area_id_fmt
= OSPF_AREA_ID_FMT_DOTTEDQUAD
;
1037 static void ospf_network_free(struct ospf
*ospf
, struct ospf_network
*network
)
1039 ospf_area_check_free(ospf
, network
->area_id
);
1040 ospf_schedule_abr_task(ospf
);
1041 XFREE(MTYPE_OSPF_NETWORK
, network
);
1044 int ospf_network_set(struct ospf
*ospf
, struct prefix_ipv4
*p
,
1045 struct in_addr area_id
, int df
)
1047 struct ospf_network
*network
;
1048 struct ospf_area
*area
;
1049 struct route_node
*rn
;
1051 rn
= route_node_get(ospf
->networks
, (struct prefix
*)p
);
1054 route_unlock_node(rn
);
1056 if (IPV4_ADDR_SAME(&area_id
, &network
->area_id
)) {
1059 /* There is already same network statement. */
1064 rn
->info
= network
= ospf_network_new(area_id
);
1065 network
->area_id_fmt
= df
;
1066 area
= ospf_area_get(ospf
, area_id
);
1067 ospf_area_display_format_set(ospf
, area
, df
);
1069 /* Run network config now. */
1070 ospf_network_run((struct prefix
*)p
, area
);
1072 /* Update connected redistribute. */
1073 update_redistributed(ospf
, 1); /* interfaces possibly added */
1075 ospf_area_check_free(ospf
, area_id
);
1080 int ospf_network_unset(struct ospf
*ospf
, struct prefix_ipv4
*p
,
1081 struct in_addr area_id
)
1083 struct route_node
*rn
;
1084 struct ospf_network
*network
;
1085 struct listnode
*node
, *nnode
;
1086 struct ospf_interface
*oi
;
1088 rn
= route_node_lookup(ospf
->networks
, (struct prefix
*)p
);
1093 route_unlock_node(rn
);
1094 if (!IPV4_ADDR_SAME(&area_id
, &network
->area_id
))
1097 ospf_network_free(ospf
, rn
->info
);
1099 route_unlock_node(rn
); /* initial reference */
1101 /* Find interfaces that are not configured already. */
1102 for (ALL_LIST_ELEMENTS(ospf
->oiflist
, node
, nnode
, oi
)) {
1104 if (oi
->type
== OSPF_IFTYPE_VIRTUALLINK
)
1107 ospf_network_run_subnet(ospf
, oi
->connected
, NULL
, NULL
);
1110 /* Update connected redistribute. */
1111 update_redistributed(ospf
, 0); /* interfaces possibly removed */
1112 ospf_area_check_free(ospf
, area_id
);
1117 /* Ensure there's an OSPF instance, as "ip ospf area" enabled OSPF means
1118 * there might not be any 'router ospf' config.
1120 * Otherwise, doesn't do anything different to ospf_if_update for now
1122 void ospf_interface_area_set(struct ospf
*ospf
, struct interface
*ifp
)
1127 ospf_if_update(ospf
, ifp
);
1128 /* if_update does a update_redistributed */
1133 void ospf_interface_area_unset(struct ospf
*ospf
, struct interface
*ifp
)
1135 struct route_node
*rn_oi
;
1138 return; /* Ospf not ready yet */
1140 /* Find interfaces that may need to be removed. */
1141 for (rn_oi
= route_top(IF_OIFS(ifp
)); rn_oi
;
1142 rn_oi
= route_next(rn_oi
)) {
1143 struct ospf_interface
*oi
= NULL
;
1145 if ((oi
= rn_oi
->info
) == NULL
)
1148 if (oi
->type
== OSPF_IFTYPE_VIRTUALLINK
)
1151 ospf_network_run_subnet(ospf
, oi
->connected
, NULL
, NULL
);
1154 /* Update connected redistribute. */
1155 update_redistributed(ospf
, 0); /* interfaces possibly removed */
1158 /* Check whether interface matches given network
1159 * returns: 1, true. 0, false
1161 static int ospf_network_match_iface(const struct connected
*co
,
1162 const struct prefix
*net
)
1164 /* new approach: more elegant and conceptually clean */
1165 return prefix_match_network_statement(net
, CONNECTED_PREFIX(co
));
1168 static void ospf_update_interface_area(struct connected
*co
,
1169 struct ospf_area
*area
)
1171 struct ospf_interface
*oi
= ospf_if_table_lookup(co
->ifp
, co
->address
);
1173 /* nothing to be done case */
1174 if (oi
&& oi
->area
== area
) {
1181 add_ospf_interface(co
, area
);
1184 /* Run OSPF for the given subnet, taking into account the following
1185 * possible sources of area configuration, in the given order of preference:
1187 * - Whether there is interface+address specific area configuration
1188 * - Whether there is a default area for the interface
1189 * - Whether there is an area given as a parameter.
1190 * - If no specific network prefix/area is supplied, whether there's
1191 * a matching network configured.
1193 static void ospf_network_run_subnet(struct ospf
*ospf
, struct connected
*co
,
1195 struct ospf_area
*given_area
)
1197 struct ospf_interface
*oi
;
1198 struct ospf_if_params
*params
;
1199 struct ospf_area
*area
= NULL
;
1200 struct route_node
*rn
;
1203 if (CHECK_FLAG(co
->flags
, ZEBRA_IFA_SECONDARY
))
1206 if (co
->address
->family
!= AF_INET
)
1209 /* Try determine the appropriate area for this interface + address
1210 * Start by checking interface config
1212 params
= ospf_lookup_if_params(co
->ifp
, co
->address
->u
.prefix4
);
1213 if (params
&& OSPF_IF_PARAM_CONFIGURED(params
, if_area
))
1214 area
= ospf_area_get(ospf
, params
->if_area
);
1216 params
= IF_DEF_PARAMS(co
->ifp
);
1217 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
))
1218 area
= ospf_area_get(ospf
, params
->if_area
);
1221 /* If we've found an interface and/or addr specific area, then we're
1225 ospf_update_interface_area(co
, area
);
1229 /* Otherwise, only remaining possibility is a matching network statement
1232 assert(given_area
!= NULL
);
1234 /* Which either was supplied as a parameter.. (e.g. cause a new
1235 * network/area was just added)..
1237 if (p
->family
== co
->address
->family
1238 && ospf_network_match_iface(co
, p
))
1239 ospf_update_interface_area(co
, given_area
);
1244 /* Else we have to search the existing network/area config to see
1247 for (rn
= route_top(ospf
->networks
); rn
; rn
= route_next(rn
))
1248 if (rn
->info
!= NULL
&& ospf_network_match_iface(co
, &rn
->p
)) {
1249 struct ospf_network
*network
=
1250 (struct ospf_network
*)rn
->info
;
1251 area
= ospf_area_get(ospf
, network
->area_id
);
1252 ospf_update_interface_area(co
, area
);
1256 /* If the subnet isn't in any area, deconfigure */
1257 if (!configed
&& (oi
= ospf_if_table_lookup(co
->ifp
, co
->address
)))
1261 static void ospf_network_run_interface(struct ospf
*ospf
, struct interface
*ifp
,
1263 struct ospf_area
*given_area
)
1265 struct listnode
*cnode
;
1266 struct connected
*co
;
1268 if (memcmp(ifp
->name
, "VLINK", 5) == 0)
1271 /* Network prefix without area is nonsensical */
1273 assert(given_area
!= NULL
);
1275 /* if interface prefix is match specified prefix,
1276 then create socket and join multicast group. */
1277 for (ALL_LIST_ELEMENTS_RO(ifp
->connected
, cnode
, co
))
1278 ospf_network_run_subnet(ospf
, co
, p
, given_area
);
1281 static void ospf_network_run(struct prefix
*p
, struct ospf_area
*area
)
1283 struct vrf
*vrf
= vrf_lookup_by_id(area
->ospf
->vrf_id
);
1284 struct interface
*ifp
;
1286 /* Schedule Router ID Update. */
1287 if (area
->ospf
->router_id
.s_addr
== 0)
1288 ospf_router_id_update(area
->ospf
);
1290 /* Get target interface. */
1291 FOR_ALL_INTERFACES (vrf
, ifp
)
1292 ospf_network_run_interface(area
->ospf
, ifp
, p
, area
);
1295 void ospf_ls_upd_queue_empty(struct ospf_interface
*oi
)
1297 struct route_node
*rn
;
1298 struct listnode
*node
, *nnode
;
1300 struct ospf_lsa
*lsa
;
1302 /* empty ls update queue */
1303 for (rn
= route_top(oi
->ls_upd_queue
); rn
; rn
= route_next(rn
))
1304 if ((lst
= (struct list
*)rn
->info
)) {
1305 for (ALL_LIST_ELEMENTS(lst
, node
, nnode
, lsa
))
1306 ospf_lsa_unlock(&lsa
); /* oi->ls_upd_queue */
1307 list_delete_and_null(&lst
);
1311 /* remove update event */
1312 if (oi
->t_ls_upd_event
) {
1313 thread_cancel(oi
->t_ls_upd_event
);
1314 oi
->t_ls_upd_event
= NULL
;
1318 void ospf_if_update(struct ospf
*ospf
, struct interface
*ifp
)
1324 if (IS_DEBUG_OSPF_EVENT
)
1326 "%s: interface %s ifp->vrf_id %u ospf vrf %s vrf_id %u router_id %s",
1327 __PRETTY_FUNCTION__
, ifp
->name
, ifp
->vrf_id
,
1328 ospf_vrf_id_to_name(ospf
->vrf_id
), ospf
->vrf_id
,
1329 inet_ntoa(ospf
->router_id
));
1331 /* OSPF must be ready. */
1332 if (!ospf_is_ready(ospf
))
1335 ospf_network_run_interface(ospf
, ifp
, NULL
, NULL
);
1337 /* Update connected redistribute. */
1338 update_redistributed(ospf
, 1);
1341 void ospf_remove_vls_through_area(struct ospf
*ospf
, struct ospf_area
*area
)
1343 struct listnode
*node
, *nnode
;
1344 struct ospf_vl_data
*vl_data
;
1346 for (ALL_LIST_ELEMENTS(ospf
->vlinks
, node
, nnode
, vl_data
))
1347 if (IPV4_ADDR_SAME(&vl_data
->vl_area_id
, &area
->area_id
))
1348 ospf_vl_delete(ospf
, vl_data
);
1352 static const struct message ospf_area_type_msg
[] = {
1353 {OSPF_AREA_DEFAULT
, "Default"},
1354 {OSPF_AREA_STUB
, "Stub"},
1355 {OSPF_AREA_NSSA
, "NSSA"},
1358 static void ospf_area_type_set(struct ospf_area
*area
, int type
)
1360 struct listnode
*node
;
1361 struct ospf_interface
*oi
;
1363 if (area
->external_routing
== type
) {
1364 if (IS_DEBUG_OSPF_EVENT
)
1365 zlog_debug("Area[%s]: Types are the same, ignored.",
1366 inet_ntoa(area
->area_id
));
1370 area
->external_routing
= type
;
1372 if (IS_DEBUG_OSPF_EVENT
)
1373 zlog_debug("Area[%s]: Configured as %s",
1374 inet_ntoa(area
->area_id
),
1375 lookup_msg(ospf_area_type_msg
, type
, NULL
));
1377 switch (area
->external_routing
) {
1378 case OSPF_AREA_DEFAULT
:
1379 for (ALL_LIST_ELEMENTS_RO(area
->oiflist
, node
, oi
))
1380 if (oi
->nbr_self
!= NULL
) {
1381 UNSET_FLAG(oi
->nbr_self
->options
,
1383 SET_FLAG(oi
->nbr_self
->options
, OSPF_OPTION_E
);
1386 case OSPF_AREA_STUB
:
1387 for (ALL_LIST_ELEMENTS_RO(area
->oiflist
, node
, oi
))
1388 if (oi
->nbr_self
!= NULL
) {
1389 if (IS_DEBUG_OSPF_EVENT
)
1391 "setting options on %s accordingly",
1393 UNSET_FLAG(oi
->nbr_self
->options
,
1395 UNSET_FLAG(oi
->nbr_self
->options
,
1397 if (IS_DEBUG_OSPF_EVENT
)
1398 zlog_debug("options set on %s: %x",
1399 IF_NAME(oi
), OPTIONS(oi
));
1402 case OSPF_AREA_NSSA
:
1403 for (ALL_LIST_ELEMENTS_RO(area
->oiflist
, node
, oi
))
1404 if (oi
->nbr_self
!= NULL
) {
1406 "setting nssa options on %s accordingly",
1408 UNSET_FLAG(oi
->nbr_self
->options
,
1410 SET_FLAG(oi
->nbr_self
->options
, OSPF_OPTION_NP
);
1411 zlog_debug("options set on %s: %x", IF_NAME(oi
),
1419 ospf_router_lsa_update_area(area
);
1420 ospf_schedule_abr_task(area
->ospf
);
1423 int ospf_area_shortcut_set(struct ospf
*ospf
, struct ospf_area
*area
, int mode
)
1425 if (area
->shortcut_configured
== mode
)
1428 area
->shortcut_configured
= mode
;
1429 ospf_router_lsa_update_area(area
);
1430 ospf_schedule_abr_task(ospf
);
1432 ospf_area_check_free(ospf
, area
->area_id
);
1437 int ospf_area_shortcut_unset(struct ospf
*ospf
, struct ospf_area
*area
)
1439 area
->shortcut_configured
= OSPF_SHORTCUT_DEFAULT
;
1440 ospf_router_lsa_update_area(area
);
1441 ospf_area_check_free(ospf
, area
->area_id
);
1442 ospf_schedule_abr_task(ospf
);
1447 static int ospf_area_vlink_count(struct ospf
*ospf
, struct ospf_area
*area
)
1449 struct ospf_vl_data
*vl
;
1450 struct listnode
*node
;
1453 for (ALL_LIST_ELEMENTS_RO(ospf
->vlinks
, node
, vl
))
1454 if (IPV4_ADDR_SAME(&vl
->vl_area_id
, &area
->area_id
))
1460 int ospf_area_display_format_set(struct ospf
*ospf
, struct ospf_area
*area
,
1463 area
->area_id_fmt
= df
;
1468 int ospf_area_stub_set(struct ospf
*ospf
, struct in_addr area_id
)
1470 struct ospf_area
*area
;
1472 area
= ospf_area_get(ospf
, area_id
);
1473 if (ospf_area_vlink_count(ospf
, area
))
1476 if (area
->external_routing
!= OSPF_AREA_STUB
)
1477 ospf_area_type_set(area
, OSPF_AREA_STUB
);
1482 int ospf_area_stub_unset(struct ospf
*ospf
, struct in_addr area_id
)
1484 struct ospf_area
*area
;
1486 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1490 if (area
->external_routing
== OSPF_AREA_STUB
)
1491 ospf_area_type_set(area
, OSPF_AREA_DEFAULT
);
1493 ospf_area_check_free(ospf
, area_id
);
1498 int ospf_area_no_summary_set(struct ospf
*ospf
, struct in_addr area_id
)
1500 struct ospf_area
*area
;
1502 area
= ospf_area_get(ospf
, area_id
);
1503 area
->no_summary
= 1;
1508 int ospf_area_no_summary_unset(struct ospf
*ospf
, struct in_addr area_id
)
1510 struct ospf_area
*area
;
1512 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1516 area
->no_summary
= 0;
1517 ospf_area_check_free(ospf
, area_id
);
1522 int ospf_area_nssa_no_summary_set(struct ospf
*ospf
, struct in_addr area_id
)
1524 struct ospf_area
*area
;
1526 area
= ospf_area_get(ospf
, area_id
);
1527 if (ospf_area_vlink_count(ospf
, area
))
1530 if (area
->external_routing
!= OSPF_AREA_NSSA
) {
1531 ospf_area_type_set(area
, OSPF_AREA_NSSA
);
1533 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1536 ospf_area_no_summary_set(ospf
, area_id
);
1541 int ospf_area_nssa_set(struct ospf
*ospf
, struct in_addr area_id
)
1543 struct ospf_area
*area
;
1545 area
= ospf_area_get(ospf
, area_id
);
1546 if (ospf_area_vlink_count(ospf
, area
))
1549 if (area
->external_routing
!= OSPF_AREA_NSSA
) {
1550 ospf_area_type_set(area
, OSPF_AREA_NSSA
);
1553 /* set NSSA area defaults */
1554 area
->no_summary
= 0;
1555 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1556 area
->NSSATranslatorState
= OSPF_NSSA_TRANSLATE_DISABLED
;
1557 area
->NSSATranslatorStabilityInterval
=
1558 OSPF_NSSA_TRANS_STABLE_DEFAULT
;
1563 int ospf_area_nssa_unset(struct ospf
*ospf
, struct in_addr area_id
, int argc
)
1565 struct ospf_area
*area
;
1567 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1571 /* argc < 5 -> 'no area x nssa' */
1572 if (argc
< 5 && area
->external_routing
== OSPF_AREA_NSSA
) {
1574 /* set NSSA area defaults */
1575 area
->no_summary
= 0;
1576 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1577 area
->NSSATranslatorState
= OSPF_NSSA_TRANSLATE_DISABLED
;
1578 area
->NSSATranslatorStabilityInterval
=
1579 OSPF_NSSA_TRANS_STABLE_DEFAULT
;
1580 ospf_area_type_set(area
, OSPF_AREA_DEFAULT
);
1582 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1585 ospf_area_check_free(ospf
, area_id
);
1590 int ospf_area_nssa_translator_role_set(struct ospf
*ospf
,
1591 struct in_addr area_id
, int role
)
1593 struct ospf_area
*area
;
1595 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1599 area
->NSSATranslatorRole
= role
;
1605 /* XXX: unused? Leave for symmetry? */
1607 ospf_area_nssa_translator_role_unset (struct ospf
*ospf
,
1608 struct in_addr area_id
)
1610 struct ospf_area
*area
;
1612 area
= ospf_area_lookup_by_area_id (ospf
, area_id
);
1616 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1618 ospf_area_check_free (ospf
, area_id
);
1624 int ospf_area_export_list_set(struct ospf
*ospf
, struct ospf_area
*area
,
1625 const char *list_name
)
1627 struct access_list
*list
;
1628 list
= access_list_lookup(AFI_IP
, list_name
);
1630 EXPORT_LIST(area
) = list
;
1632 if (EXPORT_NAME(area
))
1633 free(EXPORT_NAME(area
));
1635 EXPORT_NAME(area
) = strdup(list_name
);
1636 ospf_schedule_abr_task(ospf
);
1641 int ospf_area_export_list_unset(struct ospf
*ospf
, struct ospf_area
*area
)
1644 EXPORT_LIST(area
) = 0;
1646 if (EXPORT_NAME(area
))
1647 free(EXPORT_NAME(area
));
1649 EXPORT_NAME(area
) = NULL
;
1651 ospf_area_check_free(ospf
, area
->area_id
);
1653 ospf_schedule_abr_task(ospf
);
1658 int ospf_area_import_list_set(struct ospf
*ospf
, struct ospf_area
*area
,
1661 struct access_list
*list
;
1662 list
= access_list_lookup(AFI_IP
, name
);
1664 IMPORT_LIST(area
) = list
;
1666 if (IMPORT_NAME(area
))
1667 free(IMPORT_NAME(area
));
1669 IMPORT_NAME(area
) = strdup(name
);
1670 ospf_schedule_abr_task(ospf
);
1675 int ospf_area_import_list_unset(struct ospf
*ospf
, struct ospf_area
*area
)
1677 IMPORT_LIST(area
) = 0;
1679 if (IMPORT_NAME(area
))
1680 free(IMPORT_NAME(area
));
1682 IMPORT_NAME(area
) = NULL
;
1683 ospf_area_check_free(ospf
, area
->area_id
);
1685 ospf_schedule_abr_task(ospf
);
1690 int ospf_timers_refresh_set(struct ospf
*ospf
, int interval
)
1694 if (ospf
->lsa_refresh_interval
== interval
)
1697 time_left
= ospf
->lsa_refresh_interval
1698 - (monotime(NULL
) - ospf
->lsa_refresher_started
);
1700 if (time_left
> interval
) {
1701 OSPF_TIMER_OFF(ospf
->t_lsa_refresher
);
1702 thread_add_timer(master
, ospf_lsa_refresh_walker
, ospf
,
1703 interval
, &ospf
->t_lsa_refresher
);
1705 ospf
->lsa_refresh_interval
= interval
;
1710 int ospf_timers_refresh_unset(struct ospf
*ospf
)
1714 time_left
= ospf
->lsa_refresh_interval
1715 - (monotime(NULL
) - ospf
->lsa_refresher_started
);
1717 if (time_left
> OSPF_LSA_REFRESH_INTERVAL_DEFAULT
) {
1718 OSPF_TIMER_OFF(ospf
->t_lsa_refresher
);
1719 ospf
->t_lsa_refresher
= NULL
;
1720 thread_add_timer(master
, ospf_lsa_refresh_walker
, ospf
,
1721 OSPF_LSA_REFRESH_INTERVAL_DEFAULT
,
1722 &ospf
->t_lsa_refresher
);
1725 ospf
->lsa_refresh_interval
= OSPF_LSA_REFRESH_INTERVAL_DEFAULT
;
1731 static struct ospf_nbr_nbma
*ospf_nbr_nbma_new(void)
1733 struct ospf_nbr_nbma
*nbr_nbma
;
1735 nbr_nbma
= XCALLOC(MTYPE_OSPF_NEIGHBOR_STATIC
,
1736 sizeof(struct ospf_nbr_nbma
));
1738 nbr_nbma
->priority
= OSPF_NEIGHBOR_PRIORITY_DEFAULT
;
1739 nbr_nbma
->v_poll
= OSPF_POLL_INTERVAL_DEFAULT
;
1744 static void ospf_nbr_nbma_free(struct ospf_nbr_nbma
*nbr_nbma
)
1746 XFREE(MTYPE_OSPF_NEIGHBOR_STATIC
, nbr_nbma
);
1749 static void ospf_nbr_nbma_delete(struct ospf
*ospf
,
1750 struct ospf_nbr_nbma
*nbr_nbma
)
1752 struct route_node
*rn
;
1753 struct prefix_ipv4 p
;
1756 p
.prefix
= nbr_nbma
->addr
;
1757 p
.prefixlen
= IPV4_MAX_BITLEN
;
1759 rn
= route_node_lookup(ospf
->nbr_nbma
, (struct prefix
*)&p
);
1761 ospf_nbr_nbma_free(rn
->info
);
1763 route_unlock_node(rn
);
1764 route_unlock_node(rn
);
1768 static void ospf_nbr_nbma_down(struct ospf_nbr_nbma
*nbr_nbma
)
1770 OSPF_TIMER_OFF(nbr_nbma
->t_poll
);
1772 if (nbr_nbma
->nbr
) {
1773 nbr_nbma
->nbr
->nbr_nbma
= NULL
;
1774 OSPF_NSM_EVENT_EXECUTE(nbr_nbma
->nbr
, NSM_KillNbr
);
1778 listnode_delete(nbr_nbma
->oi
->nbr_nbma
, nbr_nbma
);
1781 static void ospf_nbr_nbma_add(struct ospf_nbr_nbma
*nbr_nbma
,
1782 struct ospf_interface
*oi
)
1784 struct ospf_neighbor
*nbr
;
1785 struct route_node
*rn
;
1788 if (oi
->type
!= OSPF_IFTYPE_NBMA
)
1791 if (nbr_nbma
->nbr
!= NULL
)
1794 if (IPV4_ADDR_SAME(&oi
->nbr_self
->address
.u
.prefix4
, &nbr_nbma
->addr
))
1798 listnode_add(oi
->nbr_nbma
, nbr_nbma
);
1800 /* Get neighbor information from table. */
1802 p
.prefixlen
= IPV4_MAX_BITLEN
;
1803 p
.u
.prefix4
= nbr_nbma
->addr
;
1805 rn
= route_node_get(oi
->nbrs
, (struct prefix
*)&p
);
1808 nbr
->nbr_nbma
= nbr_nbma
;
1809 nbr_nbma
->nbr
= nbr
;
1811 route_unlock_node(rn
);
1813 nbr
= rn
->info
= ospf_nbr_new(oi
);
1814 nbr
->state
= NSM_Down
;
1815 nbr
->src
= nbr_nbma
->addr
;
1816 nbr
->nbr_nbma
= nbr_nbma
;
1817 nbr
->priority
= nbr_nbma
->priority
;
1820 nbr_nbma
->nbr
= nbr
;
1822 OSPF_NSM_EVENT_EXECUTE(nbr
, NSM_Start
);
1826 void ospf_nbr_nbma_if_update(struct ospf
*ospf
, struct ospf_interface
*oi
)
1828 struct ospf_nbr_nbma
*nbr_nbma
;
1829 struct route_node
*rn
;
1830 struct prefix_ipv4 p
;
1832 if (oi
->type
!= OSPF_IFTYPE_NBMA
)
1835 for (rn
= route_top(ospf
->nbr_nbma
); rn
; rn
= route_next(rn
))
1836 if ((nbr_nbma
= rn
->info
))
1837 if (nbr_nbma
->oi
== NULL
&& nbr_nbma
->nbr
== NULL
) {
1839 p
.prefix
= nbr_nbma
->addr
;
1840 p
.prefixlen
= IPV4_MAX_BITLEN
;
1842 if (prefix_match(oi
->address
,
1843 (struct prefix
*)&p
))
1844 ospf_nbr_nbma_add(nbr_nbma
, oi
);
1848 struct ospf_nbr_nbma
*ospf_nbr_nbma_lookup(struct ospf
*ospf
,
1849 struct in_addr nbr_addr
)
1851 struct route_node
*rn
;
1852 struct prefix_ipv4 p
;
1855 p
.prefix
= nbr_addr
;
1856 p
.prefixlen
= IPV4_MAX_BITLEN
;
1858 rn
= route_node_lookup(ospf
->nbr_nbma
, (struct prefix
*)&p
);
1860 route_unlock_node(rn
);
1866 struct ospf_nbr_nbma
*ospf_nbr_nbma_lookup_next(struct ospf
*ospf
,
1867 struct in_addr
*addr
, int first
)
1870 struct ospf_nbr_nbma
*nbr_nbma
;
1871 struct listnode
*node
;
1878 for (ALL_LIST_ELEMENTS_RO (ospf
->nbr_nbma
, node
, nbr_nbma
))
1882 *addr
= nbr_nbma
->addr
;
1885 else if (ntohl (nbr_nbma
->addr
.s_addr
) > ntohl (addr
->s_addr
))
1887 *addr
= nbr_nbma
->addr
;
1895 int ospf_nbr_nbma_set(struct ospf
*ospf
, struct in_addr nbr_addr
)
1897 struct ospf_nbr_nbma
*nbr_nbma
;
1898 struct ospf_interface
*oi
;
1899 struct prefix_ipv4 p
;
1900 struct route_node
*rn
;
1901 struct listnode
*node
;
1903 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
1907 nbr_nbma
= ospf_nbr_nbma_new();
1908 nbr_nbma
->addr
= nbr_addr
;
1911 p
.prefix
= nbr_addr
;
1912 p
.prefixlen
= IPV4_MAX_BITLEN
;
1914 rn
= route_node_get(ospf
->nbr_nbma
, (struct prefix
*)&p
);
1916 route_unlock_node(rn
);
1917 rn
->info
= nbr_nbma
;
1919 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
1920 if (oi
->type
== OSPF_IFTYPE_NBMA
)
1921 if (prefix_match(oi
->address
, (struct prefix
*)&p
)) {
1922 ospf_nbr_nbma_add(nbr_nbma
, oi
);
1930 int ospf_nbr_nbma_unset(struct ospf
*ospf
, struct in_addr nbr_addr
)
1932 struct ospf_nbr_nbma
*nbr_nbma
;
1934 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
1935 if (nbr_nbma
== NULL
)
1938 ospf_nbr_nbma_down(nbr_nbma
);
1939 ospf_nbr_nbma_delete(ospf
, nbr_nbma
);
1944 int ospf_nbr_nbma_priority_set(struct ospf
*ospf
, struct in_addr nbr_addr
,
1947 struct ospf_nbr_nbma
*nbr_nbma
;
1949 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
1950 if (nbr_nbma
== NULL
)
1953 if (nbr_nbma
->priority
!= priority
)
1954 nbr_nbma
->priority
= priority
;
1959 int ospf_nbr_nbma_priority_unset(struct ospf
*ospf
, struct in_addr nbr_addr
)
1961 struct ospf_nbr_nbma
*nbr_nbma
;
1963 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
1964 if (nbr_nbma
== NULL
)
1967 if (nbr_nbma
!= OSPF_NEIGHBOR_PRIORITY_DEFAULT
)
1968 nbr_nbma
->priority
= OSPF_NEIGHBOR_PRIORITY_DEFAULT
;
1973 int ospf_nbr_nbma_poll_interval_set(struct ospf
*ospf
, struct in_addr nbr_addr
,
1974 unsigned int interval
)
1976 struct ospf_nbr_nbma
*nbr_nbma
;
1978 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
1979 if (nbr_nbma
== NULL
)
1982 if (nbr_nbma
->v_poll
!= interval
) {
1983 nbr_nbma
->v_poll
= interval
;
1984 if (nbr_nbma
->oi
&& ospf_if_is_up(nbr_nbma
->oi
)) {
1985 OSPF_TIMER_OFF(nbr_nbma
->t_poll
);
1986 OSPF_POLL_TIMER_ON(nbr_nbma
->t_poll
, ospf_poll_timer
,
1994 int ospf_nbr_nbma_poll_interval_unset(struct ospf
*ospf
, struct in_addr addr
)
1996 struct ospf_nbr_nbma
*nbr_nbma
;
1998 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, addr
);
1999 if (nbr_nbma
== NULL
)
2002 if (nbr_nbma
->v_poll
!= OSPF_POLL_INTERVAL_DEFAULT
)
2003 nbr_nbma
->v_poll
= OSPF_POLL_INTERVAL_DEFAULT
;
2008 void ospf_master_init(struct thread_master
*master
)
2010 memset(&ospf_master
, 0, sizeof(struct ospf_master
));
2013 om
->ospf
= list_new();
2014 om
->master
= master
;
2017 /* Link OSPF instance to VRF. */
2018 void ospf_vrf_link(struct ospf
*ospf
, struct vrf
*vrf
)
2020 ospf
->vrf_id
= vrf
->vrf_id
;
2021 if (vrf
->info
!= (void *)ospf
)
2022 vrf
->info
= (void *)ospf
;
2025 /* Unlink OSPF instance from VRF. */
2026 void ospf_vrf_unlink(struct ospf
*ospf
, struct vrf
*vrf
)
2028 if (vrf
->info
== (void *)ospf
)
2030 ospf
->vrf_id
= VRF_UNKNOWN
;
2033 /* This is hook function for vrf create called as part of vrf_init */
2034 static int ospf_vrf_new(struct vrf
*vrf
)
2036 if (IS_DEBUG_OSPF_EVENT
)
2037 zlog_debug("%s: VRF Created: %s(%u)", __PRETTY_FUNCTION__
,
2038 vrf
->name
, vrf
->vrf_id
);
2043 /* This is hook function for vrf delete call as part of vrf_init */
2044 static int ospf_vrf_delete(struct vrf
*vrf
)
2046 if (IS_DEBUG_OSPF_EVENT
)
2047 zlog_debug("%s: VRF Deletion: %s(%u)", __PRETTY_FUNCTION__
,
2048 vrf
->name
, vrf
->vrf_id
);
2053 static void ospf_set_redist_vrf_bitmaps(struct ospf
*ospf
)
2056 struct list
*red_list
;
2058 for (type
= 0; type
< ZEBRA_ROUTE_MAX
; type
++) {
2059 red_list
= ospf
->redist
[type
];
2062 if (IS_DEBUG_OSPF_EVENT
)
2064 "%s: setting redist vrf %d bitmap for type %d",
2065 __func__
, ospf
->vrf_id
, type
);
2066 vrf_bitmap_set(zclient
->redist
[AFI_IP
][type
], ospf
->vrf_id
);
2070 /* Enable OSPF VRF instance */
2071 static int ospf_vrf_enable(struct vrf
*vrf
)
2073 struct ospf
*ospf
= NULL
;
2074 vrf_id_t old_vrf_id
;
2077 if (IS_DEBUG_OSPF_EVENT
)
2078 zlog_debug("%s: VRF %s id %u enabled", __PRETTY_FUNCTION__
,
2079 vrf
->name
, vrf
->vrf_id
);
2081 ospf
= ospf_lookup_by_name(vrf
->name
);
2083 old_vrf_id
= ospf
->vrf_id
;
2084 /* We have instance configured, link to VRF and make it "up". */
2085 ospf_vrf_link(ospf
, vrf
);
2086 if (IS_DEBUG_OSPF_EVENT
)
2088 "%s: ospf linked to vrf %s vrf_id %u (old id %u)",
2089 __PRETTY_FUNCTION__
, vrf
->name
, ospf
->vrf_id
,
2092 if (old_vrf_id
!= ospf
->vrf_id
) {
2093 if (ospfd_privs
.change(ZPRIVS_RAISE
)) {
2095 "ospf_sock_init: could not raise privs, %s",
2096 safe_strerror(errno
));
2099 /* stop zebra redist to us for old vrf */
2100 zclient_send_dereg_requests(zclient
, old_vrf_id
);
2102 ospf_set_redist_vrf_bitmaps(ospf
);
2104 /* start zebra redist to us for new vrf */
2105 ospf_zebra_vrf_register(ospf
);
2107 ret
= ospf_sock_init(ospf
);
2108 if (ospfd_privs
.change(ZPRIVS_LOWER
)) {
2110 "ospf_sock_init: could not lower privs, %s",
2111 safe_strerror(errno
));
2113 if (ret
< 0 || ospf
->fd
<= 0)
2115 thread_add_read(master
, ospf_read
, ospf
, ospf
->fd
,
2117 ospf
->oi_running
= 1;
2118 ospf_router_id_update(ospf
);
2125 /* Disable OSPF VRF instance */
2126 static int ospf_vrf_disable(struct vrf
*vrf
)
2128 struct ospf
*ospf
= NULL
;
2129 vrf_id_t old_vrf_id
= VRF_UNKNOWN
;
2131 if (vrf
->vrf_id
== VRF_DEFAULT
)
2134 if (IS_DEBUG_OSPF_EVENT
)
2135 zlog_debug("%s: VRF %s id %d disabled.", __PRETTY_FUNCTION__
,
2136 vrf
->name
, vrf
->vrf_id
);
2138 ospf
= ospf_lookup_by_name(vrf
->name
);
2140 old_vrf_id
= ospf
->vrf_id
;
2142 /* We have instance configured, unlink
2143 * from VRF and make it "down".
2145 ospf_vrf_unlink(ospf
, vrf
);
2146 ospf
->oi_running
= 0;
2147 if (IS_DEBUG_OSPF_EVENT
)
2148 zlog_debug("%s: ospf old_vrf_id %d unlinked",
2149 __PRETTY_FUNCTION__
, old_vrf_id
);
2150 thread_cancel(ospf
->t_read
);
2155 /* Note: This is a callback, the VRF will be deleted by the caller. */
2159 void ospf_vrf_init(void)
2161 vrf_init(ospf_vrf_new
, ospf_vrf_enable
, ospf_vrf_disable
,
2165 void ospf_vrf_terminate(void)
2170 const char *ospf_vrf_id_to_name(vrf_id_t vrf_id
)
2172 struct vrf
*vrf
= vrf_lookup_by_id(vrf_id
);
2174 return vrf
? vrf
->name
: "NIL";