]> git.proxmox.com Git - mirror_frr.git/blob - ospfd/ospfd.c
Merge pull request #3202 from donaldsharp/evpn_dump
[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 doesn't
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 EC_LIB_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(&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(&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 if ((lsa = rn->info) != NULL) {
723 ospf_lsa_unlock(&lsa);
724 rn->info = NULL;
725 }
726 route_unlock_node(rn);
727 }
728 route_table_finish(ospf->maxage_lsa);
729
730 if (ospf->old_table)
731 ospf_route_table_free(ospf->old_table);
732 if (ospf->new_table) {
733 ospf_route_delete(ospf, ospf->new_table);
734 ospf_route_table_free(ospf->new_table);
735 }
736 if (ospf->old_rtrs)
737 ospf_rtrs_free(ospf->old_rtrs);
738 if (ospf->new_rtrs)
739 ospf_rtrs_free(ospf->new_rtrs);
740 if (ospf->new_external_route) {
741 ospf_route_delete(ospf, ospf->new_external_route);
742 ospf_route_table_free(ospf->new_external_route);
743 }
744 if (ospf->old_external_route) {
745 ospf_route_delete(ospf, ospf->old_external_route);
746 ospf_route_table_free(ospf->old_external_route);
747 }
748 if (ospf->external_lsas) {
749 ospf_ase_external_lsas_finish(ospf->external_lsas);
750 }
751
752 list_delete(&ospf->areas);
753 list_delete(&ospf->oi_write_q);
754
755 for (i = ZEBRA_ROUTE_SYSTEM; i <= ZEBRA_ROUTE_MAX; i++) {
756 struct list *ext_list;
757 struct ospf_external *ext;
758
759 ext_list = ospf->external[i];
760 if (!ext_list)
761 continue;
762
763 for (ALL_LIST_ELEMENTS_RO(ext_list, node, ext)) {
764 if (ext->external_info)
765 for (rn = route_top(ext->external_info); rn;
766 rn = route_next(rn)) {
767 if (rn->info == NULL)
768 continue;
769
770 XFREE(MTYPE_OSPF_EXTERNAL_INFO,
771 rn->info);
772 rn->info = NULL;
773 route_unlock_node(rn);
774 }
775 }
776 }
777
778 ospf_distance_reset(ospf);
779 route_table_finish(ospf->distance_table);
780
781 if (!CHECK_FLAG(om->options, OSPF_MASTER_SHUTDOWN))
782 instance = ospf->instance;
783
784 ospf_delete(ospf);
785
786 if (ospf->name) {
787 vrf = vrf_lookup_by_name(ospf->name);
788 if (vrf)
789 ospf_vrf_unlink(ospf, vrf);
790 XFREE(MTYPE_OSPF_TOP, ospf->name);
791 } else {
792 vrf = vrf_lookup_by_id(VRF_DEFAULT);
793 if (vrf)
794 ospf_vrf_unlink(ospf, vrf);
795 }
796
797 XFREE(MTYPE_OSPF_TOP, ospf);
798
799 if (!CHECK_FLAG(om->options, OSPF_MASTER_SHUTDOWN))
800 ospf_get_instance(instance);
801 }
802
803
804 /* allocate new OSPF Area object */
805 static struct ospf_area *ospf_area_new(struct ospf *ospf,
806 struct in_addr area_id)
807 {
808 struct ospf_area *new;
809
810 /* Allocate new config_network. */
811 new = XCALLOC(MTYPE_OSPF_AREA, sizeof(struct ospf_area));
812
813 new->ospf = ospf;
814
815 new->area_id = area_id;
816 new->area_id_fmt = OSPF_AREA_ID_FMT_DOTTEDQUAD;
817
818 new->external_routing = OSPF_AREA_DEFAULT;
819 new->default_cost = 1;
820 new->auth_type = OSPF_AUTH_NULL;
821
822 /* New LSDB init. */
823 new->lsdb = ospf_lsdb_new();
824
825 /* Self-originated LSAs initialize. */
826 new->router_lsa_self = NULL;
827
828 ospf_opaque_type10_lsa_init(new);
829
830 new->oiflist = list_new();
831 new->ranges = route_table_init();
832
833 if (area_id.s_addr == OSPF_AREA_BACKBONE)
834 ospf->backbone = new;
835
836 return new;
837 }
838
839 static void ospf_area_free(struct ospf_area *area)
840 {
841 struct route_node *rn;
842 struct ospf_lsa *lsa;
843
844 ospf_opaque_type10_lsa_term(area);
845
846 /* Free LSDBs. */
847 LSDB_LOOP (ROUTER_LSDB(area), rn, lsa)
848 ospf_discard_from_db(area->ospf, area->lsdb, lsa);
849 LSDB_LOOP (NETWORK_LSDB(area), rn, lsa)
850 ospf_discard_from_db(area->ospf, area->lsdb, lsa);
851 LSDB_LOOP (SUMMARY_LSDB(area), rn, lsa)
852 ospf_discard_from_db(area->ospf, area->lsdb, lsa);
853 LSDB_LOOP (ASBR_SUMMARY_LSDB(area), rn, lsa)
854 ospf_discard_from_db(area->ospf, area->lsdb, lsa);
855
856 LSDB_LOOP (NSSA_LSDB(area), rn, lsa)
857 ospf_discard_from_db(area->ospf, area->lsdb, lsa);
858 LSDB_LOOP (OPAQUE_AREA_LSDB(area), rn, lsa)
859 ospf_discard_from_db(area->ospf, area->lsdb, lsa);
860 LSDB_LOOP (OPAQUE_LINK_LSDB(area), rn, lsa)
861 ospf_discard_from_db(area->ospf, area->lsdb, lsa);
862
863 ospf_lsdb_delete_all(area->lsdb);
864 ospf_lsdb_free(area->lsdb);
865
866 ospf_lsa_unlock(&area->router_lsa_self);
867
868 route_table_finish(area->ranges);
869 list_delete(&area->oiflist);
870
871 if (EXPORT_NAME(area))
872 free(EXPORT_NAME(area));
873
874 if (IMPORT_NAME(area))
875 free(IMPORT_NAME(area));
876
877 /* Cancel timer. */
878 OSPF_TIMER_OFF(area->t_stub_router);
879 OSPF_TIMER_OFF(area->t_opaque_lsa_self);
880
881 if (OSPF_IS_AREA_BACKBONE(area))
882 area->ospf->backbone = NULL;
883
884 XFREE(MTYPE_OSPF_AREA, area);
885 }
886
887 void ospf_area_check_free(struct ospf *ospf, struct in_addr area_id)
888 {
889 struct ospf_area *area;
890
891 area = ospf_area_lookup_by_area_id(ospf, area_id);
892 if (area && listcount(area->oiflist) == 0 && area->ranges->top == NULL
893 && !ospf_vl_count(ospf, area)
894 && area->shortcut_configured == OSPF_SHORTCUT_DEFAULT
895 && area->external_routing == OSPF_AREA_DEFAULT
896 && area->no_summary == 0 && area->default_cost == 1
897 && EXPORT_NAME(area) == NULL && IMPORT_NAME(area) == NULL
898 && area->auth_type == OSPF_AUTH_NULL) {
899 listnode_delete(ospf->areas, area);
900 ospf_area_free(area);
901 }
902 }
903
904 struct ospf_area *ospf_area_get(struct ospf *ospf, struct in_addr area_id)
905 {
906 struct ospf_area *area;
907
908 area = ospf_area_lookup_by_area_id(ospf, area_id);
909 if (!area) {
910 area = ospf_area_new(ospf, area_id);
911 listnode_add_sort(ospf->areas, area);
912 ospf_check_abr_status(ospf);
913 if (ospf->stub_router_admin_set
914 == OSPF_STUB_ROUTER_ADMINISTRATIVE_SET) {
915 SET_FLAG(area->stub_router_state,
916 OSPF_AREA_ADMIN_STUB_ROUTED);
917 }
918 }
919
920 return area;
921 }
922
923 struct ospf_area *ospf_area_lookup_by_area_id(struct ospf *ospf,
924 struct in_addr area_id)
925 {
926 struct ospf_area *area;
927 struct listnode *node;
928
929 for (ALL_LIST_ELEMENTS_RO(ospf->areas, node, area))
930 if (IPV4_ADDR_SAME(&area->area_id, &area_id))
931 return area;
932
933 return NULL;
934 }
935
936 void ospf_area_add_if(struct ospf_area *area, struct ospf_interface *oi)
937 {
938 listnode_add(area->oiflist, oi);
939 }
940
941 void ospf_area_del_if(struct ospf_area *area, struct ospf_interface *oi)
942 {
943 listnode_delete(area->oiflist, oi);
944 }
945
946
947 static void add_ospf_interface(struct connected *co, struct ospf_area *area)
948 {
949 struct ospf_interface *oi;
950
951 oi = ospf_if_new(area->ospf, co->ifp, co->address);
952 oi->connected = co;
953
954 oi->area = area;
955
956 oi->params = ospf_lookup_if_params(co->ifp, oi->address->u.prefix4);
957 oi->output_cost = ospf_if_get_output_cost(oi);
958
959 /* Relate ospf interface to ospf instance. */
960 oi->ospf = area->ospf;
961
962 /* update network type as interface flag */
963 /* If network type is specified previously,
964 skip network type setting. */
965 oi->type = IF_DEF_PARAMS(co->ifp)->type;
966
967 /* Add pseudo neighbor. */
968 ospf_nbr_self_reset(oi, oi->ospf->router_id);
969
970 ospf_area_add_if(oi->area, oi);
971
972 /*
973 * if router_id is not configured, dont bring up
974 * interfaces.
975 * ospf_router_id_update() will call ospf_if_update
976 * whenever r-id is configured instead.
977 */
978 if ((area->ospf->router_id.s_addr != 0) && if_is_operative(co->ifp))
979 ospf_if_up(oi);
980 }
981
982 static void update_redistributed(struct ospf *ospf, int add_to_ospf)
983 {
984 struct route_node *rn;
985 struct external_info *ei;
986 struct ospf_external *ext;
987
988 if (ospf_is_type_redistributed(ospf, ZEBRA_ROUTE_CONNECT, 0)) {
989 ext = ospf_external_lookup(ospf, ZEBRA_ROUTE_CONNECT, 0);
990 if ((ext) && EXTERNAL_INFO(ext)) {
991 for (rn = route_top(EXTERNAL_INFO(ext)); rn;
992 rn = route_next(rn)) {
993 ei = rn->info;
994 if (ei == NULL)
995 continue;
996
997 if (add_to_ospf) {
998 if (ospf_external_info_find_lsa(ospf,
999 &ei->p))
1000 if (!ospf_distribute_check_connected(
1001 ospf, ei))
1002 ospf_external_lsa_flush(
1003 ospf, ei->type,
1004 &ei->p,
1005 ei->ifindex /*, ei->nexthop */);
1006 } else {
1007 if (!ospf_external_info_find_lsa(
1008 ospf, &ei->p))
1009 if (ospf_distribute_check_connected(
1010 ospf, ei))
1011 ospf_external_lsa_originate(
1012 ospf, ei);
1013 }
1014 }
1015 }
1016 }
1017 }
1018
1019 /* Config network statement related functions. */
1020 static struct ospf_network *ospf_network_new(struct in_addr area_id)
1021 {
1022 struct ospf_network *new;
1023 new = XCALLOC(MTYPE_OSPF_NETWORK, sizeof(struct ospf_network));
1024
1025 new->area_id = area_id;
1026 new->area_id_fmt = OSPF_AREA_ID_FMT_DOTTEDQUAD;
1027
1028 return new;
1029 }
1030
1031 static void ospf_network_free(struct ospf *ospf, struct ospf_network *network)
1032 {
1033 ospf_area_check_free(ospf, network->area_id);
1034 ospf_schedule_abr_task(ospf);
1035 XFREE(MTYPE_OSPF_NETWORK, network);
1036 }
1037
1038 int ospf_network_set(struct ospf *ospf, struct prefix_ipv4 *p,
1039 struct in_addr area_id, int df)
1040 {
1041 struct ospf_network *network;
1042 struct ospf_area *area;
1043 struct route_node *rn;
1044
1045 rn = route_node_get(ospf->networks, (struct prefix *)p);
1046 if (rn->info) {
1047 network = rn->info;
1048 route_unlock_node(rn);
1049
1050 if (IPV4_ADDR_SAME(&area_id, &network->area_id)) {
1051 return 1;
1052 } else {
1053 /* There is already same network statement. */
1054 return 0;
1055 }
1056 }
1057
1058 rn->info = network = ospf_network_new(area_id);
1059 network->area_id_fmt = df;
1060 area = ospf_area_get(ospf, area_id);
1061 ospf_area_display_format_set(ospf, area, df);
1062
1063 /* Run network config now. */
1064 ospf_network_run((struct prefix *)p, area);
1065
1066 /* Update connected redistribute. */
1067 update_redistributed(ospf, 1); /* interfaces possibly added */
1068
1069 ospf_area_check_free(ospf, area_id);
1070
1071 return 1;
1072 }
1073
1074 int ospf_network_unset(struct ospf *ospf, struct prefix_ipv4 *p,
1075 struct in_addr area_id)
1076 {
1077 struct route_node *rn;
1078 struct ospf_network *network;
1079 struct listnode *node, *nnode;
1080 struct ospf_interface *oi;
1081
1082 rn = route_node_lookup(ospf->networks, (struct prefix *)p);
1083 if (rn == NULL)
1084 return 0;
1085
1086 network = rn->info;
1087 route_unlock_node(rn);
1088 if (!IPV4_ADDR_SAME(&area_id, &network->area_id))
1089 return 0;
1090
1091 ospf_network_free(ospf, rn->info);
1092 rn->info = NULL;
1093 route_unlock_node(rn); /* initial reference */
1094
1095 /* Find interfaces that are not configured already. */
1096 for (ALL_LIST_ELEMENTS(ospf->oiflist, node, nnode, oi)) {
1097
1098 if (oi->type == OSPF_IFTYPE_VIRTUALLINK)
1099 continue;
1100
1101 ospf_network_run_subnet(ospf, oi->connected, NULL, NULL);
1102 }
1103
1104 /* Update connected redistribute. */
1105 update_redistributed(ospf, 0); /* interfaces possibly removed */
1106 ospf_area_check_free(ospf, area_id);
1107
1108 return 1;
1109 }
1110
1111 /* Ensure there's an OSPF instance, as "ip ospf area" enabled OSPF means
1112 * there might not be any 'router ospf' config.
1113 *
1114 * Otherwise, doesn't do anything different to ospf_if_update for now
1115 */
1116 void ospf_interface_area_set(struct ospf *ospf, struct interface *ifp)
1117 {
1118 if (!ospf)
1119 return;
1120
1121 ospf_if_update(ospf, ifp);
1122 /* if_update does a update_redistributed */
1123
1124 return;
1125 }
1126
1127 void ospf_interface_area_unset(struct ospf *ospf, struct interface *ifp)
1128 {
1129 struct route_node *rn_oi;
1130
1131 if (!ospf)
1132 return; /* Ospf not ready yet */
1133
1134 /* Find interfaces that may need to be removed. */
1135 for (rn_oi = route_top(IF_OIFS(ifp)); rn_oi;
1136 rn_oi = route_next(rn_oi)) {
1137 struct ospf_interface *oi = NULL;
1138
1139 if ((oi = rn_oi->info) == NULL)
1140 continue;
1141
1142 if (oi->type == OSPF_IFTYPE_VIRTUALLINK)
1143 continue;
1144
1145 ospf_network_run_subnet(ospf, oi->connected, NULL, NULL);
1146 }
1147
1148 /* Update connected redistribute. */
1149 update_redistributed(ospf, 0); /* interfaces possibly removed */
1150 }
1151
1152 /* Check whether interface matches given network
1153 * returns: 1, true. 0, false
1154 */
1155 static int ospf_network_match_iface(const struct connected *co,
1156 const struct prefix *net)
1157 {
1158 /* new approach: more elegant and conceptually clean */
1159 return prefix_match_network_statement(net, CONNECTED_PREFIX(co));
1160 }
1161
1162 static void ospf_update_interface_area(struct connected *co,
1163 struct ospf_area *area)
1164 {
1165 struct ospf_interface *oi = ospf_if_table_lookup(co->ifp, co->address);
1166
1167 /* nothing to be done case */
1168 if (oi && oi->area == area) {
1169 return;
1170 }
1171
1172 if (oi)
1173 ospf_if_free(oi);
1174
1175 add_ospf_interface(co, area);
1176 }
1177
1178 /* Run OSPF for the given subnet, taking into account the following
1179 * possible sources of area configuration, in the given order of preference:
1180 *
1181 * - Whether there is interface+address specific area configuration
1182 * - Whether there is a default area for the interface
1183 * - Whether there is an area given as a parameter.
1184 * - If no specific network prefix/area is supplied, whether there's
1185 * a matching network configured.
1186 */
1187 static void ospf_network_run_subnet(struct ospf *ospf, struct connected *co,
1188 struct prefix *p,
1189 struct ospf_area *given_area)
1190 {
1191 struct ospf_interface *oi;
1192 struct ospf_if_params *params;
1193 struct ospf_area *area = NULL;
1194 struct route_node *rn;
1195 int configed = 0;
1196
1197 if (CHECK_FLAG(co->flags, ZEBRA_IFA_SECONDARY))
1198 return;
1199
1200 if (co->address->family != AF_INET)
1201 return;
1202
1203 /* Try determine the appropriate area for this interface + address
1204 * Start by checking interface config
1205 */
1206 params = ospf_lookup_if_params(co->ifp, co->address->u.prefix4);
1207 if (params && OSPF_IF_PARAM_CONFIGURED(params, if_area))
1208 area = ospf_area_get(ospf, params->if_area);
1209 else {
1210 params = IF_DEF_PARAMS(co->ifp);
1211 if (OSPF_IF_PARAM_CONFIGURED(params, if_area))
1212 area = ospf_area_get(ospf, params->if_area);
1213 }
1214
1215 /* If we've found an interface and/or addr specific area, then we're
1216 * done
1217 */
1218 if (area) {
1219 ospf_update_interface_area(co, area);
1220 return;
1221 }
1222
1223 /* Otherwise, only remaining possibility is a matching network statement
1224 */
1225 if (p) {
1226 assert(given_area != NULL);
1227
1228 /* Which either was supplied as a parameter.. (e.g. cause a new
1229 * network/area was just added)..
1230 */
1231 if (p->family == co->address->family
1232 && ospf_network_match_iface(co, p))
1233 ospf_update_interface_area(co, given_area);
1234
1235 return;
1236 }
1237
1238 /* Else we have to search the existing network/area config to see
1239 * if any match..
1240 */
1241 for (rn = route_top(ospf->networks); rn; rn = route_next(rn))
1242 if (rn->info != NULL && ospf_network_match_iface(co, &rn->p)) {
1243 struct ospf_network *network =
1244 (struct ospf_network *)rn->info;
1245 area = ospf_area_get(ospf, network->area_id);
1246 ospf_update_interface_area(co, area);
1247 configed = 1;
1248 }
1249
1250 /* If the subnet isn't in any area, deconfigure */
1251 if (!configed && (oi = ospf_if_table_lookup(co->ifp, co->address)))
1252 ospf_if_free(oi);
1253 }
1254
1255 static void ospf_network_run_interface(struct ospf *ospf, struct interface *ifp,
1256 struct prefix *p,
1257 struct ospf_area *given_area)
1258 {
1259 struct listnode *cnode;
1260 struct connected *co;
1261
1262 if (memcmp(ifp->name, "VLINK", 5) == 0)
1263 return;
1264
1265 /* Network prefix without area is nonsensical */
1266 if (p)
1267 assert(given_area != NULL);
1268
1269 /* if interface prefix is match specified prefix,
1270 then create socket and join multicast group. */
1271 for (ALL_LIST_ELEMENTS_RO(ifp->connected, cnode, co))
1272 ospf_network_run_subnet(ospf, co, p, given_area);
1273 }
1274
1275 static void ospf_network_run(struct prefix *p, struct ospf_area *area)
1276 {
1277 struct vrf *vrf = vrf_lookup_by_id(area->ospf->vrf_id);
1278 struct interface *ifp;
1279
1280 /* Schedule Router ID Update. */
1281 if (area->ospf->router_id.s_addr == 0)
1282 ospf_router_id_update(area->ospf);
1283
1284 /* Get target interface. */
1285 FOR_ALL_INTERFACES (vrf, ifp)
1286 ospf_network_run_interface(area->ospf, ifp, p, area);
1287 }
1288
1289 void ospf_ls_upd_queue_empty(struct ospf_interface *oi)
1290 {
1291 struct route_node *rn;
1292 struct listnode *node, *nnode;
1293 struct list *lst;
1294 struct ospf_lsa *lsa;
1295
1296 /* empty ls update queue */
1297 for (rn = route_top(oi->ls_upd_queue); rn; rn = route_next(rn))
1298 if ((lst = (struct list *)rn->info)) {
1299 for (ALL_LIST_ELEMENTS(lst, node, nnode, lsa))
1300 ospf_lsa_unlock(&lsa); /* oi->ls_upd_queue */
1301 list_delete(&lst);
1302 rn->info = NULL;
1303 }
1304
1305 /* remove update event */
1306 if (oi->t_ls_upd_event) {
1307 thread_cancel(oi->t_ls_upd_event);
1308 oi->t_ls_upd_event = NULL;
1309 }
1310 }
1311
1312 void ospf_if_update(struct ospf *ospf, struct interface *ifp)
1313 {
1314
1315 if (!ospf)
1316 return;
1317
1318 if (IS_DEBUG_OSPF_EVENT)
1319 zlog_debug(
1320 "%s: interface %s ifp->vrf_id %u ospf vrf %s vrf_id %u router_id %s",
1321 __PRETTY_FUNCTION__, ifp->name, ifp->vrf_id,
1322 ospf_vrf_id_to_name(ospf->vrf_id), ospf->vrf_id,
1323 inet_ntoa(ospf->router_id));
1324
1325 /* OSPF must be ready. */
1326 if (!ospf_is_ready(ospf))
1327 return;
1328
1329 ospf_network_run_interface(ospf, ifp, NULL, NULL);
1330
1331 /* Update connected redistribute. */
1332 update_redistributed(ospf, 1);
1333 }
1334
1335 void ospf_remove_vls_through_area(struct ospf *ospf, struct ospf_area *area)
1336 {
1337 struct listnode *node, *nnode;
1338 struct ospf_vl_data *vl_data;
1339
1340 for (ALL_LIST_ELEMENTS(ospf->vlinks, node, nnode, vl_data))
1341 if (IPV4_ADDR_SAME(&vl_data->vl_area_id, &area->area_id))
1342 ospf_vl_delete(ospf, vl_data);
1343 }
1344
1345
1346 static const struct message ospf_area_type_msg[] = {
1347 {OSPF_AREA_DEFAULT, "Default"},
1348 {OSPF_AREA_STUB, "Stub"},
1349 {OSPF_AREA_NSSA, "NSSA"},
1350 {0}};
1351
1352 static void ospf_area_type_set(struct ospf_area *area, int type)
1353 {
1354 struct listnode *node;
1355 struct ospf_interface *oi;
1356
1357 if (area->external_routing == type) {
1358 if (IS_DEBUG_OSPF_EVENT)
1359 zlog_debug("Area[%s]: Types are the same, ignored.",
1360 inet_ntoa(area->area_id));
1361 return;
1362 }
1363
1364 area->external_routing = type;
1365
1366 if (IS_DEBUG_OSPF_EVENT)
1367 zlog_debug("Area[%s]: Configured as %s",
1368 inet_ntoa(area->area_id),
1369 lookup_msg(ospf_area_type_msg, type, NULL));
1370
1371 switch (area->external_routing) {
1372 case OSPF_AREA_DEFAULT:
1373 for (ALL_LIST_ELEMENTS_RO(area->oiflist, node, oi))
1374 if (oi->nbr_self != NULL) {
1375 UNSET_FLAG(oi->nbr_self->options,
1376 OSPF_OPTION_NP);
1377 SET_FLAG(oi->nbr_self->options, OSPF_OPTION_E);
1378 }
1379 break;
1380 case OSPF_AREA_STUB:
1381 for (ALL_LIST_ELEMENTS_RO(area->oiflist, node, oi))
1382 if (oi->nbr_self != NULL) {
1383 if (IS_DEBUG_OSPF_EVENT)
1384 zlog_debug(
1385 "setting options on %s accordingly",
1386 IF_NAME(oi));
1387 UNSET_FLAG(oi->nbr_self->options,
1388 OSPF_OPTION_NP);
1389 UNSET_FLAG(oi->nbr_self->options,
1390 OSPF_OPTION_E);
1391 if (IS_DEBUG_OSPF_EVENT)
1392 zlog_debug("options set on %s: %x",
1393 IF_NAME(oi), OPTIONS(oi));
1394 }
1395 break;
1396 case OSPF_AREA_NSSA:
1397 for (ALL_LIST_ELEMENTS_RO(area->oiflist, node, oi))
1398 if (oi->nbr_self != NULL) {
1399 zlog_debug(
1400 "setting nssa options on %s accordingly",
1401 IF_NAME(oi));
1402 UNSET_FLAG(oi->nbr_self->options,
1403 OSPF_OPTION_E);
1404 SET_FLAG(oi->nbr_self->options, OSPF_OPTION_NP);
1405 zlog_debug("options set on %s: %x", IF_NAME(oi),
1406 OPTIONS(oi));
1407 }
1408 break;
1409 default:
1410 break;
1411 }
1412
1413 ospf_router_lsa_update_area(area);
1414 ospf_schedule_abr_task(area->ospf);
1415 }
1416
1417 int ospf_area_shortcut_set(struct ospf *ospf, struct ospf_area *area, int mode)
1418 {
1419 if (area->shortcut_configured == mode)
1420 return 0;
1421
1422 area->shortcut_configured = mode;
1423 ospf_router_lsa_update_area(area);
1424 ospf_schedule_abr_task(ospf);
1425
1426 ospf_area_check_free(ospf, area->area_id);
1427
1428 return 1;
1429 }
1430
1431 int ospf_area_shortcut_unset(struct ospf *ospf, struct ospf_area *area)
1432 {
1433 area->shortcut_configured = OSPF_SHORTCUT_DEFAULT;
1434 ospf_router_lsa_update_area(area);
1435 ospf_area_check_free(ospf, area->area_id);
1436 ospf_schedule_abr_task(ospf);
1437
1438 return 1;
1439 }
1440
1441 static int ospf_area_vlink_count(struct ospf *ospf, struct ospf_area *area)
1442 {
1443 struct ospf_vl_data *vl;
1444 struct listnode *node;
1445 int count = 0;
1446
1447 for (ALL_LIST_ELEMENTS_RO(ospf->vlinks, node, vl))
1448 if (IPV4_ADDR_SAME(&vl->vl_area_id, &area->area_id))
1449 count++;
1450
1451 return count;
1452 }
1453
1454 int ospf_area_display_format_set(struct ospf *ospf, struct ospf_area *area,
1455 int df)
1456 {
1457 area->area_id_fmt = df;
1458
1459 return 1;
1460 }
1461
1462 int ospf_area_stub_set(struct ospf *ospf, struct in_addr area_id)
1463 {
1464 struct ospf_area *area;
1465
1466 area = ospf_area_get(ospf, area_id);
1467 if (ospf_area_vlink_count(ospf, area))
1468 return 0;
1469
1470 if (area->external_routing != OSPF_AREA_STUB)
1471 ospf_area_type_set(area, OSPF_AREA_STUB);
1472
1473 return 1;
1474 }
1475
1476 int ospf_area_stub_unset(struct ospf *ospf, struct in_addr area_id)
1477 {
1478 struct ospf_area *area;
1479
1480 area = ospf_area_lookup_by_area_id(ospf, area_id);
1481 if (area == NULL)
1482 return 1;
1483
1484 if (area->external_routing == OSPF_AREA_STUB)
1485 ospf_area_type_set(area, OSPF_AREA_DEFAULT);
1486
1487 ospf_area_check_free(ospf, area_id);
1488
1489 return 1;
1490 }
1491
1492 int ospf_area_no_summary_set(struct ospf *ospf, struct in_addr area_id)
1493 {
1494 struct ospf_area *area;
1495
1496 area = ospf_area_get(ospf, area_id);
1497 area->no_summary = 1;
1498
1499 return 1;
1500 }
1501
1502 int ospf_area_no_summary_unset(struct ospf *ospf, struct in_addr area_id)
1503 {
1504 struct ospf_area *area;
1505
1506 area = ospf_area_lookup_by_area_id(ospf, area_id);
1507 if (area == NULL)
1508 return 0;
1509
1510 area->no_summary = 0;
1511 ospf_area_check_free(ospf, area_id);
1512
1513 return 1;
1514 }
1515
1516 int ospf_area_nssa_no_summary_set(struct ospf *ospf, struct in_addr area_id)
1517 {
1518 struct ospf_area *area;
1519
1520 area = ospf_area_get(ospf, area_id);
1521 if (ospf_area_vlink_count(ospf, area))
1522 return 0;
1523
1524 if (area->external_routing != OSPF_AREA_NSSA) {
1525 ospf_area_type_set(area, OSPF_AREA_NSSA);
1526 ospf->anyNSSA++;
1527 area->NSSATranslatorRole = OSPF_NSSA_ROLE_CANDIDATE;
1528 }
1529
1530 ospf_area_no_summary_set(ospf, area_id);
1531
1532 return 1;
1533 }
1534
1535 int ospf_area_nssa_set(struct ospf *ospf, struct in_addr area_id)
1536 {
1537 struct ospf_area *area;
1538
1539 area = ospf_area_get(ospf, area_id);
1540 if (ospf_area_vlink_count(ospf, area))
1541 return 0;
1542
1543 if (area->external_routing != OSPF_AREA_NSSA) {
1544 ospf_area_type_set(area, OSPF_AREA_NSSA);
1545 ospf->anyNSSA++;
1546
1547 /* set NSSA area defaults */
1548 area->no_summary = 0;
1549 area->NSSATranslatorRole = OSPF_NSSA_ROLE_CANDIDATE;
1550 area->NSSATranslatorState = OSPF_NSSA_TRANSLATE_DISABLED;
1551 area->NSSATranslatorStabilityInterval =
1552 OSPF_NSSA_TRANS_STABLE_DEFAULT;
1553 }
1554 return 1;
1555 }
1556
1557 int ospf_area_nssa_unset(struct ospf *ospf, struct in_addr area_id, int argc)
1558 {
1559 struct ospf_area *area;
1560
1561 area = ospf_area_lookup_by_area_id(ospf, area_id);
1562 if (area == NULL)
1563 return 0;
1564
1565 /* argc < 5 -> 'no area x nssa' */
1566 if (argc < 5 && area->external_routing == OSPF_AREA_NSSA) {
1567 ospf->anyNSSA--;
1568 /* set NSSA area defaults */
1569 area->no_summary = 0;
1570 area->NSSATranslatorRole = OSPF_NSSA_ROLE_CANDIDATE;
1571 area->NSSATranslatorState = OSPF_NSSA_TRANSLATE_DISABLED;
1572 area->NSSATranslatorStabilityInterval =
1573 OSPF_NSSA_TRANS_STABLE_DEFAULT;
1574 ospf_area_type_set(area, OSPF_AREA_DEFAULT);
1575 } else {
1576 area->NSSATranslatorRole = OSPF_NSSA_ROLE_CANDIDATE;
1577 }
1578
1579 ospf_area_check_free(ospf, area_id);
1580
1581 return 1;
1582 }
1583
1584 int ospf_area_nssa_translator_role_set(struct ospf *ospf,
1585 struct in_addr area_id, int role)
1586 {
1587 struct ospf_area *area;
1588
1589 area = ospf_area_lookup_by_area_id(ospf, area_id);
1590 if (area == NULL)
1591 return 0;
1592
1593 area->NSSATranslatorRole = role;
1594
1595 return 1;
1596 }
1597
1598 #if 0
1599 /* XXX: unused? Leave for symmetry? */
1600 static int
1601 ospf_area_nssa_translator_role_unset (struct ospf *ospf,
1602 struct in_addr area_id)
1603 {
1604 struct ospf_area *area;
1605
1606 area = ospf_area_lookup_by_area_id (ospf, area_id);
1607 if (area == NULL)
1608 return 0;
1609
1610 area->NSSATranslatorRole = OSPF_NSSA_ROLE_CANDIDATE;
1611
1612 ospf_area_check_free (ospf, area_id);
1613
1614 return 1;
1615 }
1616 #endif
1617
1618 int ospf_area_export_list_set(struct ospf *ospf, struct ospf_area *area,
1619 const char *list_name)
1620 {
1621 struct access_list *list;
1622 list = access_list_lookup(AFI_IP, list_name);
1623
1624 EXPORT_LIST(area) = list;
1625
1626 if (EXPORT_NAME(area))
1627 free(EXPORT_NAME(area));
1628
1629 EXPORT_NAME(area) = strdup(list_name);
1630 ospf_schedule_abr_task(ospf);
1631
1632 return 1;
1633 }
1634
1635 int ospf_area_export_list_unset(struct ospf *ospf, struct ospf_area *area)
1636 {
1637
1638 EXPORT_LIST(area) = 0;
1639
1640 if (EXPORT_NAME(area))
1641 free(EXPORT_NAME(area));
1642
1643 EXPORT_NAME(area) = NULL;
1644
1645 ospf_area_check_free(ospf, area->area_id);
1646
1647 ospf_schedule_abr_task(ospf);
1648
1649 return 1;
1650 }
1651
1652 int ospf_area_import_list_set(struct ospf *ospf, struct ospf_area *area,
1653 const char *name)
1654 {
1655 struct access_list *list;
1656 list = access_list_lookup(AFI_IP, name);
1657
1658 IMPORT_LIST(area) = list;
1659
1660 if (IMPORT_NAME(area))
1661 free(IMPORT_NAME(area));
1662
1663 IMPORT_NAME(area) = strdup(name);
1664 ospf_schedule_abr_task(ospf);
1665
1666 return 1;
1667 }
1668
1669 int ospf_area_import_list_unset(struct ospf *ospf, struct ospf_area *area)
1670 {
1671 IMPORT_LIST(area) = 0;
1672
1673 if (IMPORT_NAME(area))
1674 free(IMPORT_NAME(area));
1675
1676 IMPORT_NAME(area) = NULL;
1677 ospf_area_check_free(ospf, area->area_id);
1678
1679 ospf_schedule_abr_task(ospf);
1680
1681 return 1;
1682 }
1683
1684 int ospf_timers_refresh_set(struct ospf *ospf, int interval)
1685 {
1686 int time_left;
1687
1688 if (ospf->lsa_refresh_interval == interval)
1689 return 1;
1690
1691 time_left = ospf->lsa_refresh_interval
1692 - (monotime(NULL) - ospf->lsa_refresher_started);
1693
1694 if (time_left > interval) {
1695 OSPF_TIMER_OFF(ospf->t_lsa_refresher);
1696 thread_add_timer(master, ospf_lsa_refresh_walker, ospf,
1697 interval, &ospf->t_lsa_refresher);
1698 }
1699 ospf->lsa_refresh_interval = interval;
1700
1701 return 1;
1702 }
1703
1704 int ospf_timers_refresh_unset(struct ospf *ospf)
1705 {
1706 int time_left;
1707
1708 time_left = ospf->lsa_refresh_interval
1709 - (monotime(NULL) - ospf->lsa_refresher_started);
1710
1711 if (time_left > OSPF_LSA_REFRESH_INTERVAL_DEFAULT) {
1712 OSPF_TIMER_OFF(ospf->t_lsa_refresher);
1713 ospf->t_lsa_refresher = NULL;
1714 thread_add_timer(master, ospf_lsa_refresh_walker, ospf,
1715 OSPF_LSA_REFRESH_INTERVAL_DEFAULT,
1716 &ospf->t_lsa_refresher);
1717 }
1718
1719 ospf->lsa_refresh_interval = OSPF_LSA_REFRESH_INTERVAL_DEFAULT;
1720
1721 return 1;
1722 }
1723
1724
1725 static struct ospf_nbr_nbma *ospf_nbr_nbma_new(void)
1726 {
1727 struct ospf_nbr_nbma *nbr_nbma;
1728
1729 nbr_nbma = XCALLOC(MTYPE_OSPF_NEIGHBOR_STATIC,
1730 sizeof(struct ospf_nbr_nbma));
1731
1732 nbr_nbma->priority = OSPF_NEIGHBOR_PRIORITY_DEFAULT;
1733 nbr_nbma->v_poll = OSPF_POLL_INTERVAL_DEFAULT;
1734
1735 return nbr_nbma;
1736 }
1737
1738 static void ospf_nbr_nbma_free(struct ospf_nbr_nbma *nbr_nbma)
1739 {
1740 XFREE(MTYPE_OSPF_NEIGHBOR_STATIC, nbr_nbma);
1741 }
1742
1743 static void ospf_nbr_nbma_delete(struct ospf *ospf,
1744 struct ospf_nbr_nbma *nbr_nbma)
1745 {
1746 struct route_node *rn;
1747 struct prefix_ipv4 p;
1748
1749 p.family = AF_INET;
1750 p.prefix = nbr_nbma->addr;
1751 p.prefixlen = IPV4_MAX_BITLEN;
1752
1753 rn = route_node_lookup(ospf->nbr_nbma, (struct prefix *)&p);
1754 if (rn) {
1755 ospf_nbr_nbma_free(rn->info);
1756 rn->info = NULL;
1757 route_unlock_node(rn);
1758 route_unlock_node(rn);
1759 }
1760 }
1761
1762 static void ospf_nbr_nbma_down(struct ospf_nbr_nbma *nbr_nbma)
1763 {
1764 OSPF_TIMER_OFF(nbr_nbma->t_poll);
1765
1766 if (nbr_nbma->nbr) {
1767 nbr_nbma->nbr->nbr_nbma = NULL;
1768 OSPF_NSM_EVENT_EXECUTE(nbr_nbma->nbr, NSM_KillNbr);
1769 }
1770
1771 if (nbr_nbma->oi)
1772 listnode_delete(nbr_nbma->oi->nbr_nbma, nbr_nbma);
1773 }
1774
1775 static void ospf_nbr_nbma_add(struct ospf_nbr_nbma *nbr_nbma,
1776 struct ospf_interface *oi)
1777 {
1778 struct ospf_neighbor *nbr;
1779 struct route_node *rn;
1780 struct prefix p;
1781
1782 if (oi->type != OSPF_IFTYPE_NBMA)
1783 return;
1784
1785 if (nbr_nbma->nbr != NULL)
1786 return;
1787
1788 if (IPV4_ADDR_SAME(&oi->nbr_self->address.u.prefix4, &nbr_nbma->addr))
1789 return;
1790
1791 nbr_nbma->oi = oi;
1792 listnode_add(oi->nbr_nbma, nbr_nbma);
1793
1794 /* Get neighbor information from table. */
1795 p.family = AF_INET;
1796 p.prefixlen = IPV4_MAX_BITLEN;
1797 p.u.prefix4 = nbr_nbma->addr;
1798
1799 rn = route_node_get(oi->nbrs, (struct prefix *)&p);
1800 if (rn->info) {
1801 nbr = rn->info;
1802 nbr->nbr_nbma = nbr_nbma;
1803 nbr_nbma->nbr = nbr;
1804
1805 route_unlock_node(rn);
1806 } else {
1807 nbr = rn->info = ospf_nbr_new(oi);
1808 nbr->state = NSM_Down;
1809 nbr->src = nbr_nbma->addr;
1810 nbr->nbr_nbma = nbr_nbma;
1811 nbr->priority = nbr_nbma->priority;
1812 nbr->address = p;
1813
1814 nbr_nbma->nbr = nbr;
1815
1816 OSPF_NSM_EVENT_EXECUTE(nbr, NSM_Start);
1817 }
1818 }
1819
1820 void ospf_nbr_nbma_if_update(struct ospf *ospf, struct ospf_interface *oi)
1821 {
1822 struct ospf_nbr_nbma *nbr_nbma;
1823 struct route_node *rn;
1824 struct prefix_ipv4 p;
1825
1826 if (oi->type != OSPF_IFTYPE_NBMA)
1827 return;
1828
1829 for (rn = route_top(ospf->nbr_nbma); rn; rn = route_next(rn))
1830 if ((nbr_nbma = rn->info))
1831 if (nbr_nbma->oi == NULL && nbr_nbma->nbr == NULL) {
1832 p.family = AF_INET;
1833 p.prefix = nbr_nbma->addr;
1834 p.prefixlen = IPV4_MAX_BITLEN;
1835
1836 if (prefix_match(oi->address,
1837 (struct prefix *)&p))
1838 ospf_nbr_nbma_add(nbr_nbma, oi);
1839 }
1840 }
1841
1842 struct ospf_nbr_nbma *ospf_nbr_nbma_lookup(struct ospf *ospf,
1843 struct in_addr nbr_addr)
1844 {
1845 struct route_node *rn;
1846 struct prefix_ipv4 p;
1847
1848 p.family = AF_INET;
1849 p.prefix = nbr_addr;
1850 p.prefixlen = IPV4_MAX_BITLEN;
1851
1852 rn = route_node_lookup(ospf->nbr_nbma, (struct prefix *)&p);
1853 if (rn) {
1854 route_unlock_node(rn);
1855 return rn->info;
1856 }
1857 return NULL;
1858 }
1859
1860 struct ospf_nbr_nbma *ospf_nbr_nbma_lookup_next(struct ospf *ospf,
1861 struct in_addr *addr, int first)
1862 {
1863 #if 0
1864 struct ospf_nbr_nbma *nbr_nbma;
1865 struct listnode *node;
1866 #endif
1867
1868 if (ospf == NULL)
1869 return NULL;
1870
1871 #if 0
1872 for (ALL_LIST_ELEMENTS_RO (ospf->nbr_nbma, node, nbr_nbma))
1873 {
1874 if (first)
1875 {
1876 *addr = nbr_nbma->addr;
1877 return nbr_nbma;
1878 }
1879 else if (ntohl (nbr_nbma->addr.s_addr) > ntohl (addr->s_addr))
1880 {
1881 *addr = nbr_nbma->addr;
1882 return nbr_nbma;
1883 }
1884 }
1885 #endif
1886 return NULL;
1887 }
1888
1889 int ospf_nbr_nbma_set(struct ospf *ospf, struct in_addr nbr_addr)
1890 {
1891 struct ospf_nbr_nbma *nbr_nbma;
1892 struct ospf_interface *oi;
1893 struct prefix_ipv4 p;
1894 struct route_node *rn;
1895 struct listnode *node;
1896
1897 nbr_nbma = ospf_nbr_nbma_lookup(ospf, nbr_addr);
1898 if (nbr_nbma)
1899 return 0;
1900
1901 nbr_nbma = ospf_nbr_nbma_new();
1902 nbr_nbma->addr = nbr_addr;
1903
1904 p.family = AF_INET;
1905 p.prefix = nbr_addr;
1906 p.prefixlen = IPV4_MAX_BITLEN;
1907
1908 rn = route_node_get(ospf->nbr_nbma, (struct prefix *)&p);
1909 if (rn->info)
1910 route_unlock_node(rn);
1911 rn->info = nbr_nbma;
1912
1913 for (ALL_LIST_ELEMENTS_RO(ospf->oiflist, node, oi)) {
1914 if (oi->type == OSPF_IFTYPE_NBMA)
1915 if (prefix_match(oi->address, (struct prefix *)&p)) {
1916 ospf_nbr_nbma_add(nbr_nbma, oi);
1917 break;
1918 }
1919 }
1920
1921 return 1;
1922 }
1923
1924 int ospf_nbr_nbma_unset(struct ospf *ospf, struct in_addr nbr_addr)
1925 {
1926 struct ospf_nbr_nbma *nbr_nbma;
1927
1928 nbr_nbma = ospf_nbr_nbma_lookup(ospf, nbr_addr);
1929 if (nbr_nbma == NULL)
1930 return 0;
1931
1932 ospf_nbr_nbma_down(nbr_nbma);
1933 ospf_nbr_nbma_delete(ospf, nbr_nbma);
1934
1935 return 1;
1936 }
1937
1938 int ospf_nbr_nbma_priority_set(struct ospf *ospf, struct in_addr nbr_addr,
1939 uint8_t priority)
1940 {
1941 struct ospf_nbr_nbma *nbr_nbma;
1942
1943 nbr_nbma = ospf_nbr_nbma_lookup(ospf, nbr_addr);
1944 if (nbr_nbma == NULL)
1945 return 0;
1946
1947 if (nbr_nbma->priority != priority)
1948 nbr_nbma->priority = priority;
1949
1950 return 1;
1951 }
1952
1953 int ospf_nbr_nbma_priority_unset(struct ospf *ospf, struct in_addr nbr_addr)
1954 {
1955 struct ospf_nbr_nbma *nbr_nbma;
1956
1957 nbr_nbma = ospf_nbr_nbma_lookup(ospf, nbr_addr);
1958 if (nbr_nbma == NULL)
1959 return 0;
1960
1961 if (nbr_nbma != OSPF_NEIGHBOR_PRIORITY_DEFAULT)
1962 nbr_nbma->priority = OSPF_NEIGHBOR_PRIORITY_DEFAULT;
1963
1964 return 1;
1965 }
1966
1967 int ospf_nbr_nbma_poll_interval_set(struct ospf *ospf, struct in_addr nbr_addr,
1968 unsigned int interval)
1969 {
1970 struct ospf_nbr_nbma *nbr_nbma;
1971
1972 nbr_nbma = ospf_nbr_nbma_lookup(ospf, nbr_addr);
1973 if (nbr_nbma == NULL)
1974 return 0;
1975
1976 if (nbr_nbma->v_poll != interval) {
1977 nbr_nbma->v_poll = interval;
1978 if (nbr_nbma->oi && ospf_if_is_up(nbr_nbma->oi)) {
1979 OSPF_TIMER_OFF(nbr_nbma->t_poll);
1980 OSPF_POLL_TIMER_ON(nbr_nbma->t_poll, ospf_poll_timer,
1981 nbr_nbma->v_poll);
1982 }
1983 }
1984
1985 return 1;
1986 }
1987
1988 int ospf_nbr_nbma_poll_interval_unset(struct ospf *ospf, struct in_addr addr)
1989 {
1990 struct ospf_nbr_nbma *nbr_nbma;
1991
1992 nbr_nbma = ospf_nbr_nbma_lookup(ospf, addr);
1993 if (nbr_nbma == NULL)
1994 return 0;
1995
1996 if (nbr_nbma->v_poll != OSPF_POLL_INTERVAL_DEFAULT)
1997 nbr_nbma->v_poll = OSPF_POLL_INTERVAL_DEFAULT;
1998
1999 return 1;
2000 }
2001
2002 void ospf_master_init(struct thread_master *master)
2003 {
2004 memset(&ospf_master, 0, sizeof(struct ospf_master));
2005
2006 om = &ospf_master;
2007 om->ospf = list_new();
2008 om->master = master;
2009 }
2010
2011 /* Link OSPF instance to VRF. */
2012 void ospf_vrf_link(struct ospf *ospf, struct vrf *vrf)
2013 {
2014 ospf->vrf_id = vrf->vrf_id;
2015 if (vrf->info != (void *)ospf)
2016 vrf->info = (void *)ospf;
2017 }
2018
2019 /* Unlink OSPF instance from VRF. */
2020 void ospf_vrf_unlink(struct ospf *ospf, struct vrf *vrf)
2021 {
2022 if (vrf->info == (void *)ospf)
2023 vrf->info = NULL;
2024 ospf->vrf_id = VRF_UNKNOWN;
2025 }
2026
2027 /* This is hook function for vrf create called as part of vrf_init */
2028 static int ospf_vrf_new(struct vrf *vrf)
2029 {
2030 if (IS_DEBUG_OSPF_EVENT)
2031 zlog_debug("%s: VRF Created: %s(%u)", __PRETTY_FUNCTION__,
2032 vrf->name, vrf->vrf_id);
2033
2034 return 0;
2035 }
2036
2037 /* This is hook function for vrf delete call as part of vrf_init */
2038 static int ospf_vrf_delete(struct vrf *vrf)
2039 {
2040 if (IS_DEBUG_OSPF_EVENT)
2041 zlog_debug("%s: VRF Deletion: %s(%u)", __PRETTY_FUNCTION__,
2042 vrf->name, vrf->vrf_id);
2043
2044 return 0;
2045 }
2046
2047 static void ospf_set_redist_vrf_bitmaps(struct ospf *ospf)
2048 {
2049 int type;
2050 struct list *red_list;
2051
2052 for (type = 0; type < ZEBRA_ROUTE_MAX; type++) {
2053 red_list = ospf->redist[type];
2054 if (!red_list)
2055 continue;
2056 if (IS_DEBUG_OSPF_EVENT)
2057 zlog_debug(
2058 "%s: setting redist vrf %d bitmap for type %d",
2059 __func__, ospf->vrf_id, type);
2060 vrf_bitmap_set(zclient->redist[AFI_IP][type], ospf->vrf_id);
2061 }
2062 }
2063
2064 /* Enable OSPF VRF instance */
2065 static int ospf_vrf_enable(struct vrf *vrf)
2066 {
2067 struct ospf *ospf = NULL;
2068 vrf_id_t old_vrf_id;
2069 int ret = 0;
2070
2071 if (IS_DEBUG_OSPF_EVENT)
2072 zlog_debug("%s: VRF %s id %u enabled", __PRETTY_FUNCTION__,
2073 vrf->name, vrf->vrf_id);
2074
2075 ospf = ospf_lookup_by_name(vrf->name);
2076 if (ospf) {
2077 if (ospf->name && strmatch(vrf->name, VRF_DEFAULT_NAME)) {
2078 XFREE(MTYPE_OSPF_TOP, ospf->name);
2079 ospf->name = NULL;
2080 }
2081 old_vrf_id = ospf->vrf_id;
2082 /* We have instance configured, link to VRF and make it "up". */
2083 ospf_vrf_link(ospf, vrf);
2084 if (IS_DEBUG_OSPF_EVENT)
2085 zlog_debug(
2086 "%s: ospf linked to vrf %s vrf_id %u (old id %u)",
2087 __PRETTY_FUNCTION__, vrf->name, ospf->vrf_id,
2088 old_vrf_id);
2089
2090 if (old_vrf_id != ospf->vrf_id) {
2091 frr_elevate_privs(&ospfd_privs) {
2092 /* stop zebra redist to us for old vrf */
2093 zclient_send_dereg_requests(zclient,
2094 old_vrf_id);
2095
2096 ospf_set_redist_vrf_bitmaps(ospf);
2097
2098 /* start zebra redist to us for new vrf */
2099 ospf_zebra_vrf_register(ospf);
2100
2101 ret = ospf_sock_init(ospf);
2102 }
2103 if (ret < 0 || ospf->fd <= 0)
2104 return 0;
2105 thread_add_read(master, ospf_read, ospf, ospf->fd,
2106 &ospf->t_read);
2107 ospf->oi_running = 1;
2108 ospf_router_id_update(ospf);
2109 }
2110 }
2111
2112 return 0;
2113 }
2114
2115 /* Disable OSPF VRF instance */
2116 static int ospf_vrf_disable(struct vrf *vrf)
2117 {
2118 struct ospf *ospf = NULL;
2119 vrf_id_t old_vrf_id = VRF_UNKNOWN;
2120
2121 if (vrf->vrf_id == VRF_DEFAULT)
2122 return 0;
2123
2124 if (IS_DEBUG_OSPF_EVENT)
2125 zlog_debug("%s: VRF %s id %d disabled.", __PRETTY_FUNCTION__,
2126 vrf->name, vrf->vrf_id);
2127
2128 ospf = ospf_lookup_by_name(vrf->name);
2129 if (ospf) {
2130 old_vrf_id = ospf->vrf_id;
2131
2132 /* We have instance configured, unlink
2133 * from VRF and make it "down".
2134 */
2135 ospf_vrf_unlink(ospf, vrf);
2136 ospf->oi_running = 0;
2137 if (IS_DEBUG_OSPF_EVENT)
2138 zlog_debug("%s: ospf old_vrf_id %d unlinked",
2139 __PRETTY_FUNCTION__, old_vrf_id);
2140 thread_cancel(ospf->t_read);
2141 close(ospf->fd);
2142 ospf->fd = -1;
2143 }
2144
2145 /* Note: This is a callback, the VRF will be deleted by the caller. */
2146 return 0;
2147 }
2148
2149 void ospf_vrf_init(void)
2150 {
2151 vrf_init(ospf_vrf_new, ospf_vrf_enable, ospf_vrf_disable,
2152 ospf_vrf_delete, NULL);
2153 }
2154
2155 void ospf_vrf_terminate(void)
2156 {
2157 vrf_terminate();
2158 }
2159
2160 const char *ospf_vrf_id_to_name(vrf_id_t vrf_id)
2161 {
2162 struct vrf *vrf = vrf_lookup_by_id(vrf_id);
2163
2164 return vrf ? vrf->name : "NIL";
2165 }