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