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