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