1 /* OSPF version 2 daemon program.
2 * Copyright (C) 1999, 2000 Toshiaki Takada
4 * This file is part of GNU Zebra.
6 * GNU Zebra is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation; either version 2, or (at your option) any
11 * GNU Zebra is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
16 * You should have received a copy of the GNU General Public License along
17 * with this program; see the file COPYING; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
33 #include "sockunion.h" /* for inet_aton () */
41 #include "lib_errors.h"
43 #include "ospfd/ospfd.h"
44 #include "ospfd/ospf_network.h"
45 #include "ospfd/ospf_interface.h"
46 #include "ospfd/ospf_ism.h"
47 #include "ospfd/ospf_asbr.h"
48 #include "ospfd/ospf_lsa.h"
49 #include "ospfd/ospf_lsdb.h"
50 #include "ospfd/ospf_neighbor.h"
51 #include "ospfd/ospf_nsm.h"
52 #include "ospfd/ospf_spf.h"
53 #include "ospfd/ospf_packet.h"
54 #include "ospfd/ospf_dump.h"
55 #include "ospfd/ospf_zebra.h"
56 #include "ospfd/ospf_abr.h"
57 #include "ospfd/ospf_flood.h"
58 #include "ospfd/ospf_route.h"
59 #include "ospfd/ospf_ase.h"
62 DEFINE_QOBJ_TYPE(ospf
)
64 /* OSPF process wide configuration. */
65 static struct ospf_master ospf_master
;
67 /* OSPF process wide configuration pointer to export. */
68 struct ospf_master
*om
;
70 extern struct zclient
*zclient
;
73 static void ospf_remove_vls_through_area(struct ospf
*, struct ospf_area
*);
74 static void ospf_network_free(struct ospf
*, struct ospf_network
*);
75 static void ospf_area_free(struct ospf_area
*);
76 static void ospf_network_run(struct prefix
*, struct ospf_area
*);
77 static void ospf_network_run_interface(struct ospf
*, struct interface
*,
78 struct prefix
*, struct ospf_area
*);
79 static void ospf_network_run_subnet(struct ospf
*, struct connected
*,
80 struct prefix
*, struct ospf_area
*);
81 static int ospf_network_match_iface(const struct connected
*,
82 const struct prefix
*);
83 static void ospf_finish_final(struct ospf
*);
85 #define OSPF_EXTERNAL_LSA_ORIGINATE_DELAY 1
87 void ospf_router_id_update(struct ospf
*ospf
)
89 struct vrf
*vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
90 struct in_addr router_id
, router_id_old
;
91 struct ospf_interface
*oi
;
92 struct interface
*ifp
;
93 struct listnode
*node
;
96 if (!ospf
->oi_running
) {
97 if (IS_DEBUG_OSPF_EVENT
)
99 "Router ospf not configured -- Router-ID update postponed");
103 if (IS_DEBUG_OSPF_EVENT
)
104 zlog_debug("Router-ID[OLD:%s]: Update",
105 inet_ntoa(ospf
->router_id
));
107 router_id_old
= ospf
->router_id
;
109 /* Select the router ID based on these priorities:
110 1. Statically assigned router ID is always the first choice.
111 2. If there is no statically assigned router ID, then try to stick
112 with the most recent value, since changing router ID's is very
114 3. Last choice: just go with whatever the zebra daemon recommends.
116 if (ospf
->router_id_static
.s_addr
!= 0)
117 router_id
= ospf
->router_id_static
;
118 else if (ospf
->router_id
.s_addr
!= 0)
119 router_id
= ospf
->router_id
;
121 router_id
= ospf
->router_id_zebra
;
123 if (IS_DEBUG_OSPF_EVENT
)
124 zlog_debug("Router-ID[OLD:%s]: Update to %s",
125 inet_ntoa(ospf
->router_id
), inet_ntoa(router_id
));
127 if (!IPV4_ADDR_SAME(&router_id_old
, &router_id
)) {
129 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
130 /* Some nbrs are identified by router_id, these needs
131 * to be rebuilt. Possible optimization would be to do
132 * oi->nbr_self->router_id = router_id for
133 * !(virtual | ptop) links
135 ospf_nbr_self_reset(oi
, router_id
);
138 /* If AS-external-LSA is queued, then flush those LSAs. */
139 if (router_id_old
.s_addr
== 0 && ospf
->external_origin
) {
140 /* Originate each redistributed external route. */
141 for (type
= 0; type
< ZEBRA_ROUTE_MAX
; type
++)
142 if (ospf
->external_origin
& (1 << type
))
145 ospf_external_lsa_originate_timer
,
147 /* Originate Deafult. */
148 if (ospf
->external_origin
& (1 << ZEBRA_ROUTE_MAX
))
149 thread_add_event(master
,
150 ospf_default_originate_timer
,
153 ospf
->external_origin
= 0;
156 /* Flush (inline) all external LSAs based on the OSPF_LSA_SELF
159 struct route_node
*rn
;
160 struct ospf_lsa
*lsa
;
162 LSDB_LOOP (EXTERNAL_LSDB(ospf
), rn
, lsa
)
163 if (IS_LSA_SELF(lsa
))
164 ospf_lsa_flush_schedule(ospf
, lsa
);
167 ospf
->router_id
= router_id
;
168 if (IS_DEBUG_OSPF_EVENT
)
169 zlog_debug("Router-ID[NEW:%s]: Update",
170 inet_ntoa(ospf
->router_id
));
172 /* Flush (inline) all external LSAs which now match the new
174 need to adjust the OSPF_LSA_SELF flag, so the flush doesnt
176 asserts in ospf_refresher_unregister_lsa(). This step is
178 because the current quagga code does look-up for
180 based on the self router-id alone but expects OSPF_LSA_SELF
184 struct route_node
*rn
;
185 struct ospf_lsa
*lsa
;
187 LSDB_LOOP (EXTERNAL_LSDB(ospf
), rn
, lsa
) {
188 /* AdvRouter and Router ID is the same. */
189 if (IPV4_ADDR_SAME(&lsa
->data
->adv_router
,
192 OSPF_LSA_SELF_CHECKED
);
193 SET_FLAG(lsa
->flags
, OSPF_LSA_SELF
);
194 ospf_lsa_flush_schedule(ospf
, lsa
);
199 /* Originate each redistributed external route. */
200 for (type
= 0; type
< ZEBRA_ROUTE_MAX
; type
++)
201 thread_add_event(master
,
202 ospf_external_lsa_originate_timer
,
204 thread_add_event(master
, ospf_default_originate_timer
, ospf
, 0,
207 /* update router-lsa's for each area */
208 ospf_router_lsa_update(ospf
);
210 /* update ospf_interface's */
211 FOR_ALL_INTERFACES (vrf
, ifp
)
212 ospf_if_update(ospf
, ifp
);
216 /* For OSPF area sort by area id. */
217 static int ospf_area_id_cmp(struct ospf_area
*a1
, struct ospf_area
*a2
)
219 if (ntohl(a1
->area_id
.s_addr
) > ntohl(a2
->area_id
.s_addr
))
221 if (ntohl(a1
->area_id
.s_addr
) < ntohl(a2
->area_id
.s_addr
))
226 /* Allocate new ospf structure. */
227 static struct ospf
*ospf_new(unsigned short instance
, const char *name
)
230 struct vrf
*vrf
= NULL
;
232 struct ospf
*new = XCALLOC(MTYPE_OSPF_TOP
, sizeof(struct ospf
));
234 new->instance
= instance
;
235 new->router_id
.s_addr
= htonl(0);
236 new->router_id_static
.s_addr
= htonl(0);
239 new->vrf_id
= VRF_UNKNOWN
;
240 /* Freed in ospf_finish_final */
241 new->name
= XSTRDUP(MTYPE_OSPF_TOP
, name
);
242 vrf
= vrf_lookup_by_name(new->name
);
243 if (IS_DEBUG_OSPF_EVENT
)
245 "%s: Create new ospf instance with vrf_name %s vrf_id %u",
246 __PRETTY_FUNCTION__
, name
, new->vrf_id
);
248 new->vrf_id
= VRF_DEFAULT
;
249 vrf
= vrf_lookup_by_id(VRF_DEFAULT
);
253 ospf_vrf_link(new, vrf
);
255 ospf_zebra_vrf_register(new);
257 new->abr_type
= OSPF_ABR_DEFAULT
;
258 new->oiflist
= list_new();
259 new->vlinks
= list_new();
260 new->areas
= list_new();
261 new->areas
->cmp
= (int (*)(void *, void *))ospf_area_id_cmp
;
262 new->networks
= route_table_init();
263 new->nbr_nbma
= route_table_init();
265 new->lsdb
= ospf_lsdb_new();
267 new->default_originate
= DEFAULT_ORIGINATE_NONE
;
269 new->passive_interface_default
= OSPF_IF_ACTIVE
;
271 new->new_external_route
= route_table_init();
272 new->old_external_route
= route_table_init();
273 new->external_lsas
= route_table_init();
275 new->stub_router_startup_time
= OSPF_STUB_ROUTER_UNCONFIGURED
;
276 new->stub_router_shutdown_time
= OSPF_STUB_ROUTER_UNCONFIGURED
;
277 new->stub_router_admin_set
= OSPF_STUB_ROUTER_ADMINISTRATIVE_UNSET
;
279 /* Distribute parameter init. */
280 for (i
= 0; i
<= ZEBRA_ROUTE_MAX
; i
++) {
283 new->default_metric
= -1;
284 new->ref_bandwidth
= OSPF_DEFAULT_REF_BANDWIDTH
;
287 new->min_ls_interval
= OSPF_MIN_LS_INTERVAL
;
288 new->min_ls_arrival
= OSPF_MIN_LS_ARRIVAL
;
290 /* SPF timer value init. */
291 new->spf_delay
= OSPF_SPF_DELAY_DEFAULT
;
292 new->spf_holdtime
= OSPF_SPF_HOLDTIME_DEFAULT
;
293 new->spf_max_holdtime
= OSPF_SPF_MAX_HOLDTIME_DEFAULT
;
294 new->spf_hold_multiplier
= 1;
297 new->maxage_delay
= OSPF_LSA_MAXAGE_REMOVE_DELAY_DEFAULT
;
298 new->maxage_lsa
= route_table_init();
299 new->t_maxage_walker
= NULL
;
300 thread_add_timer(master
, ospf_lsa_maxage_walker
, new,
301 OSPF_LSA_MAXAGE_CHECK_INTERVAL
, &new->t_maxage_walker
);
303 /* Distance table init. */
304 new->distance_table
= route_table_init();
306 new->lsa_refresh_queue
.index
= 0;
307 new->lsa_refresh_interval
= OSPF_LSA_REFRESH_INTERVAL_DEFAULT
;
308 new->t_lsa_refresher
= NULL
;
309 thread_add_timer(master
, ospf_lsa_refresh_walker
, new,
310 new->lsa_refresh_interval
, &new->t_lsa_refresher
);
311 new->lsa_refresher_started
= monotime(NULL
);
313 if ((new->ibuf
= stream_new(OSPF_MAX_PACKET_SIZE
+ 1)) == NULL
) {
315 "ospf_new: fatal error: stream_new(%u) failed allocating ibuf",
316 OSPF_MAX_PACKET_SIZE
+ 1);
320 new->oi_write_q
= list_new();
321 new->write_oi_count
= OSPF_WRITE_INTERFACE_COUNT_DEFAULT
;
323 /* Enable "log-adjacency-changes" */
324 #if DFLT_OSPF_LOG_ADJACENCY_CHANGES
325 SET_FLAG(new->config
, OSPF_LOG_ADJACENCY_CHANGES
);
331 if ((ospf_sock_init(new)) < 0) {
332 if (new->vrf_id
!= VRF_UNKNOWN
)
334 "%s: ospf_sock_init is unable to open a socket",
338 thread_add_read(master
, ospf_read
, new, new->fd
, &new->t_read
);
343 struct ospf
*ospf_lookup_instance(unsigned short instance
)
346 struct listnode
*node
, *nnode
;
348 if (listcount(om
->ospf
) == 0)
351 for (ALL_LIST_ELEMENTS(om
->ospf
, node
, nnode
, ospf
))
352 if ((ospf
->instance
== 0 && instance
== 0)
353 || (ospf
->instance
&& instance
354 && ospf
->instance
== instance
))
360 static int ospf_is_ready(struct ospf
*ospf
)
362 /* OSPF must be on and Router-ID must be configured. */
363 if (!ospf
|| ospf
->router_id
.s_addr
== 0)
369 static void ospf_add(struct ospf
*ospf
)
371 listnode_add(om
->ospf
, ospf
);
374 static void ospf_delete(struct ospf
*ospf
)
376 listnode_delete(om
->ospf
, ospf
);
379 struct ospf
*ospf_lookup_by_inst_name(unsigned short instance
, const char *name
)
381 struct ospf
*ospf
= NULL
;
382 struct listnode
*node
, *nnode
;
384 for (ALL_LIST_ELEMENTS(om
->ospf
, node
, nnode
, ospf
)) {
385 if ((ospf
->instance
== instance
)
386 && ((ospf
->name
== NULL
&& name
== NULL
)
387 || (ospf
->name
&& name
388 && strcmp(ospf
->name
, name
) == 0)))
394 struct ospf
*ospf_get(unsigned short instance
, const char *name
)
398 /* vrf name provided call inst and name based api
399 * in case of no name pass default ospf instance */
401 ospf
= ospf_lookup_by_inst_name(instance
, name
);
403 ospf
= ospf_lookup_by_vrf_id(VRF_DEFAULT
);
406 ospf
= ospf_new(instance
, name
);
409 if (ospf
->router_id_static
.s_addr
== 0)
410 ospf_router_id_update(ospf
);
412 ospf_opaque_type11_lsa_init(ospf
);
418 struct ospf
*ospf_get_instance(unsigned short instance
)
422 ospf
= ospf_lookup_instance(instance
);
424 ospf
= ospf_new(instance
, NULL
/* VRF_DEFAULT*/);
427 if (ospf
->router_id_static
.s_addr
== 0) {
428 if (vrf_lookup_by_id(ospf
->vrf_id
))
429 ospf_router_id_update(ospf
);
431 if (IS_DEBUG_OSPF_EVENT
)
433 "%s: ospf VRF (id %d) is not active yet, skip router id update",
437 ospf_router_id_update(ospf
);
440 ospf_opaque_type11_lsa_init(ospf
);
446 struct ospf
*ospf_lookup_by_vrf_id(vrf_id_t vrf_id
)
448 struct vrf
*vrf
= NULL
;
450 vrf
= vrf_lookup_by_id(vrf_id
);
453 return (vrf
->info
) ? (struct ospf
*)vrf
->info
: NULL
;
456 /* It should only be used when processing incoming info update from zebra.
457 * Other situations, it is not sufficient to lookup the ospf instance by
458 * vrf_name only without using the instance number.
460 static struct ospf
*ospf_lookup_by_name(const char *vrf_name
)
462 struct ospf
*ospf
= NULL
;
463 struct listnode
*node
, *nnode
;
465 for (ALL_LIST_ELEMENTS(om
->ospf
, node
, nnode
, ospf
))
466 if ((ospf
->name
== NULL
&& vrf_name
== NULL
)
467 || (ospf
->name
&& vrf_name
468 && strcmp(ospf
->name
, vrf_name
) == 0))
473 /* Handle the second half of deferred shutdown. This is called either
474 * from the deferred-shutdown timer thread, or directly through
475 * ospf_deferred_shutdown_check.
477 * Function is to cleanup G-R state, if required then call ospf_finish_final
478 * to complete shutdown of this ospf instance. Possibly exit if the
479 * whole process is being shutdown and this was the last OSPF instance.
481 static void ospf_deferred_shutdown_finish(struct ospf
*ospf
)
483 ospf
->stub_router_shutdown_time
= OSPF_STUB_ROUTER_UNCONFIGURED
;
484 OSPF_TIMER_OFF(ospf
->t_deferred_shutdown
);
486 ospf_finish_final(ospf
);
488 /* *ospf is now invalid */
490 /* ospfd being shut-down? If so, was this the last ospf instance? */
491 if (CHECK_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
)
492 && (listcount(om
->ospf
) == 0)) {
499 /* Timer thread for G-R */
500 static int ospf_deferred_shutdown_timer(struct thread
*t
)
502 struct ospf
*ospf
= THREAD_ARG(t
);
504 ospf_deferred_shutdown_finish(ospf
);
509 /* Check whether deferred-shutdown must be scheduled, otherwise call
510 * down directly into second-half of instance shutdown.
512 static void ospf_deferred_shutdown_check(struct ospf
*ospf
)
514 unsigned long timeout
;
516 struct ospf_area
*area
;
518 /* deferred shutdown already running? */
519 if (ospf
->t_deferred_shutdown
)
522 /* Should we try push out max-metric LSAs? */
523 if (ospf
->stub_router_shutdown_time
!= OSPF_STUB_ROUTER_UNCONFIGURED
) {
524 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, ln
, area
)) {
525 SET_FLAG(area
->stub_router_state
,
526 OSPF_AREA_ADMIN_STUB_ROUTED
);
528 if (!CHECK_FLAG(area
->stub_router_state
,
529 OSPF_AREA_IS_STUB_ROUTED
))
530 ospf_router_lsa_update_area(area
);
532 timeout
= ospf
->stub_router_shutdown_time
;
534 /* No timer needed */
535 ospf_deferred_shutdown_finish(ospf
);
539 OSPF_TIMER_ON(ospf
->t_deferred_shutdown
, ospf_deferred_shutdown_timer
,
544 /* Shut down the entire process */
545 void ospf_terminate(void)
548 struct listnode
*node
, *nnode
;
550 /* shutdown already in progress */
551 if (CHECK_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
))
554 SET_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
);
556 /* exit immediately if OSPF not actually running */
557 if (listcount(om
->ospf
) == 0)
561 for (ALL_LIST_ELEMENTS(om
->ospf
, node
, nnode
, ospf
))
564 /* Cleanup route maps */
567 /* reverse prefix_list_init */
568 prefix_list_add_hook(NULL
);
569 prefix_list_delete_hook(NULL
);
572 /* Cleanup vrf info */
573 ospf_vrf_terminate();
575 /* Deliberately go back up, hopefully to thread scheduler, as
576 * One or more ospf_finish()'s may have deferred shutdown to a timer
579 zclient_stop(zclient
);
580 zclient_free(zclient
);
585 void ospf_finish(struct ospf
*ospf
)
587 /* let deferred shutdown decide */
588 ospf_deferred_shutdown_check(ospf
);
590 /* if ospf_deferred_shutdown returns, then ospf_finish_final is
591 * deferred to expiry of G-S timer thread. Return back up, hopefully
592 * to thread scheduler.
597 /* Final cleanup of ospf instance */
598 static void ospf_finish_final(struct ospf
*ospf
)
600 struct vrf
*vrf
= vrf_lookup_by_id(ospf
->vrf_id
);
601 struct route_node
*rn
;
602 struct ospf_nbr_nbma
*nbr_nbma
;
603 struct ospf_lsa
*lsa
;
604 struct interface
*ifp
;
605 struct ospf_interface
*oi
;
606 struct ospf_area
*area
;
607 struct ospf_vl_data
*vl_data
;
608 struct listnode
*node
, *nnode
;
610 unsigned short instance
= 0;
614 ospf_opaque_type11_lsa_term(ospf
);
616 ospf_opaque_finish();
618 ospf_flush_self_originated_lsas_now(ospf
);
620 /* Unregister redistribution */
621 for (i
= 0; i
< ZEBRA_ROUTE_MAX
; i
++) {
622 struct list
*red_list
;
623 struct ospf_redist
*red
;
625 red_list
= ospf
->redist
[i
];
629 for (ALL_LIST_ELEMENTS(red_list
, node
, nnode
, red
))
630 ospf_redistribute_unset(ospf
, i
, red
->instance
);
632 ospf_redistribute_default_unset(ospf
);
634 for (ALL_LIST_ELEMENTS(ospf
->areas
, node
, nnode
, area
))
635 ospf_remove_vls_through_area(ospf
, area
);
637 for (ALL_LIST_ELEMENTS(ospf
->vlinks
, node
, nnode
, vl_data
))
638 ospf_vl_delete(ospf
, vl_data
);
640 list_delete_and_null(&ospf
->vlinks
);
642 /* Remove any ospf interface config params */
643 FOR_ALL_INTERFACES (vrf
, ifp
) {
644 struct ospf_if_params
*params
;
646 params
= IF_DEF_PARAMS(ifp
);
647 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
))
648 UNSET_IF_PARAM(params
, if_area
);
651 /* Reset interface. */
652 for (ALL_LIST_ELEMENTS(ospf
->oiflist
, node
, nnode
, oi
))
654 list_delete_and_null(&ospf
->oiflist
);
656 /* De-Register VRF */
657 ospf_zebra_vrf_deregister(ospf
);
659 /* Clear static neighbors */
660 for (rn
= route_top(ospf
->nbr_nbma
); rn
; rn
= route_next(rn
))
661 if ((nbr_nbma
= rn
->info
)) {
662 OSPF_POLL_TIMER_OFF(nbr_nbma
->t_poll
);
665 nbr_nbma
->nbr
->nbr_nbma
= NULL
;
666 nbr_nbma
->nbr
= NULL
;
670 listnode_delete(nbr_nbma
->oi
->nbr_nbma
,
675 XFREE(MTYPE_OSPF_NEIGHBOR_STATIC
, nbr_nbma
);
678 route_table_finish(ospf
->nbr_nbma
);
680 /* Clear networks and Areas. */
681 for (rn
= route_top(ospf
->networks
); rn
; rn
= route_next(rn
)) {
682 struct ospf_network
*network
;
684 if ((network
= rn
->info
) != NULL
) {
685 ospf_network_free(ospf
, network
);
687 route_unlock_node(rn
);
690 route_table_finish(ospf
->networks
);
692 for (ALL_LIST_ELEMENTS(ospf
->areas
, node
, nnode
, area
)) {
693 listnode_delete(ospf
->areas
, area
);
694 ospf_area_free(area
);
697 /* Cancel all timers. */
698 OSPF_TIMER_OFF(ospf
->t_external_lsa
);
699 OSPF_TIMER_OFF(ospf
->t_spf_calc
);
700 OSPF_TIMER_OFF(ospf
->t_ase_calc
);
701 OSPF_TIMER_OFF(ospf
->t_maxage
);
702 OSPF_TIMER_OFF(ospf
->t_maxage_walker
);
703 OSPF_TIMER_OFF(ospf
->t_abr_task
);
704 OSPF_TIMER_OFF(ospf
->t_asbr_check
);
705 OSPF_TIMER_OFF(ospf
->t_distribute_update
);
706 OSPF_TIMER_OFF(ospf
->t_lsa_refresher
);
707 OSPF_TIMER_OFF(ospf
->t_read
);
708 OSPF_TIMER_OFF(ospf
->t_write
);
709 OSPF_TIMER_OFF(ospf
->t_opaque_lsa_self
);
710 OSPF_TIMER_OFF(ospf
->t_sr_update
);
713 stream_free(ospf
->ibuf
);
715 LSDB_LOOP (OPAQUE_AS_LSDB(ospf
), rn
, lsa
)
716 ospf_discard_from_db(ospf
, ospf
->lsdb
, lsa
);
717 LSDB_LOOP (EXTERNAL_LSDB(ospf
), rn
, lsa
)
718 ospf_discard_from_db(ospf
, ospf
->lsdb
, lsa
);
720 ospf_lsdb_delete_all(ospf
->lsdb
);
721 ospf_lsdb_free(ospf
->lsdb
);
723 for (rn
= route_top(ospf
->maxage_lsa
); rn
; rn
= route_next(rn
)) {
724 struct ospf_lsa
*lsa
;
726 if ((lsa
= rn
->info
) != NULL
) {
727 ospf_lsa_unlock(&lsa
);
730 route_unlock_node(rn
);
732 route_table_finish(ospf
->maxage_lsa
);
735 ospf_route_table_free(ospf
->old_table
);
736 if (ospf
->new_table
) {
737 ospf_route_delete(ospf
, ospf
->new_table
);
738 ospf_route_table_free(ospf
->new_table
);
741 ospf_rtrs_free(ospf
->old_rtrs
);
743 ospf_rtrs_free(ospf
->new_rtrs
);
744 if (ospf
->new_external_route
) {
745 ospf_route_delete(ospf
, ospf
->new_external_route
);
746 ospf_route_table_free(ospf
->new_external_route
);
748 if (ospf
->old_external_route
) {
749 ospf_route_delete(ospf
, ospf
->old_external_route
);
750 ospf_route_table_free(ospf
->old_external_route
);
752 if (ospf
->external_lsas
) {
753 ospf_ase_external_lsas_finish(ospf
->external_lsas
);
756 list_delete_and_null(&ospf
->areas
);
757 list_delete_and_null(&ospf
->oi_write_q
);
759 for (i
= ZEBRA_ROUTE_SYSTEM
; i
<= ZEBRA_ROUTE_MAX
; i
++) {
760 struct list
*ext_list
;
761 struct listnode
*node
;
762 struct ospf_external
*ext
;
764 ext_list
= ospf
->external
[i
];
768 for (ALL_LIST_ELEMENTS_RO(ext_list
, node
, ext
)) {
769 if (ext
->external_info
)
770 for (rn
= route_top(ext
->external_info
); rn
;
771 rn
= route_next(rn
)) {
772 if (rn
->info
== NULL
)
775 XFREE(MTYPE_OSPF_EXTERNAL_INFO
,
778 route_unlock_node(rn
);
783 ospf_distance_reset(ospf
);
784 route_table_finish(ospf
->distance_table
);
786 if (!CHECK_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
))
787 instance
= ospf
->instance
;
792 vrf
= vrf_lookup_by_name(ospf
->name
);
794 ospf_vrf_unlink(ospf
, vrf
);
795 XFREE(MTYPE_OSPF_TOP
, ospf
->name
);
797 vrf
= vrf_lookup_by_id(VRF_DEFAULT
);
799 ospf_vrf_unlink(ospf
, vrf
);
802 XFREE(MTYPE_OSPF_TOP
, ospf
);
804 if (!CHECK_FLAG(om
->options
, OSPF_MASTER_SHUTDOWN
))
805 ospf_get_instance(instance
);
809 /* allocate new OSPF Area object */
810 static struct ospf_area
*ospf_area_new(struct ospf
*ospf
,
811 struct in_addr area_id
)
813 struct ospf_area
*new;
815 /* Allocate new config_network. */
816 new = XCALLOC(MTYPE_OSPF_AREA
, sizeof(struct ospf_area
));
820 new->area_id
= area_id
;
821 new->area_id_fmt
= OSPF_AREA_ID_FMT_DOTTEDQUAD
;
823 new->external_routing
= OSPF_AREA_DEFAULT
;
824 new->default_cost
= 1;
825 new->auth_type
= OSPF_AUTH_NULL
;
828 new->lsdb
= ospf_lsdb_new();
830 /* Self-originated LSAs initialize. */
831 new->router_lsa_self
= NULL
;
833 ospf_opaque_type10_lsa_init(new);
835 new->oiflist
= list_new();
836 new->ranges
= route_table_init();
838 if (area_id
.s_addr
== OSPF_AREA_BACKBONE
)
839 ospf
->backbone
= new;
844 static void ospf_area_free(struct ospf_area
*area
)
846 struct route_node
*rn
;
847 struct ospf_lsa
*lsa
;
849 ospf_opaque_type10_lsa_term(area
);
852 LSDB_LOOP (ROUTER_LSDB(area
), rn
, lsa
)
853 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
854 LSDB_LOOP (NETWORK_LSDB(area
), rn
, lsa
)
855 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
856 LSDB_LOOP (SUMMARY_LSDB(area
), rn
, lsa
)
857 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
858 LSDB_LOOP (ASBR_SUMMARY_LSDB(area
), rn
, lsa
)
859 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
861 LSDB_LOOP (NSSA_LSDB(area
), rn
, lsa
)
862 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
863 LSDB_LOOP (OPAQUE_AREA_LSDB(area
), rn
, lsa
)
864 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
865 LSDB_LOOP (OPAQUE_LINK_LSDB(area
), rn
, lsa
)
866 ospf_discard_from_db(area
->ospf
, area
->lsdb
, lsa
);
868 ospf_lsdb_delete_all(area
->lsdb
);
869 ospf_lsdb_free(area
->lsdb
);
871 ospf_lsa_unlock(&area
->router_lsa_self
);
873 route_table_finish(area
->ranges
);
874 list_delete_and_null(&area
->oiflist
);
876 if (EXPORT_NAME(area
))
877 free(EXPORT_NAME(area
));
879 if (IMPORT_NAME(area
))
880 free(IMPORT_NAME(area
));
883 OSPF_TIMER_OFF(area
->t_stub_router
);
884 OSPF_TIMER_OFF(area
->t_opaque_lsa_self
);
886 if (OSPF_IS_AREA_BACKBONE(area
))
887 area
->ospf
->backbone
= NULL
;
889 XFREE(MTYPE_OSPF_AREA
, area
);
892 void ospf_area_check_free(struct ospf
*ospf
, struct in_addr area_id
)
894 struct ospf_area
*area
;
896 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
897 if (area
&& listcount(area
->oiflist
) == 0 && area
->ranges
->top
== NULL
898 && area
->shortcut_configured
== OSPF_SHORTCUT_DEFAULT
899 && area
->external_routing
== OSPF_AREA_DEFAULT
900 && area
->no_summary
== 0 && area
->default_cost
== 1
901 && EXPORT_NAME(area
) == NULL
&& IMPORT_NAME(area
) == NULL
902 && area
->auth_type
== OSPF_AUTH_NULL
) {
903 listnode_delete(ospf
->areas
, area
);
904 ospf_area_free(area
);
908 struct ospf_area
*ospf_area_get(struct ospf
*ospf
, struct in_addr area_id
)
910 struct ospf_area
*area
;
912 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
914 area
= ospf_area_new(ospf
, area_id
);
915 listnode_add_sort(ospf
->areas
, area
);
916 ospf_check_abr_status(ospf
);
917 if (ospf
->stub_router_admin_set
918 == OSPF_STUB_ROUTER_ADMINISTRATIVE_SET
) {
919 SET_FLAG(area
->stub_router_state
,
920 OSPF_AREA_ADMIN_STUB_ROUTED
);
927 struct ospf_area
*ospf_area_lookup_by_area_id(struct ospf
*ospf
,
928 struct in_addr area_id
)
930 struct ospf_area
*area
;
931 struct listnode
*node
;
933 for (ALL_LIST_ELEMENTS_RO(ospf
->areas
, node
, area
))
934 if (IPV4_ADDR_SAME(&area
->area_id
, &area_id
))
940 void ospf_area_add_if(struct ospf_area
*area
, struct ospf_interface
*oi
)
942 listnode_add(area
->oiflist
, oi
);
945 void ospf_area_del_if(struct ospf_area
*area
, struct ospf_interface
*oi
)
947 listnode_delete(area
->oiflist
, oi
);
951 static void add_ospf_interface(struct connected
*co
, struct ospf_area
*area
)
953 struct ospf_interface
*oi
;
955 oi
= ospf_if_new(area
->ospf
, co
->ifp
, co
->address
);
960 oi
->params
= ospf_lookup_if_params(co
->ifp
, oi
->address
->u
.prefix4
);
961 oi
->output_cost
= ospf_if_get_output_cost(oi
);
963 /* Relate ospf interface to ospf instance. */
964 oi
->ospf
= area
->ospf
;
966 /* update network type as interface flag */
967 /* If network type is specified previously,
968 skip network type setting. */
969 oi
->type
= IF_DEF_PARAMS(co
->ifp
)->type
;
971 /* Add pseudo neighbor. */
972 ospf_nbr_self_reset(oi
, oi
->ospf
->router_id
);
974 ospf_area_add_if(oi
->area
, oi
);
977 * if router_id is not configured, dont bring up
979 * ospf_router_id_update() will call ospf_if_update
980 * whenever r-id is configured instead.
982 if ((area
->ospf
->router_id
.s_addr
!= 0) && if_is_operative(co
->ifp
))
986 static void update_redistributed(struct ospf
*ospf
, int add_to_ospf
)
988 struct route_node
*rn
;
989 struct external_info
*ei
;
990 struct ospf_external
*ext
;
992 if (ospf_is_type_redistributed(ospf
, ZEBRA_ROUTE_CONNECT
, 0)) {
993 ext
= ospf_external_lookup(ospf
, ZEBRA_ROUTE_CONNECT
, 0);
994 if ((ext
) && EXTERNAL_INFO(ext
)) {
995 for (rn
= route_top(EXTERNAL_INFO(ext
)); rn
;
996 rn
= route_next(rn
)) {
1002 if (ospf_external_info_find_lsa(ospf
,
1004 if (!ospf_distribute_check_connected(
1006 ospf_external_lsa_flush(
1009 ei
->ifindex
/*, ei->nexthop */);
1011 if (!ospf_external_info_find_lsa(
1013 if (ospf_distribute_check_connected(
1015 ospf_external_lsa_originate(
1023 /* Config network statement related functions. */
1024 static struct ospf_network
*ospf_network_new(struct in_addr area_id
)
1026 struct ospf_network
*new;
1027 new = XCALLOC(MTYPE_OSPF_NETWORK
, sizeof(struct ospf_network
));
1029 new->area_id
= area_id
;
1030 new->area_id_fmt
= OSPF_AREA_ID_FMT_DOTTEDQUAD
;
1035 static void ospf_network_free(struct ospf
*ospf
, struct ospf_network
*network
)
1037 ospf_area_check_free(ospf
, network
->area_id
);
1038 ospf_schedule_abr_task(ospf
);
1039 XFREE(MTYPE_OSPF_NETWORK
, network
);
1042 int ospf_network_set(struct ospf
*ospf
, struct prefix_ipv4
*p
,
1043 struct in_addr area_id
, int df
)
1045 struct ospf_network
*network
;
1046 struct ospf_area
*area
;
1047 struct route_node
*rn
;
1049 rn
= route_node_get(ospf
->networks
, (struct prefix
*)p
);
1052 route_unlock_node(rn
);
1054 if (IPV4_ADDR_SAME(&area_id
, &network
->area_id
)) {
1057 /* There is already same network statement. */
1062 rn
->info
= network
= ospf_network_new(area_id
);
1063 network
->area_id_fmt
= df
;
1064 area
= ospf_area_get(ospf
, area_id
);
1065 ospf_area_display_format_set(ospf
, area
, df
);
1067 /* Run network config now. */
1068 ospf_network_run((struct prefix
*)p
, area
);
1070 /* Update connected redistribute. */
1071 update_redistributed(ospf
, 1); /* interfaces possibly added */
1073 ospf_area_check_free(ospf
, area_id
);
1078 int ospf_network_unset(struct ospf
*ospf
, struct prefix_ipv4
*p
,
1079 struct in_addr area_id
)
1081 struct route_node
*rn
;
1082 struct ospf_network
*network
;
1083 struct listnode
*node
, *nnode
;
1084 struct ospf_interface
*oi
;
1086 rn
= route_node_lookup(ospf
->networks
, (struct prefix
*)p
);
1091 route_unlock_node(rn
);
1092 if (!IPV4_ADDR_SAME(&area_id
, &network
->area_id
))
1095 ospf_network_free(ospf
, rn
->info
);
1097 route_unlock_node(rn
); /* initial reference */
1099 /* Find interfaces that are not configured already. */
1100 for (ALL_LIST_ELEMENTS(ospf
->oiflist
, node
, nnode
, oi
)) {
1102 if (oi
->type
== OSPF_IFTYPE_VIRTUALLINK
)
1105 ospf_network_run_subnet(ospf
, oi
->connected
, NULL
, NULL
);
1108 /* Update connected redistribute. */
1109 update_redistributed(ospf
, 0); /* interfaces possibly removed */
1110 ospf_area_check_free(ospf
, area_id
);
1115 /* Ensure there's an OSPF instance, as "ip ospf area" enabled OSPF means
1116 * there might not be any 'router ospf' config.
1118 * Otherwise, doesn't do anything different to ospf_if_update for now
1120 void ospf_interface_area_set(struct ospf
*ospf
, struct interface
*ifp
)
1125 ospf_if_update(ospf
, ifp
);
1126 /* if_update does a update_redistributed */
1131 void ospf_interface_area_unset(struct ospf
*ospf
, struct interface
*ifp
)
1133 struct route_node
*rn_oi
;
1136 return; /* Ospf not ready yet */
1138 /* Find interfaces that may need to be removed. */
1139 for (rn_oi
= route_top(IF_OIFS(ifp
)); rn_oi
;
1140 rn_oi
= route_next(rn_oi
)) {
1141 struct ospf_interface
*oi
= NULL
;
1143 if ((oi
= rn_oi
->info
) == NULL
)
1146 if (oi
->type
== OSPF_IFTYPE_VIRTUALLINK
)
1149 ospf_network_run_subnet(ospf
, oi
->connected
, NULL
, NULL
);
1152 /* Update connected redistribute. */
1153 update_redistributed(ospf
, 0); /* interfaces possibly removed */
1156 /* Check whether interface matches given network
1157 * returns: 1, true. 0, false
1159 static int ospf_network_match_iface(const struct connected
*co
,
1160 const struct prefix
*net
)
1162 /* new approach: more elegant and conceptually clean */
1163 return prefix_match_network_statement(net
, CONNECTED_PREFIX(co
));
1166 static void ospf_update_interface_area(struct connected
*co
,
1167 struct ospf_area
*area
)
1169 struct ospf_interface
*oi
= ospf_if_table_lookup(co
->ifp
, co
->address
);
1171 /* nothing to be done case */
1172 if (oi
&& oi
->area
== area
) {
1179 add_ospf_interface(co
, area
);
1182 /* Run OSPF for the given subnet, taking into account the following
1183 * possible sources of area configuration, in the given order of preference:
1185 * - Whether there is interface+address specific area configuration
1186 * - Whether there is a default area for the interface
1187 * - Whether there is an area given as a parameter.
1188 * - If no specific network prefix/area is supplied, whether there's
1189 * a matching network configured.
1191 static void ospf_network_run_subnet(struct ospf
*ospf
, struct connected
*co
,
1193 struct ospf_area
*given_area
)
1195 struct ospf_interface
*oi
;
1196 struct ospf_if_params
*params
;
1197 struct ospf_area
*area
= NULL
;
1198 struct route_node
*rn
;
1201 if (CHECK_FLAG(co
->flags
, ZEBRA_IFA_SECONDARY
))
1204 if (co
->address
->family
!= AF_INET
)
1207 /* Try determine the appropriate area for this interface + address
1208 * Start by checking interface config
1210 params
= ospf_lookup_if_params(co
->ifp
, co
->address
->u
.prefix4
);
1211 if (params
&& OSPF_IF_PARAM_CONFIGURED(params
, if_area
))
1212 area
= ospf_area_get(ospf
, params
->if_area
);
1214 params
= IF_DEF_PARAMS(co
->ifp
);
1215 if (OSPF_IF_PARAM_CONFIGURED(params
, if_area
))
1216 area
= ospf_area_get(ospf
, params
->if_area
);
1219 /* If we've found an interface and/or addr specific area, then we're
1223 ospf_update_interface_area(co
, area
);
1227 /* Otherwise, only remaining possibility is a matching network statement
1230 assert(given_area
!= NULL
);
1232 /* Which either was supplied as a parameter.. (e.g. cause a new
1233 * network/area was just added)..
1235 if (p
->family
== co
->address
->family
1236 && ospf_network_match_iface(co
, p
))
1237 ospf_update_interface_area(co
, given_area
);
1242 /* Else we have to search the existing network/area config to see
1245 for (rn
= route_top(ospf
->networks
); rn
; rn
= route_next(rn
))
1246 if (rn
->info
!= NULL
&& ospf_network_match_iface(co
, &rn
->p
)) {
1247 struct ospf_network
*network
=
1248 (struct ospf_network
*)rn
->info
;
1249 area
= ospf_area_get(ospf
, network
->area_id
);
1250 ospf_update_interface_area(co
, area
);
1254 /* If the subnet isn't in any area, deconfigure */
1255 if (!configed
&& (oi
= ospf_if_table_lookup(co
->ifp
, co
->address
)))
1259 static void ospf_network_run_interface(struct ospf
*ospf
, struct interface
*ifp
,
1261 struct ospf_area
*given_area
)
1263 struct listnode
*cnode
;
1264 struct connected
*co
;
1266 if (memcmp(ifp
->name
, "VLINK", 5) == 0)
1269 /* Network prefix without area is nonsensical */
1271 assert(given_area
!= NULL
);
1273 /* if interface prefix is match specified prefix,
1274 then create socket and join multicast group. */
1275 for (ALL_LIST_ELEMENTS_RO(ifp
->connected
, cnode
, co
))
1276 ospf_network_run_subnet(ospf
, co
, p
, given_area
);
1279 static void ospf_network_run(struct prefix
*p
, struct ospf_area
*area
)
1281 struct vrf
*vrf
= vrf_lookup_by_id(area
->ospf
->vrf_id
);
1282 struct interface
*ifp
;
1284 /* Schedule Router ID Update. */
1285 if (area
->ospf
->router_id
.s_addr
== 0)
1286 ospf_router_id_update(area
->ospf
);
1288 /* Get target interface. */
1289 FOR_ALL_INTERFACES (vrf
, ifp
)
1290 ospf_network_run_interface(area
->ospf
, ifp
, p
, area
);
1293 void ospf_ls_upd_queue_empty(struct ospf_interface
*oi
)
1295 struct route_node
*rn
;
1296 struct listnode
*node
, *nnode
;
1298 struct ospf_lsa
*lsa
;
1300 /* empty ls update queue */
1301 for (rn
= route_top(oi
->ls_upd_queue
); rn
; rn
= route_next(rn
))
1302 if ((lst
= (struct list
*)rn
->info
)) {
1303 for (ALL_LIST_ELEMENTS(lst
, node
, nnode
, lsa
))
1304 ospf_lsa_unlock(&lsa
); /* oi->ls_upd_queue */
1305 list_delete_and_null(&lst
);
1309 /* remove update event */
1310 if (oi
->t_ls_upd_event
) {
1311 thread_cancel(oi
->t_ls_upd_event
);
1312 oi
->t_ls_upd_event
= NULL
;
1316 void ospf_if_update(struct ospf
*ospf
, struct interface
*ifp
)
1322 if (IS_DEBUG_OSPF_EVENT
)
1324 "%s: interface %s ifp->vrf_id %u ospf vrf %s vrf_id %u router_id %s",
1325 __PRETTY_FUNCTION__
, ifp
->name
, ifp
->vrf_id
,
1326 ospf_vrf_id_to_name(ospf
->vrf_id
), ospf
->vrf_id
,
1327 inet_ntoa(ospf
->router_id
));
1329 /* OSPF must be ready. */
1330 if (!ospf_is_ready(ospf
))
1333 ospf_network_run_interface(ospf
, ifp
, NULL
, NULL
);
1335 /* Update connected redistribute. */
1336 update_redistributed(ospf
, 1);
1339 void ospf_remove_vls_through_area(struct ospf
*ospf
, struct ospf_area
*area
)
1341 struct listnode
*node
, *nnode
;
1342 struct ospf_vl_data
*vl_data
;
1344 for (ALL_LIST_ELEMENTS(ospf
->vlinks
, node
, nnode
, vl_data
))
1345 if (IPV4_ADDR_SAME(&vl_data
->vl_area_id
, &area
->area_id
))
1346 ospf_vl_delete(ospf
, vl_data
);
1350 static const struct message ospf_area_type_msg
[] = {
1351 {OSPF_AREA_DEFAULT
, "Default"},
1352 {OSPF_AREA_STUB
, "Stub"},
1353 {OSPF_AREA_NSSA
, "NSSA"},
1356 static void ospf_area_type_set(struct ospf_area
*area
, int type
)
1358 struct listnode
*node
;
1359 struct ospf_interface
*oi
;
1361 if (area
->external_routing
== type
) {
1362 if (IS_DEBUG_OSPF_EVENT
)
1363 zlog_debug("Area[%s]: Types are the same, ignored.",
1364 inet_ntoa(area
->area_id
));
1368 area
->external_routing
= type
;
1370 if (IS_DEBUG_OSPF_EVENT
)
1371 zlog_debug("Area[%s]: Configured as %s",
1372 inet_ntoa(area
->area_id
),
1373 lookup_msg(ospf_area_type_msg
, type
, NULL
));
1375 switch (area
->external_routing
) {
1376 case OSPF_AREA_DEFAULT
:
1377 for (ALL_LIST_ELEMENTS_RO(area
->oiflist
, node
, oi
))
1378 if (oi
->nbr_self
!= NULL
) {
1379 UNSET_FLAG(oi
->nbr_self
->options
,
1381 SET_FLAG(oi
->nbr_self
->options
, OSPF_OPTION_E
);
1384 case OSPF_AREA_STUB
:
1385 for (ALL_LIST_ELEMENTS_RO(area
->oiflist
, node
, oi
))
1386 if (oi
->nbr_self
!= NULL
) {
1387 if (IS_DEBUG_OSPF_EVENT
)
1389 "setting options on %s accordingly",
1391 UNSET_FLAG(oi
->nbr_self
->options
,
1393 UNSET_FLAG(oi
->nbr_self
->options
,
1395 if (IS_DEBUG_OSPF_EVENT
)
1396 zlog_debug("options set on %s: %x",
1397 IF_NAME(oi
), OPTIONS(oi
));
1400 case OSPF_AREA_NSSA
:
1401 for (ALL_LIST_ELEMENTS_RO(area
->oiflist
, node
, oi
))
1402 if (oi
->nbr_self
!= NULL
) {
1404 "setting nssa options on %s accordingly",
1406 UNSET_FLAG(oi
->nbr_self
->options
,
1408 SET_FLAG(oi
->nbr_self
->options
, OSPF_OPTION_NP
);
1409 zlog_debug("options set on %s: %x", IF_NAME(oi
),
1417 ospf_router_lsa_update_area(area
);
1418 ospf_schedule_abr_task(area
->ospf
);
1421 int ospf_area_shortcut_set(struct ospf
*ospf
, struct ospf_area
*area
, int mode
)
1423 if (area
->shortcut_configured
== mode
)
1426 area
->shortcut_configured
= mode
;
1427 ospf_router_lsa_update_area(area
);
1428 ospf_schedule_abr_task(ospf
);
1430 ospf_area_check_free(ospf
, area
->area_id
);
1435 int ospf_area_shortcut_unset(struct ospf
*ospf
, struct ospf_area
*area
)
1437 area
->shortcut_configured
= OSPF_SHORTCUT_DEFAULT
;
1438 ospf_router_lsa_update_area(area
);
1439 ospf_area_check_free(ospf
, area
->area_id
);
1440 ospf_schedule_abr_task(ospf
);
1445 static int ospf_area_vlink_count(struct ospf
*ospf
, struct ospf_area
*area
)
1447 struct ospf_vl_data
*vl
;
1448 struct listnode
*node
;
1451 for (ALL_LIST_ELEMENTS_RO(ospf
->vlinks
, node
, vl
))
1452 if (IPV4_ADDR_SAME(&vl
->vl_area_id
, &area
->area_id
))
1458 int ospf_area_display_format_set(struct ospf
*ospf
, struct ospf_area
*area
,
1461 area
->area_id_fmt
= df
;
1466 int ospf_area_stub_set(struct ospf
*ospf
, struct in_addr area_id
)
1468 struct ospf_area
*area
;
1470 area
= ospf_area_get(ospf
, area_id
);
1471 if (ospf_area_vlink_count(ospf
, area
))
1474 if (area
->external_routing
!= OSPF_AREA_STUB
)
1475 ospf_area_type_set(area
, OSPF_AREA_STUB
);
1480 int ospf_area_stub_unset(struct ospf
*ospf
, struct in_addr area_id
)
1482 struct ospf_area
*area
;
1484 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1488 if (area
->external_routing
== OSPF_AREA_STUB
)
1489 ospf_area_type_set(area
, OSPF_AREA_DEFAULT
);
1491 ospf_area_check_free(ospf
, area_id
);
1496 int ospf_area_no_summary_set(struct ospf
*ospf
, struct in_addr area_id
)
1498 struct ospf_area
*area
;
1500 area
= ospf_area_get(ospf
, area_id
);
1501 area
->no_summary
= 1;
1506 int ospf_area_no_summary_unset(struct ospf
*ospf
, struct in_addr area_id
)
1508 struct ospf_area
*area
;
1510 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1514 area
->no_summary
= 0;
1515 ospf_area_check_free(ospf
, area_id
);
1520 int ospf_area_nssa_no_summary_set(struct ospf
*ospf
, struct in_addr area_id
)
1522 struct ospf_area
*area
;
1524 area
= ospf_area_get(ospf
, area_id
);
1525 if (ospf_area_vlink_count(ospf
, area
))
1528 if (area
->external_routing
!= OSPF_AREA_NSSA
) {
1529 ospf_area_type_set(area
, OSPF_AREA_NSSA
);
1531 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1534 ospf_area_no_summary_set(ospf
, area_id
);
1539 int ospf_area_nssa_set(struct ospf
*ospf
, struct in_addr area_id
)
1541 struct ospf_area
*area
;
1543 area
= ospf_area_get(ospf
, area_id
);
1544 if (ospf_area_vlink_count(ospf
, area
))
1547 if (area
->external_routing
!= OSPF_AREA_NSSA
) {
1548 ospf_area_type_set(area
, OSPF_AREA_NSSA
);
1551 /* set NSSA area defaults */
1552 area
->no_summary
= 0;
1553 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1554 area
->NSSATranslatorState
= OSPF_NSSA_TRANSLATE_DISABLED
;
1555 area
->NSSATranslatorStabilityInterval
=
1556 OSPF_NSSA_TRANS_STABLE_DEFAULT
;
1561 int ospf_area_nssa_unset(struct ospf
*ospf
, struct in_addr area_id
, int argc
)
1563 struct ospf_area
*area
;
1565 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1569 /* argc < 5 -> 'no area x nssa' */
1570 if (argc
< 5 && area
->external_routing
== OSPF_AREA_NSSA
) {
1572 /* set NSSA area defaults */
1573 area
->no_summary
= 0;
1574 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1575 area
->NSSATranslatorState
= OSPF_NSSA_TRANSLATE_DISABLED
;
1576 area
->NSSATranslatorStabilityInterval
=
1577 OSPF_NSSA_TRANS_STABLE_DEFAULT
;
1578 ospf_area_type_set(area
, OSPF_AREA_DEFAULT
);
1580 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1583 ospf_area_check_free(ospf
, area_id
);
1588 int ospf_area_nssa_translator_role_set(struct ospf
*ospf
,
1589 struct in_addr area_id
, int role
)
1591 struct ospf_area
*area
;
1593 area
= ospf_area_lookup_by_area_id(ospf
, area_id
);
1597 area
->NSSATranslatorRole
= role
;
1603 /* XXX: unused? Leave for symmetry? */
1605 ospf_area_nssa_translator_role_unset (struct ospf
*ospf
,
1606 struct in_addr area_id
)
1608 struct ospf_area
*area
;
1610 area
= ospf_area_lookup_by_area_id (ospf
, area_id
);
1614 area
->NSSATranslatorRole
= OSPF_NSSA_ROLE_CANDIDATE
;
1616 ospf_area_check_free (ospf
, area_id
);
1622 int ospf_area_export_list_set(struct ospf
*ospf
, struct ospf_area
*area
,
1623 const char *list_name
)
1625 struct access_list
*list
;
1626 list
= access_list_lookup(AFI_IP
, list_name
);
1628 EXPORT_LIST(area
) = list
;
1630 if (EXPORT_NAME(area
))
1631 free(EXPORT_NAME(area
));
1633 EXPORT_NAME(area
) = strdup(list_name
);
1634 ospf_schedule_abr_task(ospf
);
1639 int ospf_area_export_list_unset(struct ospf
*ospf
, struct ospf_area
*area
)
1642 EXPORT_LIST(area
) = 0;
1644 if (EXPORT_NAME(area
))
1645 free(EXPORT_NAME(area
));
1647 EXPORT_NAME(area
) = NULL
;
1649 ospf_area_check_free(ospf
, area
->area_id
);
1651 ospf_schedule_abr_task(ospf
);
1656 int ospf_area_import_list_set(struct ospf
*ospf
, struct ospf_area
*area
,
1659 struct access_list
*list
;
1660 list
= access_list_lookup(AFI_IP
, name
);
1662 IMPORT_LIST(area
) = list
;
1664 if (IMPORT_NAME(area
))
1665 free(IMPORT_NAME(area
));
1667 IMPORT_NAME(area
) = strdup(name
);
1668 ospf_schedule_abr_task(ospf
);
1673 int ospf_area_import_list_unset(struct ospf
*ospf
, struct ospf_area
*area
)
1675 IMPORT_LIST(area
) = 0;
1677 if (IMPORT_NAME(area
))
1678 free(IMPORT_NAME(area
));
1680 IMPORT_NAME(area
) = NULL
;
1681 ospf_area_check_free(ospf
, area
->area_id
);
1683 ospf_schedule_abr_task(ospf
);
1688 int ospf_timers_refresh_set(struct ospf
*ospf
, int interval
)
1692 if (ospf
->lsa_refresh_interval
== interval
)
1695 time_left
= ospf
->lsa_refresh_interval
1696 - (monotime(NULL
) - ospf
->lsa_refresher_started
);
1698 if (time_left
> interval
) {
1699 OSPF_TIMER_OFF(ospf
->t_lsa_refresher
);
1700 thread_add_timer(master
, ospf_lsa_refresh_walker
, ospf
,
1701 interval
, &ospf
->t_lsa_refresher
);
1703 ospf
->lsa_refresh_interval
= interval
;
1708 int ospf_timers_refresh_unset(struct ospf
*ospf
)
1712 time_left
= ospf
->lsa_refresh_interval
1713 - (monotime(NULL
) - ospf
->lsa_refresher_started
);
1715 if (time_left
> OSPF_LSA_REFRESH_INTERVAL_DEFAULT
) {
1716 OSPF_TIMER_OFF(ospf
->t_lsa_refresher
);
1717 ospf
->t_lsa_refresher
= NULL
;
1718 thread_add_timer(master
, ospf_lsa_refresh_walker
, ospf
,
1719 OSPF_LSA_REFRESH_INTERVAL_DEFAULT
,
1720 &ospf
->t_lsa_refresher
);
1723 ospf
->lsa_refresh_interval
= OSPF_LSA_REFRESH_INTERVAL_DEFAULT
;
1729 static struct ospf_nbr_nbma
*ospf_nbr_nbma_new(void)
1731 struct ospf_nbr_nbma
*nbr_nbma
;
1733 nbr_nbma
= XCALLOC(MTYPE_OSPF_NEIGHBOR_STATIC
,
1734 sizeof(struct ospf_nbr_nbma
));
1736 nbr_nbma
->priority
= OSPF_NEIGHBOR_PRIORITY_DEFAULT
;
1737 nbr_nbma
->v_poll
= OSPF_POLL_INTERVAL_DEFAULT
;
1742 static void ospf_nbr_nbma_free(struct ospf_nbr_nbma
*nbr_nbma
)
1744 XFREE(MTYPE_OSPF_NEIGHBOR_STATIC
, nbr_nbma
);
1747 static void ospf_nbr_nbma_delete(struct ospf
*ospf
,
1748 struct ospf_nbr_nbma
*nbr_nbma
)
1750 struct route_node
*rn
;
1751 struct prefix_ipv4 p
;
1754 p
.prefix
= nbr_nbma
->addr
;
1755 p
.prefixlen
= IPV4_MAX_BITLEN
;
1757 rn
= route_node_lookup(ospf
->nbr_nbma
, (struct prefix
*)&p
);
1759 ospf_nbr_nbma_free(rn
->info
);
1761 route_unlock_node(rn
);
1762 route_unlock_node(rn
);
1766 static void ospf_nbr_nbma_down(struct ospf_nbr_nbma
*nbr_nbma
)
1768 OSPF_TIMER_OFF(nbr_nbma
->t_poll
);
1770 if (nbr_nbma
->nbr
) {
1771 nbr_nbma
->nbr
->nbr_nbma
= NULL
;
1772 OSPF_NSM_EVENT_EXECUTE(nbr_nbma
->nbr
, NSM_KillNbr
);
1776 listnode_delete(nbr_nbma
->oi
->nbr_nbma
, nbr_nbma
);
1779 static void ospf_nbr_nbma_add(struct ospf_nbr_nbma
*nbr_nbma
,
1780 struct ospf_interface
*oi
)
1782 struct ospf_neighbor
*nbr
;
1783 struct route_node
*rn
;
1786 if (oi
->type
!= OSPF_IFTYPE_NBMA
)
1789 if (nbr_nbma
->nbr
!= NULL
)
1792 if (IPV4_ADDR_SAME(&oi
->nbr_self
->address
.u
.prefix4
, &nbr_nbma
->addr
))
1796 listnode_add(oi
->nbr_nbma
, nbr_nbma
);
1798 /* Get neighbor information from table. */
1800 p
.prefixlen
= IPV4_MAX_BITLEN
;
1801 p
.u
.prefix4
= nbr_nbma
->addr
;
1803 rn
= route_node_get(oi
->nbrs
, (struct prefix
*)&p
);
1806 nbr
->nbr_nbma
= nbr_nbma
;
1807 nbr_nbma
->nbr
= nbr
;
1809 route_unlock_node(rn
);
1811 nbr
= rn
->info
= ospf_nbr_new(oi
);
1812 nbr
->state
= NSM_Down
;
1813 nbr
->src
= nbr_nbma
->addr
;
1814 nbr
->nbr_nbma
= nbr_nbma
;
1815 nbr
->priority
= nbr_nbma
->priority
;
1818 nbr_nbma
->nbr
= nbr
;
1820 OSPF_NSM_EVENT_EXECUTE(nbr
, NSM_Start
);
1824 void ospf_nbr_nbma_if_update(struct ospf
*ospf
, struct ospf_interface
*oi
)
1826 struct ospf_nbr_nbma
*nbr_nbma
;
1827 struct route_node
*rn
;
1828 struct prefix_ipv4 p
;
1830 if (oi
->type
!= OSPF_IFTYPE_NBMA
)
1833 for (rn
= route_top(ospf
->nbr_nbma
); rn
; rn
= route_next(rn
))
1834 if ((nbr_nbma
= rn
->info
))
1835 if (nbr_nbma
->oi
== NULL
&& nbr_nbma
->nbr
== NULL
) {
1837 p
.prefix
= nbr_nbma
->addr
;
1838 p
.prefixlen
= IPV4_MAX_BITLEN
;
1840 if (prefix_match(oi
->address
,
1841 (struct prefix
*)&p
))
1842 ospf_nbr_nbma_add(nbr_nbma
, oi
);
1846 struct ospf_nbr_nbma
*ospf_nbr_nbma_lookup(struct ospf
*ospf
,
1847 struct in_addr nbr_addr
)
1849 struct route_node
*rn
;
1850 struct prefix_ipv4 p
;
1853 p
.prefix
= nbr_addr
;
1854 p
.prefixlen
= IPV4_MAX_BITLEN
;
1856 rn
= route_node_lookup(ospf
->nbr_nbma
, (struct prefix
*)&p
);
1858 route_unlock_node(rn
);
1864 struct ospf_nbr_nbma
*ospf_nbr_nbma_lookup_next(struct ospf
*ospf
,
1865 struct in_addr
*addr
, int first
)
1868 struct ospf_nbr_nbma
*nbr_nbma
;
1869 struct listnode
*node
;
1876 for (ALL_LIST_ELEMENTS_RO (ospf
->nbr_nbma
, node
, nbr_nbma
))
1880 *addr
= nbr_nbma
->addr
;
1883 else if (ntohl (nbr_nbma
->addr
.s_addr
) > ntohl (addr
->s_addr
))
1885 *addr
= nbr_nbma
->addr
;
1893 int ospf_nbr_nbma_set(struct ospf
*ospf
, struct in_addr nbr_addr
)
1895 struct ospf_nbr_nbma
*nbr_nbma
;
1896 struct ospf_interface
*oi
;
1897 struct prefix_ipv4 p
;
1898 struct route_node
*rn
;
1899 struct listnode
*node
;
1901 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
1905 nbr_nbma
= ospf_nbr_nbma_new();
1906 nbr_nbma
->addr
= nbr_addr
;
1909 p
.prefix
= nbr_addr
;
1910 p
.prefixlen
= IPV4_MAX_BITLEN
;
1912 rn
= route_node_get(ospf
->nbr_nbma
, (struct prefix
*)&p
);
1914 route_unlock_node(rn
);
1915 rn
->info
= nbr_nbma
;
1917 for (ALL_LIST_ELEMENTS_RO(ospf
->oiflist
, node
, oi
)) {
1918 if (oi
->type
== OSPF_IFTYPE_NBMA
)
1919 if (prefix_match(oi
->address
, (struct prefix
*)&p
)) {
1920 ospf_nbr_nbma_add(nbr_nbma
, oi
);
1928 int ospf_nbr_nbma_unset(struct ospf
*ospf
, struct in_addr nbr_addr
)
1930 struct ospf_nbr_nbma
*nbr_nbma
;
1932 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
1933 if (nbr_nbma
== NULL
)
1936 ospf_nbr_nbma_down(nbr_nbma
);
1937 ospf_nbr_nbma_delete(ospf
, nbr_nbma
);
1942 int ospf_nbr_nbma_priority_set(struct ospf
*ospf
, struct in_addr nbr_addr
,
1945 struct ospf_nbr_nbma
*nbr_nbma
;
1947 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
1948 if (nbr_nbma
== NULL
)
1951 if (nbr_nbma
->priority
!= priority
)
1952 nbr_nbma
->priority
= priority
;
1957 int ospf_nbr_nbma_priority_unset(struct ospf
*ospf
, struct in_addr nbr_addr
)
1959 struct ospf_nbr_nbma
*nbr_nbma
;
1961 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
1962 if (nbr_nbma
== NULL
)
1965 if (nbr_nbma
!= OSPF_NEIGHBOR_PRIORITY_DEFAULT
)
1966 nbr_nbma
->priority
= OSPF_NEIGHBOR_PRIORITY_DEFAULT
;
1971 int ospf_nbr_nbma_poll_interval_set(struct ospf
*ospf
, struct in_addr nbr_addr
,
1972 unsigned int interval
)
1974 struct ospf_nbr_nbma
*nbr_nbma
;
1976 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, nbr_addr
);
1977 if (nbr_nbma
== NULL
)
1980 if (nbr_nbma
->v_poll
!= interval
) {
1981 nbr_nbma
->v_poll
= interval
;
1982 if (nbr_nbma
->oi
&& ospf_if_is_up(nbr_nbma
->oi
)) {
1983 OSPF_TIMER_OFF(nbr_nbma
->t_poll
);
1984 OSPF_POLL_TIMER_ON(nbr_nbma
->t_poll
, ospf_poll_timer
,
1992 int ospf_nbr_nbma_poll_interval_unset(struct ospf
*ospf
, struct in_addr addr
)
1994 struct ospf_nbr_nbma
*nbr_nbma
;
1996 nbr_nbma
= ospf_nbr_nbma_lookup(ospf
, addr
);
1997 if (nbr_nbma
== NULL
)
2000 if (nbr_nbma
->v_poll
!= OSPF_POLL_INTERVAL_DEFAULT
)
2001 nbr_nbma
->v_poll
= OSPF_POLL_INTERVAL_DEFAULT
;
2006 void ospf_master_init(struct thread_master
*master
)
2008 memset(&ospf_master
, 0, sizeof(struct ospf_master
));
2011 om
->ospf
= list_new();
2012 om
->master
= master
;
2015 /* Link OSPF instance to VRF. */
2016 void ospf_vrf_link(struct ospf
*ospf
, struct vrf
*vrf
)
2018 ospf
->vrf_id
= vrf
->vrf_id
;
2019 if (vrf
->info
!= (void *)ospf
)
2020 vrf
->info
= (void *)ospf
;
2023 /* Unlink OSPF instance from VRF. */
2024 void ospf_vrf_unlink(struct ospf
*ospf
, struct vrf
*vrf
)
2026 if (vrf
->info
== (void *)ospf
)
2028 ospf
->vrf_id
= VRF_UNKNOWN
;
2031 /* This is hook function for vrf create called as part of vrf_init */
2032 static int ospf_vrf_new(struct vrf
*vrf
)
2034 if (IS_DEBUG_OSPF_EVENT
)
2035 zlog_debug("%s: VRF Created: %s(%u)", __PRETTY_FUNCTION__
,
2036 vrf
->name
, vrf
->vrf_id
);
2041 /* This is hook function for vrf delete call as part of vrf_init */
2042 static int ospf_vrf_delete(struct vrf
*vrf
)
2044 if (IS_DEBUG_OSPF_EVENT
)
2045 zlog_debug("%s: VRF Deletion: %s(%u)", __PRETTY_FUNCTION__
,
2046 vrf
->name
, vrf
->vrf_id
);
2051 static void ospf_set_redist_vrf_bitmaps(struct ospf
*ospf
)
2054 struct list
*red_list
;
2056 for (type
= 0; type
< ZEBRA_ROUTE_MAX
; type
++) {
2057 red_list
= ospf
->redist
[type
];
2060 if (IS_DEBUG_OSPF_EVENT
)
2062 "%s: setting redist vrf %d bitmap for type %d",
2063 __func__
, ospf
->vrf_id
, type
);
2064 vrf_bitmap_set(zclient
->redist
[AFI_IP
][type
], ospf
->vrf_id
);
2068 /* Enable OSPF VRF instance */
2069 static int ospf_vrf_enable(struct vrf
*vrf
)
2071 struct ospf
*ospf
= NULL
;
2072 vrf_id_t old_vrf_id
;
2075 if (IS_DEBUG_OSPF_EVENT
)
2076 zlog_debug("%s: VRF %s id %u enabled", __PRETTY_FUNCTION__
,
2077 vrf
->name
, vrf
->vrf_id
);
2079 ospf
= ospf_lookup_by_name(vrf
->name
);
2081 old_vrf_id
= ospf
->vrf_id
;
2082 /* We have instance configured, link to VRF and make it "up". */
2083 ospf_vrf_link(ospf
, vrf
);
2084 if (IS_DEBUG_OSPF_EVENT
)
2086 "%s: ospf linked to vrf %s vrf_id %u (old id %u)",
2087 __PRETTY_FUNCTION__
, vrf
->name
, ospf
->vrf_id
,
2090 if (old_vrf_id
!= ospf
->vrf_id
) {
2091 frr_elevate_privs(&ospfd_privs
) {
2092 /* stop zebra redist to us for old vrf */
2093 zclient_send_dereg_requests(zclient
,
2096 ospf_set_redist_vrf_bitmaps(ospf
);
2098 /* start zebra redist to us for new vrf */
2099 ospf_zebra_vrf_register(ospf
);
2101 ret
= ospf_sock_init(ospf
);
2103 if (ret
< 0 || ospf
->fd
<= 0)
2105 thread_add_read(master
, ospf_read
, ospf
, ospf
->fd
,
2107 ospf
->oi_running
= 1;
2108 ospf_router_id_update(ospf
);
2115 /* Disable OSPF VRF instance */
2116 static int ospf_vrf_disable(struct vrf
*vrf
)
2118 struct ospf
*ospf
= NULL
;
2119 vrf_id_t old_vrf_id
= VRF_UNKNOWN
;
2121 if (vrf
->vrf_id
== VRF_DEFAULT
)
2124 if (IS_DEBUG_OSPF_EVENT
)
2125 zlog_debug("%s: VRF %s id %d disabled.", __PRETTY_FUNCTION__
,
2126 vrf
->name
, vrf
->vrf_id
);
2128 ospf
= ospf_lookup_by_name(vrf
->name
);
2130 old_vrf_id
= ospf
->vrf_id
;
2132 /* We have instance configured, unlink
2133 * from VRF and make it "down".
2135 ospf_vrf_unlink(ospf
, vrf
);
2136 ospf
->oi_running
= 0;
2137 if (IS_DEBUG_OSPF_EVENT
)
2138 zlog_debug("%s: ospf old_vrf_id %d unlinked",
2139 __PRETTY_FUNCTION__
, old_vrf_id
);
2140 thread_cancel(ospf
->t_read
);
2145 /* Note: This is a callback, the VRF will be deleted by the caller. */
2149 void ospf_vrf_init(void)
2151 vrf_init(ospf_vrf_new
, ospf_vrf_enable
, ospf_vrf_disable
,
2155 void ospf_vrf_terminate(void)
2160 const char *ospf_vrf_id_to_name(vrf_id_t vrf_id
)
2162 struct vrf
*vrf
= vrf_lookup_by_id(vrf_id
);
2164 return vrf
? vrf
->name
: "NIL";