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