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