]> git.proxmox.com Git - mirror_frr.git/blob - ospfd/ospfd.c
Merge pull request #4912 from lucize/carescross
[mirror_frr.git] / ospfd / ospfd.c
1 /* OSPF version 2 daemon program.
2 * Copyright (C) 1999, 2000 Toshiaki Takada
3 *
4 * This file is part of GNU Zebra.
5 *
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
9 * later version.
10 *
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.
15 *
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
19 */
20
21 #include <zebra.h>
22
23 #include "thread.h"
24 #include "vty.h"
25 #include "command.h"
26 #include "linklist.h"
27 #include "prefix.h"
28 #include "table.h"
29 #include "if.h"
30 #include "memory.h"
31 #include "stream.h"
32 #include "log.h"
33 #include "sockunion.h" /* for inet_aton () */
34 #include "zclient.h"
35 #include "routemap.h"
36 #include "plist.h"
37 #include "sockopt.h"
38 #include "bfd.h"
39 #include "libfrr.h"
40 #include "defaults.h"
41 #include "lib_errors.h"
42
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_route.h"
56 #include "ospfd/ospf_zebra.h"
57 #include "ospfd/ospf_abr.h"
58 #include "ospfd/ospf_flood.h"
59 #include "ospfd/ospf_ase.h"
60
61
62 DEFINE_QOBJ_TYPE(ospf)
63
64 /* OSPF process wide configuration. */
65 static struct ospf_master ospf_master;
66
67 /* OSPF process wide configuration pointer to export. */
68 struct ospf_master *om;
69
70 extern struct zclient *zclient;
71
72
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 *);
84
85 #define OSPF_EXTERNAL_LSA_ORIGINATE_DELAY 1
86
87 void ospf_router_id_update(struct ospf *ospf)
88 {
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;
94
95 if (!ospf->oi_running) {
96 if (IS_DEBUG_OSPF_EVENT)
97 zlog_debug(
98 "Router ospf not configured -- Router-ID update postponed");
99 return;
100 }
101
102 if (IS_DEBUG_OSPF_EVENT)
103 zlog_debug("Router-ID[OLD:%s]: Update",
104 inet_ntoa(ospf->router_id));
105
106 router_id_old = ospf->router_id;
107
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
112 disruptive.
113 3. Last choice: just go with whatever the zebra daemon recommends.
114 */
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;
119 else
120 router_id = ospf->router_id_zebra;
121
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));
125
126 if (!IPV4_ADDR_SAME(&router_id_old, &router_id)) {
127
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
133 */
134 ospf_nbr_self_reset(oi, router_id);
135 }
136
137 /* Flush (inline) all external LSAs based on the OSPF_LSA_SELF
138 * flag */
139 if (ospf->lsdb) {
140 struct route_node *rn;
141 struct ospf_lsa *lsa;
142
143 LSDB_LOOP (EXTERNAL_LSDB(ospf), rn, lsa)
144 if (IS_LSA_SELF(lsa))
145 ospf_lsa_flush_schedule(ospf, lsa);
146 }
147
148 ospf->router_id = router_id;
149 if (IS_DEBUG_OSPF_EVENT)
150 zlog_debug("Router-ID[NEW:%s]: Update",
151 inet_ntoa(ospf->router_id));
152
153 /* Flush (inline) all external LSAs which now match the new
154 router-id,
155 need to adjust the OSPF_LSA_SELF flag, so the flush doesn't
156 hit
157 asserts in ospf_refresher_unregister_lsa(). This step is
158 needed
159 because the current quagga code does look-up for
160 self-originated LSAs
161 based on the self router-id alone but expects OSPF_LSA_SELF
162 to be
163 properly set */
164 if (ospf->lsdb) {
165 struct route_node *rn;
166 struct ospf_lsa *lsa;
167
168 LSDB_LOOP (EXTERNAL_LSDB(ospf), rn, lsa) {
169 /* AdvRouter and Router ID is the same. */
170 if (IPV4_ADDR_SAME(&lsa->data->adv_router,
171 &ospf->router_id)) {
172 SET_FLAG(lsa->flags,
173 OSPF_LSA_SELF_CHECKED);
174 SET_FLAG(lsa->flags, OSPF_LSA_SELF);
175 ospf_lsa_flush_schedule(ospf, lsa);
176 }
177 }
178 }
179
180 /* update router-lsa's for each area */
181 ospf_router_lsa_update(ospf);
182
183 /* update ospf_interface's */
184 FOR_ALL_INTERFACES (vrf, ifp)
185 ospf_if_update(ospf, ifp);
186
187 ospf_external_lsa_rid_change(ospf);
188 }
189 }
190
191 /* For OSPF area sort by area id. */
192 static int ospf_area_id_cmp(struct ospf_area *a1, struct ospf_area *a2)
193 {
194 if (ntohl(a1->area_id.s_addr) > ntohl(a2->area_id.s_addr))
195 return 1;
196 if (ntohl(a1->area_id.s_addr) < ntohl(a2->area_id.s_addr))
197 return -1;
198 return 0;
199 }
200
201 /* Allocate new ospf structure. */
202 static struct ospf *ospf_new(unsigned short instance, const char *name)
203 {
204 int i;
205 struct vrf *vrf = NULL;
206
207 struct ospf *new = XCALLOC(MTYPE_OSPF_TOP, sizeof(struct ospf));
208
209 new->instance = instance;
210 new->router_id.s_addr = htonl(0);
211 new->router_id_static.s_addr = htonl(0);
212 if (name) {
213 vrf = vrf_lookup_by_name(name);
214 if (vrf)
215 new->vrf_id = vrf->vrf_id;
216 else
217 new->vrf_id = VRF_UNKNOWN;
218 /* Freed in ospf_finish_final */
219 new->name = XSTRDUP(MTYPE_OSPF_TOP, name);
220 if (IS_DEBUG_OSPF_EVENT)
221 zlog_debug(
222 "%s: Create new ospf instance with vrf_name %s vrf_id %u",
223 __PRETTY_FUNCTION__, name, new->vrf_id);
224 } else {
225 new->vrf_id = VRF_DEFAULT;
226 vrf = vrf_lookup_by_id(VRF_DEFAULT);
227 }
228
229 if (vrf)
230 ospf_vrf_link(new, vrf);
231
232 ospf_zebra_vrf_register(new);
233
234 new->abr_type = OSPF_ABR_DEFAULT;
235 new->oiflist = list_new();
236 new->vlinks = list_new();
237 new->areas = list_new();
238 new->areas->cmp = (int (*)(void *, void *))ospf_area_id_cmp;
239 new->networks = route_table_init();
240 new->nbr_nbma = route_table_init();
241
242 new->lsdb = ospf_lsdb_new();
243
244 new->default_originate = DEFAULT_ORIGINATE_NONE;
245
246 new->passive_interface_default = OSPF_IF_ACTIVE;
247
248 new->new_external_route = route_table_init();
249 new->old_external_route = route_table_init();
250 new->external_lsas = route_table_init();
251
252 new->stub_router_startup_time = OSPF_STUB_ROUTER_UNCONFIGURED;
253 new->stub_router_shutdown_time = OSPF_STUB_ROUTER_UNCONFIGURED;
254 new->stub_router_admin_set = OSPF_STUB_ROUTER_ADMINISTRATIVE_UNSET;
255
256 /* Distribute parameter init. */
257 for (i = 0; i <= ZEBRA_ROUTE_MAX; i++) {
258 new->dtag[i] = 0;
259 }
260 new->default_metric = -1;
261 new->ref_bandwidth = OSPF_DEFAULT_REF_BANDWIDTH;
262
263 /* LSA timers */
264 new->min_ls_interval = OSPF_MIN_LS_INTERVAL;
265 new->min_ls_arrival = OSPF_MIN_LS_ARRIVAL;
266
267 /* SPF timer value init. */
268 new->spf_delay = OSPF_SPF_DELAY_DEFAULT;
269 new->spf_holdtime = OSPF_SPF_HOLDTIME_DEFAULT;
270 new->spf_max_holdtime = OSPF_SPF_MAX_HOLDTIME_DEFAULT;
271 new->spf_hold_multiplier = 1;
272
273 /* MaxAge init. */
274 new->maxage_delay = OSPF_LSA_MAXAGE_REMOVE_DELAY_DEFAULT;
275 new->maxage_lsa = route_table_init();
276 new->t_maxage_walker = NULL;
277 thread_add_timer(master, ospf_lsa_maxage_walker, new,
278 OSPF_LSA_MAXAGE_CHECK_INTERVAL, &new->t_maxage_walker);
279
280 /* Distance table init. */
281 new->distance_table = route_table_init();
282
283 new->lsa_refresh_queue.index = 0;
284 new->lsa_refresh_interval = OSPF_LSA_REFRESH_INTERVAL_DEFAULT;
285 new->t_lsa_refresher = NULL;
286 thread_add_timer(master, ospf_lsa_refresh_walker, new,
287 new->lsa_refresh_interval, &new->t_lsa_refresher);
288 new->lsa_refresher_started = monotime(NULL);
289
290 new->ibuf = stream_new(OSPF_MAX_PACKET_SIZE + 1);
291
292 new->t_read = NULL;
293 new->oi_write_q = list_new();
294 new->write_oi_count = OSPF_WRITE_INTERFACE_COUNT_DEFAULT;
295
296 /* Enable "log-adjacency-changes" */
297 #if DFLT_OSPF_LOG_ADJACENCY_CHANGES
298 SET_FLAG(new->config, OSPF_LOG_ADJACENCY_CHANGES);
299 #endif
300
301 QOBJ_REG(new, ospf);
302
303 new->fd = -1;
304 if ((ospf_sock_init(new)) < 0) {
305 if (new->vrf_id != VRF_UNKNOWN)
306 flog_err(
307 EC_LIB_SOCKET,
308 "%s: ospf_sock_init is unable to open a socket",
309 __func__);
310 return new;
311 }
312 thread_add_read(master, ospf_read, new, new->fd, &new->t_read);
313
314 return new;
315 }
316
317 struct ospf *ospf_lookup_instance(unsigned short instance)
318 {
319 struct ospf *ospf;
320 struct listnode *node, *nnode;
321
322 if (listcount(om->ospf) == 0)
323 return NULL;
324
325 for (ALL_LIST_ELEMENTS(om->ospf, node, nnode, ospf))
326 if ((ospf->instance == 0 && instance == 0)
327 || (ospf->instance && instance
328 && ospf->instance == instance))
329 return ospf;
330
331 return NULL;
332 }
333
334 static int ospf_is_ready(struct ospf *ospf)
335 {
336 /* OSPF must be on and Router-ID must be configured. */
337 if (!ospf || ospf->router_id.s_addr == 0)
338 return 0;
339
340 return 1;
341 }
342
343 static void ospf_add(struct ospf *ospf)
344 {
345 listnode_add(om->ospf, ospf);
346 }
347
348 static void ospf_delete(struct ospf *ospf)
349 {
350 listnode_delete(om->ospf, ospf);
351 }
352
353 struct ospf *ospf_lookup_by_inst_name(unsigned short instance, const char *name)
354 {
355 struct ospf *ospf = NULL;
356 struct listnode *node, *nnode;
357
358 if (name == NULL || strmatch(name, VRF_DEFAULT_NAME))
359 return ospf_lookup_by_vrf_id(VRF_DEFAULT);
360
361 for (ALL_LIST_ELEMENTS(om->ospf, node, nnode, ospf)) {
362 if ((ospf->instance == instance)
363 && ((ospf->name == NULL && name == NULL)
364 || (ospf->name && name
365 && strcmp(ospf->name, name) == 0)))
366 return ospf;
367 }
368 return NULL;
369 }
370
371 struct ospf *ospf_get(unsigned short instance, const char *name)
372 {
373 struct ospf *ospf;
374
375 /* vrf name provided call inst and name based api
376 * in case of no name pass default ospf instance */
377 if (name)
378 ospf = ospf_lookup_by_inst_name(instance, name);
379 else
380 ospf = ospf_lookup_by_vrf_id(VRF_DEFAULT);
381
382 if (ospf == NULL) {
383 ospf = ospf_new(instance, name);
384 ospf_add(ospf);
385
386 if (ospf->router_id_static.s_addr == 0)
387 ospf_router_id_update(ospf);
388
389 ospf_opaque_type11_lsa_init(ospf);
390 }
391
392 return ospf;
393 }
394
395 struct ospf *ospf_get_instance(unsigned short instance)
396 {
397 struct ospf *ospf;
398
399 ospf = ospf_lookup_instance(instance);
400 if (ospf == NULL) {
401 ospf = ospf_new(instance, NULL /* VRF_DEFAULT*/);
402 ospf_add(ospf);
403
404 if (ospf->router_id_static.s_addr == 0) {
405 if (vrf_lookup_by_id(ospf->vrf_id))
406 ospf_router_id_update(ospf);
407 else {
408 if (IS_DEBUG_OSPF_EVENT)
409 zlog_debug(
410 "%s: ospf VRF (id %d) is not active yet, skip router id update",
411 __PRETTY_FUNCTION__,
412 ospf->vrf_id);
413 }
414 ospf_router_id_update(ospf);
415 }
416
417 ospf_opaque_type11_lsa_init(ospf);
418 }
419
420 return ospf;
421 }
422
423 struct ospf *ospf_lookup_by_vrf_id(vrf_id_t vrf_id)
424 {
425 struct vrf *vrf = NULL;
426
427 vrf = vrf_lookup_by_id(vrf_id);
428 if (!vrf)
429 return NULL;
430 return (vrf->info) ? (struct ospf *)vrf->info : NULL;
431 }
432
433 /* It should only be used when processing incoming info update from zebra.
434 * Other situations, it is not sufficient to lookup the ospf instance by
435 * vrf_name only without using the instance number.
436 */
437 static struct ospf *ospf_lookup_by_name(const char *vrf_name)
438 {
439 struct ospf *ospf = NULL;
440 struct listnode *node, *nnode;
441
442 for (ALL_LIST_ELEMENTS(om->ospf, node, nnode, ospf))
443 if ((ospf->name == NULL && vrf_name == NULL)
444 || (ospf->name && vrf_name
445 && strcmp(ospf->name, vrf_name) == 0))
446 return ospf;
447 return NULL;
448 }
449
450 /* Handle the second half of deferred shutdown. This is called either
451 * from the deferred-shutdown timer thread, or directly through
452 * ospf_deferred_shutdown_check.
453 *
454 * Function is to cleanup G-R state, if required then call ospf_finish_final
455 * to complete shutdown of this ospf instance. Possibly exit if the
456 * whole process is being shutdown and this was the last OSPF instance.
457 */
458 static void ospf_deferred_shutdown_finish(struct ospf *ospf)
459 {
460 ospf->stub_router_shutdown_time = OSPF_STUB_ROUTER_UNCONFIGURED;
461 OSPF_TIMER_OFF(ospf->t_deferred_shutdown);
462
463 ospf_finish_final(ospf);
464
465 /* *ospf is now invalid */
466
467 /* ospfd being shut-down? If so, was this the last ospf instance? */
468 if (CHECK_FLAG(om->options, OSPF_MASTER_SHUTDOWN)
469 && (listcount(om->ospf) == 0)) {
470 exit(0);
471 }
472
473 return;
474 }
475
476 /* Timer thread for G-R */
477 static int ospf_deferred_shutdown_timer(struct thread *t)
478 {
479 struct ospf *ospf = THREAD_ARG(t);
480
481 ospf_deferred_shutdown_finish(ospf);
482
483 return 0;
484 }
485
486 /* Check whether deferred-shutdown must be scheduled, otherwise call
487 * down directly into second-half of instance shutdown.
488 */
489 static void ospf_deferred_shutdown_check(struct ospf *ospf)
490 {
491 unsigned long timeout;
492 struct listnode *ln;
493 struct ospf_area *area;
494
495 /* deferred shutdown already running? */
496 if (ospf->t_deferred_shutdown)
497 return;
498
499 /* Should we try push out max-metric LSAs? */
500 if (ospf->stub_router_shutdown_time != OSPF_STUB_ROUTER_UNCONFIGURED) {
501 for (ALL_LIST_ELEMENTS_RO(ospf->areas, ln, area)) {
502 SET_FLAG(area->stub_router_state,
503 OSPF_AREA_ADMIN_STUB_ROUTED);
504
505 if (!CHECK_FLAG(area->stub_router_state,
506 OSPF_AREA_IS_STUB_ROUTED))
507 ospf_router_lsa_update_area(area);
508 }
509 timeout = ospf->stub_router_shutdown_time;
510 } else {
511 /* No timer needed */
512 ospf_deferred_shutdown_finish(ospf);
513 return;
514 }
515
516 OSPF_TIMER_ON(ospf->t_deferred_shutdown, ospf_deferred_shutdown_timer,
517 timeout);
518 return;
519 }
520
521 /* Shut down the entire process */
522 void ospf_terminate(void)
523 {
524 struct ospf *ospf;
525 struct listnode *node, *nnode;
526
527 /* shutdown already in progress */
528 if (CHECK_FLAG(om->options, OSPF_MASTER_SHUTDOWN))
529 return;
530
531 SET_FLAG(om->options, OSPF_MASTER_SHUTDOWN);
532
533 /* exit immediately if OSPF not actually running */
534 if (listcount(om->ospf) == 0)
535 exit(0);
536
537 bfd_gbl_exit();
538 for (ALL_LIST_ELEMENTS(om->ospf, node, nnode, ospf))
539 ospf_finish(ospf);
540
541 /* Cleanup route maps */
542 route_map_finish();
543
544 /* reverse prefix_list_init */
545 prefix_list_add_hook(NULL);
546 prefix_list_delete_hook(NULL);
547 prefix_list_reset();
548
549 /* Cleanup vrf info */
550 ospf_vrf_terminate();
551
552 /* Deliberately go back up, hopefully to thread scheduler, as
553 * One or more ospf_finish()'s may have deferred shutdown to a timer
554 * thread
555 */
556 zclient_stop(zclient);
557 zclient_free(zclient);
558
559 frr_fini();
560 }
561
562 void ospf_finish(struct ospf *ospf)
563 {
564 /* let deferred shutdown decide */
565 ospf_deferred_shutdown_check(ospf);
566
567 /* if ospf_deferred_shutdown returns, then ospf_finish_final is
568 * deferred to expiry of G-S timer thread. Return back up, hopefully
569 * to thread scheduler.
570 */
571 return;
572 }
573
574 /* Final cleanup of ospf instance */
575 static void ospf_finish_final(struct ospf *ospf)
576 {
577 struct vrf *vrf = vrf_lookup_by_id(ospf->vrf_id);
578 struct route_node *rn;
579 struct ospf_nbr_nbma *nbr_nbma;
580 struct ospf_lsa *lsa;
581 struct interface *ifp;
582 struct ospf_interface *oi;
583 struct ospf_area *area;
584 struct ospf_vl_data *vl_data;
585 struct listnode *node, *nnode;
586 int i;
587 unsigned short instance = 0;
588
589 QOBJ_UNREG(ospf);
590
591 ospf_opaque_type11_lsa_term(ospf);
592
593 ospf_opaque_finish();
594
595 ospf_flush_self_originated_lsas_now(ospf);
596
597 /* Unregister redistribution */
598 for (i = 0; i < ZEBRA_ROUTE_MAX; i++) {
599 struct list *red_list;
600 struct ospf_redist *red;
601
602 red_list = ospf->redist[i];
603 if (!red_list)
604 continue;
605
606 for (ALL_LIST_ELEMENTS(red_list, node, nnode, red)) {
607 ospf_redistribute_unset(ospf, i, red->instance);
608 ospf_redist_del(ospf, i, red->instance);
609 }
610 }
611 ospf_redistribute_default_set(ospf, DEFAULT_ORIGINATE_NONE, 0, 0);
612
613 for (ALL_LIST_ELEMENTS(ospf->areas, node, nnode, area))
614 ospf_remove_vls_through_area(ospf, area);
615
616 for (ALL_LIST_ELEMENTS(ospf->vlinks, node, nnode, vl_data))
617 ospf_vl_delete(ospf, vl_data);
618
619 list_delete(&ospf->vlinks);
620
621 /* Remove any ospf interface config params */
622 FOR_ALL_INTERFACES (vrf, ifp) {
623 struct ospf_if_params *params;
624
625 params = IF_DEF_PARAMS(ifp);
626 if (OSPF_IF_PARAM_CONFIGURED(params, if_area))
627 UNSET_IF_PARAM(params, if_area);
628 }
629
630 /* Reset interface. */
631 for (ALL_LIST_ELEMENTS(ospf->oiflist, node, nnode, oi))
632 ospf_if_free(oi);
633 list_delete(&ospf->oiflist);
634 ospf->oi_running = 0;
635
636 /* De-Register VRF */
637 ospf_zebra_vrf_deregister(ospf);
638
639 /* Clear static neighbors */
640 for (rn = route_top(ospf->nbr_nbma); rn; rn = route_next(rn))
641 if ((nbr_nbma = rn->info)) {
642 OSPF_POLL_TIMER_OFF(nbr_nbma->t_poll);
643
644 if (nbr_nbma->nbr) {
645 nbr_nbma->nbr->nbr_nbma = NULL;
646 nbr_nbma->nbr = NULL;
647 }
648
649 if (nbr_nbma->oi) {
650 listnode_delete(nbr_nbma->oi->nbr_nbma,
651 nbr_nbma);
652 nbr_nbma->oi = NULL;
653 }
654
655 XFREE(MTYPE_OSPF_NEIGHBOR_STATIC, nbr_nbma);
656 }
657
658 route_table_finish(ospf->nbr_nbma);
659
660 /* Clear networks and Areas. */
661 for (rn = route_top(ospf->networks); rn; rn = route_next(rn)) {
662 struct ospf_network *network;
663
664 if ((network = rn->info) != NULL) {
665 ospf_network_free(ospf, network);
666 rn->info = NULL;
667 route_unlock_node(rn);
668 }
669 }
670 route_table_finish(ospf->networks);
671
672 for (ALL_LIST_ELEMENTS(ospf->areas, node, nnode, area)) {
673 listnode_delete(ospf->areas, area);
674 ospf_area_free(area);
675 }
676
677 /* Cancel all timers. */
678 OSPF_TIMER_OFF(ospf->t_read);
679 OSPF_TIMER_OFF(ospf->t_write);
680 OSPF_TIMER_OFF(ospf->t_spf_calc);
681 OSPF_TIMER_OFF(ospf->t_ase_calc);
682 OSPF_TIMER_OFF(ospf->t_maxage);
683 OSPF_TIMER_OFF(ospf->t_maxage_walker);
684 OSPF_TIMER_OFF(ospf->t_abr_task);
685 OSPF_TIMER_OFF(ospf->t_asbr_check);
686 OSPF_TIMER_OFF(ospf->t_distribute_update);
687 OSPF_TIMER_OFF(ospf->t_lsa_refresher);
688 OSPF_TIMER_OFF(ospf->t_opaque_lsa_self);
689 OSPF_TIMER_OFF(ospf->t_sr_update);
690
691 LSDB_LOOP (OPAQUE_AS_LSDB(ospf), rn, lsa)
692 ospf_discard_from_db(ospf, ospf->lsdb, lsa);
693 LSDB_LOOP (EXTERNAL_LSDB(ospf), rn, lsa)
694 ospf_discard_from_db(ospf, ospf->lsdb, lsa);
695
696 ospf_lsdb_delete_all(ospf->lsdb);
697 ospf_lsdb_free(ospf->lsdb);
698
699 for (rn = route_top(ospf->maxage_lsa); rn; rn = route_next(rn)) {
700 if ((lsa = rn->info) != NULL) {
701 ospf_lsa_unlock(&lsa);
702 rn->info = NULL;
703 }
704 route_unlock_node(rn);
705 }
706 route_table_finish(ospf->maxage_lsa);
707
708 if (ospf->old_table)
709 ospf_route_table_free(ospf->old_table);
710 if (ospf->new_table) {
711 ospf_route_delete(ospf, ospf->new_table);
712 ospf_route_table_free(ospf->new_table);
713 }
714 if (ospf->old_rtrs)
715 ospf_rtrs_free(ospf->old_rtrs);
716 if (ospf->new_rtrs)
717 ospf_rtrs_free(ospf->new_rtrs);
718 if (ospf->new_external_route) {
719 ospf_route_delete(ospf, ospf->new_external_route);
720 ospf_route_table_free(ospf->new_external_route);
721 }
722 if (ospf->old_external_route) {
723 ospf_route_delete(ospf, ospf->old_external_route);
724 ospf_route_table_free(ospf->old_external_route);
725 }
726 if (ospf->external_lsas) {
727 ospf_ase_external_lsas_finish(ospf->external_lsas);
728 }
729
730 for (i = ZEBRA_ROUTE_SYSTEM; i <= ZEBRA_ROUTE_MAX; i++) {
731 struct list *ext_list;
732 struct ospf_external *ext;
733
734 ext_list = ospf->external[i];
735 if (!ext_list)
736 continue;
737
738 for (ALL_LIST_ELEMENTS(ext_list, node, nnode, ext)) {
739 if (ext->external_info)
740 for (rn = route_top(ext->external_info); rn;
741 rn = route_next(rn)) {
742 if (rn->info == NULL)
743 continue;
744
745 XFREE(MTYPE_OSPF_EXTERNAL_INFO,
746 rn->info);
747 rn->info = NULL;
748 route_unlock_node(rn);
749 }
750
751 ospf_external_del(ospf, i, ext->instance);
752 }
753 }
754
755 ospf_distance_reset(ospf);
756 route_table_finish(ospf->distance_table);
757
758 if (!CHECK_FLAG(om->options, OSPF_MASTER_SHUTDOWN))
759 instance = ospf->instance;
760
761 list_delete(&ospf->areas);
762 list_delete(&ospf->oi_write_q);
763
764 close(ospf->fd);
765 stream_free(ospf->ibuf);
766 ospf->fd = -1;
767 ospf_delete(ospf);
768
769 if (ospf->name) {
770 vrf = vrf_lookup_by_name(ospf->name);
771 if (vrf)
772 ospf_vrf_unlink(ospf, vrf);
773 XFREE(MTYPE_OSPF_TOP, ospf->name);
774 } else {
775 vrf = vrf_lookup_by_id(VRF_DEFAULT);
776 if (vrf)
777 ospf_vrf_unlink(ospf, vrf);
778 }
779
780 XFREE(MTYPE_OSPF_TOP, ospf);
781
782 if (!CHECK_FLAG(om->options, OSPF_MASTER_SHUTDOWN))
783 ospf_get_instance(instance);
784 }
785
786
787 /* allocate new OSPF Area object */
788 static struct ospf_area *ospf_area_new(struct ospf *ospf,
789 struct in_addr area_id)
790 {
791 struct ospf_area *new;
792
793 /* Allocate new config_network. */
794 new = XCALLOC(MTYPE_OSPF_AREA, sizeof(struct ospf_area));
795
796 new->ospf = ospf;
797
798 new->area_id = area_id;
799 new->area_id_fmt = OSPF_AREA_ID_FMT_DOTTEDQUAD;
800
801 new->external_routing = OSPF_AREA_DEFAULT;
802 new->default_cost = 1;
803 new->auth_type = OSPF_AUTH_NULL;
804
805 /* New LSDB init. */
806 new->lsdb = ospf_lsdb_new();
807
808 /* Self-originated LSAs initialize. */
809 new->router_lsa_self = NULL;
810
811 ospf_opaque_type10_lsa_init(new);
812
813 new->oiflist = list_new();
814 new->ranges = route_table_init();
815
816 if (area_id.s_addr == OSPF_AREA_BACKBONE)
817 ospf->backbone = new;
818
819 return new;
820 }
821
822 static void ospf_area_free(struct ospf_area *area)
823 {
824 struct route_node *rn;
825 struct ospf_lsa *lsa;
826
827 ospf_opaque_type10_lsa_term(area);
828
829 /* Free LSDBs. */
830 LSDB_LOOP (ROUTER_LSDB(area), rn, lsa)
831 ospf_discard_from_db(area->ospf, area->lsdb, lsa);
832 LSDB_LOOP (NETWORK_LSDB(area), rn, lsa)
833 ospf_discard_from_db(area->ospf, area->lsdb, lsa);
834 LSDB_LOOP (SUMMARY_LSDB(area), rn, lsa)
835 ospf_discard_from_db(area->ospf, area->lsdb, lsa);
836 LSDB_LOOP (ASBR_SUMMARY_LSDB(area), rn, lsa)
837 ospf_discard_from_db(area->ospf, area->lsdb, lsa);
838
839 LSDB_LOOP (NSSA_LSDB(area), rn, lsa)
840 ospf_discard_from_db(area->ospf, area->lsdb, lsa);
841 LSDB_LOOP (OPAQUE_AREA_LSDB(area), rn, lsa)
842 ospf_discard_from_db(area->ospf, area->lsdb, lsa);
843 LSDB_LOOP (OPAQUE_LINK_LSDB(area), rn, lsa)
844 ospf_discard_from_db(area->ospf, area->lsdb, lsa);
845
846 ospf_lsdb_delete_all(area->lsdb);
847 ospf_lsdb_free(area->lsdb);
848
849 ospf_lsa_unlock(&area->router_lsa_self);
850
851 route_table_finish(area->ranges);
852 list_delete(&area->oiflist);
853
854 if (EXPORT_NAME(area))
855 free(EXPORT_NAME(area));
856
857 if (IMPORT_NAME(area))
858 free(IMPORT_NAME(area));
859
860 /* Cancel timer. */
861 OSPF_TIMER_OFF(area->t_stub_router);
862 OSPF_TIMER_OFF(area->t_opaque_lsa_self);
863
864 if (OSPF_IS_AREA_BACKBONE(area))
865 area->ospf->backbone = NULL;
866
867 XFREE(MTYPE_OSPF_AREA, area);
868 }
869
870 void ospf_area_check_free(struct ospf *ospf, struct in_addr area_id)
871 {
872 struct ospf_area *area;
873
874 area = ospf_area_lookup_by_area_id(ospf, area_id);
875 if (area && listcount(area->oiflist) == 0 && area->ranges->top == NULL
876 && !ospf_vl_count(ospf, area)
877 && area->shortcut_configured == OSPF_SHORTCUT_DEFAULT
878 && area->external_routing == OSPF_AREA_DEFAULT
879 && area->no_summary == 0 && area->default_cost == 1
880 && EXPORT_NAME(area) == NULL && IMPORT_NAME(area) == NULL
881 && area->auth_type == OSPF_AUTH_NULL) {
882 listnode_delete(ospf->areas, area);
883 ospf_area_free(area);
884 }
885 }
886
887 struct ospf_area *ospf_area_get(struct ospf *ospf, struct in_addr area_id)
888 {
889 struct ospf_area *area;
890
891 area = ospf_area_lookup_by_area_id(ospf, area_id);
892 if (!area) {
893 area = ospf_area_new(ospf, area_id);
894 listnode_add_sort(ospf->areas, area);
895 ospf_check_abr_status(ospf);
896 if (ospf->stub_router_admin_set
897 == OSPF_STUB_ROUTER_ADMINISTRATIVE_SET) {
898 SET_FLAG(area->stub_router_state,
899 OSPF_AREA_ADMIN_STUB_ROUTED);
900 }
901 }
902
903 return area;
904 }
905
906 struct ospf_area *ospf_area_lookup_by_area_id(struct ospf *ospf,
907 struct in_addr area_id)
908 {
909 struct ospf_area *area;
910 struct listnode *node;
911
912 for (ALL_LIST_ELEMENTS_RO(ospf->areas, node, area))
913 if (IPV4_ADDR_SAME(&area->area_id, &area_id))
914 return area;
915
916 return NULL;
917 }
918
919 void ospf_area_add_if(struct ospf_area *area, struct ospf_interface *oi)
920 {
921 listnode_add(area->oiflist, oi);
922 }
923
924 void ospf_area_del_if(struct ospf_area *area, struct ospf_interface *oi)
925 {
926 listnode_delete(area->oiflist, oi);
927 }
928
929
930 static void add_ospf_interface(struct connected *co, struct ospf_area *area)
931 {
932 struct ospf_interface *oi;
933
934 oi = ospf_if_new(area->ospf, co->ifp, co->address);
935 oi->connected = co;
936
937 oi->area = area;
938
939 oi->params = ospf_lookup_if_params(co->ifp, oi->address->u.prefix4);
940 oi->output_cost = ospf_if_get_output_cost(oi);
941
942 /* Relate ospf interface to ospf instance. */
943 oi->ospf = area->ospf;
944
945 /* update network type as interface flag */
946 /* If network type is specified previously,
947 skip network type setting. */
948 oi->type = IF_DEF_PARAMS(co->ifp)->type;
949
950 /* Add pseudo neighbor. */
951 ospf_nbr_self_reset(oi, oi->ospf->router_id);
952
953 ospf_area_add_if(oi->area, oi);
954
955 /*
956 * if router_id is not configured, dont bring up
957 * interfaces.
958 * ospf_router_id_update() will call ospf_if_update
959 * whenever r-id is configured instead.
960 */
961 if ((area->ospf->router_id.s_addr != 0) && if_is_operative(co->ifp))
962 ospf_if_up(oi);
963 }
964
965 static void update_redistributed(struct ospf *ospf, int add_to_ospf)
966 {
967 struct route_node *rn;
968 struct external_info *ei;
969 struct ospf_external *ext;
970
971 if (ospf_is_type_redistributed(ospf, ZEBRA_ROUTE_CONNECT, 0)) {
972 ext = ospf_external_lookup(ospf, ZEBRA_ROUTE_CONNECT, 0);
973 if ((ext) && EXTERNAL_INFO(ext)) {
974 for (rn = route_top(EXTERNAL_INFO(ext)); rn;
975 rn = route_next(rn)) {
976 ei = rn->info;
977 if (ei == NULL)
978 continue;
979
980 if (add_to_ospf) {
981 if (ospf_external_info_find_lsa(ospf,
982 &ei->p))
983 if (!ospf_distribute_check_connected(
984 ospf, ei))
985 ospf_external_lsa_flush(
986 ospf, ei->type,
987 &ei->p,
988 ei->ifindex /*, ei->nexthop */);
989 } else {
990 if (!ospf_external_info_find_lsa(
991 ospf, &ei->p))
992 if (ospf_distribute_check_connected(
993 ospf, ei))
994 ospf_external_lsa_originate(
995 ospf, ei);
996 }
997 }
998 }
999 }
1000 }
1001
1002 /* Config network statement related functions. */
1003 static struct ospf_network *ospf_network_new(struct in_addr area_id)
1004 {
1005 struct ospf_network *new;
1006 new = XCALLOC(MTYPE_OSPF_NETWORK, sizeof(struct ospf_network));
1007
1008 new->area_id = area_id;
1009 new->area_id_fmt = OSPF_AREA_ID_FMT_DOTTEDQUAD;
1010
1011 return new;
1012 }
1013
1014 static void ospf_network_free(struct ospf *ospf, struct ospf_network *network)
1015 {
1016 ospf_area_check_free(ospf, network->area_id);
1017 ospf_schedule_abr_task(ospf);
1018 XFREE(MTYPE_OSPF_NETWORK, network);
1019 }
1020
1021 int ospf_network_set(struct ospf *ospf, struct prefix_ipv4 *p,
1022 struct in_addr area_id, int df)
1023 {
1024 struct ospf_network *network;
1025 struct ospf_area *area;
1026 struct route_node *rn;
1027
1028 rn = route_node_get(ospf->networks, (struct prefix *)p);
1029 if (rn->info) {
1030 network = rn->info;
1031 route_unlock_node(rn);
1032
1033 if (IPV4_ADDR_SAME(&area_id, &network->area_id)) {
1034 return 1;
1035 } else {
1036 /* There is already same network statement. */
1037 return 0;
1038 }
1039 }
1040
1041 rn->info = network = ospf_network_new(area_id);
1042 network->area_id_fmt = df;
1043 area = ospf_area_get(ospf, area_id);
1044 ospf_area_display_format_set(ospf, area, df);
1045
1046 /* Run network config now. */
1047 ospf_network_run((struct prefix *)p, area);
1048
1049 /* Update connected redistribute. */
1050 update_redistributed(ospf, 1); /* interfaces possibly added */
1051
1052 ospf_area_check_free(ospf, area_id);
1053
1054 return 1;
1055 }
1056
1057 int ospf_network_unset(struct ospf *ospf, struct prefix_ipv4 *p,
1058 struct in_addr area_id)
1059 {
1060 struct route_node *rn;
1061 struct ospf_network *network;
1062 struct listnode *node, *nnode;
1063 struct ospf_interface *oi;
1064
1065 rn = route_node_lookup(ospf->networks, (struct prefix *)p);
1066 if (rn == NULL)
1067 return 0;
1068
1069 network = rn->info;
1070 route_unlock_node(rn);
1071 if (!IPV4_ADDR_SAME(&area_id, &network->area_id))
1072 return 0;
1073
1074 ospf_network_free(ospf, rn->info);
1075 rn->info = NULL;
1076 route_unlock_node(rn); /* initial reference */
1077
1078 /* Find interfaces that are not configured already. */
1079 for (ALL_LIST_ELEMENTS(ospf->oiflist, node, nnode, oi)) {
1080
1081 if (oi->type == OSPF_IFTYPE_VIRTUALLINK)
1082 continue;
1083
1084 ospf_network_run_subnet(ospf, oi->connected, NULL, NULL);
1085 }
1086
1087 /* Update connected redistribute. */
1088 update_redistributed(ospf, 0); /* interfaces possibly removed */
1089 ospf_area_check_free(ospf, area_id);
1090
1091 return 1;
1092 }
1093
1094 /* Ensure there's an OSPF instance, as "ip ospf area" enabled OSPF means
1095 * there might not be any 'router ospf' config.
1096 *
1097 * Otherwise, doesn't do anything different to ospf_if_update for now
1098 */
1099 void ospf_interface_area_set(struct ospf *ospf, struct interface *ifp)
1100 {
1101 if (!ospf)
1102 return;
1103
1104 ospf_if_update(ospf, ifp);
1105 /* if_update does a update_redistributed */
1106
1107 return;
1108 }
1109
1110 void ospf_interface_area_unset(struct ospf *ospf, struct interface *ifp)
1111 {
1112 struct route_node *rn_oi;
1113
1114 if (!ospf)
1115 return; /* Ospf not ready yet */
1116
1117 /* Find interfaces that may need to be removed. */
1118 for (rn_oi = route_top(IF_OIFS(ifp)); rn_oi;
1119 rn_oi = route_next(rn_oi)) {
1120 struct ospf_interface *oi = NULL;
1121
1122 if ((oi = rn_oi->info) == NULL)
1123 continue;
1124
1125 if (oi->type == OSPF_IFTYPE_VIRTUALLINK)
1126 continue;
1127
1128 ospf_network_run_subnet(ospf, oi->connected, NULL, NULL);
1129 }
1130
1131 /* Update connected redistribute. */
1132 update_redistributed(ospf, 0); /* interfaces possibly removed */
1133 }
1134
1135 bool ospf_interface_area_is_already_set(struct ospf *ospf,
1136 struct interface *ifp)
1137 {
1138 struct route_node *rn_oi;
1139
1140 if (!ospf)
1141 return false; /* Ospf not ready yet */
1142
1143 /* Find interfaces that may need to be removed. */
1144 for (rn_oi = route_top(IF_OIFS(ifp)); rn_oi;
1145 rn_oi = route_next(rn_oi)) {
1146 struct ospf_interface *oi = rn_oi->info;
1147
1148 if (oi == NULL)
1149 continue;
1150
1151 if (oi->type == OSPF_IFTYPE_VIRTUALLINK)
1152 continue;
1153 /* at least one route covered by interface
1154 * that implies already done
1155 */
1156 return true;
1157 }
1158 return false;
1159 }
1160
1161 /* Check whether interface matches given network
1162 * returns: 1, true. 0, false
1163 */
1164 static int ospf_network_match_iface(const struct connected *co,
1165 const struct prefix *net)
1166 {
1167 /* new approach: more elegant and conceptually clean */
1168 return prefix_match_network_statement(net, CONNECTED_PREFIX(co));
1169 }
1170
1171 static void ospf_update_interface_area(struct connected *co,
1172 struct ospf_area *area)
1173 {
1174 struct ospf_interface *oi = ospf_if_table_lookup(co->ifp, co->address);
1175
1176 /* nothing to be done case */
1177 if (oi && oi->area == area) {
1178 return;
1179 }
1180
1181 if (oi)
1182 ospf_if_free(oi);
1183
1184 add_ospf_interface(co, area);
1185 }
1186
1187 /* Run OSPF for the given subnet, taking into account the following
1188 * possible sources of area configuration, in the given order of preference:
1189 *
1190 * - Whether there is interface+address specific area configuration
1191 * - Whether there is a default area for the interface
1192 * - Whether there is an area given as a parameter.
1193 * - If no specific network prefix/area is supplied, whether there's
1194 * a matching network configured.
1195 */
1196 static void ospf_network_run_subnet(struct ospf *ospf, struct connected *co,
1197 struct prefix *p,
1198 struct ospf_area *given_area)
1199 {
1200 struct ospf_interface *oi;
1201 struct ospf_if_params *params;
1202 struct ospf_area *area = NULL;
1203 struct route_node *rn;
1204 int configed = 0;
1205
1206 if (CHECK_FLAG(co->flags, ZEBRA_IFA_SECONDARY))
1207 return;
1208
1209 if (co->address->family != AF_INET)
1210 return;
1211
1212 /* Try determine the appropriate area for this interface + address
1213 * Start by checking interface config
1214 */
1215 params = ospf_lookup_if_params(co->ifp, co->address->u.prefix4);
1216 if (params && OSPF_IF_PARAM_CONFIGURED(params, if_area))
1217 area = ospf_area_get(ospf, params->if_area);
1218 else {
1219 params = IF_DEF_PARAMS(co->ifp);
1220 if (OSPF_IF_PARAM_CONFIGURED(params, if_area))
1221 area = ospf_area_get(ospf, params->if_area);
1222 }
1223
1224 /* If we've found an interface and/or addr specific area, then we're
1225 * done
1226 */
1227 if (area) {
1228 ospf_update_interface_area(co, area);
1229 return;
1230 }
1231
1232 /* Otherwise, only remaining possibility is a matching network statement
1233 */
1234 if (p) {
1235 assert(given_area != NULL);
1236
1237 /* Which either was supplied as a parameter.. (e.g. cause a new
1238 * network/area was just added)..
1239 */
1240 if (p->family == co->address->family
1241 && ospf_network_match_iface(co, p))
1242 ospf_update_interface_area(co, given_area);
1243
1244 return;
1245 }
1246
1247 /* Else we have to search the existing network/area config to see
1248 * if any match..
1249 */
1250 for (rn = route_top(ospf->networks); rn; rn = route_next(rn))
1251 if (rn->info != NULL && ospf_network_match_iface(co, &rn->p)) {
1252 struct ospf_network *network =
1253 (struct ospf_network *)rn->info;
1254 area = ospf_area_get(ospf, network->area_id);
1255 ospf_update_interface_area(co, area);
1256 configed = 1;
1257 }
1258
1259 /* If the subnet isn't in any area, deconfigure */
1260 if (!configed && (oi = ospf_if_table_lookup(co->ifp, co->address)))
1261 ospf_if_free(oi);
1262 }
1263
1264 static void ospf_network_run_interface(struct ospf *ospf, struct interface *ifp,
1265 struct prefix *p,
1266 struct ospf_area *given_area)
1267 {
1268 struct listnode *cnode;
1269 struct connected *co;
1270
1271 if (memcmp(ifp->name, "VLINK", 5) == 0)
1272 return;
1273
1274 /* Network prefix without area is nonsensical */
1275 if (p)
1276 assert(given_area != NULL);
1277
1278 /* if interface prefix is match specified prefix,
1279 then create socket and join multicast group. */
1280 for (ALL_LIST_ELEMENTS_RO(ifp->connected, cnode, co))
1281 ospf_network_run_subnet(ospf, co, p, given_area);
1282 }
1283
1284 static void ospf_network_run(struct prefix *p, struct ospf_area *area)
1285 {
1286 struct vrf *vrf = vrf_lookup_by_id(area->ospf->vrf_id);
1287 struct interface *ifp;
1288
1289 /* Schedule Router ID Update. */
1290 if (area->ospf->router_id.s_addr == 0)
1291 ospf_router_id_update(area->ospf);
1292
1293 /* Get target interface. */
1294 FOR_ALL_INTERFACES (vrf, ifp)
1295 ospf_network_run_interface(area->ospf, ifp, p, area);
1296 }
1297
1298 void ospf_ls_upd_queue_empty(struct ospf_interface *oi)
1299 {
1300 struct route_node *rn;
1301 struct listnode *node, *nnode;
1302 struct list *lst;
1303 struct ospf_lsa *lsa;
1304
1305 /* empty ls update queue */
1306 for (rn = route_top(oi->ls_upd_queue); rn; rn = route_next(rn))
1307 if ((lst = (struct list *)rn->info)) {
1308 for (ALL_LIST_ELEMENTS(lst, node, nnode, lsa))
1309 ospf_lsa_unlock(&lsa); /* oi->ls_upd_queue */
1310 list_delete(&lst);
1311 rn->info = NULL;
1312 }
1313
1314 /* remove update event */
1315 if (oi->t_ls_upd_event) {
1316 thread_cancel(oi->t_ls_upd_event);
1317 oi->t_ls_upd_event = NULL;
1318 }
1319 }
1320
1321 void ospf_if_update(struct ospf *ospf, struct interface *ifp)
1322 {
1323
1324 if (!ospf)
1325 return;
1326
1327 if (IS_DEBUG_OSPF_EVENT)
1328 zlog_debug(
1329 "%s: interface %s ifp->vrf_id %u ospf vrf %s vrf_id %u router_id %s",
1330 __PRETTY_FUNCTION__, ifp->name, ifp->vrf_id,
1331 ospf_vrf_id_to_name(ospf->vrf_id), ospf->vrf_id,
1332 inet_ntoa(ospf->router_id));
1333
1334 /* OSPF must be ready. */
1335 if (!ospf_is_ready(ospf))
1336 return;
1337
1338 ospf_network_run_interface(ospf, ifp, NULL, NULL);
1339
1340 /* Update connected redistribute. */
1341 update_redistributed(ospf, 1);
1342 }
1343
1344 void ospf_remove_vls_through_area(struct ospf *ospf, struct ospf_area *area)
1345 {
1346 struct listnode *node, *nnode;
1347 struct ospf_vl_data *vl_data;
1348
1349 for (ALL_LIST_ELEMENTS(ospf->vlinks, node, nnode, vl_data))
1350 if (IPV4_ADDR_SAME(&vl_data->vl_area_id, &area->area_id))
1351 ospf_vl_delete(ospf, vl_data);
1352 }
1353
1354
1355 static const struct message ospf_area_type_msg[] = {
1356 {OSPF_AREA_DEFAULT, "Default"},
1357 {OSPF_AREA_STUB, "Stub"},
1358 {OSPF_AREA_NSSA, "NSSA"},
1359 {0}};
1360
1361 static void ospf_area_type_set(struct ospf_area *area, int type)
1362 {
1363 struct listnode *node;
1364 struct ospf_interface *oi;
1365
1366 if (area->external_routing == type) {
1367 if (IS_DEBUG_OSPF_EVENT)
1368 zlog_debug("Area[%s]: Types are the same, ignored.",
1369 inet_ntoa(area->area_id));
1370 return;
1371 }
1372
1373 area->external_routing = type;
1374
1375 if (IS_DEBUG_OSPF_EVENT)
1376 zlog_debug("Area[%s]: Configured as %s",
1377 inet_ntoa(area->area_id),
1378 lookup_msg(ospf_area_type_msg, type, NULL));
1379
1380 switch (area->external_routing) {
1381 case OSPF_AREA_DEFAULT:
1382 for (ALL_LIST_ELEMENTS_RO(area->oiflist, node, oi))
1383 if (oi->nbr_self != NULL) {
1384 UNSET_FLAG(oi->nbr_self->options,
1385 OSPF_OPTION_NP);
1386 SET_FLAG(oi->nbr_self->options, OSPF_OPTION_E);
1387 }
1388 break;
1389 case OSPF_AREA_STUB:
1390 for (ALL_LIST_ELEMENTS_RO(area->oiflist, node, oi))
1391 if (oi->nbr_self != NULL) {
1392 if (IS_DEBUG_OSPF_EVENT)
1393 zlog_debug(
1394 "setting options on %s accordingly",
1395 IF_NAME(oi));
1396 UNSET_FLAG(oi->nbr_self->options,
1397 OSPF_OPTION_NP);
1398 UNSET_FLAG(oi->nbr_self->options,
1399 OSPF_OPTION_E);
1400 if (IS_DEBUG_OSPF_EVENT)
1401 zlog_debug("options set on %s: %x",
1402 IF_NAME(oi), OPTIONS(oi));
1403 }
1404 break;
1405 case OSPF_AREA_NSSA:
1406 for (ALL_LIST_ELEMENTS_RO(area->oiflist, node, oi))
1407 if (oi->nbr_self != NULL) {
1408 zlog_debug(
1409 "setting nssa options on %s accordingly",
1410 IF_NAME(oi));
1411 UNSET_FLAG(oi->nbr_self->options,
1412 OSPF_OPTION_E);
1413 SET_FLAG(oi->nbr_self->options, OSPF_OPTION_NP);
1414 zlog_debug("options set on %s: %x", IF_NAME(oi),
1415 OPTIONS(oi));
1416 }
1417 break;
1418 default:
1419 break;
1420 }
1421
1422 ospf_router_lsa_update_area(area);
1423 ospf_schedule_abr_task(area->ospf);
1424 }
1425
1426 int ospf_area_shortcut_set(struct ospf *ospf, struct ospf_area *area, int mode)
1427 {
1428 if (area->shortcut_configured == mode)
1429 return 0;
1430
1431 area->shortcut_configured = mode;
1432 ospf_router_lsa_update_area(area);
1433 ospf_schedule_abr_task(ospf);
1434
1435 ospf_area_check_free(ospf, area->area_id);
1436
1437 return 1;
1438 }
1439
1440 int ospf_area_shortcut_unset(struct ospf *ospf, struct ospf_area *area)
1441 {
1442 area->shortcut_configured = OSPF_SHORTCUT_DEFAULT;
1443 ospf_router_lsa_update_area(area);
1444 ospf_area_check_free(ospf, area->area_id);
1445 ospf_schedule_abr_task(ospf);
1446
1447 return 1;
1448 }
1449
1450 static int ospf_area_vlink_count(struct ospf *ospf, struct ospf_area *area)
1451 {
1452 struct ospf_vl_data *vl;
1453 struct listnode *node;
1454 int count = 0;
1455
1456 for (ALL_LIST_ELEMENTS_RO(ospf->vlinks, node, vl))
1457 if (IPV4_ADDR_SAME(&vl->vl_area_id, &area->area_id))
1458 count++;
1459
1460 return count;
1461 }
1462
1463 int ospf_area_display_format_set(struct ospf *ospf, struct ospf_area *area,
1464 int df)
1465 {
1466 area->area_id_fmt = df;
1467
1468 return 1;
1469 }
1470
1471 int ospf_area_stub_set(struct ospf *ospf, struct in_addr area_id)
1472 {
1473 struct ospf_area *area;
1474
1475 area = ospf_area_get(ospf, area_id);
1476 if (ospf_area_vlink_count(ospf, area))
1477 return 0;
1478
1479 if (area->external_routing != OSPF_AREA_STUB)
1480 ospf_area_type_set(area, OSPF_AREA_STUB);
1481
1482 return 1;
1483 }
1484
1485 int ospf_area_stub_unset(struct ospf *ospf, struct in_addr area_id)
1486 {
1487 struct ospf_area *area;
1488
1489 area = ospf_area_lookup_by_area_id(ospf, area_id);
1490 if (area == NULL)
1491 return 1;
1492
1493 if (area->external_routing == OSPF_AREA_STUB)
1494 ospf_area_type_set(area, OSPF_AREA_DEFAULT);
1495
1496 ospf_area_check_free(ospf, area_id);
1497
1498 return 1;
1499 }
1500
1501 int ospf_area_no_summary_set(struct ospf *ospf, struct in_addr area_id)
1502 {
1503 struct ospf_area *area;
1504
1505 area = ospf_area_get(ospf, area_id);
1506 area->no_summary = 1;
1507
1508 return 1;
1509 }
1510
1511 int ospf_area_no_summary_unset(struct ospf *ospf, struct in_addr area_id)
1512 {
1513 struct ospf_area *area;
1514
1515 area = ospf_area_lookup_by_area_id(ospf, area_id);
1516 if (area == NULL)
1517 return 0;
1518
1519 area->no_summary = 0;
1520 ospf_area_check_free(ospf, area_id);
1521
1522 return 1;
1523 }
1524
1525 int ospf_area_nssa_no_summary_set(struct ospf *ospf, struct in_addr area_id)
1526 {
1527 struct ospf_area *area;
1528
1529 area = ospf_area_get(ospf, area_id);
1530 if (ospf_area_vlink_count(ospf, area))
1531 return 0;
1532
1533 if (area->external_routing != OSPF_AREA_NSSA) {
1534 ospf_area_type_set(area, OSPF_AREA_NSSA);
1535 ospf->anyNSSA++;
1536 area->NSSATranslatorRole = OSPF_NSSA_ROLE_CANDIDATE;
1537 }
1538
1539 ospf_area_no_summary_set(ospf, area_id);
1540
1541 return 1;
1542 }
1543
1544 int ospf_area_nssa_set(struct ospf *ospf, struct in_addr area_id)
1545 {
1546 struct ospf_area *area;
1547
1548 area = ospf_area_get(ospf, area_id);
1549 if (ospf_area_vlink_count(ospf, area))
1550 return 0;
1551
1552 if (area->external_routing != OSPF_AREA_NSSA) {
1553 ospf_area_type_set(area, OSPF_AREA_NSSA);
1554 ospf->anyNSSA++;
1555
1556 /* set NSSA area defaults */
1557 area->no_summary = 0;
1558 area->NSSATranslatorRole = OSPF_NSSA_ROLE_CANDIDATE;
1559 area->NSSATranslatorState = OSPF_NSSA_TRANSLATE_DISABLED;
1560 area->NSSATranslatorStabilityInterval =
1561 OSPF_NSSA_TRANS_STABLE_DEFAULT;
1562 }
1563 return 1;
1564 }
1565
1566 int ospf_area_nssa_unset(struct ospf *ospf, struct in_addr area_id, int argc)
1567 {
1568 struct ospf_area *area;
1569
1570 area = ospf_area_lookup_by_area_id(ospf, area_id);
1571 if (area == NULL)
1572 return 0;
1573
1574 /* argc < 5 -> 'no area x nssa' */
1575 if (argc < 5 && area->external_routing == OSPF_AREA_NSSA) {
1576 ospf->anyNSSA--;
1577 /* set NSSA area defaults */
1578 area->no_summary = 0;
1579 area->NSSATranslatorRole = OSPF_NSSA_ROLE_CANDIDATE;
1580 area->NSSATranslatorState = OSPF_NSSA_TRANSLATE_DISABLED;
1581 area->NSSATranslatorStabilityInterval =
1582 OSPF_NSSA_TRANS_STABLE_DEFAULT;
1583 ospf_area_type_set(area, OSPF_AREA_DEFAULT);
1584 } else {
1585 area->NSSATranslatorRole = OSPF_NSSA_ROLE_CANDIDATE;
1586 }
1587
1588 ospf_area_check_free(ospf, area_id);
1589
1590 return 1;
1591 }
1592
1593 int ospf_area_nssa_translator_role_set(struct ospf *ospf,
1594 struct in_addr area_id, int role)
1595 {
1596 struct ospf_area *area;
1597
1598 area = ospf_area_lookup_by_area_id(ospf, area_id);
1599 if (area == NULL)
1600 return 0;
1601
1602 area->NSSATranslatorRole = role;
1603
1604 return 1;
1605 }
1606
1607 #if 0
1608 /* XXX: unused? Leave for symmetry? */
1609 static int
1610 ospf_area_nssa_translator_role_unset (struct ospf *ospf,
1611 struct in_addr area_id)
1612 {
1613 struct ospf_area *area;
1614
1615 area = ospf_area_lookup_by_area_id (ospf, area_id);
1616 if (area == NULL)
1617 return 0;
1618
1619 area->NSSATranslatorRole = OSPF_NSSA_ROLE_CANDIDATE;
1620
1621 ospf_area_check_free (ospf, area_id);
1622
1623 return 1;
1624 }
1625 #endif
1626
1627 int ospf_area_export_list_set(struct ospf *ospf, struct ospf_area *area,
1628 const char *list_name)
1629 {
1630 struct access_list *list;
1631 list = access_list_lookup(AFI_IP, list_name);
1632
1633 EXPORT_LIST(area) = list;
1634
1635 if (EXPORT_NAME(area))
1636 free(EXPORT_NAME(area));
1637
1638 EXPORT_NAME(area) = strdup(list_name);
1639 ospf_schedule_abr_task(ospf);
1640
1641 return 1;
1642 }
1643
1644 int ospf_area_export_list_unset(struct ospf *ospf, struct ospf_area *area)
1645 {
1646
1647 EXPORT_LIST(area) = 0;
1648
1649 if (EXPORT_NAME(area))
1650 free(EXPORT_NAME(area));
1651
1652 EXPORT_NAME(area) = NULL;
1653
1654 ospf_area_check_free(ospf, area->area_id);
1655
1656 ospf_schedule_abr_task(ospf);
1657
1658 return 1;
1659 }
1660
1661 int ospf_area_import_list_set(struct ospf *ospf, struct ospf_area *area,
1662 const char *name)
1663 {
1664 struct access_list *list;
1665 list = access_list_lookup(AFI_IP, name);
1666
1667 IMPORT_LIST(area) = list;
1668
1669 if (IMPORT_NAME(area))
1670 free(IMPORT_NAME(area));
1671
1672 IMPORT_NAME(area) = strdup(name);
1673 ospf_schedule_abr_task(ospf);
1674
1675 return 1;
1676 }
1677
1678 int ospf_area_import_list_unset(struct ospf *ospf, struct ospf_area *area)
1679 {
1680 IMPORT_LIST(area) = 0;
1681
1682 if (IMPORT_NAME(area))
1683 free(IMPORT_NAME(area));
1684
1685 IMPORT_NAME(area) = NULL;
1686 ospf_area_check_free(ospf, area->area_id);
1687
1688 ospf_schedule_abr_task(ospf);
1689
1690 return 1;
1691 }
1692
1693 int ospf_timers_refresh_set(struct ospf *ospf, int interval)
1694 {
1695 int time_left;
1696
1697 if (ospf->lsa_refresh_interval == interval)
1698 return 1;
1699
1700 time_left = ospf->lsa_refresh_interval
1701 - (monotime(NULL) - ospf->lsa_refresher_started);
1702
1703 if (time_left > interval) {
1704 OSPF_TIMER_OFF(ospf->t_lsa_refresher);
1705 thread_add_timer(master, ospf_lsa_refresh_walker, ospf,
1706 interval, &ospf->t_lsa_refresher);
1707 }
1708 ospf->lsa_refresh_interval = interval;
1709
1710 return 1;
1711 }
1712
1713 int ospf_timers_refresh_unset(struct ospf *ospf)
1714 {
1715 int time_left;
1716
1717 time_left = ospf->lsa_refresh_interval
1718 - (monotime(NULL) - ospf->lsa_refresher_started);
1719
1720 if (time_left > OSPF_LSA_REFRESH_INTERVAL_DEFAULT) {
1721 OSPF_TIMER_OFF(ospf->t_lsa_refresher);
1722 ospf->t_lsa_refresher = NULL;
1723 thread_add_timer(master, ospf_lsa_refresh_walker, ospf,
1724 OSPF_LSA_REFRESH_INTERVAL_DEFAULT,
1725 &ospf->t_lsa_refresher);
1726 }
1727
1728 ospf->lsa_refresh_interval = OSPF_LSA_REFRESH_INTERVAL_DEFAULT;
1729
1730 return 1;
1731 }
1732
1733
1734 static struct ospf_nbr_nbma *ospf_nbr_nbma_new(void)
1735 {
1736 struct ospf_nbr_nbma *nbr_nbma;
1737
1738 nbr_nbma = XCALLOC(MTYPE_OSPF_NEIGHBOR_STATIC,
1739 sizeof(struct ospf_nbr_nbma));
1740
1741 nbr_nbma->priority = OSPF_NEIGHBOR_PRIORITY_DEFAULT;
1742 nbr_nbma->v_poll = OSPF_POLL_INTERVAL_DEFAULT;
1743
1744 return nbr_nbma;
1745 }
1746
1747 static void ospf_nbr_nbma_free(struct ospf_nbr_nbma *nbr_nbma)
1748 {
1749 XFREE(MTYPE_OSPF_NEIGHBOR_STATIC, nbr_nbma);
1750 }
1751
1752 static void ospf_nbr_nbma_delete(struct ospf *ospf,
1753 struct ospf_nbr_nbma *nbr_nbma)
1754 {
1755 struct route_node *rn;
1756 struct prefix_ipv4 p;
1757
1758 p.family = AF_INET;
1759 p.prefix = nbr_nbma->addr;
1760 p.prefixlen = IPV4_MAX_BITLEN;
1761
1762 rn = route_node_lookup(ospf->nbr_nbma, (struct prefix *)&p);
1763 if (rn) {
1764 ospf_nbr_nbma_free(rn->info);
1765 rn->info = NULL;
1766 route_unlock_node(rn);
1767 route_unlock_node(rn);
1768 }
1769 }
1770
1771 static void ospf_nbr_nbma_down(struct ospf_nbr_nbma *nbr_nbma)
1772 {
1773 OSPF_TIMER_OFF(nbr_nbma->t_poll);
1774
1775 if (nbr_nbma->nbr) {
1776 nbr_nbma->nbr->nbr_nbma = NULL;
1777 OSPF_NSM_EVENT_EXECUTE(nbr_nbma->nbr, NSM_KillNbr);
1778 }
1779
1780 if (nbr_nbma->oi)
1781 listnode_delete(nbr_nbma->oi->nbr_nbma, nbr_nbma);
1782 }
1783
1784 static void ospf_nbr_nbma_add(struct ospf_nbr_nbma *nbr_nbma,
1785 struct ospf_interface *oi)
1786 {
1787 struct ospf_neighbor *nbr;
1788 struct route_node *rn;
1789 struct prefix p;
1790
1791 if (oi->type != OSPF_IFTYPE_NBMA)
1792 return;
1793
1794 if (nbr_nbma->nbr != NULL)
1795 return;
1796
1797 if (IPV4_ADDR_SAME(&oi->nbr_self->address.u.prefix4, &nbr_nbma->addr))
1798 return;
1799
1800 nbr_nbma->oi = oi;
1801 listnode_add(oi->nbr_nbma, nbr_nbma);
1802
1803 /* Get neighbor information from table. */
1804 p.family = AF_INET;
1805 p.prefixlen = IPV4_MAX_BITLEN;
1806 p.u.prefix4 = nbr_nbma->addr;
1807
1808 rn = route_node_get(oi->nbrs, (struct prefix *)&p);
1809 if (rn->info) {
1810 nbr = rn->info;
1811 nbr->nbr_nbma = nbr_nbma;
1812 nbr_nbma->nbr = nbr;
1813
1814 route_unlock_node(rn);
1815 } else {
1816 nbr = rn->info = ospf_nbr_new(oi);
1817 nbr->state = NSM_Down;
1818 nbr->src = nbr_nbma->addr;
1819 nbr->nbr_nbma = nbr_nbma;
1820 nbr->priority = nbr_nbma->priority;
1821 nbr->address = p;
1822
1823 nbr_nbma->nbr = nbr;
1824
1825 OSPF_NSM_EVENT_EXECUTE(nbr, NSM_Start);
1826 }
1827 }
1828
1829 void ospf_nbr_nbma_if_update(struct ospf *ospf, struct ospf_interface *oi)
1830 {
1831 struct ospf_nbr_nbma *nbr_nbma;
1832 struct route_node *rn;
1833 struct prefix_ipv4 p;
1834
1835 if (oi->type != OSPF_IFTYPE_NBMA)
1836 return;
1837
1838 for (rn = route_top(ospf->nbr_nbma); rn; rn = route_next(rn))
1839 if ((nbr_nbma = rn->info))
1840 if (nbr_nbma->oi == NULL && nbr_nbma->nbr == NULL) {
1841 p.family = AF_INET;
1842 p.prefix = nbr_nbma->addr;
1843 p.prefixlen = IPV4_MAX_BITLEN;
1844
1845 if (prefix_match(oi->address,
1846 (struct prefix *)&p))
1847 ospf_nbr_nbma_add(nbr_nbma, oi);
1848 }
1849 }
1850
1851 struct ospf_nbr_nbma *ospf_nbr_nbma_lookup(struct ospf *ospf,
1852 struct in_addr nbr_addr)
1853 {
1854 struct route_node *rn;
1855 struct prefix_ipv4 p;
1856
1857 p.family = AF_INET;
1858 p.prefix = nbr_addr;
1859 p.prefixlen = IPV4_MAX_BITLEN;
1860
1861 rn = route_node_lookup(ospf->nbr_nbma, (struct prefix *)&p);
1862 if (rn) {
1863 route_unlock_node(rn);
1864 return rn->info;
1865 }
1866 return NULL;
1867 }
1868
1869 struct ospf_nbr_nbma *ospf_nbr_nbma_lookup_next(struct ospf *ospf,
1870 struct in_addr *addr, int first)
1871 {
1872 #if 0
1873 struct ospf_nbr_nbma *nbr_nbma;
1874 struct listnode *node;
1875 #endif
1876
1877 if (ospf == NULL)
1878 return NULL;
1879
1880 #if 0
1881 for (ALL_LIST_ELEMENTS_RO (ospf->nbr_nbma, node, nbr_nbma))
1882 {
1883 if (first)
1884 {
1885 *addr = nbr_nbma->addr;
1886 return nbr_nbma;
1887 }
1888 else if (ntohl (nbr_nbma->addr.s_addr) > ntohl (addr->s_addr))
1889 {
1890 *addr = nbr_nbma->addr;
1891 return nbr_nbma;
1892 }
1893 }
1894 #endif
1895 return NULL;
1896 }
1897
1898 int ospf_nbr_nbma_set(struct ospf *ospf, struct in_addr nbr_addr)
1899 {
1900 struct ospf_nbr_nbma *nbr_nbma;
1901 struct ospf_interface *oi;
1902 struct prefix_ipv4 p;
1903 struct route_node *rn;
1904 struct listnode *node;
1905
1906 nbr_nbma = ospf_nbr_nbma_lookup(ospf, nbr_addr);
1907 if (nbr_nbma)
1908 return 0;
1909
1910 nbr_nbma = ospf_nbr_nbma_new();
1911 nbr_nbma->addr = nbr_addr;
1912
1913 p.family = AF_INET;
1914 p.prefix = nbr_addr;
1915 p.prefixlen = IPV4_MAX_BITLEN;
1916
1917 rn = route_node_get(ospf->nbr_nbma, (struct prefix *)&p);
1918 if (rn->info)
1919 route_unlock_node(rn);
1920 rn->info = nbr_nbma;
1921
1922 for (ALL_LIST_ELEMENTS_RO(ospf->oiflist, node, oi)) {
1923 if (oi->type == OSPF_IFTYPE_NBMA)
1924 if (prefix_match(oi->address, (struct prefix *)&p)) {
1925 ospf_nbr_nbma_add(nbr_nbma, oi);
1926 break;
1927 }
1928 }
1929
1930 return 1;
1931 }
1932
1933 int ospf_nbr_nbma_unset(struct ospf *ospf, struct in_addr nbr_addr)
1934 {
1935 struct ospf_nbr_nbma *nbr_nbma;
1936
1937 nbr_nbma = ospf_nbr_nbma_lookup(ospf, nbr_addr);
1938 if (nbr_nbma == NULL)
1939 return 0;
1940
1941 ospf_nbr_nbma_down(nbr_nbma);
1942 ospf_nbr_nbma_delete(ospf, nbr_nbma);
1943
1944 return 1;
1945 }
1946
1947 int ospf_nbr_nbma_priority_set(struct ospf *ospf, struct in_addr nbr_addr,
1948 uint8_t priority)
1949 {
1950 struct ospf_nbr_nbma *nbr_nbma;
1951
1952 nbr_nbma = ospf_nbr_nbma_lookup(ospf, nbr_addr);
1953 if (nbr_nbma == NULL)
1954 return 0;
1955
1956 if (nbr_nbma->priority != priority)
1957 nbr_nbma->priority = priority;
1958
1959 return 1;
1960 }
1961
1962 int ospf_nbr_nbma_priority_unset(struct ospf *ospf, struct in_addr nbr_addr)
1963 {
1964 struct ospf_nbr_nbma *nbr_nbma;
1965
1966 nbr_nbma = ospf_nbr_nbma_lookup(ospf, nbr_addr);
1967 if (nbr_nbma == NULL)
1968 return 0;
1969
1970 if (nbr_nbma != OSPF_NEIGHBOR_PRIORITY_DEFAULT)
1971 nbr_nbma->priority = OSPF_NEIGHBOR_PRIORITY_DEFAULT;
1972
1973 return 1;
1974 }
1975
1976 int ospf_nbr_nbma_poll_interval_set(struct ospf *ospf, struct in_addr nbr_addr,
1977 unsigned int interval)
1978 {
1979 struct ospf_nbr_nbma *nbr_nbma;
1980
1981 nbr_nbma = ospf_nbr_nbma_lookup(ospf, nbr_addr);
1982 if (nbr_nbma == NULL)
1983 return 0;
1984
1985 if (nbr_nbma->v_poll != interval) {
1986 nbr_nbma->v_poll = interval;
1987 if (nbr_nbma->oi && ospf_if_is_up(nbr_nbma->oi)) {
1988 OSPF_TIMER_OFF(nbr_nbma->t_poll);
1989 OSPF_POLL_TIMER_ON(nbr_nbma->t_poll, ospf_poll_timer,
1990 nbr_nbma->v_poll);
1991 }
1992 }
1993
1994 return 1;
1995 }
1996
1997 int ospf_nbr_nbma_poll_interval_unset(struct ospf *ospf, struct in_addr addr)
1998 {
1999 struct ospf_nbr_nbma *nbr_nbma;
2000
2001 nbr_nbma = ospf_nbr_nbma_lookup(ospf, addr);
2002 if (nbr_nbma == NULL)
2003 return 0;
2004
2005 if (nbr_nbma->v_poll != OSPF_POLL_INTERVAL_DEFAULT)
2006 nbr_nbma->v_poll = OSPF_POLL_INTERVAL_DEFAULT;
2007
2008 return 1;
2009 }
2010
2011 void ospf_master_init(struct thread_master *master)
2012 {
2013 memset(&ospf_master, 0, sizeof(struct ospf_master));
2014
2015 om = &ospf_master;
2016 om->ospf = list_new();
2017 om->master = master;
2018 }
2019
2020 /* Link OSPF instance to VRF. */
2021 void ospf_vrf_link(struct ospf *ospf, struct vrf *vrf)
2022 {
2023 ospf->vrf_id = vrf->vrf_id;
2024 if (vrf->info != (void *)ospf)
2025 vrf->info = (void *)ospf;
2026 }
2027
2028 /* Unlink OSPF instance from VRF. */
2029 void ospf_vrf_unlink(struct ospf *ospf, struct vrf *vrf)
2030 {
2031 if (vrf->info == (void *)ospf)
2032 vrf->info = NULL;
2033 ospf->vrf_id = VRF_UNKNOWN;
2034 }
2035
2036 /* This is hook function for vrf create called as part of vrf_init */
2037 static int ospf_vrf_new(struct vrf *vrf)
2038 {
2039 if (IS_DEBUG_OSPF_EVENT)
2040 zlog_debug("%s: VRF Created: %s(%u)", __PRETTY_FUNCTION__,
2041 vrf->name, vrf->vrf_id);
2042
2043 return 0;
2044 }
2045
2046 /* This is hook function for vrf delete call as part of vrf_init */
2047 static int ospf_vrf_delete(struct vrf *vrf)
2048 {
2049 if (IS_DEBUG_OSPF_EVENT)
2050 zlog_debug("%s: VRF Deletion: %s(%u)", __PRETTY_FUNCTION__,
2051 vrf->name, vrf->vrf_id);
2052
2053 return 0;
2054 }
2055
2056 static void ospf_set_redist_vrf_bitmaps(struct ospf *ospf)
2057 {
2058 int type;
2059 struct list *red_list;
2060
2061 for (type = 0; type < ZEBRA_ROUTE_MAX; type++) {
2062 red_list = ospf->redist[type];
2063 if (!red_list)
2064 continue;
2065 if (IS_DEBUG_OSPF_EVENT)
2066 zlog_debug(
2067 "%s: setting redist vrf %d bitmap for type %d",
2068 __func__, ospf->vrf_id, type);
2069 vrf_bitmap_set(zclient->redist[AFI_IP][type], ospf->vrf_id);
2070 }
2071 }
2072
2073 /* Enable OSPF VRF instance */
2074 static int ospf_vrf_enable(struct vrf *vrf)
2075 {
2076 struct ospf *ospf = NULL;
2077 vrf_id_t old_vrf_id;
2078 int ret = 0;
2079
2080 if (IS_DEBUG_OSPF_EVENT)
2081 zlog_debug("%s: VRF %s id %u enabled", __PRETTY_FUNCTION__,
2082 vrf->name, vrf->vrf_id);
2083
2084 ospf = ospf_lookup_by_name(vrf->name);
2085 if (ospf) {
2086 if (ospf->name && strmatch(vrf->name, VRF_DEFAULT_NAME)) {
2087 XFREE(MTYPE_OSPF_TOP, ospf->name);
2088 ospf->name = NULL;
2089 }
2090 old_vrf_id = ospf->vrf_id;
2091 /* We have instance configured, link to VRF and make it "up". */
2092 ospf_vrf_link(ospf, vrf);
2093 if (IS_DEBUG_OSPF_EVENT)
2094 zlog_debug(
2095 "%s: ospf linked to vrf %s vrf_id %u (old id %u)",
2096 __PRETTY_FUNCTION__, vrf->name, ospf->vrf_id,
2097 old_vrf_id);
2098
2099 if (old_vrf_id != ospf->vrf_id) {
2100 frr_with_privs(&ospfd_privs) {
2101 /* stop zebra redist to us for old vrf */
2102 zclient_send_dereg_requests(zclient,
2103 old_vrf_id);
2104
2105 ospf_set_redist_vrf_bitmaps(ospf);
2106
2107 /* start zebra redist to us for new vrf */
2108 ospf_zebra_vrf_register(ospf);
2109
2110 ret = ospf_sock_init(ospf);
2111 }
2112 if (ret < 0 || ospf->fd <= 0)
2113 return 0;
2114 thread_add_read(master, ospf_read, ospf, ospf->fd,
2115 &ospf->t_read);
2116 ospf->oi_running = 1;
2117 ospf_router_id_update(ospf);
2118 }
2119 }
2120
2121 return 0;
2122 }
2123
2124 /* Disable OSPF VRF instance */
2125 static int ospf_vrf_disable(struct vrf *vrf)
2126 {
2127 struct ospf *ospf = NULL;
2128 vrf_id_t old_vrf_id = VRF_UNKNOWN;
2129
2130 if (vrf->vrf_id == VRF_DEFAULT)
2131 return 0;
2132
2133 if (IS_DEBUG_OSPF_EVENT)
2134 zlog_debug("%s: VRF %s id %d disabled.", __PRETTY_FUNCTION__,
2135 vrf->name, vrf->vrf_id);
2136
2137 ospf = ospf_lookup_by_name(vrf->name);
2138 if (ospf) {
2139 old_vrf_id = ospf->vrf_id;
2140
2141 /* We have instance configured, unlink
2142 * from VRF and make it "down".
2143 */
2144 ospf_vrf_unlink(ospf, vrf);
2145 ospf->oi_running = 0;
2146 if (IS_DEBUG_OSPF_EVENT)
2147 zlog_debug("%s: ospf old_vrf_id %d unlinked",
2148 __PRETTY_FUNCTION__, old_vrf_id);
2149 thread_cancel(ospf->t_read);
2150 close(ospf->fd);
2151 ospf->fd = -1;
2152 }
2153
2154 /* Note: This is a callback, the VRF will be deleted by the caller. */
2155 return 0;
2156 }
2157
2158 void ospf_vrf_init(void)
2159 {
2160 vrf_init(ospf_vrf_new, ospf_vrf_enable, ospf_vrf_disable,
2161 ospf_vrf_delete, ospf_vrf_enable);
2162 }
2163
2164 void ospf_vrf_terminate(void)
2165 {
2166 vrf_terminate();
2167 }
2168
2169 const char *ospf_vrf_id_to_name(vrf_id_t vrf_id)
2170 {
2171 struct vrf *vrf = vrf_lookup_by_id(vrf_id);
2172
2173 return vrf ? vrf->name : "NIL";
2174 }