1 /* OSPF version 2 daemon program.
2 Copyright (C) 1999, 2000 Toshiaki Takada
3
4 This file is part of GNU Zebra.
5
6 GNU Zebra is free software; you can redistribute it and/or modify it
7 under the terms of the GNU General Public License as published by the
8 Free Software Foundation; either version 2, or (at your option) any
9 later version.
10
11 GNU Zebra is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GNU Zebra; see the file COPYING. If not, write to the Free
18 Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
19 02111-1307, USA. */
20
21 #include <zebra.h>
22
23 #include "thread.h"
24 #include "vty.h"
25 #include "command.h"
26 #include "linklist.h"
27 #include "prefix.h"
28 #include "table.h"
29 #include "if.h"
30 #include "memory.h"
31 #include "stream.h"
32 #include "log.h"
33 #include "sockunion.h" /* for inet_aton () */
34 #include "zclient.h"
35 #include "plist.h"
36 #include "sockopt.h"
37
38 #include "ospfd/ospfd.h"
39 #include "ospfd/ospf_network.h"
40 #include "ospfd/ospf_interface.h"
41 #include "ospfd/ospf_ism.h"
42 #include "ospfd/ospf_asbr.h"
43 #include "ospfd/ospf_lsa.h"
44 #include "ospfd/ospf_lsdb.h"
45 #include "ospfd/ospf_neighbor.h"
46 #include "ospfd/ospf_nsm.h"
47 #include "ospfd/ospf_spf.h"
48 #include "ospfd/ospf_packet.h"
49 #include "ospfd/ospf_dump.h"
50 #include "ospfd/ospf_zebra.h"
51 #include "ospfd/ospf_abr.h"
52 #include "ospfd/ospf_flood.h"
53 #include "ospfd/ospf_route.h"
54 #include "ospfd/ospf_ase.h"
55
56
57
58 /* OSPF process wide configuration. */
59 static struct ospf_master ospf_master;
60
61 /* OSPF process wide configuration pointer to export. */
62 struct ospf_master *om;
63
64 extern struct zclient *zclient;
65 extern struct in_addr router_id_zebra;
66
67
68 static void ospf_remove_vls_through_area (struct ospf *, struct ospf_area *);
69 static void ospf_network_free (struct ospf *, struct ospf_network *);
70 static void ospf_area_free (struct ospf_area *);
71 static void ospf_network_run (struct prefix *, struct ospf_area *);
72 static void ospf_network_run_interface (struct ospf *, struct interface *,
73 struct prefix *, struct ospf_area *);
74 static void ospf_network_run_subnet (struct ospf *, struct connected *,
75 struct prefix *, struct ospf_area *);
76 static int ospf_network_match_iface (const struct connected *,
77 const struct prefix *);
78 static void ospf_finish_final (struct ospf *);
79
80 #define OSPF_EXTERNAL_LSA_ORIGINATE_DELAY 1
81
82 void
ospf_router_id_update(struct ospf * ospf)83 ospf_router_id_update (struct ospf *ospf)
84 {
85 struct in_addr router_id, router_id_old;
86 struct ospf_interface *oi;
87 struct interface *ifp;
88 struct listnode *node;
89
90 if (IS_DEBUG_OSPF_EVENT)
91 zlog_debug ("Router-ID[OLD:%s]: Update", inet_ntoa (ospf->router_id));
92
93 router_id_old = ospf->router_id;
94
95 /* Select the router ID based on these priorities:
96 1. Statically assigned router ID is always the first choice.
97 2. If there is no statically assigned router ID, then try to stick
98 with the most recent value, since changing router ID's is very
99 disruptive.
100 3. Last choice: just go with whatever the zebra daemon recommends.
101 */
102 if (ospf->router_id_static.s_addr != 0)
103 router_id = ospf->router_id_static;
104 else if (ospf->router_id.s_addr != 0)
105 router_id = ospf->router_id;
106 else
107 router_id = router_id_zebra;
108
109 ospf->router_id = router_id;
110
111 if (IS_DEBUG_OSPF_EVENT)
112 zlog_debug ("Router-ID[NEW:%s]: Update", inet_ntoa (ospf->router_id));
113
114 if (!IPV4_ADDR_SAME (&router_id_old, &router_id))
115 {
116 for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
117 {
118 /* Some nbrs are identified by router_id, these needs
119 * to be rebuilt. Possible optimization would be to do
120 * oi->nbr_self->router_id = router_id for
121 * !(virtual | ptop) links
122 */
123 ospf_nbr_self_reset (oi);
124 }
125
126 /* If AS-external-LSA is queued, then flush those LSAs. */
127 if (router_id_old.s_addr == 0 && ospf->external_origin)
128 {
129 int type;
130 /* Originate each redistributed external route. */
131 for (type = 0; type < ZEBRA_ROUTE_MAX; type++)
132 if (ospf->external_origin & (1 << type))
133 thread_add_event (master, ospf_external_lsa_originate_timer,
134 ospf, type);
135 /* Originate Deafult. */
136 if (ospf->external_origin & (1 << ZEBRA_ROUTE_MAX))
137 thread_add_event (master, ospf_default_originate_timer, ospf, 0);
138
139 ospf->external_origin = 0;
140 }
141
142 /* update router-lsa's for each area */
143 ospf_router_lsa_update (ospf);
144
145 /* update ospf_interface's */
146 for (ALL_LIST_ELEMENTS_RO (om->iflist, node, ifp))
147 ospf_if_update (ospf, ifp);
148 }
149 }
150
151 /* For OSPF area sort by area id. */
152 static int
ospf_area_id_cmp(struct ospf_area * a1,struct ospf_area * a2)153 ospf_area_id_cmp (struct ospf_area *a1, struct ospf_area *a2)
154 {
155 if (ntohl (a1->area_id.s_addr) > ntohl (a2->area_id.s_addr))
156 return 1;
157 if (ntohl (a1->area_id.s_addr) < ntohl (a2->area_id.s_addr))
158 return -1;
159 return 0;
160 }
161
162 /* Allocate new ospf structure. */
163 static struct ospf *
ospf_new(void)164 ospf_new (void)
165 {
166 int i;
167
168 struct ospf *new = XCALLOC (MTYPE_OSPF_TOP, sizeof (struct ospf));
169
170 new->router_id.s_addr = htonl (0);
171 new->router_id_static.s_addr = htonl (0);
172
173 new->abr_type = OSPF_ABR_DEFAULT;
174 new->oiflist = list_new ();
175 new->vlinks = list_new ();
176 new->areas = list_new ();
177 new->areas->cmp = (int (*)(void *, void *)) ospf_area_id_cmp;
178 new->networks = route_table_init ();
179 new->nbr_nbma = route_table_init ();
180
181 new->lsdb = ospf_lsdb_new ();
182
183 new->default_originate = DEFAULT_ORIGINATE_NONE;
184
185 new->passive_interface_default = OSPF_IF_ACTIVE;
186
187 new->new_external_route = route_table_init ();
188 new->old_external_route = route_table_init ();
189 new->external_lsas = route_table_init ();
190
191 new->stub_router_startup_time = OSPF_STUB_ROUTER_UNCONFIGURED;
192 new->stub_router_shutdown_time = OSPF_STUB_ROUTER_UNCONFIGURED;
193 new->stub_router_admin_set = OSPF_STUB_ROUTER_ADMINISTRATIVE_UNSET;
194
195 /* Distribute parameter init. */
196 for (i = 0; i <= ZEBRA_ROUTE_MAX; i++)
197 {
198 new->dmetric[i].type = -1;
199 new->dmetric[i].value = -1;
200 new->dtag[i] = 0;
201 }
202 new->default_metric = -1;
203 new->ref_bandwidth = OSPF_DEFAULT_REF_BANDWIDTH;
204
205 /* LSA timers */
206 new->min_ls_interval = OSPF_MIN_LS_INTERVAL;
207 new->min_ls_arrival = OSPF_MIN_LS_ARRIVAL;
208
209 /* SPF timer value init. */
210 new->spf_delay = OSPF_SPF_DELAY_DEFAULT;
211 new->spf_holdtime = OSPF_SPF_HOLDTIME_DEFAULT;
212 new->spf_max_holdtime = OSPF_SPF_MAX_HOLDTIME_DEFAULT;
213 new->spf_hold_multiplier = 1;
214
215 /* MaxAge init. */
216 new->maxage_delay = OSPF_LSA_MAXAGE_REMOVE_DELAY_DEFAULT;
217 new->maxage_lsa = route_table_init();
218 new->t_maxage_walker =
219 thread_add_timer (master, ospf_lsa_maxage_walker,
220 new, OSPF_LSA_MAXAGE_CHECK_INTERVAL);
221
222 /* Distance table init. */
223 new->distance_table = route_table_init ();
224
225 new->lsa_refresh_queue.index = 0;
226 new->lsa_refresh_interval = OSPF_LSA_REFRESH_INTERVAL_DEFAULT;
227 new->t_lsa_refresher = thread_add_timer (master, ospf_lsa_refresh_walker,
228 new, new->lsa_refresh_interval);
229 new->lsa_refresher_started = quagga_time (NULL);
230
231 if ((new->fd = ospf_sock_init()) < 0)
232 {
233 zlog_err("ospf_new: fatal error: ospf_sock_init was unable to open "
234 "a socket");
235 exit(1);
236 }
237 new->maxsndbuflen = getsockopt_so_sendbuf (new->fd);
238 if (IS_DEBUG_OSPF (zebra, ZEBRA_INTERFACE))
239 zlog_debug ("%s: starting with OSPF send buffer size %u",
240 __func__, new->maxsndbuflen);
241 if ((new->ibuf = stream_new(OSPF_MAX_PACKET_SIZE+1)) == NULL)
242 {
243 zlog_err("ospf_new: fatal error: stream_new(%u) failed allocating ibuf",
244 OSPF_MAX_PACKET_SIZE+1);
245 exit(1);
246 }
247 new->t_read = thread_add_read (master, ospf_read, new, new->fd);
248 new->oi_write_q = list_new ();
249
250 return new;
251 }
252
253 struct ospf *
ospf_lookup()254 ospf_lookup ()
255 {
256 if (listcount (om->ospf) == 0)
257 return NULL;
258
259 return listgetdata ((struct listnode *)listhead (om->ospf));
260 }
261
262 static int
ospf_is_ready(struct ospf * ospf)263 ospf_is_ready (struct ospf *ospf)
264 {
265 /* OSPF must be on and Router-ID must be configured. */
266 if (!ospf || ospf->router_id.s_addr == 0)
267 return 0;
268
269 return 1;
270 }
271
272 static void
ospf_add(struct ospf * ospf)273 ospf_add (struct ospf *ospf)
274 {
275 listnode_add (om->ospf, ospf);
276 }
277
278 static void
ospf_delete(struct ospf * ospf)279 ospf_delete (struct ospf *ospf)
280 {
281 listnode_delete (om->ospf, ospf);
282 }
283
284 struct ospf *
ospf_get()285 ospf_get ()
286 {
287 struct ospf *ospf;
288
289 ospf = ospf_lookup ();
290 if (ospf == NULL)
291 {
292 ospf = ospf_new ();
293 ospf_add (ospf);
294
295 if (ospf->router_id_static.s_addr == 0)
296 ospf_router_id_update (ospf);
297
298 ospf_opaque_type11_lsa_init (ospf);
299 }
300
301 return ospf;
302 }
303
304 /* Handle the second half of deferred shutdown. This is called either
305 * from the deferred-shutdown timer thread, or directly through
306 * ospf_deferred_shutdown_check.
307 *
308 * Function is to cleanup G-R state, if required then call ospf_finish_final
309 * to complete shutdown of this ospf instance. Possibly exit if the
310 * whole process is being shutdown and this was the last OSPF instance.
311 */
312 static void
ospf_deferred_shutdown_finish(struct ospf * ospf)313 ospf_deferred_shutdown_finish (struct ospf *ospf)
314 {
315 ospf->stub_router_shutdown_time = OSPF_STUB_ROUTER_UNCONFIGURED;
316 OSPF_TIMER_OFF (ospf->t_deferred_shutdown);
317
318 ospf_finish_final (ospf);
319
320 /* *ospf is now invalid */
321
322 /* ospfd being shut-down? If so, was this the last ospf instance? */
323 if (CHECK_FLAG (om->options, OSPF_MASTER_SHUTDOWN)
324 && (listcount (om->ospf) == 0))
325 exit (0);
326
327 return;
328 }
329
330 /* Timer thread for G-R */
331 static int
ospf_deferred_shutdown_timer(struct thread * t)332 ospf_deferred_shutdown_timer (struct thread *t)
333 {
334 struct ospf *ospf = THREAD_ARG(t);
335
336 ospf_deferred_shutdown_finish (ospf);
337
338 return 0;
339 }
340
341 /* Check whether deferred-shutdown must be scheduled, otherwise call
342 * down directly into second-half of instance shutdown.
343 */
344 static void
ospf_deferred_shutdown_check(struct ospf * ospf)345 ospf_deferred_shutdown_check (struct ospf *ospf)
346 {
347 unsigned long timeout;
348 struct listnode *ln;
349 struct ospf_area *area;
350
351 /* deferred shutdown already running? */
352 if (ospf->t_deferred_shutdown)
353 return;
354
355 /* Should we try push out max-metric LSAs? */
356 if (ospf->stub_router_shutdown_time != OSPF_STUB_ROUTER_UNCONFIGURED)
357 {
358 for (ALL_LIST_ELEMENTS_RO (ospf->areas, ln, area))
359 {
360 SET_FLAG (area->stub_router_state, OSPF_AREA_ADMIN_STUB_ROUTED);
361
362 if (!CHECK_FLAG (area->stub_router_state, OSPF_AREA_IS_STUB_ROUTED))
363 ospf_router_lsa_update_area (area);
364 }
365 timeout = ospf->stub_router_shutdown_time;
366 }
367 else
368 {
369 /* No timer needed */
370 ospf_deferred_shutdown_finish (ospf);
371 return;
372 }
373
374 OSPF_TIMER_ON (ospf->t_deferred_shutdown, ospf_deferred_shutdown_timer,
375 timeout);
376 return;
377 }
378
379 /* Shut down the entire process */
380 void
ospf_terminate(void)381 ospf_terminate (void)
382 {
383 struct ospf *ospf;
384 struct listnode *node, *nnode;
385
386 /* shutdown already in progress */
387 if (CHECK_FLAG (om->options, OSPF_MASTER_SHUTDOWN))
388 return;
389
390 SET_FLAG (om->options, OSPF_MASTER_SHUTDOWN);
391
392 /* exit immediately if OSPF not actually running */
393 if (listcount(om->ospf) == 0)
394 exit(0);
395
396 for (ALL_LIST_ELEMENTS (om->ospf, node, nnode, ospf))
397 ospf_finish (ospf);
398
399 /* Deliberately go back up, hopefully to thread scheduler, as
400 * One or more ospf_finish()'s may have deferred shutdown to a timer
401 * thread
402 */
403 }
404
405 void
ospf_finish(struct ospf * ospf)406 ospf_finish (struct ospf *ospf)
407 {
408 /* let deferred shutdown decide */
409 ospf_deferred_shutdown_check (ospf);
410
411 /* if ospf_deferred_shutdown returns, then ospf_finish_final is
412 * deferred to expiry of G-S timer thread. Return back up, hopefully
413 * to thread scheduler.
414 */
415 return;
416 }
417
418 /* Final cleanup of ospf instance */
419 static void
ospf_finish_final(struct ospf * ospf)420 ospf_finish_final (struct ospf *ospf)
421 {
422 struct route_node *rn;
423 struct ospf_nbr_nbma *nbr_nbma;
424 struct ospf_lsa *lsa;
425 struct ospf_interface *oi;
426 struct ospf_area *area;
427 struct ospf_vl_data *vl_data;
428 struct listnode *node, *nnode;
429 int i;
430
431 ospf_opaque_type11_lsa_term (ospf);
432
433 /* be nice if this worked, but it doesn't */
434 /*ospf_flush_self_originated_lsas_now (ospf);*/
435
436 /* Unregister redistribution */
437 for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
438 ospf_redistribute_unset (ospf, i);
439 ospf_redistribute_default_unset (ospf);
440
441 for (ALL_LIST_ELEMENTS (ospf->areas, node, nnode, area))
442 ospf_remove_vls_through_area (ospf, area);
443
444 for (ALL_LIST_ELEMENTS (ospf->vlinks, node, nnode, vl_data))
445 ospf_vl_delete (ospf, vl_data);
446
447 list_delete (ospf->vlinks);
448
449 /* Reset interface. */
450 for (ALL_LIST_ELEMENTS (ospf->oiflist, node, nnode, oi))
451 ospf_if_free (oi);
452
453 /* Clear static neighbors */
454 for (rn = route_top (ospf->nbr_nbma); rn; rn = route_next (rn))
455 if ((nbr_nbma = rn->info))
456 {
457 OSPF_POLL_TIMER_OFF (nbr_nbma->t_poll);
458
459 if (nbr_nbma->nbr)
460 {
461 nbr_nbma->nbr->nbr_nbma = NULL;
462 nbr_nbma->nbr = NULL;
463 }
464
465 if (nbr_nbma->oi)
466 {
467 listnode_delete (nbr_nbma->oi->nbr_nbma, nbr_nbma);
468 nbr_nbma->oi = NULL;
469 }
470
471 XFREE (MTYPE_OSPF_NEIGHBOR_STATIC, nbr_nbma);
472 }
473
474 route_table_finish (ospf->nbr_nbma);
475
476 /* Clear networks and Areas. */
477 for (rn = route_top (ospf->networks); rn; rn = route_next (rn))
478 {
479 struct ospf_network *network;
480
481 if ((network = rn->info) != NULL)
482 {
483 ospf_network_free (ospf, network);
484 rn->info = NULL;
485 route_unlock_node (rn);
486 }
487 }
488
489 for (ALL_LIST_ELEMENTS (ospf->areas, node, nnode, area))
490 {
491 listnode_delete (ospf->areas, area);
492 ospf_area_free (area);
493 }
494
495 /* Cancel all timers. */
496 OSPF_TIMER_OFF (ospf->t_external_lsa);
497 OSPF_TIMER_OFF (ospf->t_spf_calc);
498 OSPF_TIMER_OFF (ospf->t_ase_calc);
499 OSPF_TIMER_OFF (ospf->t_maxage);
500 OSPF_TIMER_OFF (ospf->t_maxage_walker);
501 OSPF_TIMER_OFF (ospf->t_abr_task);
502 OSPF_TIMER_OFF (ospf->t_asbr_check);
503 OSPF_TIMER_OFF (ospf->t_distribute_update);
504 OSPF_TIMER_OFF (ospf->t_lsa_refresher);
505 OSPF_TIMER_OFF (ospf->t_read);
506 OSPF_TIMER_OFF (ospf->t_write);
507 OSPF_TIMER_OFF (ospf->t_opaque_lsa_self);
508
509 close (ospf->fd);
510 stream_free(ospf->ibuf);
511
512 LSDB_LOOP (OPAQUE_AS_LSDB (ospf), rn, lsa)
513 ospf_discard_from_db (ospf, ospf->lsdb, lsa);
514 LSDB_LOOP (EXTERNAL_LSDB (ospf), rn, lsa)
515 ospf_discard_from_db (ospf, ospf->lsdb, lsa);
516
517 ospf_lsdb_delete_all (ospf->lsdb);
518 ospf_lsdb_free (ospf->lsdb);
519
520 for (rn = route_top (ospf->maxage_lsa); rn; rn = route_next (rn))
521 {
522 struct ospf_lsa *lsa;
523
524 if ((lsa = rn->info) != NULL)
525 {
526 ospf_lsa_unlock (&lsa);
527 rn->info = NULL;
528 }
529 route_unlock_node (rn);
530 }
531 route_table_finish (ospf->maxage_lsa);
532
533 if (ospf->old_table)
534 ospf_route_table_free (ospf->old_table);
535 if (ospf->new_table)
536 {
537 ospf_route_delete (ospf->new_table);
538 ospf_route_table_free (ospf->new_table);
539 }
540 if (ospf->old_rtrs)
541 ospf_rtrs_free (ospf->old_rtrs);
542 if (ospf->new_rtrs)
543 ospf_rtrs_free (ospf->new_rtrs);
544 if (ospf->new_external_route)
545 {
546 ospf_route_delete (ospf->new_external_route);
547 ospf_route_table_free (ospf->new_external_route);
548 }
549 if (ospf->old_external_route)
550 {
551 ospf_route_delete (ospf->old_external_route);
552 ospf_route_table_free (ospf->old_external_route);
553 }
554 if (ospf->external_lsas)
555 {
556 ospf_ase_external_lsas_finish (ospf->external_lsas);
557 }
558
559 list_delete (ospf->areas);
560
561 for (i = ZEBRA_ROUTE_SYSTEM; i <= ZEBRA_ROUTE_MAX; i++)
562 if (EXTERNAL_INFO (i) != NULL)
563 for (rn = route_top (EXTERNAL_INFO (i)); rn; rn = route_next (rn))
564 {
565 if (rn->info == NULL)
566 continue;
567
568 XFREE (MTYPE_OSPF_EXTERNAL_INFO, rn->info);
569 rn->info = NULL;
570 route_unlock_node (rn);
571 }
572
573 ospf_distance_reset (ospf);
574 route_table_finish (ospf->distance_table);
575
576 ospf_delete (ospf);
577
578 XFREE (MTYPE_OSPF_TOP, ospf);
579 }
580
581
582 /* allocate new OSPF Area object */
583 static struct ospf_area *
ospf_area_new(struct ospf * ospf,struct in_addr area_id)584 ospf_area_new (struct ospf *ospf, struct in_addr area_id)
585 {
586 struct ospf_area *new;
587
588 /* Allocate new config_network. */
589 new = XCALLOC (MTYPE_OSPF_AREA, sizeof (struct ospf_area));
590
591 new->ospf = ospf;
592
593 new->area_id = area_id;
594
595 new->external_routing = OSPF_AREA_DEFAULT;
596 new->default_cost = 1;
597 new->auth_type = OSPF_AUTH_NULL;
598
599 /* New LSDB init. */
600 new->lsdb = ospf_lsdb_new ();
601
602 /* Self-originated LSAs initialize. */
603 new->router_lsa_self = NULL;
604
605 ospf_opaque_type10_lsa_init (new);
606
607 new->oiflist = list_new ();
608 new->ranges = route_table_init ();
609
610 if (area_id.s_addr == OSPF_AREA_BACKBONE)
611 ospf->backbone = new;
612
613 return new;
614 }
615
616 static void
ospf_area_free(struct ospf_area * area)617 ospf_area_free (struct ospf_area *area)
618 {
619 struct route_node *rn;
620 struct ospf_lsa *lsa;
621
622 /* Free LSDBs. */
623 LSDB_LOOP (ROUTER_LSDB (area), rn, lsa)
624 ospf_discard_from_db (area->ospf, area->lsdb, lsa);
625 LSDB_LOOP (NETWORK_LSDB (area), rn, lsa)
626 ospf_discard_from_db (area->ospf, area->lsdb, lsa);
627 LSDB_LOOP (SUMMARY_LSDB (area), rn, lsa)
628 ospf_discard_from_db (area->ospf, area->lsdb, lsa);
629 LSDB_LOOP (ASBR_SUMMARY_LSDB (area), rn, lsa)
630 ospf_discard_from_db (area->ospf, area->lsdb, lsa);
631
632 LSDB_LOOP (NSSA_LSDB (area), rn, lsa)
633 ospf_discard_from_db (area->ospf, area->lsdb, lsa);
634 LSDB_LOOP (OPAQUE_AREA_LSDB (area), rn, lsa)
635 ospf_discard_from_db (area->ospf, area->lsdb, lsa);
636 LSDB_LOOP (OPAQUE_LINK_LSDB (area), rn, lsa)
637 ospf_discard_from_db (area->ospf, area->lsdb, lsa);
638
639 ospf_lsdb_delete_all (area->lsdb);
640 ospf_lsdb_free (area->lsdb);
641
642 ospf_lsa_unlock (&area->router_lsa_self);
643
644 route_table_finish (area->ranges);
645 list_delete (area->oiflist);
646
647 if (EXPORT_NAME (area))
648 free (EXPORT_NAME (area));
649
650 if (IMPORT_NAME (area))
651 free (IMPORT_NAME (area));
652
653 /* Cancel timer. */
654 OSPF_TIMER_OFF (area->t_stub_router);
655 OSPF_TIMER_OFF (area->t_opaque_lsa_self);
656
657 if (OSPF_IS_AREA_BACKBONE (area))
658 area->ospf->backbone = NULL;
659
660 XFREE (MTYPE_OSPF_AREA, area);
661 }
662
663 void
ospf_area_check_free(struct ospf * ospf,struct in_addr area_id)664 ospf_area_check_free (struct ospf *ospf, struct in_addr area_id)
665 {
666 struct ospf_area *area;
667
668 area = ospf_area_lookup_by_area_id (ospf, area_id);
669 if (area &&
670 listcount (area->oiflist) == 0 &&
671 area->ranges->top == NULL &&
672 area->shortcut_configured == OSPF_SHORTCUT_DEFAULT &&
673 area->external_routing == OSPF_AREA_DEFAULT &&
674 area->no_summary == 0 &&
675 area->default_cost == 1 &&
676 EXPORT_NAME (area) == NULL &&
677 IMPORT_NAME (area) == NULL &&
678 area->auth_type == OSPF_AUTH_NULL)
679 {
680 listnode_delete (ospf->areas, area);
681 ospf_area_free (area);
682 }
683 }
684
685 struct ospf_area *
ospf_area_get(struct ospf * ospf,struct in_addr area_id,int format)686 ospf_area_get (struct ospf *ospf, struct in_addr area_id, int format)
687 {
688 struct ospf_area *area;
689
690 area = ospf_area_lookup_by_area_id (ospf, area_id);
691 if (!area)
692 {
693 area = ospf_area_new (ospf, area_id);
694 area->format = format;
695 listnode_add_sort (ospf->areas, area);
696 ospf_check_abr_status (ospf);
697 if (ospf->stub_router_admin_set == OSPF_STUB_ROUTER_ADMINISTRATIVE_SET)
698 {
699 SET_FLAG (area->stub_router_state, OSPF_AREA_ADMIN_STUB_ROUTED);
700 }
701 }
702
703 return area;
704 }
705
706 struct ospf_area *
ospf_area_lookup_by_area_id(struct ospf * ospf,struct in_addr area_id)707 ospf_area_lookup_by_area_id (struct ospf *ospf, struct in_addr area_id)
708 {
709 struct ospf_area *area;
710 struct listnode *node;
711
712 for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
713 if (IPV4_ADDR_SAME (&area->area_id, &area_id))
714 return area;
715
716 return NULL;
717 }
718
719 void
ospf_area_add_if(struct ospf_area * area,struct ospf_interface * oi)720 ospf_area_add_if (struct ospf_area *area, struct ospf_interface *oi)
721 {
722 listnode_add (area->oiflist, oi);
723 }
724
725 void
ospf_area_del_if(struct ospf_area * area,struct ospf_interface * oi)726 ospf_area_del_if (struct ospf_area *area, struct ospf_interface *oi)
727 {
728 listnode_delete (area->oiflist, oi);
729 }
730
731
732 /* Config network statement related functions. */
733 static struct ospf_network *
ospf_network_new(struct in_addr area_id,int format)734 ospf_network_new (struct in_addr area_id, int format)
735 {
736 struct ospf_network *new;
737 new = XCALLOC (MTYPE_OSPF_NETWORK, sizeof (struct ospf_network));
738
739 new->area_id = area_id;
740 new->format = format;
741
742 return new;
743 }
744
745 static void
add_ospf_interface(struct connected * co,struct ospf_area * area)746 add_ospf_interface (struct connected *co, struct ospf_area *area)
747 {
748 struct ospf_interface *oi;
749
750 oi = ospf_if_new (area->ospf, co->ifp, co->address);
751 oi->connected = co;
752
753 oi->area = area;
754
755 oi->params = ospf_lookup_if_params (co->ifp, oi->address->u.prefix4);
756 oi->output_cost = ospf_if_get_output_cost (oi);
757
758 /* Relate ospf interface to ospf instance. */
759 oi->ospf = area->ospf;
760
761 /* update network type as interface flag */
762 /* If network type is specified previously,
763 skip network type setting. */
764 oi->type = IF_DEF_PARAMS (co->ifp)->type;
765
766 /* Add pseudo neighbor. */
767 ospf_nbr_self_reset (oi);
768
769 ospf_area_add_if (oi->area, oi);
770
771 /* if router_id is not configured, dont bring up
772 * interfaces.
773 * ospf_router_id_update() will call ospf_if_update
774 * whenever r-id is configured instead.
775 */
776 if ((area->ospf->router_id.s_addr != 0)
777 && if_is_operative (co->ifp))
778 ospf_if_up (oi);
779 }
780
781 static void
update_redistributed(struct ospf * ospf,int add_to_ospf)782 update_redistributed (struct ospf *ospf, int add_to_ospf)
783 {
784 struct route_node *rn;
785 struct external_info *ei;
786
787 if (ospf_is_type_redistributed (ZEBRA_ROUTE_CONNECT))
788 if (EXTERNAL_INFO (ZEBRA_ROUTE_CONNECT))
789 for (rn = route_top (EXTERNAL_INFO (ZEBRA_ROUTE_CONNECT));
790 rn; rn = route_next (rn))
791 if ((ei = rn->info) != NULL)
792 {
793 if (add_to_ospf)
794 {
795 if (ospf_external_info_find_lsa (ospf, &ei->p))
796 if (!ospf_distribute_check_connected (ospf, ei))
797 ospf_external_lsa_flush (ospf, ei->type, &ei->p,
798 ei->ifindex /*, ei->nexthop */);
799 }
800 else
801 {
802 if (!ospf_external_info_find_lsa (ospf, &ei->p))
803 if (ospf_distribute_check_connected (ospf, ei))
804 ospf_external_lsa_originate (ospf, ei);
805 }
806 }
807 }
808
809 static void
ospf_network_free(struct ospf * ospf,struct ospf_network * network)810 ospf_network_free (struct ospf *ospf, struct ospf_network *network)
811 {
812 ospf_area_check_free (ospf, network->area_id);
813 ospf_schedule_abr_task (ospf);
814 XFREE (MTYPE_OSPF_NETWORK, network);
815 }
816
817 int
ospf_network_set(struct ospf * ospf,struct prefix_ipv4 * p,struct in_addr area_id)818 ospf_network_set (struct ospf *ospf, struct prefix_ipv4 *p,
819 struct in_addr area_id)
820 {
821 struct ospf_network *network;
822 struct ospf_area *area;
823 struct route_node *rn;
824 int ret = OSPF_AREA_ID_FORMAT_ADDRESS;
825
826 rn = route_node_get (ospf->networks, (struct prefix *)p);
827 if (rn->info)
828 {
829 /* There is already same network statement. */
830 route_unlock_node (rn);
831 return 0;
832 }
833
834 rn->info = network = ospf_network_new (area_id, ret);
835 area = ospf_area_get (ospf, area_id, ret);
836
837 /* Run network config now. */
838 ospf_network_run ((struct prefix *)p, area);
839
840 /* Update connected redistribute. */
841 update_redistributed(ospf, 1);
842
843 ospf_area_check_free (ospf, area_id);
844
845 return 1;
846 }
847
848 int
ospf_network_unset(struct ospf * ospf,struct prefix_ipv4 * p,struct in_addr area_id)849 ospf_network_unset (struct ospf *ospf, struct prefix_ipv4 *p,
850 struct in_addr area_id)
851 {
852 struct route_node *rn;
853 struct ospf_network *network;
854 struct listnode *node, *nnode;
855 struct ospf_interface *oi;
856
857 rn = route_node_lookup (ospf->networks, (struct prefix *)p);
858 if (rn == NULL)
859 return 0;
860
861 network = rn->info;
862 route_unlock_node (rn);
863 if (!IPV4_ADDR_SAME (&area_id, &network->area_id))
864 return 0;
865
866 ospf_network_free (ospf, rn->info);
867 rn->info = NULL;
868 route_unlock_node (rn); /* initial reference */
869
870 /* Find interfaces that not configured already. */
871 for (ALL_LIST_ELEMENTS (ospf->oiflist, node, nnode, oi))
872 {
873 if (oi->type == OSPF_IFTYPE_VIRTUALLINK)
874 continue;
875
876 ospf_network_run_subnet (ospf, oi->connected, NULL, NULL);
877 }
878
879 /* Update connected redistribute. */
880 update_redistributed(ospf, 0);
881
882 ospf_area_check_free (ospf, area_id);
883
884 return 1;
885 }
886
887 /* Ensure there's an OSPF instance, as "ip ospf area" enabled OSPF means
888 * there might not be any 'router ospf' config.
889 *
890 * Otherwise, doesn't do anything different to ospf_if_update for now
891 */
892 void
ospf_interface_area_set(struct interface * ifp)893 ospf_interface_area_set (struct interface *ifp)
894 {
895 struct ospf *ospf = ospf_get();
896
897 ospf_if_update (ospf, ifp);
898 /* if_update does a update_redistributed */
899
900 return;
901 }
902
903 void
ospf_interface_area_unset(struct interface * ifp)904 ospf_interface_area_unset (struct interface *ifp)
905 {
906 struct route_node *rn_oi;
907 struct ospf *ospf;
908
909 if ((ospf = ospf_lookup ()) == NULL)
910 return; /* Ospf not ready yet */
911
912 /* Find interfaces that may need to be removed. */
913 for (rn_oi = route_top (IF_OIFS (ifp)); rn_oi; rn_oi = route_next (rn_oi))
914 {
915 struct ospf_interface *oi;
916
917 if ( (oi = rn_oi->info) == NULL)
918 continue;
919
920 if (oi->type == OSPF_IFTYPE_VIRTUALLINK)
921 continue;
922
923 ospf_network_run_subnet (ospf, oi->connected, NULL, NULL);
924 }
925
926 /* Update connected redistribute. */
927 update_redistributed (ospf, 0); /* interfaces possibly removed */
928
929 return;
930 }
931
932
933 /* Check whether interface matches given network
934 * returns: 1, true. 0, false
935 */
936 static int
ospf_network_match_iface(const struct connected * co,const struct prefix * net)937 ospf_network_match_iface(const struct connected *co, const struct prefix *net)
938 {
939 /* new approach: more elegant and conceptually clean */
940 return prefix_match(net, CONNECTED_PREFIX(co));
941 }
942
943 static void
ospf_update_interface_area(struct connected * co,struct ospf_area * area)944 ospf_update_interface_area (struct connected *co, struct ospf_area *area)
945 {
946 struct ospf_interface *oi = ospf_if_table_lookup (co->ifp, co->address);
947
948 /* nothing to be done case */
949 if (oi && oi->area == area)
950 return;
951
952 if (oi)
953 ospf_if_free (oi);
954
955 add_ospf_interface (co, area);
956 }
957
958 /* Run OSPF for the given subnet, taking into account the following
959 * possible sources of area configuration, in the given order of preference:
960 *
961 * - Whether there is interface+address specific area configuration
962 * - Whether there is a default area for the interface
963 * - Whether there is an area given as a parameter.
964 * - If no specific network prefix/area is supplied, whether there's
965 * a matching network configured.
966 */
967 static void
ospf_network_run_subnet(struct ospf * ospf,struct connected * co,struct prefix * p,struct ospf_area * given_area)968 ospf_network_run_subnet (struct ospf *ospf, struct connected *co,
969 struct prefix *p, struct ospf_area *given_area)
970 {
971 struct ospf_interface *oi;
972 struct ospf_if_params *params;
973 struct ospf_area *area = NULL;
974 struct route_node *rn;
975 int configed = 0;
976
977 if (CHECK_FLAG(co->flags, ZEBRA_IFA_SECONDARY))
978 return;
979
980 if (co->address->family != AF_INET)
981 return;
982
983 /* Try determine the appropriate area for this interface + address
984 * Start by checking interface config
985 */
986 if (!(params = ospf_lookup_if_params (co->ifp, co->address->u.prefix4)))
987 params = IF_DEF_PARAMS (co->ifp);
988
989 if (OSPF_IF_PARAM_CONFIGURED(params, if_area))
990 area = (ospf_area_get (ospf, params->if_area,
991 OSPF_AREA_ID_FORMAT_ADDRESS));
992
993 /* If we've found an interface and/or addr specific area, then we're
994 * done
995 */
996 if (area)
997 {
998 ospf_update_interface_area (co, area);
999 return;
1000 }
1001
1002 /* Otherwise, only remaining possibility is a matching network statement */
1003 if (p)
1004 {
1005 assert (given_area != NULL);
1006
1007 /* Which either was supplied as a parameter.. (e.g. cause a new
1008 * network/area was just added)..
1009 */
1010 if (p->family == co->address->family
1011 && ospf_network_match_iface (co, p))
1012 ospf_update_interface_area (co, given_area);
1013
1014 return;
1015 }
1016
1017 /* Else we have to search the existing network/area config to see
1018 * if any match..
1019 */
1020 for (rn = route_top (ospf->networks); rn; rn = route_next (rn))
1021 if (rn->info != NULL
1022 && ospf_network_match_iface (co, &rn->p))
1023 {
1024 struct ospf_network *network = (struct ospf_network *) rn->info;
1025 area = ospf_area_get (ospf, network->area_id, network->format);
1026 ospf_update_interface_area (co, area);
1027 configed = 1;
1028 }
1029
1030 /* If the subnet isn't in any area, deconfigure */
1031 if (!configed && (oi = ospf_if_table_lookup (co->ifp, co->address)))
1032 ospf_if_free (oi);
1033 }
1034
1035 static void
ospf_network_run_interface(struct ospf * ospf,struct interface * ifp,struct prefix * p,struct ospf_area * given_area)1036 ospf_network_run_interface (struct ospf *ospf, struct interface *ifp,
1037 struct prefix *p,
1038 struct ospf_area *given_area)
1039 {
1040 struct listnode *cnode;
1041 struct connected *co;
1042
1043 if (memcmp (ifp->name, "VLINK", 5) == 0)
1044 return;
1045
1046 /* Network prefix without area is nonsensical */
1047 if (p)
1048 assert (given_area != NULL);
1049
1050 /* if interface prefix is match specified prefix,
1051 then create socket and join multicast group. */
1052 for (ALL_LIST_ELEMENTS_RO (ifp->connected, cnode, co))
1053 ospf_network_run_subnet (ospf, co, p, given_area);
1054 }
1055
1056 static void
ospf_network_run(struct prefix * p,struct ospf_area * area)1057 ospf_network_run (struct prefix *p, struct ospf_area *area)
1058 {
1059 struct interface *ifp;
1060 struct listnode *node;
1061
1062 /* Schedule Router ID Update. */
1063 if (area->ospf->router_id.s_addr == 0)
1064 ospf_router_id_update (area->ospf);
1065
1066 /* Get target interface. */
1067 for (ALL_LIST_ELEMENTS_RO (om->iflist, node, ifp))
1068 ospf_network_run_interface (area->ospf, ifp, p, area);
1069 }
1070
1071 void
ospf_ls_upd_queue_empty(struct ospf_interface * oi)1072 ospf_ls_upd_queue_empty (struct ospf_interface *oi)
1073 {
1074 struct route_node *rn;
1075 struct listnode *node, *nnode;
1076 struct list *lst;
1077 struct ospf_lsa *lsa;
1078
1079 /* empty ls update queue */
1080 for (rn = route_top (oi->ls_upd_queue); rn;
1081 rn = route_next (rn))
1082 if ((lst = (struct list *) rn->info))
1083 {
1084 for (ALL_LIST_ELEMENTS (lst, node, nnode, lsa))
1085 ospf_lsa_unlock (&lsa); /* oi->ls_upd_queue */
1086 list_free (lst);
1087 rn->info = NULL;
1088 }
1089
1090 /* remove update event */
1091 if (oi->t_ls_upd_event)
1092 {
1093 thread_cancel (oi->t_ls_upd_event);
1094 oi->t_ls_upd_event = NULL;
1095 }
1096 }
1097
1098 void
ospf_if_update(struct ospf * ospf,struct interface * ifp)1099 ospf_if_update (struct ospf *ospf, struct interface *ifp)
1100 {
1101 if (!ospf)
1102 ospf = ospf_lookup ();
1103
1104 /* OSPF must be ready. */
1105 if (!ospf_is_ready (ospf))
1106 return;
1107
1108 ospf_network_run_interface (ospf, ifp, NULL, NULL);
1109
1110 /* Update connected redistribute. */
1111 update_redistributed(ospf, 1);
1112 }
1113
1114 void
ospf_remove_vls_through_area(struct ospf * ospf,struct ospf_area * area)1115 ospf_remove_vls_through_area (struct ospf *ospf, struct ospf_area *area)
1116 {
1117 struct listnode *node, *nnode;
1118 struct ospf_vl_data *vl_data;
1119
1120 for (ALL_LIST_ELEMENTS (ospf->vlinks, node, nnode, vl_data))
1121 if (IPV4_ADDR_SAME (&vl_data->vl_area_id, &area->area_id))
1122 ospf_vl_delete (ospf, vl_data);
1123 }
1124
1125
1126 static const struct message ospf_area_type_msg[] =
1127 {
1128 { OSPF_AREA_DEFAULT, "Default" },
1129 { OSPF_AREA_STUB, "Stub" },
1130 { OSPF_AREA_NSSA, "NSSA" },
1131 };
1132 static const int ospf_area_type_msg_max = OSPF_AREA_TYPE_MAX;
1133
1134 static void
ospf_area_type_set(struct ospf_area * area,int type)1135 ospf_area_type_set (struct ospf_area *area, int type)
1136 {
1137 struct listnode *node;
1138 struct ospf_interface *oi;
1139
1140 if (area->external_routing == type)
1141 {
1142 if (IS_DEBUG_OSPF_EVENT)
1143 zlog_debug ("Area[%s]: Types are the same, ignored.",
1144 inet_ntoa (area->area_id));
1145 return;
1146 }
1147
1148 area->external_routing = type;
1149
1150 if (IS_DEBUG_OSPF_EVENT)
1151 zlog_debug ("Area[%s]: Configured as %s", inet_ntoa (area->area_id),
1152 LOOKUP (ospf_area_type_msg, type));
1153
1154 switch (area->external_routing)
1155 {
1156 case OSPF_AREA_DEFAULT:
1157 for (ALL_LIST_ELEMENTS_RO (area->oiflist, node, oi))
1158 if (oi->nbr_self != NULL)
1159 {
1160 UNSET_FLAG (oi->nbr_self->options, OSPF_OPTION_NP);
1161 SET_FLAG (oi->nbr_self->options, OSPF_OPTION_E);
1162 }
1163 break;
1164 case OSPF_AREA_STUB:
1165 for (ALL_LIST_ELEMENTS_RO (area->oiflist, node, oi))
1166 if (oi->nbr_self != NULL)
1167 {
1168 if (IS_DEBUG_OSPF_EVENT)
1169 zlog_debug ("setting options on %s accordingly", IF_NAME (oi));
1170 UNSET_FLAG (oi->nbr_self->options, OSPF_OPTION_NP);
1171 UNSET_FLAG (oi->nbr_self->options, OSPF_OPTION_E);
1172 if (IS_DEBUG_OSPF_EVENT)
1173 zlog_debug ("options set on %s: %x",
1174 IF_NAME (oi), OPTIONS (oi));
1175 }
1176 break;
1177 case OSPF_AREA_NSSA:
1178 for (ALL_LIST_ELEMENTS_RO (area->oiflist, node, oi))
1179 if (oi->nbr_self != NULL)
1180 {
1181 zlog_debug ("setting nssa options on %s accordingly", IF_NAME (oi));
1182 UNSET_FLAG (oi->nbr_self->options, OSPF_OPTION_E);
1183 SET_FLAG (oi->nbr_self->options, OSPF_OPTION_NP);
1184 zlog_debug ("options set on %s: %x", IF_NAME (oi), OPTIONS (oi));
1185 }
1186 break;
1187 default:
1188 break;
1189 }
1190
1191 ospf_router_lsa_update_area (area);
1192 ospf_schedule_abr_task (area->ospf);
1193 }
1194
1195 int
ospf_area_shortcut_set(struct ospf * ospf,struct ospf_area * area,int mode)1196 ospf_area_shortcut_set (struct ospf *ospf, struct ospf_area *area, int mode)
1197 {
1198 if (area->shortcut_configured == mode)
1199 return 0;
1200
1201 area->shortcut_configured = mode;
1202 ospf_router_lsa_update_area (area);
1203 ospf_schedule_abr_task (ospf);
1204
1205 ospf_area_check_free (ospf, area->area_id);
1206
1207 return 1;
1208 }
1209
1210 int
ospf_area_shortcut_unset(struct ospf * ospf,struct ospf_area * area)1211 ospf_area_shortcut_unset (struct ospf *ospf, struct ospf_area *area)
1212 {
1213 area->shortcut_configured = OSPF_SHORTCUT_DEFAULT;
1214 ospf_router_lsa_update_area (area);
1215 ospf_area_check_free (ospf, area->area_id);
1216 ospf_schedule_abr_task (ospf);
1217
1218 return 1;
1219 }
1220
1221 static int
ospf_area_vlink_count(struct ospf * ospf,struct ospf_area * area)1222 ospf_area_vlink_count (struct ospf *ospf, struct ospf_area *area)
1223 {
1224 struct ospf_vl_data *vl;
1225 struct listnode *node;
1226 int count = 0;
1227
1228 for (ALL_LIST_ELEMENTS_RO (ospf->vlinks, node, vl))
1229 if (IPV4_ADDR_SAME (&vl->vl_area_id, &area->area_id))
1230 count++;
1231
1232 return count;
1233 }
1234
1235 int
ospf_area_stub_set(struct ospf * ospf,struct in_addr area_id)1236 ospf_area_stub_set (struct ospf *ospf, struct in_addr area_id)
1237 {
1238 struct ospf_area *area;
1239 int format = OSPF_AREA_ID_FORMAT_ADDRESS;
1240
1241 area = ospf_area_get (ospf, area_id, format);
1242 if (ospf_area_vlink_count (ospf, area))
1243 return 0;
1244
1245 if (area->external_routing != OSPF_AREA_STUB)
1246 ospf_area_type_set (area, OSPF_AREA_STUB);
1247
1248 return 1;
1249 }
1250
1251 int
ospf_area_stub_unset(struct ospf * ospf,struct in_addr area_id)1252 ospf_area_stub_unset (struct ospf *ospf, struct in_addr area_id)
1253 {
1254 struct ospf_area *area;
1255
1256 area = ospf_area_lookup_by_area_id (ospf, area_id);
1257 if (area == NULL)
1258 return 1;
1259
1260 if (area->external_routing == OSPF_AREA_STUB)
1261 ospf_area_type_set (area, OSPF_AREA_DEFAULT);
1262
1263 ospf_area_check_free (ospf, area_id);
1264
1265 return 1;
1266 }
1267
1268 int
ospf_area_no_summary_set(struct ospf * ospf,struct in_addr area_id)1269 ospf_area_no_summary_set (struct ospf *ospf, struct in_addr area_id)
1270 {
1271 struct ospf_area *area;
1272 int format = OSPF_AREA_ID_FORMAT_ADDRESS;
1273
1274 area = ospf_area_get (ospf, area_id, format);
1275 area->no_summary = 1;
1276
1277 return 1;
1278 }
1279
1280 int
ospf_area_no_summary_unset(struct ospf * ospf,struct in_addr area_id)1281 ospf_area_no_summary_unset (struct ospf *ospf, struct in_addr area_id)
1282 {
1283 struct ospf_area *area;
1284
1285 area = ospf_area_lookup_by_area_id (ospf, area_id);
1286 if (area == NULL)
1287 return 0;
1288
1289 area->no_summary = 0;
1290 ospf_area_check_free (ospf, area_id);
1291
1292 return 1;
1293 }
1294
1295 int
ospf_area_nssa_set(struct ospf * ospf,struct in_addr area_id)1296 ospf_area_nssa_set (struct ospf *ospf, struct in_addr area_id)
1297 {
1298 struct ospf_area *area;
1299 int format = OSPF_AREA_ID_FORMAT_ADDRESS;
1300
1301 area = ospf_area_get (ospf, area_id, format);
1302 if (ospf_area_vlink_count (ospf, area))
1303 return 0;
1304
1305 if (area->external_routing != OSPF_AREA_NSSA)
1306 {
1307 ospf_area_type_set (area, OSPF_AREA_NSSA);
1308 ospf->anyNSSA++;
1309 }
1310
1311 /* set NSSA area defaults */
1312 area->no_summary = 0;
1313 area->NSSATranslatorRole = OSPF_NSSA_ROLE_CANDIDATE;
1314 area->NSSATranslatorState = OSPF_NSSA_TRANSLATE_DISABLED;
1315 area->NSSATranslatorStabilityInterval = OSPF_NSSA_TRANS_STABLE_DEFAULT;
1316
1317 return 1;
1318 }
1319
1320 int
ospf_area_nssa_unset(struct ospf * ospf,struct in_addr area_id)1321 ospf_area_nssa_unset (struct ospf *ospf, struct in_addr area_id)
1322 {
1323 struct ospf_area *area;
1324
1325 area = ospf_area_lookup_by_area_id (ospf, area_id);
1326 if (area == NULL)
1327 return 0;
1328
1329 if (area->external_routing == OSPF_AREA_NSSA)
1330 {
1331 ospf->anyNSSA--;
1332 ospf_area_type_set (area, OSPF_AREA_DEFAULT);
1333 }
1334
1335 ospf_area_check_free (ospf, area_id);
1336
1337 return 1;
1338 }
1339
1340 int
ospf_area_nssa_translator_role_set(struct ospf * ospf,struct in_addr area_id,int role)1341 ospf_area_nssa_translator_role_set (struct ospf *ospf, struct in_addr area_id,
1342 int role)
1343 {
1344 struct ospf_area *area;
1345
1346 area = ospf_area_lookup_by_area_id (ospf, area_id);
1347 if (area == NULL)
1348 return 0;
1349
1350 area->NSSATranslatorRole = role;
1351
1352 return 1;
1353 }
1354
1355 #if 0
1356 /* XXX: unused? Leave for symmetry? */
1357 static int
1358 ospf_area_nssa_translator_role_unset (struct ospf *ospf,
1359 struct in_addr area_id)
1360 {
1361 struct ospf_area *area;
1362
1363 area = ospf_area_lookup_by_area_id (ospf, area_id);
1364 if (area == NULL)
1365 return 0;
1366
1367 area->NSSATranslatorRole = OSPF_NSSA_ROLE_CANDIDATE;
1368
1369 ospf_area_check_free (ospf, area_id);
1370
1371 return 1;
1372 }
1373 #endif
1374
1375 int
ospf_area_export_list_set(struct ospf * ospf,struct ospf_area * area,const char * list_name)1376 ospf_area_export_list_set (struct ospf *ospf,
1377 struct ospf_area *area, const char *list_name)
1378 {
1379 struct access_list *list;
1380 list = access_list_lookup (AFI_IP, list_name);
1381
1382 EXPORT_LIST (area) = list;
1383
1384 if (EXPORT_NAME (area))
1385 free (EXPORT_NAME (area));
1386
1387 EXPORT_NAME (area) = strdup (list_name);
1388 ospf_schedule_abr_task (ospf);
1389
1390 return 1;
1391 }
1392
1393 int
ospf_area_export_list_unset(struct ospf * ospf,struct ospf_area * area)1394 ospf_area_export_list_unset (struct ospf *ospf, struct ospf_area * area)
1395 {
1396
1397 EXPORT_LIST (area) = 0;
1398
1399 if (EXPORT_NAME (area))
1400 free (EXPORT_NAME (area));
1401
1402 EXPORT_NAME (area) = NULL;
1403
1404 ospf_area_check_free (ospf, area->area_id);
1405
1406 ospf_schedule_abr_task (ospf);
1407
1408 return 1;
1409 }
1410
1411 int
ospf_area_import_list_set(struct ospf * ospf,struct ospf_area * area,const char * name)1412 ospf_area_import_list_set (struct ospf *ospf, struct ospf_area *area,
1413 const char *name)
1414 {
1415 struct access_list *list;
1416 list = access_list_lookup (AFI_IP, name);
1417
1418 IMPORT_LIST (area) = list;
1419
1420 if (IMPORT_NAME (area))
1421 free (IMPORT_NAME (area));
1422
1423 IMPORT_NAME (area) = strdup (name);
1424 ospf_schedule_abr_task (ospf);
1425
1426 return 1;
1427 }
1428
1429 int
ospf_area_import_list_unset(struct ospf * ospf,struct ospf_area * area)1430 ospf_area_import_list_unset (struct ospf *ospf, struct ospf_area * area)
1431 {
1432 IMPORT_LIST (area) = 0;
1433
1434 if (IMPORT_NAME (area))
1435 free (IMPORT_NAME (area));
1436
1437 IMPORT_NAME (area) = NULL;
1438 ospf_area_check_free (ospf, area->area_id);
1439
1440 ospf_schedule_abr_task (ospf);
1441
1442 return 1;
1443 }
1444
1445 int
ospf_timers_refresh_set(struct ospf * ospf,int interval)1446 ospf_timers_refresh_set (struct ospf *ospf, int interval)
1447 {
1448 int time_left;
1449
1450 if (ospf->lsa_refresh_interval == interval)
1451 return 1;
1452
1453 time_left = ospf->lsa_refresh_interval -
1454 (quagga_time (NULL) - ospf->lsa_refresher_started);
1455
1456 if (time_left > interval)
1457 {
1458 OSPF_TIMER_OFF (ospf->t_lsa_refresher);
1459 ospf->t_lsa_refresher =
1460 thread_add_timer (master, ospf_lsa_refresh_walker, ospf, interval);
1461 }
1462 ospf->lsa_refresh_interval = interval;
1463
1464 return 1;
1465 }
1466
1467 int
ospf_timers_refresh_unset(struct ospf * ospf)1468 ospf_timers_refresh_unset (struct ospf *ospf)
1469 {
1470 int time_left;
1471
1472 time_left = ospf->lsa_refresh_interval -
1473 (quagga_time (NULL) - ospf->lsa_refresher_started);
1474
1475 if (time_left > OSPF_LSA_REFRESH_INTERVAL_DEFAULT)
1476 {
1477 OSPF_TIMER_OFF (ospf->t_lsa_refresher);
1478 ospf->t_lsa_refresher =
1479 thread_add_timer (master, ospf_lsa_refresh_walker, ospf,
1480 OSPF_LSA_REFRESH_INTERVAL_DEFAULT);
1481 }
1482
1483 ospf->lsa_refresh_interval = OSPF_LSA_REFRESH_INTERVAL_DEFAULT;
1484
1485 return 1;
1486 }
1487
1488
1489 static struct ospf_nbr_nbma *
ospf_nbr_nbma_new(void)1490 ospf_nbr_nbma_new (void)
1491 {
1492 struct ospf_nbr_nbma *nbr_nbma;
1493
1494 nbr_nbma = XCALLOC (MTYPE_OSPF_NEIGHBOR_STATIC,
1495 sizeof (struct ospf_nbr_nbma));
1496
1497 nbr_nbma->priority = OSPF_NEIGHBOR_PRIORITY_DEFAULT;
1498 nbr_nbma->v_poll = OSPF_POLL_INTERVAL_DEFAULT;
1499
1500 return nbr_nbma;
1501 }
1502
1503 static void
ospf_nbr_nbma_free(struct ospf_nbr_nbma * nbr_nbma)1504 ospf_nbr_nbma_free (struct ospf_nbr_nbma *nbr_nbma)
1505 {
1506 XFREE (MTYPE_OSPF_NEIGHBOR_STATIC, nbr_nbma);
1507 }
1508
1509 static void
ospf_nbr_nbma_delete(struct ospf * ospf,struct ospf_nbr_nbma * nbr_nbma)1510 ospf_nbr_nbma_delete (struct ospf *ospf, struct ospf_nbr_nbma *nbr_nbma)
1511 {
1512 struct route_node *rn;
1513 struct prefix_ipv4 p;
1514
1515 p.family = AF_INET;
1516 p.prefix = nbr_nbma->addr;
1517 p.prefixlen = IPV4_MAX_BITLEN;
1518
1519 rn = route_node_lookup (ospf->nbr_nbma, (struct prefix *)&p);
1520 if (rn)
1521 {
1522 ospf_nbr_nbma_free (rn->info);
1523 rn->info = NULL;
1524 route_unlock_node (rn);
1525 route_unlock_node (rn);
1526 }
1527 }
1528
1529 static void
ospf_nbr_nbma_down(struct ospf_nbr_nbma * nbr_nbma)1530 ospf_nbr_nbma_down (struct ospf_nbr_nbma *nbr_nbma)
1531 {
1532 OSPF_TIMER_OFF (nbr_nbma->t_poll);
1533
1534 if (nbr_nbma->nbr)
1535 {
1536 nbr_nbma->nbr->nbr_nbma = NULL;
1537 OSPF_NSM_EVENT_EXECUTE (nbr_nbma->nbr, NSM_KillNbr);
1538 }
1539
1540 if (nbr_nbma->oi)
1541 listnode_delete (nbr_nbma->oi->nbr_nbma, nbr_nbma);
1542 }
1543
1544 static void
ospf_nbr_nbma_add(struct ospf_nbr_nbma * nbr_nbma,struct ospf_interface * oi)1545 ospf_nbr_nbma_add (struct ospf_nbr_nbma *nbr_nbma,
1546 struct ospf_interface *oi)
1547 {
1548 struct ospf_neighbor *nbr;
1549 struct route_node *rn;
1550 struct prefix p;
1551
1552 if (oi->type != OSPF_IFTYPE_NBMA)
1553 return;
1554
1555 if (nbr_nbma->nbr != NULL)
1556 return;
1557
1558 if (IPV4_ADDR_SAME (&oi->nbr_self->address.u.prefix4, &nbr_nbma->addr))
1559 return;
1560
1561 nbr_nbma->oi = oi;
1562 listnode_add (oi->nbr_nbma, nbr_nbma);
1563
1564 /* Get neighbor information from table. */
1565 p.family = AF_INET;
1566 p.prefixlen = IPV4_MAX_BITLEN;
1567 p.u.prefix4 = nbr_nbma->addr;
1568
1569 rn = route_node_get (oi->nbrs, (struct prefix *)&p);
1570 if (rn->info)
1571 {
1572 nbr = rn->info;
1573 nbr->nbr_nbma = nbr_nbma;
1574 nbr_nbma->nbr = nbr;
1575
1576 route_unlock_node (rn);
1577 }
1578 else
1579 {
1580 nbr = rn->info = ospf_nbr_new (oi);
1581 nbr->state = NSM_Down;
1582 nbr->src = nbr_nbma->addr;
1583 nbr->nbr_nbma = nbr_nbma;
1584 nbr->priority = nbr_nbma->priority;
1585 nbr->address = p;
1586
1587 nbr_nbma->nbr = nbr;
1588
1589 OSPF_NSM_EVENT_EXECUTE (nbr, NSM_Start);
1590 }
1591 }
1592
1593 void
ospf_nbr_nbma_if_update(struct ospf * ospf,struct ospf_interface * oi)1594 ospf_nbr_nbma_if_update (struct ospf *ospf, struct ospf_interface *oi)
1595 {
1596 struct ospf_nbr_nbma *nbr_nbma;
1597 struct route_node *rn;
1598 struct prefix_ipv4 p;
1599
1600 if (oi->type != OSPF_IFTYPE_NBMA)
1601 return;
1602
1603 for (rn = route_top (ospf->nbr_nbma); rn; rn = route_next (rn))
1604 if ((nbr_nbma = rn->info))
1605 if (nbr_nbma->oi == NULL && nbr_nbma->nbr == NULL)
1606 {
1607 p.family = AF_INET;
1608 p.prefix = nbr_nbma->addr;
1609 p.prefixlen = IPV4_MAX_BITLEN;
1610
1611 if (prefix_match (oi->address, (struct prefix *)&p))
1612 ospf_nbr_nbma_add (nbr_nbma, oi);
1613 }
1614 }
1615
1616 struct ospf_nbr_nbma *
ospf_nbr_nbma_lookup(struct ospf * ospf,struct in_addr nbr_addr)1617 ospf_nbr_nbma_lookup (struct ospf *ospf, struct in_addr nbr_addr)
1618 {
1619 struct route_node *rn;
1620 struct prefix_ipv4 p;
1621
1622 p.family = AF_INET;
1623 p.prefix = nbr_addr;
1624 p.prefixlen = IPV4_MAX_BITLEN;
1625
1626 rn = route_node_lookup (ospf->nbr_nbma, (struct prefix *)&p);
1627 if (rn)
1628 {
1629 route_unlock_node (rn);
1630 return rn->info;
1631 }
1632 return NULL;
1633 }
1634
1635 struct ospf_nbr_nbma *
ospf_nbr_nbma_lookup_next(struct ospf * ospf,struct in_addr * addr,int first)1636 ospf_nbr_nbma_lookup_next (struct ospf *ospf, struct in_addr *addr, int first)
1637 {
1638 #if 0
1639 struct ospf_nbr_nbma *nbr_nbma;
1640 struct listnode *node;
1641 #endif
1642
1643 if (ospf == NULL)
1644 return NULL;
1645
1646 #if 0
1647 for (ALL_LIST_ELEMENTS_RO (ospf->nbr_nbma, node, nbr_nbma))
1648 {
1649 if (first)
1650 {
1651 *addr = nbr_nbma->addr;
1652 return nbr_nbma;
1653 }
1654 else if (ntohl (nbr_nbma->addr.s_addr) > ntohl (addr->s_addr))
1655 {
1656 *addr = nbr_nbma->addr;
1657 return nbr_nbma;
1658 }
1659 }
1660 #endif
1661 return NULL;
1662 }
1663
1664 int
ospf_nbr_nbma_set(struct ospf * ospf,struct in_addr nbr_addr)1665 ospf_nbr_nbma_set (struct ospf *ospf, struct in_addr nbr_addr)
1666 {
1667 struct ospf_nbr_nbma *nbr_nbma;
1668 struct ospf_interface *oi;
1669 struct prefix_ipv4 p;
1670 struct route_node *rn;
1671 struct listnode *node;
1672
1673 nbr_nbma = ospf_nbr_nbma_lookup (ospf, nbr_addr);
1674 if (nbr_nbma)
1675 return 0;
1676
1677 nbr_nbma = ospf_nbr_nbma_new ();
1678 nbr_nbma->addr = nbr_addr;
1679
1680 p.family = AF_INET;
1681 p.prefix = nbr_addr;
1682 p.prefixlen = IPV4_MAX_BITLEN;
1683
1684 rn = route_node_get (ospf->nbr_nbma, (struct prefix *)&p);
1685 if (rn->info)
1686 route_unlock_node (rn);
1687 rn->info = nbr_nbma;
1688
1689 for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
1690 {
1691 if (oi->type == OSPF_IFTYPE_NBMA)
1692 if (prefix_match (oi->address, (struct prefix *)&p))
1693 {
1694 ospf_nbr_nbma_add (nbr_nbma, oi);
1695 break;
1696 }
1697 }
1698
1699 return 1;
1700 }
1701
1702 int
ospf_nbr_nbma_unset(struct ospf * ospf,struct in_addr nbr_addr)1703 ospf_nbr_nbma_unset (struct ospf *ospf, struct in_addr nbr_addr)
1704 {
1705 struct ospf_nbr_nbma *nbr_nbma;
1706
1707 nbr_nbma = ospf_nbr_nbma_lookup (ospf, nbr_addr);
1708 if (nbr_nbma == NULL)
1709 return 0;
1710
1711 ospf_nbr_nbma_down (nbr_nbma);
1712 ospf_nbr_nbma_delete (ospf, nbr_nbma);
1713
1714 return 1;
1715 }
1716
1717 int
ospf_nbr_nbma_priority_set(struct ospf * ospf,struct in_addr nbr_addr,u_char priority)1718 ospf_nbr_nbma_priority_set (struct ospf *ospf, struct in_addr nbr_addr,
1719 u_char priority)
1720 {
1721 struct ospf_nbr_nbma *nbr_nbma;
1722
1723 nbr_nbma = ospf_nbr_nbma_lookup (ospf, nbr_addr);
1724 if (nbr_nbma == NULL)
1725 return 0;
1726
1727 if (nbr_nbma->priority != priority)
1728 nbr_nbma->priority = priority;
1729
1730 return 1;
1731 }
1732
1733 int
ospf_nbr_nbma_priority_unset(struct ospf * ospf,struct in_addr nbr_addr)1734 ospf_nbr_nbma_priority_unset (struct ospf *ospf, struct in_addr nbr_addr)
1735 {
1736 struct ospf_nbr_nbma *nbr_nbma;
1737
1738 nbr_nbma = ospf_nbr_nbma_lookup (ospf, nbr_addr);
1739 if (nbr_nbma == NULL)
1740 return 0;
1741
1742 if (nbr_nbma != OSPF_NEIGHBOR_PRIORITY_DEFAULT)
1743 nbr_nbma->priority = OSPF_NEIGHBOR_PRIORITY_DEFAULT;
1744
1745 return 1;
1746 }
1747
1748 int
ospf_nbr_nbma_poll_interval_set(struct ospf * ospf,struct in_addr nbr_addr,unsigned int interval)1749 ospf_nbr_nbma_poll_interval_set (struct ospf *ospf, struct in_addr nbr_addr,
1750 unsigned int interval)
1751 {
1752 struct ospf_nbr_nbma *nbr_nbma;
1753
1754 nbr_nbma = ospf_nbr_nbma_lookup (ospf, nbr_addr);
1755 if (nbr_nbma == NULL)
1756 return 0;
1757
1758 if (nbr_nbma->v_poll != interval)
1759 {
1760 nbr_nbma->v_poll = interval;
1761 if (nbr_nbma->oi && ospf_if_is_up (nbr_nbma->oi))
1762 {
1763 OSPF_TIMER_OFF (nbr_nbma->t_poll);
1764 OSPF_POLL_TIMER_ON (nbr_nbma->t_poll, ospf_poll_timer,
1765 nbr_nbma->v_poll);
1766 }
1767 }
1768
1769 return 1;
1770 }
1771
1772 int
ospf_nbr_nbma_poll_interval_unset(struct ospf * ospf,struct in_addr addr)1773 ospf_nbr_nbma_poll_interval_unset (struct ospf *ospf, struct in_addr addr)
1774 {
1775 struct ospf_nbr_nbma *nbr_nbma;
1776
1777 nbr_nbma = ospf_nbr_nbma_lookup (ospf, addr);
1778 if (nbr_nbma == NULL)
1779 return 0;
1780
1781 if (nbr_nbma->v_poll != OSPF_POLL_INTERVAL_DEFAULT)
1782 nbr_nbma->v_poll = OSPF_POLL_INTERVAL_DEFAULT;
1783
1784 return 1;
1785 }
1786
1787 void
ospf_master_init()1788 ospf_master_init ()
1789 {
1790 memset (&ospf_master, 0, sizeof (struct ospf_master));
1791
1792 om = &ospf_master;
1793 om->ospf = list_new ();
1794 om->master = thread_master_create ();
1795 om->start_time = quagga_time (NULL);
1796 }
1797