]> git.proxmox.com Git - mirror_frr.git/blob - ospfd/ospfd.c
Merge pull request #12531 from opensourcerouting/feature/snmp_tests
[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->oall_rtrs)
856 ospf_rtrs_free(ospf->oall_rtrs);
857 if (ospf->all_rtrs)
858 ospf_rtrs_free(ospf->all_rtrs);
859 if (ospf->old_rtrs)
860 ospf_rtrs_free(ospf->old_rtrs);
861 if (ospf->new_rtrs)
862 ospf_rtrs_free(ospf->new_rtrs);
863 if (ospf->new_external_route) {
864 if (!ospf->gr_info.prepare_in_progress)
865 ospf_route_delete(ospf, ospf->new_external_route);
866 ospf_route_table_free(ospf->new_external_route);
867 }
868 if (ospf->old_external_route) {
869 if (!ospf->gr_info.prepare_in_progress)
870 ospf_route_delete(ospf, ospf->old_external_route);
871 ospf_route_table_free(ospf->old_external_route);
872 }
873 if (ospf->external_lsas) {
874 ospf_ase_external_lsas_finish(ospf->external_lsas);
875 }
876
877 for (i = ZEBRA_ROUTE_SYSTEM; i <= ZEBRA_ROUTE_MAX; i++) {
878 struct list *ext_list;
879 struct ospf_external *ext;
880
881 ext_list = ospf->external[i];
882 if (!ext_list)
883 continue;
884
885 for (ALL_LIST_ELEMENTS(ext_list, node, nnode, ext)) {
886 if (ext->external_info)
887 for (rn = route_top(ext->external_info); rn;
888 rn = route_next(rn)) {
889 if (rn->info == NULL)
890 continue;
891
892 XFREE(MTYPE_OSPF_EXTERNAL_INFO,
893 rn->info);
894 rn->info = NULL;
895 route_unlock_node(rn);
896 }
897
898 ospf_external_del(ospf, i, ext->instance);
899 }
900 }
901
902 ospf_distance_reset(ospf);
903 route_table_finish(ospf->distance_table);
904
905 /* Release extrenal Aggregator table */
906 for (rn = route_top(ospf->rt_aggr_tbl); rn; rn = route_next(rn)) {
907 struct ospf_external_aggr_rt *aggr;
908
909 aggr = rn->info;
910
911 if (aggr) {
912 ospf_external_aggregator_free(aggr);
913 rn->info = NULL;
914 route_unlock_node(rn);
915 }
916 }
917
918 route_table_finish(ospf->rt_aggr_tbl);
919
920
921 ospf_free_refresh_queue(ospf);
922
923 list_delete(&ospf->areas);
924 list_delete(&ospf->oi_write_q);
925
926 /* Reset GR helper data structers */
927 ospf_gr_helper_instance_stop(ospf);
928
929 close(ospf->fd);
930 stream_free(ospf->ibuf);
931 ospf->fd = -1;
932 ospf->max_multipath = MULTIPATH_NUM;
933 ospf_delete(ospf);
934
935 if (vrf)
936 ospf_vrf_unlink(ospf, vrf);
937
938 XFREE(MTYPE_OSPF_TOP, ospf->name);
939 XFREE(MTYPE_OSPF_TOP, ospf);
940 }
941
942
943 /* allocate new OSPF Area object */
944 struct ospf_area *ospf_area_new(struct ospf *ospf, struct in_addr area_id)
945 {
946 struct ospf_area *new;
947
948 /* Allocate new config_network. */
949 new = XCALLOC(MTYPE_OSPF_AREA, sizeof(struct ospf_area));
950
951 new->ospf = ospf;
952
953 new->area_id = area_id;
954 new->area_id_fmt = OSPF_AREA_ID_FMT_DOTTEDQUAD;
955
956 new->external_routing = OSPF_AREA_DEFAULT;
957 new->default_cost = 1;
958 new->auth_type = OSPF_AUTH_NULL;
959
960 /* New LSDB init. */
961 new->lsdb = ospf_lsdb_new();
962
963 /* Self-originated LSAs initialize. */
964 new->router_lsa_self = NULL;
965
966 ospf_opaque_type10_lsa_init(new);
967
968 new->oiflist = list_new();
969 new->ranges = route_table_init();
970
971 if (area_id.s_addr == OSPF_AREA_BACKBONE)
972 ospf->backbone = new;
973
974 return new;
975 }
976
977 void ospf_area_lsdb_discard_delete(struct ospf_area *area)
978 {
979 struct route_node *rn;
980 struct ospf_lsa *lsa;
981
982 LSDB_LOOP (ROUTER_LSDB(area), rn, lsa)
983 ospf_discard_from_db(area->ospf, area->lsdb, lsa);
984 LSDB_LOOP (NETWORK_LSDB(area), rn, lsa)
985 ospf_discard_from_db(area->ospf, area->lsdb, lsa);
986 LSDB_LOOP (SUMMARY_LSDB(area), rn, lsa)
987 ospf_discard_from_db(area->ospf, area->lsdb, lsa);
988 LSDB_LOOP (ASBR_SUMMARY_LSDB(area), rn, lsa)
989 ospf_discard_from_db(area->ospf, area->lsdb, lsa);
990
991 LSDB_LOOP (NSSA_LSDB(area), rn, lsa)
992 ospf_discard_from_db(area->ospf, area->lsdb, lsa);
993 LSDB_LOOP (OPAQUE_AREA_LSDB(area), rn, lsa)
994 ospf_discard_from_db(area->ospf, area->lsdb, lsa);
995 LSDB_LOOP (OPAQUE_LINK_LSDB(area), rn, lsa)
996 ospf_discard_from_db(area->ospf, area->lsdb, lsa);
997
998 ospf_lsdb_delete_all(area->lsdb);
999 }
1000
1001 static void ospf_area_free(struct ospf_area *area)
1002 {
1003 ospf_opaque_type10_lsa_term(area);
1004
1005 /* Free LSDBs. */
1006 ospf_area_lsdb_discard_delete(area);
1007
1008 ospf_lsdb_free(area->lsdb);
1009
1010 ospf_lsa_unlock(&area->router_lsa_self);
1011
1012 route_table_finish(area->ranges);
1013 list_delete(&area->oiflist);
1014
1015 if (EXPORT_NAME(area))
1016 free(EXPORT_NAME(area));
1017
1018 if (IMPORT_NAME(area))
1019 free(IMPORT_NAME(area));
1020
1021 /* Cancel timer. */
1022 THREAD_OFF(area->t_stub_router);
1023 THREAD_OFF(area->t_opaque_lsa_self);
1024
1025 if (OSPF_IS_AREA_BACKBONE(area))
1026 area->ospf->backbone = NULL;
1027
1028 XFREE(MTYPE_OSPF_AREA, area);
1029 }
1030
1031 void ospf_area_check_free(struct ospf *ospf, struct in_addr area_id)
1032 {
1033 struct ospf_area *area;
1034
1035 area = ospf_area_lookup_by_area_id(ospf, area_id);
1036 if (area && listcount(area->oiflist) == 0 && area->ranges->top == NULL
1037 && !ospf_vl_count(ospf, area)
1038 && area->shortcut_configured == OSPF_SHORTCUT_DEFAULT
1039 && area->external_routing == OSPF_AREA_DEFAULT
1040 && area->no_summary == 0 && area->default_cost == 1
1041 && EXPORT_NAME(area) == NULL && IMPORT_NAME(area) == NULL
1042 && area->auth_type == OSPF_AUTH_NULL) {
1043 listnode_delete(ospf->areas, area);
1044 ospf_area_free(area);
1045 }
1046 }
1047
1048 struct ospf_area *ospf_area_get(struct ospf *ospf, struct in_addr area_id)
1049 {
1050 struct ospf_area *area;
1051
1052 area = ospf_area_lookup_by_area_id(ospf, area_id);
1053 if (!area) {
1054 area = ospf_area_new(ospf, area_id);
1055 listnode_add_sort(ospf->areas, area);
1056 ospf_check_abr_status(ospf);
1057 if (ospf->stub_router_admin_set
1058 == OSPF_STUB_ROUTER_ADMINISTRATIVE_SET) {
1059 SET_FLAG(area->stub_router_state,
1060 OSPF_AREA_ADMIN_STUB_ROUTED);
1061 }
1062 }
1063
1064 return area;
1065 }
1066
1067 struct ospf_area *ospf_area_lookup_by_area_id(struct ospf *ospf,
1068 struct in_addr area_id)
1069 {
1070 struct ospf_area *area;
1071 struct listnode *node;
1072
1073 for (ALL_LIST_ELEMENTS_RO(ospf->areas, node, area))
1074 if (IPV4_ADDR_SAME(&area->area_id, &area_id))
1075 return area;
1076
1077 return NULL;
1078 }
1079
1080 void ospf_area_add_if(struct ospf_area *area, struct ospf_interface *oi)
1081 {
1082 listnode_add(area->oiflist, oi);
1083 }
1084
1085 void ospf_area_del_if(struct ospf_area *area, struct ospf_interface *oi)
1086 {
1087 listnode_delete(area->oiflist, oi);
1088 }
1089
1090
1091 struct ospf_interface *add_ospf_interface(struct connected *co,
1092 struct ospf_area *area)
1093 {
1094 struct ospf_interface *oi;
1095
1096 oi = ospf_if_new(area->ospf, co->ifp, co->address);
1097 oi->connected = co;
1098
1099 oi->area = area;
1100
1101 oi->params = ospf_lookup_if_params(co->ifp, oi->address->u.prefix4);
1102 oi->output_cost = ospf_if_get_output_cost(oi);
1103
1104 /* Relate ospf interface to ospf instance. */
1105 oi->ospf = area->ospf;
1106
1107 /* update network type as interface flag */
1108 /* If network type is specified previously,
1109 skip network type setting. */
1110 oi->type = IF_DEF_PARAMS(co->ifp)->type;
1111 oi->ptp_dmvpn = IF_DEF_PARAMS(co->ifp)->ptp_dmvpn;
1112
1113 /* Add pseudo neighbor. */
1114 ospf_nbr_self_reset(oi, oi->ospf->router_id);
1115
1116 ospf_area_add_if(oi->area, oi);
1117
1118 /* if LDP-IGP Sync is configured globally inherit config */
1119 ospf_ldp_sync_if_init(oi);
1120
1121 /*
1122 * if router_id is not configured, don't bring up
1123 * interfaces.
1124 * ospf_router_id_update() will call ospf_if_update
1125 * whenever r-id is configured instead.
1126 */
1127 if ((area->ospf->router_id.s_addr != INADDR_ANY)
1128 && if_is_operative(co->ifp))
1129 ospf_if_up(oi);
1130
1131 return oi;
1132 }
1133
1134 static void update_redistributed(struct ospf *ospf, int add_to_ospf)
1135 {
1136 struct route_node *rn;
1137 struct external_info *ei;
1138 struct ospf_external *ext;
1139
1140 if (ospf_is_type_redistributed(ospf, ZEBRA_ROUTE_CONNECT, 0)) {
1141 ext = ospf_external_lookup(ospf, ZEBRA_ROUTE_CONNECT, 0);
1142 if ((ext) && EXTERNAL_INFO(ext)) {
1143 for (rn = route_top(EXTERNAL_INFO(ext)); rn;
1144 rn = route_next(rn)) {
1145 ei = rn->info;
1146 if (ei == NULL)
1147 continue;
1148
1149 if (add_to_ospf) {
1150 if (ospf_external_info_find_lsa(ospf,
1151 &ei->p))
1152 if (!ospf_redistribute_check(
1153 ospf, ei, NULL))
1154 ospf_external_lsa_flush(
1155 ospf, ei->type,
1156 &ei->p,
1157 ei->ifindex /*, ei->nexthop */);
1158 } else {
1159 if (!ospf_external_info_find_lsa(
1160 ospf, &ei->p))
1161 if (ospf_redistribute_check(
1162 ospf, ei, NULL))
1163 ospf_external_lsa_originate(
1164 ospf, ei);
1165 }
1166 }
1167 }
1168 }
1169 }
1170
1171 /* Config network statement related functions. */
1172 static struct ospf_network *ospf_network_new(struct in_addr area_id)
1173 {
1174 struct ospf_network *new;
1175 new = XCALLOC(MTYPE_OSPF_NETWORK, sizeof(struct ospf_network));
1176
1177 new->area_id = area_id;
1178 new->area_id_fmt = OSPF_AREA_ID_FMT_DOTTEDQUAD;
1179
1180 return new;
1181 }
1182
1183 static void ospf_network_free(struct ospf *ospf, struct ospf_network *network)
1184 {
1185 ospf_area_check_free(ospf, network->area_id);
1186 ospf_schedule_abr_task(ospf);
1187 XFREE(MTYPE_OSPF_NETWORK, network);
1188 }
1189
1190 int ospf_network_set(struct ospf *ospf, struct prefix_ipv4 *p,
1191 struct in_addr area_id, int df)
1192 {
1193 struct ospf_network *network;
1194 struct ospf_area *area;
1195 struct route_node *rn;
1196
1197 rn = route_node_get(ospf->networks, (struct prefix *)p);
1198 if (rn->info) {
1199 network = rn->info;
1200 route_unlock_node(rn);
1201
1202 if (IPV4_ADDR_SAME(&area_id, &network->area_id)) {
1203 return 1;
1204 } else {
1205 /* There is already same network statement. */
1206 return 0;
1207 }
1208 }
1209
1210 rn->info = network = ospf_network_new(area_id);
1211 network->area_id_fmt = df;
1212 area = ospf_area_get(ospf, area_id);
1213 ospf_area_display_format_set(ospf, area, df);
1214
1215 /* Run network config now. */
1216 ospf_network_run((struct prefix *)p, area);
1217
1218 /* Update connected redistribute. */
1219 update_redistributed(ospf, 1); /* interfaces possibly added */
1220
1221 ospf_area_check_free(ospf, area_id);
1222
1223 return 1;
1224 }
1225
1226 int ospf_network_unset(struct ospf *ospf, struct prefix_ipv4 *p,
1227 struct in_addr area_id)
1228 {
1229 struct route_node *rn;
1230 struct ospf_network *network;
1231 struct listnode *node, *nnode;
1232 struct ospf_interface *oi;
1233
1234 rn = route_node_lookup(ospf->networks, (struct prefix *)p);
1235 if (rn == NULL)
1236 return 0;
1237
1238 network = rn->info;
1239 route_unlock_node(rn);
1240 if (!IPV4_ADDR_SAME(&area_id, &network->area_id))
1241 return 0;
1242
1243 ospf_network_free(ospf, rn->info);
1244 rn->info = NULL;
1245 route_unlock_node(rn); /* initial reference */
1246
1247 /* Find interfaces that are not configured already. */
1248 for (ALL_LIST_ELEMENTS(ospf->oiflist, node, nnode, oi)) {
1249
1250 if (oi->type == OSPF_IFTYPE_VIRTUALLINK)
1251 continue;
1252
1253 ospf_network_run_subnet(ospf, oi->connected, NULL, NULL);
1254 }
1255
1256 /* Update connected redistribute. */
1257 update_redistributed(ospf, 0); /* interfaces possibly removed */
1258 ospf_area_check_free(ospf, area_id);
1259
1260 return 1;
1261 }
1262
1263 /* Ensure there's an OSPF instance, as "ip ospf area" enabled OSPF means
1264 * there might not be any 'router ospf' config.
1265 *
1266 * Otherwise, doesn't do anything different to ospf_if_update for now
1267 */
1268 void ospf_interface_area_set(struct ospf *ospf, struct interface *ifp)
1269 {
1270 if (!ospf)
1271 return;
1272
1273 ospf_if_update(ospf, ifp);
1274 /* if_update does a update_redistributed */
1275
1276 return;
1277 }
1278
1279 void ospf_interface_area_unset(struct ospf *ospf, struct interface *ifp)
1280 {
1281 struct route_node *rn_oi;
1282
1283 if (!ospf)
1284 return; /* Ospf not ready yet */
1285
1286 /* Find interfaces that may need to be removed. */
1287 for (rn_oi = route_top(IF_OIFS(ifp)); rn_oi;
1288 rn_oi = route_next(rn_oi)) {
1289 struct ospf_interface *oi = NULL;
1290
1291 if ((oi = rn_oi->info) == NULL)
1292 continue;
1293
1294 if (oi->type == OSPF_IFTYPE_VIRTUALLINK)
1295 continue;
1296
1297 ospf_network_run_subnet(ospf, oi->connected, NULL, NULL);
1298 }
1299
1300 /* Update connected redistribute. */
1301 update_redistributed(ospf, 0); /* interfaces possibly removed */
1302 }
1303
1304 /* Check whether interface matches given network
1305 * returns: 1, true. 0, false
1306 */
1307 static int ospf_network_match_iface(const struct connected *co,
1308 const struct prefix *net)
1309 {
1310 /* new approach: more elegant and conceptually clean */
1311 return prefix_match_network_statement(net, CONNECTED_PREFIX(co));
1312 }
1313
1314 static void ospf_update_interface_area(struct connected *co,
1315 struct ospf_area *area)
1316 {
1317 struct ospf_interface *oi = ospf_if_table_lookup(co->ifp, co->address);
1318
1319 /* nothing to be done case */
1320 if (oi && oi->area == area) {
1321 return;
1322 }
1323
1324 if (oi)
1325 ospf_if_free(oi);
1326
1327 add_ospf_interface(co, area);
1328 }
1329
1330 /* Run OSPF for the given subnet, taking into account the following
1331 * possible sources of area configuration, in the given order of preference:
1332 *
1333 * - Whether there is interface+address specific area configuration
1334 * - Whether there is a default area for the interface
1335 * - Whether there is an area given as a parameter.
1336 * - If no specific network prefix/area is supplied, whether there's
1337 * a matching network configured.
1338 */
1339 static void ospf_network_run_subnet(struct ospf *ospf, struct connected *co,
1340 struct prefix *p,
1341 struct ospf_area *given_area)
1342 {
1343 struct ospf_interface *oi;
1344 struct ospf_if_params *params;
1345 struct ospf_area *area = NULL;
1346 struct route_node *rn;
1347 int configed = 0;
1348
1349 if (CHECK_FLAG(co->flags, ZEBRA_IFA_SECONDARY))
1350 return;
1351
1352 if (co->address->family != AF_INET)
1353 return;
1354
1355 /* Try determine the appropriate area for this interface + address
1356 * Start by checking interface config
1357 */
1358 params = ospf_lookup_if_params(co->ifp, co->address->u.prefix4);
1359 if (params && OSPF_IF_PARAM_CONFIGURED(params, if_area))
1360 area = ospf_area_get(ospf, params->if_area);
1361 else {
1362 params = IF_DEF_PARAMS(co->ifp);
1363 if (OSPF_IF_PARAM_CONFIGURED(params, if_area))
1364 area = ospf_area_get(ospf, params->if_area);
1365 }
1366
1367 /* If we've found an interface and/or addr specific area, then we're
1368 * done
1369 */
1370 if (area) {
1371 ospf_update_interface_area(co, area);
1372 return;
1373 }
1374
1375 /* Otherwise, only remaining possibility is a matching network statement
1376 */
1377 if (p) {
1378 assert(given_area != NULL);
1379
1380 /* Which either was supplied as a parameter.. (e.g. cause a new
1381 * network/area was just added)..
1382 */
1383 if (p->family == co->address->family
1384 && ospf_network_match_iface(co, p))
1385 ospf_update_interface_area(co, given_area);
1386
1387 return;
1388 }
1389
1390 /* Else we have to search the existing network/area config to see
1391 * if any match..
1392 */
1393 for (rn = route_top(ospf->networks); rn; rn = route_next(rn))
1394 if (rn->info != NULL && ospf_network_match_iface(co, &rn->p)) {
1395 struct ospf_network *network =
1396 (struct ospf_network *)rn->info;
1397 area = ospf_area_get(ospf, network->area_id);
1398 ospf_update_interface_area(co, area);
1399 configed = 1;
1400 }
1401
1402 /* If the subnet isn't in any area, deconfigure */
1403 if (!configed && (oi = ospf_if_table_lookup(co->ifp, co->address)))
1404 ospf_if_free(oi);
1405 }
1406
1407 static void ospf_network_run_interface(struct ospf *ospf, struct interface *ifp,
1408 struct prefix *p,
1409 struct ospf_area *given_area)
1410 {
1411 struct listnode *cnode;
1412 struct connected *co;
1413
1414 if (memcmp(ifp->name, "VLINK", 5) == 0)
1415 return;
1416
1417 /* Network prefix without area is nonsensical */
1418 if (p)
1419 assert(given_area != NULL);
1420
1421 /* if interface prefix is match specified prefix,
1422 then create socket and join multicast group. */
1423 for (ALL_LIST_ELEMENTS_RO(ifp->connected, cnode, co))
1424 ospf_network_run_subnet(ospf, co, p, given_area);
1425 }
1426
1427 static void ospf_network_run(struct prefix *p, struct ospf_area *area)
1428 {
1429 struct vrf *vrf = vrf_lookup_by_id(area->ospf->vrf_id);
1430 struct interface *ifp;
1431
1432 /* Schedule Router ID Update. */
1433 if (area->ospf->router_id.s_addr == INADDR_ANY)
1434 ospf_router_id_update(area->ospf);
1435
1436 /* Get target interface. */
1437 FOR_ALL_INTERFACES (vrf, ifp)
1438 ospf_network_run_interface(area->ospf, ifp, p, area);
1439 }
1440
1441 void ospf_ls_upd_queue_empty(struct ospf_interface *oi)
1442 {
1443 struct route_node *rn;
1444 struct listnode *node, *nnode;
1445 struct list *lst;
1446 struct ospf_lsa *lsa;
1447
1448 /* empty ls update queue */
1449 for (rn = route_top(oi->ls_upd_queue); rn; rn = route_next(rn))
1450 if ((lst = (struct list *)rn->info)) {
1451 for (ALL_LIST_ELEMENTS(lst, node, nnode, lsa))
1452 ospf_lsa_unlock(&lsa); /* oi->ls_upd_queue */
1453 list_delete(&lst);
1454 rn->info = NULL;
1455 }
1456
1457 /* remove update event */
1458 THREAD_OFF(oi->t_ls_upd_event);
1459 }
1460
1461 void ospf_if_update(struct ospf *ospf, struct interface *ifp)
1462 {
1463
1464 if (!ospf)
1465 return;
1466
1467 if (IS_DEBUG_OSPF_EVENT)
1468 zlog_debug(
1469 "%s: interface %s vrf %s(%u) ospf vrf %s vrf_id %u router_id %pI4",
1470 __func__, ifp->name, ifp->vrf->name, ifp->vrf->vrf_id,
1471 ospf_vrf_id_to_name(ospf->vrf_id), ospf->vrf_id,
1472 &ospf->router_id);
1473
1474 /* OSPF must be ready. */
1475 if (!ospf_is_ready(ospf))
1476 return;
1477
1478 ospf_network_run_interface(ospf, ifp, NULL, NULL);
1479
1480 /* Update connected redistribute. */
1481 update_redistributed(ospf, 1);
1482
1483 }
1484
1485 void ospf_remove_vls_through_area(struct ospf *ospf, struct ospf_area *area)
1486 {
1487 struct listnode *node, *nnode;
1488 struct ospf_vl_data *vl_data;
1489
1490 for (ALL_LIST_ELEMENTS(ospf->vlinks, node, nnode, vl_data))
1491 if (IPV4_ADDR_SAME(&vl_data->vl_area_id, &area->area_id))
1492 ospf_vl_delete(ospf, vl_data);
1493 }
1494
1495
1496 static const struct message ospf_area_type_msg[] = {
1497 {OSPF_AREA_DEFAULT, "Default"},
1498 {OSPF_AREA_STUB, "Stub"},
1499 {OSPF_AREA_NSSA, "NSSA"},
1500 {0}};
1501
1502 static void ospf_area_type_set(struct ospf_area *area, int type)
1503 {
1504 struct listnode *node;
1505 struct ospf_interface *oi;
1506
1507 if (area->external_routing == type) {
1508 if (IS_DEBUG_OSPF_EVENT)
1509 zlog_debug("Area[%pI4]: Types are the same, ignored.",
1510 &area->area_id);
1511 return;
1512 }
1513
1514 area->external_routing = type;
1515
1516 if (IS_DEBUG_OSPF_EVENT)
1517 zlog_debug("Area[%pI4]: Configured as %s",
1518 &area->area_id,
1519 lookup_msg(ospf_area_type_msg, type, NULL));
1520
1521 switch (area->external_routing) {
1522 case OSPF_AREA_DEFAULT:
1523 for (ALL_LIST_ELEMENTS_RO(area->oiflist, node, oi))
1524 if (oi->nbr_self != NULL) {
1525 UNSET_FLAG(oi->nbr_self->options,
1526 OSPF_OPTION_NP);
1527 SET_FLAG(oi->nbr_self->options, OSPF_OPTION_E);
1528 }
1529 break;
1530 case OSPF_AREA_STUB:
1531 for (ALL_LIST_ELEMENTS_RO(area->oiflist, node, oi))
1532 if (oi->nbr_self != NULL) {
1533 if (IS_DEBUG_OSPF_EVENT)
1534 zlog_debug(
1535 "setting options on %s accordingly",
1536 IF_NAME(oi));
1537 UNSET_FLAG(oi->nbr_self->options,
1538 OSPF_OPTION_NP);
1539 UNSET_FLAG(oi->nbr_self->options,
1540 OSPF_OPTION_E);
1541 if (IS_DEBUG_OSPF_EVENT)
1542 zlog_debug("options set on %s: %x",
1543 IF_NAME(oi), OPTIONS(oi));
1544 }
1545 break;
1546 case OSPF_AREA_NSSA:
1547 for (ALL_LIST_ELEMENTS_RO(area->oiflist, node, oi))
1548 if (oi->nbr_self != NULL) {
1549 zlog_debug(
1550 "setting nssa options on %s accordingly",
1551 IF_NAME(oi));
1552 UNSET_FLAG(oi->nbr_self->options,
1553 OSPF_OPTION_E);
1554 SET_FLAG(oi->nbr_self->options, OSPF_OPTION_NP);
1555 zlog_debug("options set on %s: %x", IF_NAME(oi),
1556 OPTIONS(oi));
1557 }
1558 break;
1559 default:
1560 break;
1561 }
1562
1563 ospf_router_lsa_update_area(area);
1564 ospf_schedule_abr_task(area->ospf);
1565 }
1566
1567 int ospf_area_shortcut_set(struct ospf *ospf, struct ospf_area *area, int mode)
1568 {
1569 if (area->shortcut_configured == mode)
1570 return 0;
1571
1572 area->shortcut_configured = mode;
1573 ospf_router_lsa_update_area(area);
1574 ospf_schedule_abr_task(ospf);
1575
1576 ospf_area_check_free(ospf, area->area_id);
1577
1578 return 1;
1579 }
1580
1581 int ospf_area_shortcut_unset(struct ospf *ospf, struct ospf_area *area)
1582 {
1583 area->shortcut_configured = OSPF_SHORTCUT_DEFAULT;
1584 ospf_router_lsa_update_area(area);
1585 ospf_area_check_free(ospf, area->area_id);
1586 ospf_schedule_abr_task(ospf);
1587
1588 return 1;
1589 }
1590
1591 static int ospf_area_vlink_count(struct ospf *ospf, struct ospf_area *area)
1592 {
1593 struct ospf_vl_data *vl;
1594 struct listnode *node;
1595 int count = 0;
1596
1597 for (ALL_LIST_ELEMENTS_RO(ospf->vlinks, node, vl))
1598 if (IPV4_ADDR_SAME(&vl->vl_area_id, &area->area_id))
1599 count++;
1600
1601 return count;
1602 }
1603
1604 int ospf_area_display_format_set(struct ospf *ospf, struct ospf_area *area,
1605 int df)
1606 {
1607 area->area_id_fmt = df;
1608
1609 return 1;
1610 }
1611
1612 int ospf_area_stub_set(struct ospf *ospf, struct in_addr area_id)
1613 {
1614 struct ospf_area *area;
1615
1616 area = ospf_area_get(ospf, area_id);
1617 if (ospf_area_vlink_count(ospf, area))
1618 return 0;
1619
1620 if (area->external_routing != OSPF_AREA_STUB)
1621 ospf_area_type_set(area, OSPF_AREA_STUB);
1622
1623 return 1;
1624 }
1625
1626 int ospf_area_stub_unset(struct ospf *ospf, struct in_addr area_id)
1627 {
1628 struct ospf_area *area;
1629
1630 area = ospf_area_lookup_by_area_id(ospf, area_id);
1631 if (area == NULL)
1632 return 1;
1633
1634 if (area->external_routing == OSPF_AREA_STUB)
1635 ospf_area_type_set(area, OSPF_AREA_DEFAULT);
1636
1637 ospf_area_check_free(ospf, area_id);
1638
1639 return 1;
1640 }
1641
1642 int ospf_area_no_summary_set(struct ospf *ospf, struct in_addr area_id)
1643 {
1644 struct ospf_area *area;
1645
1646 area = ospf_area_get(ospf, area_id);
1647 area->no_summary = 1;
1648
1649 return 1;
1650 }
1651
1652 int ospf_area_no_summary_unset(struct ospf *ospf, struct in_addr area_id)
1653 {
1654 struct ospf_area *area;
1655
1656 area = ospf_area_lookup_by_area_id(ospf, area_id);
1657 if (area == NULL)
1658 return 0;
1659
1660 area->no_summary = 0;
1661 ospf_area_check_free(ospf, area_id);
1662
1663 return 1;
1664 }
1665
1666 int ospf_area_nssa_no_summary_set(struct ospf *ospf, struct in_addr area_id)
1667 {
1668 struct ospf_area *area;
1669
1670 area = ospf_area_get(ospf, area_id);
1671 if (ospf_area_vlink_count(ospf, area))
1672 return 0;
1673
1674 if (area->external_routing != OSPF_AREA_NSSA) {
1675 ospf_area_type_set(area, OSPF_AREA_NSSA);
1676 ospf->anyNSSA++;
1677 area->NSSATranslatorRole = OSPF_NSSA_ROLE_CANDIDATE;
1678 }
1679
1680 ospf_area_no_summary_set(ospf, area_id);
1681
1682 return 1;
1683 }
1684
1685 int ospf_area_nssa_set(struct ospf *ospf, struct in_addr area_id)
1686 {
1687 struct ospf_area *area;
1688
1689 area = ospf_area_get(ospf, area_id);
1690 if (ospf_area_vlink_count(ospf, area))
1691 return 0;
1692
1693 if (area->external_routing != OSPF_AREA_NSSA) {
1694 ospf_area_type_set(area, OSPF_AREA_NSSA);
1695 ospf->anyNSSA++;
1696
1697 /* set NSSA area defaults */
1698 area->no_summary = 0;
1699 area->suppress_fa = 0;
1700 area->NSSATranslatorRole = OSPF_NSSA_ROLE_CANDIDATE;
1701 area->NSSATranslatorState = OSPF_NSSA_TRANSLATE_DISABLED;
1702 area->NSSATranslatorStabilityInterval =
1703 OSPF_NSSA_TRANS_STABLE_DEFAULT;
1704 }
1705 return 1;
1706 }
1707
1708 int ospf_area_nssa_unset(struct ospf *ospf, struct in_addr area_id, int argc)
1709 {
1710 struct ospf_area *area;
1711
1712 area = ospf_area_lookup_by_area_id(ospf, area_id);
1713 if (area == NULL)
1714 return 0;
1715
1716 /* argc < 5 -> 'no area x nssa' */
1717 if (argc < 5 && area->external_routing == OSPF_AREA_NSSA) {
1718 ospf->anyNSSA--;
1719 /* set NSSA area defaults */
1720 area->no_summary = 0;
1721 area->suppress_fa = 0;
1722 area->NSSATranslatorRole = OSPF_NSSA_ROLE_CANDIDATE;
1723 area->NSSATranslatorState = OSPF_NSSA_TRANSLATE_DISABLED;
1724 area->NSSATranslatorStabilityInterval =
1725 OSPF_NSSA_TRANS_STABLE_DEFAULT;
1726 ospf_area_type_set(area, OSPF_AREA_DEFAULT);
1727 } else {
1728 ospf_area_nssa_translator_role_set(ospf, area_id,
1729 OSPF_NSSA_ROLE_CANDIDATE);
1730 }
1731
1732 ospf_area_check_free(ospf, area_id);
1733
1734 return 1;
1735 }
1736
1737 int ospf_area_nssa_suppress_fa_set(struct ospf *ospf, struct in_addr area_id)
1738 {
1739 struct ospf_area *area;
1740
1741 area = ospf_area_lookup_by_area_id(ospf, area_id);
1742 if (area == NULL)
1743 return 0;
1744
1745 area->suppress_fa = 1;
1746
1747 return 1;
1748 }
1749
1750 int ospf_area_nssa_suppress_fa_unset(struct ospf *ospf, struct in_addr area_id)
1751 {
1752 struct ospf_area *area;
1753
1754 area = ospf_area_lookup_by_area_id(ospf, area_id);
1755 if (area == NULL)
1756 return 0;
1757
1758 area->suppress_fa = 0;
1759
1760 return 1;
1761 }
1762
1763 int ospf_area_nssa_translator_role_set(struct ospf *ospf,
1764 struct in_addr area_id, int role)
1765 {
1766 struct ospf_area *area;
1767
1768 area = ospf_area_lookup_by_area_id(ospf, area_id);
1769 if (area == NULL)
1770 return 0;
1771
1772 if (role != area->NSSATranslatorRole) {
1773 if ((area->NSSATranslatorRole == OSPF_NSSA_ROLE_ALWAYS)
1774 || (role == OSPF_NSSA_ROLE_ALWAYS)) {
1775 /* RFC 3101 3.1
1776 * if new role is OSPF_NSSA_ROLE_ALWAYS we need to set
1777 * Nt bit, if the role was OSPF_NSSA_ROLE_ALWAYS we need
1778 * to clear Nt bit
1779 */
1780 area->NSSATranslatorRole = role;
1781 ospf_router_lsa_update_area(area);
1782 } else
1783 area->NSSATranslatorRole = role;
1784 }
1785
1786 return 1;
1787 }
1788
1789 int ospf_area_export_list_set(struct ospf *ospf, struct ospf_area *area,
1790 const char *list_name)
1791 {
1792 struct access_list *list;
1793 list = access_list_lookup(AFI_IP, list_name);
1794
1795 EXPORT_LIST(area) = list;
1796
1797 if (EXPORT_NAME(area))
1798 free(EXPORT_NAME(area));
1799
1800 EXPORT_NAME(area) = strdup(list_name);
1801 ospf_schedule_abr_task(ospf);
1802
1803 return 1;
1804 }
1805
1806 int ospf_area_export_list_unset(struct ospf *ospf, struct ospf_area *area)
1807 {
1808
1809 EXPORT_LIST(area) = 0;
1810
1811 if (EXPORT_NAME(area))
1812 free(EXPORT_NAME(area));
1813
1814 EXPORT_NAME(area) = NULL;
1815
1816 ospf_area_check_free(ospf, area->area_id);
1817
1818 ospf_schedule_abr_task(ospf);
1819
1820 return 1;
1821 }
1822
1823 int ospf_area_import_list_set(struct ospf *ospf, struct ospf_area *area,
1824 const char *name)
1825 {
1826 struct access_list *list;
1827 list = access_list_lookup(AFI_IP, name);
1828
1829 IMPORT_LIST(area) = list;
1830
1831 if (IMPORT_NAME(area))
1832 free(IMPORT_NAME(area));
1833
1834 IMPORT_NAME(area) = strdup(name);
1835 ospf_schedule_abr_task(ospf);
1836
1837 return 1;
1838 }
1839
1840 int ospf_area_import_list_unset(struct ospf *ospf, struct ospf_area *area)
1841 {
1842 IMPORT_LIST(area) = 0;
1843
1844 if (IMPORT_NAME(area))
1845 free(IMPORT_NAME(area));
1846
1847 IMPORT_NAME(area) = NULL;
1848 ospf_area_check_free(ospf, area->area_id);
1849
1850 ospf_schedule_abr_task(ospf);
1851
1852 return 1;
1853 }
1854
1855 int ospf_timers_refresh_set(struct ospf *ospf, int interval)
1856 {
1857 int time_left;
1858
1859 if (ospf->lsa_refresh_interval == interval)
1860 return 1;
1861
1862 time_left = ospf->lsa_refresh_interval
1863 - (monotime(NULL) - ospf->lsa_refresher_started);
1864
1865 if (time_left > interval) {
1866 THREAD_OFF(ospf->t_lsa_refresher);
1867 thread_add_timer(master, ospf_lsa_refresh_walker, ospf,
1868 interval, &ospf->t_lsa_refresher);
1869 }
1870 ospf->lsa_refresh_interval = interval;
1871
1872 return 1;
1873 }
1874
1875 int ospf_timers_refresh_unset(struct ospf *ospf)
1876 {
1877 int time_left;
1878
1879 time_left = ospf->lsa_refresh_interval
1880 - (monotime(NULL) - ospf->lsa_refresher_started);
1881
1882 if (time_left > OSPF_LSA_REFRESH_INTERVAL_DEFAULT) {
1883 THREAD_OFF(ospf->t_lsa_refresher);
1884 ospf->t_lsa_refresher = NULL;
1885 thread_add_timer(master, ospf_lsa_refresh_walker, ospf,
1886 OSPF_LSA_REFRESH_INTERVAL_DEFAULT,
1887 &ospf->t_lsa_refresher);
1888 }
1889
1890 ospf->lsa_refresh_interval = OSPF_LSA_REFRESH_INTERVAL_DEFAULT;
1891
1892 return 1;
1893 }
1894
1895
1896 static struct ospf_nbr_nbma *ospf_nbr_nbma_new(void)
1897 {
1898 struct ospf_nbr_nbma *nbr_nbma;
1899
1900 nbr_nbma = XCALLOC(MTYPE_OSPF_NEIGHBOR_STATIC,
1901 sizeof(struct ospf_nbr_nbma));
1902
1903 nbr_nbma->priority = OSPF_NEIGHBOR_PRIORITY_DEFAULT;
1904 nbr_nbma->v_poll = OSPF_POLL_INTERVAL_DEFAULT;
1905
1906 return nbr_nbma;
1907 }
1908
1909 static void ospf_nbr_nbma_free(struct ospf_nbr_nbma *nbr_nbma)
1910 {
1911 XFREE(MTYPE_OSPF_NEIGHBOR_STATIC, nbr_nbma);
1912 }
1913
1914 static void ospf_nbr_nbma_delete(struct ospf *ospf,
1915 struct ospf_nbr_nbma *nbr_nbma)
1916 {
1917 struct route_node *rn;
1918 struct prefix_ipv4 p;
1919
1920 p.family = AF_INET;
1921 p.prefix = nbr_nbma->addr;
1922 p.prefixlen = IPV4_MAX_BITLEN;
1923
1924 rn = route_node_lookup(ospf->nbr_nbma, (struct prefix *)&p);
1925 if (rn) {
1926 ospf_nbr_nbma_free(rn->info);
1927 rn->info = NULL;
1928 route_unlock_node(rn);
1929 route_unlock_node(rn);
1930 }
1931 }
1932
1933 static void ospf_nbr_nbma_down(struct ospf_nbr_nbma *nbr_nbma)
1934 {
1935 THREAD_OFF(nbr_nbma->t_poll);
1936
1937 if (nbr_nbma->nbr) {
1938 nbr_nbma->nbr->nbr_nbma = NULL;
1939 OSPF_NSM_EVENT_EXECUTE(nbr_nbma->nbr, NSM_KillNbr);
1940 }
1941
1942 if (nbr_nbma->oi)
1943 listnode_delete(nbr_nbma->oi->nbr_nbma, nbr_nbma);
1944 }
1945
1946 static void ospf_nbr_nbma_add(struct ospf_nbr_nbma *nbr_nbma,
1947 struct ospf_interface *oi)
1948 {
1949 struct ospf_neighbor *nbr;
1950 struct route_node *rn;
1951 struct prefix p;
1952
1953 if (oi->type != OSPF_IFTYPE_NBMA)
1954 return;
1955
1956 if (nbr_nbma->nbr != NULL)
1957 return;
1958
1959 if (IPV4_ADDR_SAME(&oi->nbr_self->address.u.prefix4, &nbr_nbma->addr))
1960 return;
1961
1962 nbr_nbma->oi = oi;
1963 listnode_add(oi->nbr_nbma, nbr_nbma);
1964
1965 /* Get neighbor information from table. */
1966 p.family = AF_INET;
1967 p.prefixlen = IPV4_MAX_BITLEN;
1968 p.u.prefix4 = nbr_nbma->addr;
1969
1970 rn = route_node_get(oi->nbrs, &p);
1971 if (rn->info) {
1972 nbr = rn->info;
1973 nbr->nbr_nbma = nbr_nbma;
1974 nbr_nbma->nbr = nbr;
1975
1976 route_unlock_node(rn);
1977 } else {
1978 nbr = rn->info = ospf_nbr_new(oi);
1979 nbr->state = NSM_Down;
1980 nbr->src = nbr_nbma->addr;
1981 nbr->nbr_nbma = nbr_nbma;
1982 nbr->priority = nbr_nbma->priority;
1983 nbr->address = p;
1984
1985 nbr_nbma->nbr = nbr;
1986
1987 /* Configure BFD if interface has it. */
1988 ospf_neighbor_bfd_apply(nbr);
1989
1990 OSPF_NSM_EVENT_EXECUTE(nbr, NSM_Start);
1991 }
1992 }
1993
1994 void ospf_nbr_nbma_if_update(struct ospf *ospf, struct ospf_interface *oi)
1995 {
1996 struct ospf_nbr_nbma *nbr_nbma;
1997 struct route_node *rn;
1998 struct prefix_ipv4 p;
1999
2000 if (oi->type != OSPF_IFTYPE_NBMA)
2001 return;
2002
2003 for (rn = route_top(ospf->nbr_nbma); rn; rn = route_next(rn))
2004 if ((nbr_nbma = rn->info))
2005 if (nbr_nbma->oi == NULL && nbr_nbma->nbr == NULL) {
2006 p.family = AF_INET;
2007 p.prefix = nbr_nbma->addr;
2008 p.prefixlen = IPV4_MAX_BITLEN;
2009
2010 if (prefix_match(oi->address,
2011 (struct prefix *)&p))
2012 ospf_nbr_nbma_add(nbr_nbma, oi);
2013 }
2014 }
2015
2016 struct ospf_nbr_nbma *ospf_nbr_nbma_lookup(struct ospf *ospf,
2017 struct in_addr nbr_addr)
2018 {
2019 struct route_node *rn;
2020 struct prefix_ipv4 p;
2021
2022 p.family = AF_INET;
2023 p.prefix = nbr_addr;
2024 p.prefixlen = IPV4_MAX_BITLEN;
2025
2026 rn = route_node_lookup(ospf->nbr_nbma, (struct prefix *)&p);
2027 if (rn) {
2028 route_unlock_node(rn);
2029 return rn->info;
2030 }
2031 return NULL;
2032 }
2033
2034 int ospf_nbr_nbma_set(struct ospf *ospf, struct in_addr nbr_addr)
2035 {
2036 struct ospf_nbr_nbma *nbr_nbma;
2037 struct ospf_interface *oi;
2038 struct prefix_ipv4 p;
2039 struct route_node *rn;
2040 struct listnode *node;
2041
2042 nbr_nbma = ospf_nbr_nbma_lookup(ospf, nbr_addr);
2043 if (nbr_nbma)
2044 return 0;
2045
2046 nbr_nbma = ospf_nbr_nbma_new();
2047 nbr_nbma->addr = nbr_addr;
2048
2049 p.family = AF_INET;
2050 p.prefix = nbr_addr;
2051 p.prefixlen = IPV4_MAX_BITLEN;
2052
2053 rn = route_node_get(ospf->nbr_nbma, (struct prefix *)&p);
2054 if (rn->info)
2055 route_unlock_node(rn);
2056 rn->info = nbr_nbma;
2057
2058 for (ALL_LIST_ELEMENTS_RO(ospf->oiflist, node, oi)) {
2059 if (oi->type == OSPF_IFTYPE_NBMA)
2060 if (prefix_match(oi->address, (struct prefix *)&p)) {
2061 ospf_nbr_nbma_add(nbr_nbma, oi);
2062 break;
2063 }
2064 }
2065
2066 return 1;
2067 }
2068
2069 int ospf_nbr_nbma_unset(struct ospf *ospf, struct in_addr nbr_addr)
2070 {
2071 struct ospf_nbr_nbma *nbr_nbma;
2072
2073 nbr_nbma = ospf_nbr_nbma_lookup(ospf, nbr_addr);
2074 if (nbr_nbma == NULL)
2075 return 0;
2076
2077 ospf_nbr_nbma_down(nbr_nbma);
2078 ospf_nbr_nbma_delete(ospf, nbr_nbma);
2079
2080 return 1;
2081 }
2082
2083 int ospf_nbr_nbma_priority_set(struct ospf *ospf, struct in_addr nbr_addr,
2084 uint8_t priority)
2085 {
2086 struct ospf_nbr_nbma *nbr_nbma;
2087
2088 nbr_nbma = ospf_nbr_nbma_lookup(ospf, nbr_addr);
2089 if (nbr_nbma == NULL)
2090 return 0;
2091
2092 if (nbr_nbma->priority != priority)
2093 nbr_nbma->priority = priority;
2094
2095 return 1;
2096 }
2097
2098 int ospf_nbr_nbma_priority_unset(struct ospf *ospf, struct in_addr nbr_addr)
2099 {
2100 struct ospf_nbr_nbma *nbr_nbma;
2101
2102 nbr_nbma = ospf_nbr_nbma_lookup(ospf, nbr_addr);
2103 if (nbr_nbma == NULL)
2104 return 0;
2105
2106 if (nbr_nbma != OSPF_NEIGHBOR_PRIORITY_DEFAULT)
2107 nbr_nbma->priority = OSPF_NEIGHBOR_PRIORITY_DEFAULT;
2108
2109 return 1;
2110 }
2111
2112 int ospf_nbr_nbma_poll_interval_set(struct ospf *ospf, struct in_addr nbr_addr,
2113 unsigned int interval)
2114 {
2115 struct ospf_nbr_nbma *nbr_nbma;
2116
2117 nbr_nbma = ospf_nbr_nbma_lookup(ospf, nbr_addr);
2118 if (nbr_nbma == NULL)
2119 return 0;
2120
2121 if (nbr_nbma->v_poll != interval) {
2122 nbr_nbma->v_poll = interval;
2123 if (nbr_nbma->oi && ospf_if_is_up(nbr_nbma->oi)) {
2124 THREAD_OFF(nbr_nbma->t_poll);
2125 OSPF_POLL_TIMER_ON(nbr_nbma->t_poll, ospf_poll_timer,
2126 nbr_nbma->v_poll);
2127 }
2128 }
2129
2130 return 1;
2131 }
2132
2133 int ospf_nbr_nbma_poll_interval_unset(struct ospf *ospf, struct in_addr addr)
2134 {
2135 struct ospf_nbr_nbma *nbr_nbma;
2136
2137 nbr_nbma = ospf_nbr_nbma_lookup(ospf, addr);
2138 if (nbr_nbma == NULL)
2139 return 0;
2140
2141 if (nbr_nbma->v_poll != OSPF_POLL_INTERVAL_DEFAULT)
2142 nbr_nbma->v_poll = OSPF_POLL_INTERVAL_DEFAULT;
2143
2144 return 1;
2145 }
2146
2147 void ospf_master_init(struct thread_master *master)
2148 {
2149 memset(&ospf_master, 0, sizeof(ospf_master));
2150
2151 om = &ospf_master;
2152 om->ospf = list_new();
2153 om->master = master;
2154 }
2155
2156 /* Link OSPF instance to VRF. */
2157 void ospf_vrf_link(struct ospf *ospf, struct vrf *vrf)
2158 {
2159 ospf->vrf_id = vrf->vrf_id;
2160 if (vrf->info != (void *)ospf)
2161 vrf->info = (void *)ospf;
2162 }
2163
2164 /* Unlink OSPF instance from VRF. */
2165 void ospf_vrf_unlink(struct ospf *ospf, struct vrf *vrf)
2166 {
2167 if (vrf->info == (void *)ospf)
2168 vrf->info = NULL;
2169 ospf->vrf_id = VRF_UNKNOWN;
2170 }
2171
2172 /* This is hook function for vrf create called as part of vrf_init */
2173 static int ospf_vrf_new(struct vrf *vrf)
2174 {
2175 if (IS_DEBUG_OSPF_EVENT)
2176 zlog_debug("%s: VRF Created: %s(%u)", __func__, vrf->name,
2177 vrf->vrf_id);
2178
2179 return 0;
2180 }
2181
2182 /* This is hook function for vrf delete call as part of vrf_init */
2183 static int ospf_vrf_delete(struct vrf *vrf)
2184 {
2185 if (IS_DEBUG_OSPF_EVENT)
2186 zlog_debug("%s: VRF Deletion: %s(%u)", __func__, vrf->name,
2187 vrf->vrf_id);
2188
2189 return 0;
2190 }
2191
2192 static void ospf_set_redist_vrf_bitmaps(struct ospf *ospf, bool set)
2193 {
2194 int type;
2195 struct list *red_list;
2196
2197 for (type = 0; type < ZEBRA_ROUTE_MAX; type++) {
2198 red_list = ospf->redist[type];
2199 if (!red_list)
2200 continue;
2201 if (IS_DEBUG_OSPF_EVENT)
2202 zlog_debug(
2203 "%s: setting redist vrf %d bitmap for type %d",
2204 __func__, ospf->vrf_id, type);
2205 if (set)
2206 vrf_bitmap_set(zclient->redist[AFI_IP][type],
2207 ospf->vrf_id);
2208 else
2209 vrf_bitmap_unset(zclient->redist[AFI_IP][type],
2210 ospf->vrf_id);
2211 }
2212
2213 red_list = ospf->redist[DEFAULT_ROUTE];
2214 if (red_list) {
2215 if (set)
2216 vrf_bitmap_set(zclient->default_information[AFI_IP],
2217 ospf->vrf_id);
2218 else
2219 vrf_bitmap_unset(zclient->default_information[AFI_IP],
2220 ospf->vrf_id);
2221 }
2222 }
2223
2224 /* Enable OSPF VRF instance */
2225 static int ospf_vrf_enable(struct vrf *vrf)
2226 {
2227 struct ospf *ospf = NULL;
2228 vrf_id_t old_vrf_id;
2229 int ret = 0;
2230
2231 if (IS_DEBUG_OSPF_EVENT)
2232 zlog_debug("%s: VRF %s id %u enabled", __func__, vrf->name,
2233 vrf->vrf_id);
2234
2235 ospf = ospf_lookup_by_name(vrf->name);
2236 if (ospf) {
2237 old_vrf_id = ospf->vrf_id;
2238 /* We have instance configured, link to VRF and make it "up". */
2239 ospf_vrf_link(ospf, vrf);
2240 if (IS_DEBUG_OSPF_EVENT)
2241 zlog_debug(
2242 "%s: ospf linked to vrf %s vrf_id %u (old id %u)",
2243 __func__, vrf->name, ospf->vrf_id, old_vrf_id);
2244
2245 if (old_vrf_id != ospf->vrf_id) {
2246 ospf_set_redist_vrf_bitmaps(ospf, true);
2247
2248 /* start zebra redist to us for new vrf */
2249 ospf_zebra_vrf_register(ospf);
2250
2251 ret = ospf_sock_init(ospf);
2252 if (ret < 0 || ospf->fd <= 0)
2253 return 0;
2254 thread_add_read(master, ospf_read, ospf, ospf->fd,
2255 &ospf->t_read);
2256 ospf->oi_running = 1;
2257 ospf_router_id_update(ospf);
2258 }
2259 }
2260
2261 return 0;
2262 }
2263
2264 /* Disable OSPF VRF instance */
2265 static int ospf_vrf_disable(struct vrf *vrf)
2266 {
2267 struct ospf *ospf = NULL;
2268 vrf_id_t old_vrf_id = VRF_UNKNOWN;
2269
2270 if (vrf->vrf_id == VRF_DEFAULT)
2271 return 0;
2272
2273 if (IS_DEBUG_OSPF_EVENT)
2274 zlog_debug("%s: VRF %s id %d disabled.", __func__, vrf->name,
2275 vrf->vrf_id);
2276
2277 ospf = ospf_lookup_by_name(vrf->name);
2278 if (ospf) {
2279 old_vrf_id = ospf->vrf_id;
2280
2281 ospf_zebra_vrf_deregister(ospf);
2282
2283 ospf_set_redist_vrf_bitmaps(ospf, false);
2284
2285 /* We have instance configured, unlink
2286 * from VRF and make it "down".
2287 */
2288 ospf_vrf_unlink(ospf, vrf);
2289 ospf->oi_running = 0;
2290 if (IS_DEBUG_OSPF_EVENT)
2291 zlog_debug("%s: ospf old_vrf_id %d unlinked", __func__,
2292 old_vrf_id);
2293 THREAD_OFF(ospf->t_read);
2294 close(ospf->fd);
2295 ospf->fd = -1;
2296 }
2297
2298 /* Note: This is a callback, the VRF will be deleted by the caller. */
2299 return 0;
2300 }
2301
2302 void ospf_vrf_init(void)
2303 {
2304 vrf_init(ospf_vrf_new, ospf_vrf_enable, ospf_vrf_disable,
2305 ospf_vrf_delete);
2306 }
2307
2308 void ospf_vrf_terminate(void)
2309 {
2310 vrf_terminate();
2311 }
2312
2313 const char *ospf_vrf_id_to_name(vrf_id_t vrf_id)
2314 {
2315 struct vrf *vrf = vrf_lookup_by_id(vrf_id);
2316
2317 return vrf ? vrf->name : "NIL";
2318 }
2319
2320 const char *ospf_get_name(const struct ospf *ospf)
2321 {
2322 if (ospf->name)
2323 return ospf->name;
2324 else
2325 return VRF_DEFAULT_NAME;
2326 }