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