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