blob: def55f10d52c8b6662e66e8d871deeb8532209e2 [file] [log] [blame]
paul718e3742002-12-13 20:15:29 +00001/*
2 * OSPF ABR functions.
3 * Copyright (C) 1999, 2000 Alex Zinin, Toshiaki Takada
4 *
5 * This file is part of GNU Zebra.
6 *
7 * GNU Zebra is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation; either version 2, or (at your option) any
10 * later version.
11 *
12 * GNU Zebra is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with GNU Zebra; see the file COPYING. If not, write to the Free
19 * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
20 * 02111-1307, USA.
21 */
22
23
24#include <zebra.h>
25
26#include "thread.h"
27#include "memory.h"
28#include "linklist.h"
29#include "prefix.h"
30#include "if.h"
31#include "table.h"
32#include "vty.h"
33#include "filter.h"
34#include "plist.h"
35#include "log.h"
36
37#include "ospfd/ospfd.h"
38#include "ospfd/ospf_interface.h"
39#include "ospfd/ospf_ism.h"
40#include "ospfd/ospf_asbr.h"
41#include "ospfd/ospf_lsa.h"
42#include "ospfd/ospf_lsdb.h"
43#include "ospfd/ospf_neighbor.h"
44#include "ospfd/ospf_nsm.h"
45#include "ospfd/ospf_spf.h"
46#include "ospfd/ospf_route.h"
47#include "ospfd/ospf_ia.h"
48#include "ospfd/ospf_flood.h"
49#include "ospfd/ospf_abr.h"
50#include "ospfd/ospf_ase.h"
51#include "ospfd/ospf_zebra.h"
52#include "ospfd/ospf_dump.h"
paul718e3742002-12-13 20:15:29 +000053
paul4dadc292005-05-06 21:37:42 +000054static struct ospf_area_range *
paul718e3742002-12-13 20:15:29 +000055ospf_area_range_new (struct prefix_ipv4 *p)
56{
57 struct ospf_area_range *range;
58
59 range = XCALLOC (MTYPE_OSPF_AREA_RANGE, sizeof (struct ospf_area_range));
60 range->addr = p->prefix;
61 range->masklen = p->prefixlen;
62 range->cost_config = OSPF_AREA_RANGE_COST_UNSPEC;
63
64 return range;
65}
66
paul4dadc292005-05-06 21:37:42 +000067static void
paul718e3742002-12-13 20:15:29 +000068ospf_area_range_free (struct ospf_area_range *range)
69{
70 XFREE (MTYPE_OSPF_AREA_RANGE, range);
71}
72
paul4dadc292005-05-06 21:37:42 +000073static void
paul718e3742002-12-13 20:15:29 +000074ospf_area_range_add (struct ospf_area *area, struct ospf_area_range *range)
75{
76 struct route_node *rn;
77 struct prefix_ipv4 p;
78
79 p.family = AF_INET;
80 p.prefixlen = range->masklen;
81 p.prefix = range->addr;
82
83 rn = route_node_get (area->ranges, (struct prefix *)&p);
84 if (rn->info)
85 route_unlock_node (rn);
86 else
87 rn->info = range;
88}
89
paul4dadc292005-05-06 21:37:42 +000090static void
paul718e3742002-12-13 20:15:29 +000091ospf_area_range_delete (struct ospf_area *area, struct ospf_area_range *range)
92{
93 struct route_node *rn;
94 struct prefix_ipv4 p;
95
96 p.family = AF_INET;
97 p.prefixlen = range->masklen;
98 p.prefix = range->addr;
99
100 rn = route_node_lookup (area->ranges, (struct prefix *)&p);
101 if (rn)
102 {
103 ospf_area_range_free (rn->info);
104 rn->info = NULL;
105 route_unlock_node (rn);
106 route_unlock_node (rn);
107 }
108}
109
110struct ospf_area_range *
111ospf_area_range_lookup (struct ospf_area *area, struct prefix_ipv4 *p)
112{
113 struct route_node *rn;
114
115 rn = route_node_lookup (area->ranges, (struct prefix *)p);
116 if (rn)
117 {
118 route_unlock_node (rn);
119 return rn->info;
120 }
121 return NULL;
122}
123
124struct ospf_area_range *
pauld4a53d52003-07-12 21:30:57 +0000125ospf_area_range_lookup_next (struct ospf_area *area,
126 struct in_addr *range_net,
127 int first)
paul718e3742002-12-13 20:15:29 +0000128{
129 struct route_node *rn;
130 struct prefix_ipv4 p;
131 struct ospf_area_range *find;
132
133 p.family = AF_INET;
134 p.prefixlen = IPV4_MAX_BITLEN;
135 p.prefix = *range_net;
136
137 if (first)
138 rn = route_top (area->ranges);
139 else
140 {
141 rn = route_node_get (area->ranges, (struct prefix *) &p);
142 rn = route_next (rn);
143 }
144
145 for (; rn; rn = route_next (rn))
146 if (rn->info)
147 break;
148
149 if (rn && rn->info)
150 {
151 find = rn->info;
152 *range_net = rn->p.u.prefix4;
153 route_unlock_node (rn);
154 return find;
155 }
156 return NULL;
157}
158
paul4dadc292005-05-06 21:37:42 +0000159static struct ospf_area_range *
paul718e3742002-12-13 20:15:29 +0000160ospf_area_range_match (struct ospf_area *area, struct prefix_ipv4 *p)
161{
162 struct route_node *node;
163
164 node = route_node_match (area->ranges, (struct prefix *) p);
165 if (node)
166 {
167 route_unlock_node (node);
168 return node->info;
169 }
170 return NULL;
171}
172
173struct ospf_area_range *
174ospf_area_range_match_any (struct ospf *ospf, struct prefix_ipv4 *p)
175{
176 struct ospf_area_range *range;
paul1eb8ef22005-04-07 07:30:20 +0000177 struct ospf_area *area;
hasso52dc7ee2004-09-23 19:18:23 +0000178 struct listnode *node;
paul718e3742002-12-13 20:15:29 +0000179
paul1eb8ef22005-04-07 07:30:20 +0000180 for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
181 if ((range = ospf_area_range_match (area, p)))
paul718e3742002-12-13 20:15:29 +0000182 return range;
183
184 return NULL;
185}
186
187int
188ospf_area_range_active (struct ospf_area_range *range)
189{
190 return range->specifics;
191}
192
paul4dadc292005-05-06 21:37:42 +0000193static int
paul718e3742002-12-13 20:15:29 +0000194ospf_area_actively_attached (struct ospf_area *area)
195{
196 return area->act_ints;
197}
198
199int
200ospf_area_range_set (struct ospf *ospf, struct in_addr area_id,
201 struct prefix_ipv4 *p, int advertise)
202{
203 struct ospf_area *area;
204 struct ospf_area_range *range;
paul147193a2003-04-19 00:31:59 +0000205 int ret = OSPF_AREA_ID_FORMAT_ADDRESS;
paul718e3742002-12-13 20:15:29 +0000206
paul147193a2003-04-19 00:31:59 +0000207 area = ospf_area_get (ospf, area_id, ret);
paul718e3742002-12-13 20:15:29 +0000208 if (area == NULL)
209 return 0;
210
211 range = ospf_area_range_lookup (area, p);
212 if (range != NULL)
213 {
214 if ((CHECK_FLAG (range->flags, OSPF_AREA_RANGE_ADVERTISE)
215 && !CHECK_FLAG (advertise, OSPF_AREA_RANGE_ADVERTISE))
216 || (!CHECK_FLAG (range->flags, OSPF_AREA_RANGE_ADVERTISE)
217 && CHECK_FLAG (advertise, OSPF_AREA_RANGE_ADVERTISE)))
paul147193a2003-04-19 00:31:59 +0000218 ospf_schedule_abr_task (ospf);
paul718e3742002-12-13 20:15:29 +0000219 }
220 else
221 {
222 range = ospf_area_range_new (p);
223 ospf_area_range_add (area, range);
paul147193a2003-04-19 00:31:59 +0000224 ospf_schedule_abr_task (ospf);
paul718e3742002-12-13 20:15:29 +0000225 }
226
227 if (CHECK_FLAG (advertise, OSPF_AREA_RANGE_ADVERTISE))
228 SET_FLAG (range->flags, OSPF_AREA_RANGE_ADVERTISE);
229 else
230 UNSET_FLAG (range->flags, OSPF_AREA_RANGE_ADVERTISE);
231
232 return 1;
233}
234
235int
236ospf_area_range_cost_set (struct ospf *ospf, struct in_addr area_id,
237 struct prefix_ipv4 *p, u_int32_t cost)
238{
239 struct ospf_area *area;
240 struct ospf_area_range *range;
paul147193a2003-04-19 00:31:59 +0000241 int ret = OSPF_AREA_ID_FORMAT_ADDRESS;
paul718e3742002-12-13 20:15:29 +0000242
paul147193a2003-04-19 00:31:59 +0000243 area = ospf_area_get (ospf, area_id, ret);
paul718e3742002-12-13 20:15:29 +0000244 if (area == NULL)
245 return 0;
246
Paul Jakma214a4452006-05-12 22:51:49 +0000247 range = ospf_area_range_lookup (area, p);
paul718e3742002-12-13 20:15:29 +0000248 if (range == NULL)
249 return 0;
250
251 if (range->cost_config != cost)
252 {
253 range->cost_config = cost;
254 if (ospf_area_range_active (range))
paul147193a2003-04-19 00:31:59 +0000255 ospf_schedule_abr_task (ospf);
paul718e3742002-12-13 20:15:29 +0000256 }
257
258 return 1;
259}
260
261int
262ospf_area_range_unset (struct ospf *ospf, struct in_addr area_id,
263 struct prefix_ipv4 *p)
264{
265 struct ospf_area *area;
266 struct ospf_area_range *range;
267
paul147193a2003-04-19 00:31:59 +0000268 area = ospf_area_lookup_by_area_id (ospf, area_id);
paul718e3742002-12-13 20:15:29 +0000269 if (area == NULL)
270 return 0;
271
272 range = ospf_area_range_lookup (area, p);
273 if (range == NULL)
274 return 0;
275
276 if (ospf_area_range_active (range))
paul147193a2003-04-19 00:31:59 +0000277 ospf_schedule_abr_task (ospf);
paul718e3742002-12-13 20:15:29 +0000278
279 ospf_area_range_delete (area, range);
280
281 return 1;
282}
283
284int
285ospf_area_range_substitute_set (struct ospf *ospf, struct in_addr area_id,
286 struct prefix_ipv4 *p, struct prefix_ipv4 *s)
287{
288 struct ospf_area *area;
289 struct ospf_area_range *range;
paul147193a2003-04-19 00:31:59 +0000290 int ret = OSPF_AREA_ID_FORMAT_ADDRESS;
paul718e3742002-12-13 20:15:29 +0000291
paul147193a2003-04-19 00:31:59 +0000292 area = ospf_area_get (ospf, area_id, ret);
paul718e3742002-12-13 20:15:29 +0000293 range = ospf_area_range_lookup (area, p);
294
295 if (range != NULL)
296 {
297 if (!CHECK_FLAG (range->flags, OSPF_AREA_RANGE_ADVERTISE) ||
298 !CHECK_FLAG (range->flags, OSPF_AREA_RANGE_SUBSTITUTE))
paul147193a2003-04-19 00:31:59 +0000299 ospf_schedule_abr_task (ospf);
paul718e3742002-12-13 20:15:29 +0000300 }
301 else
302 {
303 range = ospf_area_range_new (p);
304 ospf_area_range_add (area, range);
paul147193a2003-04-19 00:31:59 +0000305 ospf_schedule_abr_task (ospf);
paul718e3742002-12-13 20:15:29 +0000306 }
307
308 SET_FLAG (range->flags, OSPF_AREA_RANGE_ADVERTISE);
309 SET_FLAG (range->flags, OSPF_AREA_RANGE_SUBSTITUTE);
310 range->subst_addr = s->prefix;
311 range->subst_masklen = s->prefixlen;
312
313 return 1;
314}
315
316int
317ospf_area_range_substitute_unset (struct ospf *ospf, struct in_addr area_id,
318 struct prefix_ipv4 *p)
319{
320 struct ospf_area *area;
321 struct ospf_area_range *range;
322
paul147193a2003-04-19 00:31:59 +0000323 area = ospf_area_lookup_by_area_id (ospf, area_id);
paul718e3742002-12-13 20:15:29 +0000324 if (area == NULL)
325 return 0;
326
327 range = ospf_area_range_lookup (area, p);
328 if (range == NULL)
329 return 0;
330
331 if (CHECK_FLAG (range->flags, OSPF_AREA_RANGE_SUBSTITUTE))
332 if (ospf_area_range_active (range))
paul147193a2003-04-19 00:31:59 +0000333 ospf_schedule_abr_task (ospf);
paul718e3742002-12-13 20:15:29 +0000334
335 UNSET_FLAG (range->flags, OSPF_AREA_RANGE_SUBSTITUTE);
336 range->subst_addr.s_addr = 0;
337 range->subst_masklen = 0;
338
339 return 1;
340}
341
342int
paul147193a2003-04-19 00:31:59 +0000343ospf_act_bb_connection (struct ospf *ospf)
paul718e3742002-12-13 20:15:29 +0000344{
paul147193a2003-04-19 00:31:59 +0000345 if (ospf->backbone == NULL)
paul718e3742002-12-13 20:15:29 +0000346 return 0;
347
paul147193a2003-04-19 00:31:59 +0000348 return ospf->backbone->full_nbrs;
paul718e3742002-12-13 20:15:29 +0000349}
350
paule2c6c152003-06-22 08:49:25 +0000351/* Determine whether this router is elected translator or not for area */
paul4dadc292005-05-06 21:37:42 +0000352static int
paule2c6c152003-06-22 08:49:25 +0000353ospf_abr_nssa_am_elected (struct ospf_area *area)
354{
355 struct route_node *rn;
356 struct ospf_lsa *lsa;
357 struct router_lsa *rlsa;
358 struct in_addr *best = NULL;
359
360 LSDB_LOOP ( ROUTER_LSDB (area), rn, lsa)
361 {
362 /* sanity checks */
363 if (!lsa
364 || (lsa->data->type != OSPF_ROUTER_LSA)
365 || IS_LSA_SELF (lsa))
366 continue;
367
368 rlsa = (struct router_lsa *) lsa->data;
369
370 /* ignore non-ABR routers */
371 if (!IS_ROUTER_LSA_BORDER (rlsa))
372 continue;
373
374 /* Router has Nt flag - always translate */
375 if (IS_ROUTER_LSA_NT (rlsa))
376 {
377 if (IS_DEBUG_OSPF_NSSA)
ajse84cc642004-12-08 17:28:56 +0000378 zlog_debug ("ospf_abr_nssa_am_elected: "
paule2c6c152003-06-22 08:49:25 +0000379 "router %s asserts Nt",
380 inet_ntoa (lsa->data->id) );
381 return 0;
382 }
383
384 if (best == NULL)
385 best = &lsa->data->id;
386 else
387 if ( IPV4_ADDR_CMP (&best, &lsa->data->id) < 0)
388 best = &lsa->data->id;
389 }
390
391 if (IS_DEBUG_OSPF_NSSA)
ajse84cc642004-12-08 17:28:56 +0000392 zlog_debug ("ospf_abr_nssa_am_elected: best electable ABR is: %s",
paule2c6c152003-06-22 08:49:25 +0000393 (best) ? inet_ntoa (*best) : "<none>" );
394
395 if (best == NULL)
396 return 1;
397
398 if ( IPV4_ADDR_CMP (&best, &area->ospf->router_id) < 0)
399 return 1;
400 else
401 return 0;
402}
403
404/* Check NSSA ABR status
405 * assumes there are nssa areas
406 */
paul4dadc292005-05-06 21:37:42 +0000407static void
paule2c6c152003-06-22 08:49:25 +0000408ospf_abr_nssa_check_status (struct ospf *ospf)
409{
410 struct ospf_area *area;
paul1eb8ef22005-04-07 07:30:20 +0000411 struct listnode *lnode, *nnode;
Paul Jakma9560fa82006-06-26 12:50:06 +0000412
paul1eb8ef22005-04-07 07:30:20 +0000413 for (ALL_LIST_ELEMENTS (ospf->areas, lnode, nnode, area))
paule2c6c152003-06-22 08:49:25 +0000414 {
Paul Jakma9560fa82006-06-26 12:50:06 +0000415 u_char old_state = area->NSSATranslatorState;
416
paule2c6c152003-06-22 08:49:25 +0000417 if (area->external_routing != OSPF_AREA_NSSA)
418 continue;
Paul Jakma9560fa82006-06-26 12:50:06 +0000419
paule2c6c152003-06-22 08:49:25 +0000420 if (IS_DEBUG_OSPF (nssa, NSSA))
ajse84cc642004-12-08 17:28:56 +0000421 zlog_debug ("ospf_abr_nssa_check_status: "
paule2c6c152003-06-22 08:49:25 +0000422 "checking area %s",
423 inet_ntoa (area->area_id));
Paul Jakma9560fa82006-06-26 12:50:06 +0000424
paule2c6c152003-06-22 08:49:25 +0000425 if (!IS_OSPF_ABR (area->ospf))
426 {
427 if (IS_DEBUG_OSPF (nssa, NSSA))
Paul Jakma9560fa82006-06-26 12:50:06 +0000428 zlog_debug ("ospf_abr_nssa_check_status: "
429 "not ABR");
pauld4a53d52003-07-12 21:30:57 +0000430 area->NSSATranslatorState = OSPF_NSSA_TRANSLATE_DISABLED;
paule2c6c152003-06-22 08:49:25 +0000431 }
Paul Jakma9560fa82006-06-26 12:50:06 +0000432 else
433 {
434 switch (area->NSSATranslatorRole)
435 {
436 case OSPF_NSSA_ROLE_NEVER:
437 /* We never Translate Type-7 LSA. */
438 /* TODO: check previous state and flush? */
439 if (IS_DEBUG_OSPF (nssa, NSSA))
440 zlog_debug ("ospf_abr_nssa_check_status: "
441 "never translate");
442 area->NSSATranslatorState = OSPF_NSSA_TRANSLATE_DISABLED;
443 break;
444
445 case OSPF_NSSA_ROLE_ALWAYS:
446 /* We always translate if we are an ABR
447 * TODO: originate new LSAs if state change?
448 * or let the nssa abr task take care of it?
449 */
450 if (IS_DEBUG_OSPF (nssa, NSSA))
451 zlog_debug ("ospf_abr_nssa_check_status: "
452 "translate always");
453 area->NSSATranslatorState = OSPF_NSSA_TRANSLATE_ENABLED;
454 break;
455
456 case OSPF_NSSA_ROLE_CANDIDATE:
457 /* We are a candidate for Translation */
458 if (ospf_abr_nssa_am_elected (area) > 0)
459 {
460 area->NSSATranslatorState = OSPF_NSSA_TRANSLATE_ENABLED;
461 if (IS_DEBUG_OSPF (nssa, NSSA))
462 zlog_debug ("ospf_abr_nssa_check_status: "
463 "elected translator");
464 }
465 else
466 {
467 area->NSSATranslatorState = OSPF_NSSA_TRANSLATE_DISABLED;
468 if (IS_DEBUG_OSPF (nssa, NSSA))
469 zlog_debug ("ospf_abr_nssa_check_status: " "not elected");
470 }
471 break;
472 }
473 }
474 /* RFC3101, 3.1:
475 * All NSSA border routers must set the E-bit in the Type-1 router-LSAs
476 * of their directly attached non-stub areas, even when they are not
477 * translating.
478 */
479 if (old_state != area->NSSATranslatorState)
480 {
481 if (old_state == OSPF_NSSA_TRANSLATE_DISABLED)
482 ospf_asbr_status_update (ospf, ++ospf->redistribute);
483 else if (area->NSSATranslatorState == OSPF_NSSA_TRANSLATE_DISABLED)
484 ospf_asbr_status_update (ospf, --ospf->redistribute);
485 }
paule2c6c152003-06-22 08:49:25 +0000486 }
487}
paule2c6c152003-06-22 08:49:25 +0000488
paul718e3742002-12-13 20:15:29 +0000489/* Check area border router status. */
490void
paul147193a2003-04-19 00:31:59 +0000491ospf_check_abr_status (struct ospf *ospf)
paul718e3742002-12-13 20:15:29 +0000492{
493 struct ospf_area *area;
paul1eb8ef22005-04-07 07:30:20 +0000494 struct listnode *node, *nnode;
paul718e3742002-12-13 20:15:29 +0000495 int bb_configured = 0;
496 int bb_act_attached = 0;
497 int areas_configured = 0;
498 int areas_act_attached = 0;
paul147193a2003-04-19 00:31:59 +0000499 u_char new_flags = ospf->flags;
paul718e3742002-12-13 20:15:29 +0000500
501 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +0000502 zlog_debug ("ospf_check_abr_status(): Start");
paul718e3742002-12-13 20:15:29 +0000503
paul1eb8ef22005-04-07 07:30:20 +0000504 for (ALL_LIST_ELEMENTS (ospf->areas, node, nnode, area))
paul718e3742002-12-13 20:15:29 +0000505 {
paul718e3742002-12-13 20:15:29 +0000506 if (listcount (area->oiflist))
507 {
508 areas_configured++;
509
510 if (OSPF_IS_AREA_BACKBONE (area))
511 bb_configured = 1;
512 }
513
514 if (ospf_area_actively_attached (area))
515 {
516 areas_act_attached++;
517
518 if (OSPF_IS_AREA_BACKBONE (area))
519 bb_act_attached = 1;
520 }
521 }
522
523 if (IS_DEBUG_OSPF_EVENT)
524 {
ajse84cc642004-12-08 17:28:56 +0000525 zlog_debug ("ospf_check_abr_status(): looked through areas");
526 zlog_debug ("ospf_check_abr_status(): bb_configured: %d", bb_configured);
527 zlog_debug ("ospf_check_abr_status(): bb_act_attached: %d",
paul718e3742002-12-13 20:15:29 +0000528 bb_act_attached);
ajse84cc642004-12-08 17:28:56 +0000529 zlog_debug ("ospf_check_abr_status(): areas_configured: %d",
paul718e3742002-12-13 20:15:29 +0000530 areas_configured);
ajse84cc642004-12-08 17:28:56 +0000531 zlog_debug ("ospf_check_abr_status(): areas_act_attached: %d",
paul718e3742002-12-13 20:15:29 +0000532 areas_act_attached);
533 }
534
paul147193a2003-04-19 00:31:59 +0000535 switch (ospf->abr_type)
paul718e3742002-12-13 20:15:29 +0000536 {
537 case OSPF_ABR_SHORTCUT:
538 case OSPF_ABR_STAND:
539 if (areas_act_attached > 1)
540 SET_FLAG (new_flags, OSPF_FLAG_ABR);
541 else
542 UNSET_FLAG (new_flags, OSPF_FLAG_ABR);
543 break;
544
545 case OSPF_ABR_IBM:
546 if ((areas_act_attached > 1) && bb_configured)
547 SET_FLAG (new_flags, OSPF_FLAG_ABR);
548 else
549 UNSET_FLAG (new_flags, OSPF_FLAG_ABR);
550 break;
551
552 case OSPF_ABR_CISCO:
553 if ((areas_configured > 1) && bb_act_attached)
554 SET_FLAG (new_flags, OSPF_FLAG_ABR);
555 else
556 UNSET_FLAG (new_flags, OSPF_FLAG_ABR);
557 break;
558 default:
559 break;
560 }
561
paul147193a2003-04-19 00:31:59 +0000562 if (new_flags != ospf->flags)
paul718e3742002-12-13 20:15:29 +0000563 {
paul147193a2003-04-19 00:31:59 +0000564 ospf_spf_calculate_schedule (ospf);
paul718e3742002-12-13 20:15:29 +0000565 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +0000566 zlog_debug ("ospf_check_abr_status(): new router flags: %x",new_flags);
paul147193a2003-04-19 00:31:59 +0000567 ospf->flags = new_flags;
568 OSPF_TIMER_ON (ospf->t_router_lsa_update,
paul718e3742002-12-13 20:15:29 +0000569 ospf_router_lsa_update_timer, OSPF_LSA_UPDATE_DELAY);
570 }
571}
572
paul4dadc292005-05-06 21:37:42 +0000573static void
paul718e3742002-12-13 20:15:29 +0000574ospf_abr_update_aggregate (struct ospf_area_range *range,
paul7f352b82004-02-19 19:37:47 +0000575 struct ospf_route *or)
paul718e3742002-12-13 20:15:29 +0000576{
577 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +0000578 zlog_debug ("ospf_abr_update_aggregate(): Start");
paul718e3742002-12-13 20:15:29 +0000579
paul6c835672004-10-11 11:00:30 +0000580 if (range->cost_config != OSPF_AREA_RANGE_COST_UNSPEC)
paul718e3742002-12-13 20:15:29 +0000581 {
582 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +0000583 zlog_debug ("ospf_abr_update_aggregate(): use configured cost %d",
paul7f352b82004-02-19 19:37:47 +0000584 range->cost_config);
paul718e3742002-12-13 20:15:29 +0000585
586 range->cost = range->cost_config;
587 }
588 else
589 {
590 if (range->specifics == 0)
paul7f352b82004-02-19 19:37:47 +0000591 range->cost = or->cost; /* 1st time get 1st cost */
paul718e3742002-12-13 20:15:29 +0000592
paul7f352b82004-02-19 19:37:47 +0000593 if (or->cost > range->cost)
594 {
595 if (IS_DEBUG_OSPF_EVENT)
paul500e4182005-05-26 17:11:13 +0000596 zlog_debug ("ospf_abr_update_aggregate(): largest cost, update");
paul718e3742002-12-13 20:15:29 +0000597
paul7f352b82004-02-19 19:37:47 +0000598 range->cost = or->cost;
599 }
paul718e3742002-12-13 20:15:29 +0000600 }
601
602 range->specifics++;
603}
604
605static void
606set_metric (struct ospf_lsa *lsa, u_int32_t metric)
607{
608 struct summary_lsa *header;
609 u_char *mp;
610 metric = htonl (metric);
hassoc9e52be2004-09-26 16:09:34 +0000611 mp = (u_char *) &metric;
paul718e3742002-12-13 20:15:29 +0000612 mp++;
613 header = (struct summary_lsa *) lsa->data;
614 memcpy(header->metric, mp, 3);
615}
616
paul718e3742002-12-13 20:15:29 +0000617/* ospf_abr_translate_nssa */
paul4dadc292005-05-06 21:37:42 +0000618static int
paul147193a2003-04-19 00:31:59 +0000619ospf_abr_translate_nssa (struct ospf_area *area, struct ospf_lsa *lsa)
paul718e3742002-12-13 20:15:29 +0000620{
621 /* Incoming Type-7 or later aggregated Type-7
pauld4a53d52003-07-12 21:30:57 +0000622 *
623 * LSA is skipped if P-bit is off.
624 * LSA is aggregated if within range.
625 *
626 * The Type-7 is translated, Installed/Approved as a Type-5 into
627 * global LSDB, then Flooded through AS
628 *
629 * Later, any Unapproved Translated Type-5's are flushed/discarded
630 */
paul718e3742002-12-13 20:15:29 +0000631
pauld4a53d52003-07-12 21:30:57 +0000632 struct ospf_lsa *old = NULL,
633 *new = NULL;
634 struct as_external_lsa *ext7;
635 struct prefix_ipv4 p;
paul718e3742002-12-13 20:15:29 +0000636
637 if (! CHECK_FLAG (lsa->data->options, OSPF_OPTION_NP))
638 {
639 if (IS_DEBUG_OSPF_NSSA)
ajse84cc642004-12-08 17:28:56 +0000640 zlog_debug ("ospf_abr_translate_nssa(): LSA Id %s, P-bit off, NO Translation",
pauld4a53d52003-07-12 21:30:57 +0000641 inet_ntoa (lsa->data->id));
642 return 1;
paul718e3742002-12-13 20:15:29 +0000643 }
pauld4a53d52003-07-12 21:30:57 +0000644
paul718e3742002-12-13 20:15:29 +0000645 if (IS_DEBUG_OSPF_NSSA)
ajse84cc642004-12-08 17:28:56 +0000646 zlog_debug ("ospf_abr_translate_nssa(): LSA Id %s, TRANSLATING 7 to 5",
pauld4a53d52003-07-12 21:30:57 +0000647 inet_ntoa (lsa->data->id));
paul718e3742002-12-13 20:15:29 +0000648
pauld4a53d52003-07-12 21:30:57 +0000649 ext7 = (struct as_external_lsa *)(lsa->data);
650 p.prefix = lsa->data->id;
651 p.prefixlen = ip_masklen (ext7->mask);
652
653 if (ext7->e[0].fwd_addr.s_addr == OSPF_DEFAULT_DESTINATION)
654 {
655 if (IS_DEBUG_OSPF_NSSA)
ajse84cc642004-12-08 17:28:56 +0000656 zlog_debug ("ospf_abr_translate_nssa(): LSA Id %s, "
pauld4a53d52003-07-12 21:30:57 +0000657 "Forward address is 0, NO Translation",
658 inet_ntoa (lsa->data->id));
659 return 1;
660 }
661
662 /* try find existing AS-External LSA for this prefix */
663
664 old = ospf_external_info_find_lsa (area->ospf, &p);
665
666 if (old)
667 {
668 if (IS_DEBUG_OSPF_NSSA)
ajse84cc642004-12-08 17:28:56 +0000669 zlog_debug ("ospf_abr_translate_nssa(): "
pauld4a53d52003-07-12 21:30:57 +0000670 "found old translated LSA Id %s, refreshing",
671 inet_ntoa (old->data->id));
672
673 /* refresh */
674 new = ospf_translated_nssa_refresh (area->ospf, lsa, old);
675 if (!new)
676 {
677 if (IS_DEBUG_OSPF_NSSA)
ajse84cc642004-12-08 17:28:56 +0000678 zlog_debug ("ospf_abr_translate_nssa(): "
pauld4a53d52003-07-12 21:30:57 +0000679 "could not refresh translated LSA Id %s",
680 inet_ntoa (old->data->id));
681 }
682 }
683 else
684 {
685 /* no existing external route for this LSA Id
686 * originate translated LSA
687 */
688
689 if ((new = ospf_translated_nssa_originate (area->ospf, lsa))
690 == NULL)
691 {
692 if (IS_DEBUG_OSPF_NSSA)
ajse84cc642004-12-08 17:28:56 +0000693 zlog_debug ("ospf_abr_translate_nssa(): Could not translate "
pauld4a53d52003-07-12 21:30:57 +0000694 "Type-7 for %s to Type-5",
695 inet_ntoa (lsa->data->id));
696 return 1;
697 }
698 }
paul718e3742002-12-13 20:15:29 +0000699
700 /* Area where Aggregate testing will be inserted, just like summary
701 advertisements */
702 /* ospf_abr_check_nssa_range (p_arg, lsa-> cost, lsa -> area); */
703
paul718e3742002-12-13 20:15:29 +0000704 return 0;
705}
706
paul4dadc292005-05-06 21:37:42 +0000707static void
paul718e3742002-12-13 20:15:29 +0000708ospf_abr_translate_nssa_range (struct prefix_ipv4 *p, u_int32_t cost)
709{
710 /* The Type-7 is created from the aggregated prefix and forwarded
711 for lsa installation and flooding... to be added... */
712}
paul718e3742002-12-13 20:15:29 +0000713
vincentba682532005-09-29 13:52:57 +0000714void
paul718e3742002-12-13 20:15:29 +0000715ospf_abr_announce_network_to_area (struct prefix_ipv4 *p, u_int32_t cost,
716 struct ospf_area *area)
717{
718 struct ospf_lsa *lsa, *old = NULL;
719 struct summary_lsa *sl = NULL;
720
721 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +0000722 zlog_debug ("ospf_abr_announce_network_to_area(): Start");
paul718e3742002-12-13 20:15:29 +0000723
pauld4a53d52003-07-12 21:30:57 +0000724 old = ospf_lsa_lookup_by_prefix (area->lsdb, OSPF_SUMMARY_LSA,
725 (struct prefix_ipv4 *) p,
726 area->ospf->router_id);
paul718e3742002-12-13 20:15:29 +0000727 if (old)
728 {
729 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +0000730 zlog_debug ("ospf_abr_announce_network_to_area(): old summary found");
pauld4a53d52003-07-12 21:30:57 +0000731
paul718e3742002-12-13 20:15:29 +0000732 sl = (struct summary_lsa *) old->data;
733
734 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +0000735 zlog_debug ("ospf_abr_announce_network_to_area(): "
pauld4a53d52003-07-12 21:30:57 +0000736 "old metric: %d, new metric: %d",
737 GET_METRIC (sl->metric), cost);
738
739 if (GET_METRIC (sl->metric) == cost)
740 {
741 /* unchanged. simply reapprove it */
742 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +0000743 zlog_debug ("ospf_abr_announce_network_to_area(): "
pauld4a53d52003-07-12 21:30:57 +0000744 "old summary approved");
745 SET_FLAG (old->flags, OSPF_LSA_APPROVED);
746 }
747 else
748 {
749 /* LSA is changed, refresh it */
750 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +0000751 zlog_debug ("ospf_abr_announce_network_to_area(): "
pauld4a53d52003-07-12 21:30:57 +0000752 "refreshing summary");
753 set_metric (old, cost);
754 lsa = ospf_summary_lsa_refresh (area->ospf, old);
paulc24d6022005-11-20 14:54:12 +0000755
756 if (!lsa)
757 {
758 char buf[INET_ADDRSTRLEN + 3]; /* ipv4 and /XX */
759
760 prefix2str ((struct prefix *) p, buf, sizeof(buf));
761 zlog_warn ("%s: Could not refresh %s to %s",
762 __func__,
763 buf,
764 inet_ntoa (area->area_id));
765 return;
766 }
767
paulc8987752005-07-26 06:07:22 +0000768 SET_FLAG (lsa->flags, OSPF_LSA_APPROVED);
pauld4a53d52003-07-12 21:30:57 +0000769 /* This will flood through area. */
770 }
paul718e3742002-12-13 20:15:29 +0000771 }
772 else
773 {
774 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +0000775 zlog_debug ("ospf_abr_announce_network_to_area(): "
pauld4a53d52003-07-12 21:30:57 +0000776 "creating new summary");
777 lsa = ospf_summary_lsa_originate ( (struct prefix_ipv4 *)p, cost, area);
778 /* This will flood through area. */
paul718e3742002-12-13 20:15:29 +0000779
paulc24d6022005-11-20 14:54:12 +0000780 if (!lsa)
781 {
782 char buf[INET_ADDRSTRLEN + 3]; /* ipv4 and /XX */
783
784 prefix2str ((struct prefix *)p, buf, sizeof(buf));
785 zlog_warn ("%s: Could not originate %s to %s",
786 __func__,
787 buf,
788 inet_ntoa (area->area_id));
789 return;
790 }
791
paul718e3742002-12-13 20:15:29 +0000792 SET_FLAG (lsa->flags, OSPF_LSA_APPROVED);
793 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +0000794 zlog_debug ("ospf_abr_announce_network_to_area(): "
pauld4a53d52003-07-12 21:30:57 +0000795 "flooding new version of summary");
paul718e3742002-12-13 20:15:29 +0000796 }
797
798 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +0000799 zlog_debug ("ospf_abr_announce_network_to_area(): Stop");
paul718e3742002-12-13 20:15:29 +0000800}
801
paul4dadc292005-05-06 21:37:42 +0000802static int
paul718e3742002-12-13 20:15:29 +0000803ospf_abr_nexthops_belong_to_area (struct ospf_route *or,
804 struct ospf_area *area)
805{
paul1eb8ef22005-04-07 07:30:20 +0000806 struct listnode *node, *nnode;
paul96735ee2003-08-10 02:51:22 +0000807 struct ospf_path *path;
Joakim Tjernlunda8ba8472009-07-27 12:42:34 +0200808 struct ospf_interface *oi;
paul718e3742002-12-13 20:15:29 +0000809
Joakim Tjernlunda8ba8472009-07-27 12:42:34 +0200810 for (ALL_LIST_ELEMENTS_RO (or->paths, node, path))
811 for (ALL_LIST_ELEMENTS_RO (area->oiflist, nnode, oi))
812 if (oi->ifp && oi->ifp->ifindex == path->ifindex)
813 return 1;
paul718e3742002-12-13 20:15:29 +0000814
815 return 0;
816}
817
paul4dadc292005-05-06 21:37:42 +0000818static int
pauld4a53d52003-07-12 21:30:57 +0000819ospf_abr_should_accept (struct prefix_ipv4 *p, struct ospf_area *area)
paul718e3742002-12-13 20:15:29 +0000820{
821 if (IMPORT_NAME (area))
822 {
823 if (IMPORT_LIST (area) == NULL)
824 IMPORT_LIST (area) = access_list_lookup (AFI_IP, IMPORT_NAME (area));
825
826 if (IMPORT_LIST (area))
827 if (access_list_apply (IMPORT_LIST (area), p) == FILTER_DENY)
828 return 0;
829 }
830
831 return 1;
832}
833
paul4dadc292005-05-06 21:37:42 +0000834static int
paul718e3742002-12-13 20:15:29 +0000835ospf_abr_plist_in_check (struct ospf_area *area, struct ospf_route *or,
pauld4a53d52003-07-12 21:30:57 +0000836 struct prefix_ipv4 *p)
paul718e3742002-12-13 20:15:29 +0000837{
838 if (PREFIX_NAME_IN (area))
839 {
840 if (PREFIX_LIST_IN (area) == NULL)
841 PREFIX_LIST_IN (area) = prefix_list_lookup (AFI_IP,
842 PREFIX_NAME_IN (area));
843 if (PREFIX_LIST_IN (area))
844 if (prefix_list_apply (PREFIX_LIST_IN (area), p) != PREFIX_PERMIT)
845 return 0;
846 }
847 return 1;
848}
849
paul4dadc292005-05-06 21:37:42 +0000850static int
paul718e3742002-12-13 20:15:29 +0000851ospf_abr_plist_out_check (struct ospf_area *area, struct ospf_route *or,
pauld4a53d52003-07-12 21:30:57 +0000852 struct prefix_ipv4 *p)
paul718e3742002-12-13 20:15:29 +0000853{
854 if (PREFIX_NAME_OUT (area))
855 {
856 if (PREFIX_LIST_OUT (area) == NULL)
857 PREFIX_LIST_OUT (area) = prefix_list_lookup (AFI_IP,
858 PREFIX_NAME_OUT (area));
859 if (PREFIX_LIST_OUT (area))
860 if (prefix_list_apply (PREFIX_LIST_OUT (area), p) != PREFIX_PERMIT)
861 return 0;
862 }
863 return 1;
864}
865
paul4dadc292005-05-06 21:37:42 +0000866static void
paul147193a2003-04-19 00:31:59 +0000867ospf_abr_announce_network (struct ospf *ospf,
pauld4a53d52003-07-12 21:30:57 +0000868 struct prefix_ipv4 *p, struct ospf_route *or)
paul718e3742002-12-13 20:15:29 +0000869{
paul718e3742002-12-13 20:15:29 +0000870 struct ospf_area_range *range;
paul718e3742002-12-13 20:15:29 +0000871 struct ospf_area *area, *or_area;
hasso52dc7ee2004-09-23 19:18:23 +0000872 struct listnode *node;
paul718e3742002-12-13 20:15:29 +0000873
874 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +0000875 zlog_debug ("ospf_abr_announce_network(): Start");
paul718e3742002-12-13 20:15:29 +0000876
paul147193a2003-04-19 00:31:59 +0000877 or_area = ospf_area_lookup_by_area_id (ospf, or->u.std.area_id);
paul718e3742002-12-13 20:15:29 +0000878 assert (or_area);
879
paul1eb8ef22005-04-07 07:30:20 +0000880 for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
paul718e3742002-12-13 20:15:29 +0000881 {
paul718e3742002-12-13 20:15:29 +0000882 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +0000883 zlog_debug ("ospf_abr_announce_network(): looking at area %s",
paul718e3742002-12-13 20:15:29 +0000884 inet_ntoa (area->area_id));
885
886 if (IPV4_ADDR_SAME (&or->u.std.area_id, &area->area_id))
887 continue;
888
889 if (ospf_abr_nexthops_belong_to_area (or, area))
890 continue;
891
pauld4a53d52003-07-12 21:30:57 +0000892 if (!ospf_abr_should_accept (p, area))
paul718e3742002-12-13 20:15:29 +0000893 {
894 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +0000895 zlog_debug ("ospf_abr_announce_network(): "
paul718e3742002-12-13 20:15:29 +0000896 "prefix %s/%d was denied by import-list",
897 inet_ntoa (p->prefix), p->prefixlen);
898 continue;
899 }
900
pauld4a53d52003-07-12 21:30:57 +0000901 if (!ospf_abr_plist_in_check (area, or, p))
paul718e3742002-12-13 20:15:29 +0000902 {
903 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +0000904 zlog_debug ("ospf_abr_announce_network(): "
paul718e3742002-12-13 20:15:29 +0000905 "prefix %s/%d was denied by prefix-list",
906 inet_ntoa (p->prefix), p->prefixlen);
907 continue;
908 }
909
910 if (area->external_routing != OSPF_AREA_DEFAULT && area->no_summary)
911 {
912 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +0000913 zlog_debug ("ospf_abr_announce_network(): "
paul718e3742002-12-13 20:15:29 +0000914 "area %s is stub and no_summary",
915 inet_ntoa (area->area_id));
916 continue;
917 }
918
919 if (or->path_type == OSPF_PATH_INTER_AREA)
920 {
921 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +0000922 zlog_debug ("ospf_abr_announce_network(): this is "
paul718e3742002-12-13 20:15:29 +0000923 "inter-area route to %s/%d",
924 inet_ntoa (p->prefix), p->prefixlen);
925
926 if (!OSPF_IS_AREA_BACKBONE (area))
927 ospf_abr_announce_network_to_area (p, or->cost, area);
928 }
929
930 if (or->path_type == OSPF_PATH_INTRA_AREA)
pauld4a53d52003-07-12 21:30:57 +0000931 {
932 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +0000933 zlog_debug ("ospf_abr_announce_network(): "
pauld4a53d52003-07-12 21:30:57 +0000934 "this is intra-area route to %s/%d",
935 inet_ntoa (p->prefix), p->prefixlen);
936 if ((range = ospf_area_range_match (or_area, p))
937 && !ospf_area_is_transit (area))
938 ospf_abr_update_aggregate (range, or);
939 else
940 ospf_abr_announce_network_to_area (p, or->cost, area);
941 }
paul718e3742002-12-13 20:15:29 +0000942 }
943}
944
paul4dadc292005-05-06 21:37:42 +0000945static int
paul147193a2003-04-19 00:31:59 +0000946ospf_abr_should_announce (struct ospf *ospf,
pauld4a53d52003-07-12 21:30:57 +0000947 struct prefix_ipv4 *p, struct ospf_route *or)
paul718e3742002-12-13 20:15:29 +0000948{
paul147193a2003-04-19 00:31:59 +0000949 struct ospf_area *area;
950
951 area = ospf_area_lookup_by_area_id (ospf, or->u.std.area_id);
paul718e3742002-12-13 20:15:29 +0000952
953 assert (area);
954
955 if (EXPORT_NAME (area))
956 {
957 if (EXPORT_LIST (area) == NULL)
958 EXPORT_LIST (area) = access_list_lookup (AFI_IP, EXPORT_NAME (area));
959
960 if (EXPORT_LIST (area))
961 if (access_list_apply (EXPORT_LIST (area), p) == FILTER_DENY)
962 return 0;
963 }
964
965 return 1;
966}
967
paul4dadc292005-05-06 21:37:42 +0000968static void
paul147193a2003-04-19 00:31:59 +0000969ospf_abr_process_nssa_translates (struct ospf *ospf)
paul718e3742002-12-13 20:15:29 +0000970{
971 /* Scan through all NSSA_LSDB records for all areas;
972
973 If P-bit is on, translate all Type-7's to 5's and aggregate or
974 flood install as approved in Type-5 LSDB with XLATE Flag on
975 later, do same for all aggregates... At end, DISCARD all
976 remaining UNAPPROVED Type-5's (Aggregate is for future ) */
hasso52dc7ee2004-09-23 19:18:23 +0000977 struct listnode *node;
paul718e3742002-12-13 20:15:29 +0000978 struct ospf_area *area;
paul147193a2003-04-19 00:31:59 +0000979 struct route_node *rn;
980 struct ospf_lsa *lsa;
paul718e3742002-12-13 20:15:29 +0000981
982 if (IS_DEBUG_OSPF_NSSA)
ajse84cc642004-12-08 17:28:56 +0000983 zlog_debug ("ospf_abr_process_nssa_translates(): Start");
paul718e3742002-12-13 20:15:29 +0000984
paul1eb8ef22005-04-07 07:30:20 +0000985 for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
paul718e3742002-12-13 20:15:29 +0000986 {
paule2c6c152003-06-22 08:49:25 +0000987 if (! area->NSSATranslatorState)
pauld4a53d52003-07-12 21:30:57 +0000988 continue; /* skip if not translator */
paul718e3742002-12-13 20:15:29 +0000989
990 if (area->external_routing != OSPF_AREA_NSSA)
pauld4a53d52003-07-12 21:30:57 +0000991 continue; /* skip if not Nssa Area */
paul718e3742002-12-13 20:15:29 +0000992
993 if (IS_DEBUG_OSPF_NSSA)
ajse84cc642004-12-08 17:28:56 +0000994 zlog_debug ("ospf_abr_process_nssa_translates(): "
pauld4a53d52003-07-12 21:30:57 +0000995 "looking at area %s", inet_ntoa (area->area_id));
paul718e3742002-12-13 20:15:29 +0000996
paul147193a2003-04-19 00:31:59 +0000997 LSDB_LOOP (NSSA_LSDB (area), rn, lsa)
pauld4a53d52003-07-12 21:30:57 +0000998 ospf_abr_translate_nssa (area, lsa);
paul718e3742002-12-13 20:15:29 +0000999 }
1000
1001 if (IS_DEBUG_OSPF_NSSA)
ajse84cc642004-12-08 17:28:56 +00001002 zlog_debug ("ospf_abr_process_nssa_translates(): Stop");
paul718e3742002-12-13 20:15:29 +00001003
1004}
paul718e3742002-12-13 20:15:29 +00001005
paul4dadc292005-05-06 21:37:42 +00001006static void
paul147193a2003-04-19 00:31:59 +00001007ospf_abr_process_network_rt (struct ospf *ospf,
1008 struct route_table *rt)
paul718e3742002-12-13 20:15:29 +00001009{
paul718e3742002-12-13 20:15:29 +00001010 struct ospf_area *area;
paul147193a2003-04-19 00:31:59 +00001011 struct ospf_route *or;
1012 struct route_node *rn;
paul718e3742002-12-13 20:15:29 +00001013
1014 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001015 zlog_debug ("ospf_abr_process_network_rt(): Start");
paul718e3742002-12-13 20:15:29 +00001016
1017 for (rn = route_top (rt); rn; rn = route_next (rn))
1018 {
1019 if ((or = rn->info) == NULL)
1020 continue;
1021
paul147193a2003-04-19 00:31:59 +00001022 if (!(area = ospf_area_lookup_by_area_id (ospf, or->u.std.area_id)))
paul718e3742002-12-13 20:15:29 +00001023 {
1024 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001025 zlog_debug ("ospf_abr_process_network_rt(): area %s no longer exists",
paul718e3742002-12-13 20:15:29 +00001026 inet_ntoa (or->u.std.area_id));
1027 continue;
1028 }
1029
1030 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001031 zlog_debug ("ospf_abr_process_network_rt(): this is a route to %s/%d",
paul718e3742002-12-13 20:15:29 +00001032 inet_ntoa (rn->p.u.prefix4), rn->p.prefixlen);
1033 if (or->path_type >= OSPF_PATH_TYPE1_EXTERNAL)
1034 {
1035 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001036 zlog_debug ("ospf_abr_process_network_rt(): "
paul718e3742002-12-13 20:15:29 +00001037 "this is an External router, skipping");
1038 continue;
1039 }
1040
1041 if (or->cost >= OSPF_LS_INFINITY)
1042 {
1043 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001044 zlog_debug ("ospf_abr_process_network_rt():"
paul718e3742002-12-13 20:15:29 +00001045 " this route's cost is infinity, skipping");
1046 continue;
1047 }
1048
1049 if (or->type == OSPF_DESTINATION_DISCARD)
1050 {
1051 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001052 zlog_debug ("ospf_abr_process_network_rt():"
paul718e3742002-12-13 20:15:29 +00001053 " this is a discard entry, skipping");
1054 continue;
1055 }
1056
1057 if (or->path_type == OSPF_PATH_INTRA_AREA &&
pauld4a53d52003-07-12 21:30:57 +00001058 !ospf_abr_should_announce (ospf, (struct prefix_ipv4 *) &rn->p, or))
paul718e3742002-12-13 20:15:29 +00001059 {
1060 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001061 zlog_debug("ospf_abr_process_network_rt(): denied by export-list");
paul718e3742002-12-13 20:15:29 +00001062 continue;
1063 }
1064
1065 if (or->path_type == OSPF_PATH_INTRA_AREA &&
pauld4a53d52003-07-12 21:30:57 +00001066 !ospf_abr_plist_out_check (area, or, (struct prefix_ipv4 *) &rn->p))
paul718e3742002-12-13 20:15:29 +00001067 {
1068 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001069 zlog_debug("ospf_abr_process_network_rt(): denied by prefix-list");
paul718e3742002-12-13 20:15:29 +00001070 continue;
1071 }
1072
1073 if ((or->path_type == OSPF_PATH_INTER_AREA) &&
1074 !OSPF_IS_AREA_ID_BACKBONE (or->u.std.area_id))
1075 {
1076 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001077 zlog_debug ("ospf_abr_process_network_rt():"
paul718e3742002-12-13 20:15:29 +00001078 " this is route is not backbone one, skipping");
1079 continue;
1080 }
1081
1082
paul147193a2003-04-19 00:31:59 +00001083 if ((ospf->abr_type == OSPF_ABR_CISCO) ||
1084 (ospf->abr_type == OSPF_ABR_IBM))
paul718e3742002-12-13 20:15:29 +00001085
paul147193a2003-04-19 00:31:59 +00001086 if (!ospf_act_bb_connection (ospf) &&
paul718e3742002-12-13 20:15:29 +00001087 or->path_type != OSPF_PATH_INTRA_AREA)
1088 {
1089 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001090 zlog_debug ("ospf_abr_process_network_rt(): ALT ABR: "
paul718e3742002-12-13 20:15:29 +00001091 "No BB connection, skip not intra-area routes");
1092 continue;
1093 }
1094
1095 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001096 zlog_debug ("ospf_abr_process_network_rt(): announcing");
hassofa2b17e2004-03-04 17:45:00 +00001097 ospf_abr_announce_network (ospf, (struct prefix_ipv4 *)&rn->p, or);
paul718e3742002-12-13 20:15:29 +00001098 }
1099
1100 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001101 zlog_debug ("ospf_abr_process_network_rt(): Stop");
paul718e3742002-12-13 20:15:29 +00001102}
1103
paul4dadc292005-05-06 21:37:42 +00001104static void
paul718e3742002-12-13 20:15:29 +00001105ospf_abr_announce_rtr_to_area (struct prefix_ipv4 *p, u_int32_t cost,
1106 struct ospf_area *area)
1107{
1108 struct ospf_lsa *lsa, *old = NULL;
1109 struct summary_lsa *slsa = NULL;
1110
1111 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001112 zlog_debug ("ospf_abr_announce_rtr_to_area(): Start");
paul718e3742002-12-13 20:15:29 +00001113
paul147193a2003-04-19 00:31:59 +00001114 old = ospf_lsa_lookup_by_prefix (area->lsdb, OSPF_ASBR_SUMMARY_LSA,
1115 p, area->ospf->router_id);
paul718e3742002-12-13 20:15:29 +00001116 if (old)
1117 {
1118 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001119 zlog_debug ("ospf_abr_announce_rtr_to_area(): old summary found");
paul718e3742002-12-13 20:15:29 +00001120 slsa = (struct summary_lsa *) old->data;
1121
1122 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001123 zlog_debug ("ospf_abr_announce_network_to_area(): "
paul718e3742002-12-13 20:15:29 +00001124 "old metric: %d, new metric: %d",
1125 GET_METRIC (slsa->metric), cost);
1126 }
1127
1128 if (old && (GET_METRIC (slsa->metric) == cost))
1129 {
1130 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001131 zlog_debug ("ospf_abr_announce_rtr_to_area(): old summary approved");
paul718e3742002-12-13 20:15:29 +00001132 SET_FLAG (old->flags, OSPF_LSA_APPROVED);
1133 }
1134 else
1135 {
1136 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001137 zlog_debug ("ospf_abr_announce_rtr_to_area(): 2.2");
paul718e3742002-12-13 20:15:29 +00001138
1139 if (old)
1140 {
1141 set_metric (old, cost);
paul147193a2003-04-19 00:31:59 +00001142 lsa = ospf_summary_asbr_lsa_refresh (area->ospf, old);
paul718e3742002-12-13 20:15:29 +00001143 }
1144 else
1145 lsa = ospf_summary_asbr_lsa_originate (p, cost, area);
paulc24d6022005-11-20 14:54:12 +00001146 if (!lsa)
1147 {
1148 char buf[INET_ADDRSTRLEN + 3]; /* ipv4 and /XX */
1149
1150 prefix2str ((struct prefix *)p, buf, sizeof(buf));
1151 zlog_warn ("%s: Could not refresh/originate %s to %s",
1152 __func__,
1153 buf,
1154 inet_ntoa (area->area_id));
1155 return;
1156 }
1157
paul718e3742002-12-13 20:15:29 +00001158 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001159 zlog_debug ("ospf_abr_announce_rtr_to_area(): "
paul718e3742002-12-13 20:15:29 +00001160 "flooding new version of summary");
paulc24d6022005-11-20 14:54:12 +00001161
paul718e3742002-12-13 20:15:29 +00001162 /*
1163 zlog_info ("ospf_abr_announce_rtr_to_area(): creating new summary");
1164 lsa = ospf_summary_asbr_lsa (p, cost, area, old); */
1165
1166 SET_FLAG (lsa->flags, OSPF_LSA_APPROVED);
1167 /* ospf_flood_through_area (area, NULL, lsa);*/
1168 }
1169
1170 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001171 zlog_debug ("ospf_abr_announce_rtr_to_area(): Stop");
paul718e3742002-12-13 20:15:29 +00001172}
1173
1174
paul4dadc292005-05-06 21:37:42 +00001175static void
paul147193a2003-04-19 00:31:59 +00001176ospf_abr_announce_rtr (struct ospf *ospf,
1177 struct prefix_ipv4 *p, struct ospf_route *or)
paul718e3742002-12-13 20:15:29 +00001178{
hasso52dc7ee2004-09-23 19:18:23 +00001179 struct listnode *node;
paul718e3742002-12-13 20:15:29 +00001180 struct ospf_area *area;
1181
1182 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001183 zlog_debug ("ospf_abr_announce_rtr(): Start");
paul718e3742002-12-13 20:15:29 +00001184
paul1eb8ef22005-04-07 07:30:20 +00001185 for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
paul718e3742002-12-13 20:15:29 +00001186 {
paul718e3742002-12-13 20:15:29 +00001187 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001188 zlog_debug ("ospf_abr_announce_rtr(): looking at area %s",
paul718e3742002-12-13 20:15:29 +00001189 inet_ntoa (area->area_id));
1190
1191 if (IPV4_ADDR_SAME (&or->u.std.area_id, &area->area_id))
1192 continue;
1193
1194 if (ospf_abr_nexthops_belong_to_area (or, area))
1195 continue;
1196
1197 if (area->external_routing != OSPF_AREA_DEFAULT)
1198 {
1199 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001200 zlog_debug ("ospf_abr_announce_rtr(): "
paul718e3742002-12-13 20:15:29 +00001201 "area %s doesn't support external routing",
1202 inet_ntoa(area->area_id));
1203 continue;
1204 }
1205
1206 if (or->path_type == OSPF_PATH_INTER_AREA)
1207 {
1208 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001209 zlog_debug ("ospf_abr_announce_rtr(): "
paul718e3742002-12-13 20:15:29 +00001210 "this is inter-area route to %s", inet_ntoa (p->prefix));
1211 if (!OSPF_IS_AREA_BACKBONE (area))
1212 ospf_abr_announce_rtr_to_area (p, or->cost, area);
1213 }
1214
1215 if (or->path_type == OSPF_PATH_INTRA_AREA)
1216 {
1217 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001218 zlog_debug ("ospf_abr_announce_rtr(): "
paul718e3742002-12-13 20:15:29 +00001219 "this is intra-area route to %s", inet_ntoa (p->prefix));
1220 ospf_abr_announce_rtr_to_area (p, or->cost, area);
1221 }
1222 }
1223
1224 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001225 zlog_debug ("ospf_abr_announce_rtr(): Stop");
paul718e3742002-12-13 20:15:29 +00001226}
1227
paul4dadc292005-05-06 21:37:42 +00001228static void
paul147193a2003-04-19 00:31:59 +00001229ospf_abr_process_router_rt (struct ospf *ospf, struct route_table *rt)
paul718e3742002-12-13 20:15:29 +00001230{
paul718e3742002-12-13 20:15:29 +00001231 struct ospf_route *or;
paul147193a2003-04-19 00:31:59 +00001232 struct route_node *rn;
paul718e3742002-12-13 20:15:29 +00001233 struct list *l;
1234
1235 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001236 zlog_debug ("ospf_abr_process_router_rt(): Start");
paul718e3742002-12-13 20:15:29 +00001237
1238 for (rn = route_top (rt); rn; rn = route_next (rn))
1239 {
paul1eb8ef22005-04-07 07:30:20 +00001240 struct listnode *node, *nnode;
paul718e3742002-12-13 20:15:29 +00001241 char flag = 0;
1242 struct ospf_route *best = NULL;
1243
1244 if (rn->info == NULL)
1245 continue;
1246
1247 l = rn->info;
1248
1249 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001250 zlog_debug ("ospf_abr_process_router_rt(): this is a route to %s",
paul718e3742002-12-13 20:15:29 +00001251 inet_ntoa (rn->p.u.prefix4));
1252
paul1eb8ef22005-04-07 07:30:20 +00001253 for (ALL_LIST_ELEMENTS (l, node, nnode, or))
paul718e3742002-12-13 20:15:29 +00001254 {
paul147193a2003-04-19 00:31:59 +00001255 if (!ospf_area_lookup_by_area_id (ospf, or->u.std.area_id))
paul718e3742002-12-13 20:15:29 +00001256 {
1257 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001258 zlog_debug ("ospf_abr_process_router_rt(): area %s no longer exists",
paul718e3742002-12-13 20:15:29 +00001259 inet_ntoa (or->u.std.area_id));
1260 continue;
1261 }
1262
1263
1264 if (!CHECK_FLAG (or->u.std.flags, ROUTER_LSA_EXTERNAL))
1265 {
1266 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001267 zlog_debug ("ospf_abr_process_router_rt(): "
paul718e3742002-12-13 20:15:29 +00001268 "This is not an ASBR, skipping");
1269 continue;
1270 }
1271
1272 if (!flag)
1273 {
paul147193a2003-04-19 00:31:59 +00001274 best = ospf_find_asbr_route (ospf, rt,
1275 (struct prefix_ipv4 *) &rn->p);
paul718e3742002-12-13 20:15:29 +00001276 flag = 1;
1277 }
1278
1279 if (best == NULL)
1280 continue;
1281
1282 if (or != best)
1283 {
1284 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001285 zlog_debug ("ospf_abr_process_router_rt(): "
paul718e3742002-12-13 20:15:29 +00001286 "This route is not the best among possible, skipping");
1287 continue;
1288 }
1289
1290 if (or->path_type == OSPF_PATH_INTER_AREA &&
1291 !OSPF_IS_AREA_ID_BACKBONE (or->u.std.area_id))
1292 {
1293 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001294 zlog_debug ("ospf_abr_process_router_rt(): "
paul718e3742002-12-13 20:15:29 +00001295 "This route is not a backbone one, skipping");
1296 continue;
1297 }
1298
1299 if (or->cost >= OSPF_LS_INFINITY)
1300 {
1301 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001302 zlog_debug ("ospf_abr_process_router_rt(): "
paul718e3742002-12-13 20:15:29 +00001303 "This route has LS_INFINITY metric, skipping");
1304 continue;
1305 }
1306
paul147193a2003-04-19 00:31:59 +00001307 if (ospf->abr_type == OSPF_ABR_CISCO
1308 || ospf->abr_type == OSPF_ABR_IBM)
1309 if (!ospf_act_bb_connection (ospf)
1310 && or->path_type != OSPF_PATH_INTRA_AREA)
paul718e3742002-12-13 20:15:29 +00001311 {
1312 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001313 zlog_debug("ospf_abr_process_network_rt(): ALT ABR: "
paul718e3742002-12-13 20:15:29 +00001314 "No BB connection, skip not intra-area routes");
1315 continue;
1316 }
1317
paul147193a2003-04-19 00:31:59 +00001318 ospf_abr_announce_rtr (ospf, (struct prefix_ipv4 *) &rn->p, or);
paul718e3742002-12-13 20:15:29 +00001319
1320 }
1321
1322 }
1323
1324 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001325 zlog_debug ("ospf_abr_process_router_rt(): Stop");
paul718e3742002-12-13 20:15:29 +00001326}
1327
paul4dadc292005-05-06 21:37:42 +00001328static void
paul147193a2003-04-19 00:31:59 +00001329ospf_abr_unapprove_translates (struct ospf *ospf) /* For NSSA Translations */
paul718e3742002-12-13 20:15:29 +00001330{
paul147193a2003-04-19 00:31:59 +00001331 struct ospf_lsa *lsa;
1332 struct route_node *rn;
1333
paul718e3742002-12-13 20:15:29 +00001334 if (IS_DEBUG_OSPF_NSSA)
ajse84cc642004-12-08 17:28:56 +00001335 zlog_debug ("ospf_abr_unapprove_translates(): Start");
paul718e3742002-12-13 20:15:29 +00001336
1337 /* NSSA Translator is not checked, because it may have gone away,
1338 and we would want to flush any residuals anyway */
1339
paul147193a2003-04-19 00:31:59 +00001340 LSDB_LOOP (EXTERNAL_LSDB (ospf), rn, lsa)
1341 if (CHECK_FLAG (lsa->flags, OSPF_LSA_LOCAL_XLT))
pauld4a53d52003-07-12 21:30:57 +00001342 {
1343 UNSET_FLAG (lsa->flags, OSPF_LSA_APPROVED);
1344 if (IS_DEBUG_OSPF_NSSA)
ajse84cc642004-12-08 17:28:56 +00001345 zlog_debug ("ospf_abr_unapprove_translates(): "
pauld4a53d52003-07-12 21:30:57 +00001346 "approved unset on link id %s",
1347 inet_ntoa (lsa->data->id));
1348 }
paul718e3742002-12-13 20:15:29 +00001349
1350 if (IS_DEBUG_OSPF_NSSA)
ajse84cc642004-12-08 17:28:56 +00001351 zlog_debug ("ospf_abr_unapprove_translates(): Stop");
paul718e3742002-12-13 20:15:29 +00001352}
paul718e3742002-12-13 20:15:29 +00001353
paul4dadc292005-05-06 21:37:42 +00001354static void
paul147193a2003-04-19 00:31:59 +00001355ospf_abr_unapprove_summaries (struct ospf *ospf)
paul718e3742002-12-13 20:15:29 +00001356{
hasso52dc7ee2004-09-23 19:18:23 +00001357 struct listnode *node;
paul718e3742002-12-13 20:15:29 +00001358 struct ospf_area *area;
paul147193a2003-04-19 00:31:59 +00001359 struct route_node *rn;
1360 struct ospf_lsa *lsa;
paul718e3742002-12-13 20:15:29 +00001361
1362 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001363 zlog_debug ("ospf_abr_unapprove_summaries(): Start");
paul718e3742002-12-13 20:15:29 +00001364
paul1eb8ef22005-04-07 07:30:20 +00001365 for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
paul718e3742002-12-13 20:15:29 +00001366 {
pauld4a53d52003-07-12 21:30:57 +00001367 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001368 zlog_debug ("ospf_abr_unapprove_summaries(): "
pauld4a53d52003-07-12 21:30:57 +00001369 "considering area %s",
1370 inet_ntoa (area->area_id));
paul147193a2003-04-19 00:31:59 +00001371 LSDB_LOOP (SUMMARY_LSDB (area), rn, lsa)
pauld4a53d52003-07-12 21:30:57 +00001372 if (ospf_lsa_is_self_originated (ospf, lsa))
1373 {
1374 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001375 zlog_debug ("ospf_abr_unapprove_summaries(): "
pauld4a53d52003-07-12 21:30:57 +00001376 "approved unset on summary link id %s",
1377 inet_ntoa (lsa->data->id));
1378 UNSET_FLAG (lsa->flags, OSPF_LSA_APPROVED);
1379 }
paul147193a2003-04-19 00:31:59 +00001380
1381 LSDB_LOOP (ASBR_SUMMARY_LSDB (area), rn, lsa)
pauld4a53d52003-07-12 21:30:57 +00001382 if (ospf_lsa_is_self_originated (ospf, lsa))
1383 {
1384 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001385 zlog_debug ("ospf_abr_unapprove_summaries(): "
pauld4a53d52003-07-12 21:30:57 +00001386 "approved unset on asbr-summary link id %s",
1387 inet_ntoa (lsa->data->id));
1388 UNSET_FLAG (lsa->flags, OSPF_LSA_APPROVED);
1389 }
paul718e3742002-12-13 20:15:29 +00001390 }
1391
1392 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001393 zlog_debug ("ospf_abr_unapprove_summaries(): Stop");
paul718e3742002-12-13 20:15:29 +00001394}
1395
paul4dadc292005-05-06 21:37:42 +00001396static void
paul147193a2003-04-19 00:31:59 +00001397ospf_abr_prepare_aggregates (struct ospf *ospf)
paul718e3742002-12-13 20:15:29 +00001398{
hasso52dc7ee2004-09-23 19:18:23 +00001399 struct listnode *node;
paul718e3742002-12-13 20:15:29 +00001400 struct route_node *rn;
1401 struct ospf_area_range *range;
paul1eb8ef22005-04-07 07:30:20 +00001402 struct ospf_area *area;
paul718e3742002-12-13 20:15:29 +00001403
1404 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001405 zlog_debug ("ospf_abr_prepare_aggregates(): Start");
paul718e3742002-12-13 20:15:29 +00001406
paul1eb8ef22005-04-07 07:30:20 +00001407 for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
paul718e3742002-12-13 20:15:29 +00001408 {
paul718e3742002-12-13 20:15:29 +00001409 for (rn = route_top (area->ranges); rn; rn = route_next (rn))
1410 if ((range = rn->info) != NULL)
1411 {
1412 range->cost = 0;
1413 range->specifics = 0;
1414 }
1415 }
1416
1417 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001418 zlog_debug ("ospf_abr_prepare_aggregates(): Stop");
paul718e3742002-12-13 20:15:29 +00001419}
1420
paul4dadc292005-05-06 21:37:42 +00001421static void
paul147193a2003-04-19 00:31:59 +00001422ospf_abr_announce_aggregates (struct ospf *ospf)
paul718e3742002-12-13 20:15:29 +00001423{
1424 struct ospf_area *area, *ar;
1425 struct ospf_area_range *range;
1426 struct route_node *rn;
pauld4a53d52003-07-12 21:30:57 +00001427 struct prefix p;
hasso52dc7ee2004-09-23 19:18:23 +00001428 struct listnode *node, *n;
paul718e3742002-12-13 20:15:29 +00001429
1430 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001431 zlog_debug ("ospf_abr_announce_aggregates(): Start");
paul718e3742002-12-13 20:15:29 +00001432
paul1eb8ef22005-04-07 07:30:20 +00001433 for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
paul718e3742002-12-13 20:15:29 +00001434 {
paul718e3742002-12-13 20:15:29 +00001435 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001436 zlog_debug ("ospf_abr_announce_aggregates(): looking at area %s",
paul718e3742002-12-13 20:15:29 +00001437 inet_ntoa (area->area_id));
1438
1439 for (rn = route_top (area->ranges); rn; rn = route_next (rn))
1440 if ((range = rn->info))
1441 {
1442 if (!CHECK_FLAG (range->flags, OSPF_AREA_RANGE_ADVERTISE))
1443 {
1444 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001445 zlog_debug ("ospf_abr_announce_aggregates():"
paul718e3742002-12-13 20:15:29 +00001446 " discarding suppress-ranges");
1447 continue;
1448 }
1449
1450 p.family = AF_INET;
pauld4a53d52003-07-12 21:30:57 +00001451 p.u.prefix4 = range->addr;
paul718e3742002-12-13 20:15:29 +00001452 p.prefixlen = range->masklen;
1453
1454 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001455 zlog_debug ("ospf_abr_announce_aggregates():"
paul718e3742002-12-13 20:15:29 +00001456 " this is range: %s/%d",
pauld4a53d52003-07-12 21:30:57 +00001457 inet_ntoa (p.u.prefix4), p.prefixlen);
paul718e3742002-12-13 20:15:29 +00001458
1459 if (CHECK_FLAG (range->flags, OSPF_AREA_RANGE_SUBSTITUTE))
1460 {
1461 p.family = AF_INET;
pauld4a53d52003-07-12 21:30:57 +00001462 p.u.prefix4 = range->subst_addr;
paul718e3742002-12-13 20:15:29 +00001463 p.prefixlen = range->subst_masklen;
1464 }
1465
1466 if (range->specifics)
1467 {
1468 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001469 zlog_debug ("ospf_abr_announce_aggregates(): active range");
paul718e3742002-12-13 20:15:29 +00001470
paul1eb8ef22005-04-07 07:30:20 +00001471 for (ALL_LIST_ELEMENTS_RO (ospf->areas, n, ar))
paul718e3742002-12-13 20:15:29 +00001472 {
paul718e3742002-12-13 20:15:29 +00001473 if (ar == area)
1474 continue;
1475
1476 /* We do not check nexthops here, because
1477 intra-area routes can be associated with
1478 one area only */
1479
1480 /* backbone routes are not summarized
1481 when announced into transit areas */
1482
1483 if (ospf_area_is_transit (ar) &&
1484 OSPF_IS_AREA_BACKBONE (area))
1485 {
1486 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001487 zlog_debug ("ospf_abr_announce_aggregates(): Skipping "
paul718e3742002-12-13 20:15:29 +00001488 "announcement of BB aggregate into"
1489 " a transit area");
1490 continue;
1491 }
hassofa2b17e2004-03-04 17:45:00 +00001492 ospf_abr_announce_network_to_area ((struct prefix_ipv4 *)&p, range->cost, ar);
paul718e3742002-12-13 20:15:29 +00001493 }
1494 }
1495 }
1496 }
1497
1498 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001499 zlog_debug ("ospf_abr_announce_aggregates(): Stop");
paul718e3742002-12-13 20:15:29 +00001500}
1501
paul4dadc292005-05-06 21:37:42 +00001502static void
paul147193a2003-04-19 00:31:59 +00001503ospf_abr_send_nssa_aggregates (struct ospf *ospf) /* temporarily turned off */
paul718e3742002-12-13 20:15:29 +00001504{
hasso52dc7ee2004-09-23 19:18:23 +00001505 struct listnode *node; /*, n; */
paul718e3742002-12-13 20:15:29 +00001506 struct ospf_area *area; /*, *ar; */
1507 struct route_node *rn;
1508 struct ospf_area_range *range;
1509 struct prefix_ipv4 p;
1510
1511 if (IS_DEBUG_OSPF_NSSA)
ajse84cc642004-12-08 17:28:56 +00001512 zlog_debug ("ospf_abr_send_nssa_aggregates(): Start");
paul718e3742002-12-13 20:15:29 +00001513
paul1eb8ef22005-04-07 07:30:20 +00001514 for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
paul718e3742002-12-13 20:15:29 +00001515 {
paule2c6c152003-06-22 08:49:25 +00001516 if (! area->NSSATranslatorState)
paul718e3742002-12-13 20:15:29 +00001517 continue;
1518
1519 if (IS_DEBUG_OSPF_NSSA)
ajse84cc642004-12-08 17:28:56 +00001520 zlog_debug ("ospf_abr_send_nssa_aggregates(): looking at area %s",
paul718e3742002-12-13 20:15:29 +00001521 inet_ntoa (area->area_id));
1522
1523 for (rn = route_top (area->ranges); rn; rn = route_next (rn))
1524 {
1525 if (rn->info == NULL)
1526 continue;
1527
1528 range = rn->info;
1529
1530 if (!CHECK_FLAG (range->flags, OSPF_AREA_RANGE_ADVERTISE))
1531 {
1532 if (IS_DEBUG_OSPF_NSSA)
ajse84cc642004-12-08 17:28:56 +00001533 zlog_debug ("ospf_abr_send_nssa_aggregates():"
paul718e3742002-12-13 20:15:29 +00001534 " discarding suppress-ranges");
1535 continue;
1536 }
1537
1538 p.family = AF_INET;
1539 p.prefix = range->addr;
1540 p.prefixlen = range->masklen;
1541
1542 if (IS_DEBUG_OSPF_NSSA)
ajse84cc642004-12-08 17:28:56 +00001543 zlog_debug ("ospf_abr_send_nssa_aggregates():"
paul718e3742002-12-13 20:15:29 +00001544 " this is range: %s/%d",
1545 inet_ntoa (p.prefix), p.prefixlen);
1546
1547 if (CHECK_FLAG (range->flags, OSPF_AREA_RANGE_SUBSTITUTE))
1548 {
1549 p.family = AF_INET;
1550 p.prefix = range->subst_addr;
1551 p.prefixlen = range->subst_masklen;
1552 }
1553
1554 if (range->specifics)
paule2c6c152003-06-22 08:49:25 +00001555 {
1556 if (IS_DEBUG_OSPF_NSSA)
ajse84cc642004-12-08 17:28:56 +00001557 zlog_debug ("ospf_abr_send_nssa_aggregates(): active range");
paul718e3742002-12-13 20:15:29 +00001558
paule2c6c152003-06-22 08:49:25 +00001559 /* Fetch LSA-Type-7 from aggregate prefix, and then
1560 * translate, Install (as Type-5), Approve, and Flood
1561 */
1562 ospf_abr_translate_nssa_range (&p, range->cost);
1563 }
1564 } /* all area ranges*/
paul718e3742002-12-13 20:15:29 +00001565 } /* all areas */
1566
1567 if (IS_DEBUG_OSPF_NSSA)
ajse84cc642004-12-08 17:28:56 +00001568 zlog_debug ("ospf_abr_send_nssa_aggregates(): Stop");
paul718e3742002-12-13 20:15:29 +00001569}
1570
paul4dadc292005-05-06 21:37:42 +00001571static void
paul147193a2003-04-19 00:31:59 +00001572ospf_abr_announce_stub_defaults (struct ospf *ospf)
paul718e3742002-12-13 20:15:29 +00001573{
hasso52dc7ee2004-09-23 19:18:23 +00001574 struct listnode *node;
paul718e3742002-12-13 20:15:29 +00001575 struct ospf_area *area;
1576 struct prefix_ipv4 p;
1577
paul147193a2003-04-19 00:31:59 +00001578 if (! IS_OSPF_ABR (ospf))
paul718e3742002-12-13 20:15:29 +00001579 return;
1580
1581 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001582 zlog_debug ("ospf_abr_announce_stub_defaults(): Start");
paul718e3742002-12-13 20:15:29 +00001583
1584 p.family = AF_INET;
1585 p.prefix.s_addr = OSPF_DEFAULT_DESTINATION;
1586 p.prefixlen = 0;
1587
paul1eb8ef22005-04-07 07:30:20 +00001588 for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
paul718e3742002-12-13 20:15:29 +00001589 {
paul718e3742002-12-13 20:15:29 +00001590 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001591 zlog_debug ("ospf_abr_announce_stub_defaults(): looking at area %s",
1592 inet_ntoa (area->area_id));
paul718e3742002-12-13 20:15:29 +00001593
pauld4a53d52003-07-12 21:30:57 +00001594 if ( (area->external_routing != OSPF_AREA_STUB)
pauld4a53d52003-07-12 21:30:57 +00001595 && (area->external_routing != OSPF_AREA_NSSA)
pauld4a53d52003-07-12 21:30:57 +00001596 )
1597 continue;
paul718e3742002-12-13 20:15:29 +00001598
1599 if (OSPF_IS_AREA_BACKBONE (area))
pauld4a53d52003-07-12 21:30:57 +00001600 continue; /* Sanity Check */
1601
paul718e3742002-12-13 20:15:29 +00001602 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001603 zlog_debug ("ospf_abr_announce_stub_defaults(): "
1604 "announcing 0.0.0.0/0 to area %s",
pauld4a53d52003-07-12 21:30:57 +00001605 inet_ntoa (area->area_id));
paul718e3742002-12-13 20:15:29 +00001606 ospf_abr_announce_network_to_area (&p, area->default_cost, area);
1607 }
1608
1609 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001610 zlog_debug ("ospf_abr_announce_stub_defaults(): Stop");
paul718e3742002-12-13 20:15:29 +00001611}
1612
paul4dadc292005-05-06 21:37:42 +00001613static int
paul147193a2003-04-19 00:31:59 +00001614ospf_abr_remove_unapproved_translates_apply (struct ospf *ospf,
1615 struct ospf_lsa *lsa)
paul718e3742002-12-13 20:15:29 +00001616{
1617 if (CHECK_FLAG (lsa->flags, OSPF_LSA_LOCAL_XLT)
1618 && ! CHECK_FLAG (lsa->flags, OSPF_LSA_APPROVED))
1619 {
1620 zlog_info ("ospf_abr_remove_unapproved_translates(): "
1621 "removing unapproved translates, ID: %s",
1622 inet_ntoa (lsa->data->id));
1623
1624 /* FLUSH THROUGHOUT AS */
paul147193a2003-04-19 00:31:59 +00001625 ospf_lsa_flush_as (ospf, lsa);
paul718e3742002-12-13 20:15:29 +00001626
1627 /* DISCARD from LSDB */
1628 }
1629 return 0;
1630}
1631
paul4dadc292005-05-06 21:37:42 +00001632static void
paul147193a2003-04-19 00:31:59 +00001633ospf_abr_remove_unapproved_translates (struct ospf *ospf)
paul718e3742002-12-13 20:15:29 +00001634{
paul147193a2003-04-19 00:31:59 +00001635 struct route_node *rn;
1636 struct ospf_lsa *lsa;
1637
paul718e3742002-12-13 20:15:29 +00001638 /* All AREA PROCESS should have APPROVED necessary LSAs */
1639 /* Remove any left over and not APPROVED */
1640 if (IS_DEBUG_OSPF_NSSA)
ajse84cc642004-12-08 17:28:56 +00001641 zlog_debug ("ospf_abr_remove_unapproved_translates(): Start");
paul718e3742002-12-13 20:15:29 +00001642
paul147193a2003-04-19 00:31:59 +00001643 LSDB_LOOP (EXTERNAL_LSDB (ospf), rn, lsa)
1644 ospf_abr_remove_unapproved_translates_apply (ospf, lsa);
paul718e3742002-12-13 20:15:29 +00001645
1646 if (IS_DEBUG_OSPF_NSSA)
ajse84cc642004-12-08 17:28:56 +00001647 zlog_debug ("ospf_abr_remove_unapproved_translates(): Stop");
paul718e3742002-12-13 20:15:29 +00001648}
paul718e3742002-12-13 20:15:29 +00001649
paul4dadc292005-05-06 21:37:42 +00001650static void
paul147193a2003-04-19 00:31:59 +00001651ospf_abr_remove_unapproved_summaries (struct ospf *ospf)
paul718e3742002-12-13 20:15:29 +00001652{
hasso52dc7ee2004-09-23 19:18:23 +00001653 struct listnode *node;
paul718e3742002-12-13 20:15:29 +00001654 struct ospf_area *area;
paul147193a2003-04-19 00:31:59 +00001655 struct route_node *rn;
1656 struct ospf_lsa *lsa;
paul718e3742002-12-13 20:15:29 +00001657
1658 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001659 zlog_debug ("ospf_abr_remove_unapproved_summaries(): Start");
paul718e3742002-12-13 20:15:29 +00001660
paul1eb8ef22005-04-07 07:30:20 +00001661 for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
paul718e3742002-12-13 20:15:29 +00001662 {
paul718e3742002-12-13 20:15:29 +00001663 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001664 zlog_debug ("ospf_abr_remove_unapproved_summaries(): "
paul718e3742002-12-13 20:15:29 +00001665 "looking at area %s", inet_ntoa (area->area_id));
1666
paul147193a2003-04-19 00:31:59 +00001667 LSDB_LOOP (SUMMARY_LSDB (area), rn, lsa)
1668 if (ospf_lsa_is_self_originated (ospf, lsa))
1669 if (!CHECK_FLAG (lsa->flags, OSPF_LSA_APPROVED))
1670 ospf_lsa_flush_area (lsa, area);
1671
1672 LSDB_LOOP (ASBR_SUMMARY_LSDB (area), rn, lsa)
1673 if (ospf_lsa_is_self_originated (ospf, lsa))
1674 if (!CHECK_FLAG (lsa->flags, OSPF_LSA_APPROVED))
1675 ospf_lsa_flush_area (lsa, area);
paul718e3742002-12-13 20:15:29 +00001676 }
1677
1678 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001679 zlog_debug ("ospf_abr_remove_unapproved_summaries(): Stop");
paul718e3742002-12-13 20:15:29 +00001680}
1681
paul4dadc292005-05-06 21:37:42 +00001682static void
paul147193a2003-04-19 00:31:59 +00001683ospf_abr_manage_discard_routes (struct ospf *ospf)
paul718e3742002-12-13 20:15:29 +00001684{
paul1eb8ef22005-04-07 07:30:20 +00001685 struct listnode *node, *nnode;
paul718e3742002-12-13 20:15:29 +00001686 struct route_node *rn;
1687 struct ospf_area *area;
1688 struct ospf_area_range *range;
1689
paul1eb8ef22005-04-07 07:30:20 +00001690 for (ALL_LIST_ELEMENTS (ospf->areas, node, nnode, area))
1691 for (rn = route_top (area->ranges); rn; rn = route_next (rn))
1692 if ((range = rn->info) != NULL)
1693 if (CHECK_FLAG (range->flags, OSPF_AREA_RANGE_ADVERTISE))
1694 {
1695 if (range->specifics)
1696 ospf_add_discard_route (ospf->new_table, area,
1697 (struct prefix_ipv4 *) &rn->p);
1698 else
1699 ospf_delete_discard_route ((struct prefix_ipv4 *) &rn->p);
1700 }
paul718e3742002-12-13 20:15:29 +00001701}
1702
paul718e3742002-12-13 20:15:29 +00001703/* This is the function taking care about ABR NSSA, i.e. NSSA
1704 Translator, -LSA aggregation and flooding. For all NSSAs
1705
1706 Any SELF-AS-LSA is in the Type-5 LSDB and Type-7 LSDB. These LSA's
1707 are refreshed from the Type-5 LSDB, installed into the Type-7 LSDB
1708 with the P-bit set.
1709
1710 Any received Type-5s are legal for an ABR, else illegal for IR.
1711 Received Type-7s are installed, by area, with incoming P-bit. They
1712 are flooded; if the Elected NSSA Translator, then P-bit off.
1713
1714 Additionally, this ABR will place "translated type-7's" into the
1715 Type-5 LSDB in order to keep track of APPROVAL or not.
1716
1717 It will scan through every area, looking for Type-7 LSAs with P-Bit
1718 SET. The Type-7's are either AS-FLOODED & 5-INSTALLED or
1719 AGGREGATED. Later, the AGGREGATED LSAs are AS-FLOODED &
1720 5-INSTALLED.
1721
1722 5-INSTALLED is into the Type-5 LSDB; Any UNAPPROVED Type-5 LSAs
1723 left over are FLUSHED and DISCARDED.
1724
1725 For External Calculations, any NSSA areas use the Type-7 AREA-LSDB,
1726 any ABR-non-NSSA areas use the Type-5 GLOBAL-LSDB. */
1727
paul4dadc292005-05-06 21:37:42 +00001728static void
paul147193a2003-04-19 00:31:59 +00001729ospf_abr_nssa_task (struct ospf *ospf) /* called only if any_nssa */
paul718e3742002-12-13 20:15:29 +00001730{
1731 if (IS_DEBUG_OSPF_NSSA)
ajse84cc642004-12-08 17:28:56 +00001732 zlog_debug ("Check for NSSA-ABR Tasks():");
paul718e3742002-12-13 20:15:29 +00001733
paul147193a2003-04-19 00:31:59 +00001734 if (! IS_OSPF_ABR (ospf))
paul718e3742002-12-13 20:15:29 +00001735 return;
1736
paul147193a2003-04-19 00:31:59 +00001737 if (! ospf->anyNSSA)
paul718e3742002-12-13 20:15:29 +00001738 return;
1739
1740 /* Each area must confirm TranslatorRole */
1741 if (IS_DEBUG_OSPF_NSSA)
ajse84cc642004-12-08 17:28:56 +00001742 zlog_debug ("ospf_abr_nssa_task(): Start");
paul718e3742002-12-13 20:15:29 +00001743
1744 /* For all Global Entries flagged "local-translate", unset APPROVED */
1745 if (IS_DEBUG_OSPF_NSSA)
ajse84cc642004-12-08 17:28:56 +00001746 zlog_debug ("ospf_abr_nssa_task(): unapprove translates");
paul718e3742002-12-13 20:15:29 +00001747
paul147193a2003-04-19 00:31:59 +00001748 ospf_abr_unapprove_translates (ospf);
paul718e3742002-12-13 20:15:29 +00001749
1750 /* RESET all Ranges in every Area, same as summaries */
1751 if (IS_DEBUG_OSPF_NSSA)
ajse84cc642004-12-08 17:28:56 +00001752 zlog_debug ("ospf_abr_nssa_task(): NSSA initialize aggregates");
paule2c6c152003-06-22 08:49:25 +00001753 ospf_abr_prepare_aggregates (ospf); /*TURNED OFF just for now */
paul718e3742002-12-13 20:15:29 +00001754
1755 /* For all NSSAs, Type-7s, translate to 5's, INSTALL/FLOOD, or
paule2c6c152003-06-22 08:49:25 +00001756 * Aggregate as Type-7
1757 * Install or Approve in Type-5 Global LSDB
1758 */
paul718e3742002-12-13 20:15:29 +00001759 if (IS_DEBUG_OSPF_NSSA)
ajse84cc642004-12-08 17:28:56 +00001760 zlog_debug ("ospf_abr_nssa_task(): process translates");
paul147193a2003-04-19 00:31:59 +00001761 ospf_abr_process_nssa_translates (ospf);
paul718e3742002-12-13 20:15:29 +00001762
1763 /* Translate/Send any "ranged" aggregates, and also 5-Install and
paule2c6c152003-06-22 08:49:25 +00001764 * Approve
1765 * Scan Type-7's for aggregates, translate to Type-5's,
1766 * Install/Flood/Approve
1767 */
paul718e3742002-12-13 20:15:29 +00001768 if (IS_DEBUG_OSPF_NSSA)
ajse84cc642004-12-08 17:28:56 +00001769 zlog_debug("ospf_abr_nssa_task(): send NSSA aggregates");
paule2c6c152003-06-22 08:49:25 +00001770 ospf_abr_send_nssa_aggregates (ospf); /*TURNED OFF FOR NOW */
paul718e3742002-12-13 20:15:29 +00001771
pauld4a53d52003-07-12 21:30:57 +00001772 /* Send any NSSA defaults as Type-5
1773 *if (IS_DEBUG_OSPF_NSSA)
ajse84cc642004-12-08 17:28:56 +00001774 * zlog_debug ("ospf_abr_nssa_task(): announce nssa defaults");
pauld4a53d52003-07-12 21:30:57 +00001775 *ospf_abr_announce_nssa_defaults (ospf);
1776 * havnt a clue what above is supposed to do.
1777 */
paul718e3742002-12-13 20:15:29 +00001778
1779 /* Flush any unapproved previous translates from Global Data Base */
1780 if (IS_DEBUG_OSPF_NSSA)
ajse84cc642004-12-08 17:28:56 +00001781 zlog_debug ("ospf_abr_nssa_task(): remove unapproved translates");
paul147193a2003-04-19 00:31:59 +00001782 ospf_abr_remove_unapproved_translates (ospf);
paul718e3742002-12-13 20:15:29 +00001783
paul147193a2003-04-19 00:31:59 +00001784 ospf_abr_manage_discard_routes (ospf); /* same as normal...discard */
paul718e3742002-12-13 20:15:29 +00001785
1786 if (IS_DEBUG_OSPF_NSSA)
ajse84cc642004-12-08 17:28:56 +00001787 zlog_debug ("ospf_abr_nssa_task(): Stop");
paul718e3742002-12-13 20:15:29 +00001788}
paul718e3742002-12-13 20:15:29 +00001789
1790/* This is the function taking care about ABR stuff, i.e.
1791 summary-LSA origination and flooding. */
1792void
paul147193a2003-04-19 00:31:59 +00001793ospf_abr_task (struct ospf *ospf)
paul718e3742002-12-13 20:15:29 +00001794{
1795 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001796 zlog_debug ("ospf_abr_task(): Start");
paul718e3742002-12-13 20:15:29 +00001797
paul147193a2003-04-19 00:31:59 +00001798 if (ospf->new_table == NULL || ospf->new_rtrs == NULL)
paul718e3742002-12-13 20:15:29 +00001799 {
1800 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001801 zlog_debug ("ospf_abr_task(): Routing tables are not yet ready");
paul718e3742002-12-13 20:15:29 +00001802 return;
1803 }
1804
1805 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001806 zlog_debug ("ospf_abr_task(): unapprove summaries");
paul147193a2003-04-19 00:31:59 +00001807 ospf_abr_unapprove_summaries (ospf);
paul718e3742002-12-13 20:15:29 +00001808
1809 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001810 zlog_debug ("ospf_abr_task(): prepare aggregates");
paul147193a2003-04-19 00:31:59 +00001811 ospf_abr_prepare_aggregates (ospf);
paul718e3742002-12-13 20:15:29 +00001812
paul147193a2003-04-19 00:31:59 +00001813 if (IS_OSPF_ABR (ospf))
paul718e3742002-12-13 20:15:29 +00001814 {
1815 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001816 zlog_debug ("ospf_abr_task(): process network RT");
paul147193a2003-04-19 00:31:59 +00001817 ospf_abr_process_network_rt (ospf, ospf->new_table);
paul718e3742002-12-13 20:15:29 +00001818
1819 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001820 zlog_debug ("ospf_abr_task(): process router RT");
paul147193a2003-04-19 00:31:59 +00001821 ospf_abr_process_router_rt (ospf, ospf->new_rtrs);
paul718e3742002-12-13 20:15:29 +00001822
1823 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001824 zlog_debug ("ospf_abr_task(): announce aggregates");
paul147193a2003-04-19 00:31:59 +00001825 ospf_abr_announce_aggregates (ospf);
paul718e3742002-12-13 20:15:29 +00001826
1827 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001828 zlog_debug ("ospf_abr_task(): announce stub defaults");
paul147193a2003-04-19 00:31:59 +00001829 ospf_abr_announce_stub_defaults (ospf);
paul718e3742002-12-13 20:15:29 +00001830 }
1831
1832 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001833 zlog_debug ("ospf_abr_task(): remove unapproved summaries");
paul147193a2003-04-19 00:31:59 +00001834 ospf_abr_remove_unapproved_summaries (ospf);
paul718e3742002-12-13 20:15:29 +00001835
paul147193a2003-04-19 00:31:59 +00001836 ospf_abr_manage_discard_routes (ospf);
paul718e3742002-12-13 20:15:29 +00001837
paul718e3742002-12-13 20:15:29 +00001838 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001839 zlog_debug ("ospf_abr_task(): Stop");
paul718e3742002-12-13 20:15:29 +00001840}
1841
paul4dadc292005-05-06 21:37:42 +00001842static int
paul147193a2003-04-19 00:31:59 +00001843ospf_abr_task_timer (struct thread *thread)
paul718e3742002-12-13 20:15:29 +00001844{
paul147193a2003-04-19 00:31:59 +00001845 struct ospf *ospf = THREAD_ARG (thread);
1846
1847 ospf->t_abr_task = 0;
paul718e3742002-12-13 20:15:29 +00001848
1849 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001850 zlog_debug ("Running ABR task on timer");
paul718e3742002-12-13 20:15:29 +00001851
paul147193a2003-04-19 00:31:59 +00001852 ospf_check_abr_status (ospf);
pauld4a53d52003-07-12 21:30:57 +00001853 ospf_abr_nssa_check_status (ospf);
paul718e3742002-12-13 20:15:29 +00001854
paul147193a2003-04-19 00:31:59 +00001855 ospf_abr_task (ospf);
paule2c6c152003-06-22 08:49:25 +00001856 ospf_abr_nssa_task (ospf); /* if nssa-abr, then scan Type-7 LSDB */
paul718e3742002-12-13 20:15:29 +00001857
paul147193a2003-04-19 00:31:59 +00001858 return 0;
paul718e3742002-12-13 20:15:29 +00001859}
1860
1861void
paul147193a2003-04-19 00:31:59 +00001862ospf_schedule_abr_task (struct ospf *ospf)
paul718e3742002-12-13 20:15:29 +00001863{
1864 if (IS_DEBUG_OSPF_EVENT)
ajse84cc642004-12-08 17:28:56 +00001865 zlog_debug ("Scheduling ABR task");
paul147193a2003-04-19 00:31:59 +00001866
1867 if (ospf->t_abr_task == NULL)
1868 ospf->t_abr_task = thread_add_timer (master, ospf_abr_task_timer,
1869 ospf, OSPF_ABR_TASK_DELAY);
paul718e3742002-12-13 20:15:29 +00001870}