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