]> git.proxmox.com Git - mirror_frr.git/blob - ospfd/ospfd.c
Merge pull request #1770 from qlyoung/random-tools
[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),
125 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(u_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("%s: Create new ospf instance with vrf_name %s vrf_id %u",
245 __PRETTY_FUNCTION__, name, new->vrf_id);
246 if (vrf)
247 ospf_vrf_link(new, vrf);
248 } else {
249 new->vrf_id = VRF_DEFAULT;
250 vrf = vrf_lookup_by_id(VRF_DEFAULT);
251 ospf_vrf_link(new, vrf);
252 }
253 ospf_zebra_vrf_register(new);
254
255 new->abr_type = OSPF_ABR_DEFAULT;
256 new->oiflist = list_new();
257 new->vlinks = list_new();
258 new->areas = list_new();
259 new->areas->cmp = (int (*)(void *, void *))ospf_area_id_cmp;
260 new->networks = route_table_init();
261 new->nbr_nbma = route_table_init();
262
263 new->lsdb = ospf_lsdb_new();
264
265 new->default_originate = DEFAULT_ORIGINATE_NONE;
266
267 new->passive_interface_default = OSPF_IF_ACTIVE;
268
269 new->new_external_route = route_table_init();
270 new->old_external_route = route_table_init();
271 new->external_lsas = route_table_init();
272
273 new->stub_router_startup_time = OSPF_STUB_ROUTER_UNCONFIGURED;
274 new->stub_router_shutdown_time = OSPF_STUB_ROUTER_UNCONFIGURED;
275 new->stub_router_admin_set = OSPF_STUB_ROUTER_ADMINISTRATIVE_UNSET;
276
277 /* Distribute parameter init. */
278 for (i = 0; i <= ZEBRA_ROUTE_MAX; i++) {
279 new->dtag[i] = 0;
280 }
281 new->default_metric = -1;
282 new->ref_bandwidth = OSPF_DEFAULT_REF_BANDWIDTH;
283
284 /* LSA timers */
285 new->min_ls_interval = OSPF_MIN_LS_INTERVAL;
286 new->min_ls_arrival = OSPF_MIN_LS_ARRIVAL;
287
288 /* SPF timer value init. */
289 new->spf_delay = OSPF_SPF_DELAY_DEFAULT;
290 new->spf_holdtime = OSPF_SPF_HOLDTIME_DEFAULT;
291 new->spf_max_holdtime = OSPF_SPF_MAX_HOLDTIME_DEFAULT;
292 new->spf_hold_multiplier = 1;
293
294 /* MaxAge init. */
295 new->maxage_delay = OSPF_LSA_MAXAGE_REMOVE_DELAY_DEFAULT;
296 new->maxage_lsa = route_table_init();
297 new->t_maxage_walker = NULL;
298 thread_add_timer(master, ospf_lsa_maxage_walker, new,
299 OSPF_LSA_MAXAGE_CHECK_INTERVAL, &new->t_maxage_walker);
300
301 /* Distance table init. */
302 new->distance_table = route_table_init();
303
304 new->lsa_refresh_queue.index = 0;
305 new->lsa_refresh_interval = OSPF_LSA_REFRESH_INTERVAL_DEFAULT;
306 new->t_lsa_refresher = NULL;
307 thread_add_timer(master, ospf_lsa_refresh_walker, new,
308 new->lsa_refresh_interval, &new->t_lsa_refresher);
309 new->lsa_refresher_started = monotime(NULL);
310
311 if ((new->ibuf = stream_new(OSPF_MAX_PACKET_SIZE + 1)) == NULL) {
312 zlog_err(
313 "ospf_new: fatal error: stream_new(%u) failed allocating ibuf",
314 OSPF_MAX_PACKET_SIZE + 1);
315 exit(1);
316 }
317 new->t_read = NULL;
318 new->oi_write_q = list_new();
319 new->write_oi_count = OSPF_WRITE_INTERFACE_COUNT_DEFAULT;
320
321 /* Enable "log-adjacency-changes" */
322 #if DFLT_OSPF_LOG_ADJACENCY_CHANGES
323 SET_FLAG(new->config, OSPF_LOG_ADJACENCY_CHANGES);
324 #endif
325
326 QOBJ_REG(new, ospf);
327
328 new->fd = -1;
329 if ((ospf_sock_init(new)) < 0) {
330 if (new->vrf_id != VRF_UNKNOWN)
331 zlog_warn(
332 "%s: ospf_sock_init is unable to open a socket",
333 __func__);
334 return new;
335 }
336 thread_add_read(master, ospf_read, new, new->fd, &new->t_read);
337
338 return new;
339 }
340
341 struct ospf *ospf_lookup_instance(u_short instance)
342 {
343 struct ospf *ospf;
344 struct listnode *node, *nnode;
345
346 if (listcount(om->ospf) == 0)
347 return NULL;
348
349 for (ALL_LIST_ELEMENTS(om->ospf, node, nnode, ospf))
350 if ((ospf->instance == 0 && instance == 0)
351 || (ospf->instance && instance
352 && ospf->instance == instance))
353 return ospf;
354
355 return NULL;
356 }
357
358 static int ospf_is_ready(struct ospf *ospf)
359 {
360 /* OSPF must be on and Router-ID must be configured. */
361 if (!ospf || ospf->router_id.s_addr == 0)
362 return 0;
363
364 return 1;
365 }
366
367 static void ospf_add(struct ospf *ospf)
368 {
369 listnode_add(om->ospf, ospf);
370 }
371
372 static void ospf_delete(struct ospf *ospf)
373 {
374 listnode_delete(om->ospf, ospf);
375 }
376
377 struct ospf *ospf_lookup_by_inst_name(u_short instance, const char *name)
378 {
379 struct ospf *ospf = NULL;
380 struct listnode *node, *nnode;
381
382 for (ALL_LIST_ELEMENTS(om->ospf, node, nnode, ospf)) {
383 if ((ospf->instance == instance) &&
384 ((ospf->name == NULL && name == NULL) ||
385 (ospf->name && name && strcmp(ospf->name, name) == 0)))
386 return ospf;
387 }
388 return NULL;
389 }
390
391 struct ospf *ospf_get(u_short instance, const char *name)
392 {
393 struct ospf *ospf;
394
395 /* vrf name provided call inst and name based api
396 * in case of no name pass default ospf instance */
397 if (name)
398 ospf = ospf_lookup_by_inst_name(instance, name);
399 else
400 ospf = ospf_lookup_by_vrf_id(VRF_DEFAULT);
401
402 if (ospf == NULL) {
403 ospf = ospf_new(instance, name);
404 ospf_add(ospf);
405
406 if (ospf->router_id_static.s_addr == 0)
407 ospf_router_id_update(ospf);
408
409 ospf_opaque_type11_lsa_init(ospf);
410 }
411
412 return ospf;
413 }
414
415 struct ospf *ospf_get_instance(u_short instance)
416 {
417 struct ospf *ospf;
418
419 ospf = ospf_lookup_instance(instance);
420 if (ospf == NULL) {
421 ospf = ospf_new(instance, NULL /* VRF_DEFAULT*/);
422 ospf_add(ospf);
423
424 if (ospf->router_id_static.s_addr == 0) {
425 if (vrf_lookup_by_id(ospf->vrf_id))
426 ospf_router_id_update(ospf);
427 else {
428 if (IS_DEBUG_OSPF_EVENT)
429 zlog_debug("%s: ospf VRF (id %d) is not active yet, skip router id update"
430 , __PRETTY_FUNCTION__,
431 ospf->vrf_id);
432 }
433 ospf_router_id_update(ospf);
434 }
435
436 ospf_opaque_type11_lsa_init(ospf);
437 }
438
439 return ospf;
440 }
441
442 struct ospf *ospf_lookup_by_vrf_id(vrf_id_t vrf_id)
443 {
444 struct vrf *vrf = NULL;
445
446 vrf = vrf_lookup_by_id(vrf_id);
447 if (!vrf)
448 return NULL;
449 return (vrf->info) ? (struct ospf *)vrf->info : NULL;
450
451 }
452
453 /* It should only be used when processing incoming info update from zebra.
454 * Other situations, it is not sufficient to lookup the ospf instance by
455 * vrf_name only without using the instance number.
456 */
457 static struct ospf *ospf_lookup_by_name(const char *vrf_name)
458 {
459 struct ospf *ospf = NULL;
460 struct listnode *node, *nnode;
461
462 for (ALL_LIST_ELEMENTS(om->ospf, node, nnode, ospf))
463 if ((ospf->name == NULL && vrf_name == NULL)
464 || (ospf->name && vrf_name &&
465 strcmp(ospf->name, vrf_name) == 0))
466 return ospf;
467 return NULL;
468 }
469
470 /* Handle the second half of deferred shutdown. This is called either
471 * from the deferred-shutdown timer thread, or directly through
472 * ospf_deferred_shutdown_check.
473 *
474 * Function is to cleanup G-R state, if required then call ospf_finish_final
475 * to complete shutdown of this ospf instance. Possibly exit if the
476 * whole process is being shutdown and this was the last OSPF instance.
477 */
478 static void ospf_deferred_shutdown_finish(struct ospf *ospf)
479 {
480 ospf->stub_router_shutdown_time = OSPF_STUB_ROUTER_UNCONFIGURED;
481 OSPF_TIMER_OFF(ospf->t_deferred_shutdown);
482
483 ospf_finish_final(ospf);
484
485 /* *ospf is now invalid */
486
487 /* ospfd being shut-down? If so, was this the last ospf instance? */
488 if (CHECK_FLAG(om->options, OSPF_MASTER_SHUTDOWN)
489 && (listcount(om->ospf) == 0)) {
490 exit(0);
491 }
492
493 return;
494 }
495
496 /* Timer thread for G-R */
497 static int ospf_deferred_shutdown_timer(struct thread *t)
498 {
499 struct ospf *ospf = THREAD_ARG(t);
500
501 ospf_deferred_shutdown_finish(ospf);
502
503 return 0;
504 }
505
506 /* Check whether deferred-shutdown must be scheduled, otherwise call
507 * down directly into second-half of instance shutdown.
508 */
509 static void ospf_deferred_shutdown_check(struct ospf *ospf)
510 {
511 unsigned long timeout;
512 struct listnode *ln;
513 struct ospf_area *area;
514
515 /* deferred shutdown already running? */
516 if (ospf->t_deferred_shutdown)
517 return;
518
519 /* Should we try push out max-metric LSAs? */
520 if (ospf->stub_router_shutdown_time != OSPF_STUB_ROUTER_UNCONFIGURED) {
521 for (ALL_LIST_ELEMENTS_RO(ospf->areas, ln, area)) {
522 SET_FLAG(area->stub_router_state,
523 OSPF_AREA_ADMIN_STUB_ROUTED);
524
525 if (!CHECK_FLAG(area->stub_router_state,
526 OSPF_AREA_IS_STUB_ROUTED))
527 ospf_router_lsa_update_area(area);
528 }
529 timeout = ospf->stub_router_shutdown_time;
530 } else {
531 /* No timer needed */
532 ospf_deferred_shutdown_finish(ospf);
533 return;
534 }
535
536 OSPF_TIMER_ON(ospf->t_deferred_shutdown, ospf_deferred_shutdown_timer,
537 timeout);
538 return;
539 }
540
541 /* Shut down the entire process */
542 void ospf_terminate(void)
543 {
544 struct ospf *ospf;
545 struct listnode *node, *nnode;
546
547 /* shutdown already in progress */
548 if (CHECK_FLAG(om->options, OSPF_MASTER_SHUTDOWN))
549 return;
550
551 SET_FLAG(om->options, OSPF_MASTER_SHUTDOWN);
552
553 /* exit immediately if OSPF not actually running */
554 if (listcount(om->ospf) == 0)
555 exit(0);
556
557 bfd_gbl_exit();
558 for (ALL_LIST_ELEMENTS(om->ospf, node, nnode, ospf))
559 ospf_finish(ospf);
560
561 /* Cleanup route maps */
562 route_map_add_hook(NULL);
563 route_map_delete_hook(NULL);
564 route_map_event_hook(NULL);
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 u_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
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(
1002 ospf, &ei->p))
1003 if (!ospf_distribute_check_connected(
1004 ospf, ei))
1005 ospf_external_lsa_flush(
1006 ospf,
1007 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,
1017 ei);
1018 }
1019 }
1020 }
1021 }
1022 }
1023
1024 /* Config network statement related functions. */
1025 static struct ospf_network *ospf_network_new(struct in_addr area_id)
1026 {
1027 struct ospf_network *new;
1028 new = XCALLOC(MTYPE_OSPF_NETWORK, sizeof(struct ospf_network));
1029
1030 new->area_id = area_id;
1031 new->area_id_fmt = OSPF_AREA_ID_FMT_DOTTEDQUAD;
1032
1033 return new;
1034 }
1035
1036 static void ospf_network_free(struct ospf *ospf, struct ospf_network *network)
1037 {
1038 ospf_area_check_free(ospf, network->area_id);
1039 ospf_schedule_abr_task(ospf);
1040 XFREE(MTYPE_OSPF_NETWORK, network);
1041 }
1042
1043 int ospf_network_set(struct ospf *ospf, struct prefix_ipv4 *p,
1044 struct in_addr area_id, int df)
1045 {
1046 struct ospf_network *network;
1047 struct ospf_area *area;
1048 struct route_node *rn;
1049
1050 rn = route_node_get(ospf->networks, (struct prefix *)p);
1051 if (rn->info) {
1052 network = rn->info;
1053 route_unlock_node(rn);
1054
1055 if (IPV4_ADDR_SAME(&area_id, &network->area_id)) {
1056 return 1;
1057 } else {
1058 /* There is already same network statement. */
1059 return 0;
1060 }
1061 }
1062
1063 rn->info = network = ospf_network_new(area_id);
1064 network->area_id_fmt = df;
1065 area = ospf_area_get(ospf, area_id);
1066 ospf_area_display_format_set(ospf, area, df);
1067
1068 /* Run network config now. */
1069 ospf_network_run((struct prefix *)p, area);
1070
1071 /* Update connected redistribute. */
1072 update_redistributed(ospf, 1); /* interfaces possibly added */
1073
1074 ospf_area_check_free(ospf, area_id);
1075
1076 return 1;
1077 }
1078
1079 int ospf_network_unset(struct ospf *ospf, struct prefix_ipv4 *p,
1080 struct in_addr area_id)
1081 {
1082 struct route_node *rn;
1083 struct ospf_network *network;
1084 struct listnode *node, *nnode;
1085 struct ospf_interface *oi;
1086
1087 rn = route_node_lookup(ospf->networks, (struct prefix *)p);
1088 if (rn == NULL)
1089 return 0;
1090
1091 network = rn->info;
1092 route_unlock_node(rn);
1093 if (!IPV4_ADDR_SAME(&area_id, &network->area_id))
1094 return 0;
1095
1096 ospf_network_free(ospf, rn->info);
1097 rn->info = NULL;
1098 route_unlock_node(rn); /* initial reference */
1099
1100 /* Find interfaces that are not configured already. */
1101 for (ALL_LIST_ELEMENTS(ospf->oiflist, node, nnode, oi)) {
1102
1103 if (oi->type == OSPF_IFTYPE_VIRTUALLINK)
1104 continue;
1105
1106 ospf_network_run_subnet(ospf, oi->connected, NULL, NULL);
1107 }
1108
1109 /* Update connected redistribute. */
1110 update_redistributed(ospf, 0); /* interfaces possibly removed */
1111 ospf_area_check_free(ospf, area_id);
1112
1113 return 1;
1114 }
1115
1116 /* Ensure there's an OSPF instance, as "ip ospf area" enabled OSPF means
1117 * there might not be any 'router ospf' config.
1118 *
1119 * Otherwise, doesn't do anything different to ospf_if_update for now
1120 */
1121 void ospf_interface_area_set(struct ospf *ospf, struct interface *ifp)
1122 {
1123 if (!ospf)
1124 return;
1125
1126 ospf_if_update(ospf, ifp);
1127 /* if_update does a update_redistributed */
1128
1129 return;
1130 }
1131
1132 void ospf_interface_area_unset(struct ospf *ospf, struct interface *ifp)
1133 {
1134 struct route_node *rn_oi;
1135
1136 if (!ospf)
1137 return; /* Ospf not ready yet */
1138
1139 /* Find interfaces that may need to be removed. */
1140 for (rn_oi = route_top(IF_OIFS(ifp)); rn_oi;
1141 rn_oi = route_next(rn_oi)) {
1142 struct ospf_interface *oi = NULL;
1143
1144 if ((oi = rn_oi->info) == NULL)
1145 continue;
1146
1147 if (oi->type == OSPF_IFTYPE_VIRTUALLINK)
1148 continue;
1149
1150 ospf_network_run_subnet(ospf, oi->connected, NULL, NULL);
1151 }
1152
1153 /* Update connected redistribute. */
1154 update_redistributed(ospf, 0); /* interfaces possibly removed */
1155 }
1156
1157 /* Check whether interface matches given network
1158 * returns: 1, true. 0, false
1159 */
1160 static int ospf_network_match_iface(const struct connected *co,
1161 const struct prefix *net)
1162 {
1163 /* new approach: more elegant and conceptually clean */
1164 return prefix_match_network_statement(net, CONNECTED_PREFIX(co));
1165 }
1166
1167 static void ospf_update_interface_area(struct connected *co,
1168 struct ospf_area *area)
1169 {
1170 struct ospf_interface *oi = ospf_if_table_lookup(co->ifp, co->address);
1171
1172 /* nothing to be done case */
1173 if (oi && oi->area == area) {
1174 return;
1175 }
1176
1177 if (oi)
1178 ospf_if_free(oi);
1179
1180 add_ospf_interface(co, area);
1181 }
1182
1183 /* Run OSPF for the given subnet, taking into account the following
1184 * possible sources of area configuration, in the given order of preference:
1185 *
1186 * - Whether there is interface+address specific area configuration
1187 * - Whether there is a default area for the interface
1188 * - Whether there is an area given as a parameter.
1189 * - If no specific network prefix/area is supplied, whether there's
1190 * a matching network configured.
1191 */
1192 static void ospf_network_run_subnet(struct ospf *ospf, struct connected *co,
1193 struct prefix *p,
1194 struct ospf_area *given_area)
1195 {
1196 struct ospf_interface *oi;
1197 struct ospf_if_params *params;
1198 struct ospf_area *area = NULL;
1199 struct route_node *rn;
1200 int configed = 0;
1201
1202 if (CHECK_FLAG(co->flags, ZEBRA_IFA_SECONDARY))
1203 return;
1204
1205 if (co->address->family != AF_INET)
1206 return;
1207
1208 /* Try determine the appropriate area for this interface + address
1209 * Start by checking interface config
1210 */
1211 params = ospf_lookup_if_params(co->ifp, co->address->u.prefix4);
1212 if (params && OSPF_IF_PARAM_CONFIGURED(params, if_area))
1213 area = ospf_area_get(ospf, params->if_area);
1214 else {
1215 params = IF_DEF_PARAMS(co->ifp);
1216 if (OSPF_IF_PARAM_CONFIGURED(params, if_area))
1217 area = ospf_area_get(ospf, params->if_area);
1218 }
1219
1220 /* If we've found an interface and/or addr specific area, then we're
1221 * done
1222 */
1223 if (area) {
1224 ospf_update_interface_area(co, area);
1225 return;
1226 }
1227
1228 /* Otherwise, only remaining possibility is a matching network statement
1229 */
1230 if (p) {
1231 assert(given_area != NULL);
1232
1233 /* Which either was supplied as a parameter.. (e.g. cause a new
1234 * network/area was just added)..
1235 */
1236 if (p->family == co->address->family
1237 && ospf_network_match_iface(co, p))
1238 ospf_update_interface_area(co, given_area);
1239
1240 return;
1241 }
1242
1243 /* Else we have to search the existing network/area config to see
1244 * if any match..
1245 */
1246 for (rn = route_top(ospf->networks); rn; rn = route_next(rn))
1247 if (rn->info != NULL && ospf_network_match_iface(co, &rn->p)) {
1248 struct ospf_network *network =
1249 (struct ospf_network *)rn->info;
1250 area = ospf_area_get(ospf, network->area_id);
1251 ospf_update_interface_area(co, area);
1252 configed = 1;
1253 }
1254
1255 /* If the subnet isn't in any area, deconfigure */
1256 if (!configed && (oi = ospf_if_table_lookup(co->ifp, co->address)))
1257 ospf_if_free(oi);
1258 }
1259
1260 static void ospf_network_run_interface(struct ospf *ospf, struct interface *ifp,
1261 struct prefix *p,
1262 struct ospf_area *given_area)
1263 {
1264 struct listnode *cnode;
1265 struct connected *co;
1266
1267 if (memcmp(ifp->name, "VLINK", 5) == 0)
1268 return;
1269
1270 /* Network prefix without area is nonsensical */
1271 if (p)
1272 assert(given_area != NULL);
1273
1274 /* if interface prefix is match specified prefix,
1275 then create socket and join multicast group. */
1276 for (ALL_LIST_ELEMENTS_RO(ifp->connected, cnode, co))
1277 ospf_network_run_subnet(ospf, co, p, given_area);
1278 }
1279
1280 static void ospf_network_run(struct prefix *p, struct ospf_area *area)
1281 {
1282 struct vrf *vrf = vrf_lookup_by_id(area->ospf->vrf_id);
1283 struct interface *ifp;
1284
1285 /* Schedule Router ID Update. */
1286 if (area->ospf->router_id.s_addr == 0)
1287 ospf_router_id_update(area->ospf);
1288
1289 /* Get target interface. */
1290 FOR_ALL_INTERFACES (vrf, ifp)
1291 ospf_network_run_interface(area->ospf, ifp, p, area);
1292 }
1293
1294 void ospf_ls_upd_queue_empty(struct ospf_interface *oi)
1295 {
1296 struct route_node *rn;
1297 struct listnode *node, *nnode;
1298 struct list *lst;
1299 struct ospf_lsa *lsa;
1300
1301 /* empty ls update queue */
1302 for (rn = route_top(oi->ls_upd_queue); rn; rn = route_next(rn))
1303 if ((lst = (struct list *)rn->info)) {
1304 for (ALL_LIST_ELEMENTS(lst, node, nnode, lsa))
1305 ospf_lsa_unlock(&lsa); /* oi->ls_upd_queue */
1306 list_delete_and_null(&lst);
1307 rn->info = NULL;
1308 }
1309
1310 /* remove update event */
1311 if (oi->t_ls_upd_event) {
1312 thread_cancel(oi->t_ls_upd_event);
1313 oi->t_ls_upd_event = NULL;
1314 }
1315 }
1316
1317 void ospf_if_update(struct ospf *ospf, struct interface *ifp)
1318 {
1319
1320 if (!ospf)
1321 return;
1322
1323 if (IS_DEBUG_OSPF_EVENT)
1324 zlog_debug("%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 u_char 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 /* Enable OSPF VRF instance */
2052 static int ospf_vrf_enable(struct vrf *vrf)
2053 {
2054 struct ospf *ospf = NULL;
2055 vrf_id_t old_vrf_id;
2056 int ret = 0;
2057
2058 if (IS_DEBUG_OSPF_EVENT)
2059 zlog_debug("%s: VRF %s id %u enabled",
2060 __PRETTY_FUNCTION__, vrf->name, vrf->vrf_id);
2061
2062 ospf = ospf_lookup_by_name(vrf->name);
2063 if (ospf) {
2064 old_vrf_id = ospf->vrf_id;
2065 /* We have instance configured, link to VRF and make it "up". */
2066 ospf_vrf_link(ospf, vrf);
2067 if (IS_DEBUG_OSPF_EVENT)
2068 zlog_debug("%s: ospf linked to vrf %s vrf_id %u (old id %u)",
2069 __PRETTY_FUNCTION__, vrf->name, ospf->vrf_id,
2070 old_vrf_id);
2071
2072 if (old_vrf_id != ospf->vrf_id) {
2073 if (ospfd_privs.change(ZPRIVS_RAISE)) {
2074 zlog_err("ospf_sock_init: could not raise privs, %s",
2075 safe_strerror(errno));
2076 }
2077 ret = ospf_sock_init(ospf);
2078 if (ospfd_privs.change(ZPRIVS_LOWER)) {
2079 zlog_err("ospf_sock_init: could not lower privs, %s",
2080 safe_strerror(errno));
2081 }
2082 if (ret < 0 || ospf->fd <= 0)
2083 return 0;
2084 thread_add_read(master, ospf_read, ospf,
2085 ospf->fd, &ospf->t_read);
2086 ospf->oi_running = 1;
2087 ospf_zebra_vrf_register(ospf);
2088 ospf_router_id_update(ospf);
2089 }
2090 }
2091
2092 return 0;
2093 }
2094
2095 /* Disable OSPF VRF instance */
2096 static int ospf_vrf_disable(struct vrf *vrf)
2097 {
2098 struct ospf *ospf = NULL;
2099 vrf_id_t old_vrf_id = VRF_UNKNOWN;
2100
2101 if (vrf->vrf_id == VRF_DEFAULT)
2102 return 0;
2103
2104 if (IS_DEBUG_OSPF_EVENT)
2105 zlog_debug("%s: VRF %s id %d disabled.",
2106 __PRETTY_FUNCTION__, vrf->name, vrf->vrf_id);
2107
2108 ospf = ospf_lookup_by_name(vrf->name);
2109 if (ospf) {
2110 old_vrf_id = ospf->vrf_id;
2111
2112 /* We have instance configured, unlink
2113 * from VRF and make it "down".
2114 */
2115 ospf_vrf_unlink(ospf, vrf);
2116 ospf->oi_running = 0;
2117 if (IS_DEBUG_OSPF_EVENT)
2118 zlog_debug("%s: ospf old_vrf_id %d unlinked",
2119 __PRETTY_FUNCTION__, old_vrf_id);
2120 thread_cancel(ospf->t_read);
2121 close(ospf->fd);
2122 ospf->fd = -1;
2123 }
2124
2125 /* Note: This is a callback, the VRF will be deleted by the caller. */
2126 return 0;
2127 }
2128
2129 void ospf_vrf_init(void)
2130 {
2131 vrf_init(ospf_vrf_new, ospf_vrf_enable,
2132 ospf_vrf_disable, ospf_vrf_delete);
2133 }
2134
2135 void ospf_vrf_terminate(void)
2136 {
2137 vrf_terminate();
2138 }
2139
2140 const char *ospf_vrf_id_to_name(vrf_id_t vrf_id)
2141 {
2142 struct vrf *vrf = vrf_lookup_by_id(vrf_id);
2143
2144 return vrf ? vrf->name : "NIL";
2145 }