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