]> git.proxmox.com Git - mirror_frr.git/blob - ospfd/ospfd.c
ospfd: remove minor WTF in instance creation
[mirror_frr.git] / ospfd / ospfd.c
1 /* OSPF version 2 daemon program.
2 * Copyright (C) 1999, 2000 Toshiaki Takada
3 *
4 * This file is part of GNU Zebra.
5 *
6 * GNU Zebra is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation; either version 2, or (at your option) any
9 * later version.
10 *
11 * GNU Zebra is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License along
17 * with this program; see the file COPYING; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
21 #include <zebra.h>
22
23 #include "thread.h"
24 #include "vty.h"
25 #include "command.h"
26 #include "linklist.h"
27 #include "prefix.h"
28 #include "table.h"
29 #include "if.h"
30 #include "memory.h"
31 #include "stream.h"
32 #include "log.h"
33 #include "sockunion.h" /* for inet_aton () */
34 #include "zclient.h"
35 #include "routemap.h"
36 #include "plist.h"
37 #include "sockopt.h"
38 #include "bfd.h"
39 #include "libfrr.h"
40 #include "defaults.h"
41 #include "lib_errors.h"
42
43 #include "ospfd/ospfd.h"
44 #include "ospfd/ospf_network.h"
45 #include "ospfd/ospf_interface.h"
46 #include "ospfd/ospf_ism.h"
47 #include "ospfd/ospf_asbr.h"
48 #include "ospfd/ospf_lsa.h"
49 #include "ospfd/ospf_lsdb.h"
50 #include "ospfd/ospf_neighbor.h"
51 #include "ospfd/ospf_nsm.h"
52 #include "ospfd/ospf_spf.h"
53 #include "ospfd/ospf_packet.h"
54 #include "ospfd/ospf_dump.h"
55 #include "ospfd/ospf_route.h"
56 #include "ospfd/ospf_zebra.h"
57 #include "ospfd/ospf_abr.h"
58 #include "ospfd/ospf_flood.h"
59 #include "ospfd/ospf_ase.h"
60
61
62 DEFINE_QOBJ_TYPE(ospf)
63
64 /* OSPF process wide configuration. */
65 static struct ospf_master ospf_master;
66
67 /* OSPF process wide configuration pointer to export. */
68 struct ospf_master *om;
69
70 extern struct zclient *zclient;
71
72
73 static void ospf_remove_vls_through_area(struct ospf *, struct ospf_area *);
74 static void ospf_network_free(struct ospf *, struct ospf_network *);
75 static void ospf_area_free(struct ospf_area *);
76 static void ospf_network_run(struct prefix *, struct ospf_area *);
77 static void ospf_network_run_interface(struct ospf *, struct interface *,
78 struct prefix *, struct ospf_area *);
79 static void ospf_network_run_subnet(struct ospf *, struct connected *,
80 struct prefix *, struct ospf_area *);
81 static int ospf_network_match_iface(const struct connected *,
82 const struct prefix *);
83 static void ospf_finish_final(struct ospf *);
84
85 #define OSPF_EXTERNAL_LSA_ORIGINATE_DELAY 1
86
87 void ospf_router_id_update(struct ospf *ospf)
88 {
89 struct vrf *vrf = vrf_lookup_by_id(ospf->vrf_id);
90 struct in_addr router_id, router_id_old;
91 struct ospf_interface *oi;
92 struct interface *ifp;
93 struct listnode *node;
94
95 if (!ospf->oi_running) {
96 if (IS_DEBUG_OSPF_EVENT)
97 zlog_debug(
98 "Router ospf not configured -- Router-ID update postponed");
99 return;
100 }
101
102 if (IS_DEBUG_OSPF_EVENT)
103 zlog_debug("Router-ID[OLD:%s]: Update",
104 inet_ntoa(ospf->router_id));
105
106 router_id_old = ospf->router_id;
107
108 /* Select the router ID based on these priorities:
109 1. Statically assigned router ID is always the first choice.
110 2. If there is no statically assigned router ID, then try to stick
111 with the most recent value, since changing router ID's is very
112 disruptive.
113 3. Last choice: just go with whatever the zebra daemon recommends.
114 */
115 if (ospf->router_id_static.s_addr != 0)
116 router_id = ospf->router_id_static;
117 else if (ospf->router_id.s_addr != 0)
118 router_id = ospf->router_id;
119 else
120 router_id = ospf->router_id_zebra;
121
122 if (IS_DEBUG_OSPF_EVENT)
123 zlog_debug("Router-ID[OLD:%s]: Update to %s",
124 inet_ntoa(ospf->router_id), inet_ntoa(router_id));
125
126 if (!IPV4_ADDR_SAME(&router_id_old, &router_id)) {
127
128 for (ALL_LIST_ELEMENTS_RO(ospf->oiflist, node, oi)) {
129 /* Some nbrs are identified by router_id, these needs
130 * to be rebuilt. Possible optimization would be to do
131 * oi->nbr_self->router_id = router_id for
132 * !(virtual | ptop) links
133 */
134 ospf_nbr_self_reset(oi, router_id);
135 }
136
137 /* Flush (inline) all external LSAs based on the OSPF_LSA_SELF
138 * flag */
139 if (ospf->lsdb) {
140 struct route_node *rn;
141 struct ospf_lsa *lsa;
142
143 LSDB_LOOP (EXTERNAL_LSDB(ospf), rn, lsa)
144 if (IS_LSA_SELF(lsa))
145 ospf_lsa_flush_schedule(ospf, lsa);
146 }
147
148 ospf->router_id = router_id;
149 if (IS_DEBUG_OSPF_EVENT)
150 zlog_debug("Router-ID[NEW:%s]: Update",
151 inet_ntoa(ospf->router_id));
152
153 /* Flush (inline) all external LSAs which now match the new
154 router-id,
155 need to adjust the OSPF_LSA_SELF flag, so the flush doesn't
156 hit
157 asserts in ospf_refresher_unregister_lsa(). This step is
158 needed
159 because the current quagga code does look-up for
160 self-originated LSAs
161 based on the self router-id alone but expects OSPF_LSA_SELF
162 to be
163 properly set */
164 if (ospf->lsdb) {
165 struct route_node *rn;
166 struct ospf_lsa *lsa;
167
168 LSDB_LOOP (EXTERNAL_LSDB(ospf), rn, lsa) {
169 /* AdvRouter and Router ID is the same. */
170 if (IPV4_ADDR_SAME(&lsa->data->adv_router,
171 &ospf->router_id)) {
172 SET_FLAG(lsa->flags,
173 OSPF_LSA_SELF_CHECKED);
174 SET_FLAG(lsa->flags, OSPF_LSA_SELF);
175 ospf_lsa_flush_schedule(ospf, lsa);
176 }
177 }
178 }
179
180 /* update router-lsa's for each area */
181 ospf_router_lsa_update(ospf);
182
183 /* update ospf_interface's */
184 FOR_ALL_INTERFACES (vrf, ifp)
185 ospf_if_update(ospf, ifp);
186
187 ospf_external_lsa_rid_change(ospf);
188 }
189 }
190
191 /* For OSPF area sort by area id. */
192 static int ospf_area_id_cmp(struct ospf_area *a1, struct ospf_area *a2)
193 {
194 if (ntohl(a1->area_id.s_addr) > ntohl(a2->area_id.s_addr))
195 return 1;
196 if (ntohl(a1->area_id.s_addr) < ntohl(a2->area_id.s_addr))
197 return -1;
198 return 0;
199 }
200
201 /* Allocate new ospf structure. */
202 static struct ospf *ospf_new(unsigned short instance, const char *name)
203 {
204 int i;
205 struct vrf *vrf = NULL;
206
207 struct ospf *new = XCALLOC(MTYPE_OSPF_TOP, sizeof(struct ospf));
208
209 new->instance = instance;
210 new->router_id.s_addr = htonl(0);
211 new->router_id_static.s_addr = htonl(0);
212 if (name) {
213 vrf = vrf_lookup_by_name(name);
214 if (vrf)
215 new->vrf_id = vrf->vrf_id;
216 else
217 new->vrf_id = VRF_UNKNOWN;
218 /* Freed in ospf_finish_final */
219 new->name = XSTRDUP(MTYPE_OSPF_TOP, name);
220 if (IS_DEBUG_OSPF_EVENT)
221 zlog_debug(
222 "%s: Create new ospf instance with vrf_name %s vrf_id %u",
223 __PRETTY_FUNCTION__, name, new->vrf_id);
224 } else {
225 new->vrf_id = VRF_DEFAULT;
226 vrf = vrf_lookup_by_id(VRF_DEFAULT);
227 }
228
229 if (vrf)
230 ospf_vrf_link(new, vrf);
231
232 ospf_zebra_vrf_register(new);
233
234 new->abr_type = OSPF_ABR_DEFAULT;
235 new->oiflist = list_new();
236 new->vlinks = list_new();
237 new->areas = list_new();
238 new->areas->cmp = (int (*)(void *, void *))ospf_area_id_cmp;
239 new->networks = route_table_init();
240 new->nbr_nbma = route_table_init();
241
242 new->lsdb = ospf_lsdb_new();
243
244 new->default_originate = DEFAULT_ORIGINATE_NONE;
245
246 new->passive_interface_default = OSPF_IF_ACTIVE;
247
248 new->new_external_route = route_table_init();
249 new->old_external_route = route_table_init();
250 new->external_lsas = route_table_init();
251
252 new->stub_router_startup_time = OSPF_STUB_ROUTER_UNCONFIGURED;
253 new->stub_router_shutdown_time = OSPF_STUB_ROUTER_UNCONFIGURED;
254 new->stub_router_admin_set = OSPF_STUB_ROUTER_ADMINISTRATIVE_UNSET;
255
256 /* Distribute parameter init. */
257 for (i = 0; i <= ZEBRA_ROUTE_MAX; i++) {
258 new->dtag[i] = 0;
259 }
260 new->default_metric = -1;
261 new->ref_bandwidth = OSPF_DEFAULT_REF_BANDWIDTH;
262
263 /* LSA timers */
264 new->min_ls_interval = OSPF_MIN_LS_INTERVAL;
265 new->min_ls_arrival = OSPF_MIN_LS_ARRIVAL;
266
267 /* SPF timer value init. */
268 new->spf_delay = OSPF_SPF_DELAY_DEFAULT;
269 new->spf_holdtime = OSPF_SPF_HOLDTIME_DEFAULT;
270 new->spf_max_holdtime = OSPF_SPF_MAX_HOLDTIME_DEFAULT;
271 new->spf_hold_multiplier = 1;
272
273 /* MaxAge init. */
274 new->maxage_delay = OSPF_LSA_MAXAGE_REMOVE_DELAY_DEFAULT;
275 new->maxage_lsa = route_table_init();
276 new->t_maxage_walker = NULL;
277 thread_add_timer(master, ospf_lsa_maxage_walker, new,
278 OSPF_LSA_MAXAGE_CHECK_INTERVAL, &new->t_maxage_walker);
279
280 /* Distance table init. */
281 new->distance_table = route_table_init();
282
283 new->lsa_refresh_queue.index = 0;
284 new->lsa_refresh_interval = OSPF_LSA_REFRESH_INTERVAL_DEFAULT;
285 new->t_lsa_refresher = NULL;
286 thread_add_timer(master, ospf_lsa_refresh_walker, new,
287 new->lsa_refresh_interval, &new->t_lsa_refresher);
288 new->lsa_refresher_started = monotime(NULL);
289
290 new->ibuf = stream_new(OSPF_MAX_PACKET_SIZE + 1);
291
292 new->t_read = NULL;
293 new->oi_write_q = list_new();
294 new->write_oi_count = OSPF_WRITE_INTERFACE_COUNT_DEFAULT;
295
296 /* Enable "log-adjacency-changes" */
297 #if DFLT_OSPF_LOG_ADJACENCY_CHANGES
298 SET_FLAG(new->config, OSPF_LOG_ADJACENCY_CHANGES);
299 #endif
300
301 QOBJ_REG(new, ospf);
302
303 new->fd = -1;
304 if ((ospf_sock_init(new)) < 0) {
305 if (new->vrf_id != VRF_UNKNOWN)
306 flog_err(
307 EC_LIB_SOCKET,
308 "%s: ospf_sock_init is unable to open a socket",
309 __func__);
310 return new;
311 }
312 thread_add_read(master, ospf_read, new, new->fd, &new->t_read);
313
314 return new;
315 }
316
317 struct ospf *ospf_lookup_instance(unsigned short instance)
318 {
319 struct ospf *ospf;
320 struct listnode *node, *nnode;
321
322 if (listcount(om->ospf) == 0)
323 return NULL;
324
325 for (ALL_LIST_ELEMENTS(om->ospf, node, nnode, ospf))
326 if ((ospf->instance == 0 && instance == 0)
327 || (ospf->instance && instance
328 && ospf->instance == instance))
329 return ospf;
330
331 return NULL;
332 }
333
334 static int ospf_is_ready(struct ospf *ospf)
335 {
336 /* OSPF must be on and Router-ID must be configured. */
337 if (!ospf || ospf->router_id.s_addr == 0)
338 return 0;
339
340 return 1;
341 }
342
343 static void ospf_add(struct ospf *ospf)
344 {
345 listnode_add(om->ospf, ospf);
346 }
347
348 static void ospf_delete(struct ospf *ospf)
349 {
350 listnode_delete(om->ospf, ospf);
351 }
352
353 struct ospf *ospf_lookup_by_inst_name(unsigned short instance, const char *name)
354 {
355 struct ospf *ospf = NULL;
356 struct listnode *node, *nnode;
357
358 if (name == NULL || strmatch(name, VRF_DEFAULT_NAME))
359 return ospf_lookup_by_vrf_id(VRF_DEFAULT);
360
361 for (ALL_LIST_ELEMENTS(om->ospf, node, nnode, ospf)) {
362 if ((ospf->instance == instance)
363 && ((ospf->name == NULL && name == NULL)
364 || (ospf->name && name
365 && strcmp(ospf->name, name) == 0)))
366 return ospf;
367 }
368 return NULL;
369 }
370
371 struct ospf *ospf_get(unsigned short instance, const char *name)
372 {
373 struct ospf *ospf;
374
375 /* vrf name provided call inst and name based api
376 * in case of no name pass default ospf instance */
377 if (name)
378 ospf = ospf_lookup_by_inst_name(instance, name);
379 else
380 ospf = ospf_lookup_by_vrf_id(VRF_DEFAULT);
381
382 if (ospf == NULL) {
383 ospf = ospf_new(instance, name);
384 ospf_add(ospf);
385
386 if (ospf->router_id_static.s_addr == 0)
387 ospf_router_id_update(ospf);
388
389 ospf_opaque_type11_lsa_init(ospf);
390 }
391
392 return ospf;
393 }
394
395 struct ospf *ospf_get_instance(unsigned short instance)
396 {
397 struct ospf *ospf;
398
399 ospf = ospf_lookup_instance(instance);
400 if (ospf == NULL) {
401 ospf = ospf_new(instance, NULL /* VRF_DEFAULT*/);
402 ospf_add(ospf);
403
404 if (ospf->router_id_static.s_addr == 0)
405 ospf_router_id_update(ospf);
406
407 ospf_opaque_type11_lsa_init(ospf);
408 }
409
410 return ospf;
411 }
412
413 struct ospf *ospf_lookup_by_vrf_id(vrf_id_t vrf_id)
414 {
415 struct vrf *vrf = NULL;
416
417 vrf = vrf_lookup_by_id(vrf_id);
418 if (!vrf)
419 return NULL;
420 return (vrf->info) ? (struct ospf *)vrf->info : NULL;
421 }
422
423 /* It should only be used when processing incoming info update from zebra.
424 * Other situations, it is not sufficient to lookup the ospf instance by
425 * vrf_name only without using the instance number.
426 */
427 static struct ospf *ospf_lookup_by_name(const char *vrf_name)
428 {
429 struct ospf *ospf = NULL;
430 struct listnode *node, *nnode;
431
432 for (ALL_LIST_ELEMENTS(om->ospf, node, nnode, ospf))
433 if ((ospf->name == NULL && vrf_name == NULL)
434 || (ospf->name && vrf_name
435 && strcmp(ospf->name, vrf_name) == 0))
436 return ospf;
437 return NULL;
438 }
439
440 /* Handle the second half of deferred shutdown. This is called either
441 * from the deferred-shutdown timer thread, or directly through
442 * ospf_deferred_shutdown_check.
443 *
444 * Function is to cleanup G-R state, if required then call ospf_finish_final
445 * to complete shutdown of this ospf instance. Possibly exit if the
446 * whole process is being shutdown and this was the last OSPF instance.
447 */
448 static void ospf_deferred_shutdown_finish(struct ospf *ospf)
449 {
450 ospf->stub_router_shutdown_time = OSPF_STUB_ROUTER_UNCONFIGURED;
451 OSPF_TIMER_OFF(ospf->t_deferred_shutdown);
452
453 ospf_finish_final(ospf);
454
455 /* *ospf is now invalid */
456
457 /* ospfd being shut-down? If so, was this the last ospf instance? */
458 if (CHECK_FLAG(om->options, OSPF_MASTER_SHUTDOWN)
459 && (listcount(om->ospf) == 0)) {
460 exit(0);
461 }
462
463 return;
464 }
465
466 /* Timer thread for G-R */
467 static int ospf_deferred_shutdown_timer(struct thread *t)
468 {
469 struct ospf *ospf = THREAD_ARG(t);
470
471 ospf_deferred_shutdown_finish(ospf);
472
473 return 0;
474 }
475
476 /* Check whether deferred-shutdown must be scheduled, otherwise call
477 * down directly into second-half of instance shutdown.
478 */
479 static void ospf_deferred_shutdown_check(struct ospf *ospf)
480 {
481 unsigned long timeout;
482 struct listnode *ln;
483 struct ospf_area *area;
484
485 /* deferred shutdown already running? */
486 if (ospf->t_deferred_shutdown)
487 return;
488
489 /* Should we try push out max-metric LSAs? */
490 if (ospf->stub_router_shutdown_time != OSPF_STUB_ROUTER_UNCONFIGURED) {
491 for (ALL_LIST_ELEMENTS_RO(ospf->areas, ln, area)) {
492 SET_FLAG(area->stub_router_state,
493 OSPF_AREA_ADMIN_STUB_ROUTED);
494
495 if (!CHECK_FLAG(area->stub_router_state,
496 OSPF_AREA_IS_STUB_ROUTED))
497 ospf_router_lsa_update_area(area);
498 }
499 timeout = ospf->stub_router_shutdown_time;
500 } else {
501 /* No timer needed */
502 ospf_deferred_shutdown_finish(ospf);
503 return;
504 }
505
506 OSPF_TIMER_ON(ospf->t_deferred_shutdown, ospf_deferred_shutdown_timer,
507 timeout);
508 return;
509 }
510
511 /* Shut down the entire process */
512 void ospf_terminate(void)
513 {
514 struct ospf *ospf;
515 struct listnode *node, *nnode;
516
517 /* shutdown already in progress */
518 if (CHECK_FLAG(om->options, OSPF_MASTER_SHUTDOWN))
519 return;
520
521 SET_FLAG(om->options, OSPF_MASTER_SHUTDOWN);
522
523 /* exit immediately if OSPF not actually running */
524 if (listcount(om->ospf) == 0)
525 exit(0);
526
527 bfd_gbl_exit();
528 for (ALL_LIST_ELEMENTS(om->ospf, node, nnode, ospf))
529 ospf_finish(ospf);
530
531 /* Cleanup route maps */
532 route_map_finish();
533
534 /* reverse prefix_list_init */
535 prefix_list_add_hook(NULL);
536 prefix_list_delete_hook(NULL);
537 prefix_list_reset();
538
539 /* Cleanup vrf info */
540 ospf_vrf_terminate();
541
542 /* Deliberately go back up, hopefully to thread scheduler, as
543 * One or more ospf_finish()'s may have deferred shutdown to a timer
544 * thread
545 */
546 zclient_stop(zclient);
547 zclient_free(zclient);
548
549 frr_fini();
550 }
551
552 void ospf_finish(struct ospf *ospf)
553 {
554 /* let deferred shutdown decide */
555 ospf_deferred_shutdown_check(ospf);
556
557 /* if ospf_deferred_shutdown returns, then ospf_finish_final is
558 * deferred to expiry of G-S timer thread. Return back up, hopefully
559 * to thread scheduler.
560 */
561 return;
562 }
563
564 /* Final cleanup of ospf instance */
565 static void ospf_finish_final(struct ospf *ospf)
566 {
567 struct vrf *vrf = vrf_lookup_by_id(ospf->vrf_id);
568 struct route_node *rn;
569 struct ospf_nbr_nbma *nbr_nbma;
570 struct ospf_lsa *lsa;
571 struct interface *ifp;
572 struct ospf_interface *oi;
573 struct ospf_area *area;
574 struct ospf_vl_data *vl_data;
575 struct listnode *node, *nnode;
576 int i;
577 unsigned short instance = 0;
578
579 QOBJ_UNREG(ospf);
580
581 ospf_opaque_type11_lsa_term(ospf);
582
583 ospf_opaque_finish();
584
585 ospf_flush_self_originated_lsas_now(ospf);
586
587 /* Unregister redistribution */
588 for (i = 0; i < ZEBRA_ROUTE_MAX; i++) {
589 struct list *red_list;
590 struct ospf_redist *red;
591
592 red_list = ospf->redist[i];
593 if (!red_list)
594 continue;
595
596 for (ALL_LIST_ELEMENTS(red_list, node, nnode, red)) {
597 ospf_redistribute_unset(ospf, i, red->instance);
598 ospf_redist_del(ospf, i, red->instance);
599 }
600 }
601 ospf_redistribute_default_set(ospf, DEFAULT_ORIGINATE_NONE, 0, 0);
602
603 for (ALL_LIST_ELEMENTS(ospf->areas, node, nnode, area))
604 ospf_remove_vls_through_area(ospf, area);
605
606 for (ALL_LIST_ELEMENTS(ospf->vlinks, node, nnode, vl_data))
607 ospf_vl_delete(ospf, vl_data);
608
609 list_delete(&ospf->vlinks);
610
611 /* Remove any ospf interface config params */
612 FOR_ALL_INTERFACES (vrf, ifp) {
613 struct ospf_if_params *params;
614
615 params = IF_DEF_PARAMS(ifp);
616 if (OSPF_IF_PARAM_CONFIGURED(params, if_area))
617 UNSET_IF_PARAM(params, if_area);
618 }
619
620 /* Reset interface. */
621 for (ALL_LIST_ELEMENTS(ospf->oiflist, node, nnode, oi))
622 ospf_if_free(oi);
623 list_delete(&ospf->oiflist);
624 ospf->oi_running = 0;
625
626 /* De-Register VRF */
627 ospf_zebra_vrf_deregister(ospf);
628
629 /* Clear static neighbors */
630 for (rn = route_top(ospf->nbr_nbma); rn; rn = route_next(rn))
631 if ((nbr_nbma = rn->info)) {
632 OSPF_POLL_TIMER_OFF(nbr_nbma->t_poll);
633
634 if (nbr_nbma->nbr) {
635 nbr_nbma->nbr->nbr_nbma = NULL;
636 nbr_nbma->nbr = NULL;
637 }
638
639 if (nbr_nbma->oi) {
640 listnode_delete(nbr_nbma->oi->nbr_nbma,
641 nbr_nbma);
642 nbr_nbma->oi = NULL;
643 }
644
645 XFREE(MTYPE_OSPF_NEIGHBOR_STATIC, nbr_nbma);
646 }
647
648 route_table_finish(ospf->nbr_nbma);
649
650 /* Clear networks and Areas. */
651 for (rn = route_top(ospf->networks); rn; rn = route_next(rn)) {
652 struct ospf_network *network;
653
654 if ((network = rn->info) != NULL) {
655 ospf_network_free(ospf, network);
656 rn->info = NULL;
657 route_unlock_node(rn);
658 }
659 }
660 route_table_finish(ospf->networks);
661
662 for (ALL_LIST_ELEMENTS(ospf->areas, node, nnode, area)) {
663 listnode_delete(ospf->areas, area);
664 ospf_area_free(area);
665 }
666
667 /* Cancel all timers. */
668 OSPF_TIMER_OFF(ospf->t_read);
669 OSPF_TIMER_OFF(ospf->t_write);
670 OSPF_TIMER_OFF(ospf->t_spf_calc);
671 OSPF_TIMER_OFF(ospf->t_ase_calc);
672 OSPF_TIMER_OFF(ospf->t_maxage);
673 OSPF_TIMER_OFF(ospf->t_maxage_walker);
674 OSPF_TIMER_OFF(ospf->t_abr_task);
675 OSPF_TIMER_OFF(ospf->t_asbr_check);
676 OSPF_TIMER_OFF(ospf->t_distribute_update);
677 OSPF_TIMER_OFF(ospf->t_lsa_refresher);
678 OSPF_TIMER_OFF(ospf->t_opaque_lsa_self);
679 OSPF_TIMER_OFF(ospf->t_sr_update);
680
681 LSDB_LOOP (OPAQUE_AS_LSDB(ospf), rn, lsa)
682 ospf_discard_from_db(ospf, ospf->lsdb, lsa);
683 LSDB_LOOP (EXTERNAL_LSDB(ospf), rn, lsa)
684 ospf_discard_from_db(ospf, ospf->lsdb, lsa);
685
686 ospf_lsdb_delete_all(ospf->lsdb);
687 ospf_lsdb_free(ospf->lsdb);
688
689 for (rn = route_top(ospf->maxage_lsa); rn; rn = route_next(rn)) {
690 if ((lsa = rn->info) != NULL) {
691 ospf_lsa_unlock(&lsa);
692 rn->info = NULL;
693 }
694 route_unlock_node(rn);
695 }
696 route_table_finish(ospf->maxage_lsa);
697
698 if (ospf->old_table)
699 ospf_route_table_free(ospf->old_table);
700 if (ospf->new_table) {
701 ospf_route_delete(ospf, ospf->new_table);
702 ospf_route_table_free(ospf->new_table);
703 }
704 if (ospf->old_rtrs)
705 ospf_rtrs_free(ospf->old_rtrs);
706 if (ospf->new_rtrs)
707 ospf_rtrs_free(ospf->new_rtrs);
708 if (ospf->new_external_route) {
709 ospf_route_delete(ospf, ospf->new_external_route);
710 ospf_route_table_free(ospf->new_external_route);
711 }
712 if (ospf->old_external_route) {
713 ospf_route_delete(ospf, ospf->old_external_route);
714 ospf_route_table_free(ospf->old_external_route);
715 }
716 if (ospf->external_lsas) {
717 ospf_ase_external_lsas_finish(ospf->external_lsas);
718 }
719
720 for (i = ZEBRA_ROUTE_SYSTEM; i <= ZEBRA_ROUTE_MAX; i++) {
721 struct list *ext_list;
722 struct ospf_external *ext;
723
724 ext_list = ospf->external[i];
725 if (!ext_list)
726 continue;
727
728 for (ALL_LIST_ELEMENTS(ext_list, node, nnode, ext)) {
729 if (ext->external_info)
730 for (rn = route_top(ext->external_info); rn;
731 rn = route_next(rn)) {
732 if (rn->info == NULL)
733 continue;
734
735 XFREE(MTYPE_OSPF_EXTERNAL_INFO,
736 rn->info);
737 rn->info = NULL;
738 route_unlock_node(rn);
739 }
740
741 ospf_external_del(ospf, i, ext->instance);
742 }
743 }
744
745 ospf_distance_reset(ospf);
746 route_table_finish(ospf->distance_table);
747
748 if (!CHECK_FLAG(om->options, OSPF_MASTER_SHUTDOWN))
749 instance = ospf->instance;
750
751 list_delete(&ospf->areas);
752 list_delete(&ospf->oi_write_q);
753
754 close(ospf->fd);
755 stream_free(ospf->ibuf);
756 ospf->fd = -1;
757 ospf_delete(ospf);
758
759 if (ospf->name) {
760 vrf = vrf_lookup_by_name(ospf->name);
761 if (vrf)
762 ospf_vrf_unlink(ospf, vrf);
763 XFREE(MTYPE_OSPF_TOP, ospf->name);
764 } else {
765 vrf = vrf_lookup_by_id(VRF_DEFAULT);
766 if (vrf)
767 ospf_vrf_unlink(ospf, vrf);
768 }
769
770 XFREE(MTYPE_OSPF_TOP, ospf);
771
772 if (!CHECK_FLAG(om->options, OSPF_MASTER_SHUTDOWN))
773 ospf_get_instance(instance);
774 }
775
776
777 /* allocate new OSPF Area object */
778 static struct ospf_area *ospf_area_new(struct ospf *ospf,
779 struct in_addr area_id)
780 {
781 struct ospf_area *new;
782
783 /* Allocate new config_network. */
784 new = XCALLOC(MTYPE_OSPF_AREA, sizeof(struct ospf_area));
785
786 new->ospf = ospf;
787
788 new->area_id = area_id;
789 new->area_id_fmt = OSPF_AREA_ID_FMT_DOTTEDQUAD;
790
791 new->external_routing = OSPF_AREA_DEFAULT;
792 new->default_cost = 1;
793 new->auth_type = OSPF_AUTH_NULL;
794
795 /* New LSDB init. */
796 new->lsdb = ospf_lsdb_new();
797
798 /* Self-originated LSAs initialize. */
799 new->router_lsa_self = NULL;
800
801 ospf_opaque_type10_lsa_init(new);
802
803 new->oiflist = list_new();
804 new->ranges = route_table_init();
805
806 if (area_id.s_addr == OSPF_AREA_BACKBONE)
807 ospf->backbone = new;
808
809 return new;
810 }
811
812 static void ospf_area_free(struct ospf_area *area)
813 {
814 struct route_node *rn;
815 struct ospf_lsa *lsa;
816
817 ospf_opaque_type10_lsa_term(area);
818
819 /* Free LSDBs. */
820 LSDB_LOOP (ROUTER_LSDB(area), rn, lsa)
821 ospf_discard_from_db(area->ospf, area->lsdb, lsa);
822 LSDB_LOOP (NETWORK_LSDB(area), rn, lsa)
823 ospf_discard_from_db(area->ospf, area->lsdb, lsa);
824 LSDB_LOOP (SUMMARY_LSDB(area), rn, lsa)
825 ospf_discard_from_db(area->ospf, area->lsdb, lsa);
826 LSDB_LOOP (ASBR_SUMMARY_LSDB(area), rn, lsa)
827 ospf_discard_from_db(area->ospf, area->lsdb, lsa);
828
829 LSDB_LOOP (NSSA_LSDB(area), rn, lsa)
830 ospf_discard_from_db(area->ospf, area->lsdb, lsa);
831 LSDB_LOOP (OPAQUE_AREA_LSDB(area), rn, lsa)
832 ospf_discard_from_db(area->ospf, area->lsdb, lsa);
833 LSDB_LOOP (OPAQUE_LINK_LSDB(area), rn, lsa)
834 ospf_discard_from_db(area->ospf, area->lsdb, lsa);
835
836 ospf_lsdb_delete_all(area->lsdb);
837 ospf_lsdb_free(area->lsdb);
838
839 ospf_lsa_unlock(&area->router_lsa_self);
840
841 route_table_finish(area->ranges);
842 list_delete(&area->oiflist);
843
844 if (EXPORT_NAME(area))
845 free(EXPORT_NAME(area));
846
847 if (IMPORT_NAME(area))
848 free(IMPORT_NAME(area));
849
850 /* Cancel timer. */
851 OSPF_TIMER_OFF(area->t_stub_router);
852 OSPF_TIMER_OFF(area->t_opaque_lsa_self);
853
854 if (OSPF_IS_AREA_BACKBONE(area))
855 area->ospf->backbone = NULL;
856
857 XFREE(MTYPE_OSPF_AREA, area);
858 }
859
860 void ospf_area_check_free(struct ospf *ospf, struct in_addr area_id)
861 {
862 struct ospf_area *area;
863
864 area = ospf_area_lookup_by_area_id(ospf, area_id);
865 if (area && listcount(area->oiflist) == 0 && area->ranges->top == NULL
866 && !ospf_vl_count(ospf, area)
867 && area->shortcut_configured == OSPF_SHORTCUT_DEFAULT
868 && area->external_routing == OSPF_AREA_DEFAULT
869 && area->no_summary == 0 && area->default_cost == 1
870 && EXPORT_NAME(area) == NULL && IMPORT_NAME(area) == NULL
871 && area->auth_type == OSPF_AUTH_NULL) {
872 listnode_delete(ospf->areas, area);
873 ospf_area_free(area);
874 }
875 }
876
877 struct ospf_area *ospf_area_get(struct ospf *ospf, struct in_addr area_id)
878 {
879 struct ospf_area *area;
880
881 area = ospf_area_lookup_by_area_id(ospf, area_id);
882 if (!area) {
883 area = ospf_area_new(ospf, area_id);
884 listnode_add_sort(ospf->areas, area);
885 ospf_check_abr_status(ospf);
886 if (ospf->stub_router_admin_set
887 == OSPF_STUB_ROUTER_ADMINISTRATIVE_SET) {
888 SET_FLAG(area->stub_router_state,
889 OSPF_AREA_ADMIN_STUB_ROUTED);
890 }
891 }
892
893 return area;
894 }
895
896 struct ospf_area *ospf_area_lookup_by_area_id(struct ospf *ospf,
897 struct in_addr area_id)
898 {
899 struct ospf_area *area;
900 struct listnode *node;
901
902 for (ALL_LIST_ELEMENTS_RO(ospf->areas, node, area))
903 if (IPV4_ADDR_SAME(&area->area_id, &area_id))
904 return area;
905
906 return NULL;
907 }
908
909 void ospf_area_add_if(struct ospf_area *area, struct ospf_interface *oi)
910 {
911 listnode_add(area->oiflist, oi);
912 }
913
914 void ospf_area_del_if(struct ospf_area *area, struct ospf_interface *oi)
915 {
916 listnode_delete(area->oiflist, oi);
917 }
918
919
920 static void add_ospf_interface(struct connected *co, struct ospf_area *area)
921 {
922 struct ospf_interface *oi;
923
924 oi = ospf_if_new(area->ospf, co->ifp, co->address);
925 oi->connected = co;
926
927 oi->area = area;
928
929 oi->params = ospf_lookup_if_params(co->ifp, oi->address->u.prefix4);
930 oi->output_cost = ospf_if_get_output_cost(oi);
931
932 /* Relate ospf interface to ospf instance. */
933 oi->ospf = area->ospf;
934
935 /* update network type as interface flag */
936 /* If network type is specified previously,
937 skip network type setting. */
938 oi->type = IF_DEF_PARAMS(co->ifp)->type;
939
940 /* Add pseudo neighbor. */
941 ospf_nbr_self_reset(oi, oi->ospf->router_id);
942
943 ospf_area_add_if(oi->area, oi);
944
945 /*
946 * if router_id is not configured, dont bring up
947 * interfaces.
948 * ospf_router_id_update() will call ospf_if_update
949 * whenever r-id is configured instead.
950 */
951 if ((area->ospf->router_id.s_addr != 0) && if_is_operative(co->ifp))
952 ospf_if_up(oi);
953 }
954
955 static void update_redistributed(struct ospf *ospf, int add_to_ospf)
956 {
957 struct route_node *rn;
958 struct external_info *ei;
959 struct ospf_external *ext;
960
961 if (ospf_is_type_redistributed(ospf, ZEBRA_ROUTE_CONNECT, 0)) {
962 ext = ospf_external_lookup(ospf, ZEBRA_ROUTE_CONNECT, 0);
963 if ((ext) && EXTERNAL_INFO(ext)) {
964 for (rn = route_top(EXTERNAL_INFO(ext)); rn;
965 rn = route_next(rn)) {
966 ei = rn->info;
967 if (ei == NULL)
968 continue;
969
970 if (add_to_ospf) {
971 if (ospf_external_info_find_lsa(ospf,
972 &ei->p))
973 if (!ospf_distribute_check_connected(
974 ospf, ei))
975 ospf_external_lsa_flush(
976 ospf, ei->type,
977 &ei->p,
978 ei->ifindex /*, ei->nexthop */);
979 } else {
980 if (!ospf_external_info_find_lsa(
981 ospf, &ei->p))
982 if (ospf_distribute_check_connected(
983 ospf, ei))
984 ospf_external_lsa_originate(
985 ospf, ei);
986 }
987 }
988 }
989 }
990 }
991
992 /* Config network statement related functions. */
993 static struct ospf_network *ospf_network_new(struct in_addr area_id)
994 {
995 struct ospf_network *new;
996 new = XCALLOC(MTYPE_OSPF_NETWORK, sizeof(struct ospf_network));
997
998 new->area_id = area_id;
999 new->area_id_fmt = OSPF_AREA_ID_FMT_DOTTEDQUAD;
1000
1001 return new;
1002 }
1003
1004 static void ospf_network_free(struct ospf *ospf, struct ospf_network *network)
1005 {
1006 ospf_area_check_free(ospf, network->area_id);
1007 ospf_schedule_abr_task(ospf);
1008 XFREE(MTYPE_OSPF_NETWORK, network);
1009 }
1010
1011 int ospf_network_set(struct ospf *ospf, struct prefix_ipv4 *p,
1012 struct in_addr area_id, int df)
1013 {
1014 struct ospf_network *network;
1015 struct ospf_area *area;
1016 struct route_node *rn;
1017
1018 rn = route_node_get(ospf->networks, (struct prefix *)p);
1019 if (rn->info) {
1020 network = rn->info;
1021 route_unlock_node(rn);
1022
1023 if (IPV4_ADDR_SAME(&area_id, &network->area_id)) {
1024 return 1;
1025 } else {
1026 /* There is already same network statement. */
1027 return 0;
1028 }
1029 }
1030
1031 rn->info = network = ospf_network_new(area_id);
1032 network->area_id_fmt = df;
1033 area = ospf_area_get(ospf, area_id);
1034 ospf_area_display_format_set(ospf, area, df);
1035
1036 /* Run network config now. */
1037 ospf_network_run((struct prefix *)p, area);
1038
1039 /* Update connected redistribute. */
1040 update_redistributed(ospf, 1); /* interfaces possibly added */
1041
1042 ospf_area_check_free(ospf, area_id);
1043
1044 return 1;
1045 }
1046
1047 int ospf_network_unset(struct ospf *ospf, struct prefix_ipv4 *p,
1048 struct in_addr area_id)
1049 {
1050 struct route_node *rn;
1051 struct ospf_network *network;
1052 struct listnode *node, *nnode;
1053 struct ospf_interface *oi;
1054
1055 rn = route_node_lookup(ospf->networks, (struct prefix *)p);
1056 if (rn == NULL)
1057 return 0;
1058
1059 network = rn->info;
1060 route_unlock_node(rn);
1061 if (!IPV4_ADDR_SAME(&area_id, &network->area_id))
1062 return 0;
1063
1064 ospf_network_free(ospf, rn->info);
1065 rn->info = NULL;
1066 route_unlock_node(rn); /* initial reference */
1067
1068 /* Find interfaces that are not configured already. */
1069 for (ALL_LIST_ELEMENTS(ospf->oiflist, node, nnode, oi)) {
1070
1071 if (oi->type == OSPF_IFTYPE_VIRTUALLINK)
1072 continue;
1073
1074 ospf_network_run_subnet(ospf, oi->connected, NULL, NULL);
1075 }
1076
1077 /* Update connected redistribute. */
1078 update_redistributed(ospf, 0); /* interfaces possibly removed */
1079 ospf_area_check_free(ospf, area_id);
1080
1081 return 1;
1082 }
1083
1084 /* Ensure there's an OSPF instance, as "ip ospf area" enabled OSPF means
1085 * there might not be any 'router ospf' config.
1086 *
1087 * Otherwise, doesn't do anything different to ospf_if_update for now
1088 */
1089 void ospf_interface_area_set(struct ospf *ospf, struct interface *ifp)
1090 {
1091 if (!ospf)
1092 return;
1093
1094 ospf_if_update(ospf, ifp);
1095 /* if_update does a update_redistributed */
1096
1097 return;
1098 }
1099
1100 void ospf_interface_area_unset(struct ospf *ospf, struct interface *ifp)
1101 {
1102 struct route_node *rn_oi;
1103
1104 if (!ospf)
1105 return; /* Ospf not ready yet */
1106
1107 /* Find interfaces that may need to be removed. */
1108 for (rn_oi = route_top(IF_OIFS(ifp)); rn_oi;
1109 rn_oi = route_next(rn_oi)) {
1110 struct ospf_interface *oi = NULL;
1111
1112 if ((oi = rn_oi->info) == NULL)
1113 continue;
1114
1115 if (oi->type == OSPF_IFTYPE_VIRTUALLINK)
1116 continue;
1117
1118 ospf_network_run_subnet(ospf, oi->connected, NULL, NULL);
1119 }
1120
1121 /* Update connected redistribute. */
1122 update_redistributed(ospf, 0); /* interfaces possibly removed */
1123 }
1124
1125 bool ospf_interface_area_is_already_set(struct ospf *ospf,
1126 struct interface *ifp)
1127 {
1128 struct route_node *rn_oi;
1129
1130 if (!ospf)
1131 return false; /* Ospf not ready yet */
1132
1133 /* Find interfaces that may need to be removed. */
1134 for (rn_oi = route_top(IF_OIFS(ifp)); rn_oi;
1135 rn_oi = route_next(rn_oi)) {
1136 struct ospf_interface *oi = rn_oi->info;
1137
1138 if (oi == NULL)
1139 continue;
1140
1141 if (oi->type == OSPF_IFTYPE_VIRTUALLINK)
1142 continue;
1143 /* at least one route covered by interface
1144 * that implies already done
1145 */
1146 return true;
1147 }
1148 return false;
1149 }
1150
1151 /* Check whether interface matches given network
1152 * returns: 1, true. 0, false
1153 */
1154 static int ospf_network_match_iface(const struct connected *co,
1155 const struct prefix *net)
1156 {
1157 /* new approach: more elegant and conceptually clean */
1158 return prefix_match_network_statement(net, CONNECTED_PREFIX(co));
1159 }
1160
1161 static void ospf_update_interface_area(struct connected *co,
1162 struct ospf_area *area)
1163 {
1164 struct ospf_interface *oi = ospf_if_table_lookup(co->ifp, co->address);
1165
1166 /* nothing to be done case */
1167 if (oi && oi->area == area) {
1168 return;
1169 }
1170
1171 if (oi)
1172 ospf_if_free(oi);
1173
1174 add_ospf_interface(co, area);
1175 }
1176
1177 /* Run OSPF for the given subnet, taking into account the following
1178 * possible sources of area configuration, in the given order of preference:
1179 *
1180 * - Whether there is interface+address specific area configuration
1181 * - Whether there is a default area for the interface
1182 * - Whether there is an area given as a parameter.
1183 * - If no specific network prefix/area is supplied, whether there's
1184 * a matching network configured.
1185 */
1186 static void ospf_network_run_subnet(struct ospf *ospf, struct connected *co,
1187 struct prefix *p,
1188 struct ospf_area *given_area)
1189 {
1190 struct ospf_interface *oi;
1191 struct ospf_if_params *params;
1192 struct ospf_area *area = NULL;
1193 struct route_node *rn;
1194 int configed = 0;
1195
1196 if (CHECK_FLAG(co->flags, ZEBRA_IFA_SECONDARY))
1197 return;
1198
1199 if (co->address->family != AF_INET)
1200 return;
1201
1202 /* Try determine the appropriate area for this interface + address
1203 * Start by checking interface config
1204 */
1205 params = ospf_lookup_if_params(co->ifp, co->address->u.prefix4);
1206 if (params && OSPF_IF_PARAM_CONFIGURED(params, if_area))
1207 area = ospf_area_get(ospf, params->if_area);
1208 else {
1209 params = IF_DEF_PARAMS(co->ifp);
1210 if (OSPF_IF_PARAM_CONFIGURED(params, if_area))
1211 area = ospf_area_get(ospf, params->if_area);
1212 }
1213
1214 /* If we've found an interface and/or addr specific area, then we're
1215 * done
1216 */
1217 if (area) {
1218 ospf_update_interface_area(co, area);
1219 return;
1220 }
1221
1222 /* Otherwise, only remaining possibility is a matching network statement
1223 */
1224 if (p) {
1225 assert(given_area != NULL);
1226
1227 /* Which either was supplied as a parameter.. (e.g. cause a new
1228 * network/area was just added)..
1229 */
1230 if (p->family == co->address->family
1231 && ospf_network_match_iface(co, p))
1232 ospf_update_interface_area(co, given_area);
1233
1234 return;
1235 }
1236
1237 /* Else we have to search the existing network/area config to see
1238 * if any match..
1239 */
1240 for (rn = route_top(ospf->networks); rn; rn = route_next(rn))
1241 if (rn->info != NULL && ospf_network_match_iface(co, &rn->p)) {
1242 struct ospf_network *network =
1243 (struct ospf_network *)rn->info;
1244 area = ospf_area_get(ospf, network->area_id);
1245 ospf_update_interface_area(co, area);
1246 configed = 1;
1247 }
1248
1249 /* If the subnet isn't in any area, deconfigure */
1250 if (!configed && (oi = ospf_if_table_lookup(co->ifp, co->address)))
1251 ospf_if_free(oi);
1252 }
1253
1254 static void ospf_network_run_interface(struct ospf *ospf, struct interface *ifp,
1255 struct prefix *p,
1256 struct ospf_area *given_area)
1257 {
1258 struct listnode *cnode;
1259 struct connected *co;
1260
1261 if (memcmp(ifp->name, "VLINK", 5) == 0)
1262 return;
1263
1264 /* Network prefix without area is nonsensical */
1265 if (p)
1266 assert(given_area != NULL);
1267
1268 /* if interface prefix is match specified prefix,
1269 then create socket and join multicast group. */
1270 for (ALL_LIST_ELEMENTS_RO(ifp->connected, cnode, co))
1271 ospf_network_run_subnet(ospf, co, p, given_area);
1272 }
1273
1274 static void ospf_network_run(struct prefix *p, struct ospf_area *area)
1275 {
1276 struct vrf *vrf = vrf_lookup_by_id(area->ospf->vrf_id);
1277 struct interface *ifp;
1278
1279 /* Schedule Router ID Update. */
1280 if (area->ospf->router_id.s_addr == 0)
1281 ospf_router_id_update(area->ospf);
1282
1283 /* Get target interface. */
1284 FOR_ALL_INTERFACES (vrf, ifp)
1285 ospf_network_run_interface(area->ospf, ifp, p, area);
1286 }
1287
1288 void ospf_ls_upd_queue_empty(struct ospf_interface *oi)
1289 {
1290 struct route_node *rn;
1291 struct listnode *node, *nnode;
1292 struct list *lst;
1293 struct ospf_lsa *lsa;
1294
1295 /* empty ls update queue */
1296 for (rn = route_top(oi->ls_upd_queue); rn; rn = route_next(rn))
1297 if ((lst = (struct list *)rn->info)) {
1298 for (ALL_LIST_ELEMENTS(lst, node, nnode, lsa))
1299 ospf_lsa_unlock(&lsa); /* oi->ls_upd_queue */
1300 list_delete(&lst);
1301 rn->info = NULL;
1302 }
1303
1304 /* remove update event */
1305 if (oi->t_ls_upd_event) {
1306 thread_cancel(oi->t_ls_upd_event);
1307 oi->t_ls_upd_event = NULL;
1308 }
1309 }
1310
1311 void ospf_if_update(struct ospf *ospf, struct interface *ifp)
1312 {
1313
1314 if (!ospf)
1315 return;
1316
1317 if (IS_DEBUG_OSPF_EVENT)
1318 zlog_debug(
1319 "%s: interface %s ifp->vrf_id %u ospf vrf %s vrf_id %u router_id %s",
1320 __PRETTY_FUNCTION__, ifp->name, ifp->vrf_id,
1321 ospf_vrf_id_to_name(ospf->vrf_id), ospf->vrf_id,
1322 inet_ntoa(ospf->router_id));
1323
1324 /* OSPF must be ready. */
1325 if (!ospf_is_ready(ospf))
1326 return;
1327
1328 ospf_network_run_interface(ospf, ifp, NULL, NULL);
1329
1330 /* Update connected redistribute. */
1331 update_redistributed(ospf, 1);
1332
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_with_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, ospf_vrf_enable);
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 }
2166
2167 const char *ospf_get_name(const struct ospf *ospf)
2168 {
2169 if (ospf->name)
2170 return ospf->name;
2171 else
2172 return VRF_DEFAULT_NAME;
2173 }