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