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