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