3 * Copyright (C) 1999, 2000 Alex Zinin, Toshiaki Takada
5 * This file is part of GNU Zebra.
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
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.
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
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"
54 static struct ospf_area_range
*
55 ospf_area_range_new (struct prefix_ipv4
*p
)
57 struct ospf_area_range
*range
;
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
;
68 ospf_area_range_free (struct ospf_area_range
*range
)
70 XFREE (MTYPE_OSPF_AREA_RANGE
, range
);
74 ospf_area_range_add (struct ospf_area
*area
, struct ospf_area_range
*range
)
76 struct route_node
*rn
;
80 p
.prefixlen
= range
->masklen
;
81 p
.prefix
= range
->addr
;
83 rn
= route_node_get (area
->ranges
, (struct prefix
*)&p
);
85 route_unlock_node (rn
);
91 ospf_area_range_delete (struct ospf_area
*area
, struct route_node
*rn
)
93 struct ospf_area_range
*range
= rn
->info
;
95 if (range
->specifics
!= 0)
96 ospf_delete_discard_route (area
->ospf
->new_table
,
97 (struct prefix_ipv4
*) &rn
->p
);
99 ospf_area_range_free (range
);
101 route_unlock_node (rn
);
102 route_unlock_node (rn
);
105 struct ospf_area_range
*
106 ospf_area_range_lookup (struct ospf_area
*area
, struct prefix_ipv4
*p
)
108 struct route_node
*rn
;
110 rn
= route_node_lookup (area
->ranges
, (struct prefix
*)p
);
113 route_unlock_node (rn
);
119 struct ospf_area_range
*
120 ospf_area_range_lookup_next (struct ospf_area
*area
,
121 struct in_addr
*range_net
,
124 struct route_node
*rn
;
125 struct prefix_ipv4 p
;
126 struct ospf_area_range
*find
;
129 p
.prefixlen
= IPV4_MAX_BITLEN
;
130 p
.prefix
= *range_net
;
133 rn
= route_top (area
->ranges
);
136 rn
= route_node_get (area
->ranges
, (struct prefix
*) &p
);
137 rn
= route_next (rn
);
140 for (; rn
; rn
= route_next (rn
))
147 *range_net
= rn
->p
.u
.prefix4
;
148 route_unlock_node (rn
);
154 static struct ospf_area_range
*
155 ospf_area_range_match (struct ospf_area
*area
, struct prefix_ipv4
*p
)
157 struct route_node
*node
;
159 node
= route_node_match (area
->ranges
, (struct prefix
*) p
);
162 route_unlock_node (node
);
168 struct ospf_area_range
*
169 ospf_area_range_match_any (struct ospf
*ospf
, struct prefix_ipv4
*p
)
171 struct ospf_area_range
*range
;
172 struct ospf_area
*area
;
173 struct listnode
*node
;
175 for (ALL_LIST_ELEMENTS_RO (ospf
->areas
, node
, area
))
176 if ((range
= ospf_area_range_match (area
, p
)))
183 ospf_area_range_active (struct ospf_area_range
*range
)
185 return range
->specifics
;
189 ospf_area_actively_attached (struct ospf_area
*area
)
191 return area
->act_ints
;
195 ospf_area_range_set (struct ospf
*ospf
, struct in_addr area_id
,
196 struct prefix_ipv4
*p
, int advertise
)
198 struct ospf_area
*area
;
199 struct ospf_area_range
*range
;
200 int ret
= OSPF_AREA_ID_FORMAT_ADDRESS
;
202 area
= ospf_area_get (ospf
, area_id
, ret
);
206 range
= ospf_area_range_lookup (area
, p
);
209 if ((CHECK_FLAG (range
->flags
, OSPF_AREA_RANGE_ADVERTISE
)
210 && !CHECK_FLAG (advertise
, OSPF_AREA_RANGE_ADVERTISE
))
211 || (!CHECK_FLAG (range
->flags
, OSPF_AREA_RANGE_ADVERTISE
)
212 && CHECK_FLAG (advertise
, OSPF_AREA_RANGE_ADVERTISE
)))
213 ospf_schedule_abr_task (ospf
);
217 range
= ospf_area_range_new (p
);
218 ospf_area_range_add (area
, range
);
219 ospf_schedule_abr_task (ospf
);
222 if (CHECK_FLAG (advertise
, OSPF_AREA_RANGE_ADVERTISE
))
223 SET_FLAG (range
->flags
, OSPF_AREA_RANGE_ADVERTISE
);
225 UNSET_FLAG (range
->flags
, OSPF_AREA_RANGE_ADVERTISE
);
231 ospf_area_range_cost_set (struct ospf
*ospf
, struct in_addr area_id
,
232 struct prefix_ipv4
*p
, u_int32_t cost
)
234 struct ospf_area
*area
;
235 struct ospf_area_range
*range
;
236 int ret
= OSPF_AREA_ID_FORMAT_ADDRESS
;
238 area
= ospf_area_get (ospf
, area_id
, ret
);
242 range
= ospf_area_range_lookup (area
, p
);
246 if (range
->cost_config
!= cost
)
248 range
->cost_config
= cost
;
249 if (ospf_area_range_active (range
))
250 ospf_schedule_abr_task (ospf
);
257 ospf_area_range_unset (struct ospf
*ospf
, struct in_addr area_id
,
258 struct prefix_ipv4
*p
)
260 struct ospf_area
*area
;
261 struct route_node
*rn
;
263 area
= ospf_area_lookup_by_area_id (ospf
, area_id
);
267 rn
= route_node_lookup (area
->ranges
, (struct prefix
*)p
);
271 if (ospf_area_range_active (rn
->info
))
272 ospf_schedule_abr_task (ospf
);
274 ospf_area_range_delete (area
, rn
);
280 ospf_area_range_substitute_set (struct ospf
*ospf
, struct in_addr area_id
,
281 struct prefix_ipv4
*p
, struct prefix_ipv4
*s
)
283 struct ospf_area
*area
;
284 struct ospf_area_range
*range
;
285 int ret
= OSPF_AREA_ID_FORMAT_ADDRESS
;
287 area
= ospf_area_get (ospf
, area_id
, ret
);
288 range
= ospf_area_range_lookup (area
, p
);
292 if (!CHECK_FLAG (range
->flags
, OSPF_AREA_RANGE_ADVERTISE
) ||
293 !CHECK_FLAG (range
->flags
, OSPF_AREA_RANGE_SUBSTITUTE
))
294 ospf_schedule_abr_task (ospf
);
298 range
= ospf_area_range_new (p
);
299 ospf_area_range_add (area
, range
);
300 ospf_schedule_abr_task (ospf
);
303 SET_FLAG (range
->flags
, OSPF_AREA_RANGE_ADVERTISE
);
304 SET_FLAG (range
->flags
, OSPF_AREA_RANGE_SUBSTITUTE
);
305 range
->subst_addr
= s
->prefix
;
306 range
->subst_masklen
= s
->prefixlen
;
312 ospf_area_range_substitute_unset (struct ospf
*ospf
, struct in_addr area_id
,
313 struct prefix_ipv4
*p
)
315 struct ospf_area
*area
;
316 struct ospf_area_range
*range
;
318 area
= ospf_area_lookup_by_area_id (ospf
, area_id
);
322 range
= ospf_area_range_lookup (area
, p
);
326 if (CHECK_FLAG (range
->flags
, OSPF_AREA_RANGE_SUBSTITUTE
))
327 if (ospf_area_range_active (range
))
328 ospf_schedule_abr_task (ospf
);
330 UNSET_FLAG (range
->flags
, OSPF_AREA_RANGE_SUBSTITUTE
);
331 range
->subst_addr
.s_addr
= 0;
332 range
->subst_masklen
= 0;
338 ospf_act_bb_connection (struct ospf
*ospf
)
340 if (ospf
->backbone
== NULL
)
343 return ospf
->backbone
->full_nbrs
;
346 /* Determine whether this router is elected translator or not for area */
348 ospf_abr_nssa_am_elected (struct ospf_area
*area
)
350 struct route_node
*rn
;
351 struct ospf_lsa
*lsa
;
352 struct router_lsa
*rlsa
;
353 struct in_addr
*best
= NULL
;
355 LSDB_LOOP ( ROUTER_LSDB (area
), rn
, lsa
)
359 || (lsa
->data
->type
!= OSPF_ROUTER_LSA
)
360 || IS_LSA_SELF (lsa
))
363 rlsa
= (struct router_lsa
*) lsa
->data
;
365 /* ignore non-ABR routers */
366 if (!IS_ROUTER_LSA_BORDER (rlsa
))
369 /* Router has Nt flag - always translate */
370 if (IS_ROUTER_LSA_NT (rlsa
))
372 if (IS_DEBUG_OSPF_NSSA
)
373 zlog_debug ("ospf_abr_nssa_am_elected: "
374 "router %s asserts Nt",
375 inet_ntoa (lsa
->data
->id
) );
380 best
= &lsa
->data
->id
;
382 if (IPV4_ADDR_CMP (&best
->s_addr
, &lsa
->data
->id
.s_addr
) < 0)
383 best
= &lsa
->data
->id
;
386 if (IS_DEBUG_OSPF_NSSA
)
387 zlog_debug ("ospf_abr_nssa_am_elected: best electable ABR is: %s",
388 (best
) ? inet_ntoa (*best
) : "<none>" );
393 if (IPV4_ADDR_CMP (&best
->s_addr
, &area
->ospf
->router_id
.s_addr
) < 0)
399 /* Check NSSA ABR status
400 * assumes there are nssa areas
403 ospf_abr_nssa_check_status (struct ospf
*ospf
)
405 struct ospf_area
*area
;
406 struct listnode
*lnode
, *nnode
;
408 for (ALL_LIST_ELEMENTS (ospf
->areas
, lnode
, nnode
, area
))
410 u_char old_state
= area
->NSSATranslatorState
;
412 if (area
->external_routing
!= OSPF_AREA_NSSA
)
415 if (IS_DEBUG_OSPF (nssa
, NSSA
))
416 zlog_debug ("ospf_abr_nssa_check_status: "
418 inet_ntoa (area
->area_id
));
420 if (!IS_OSPF_ABR (area
->ospf
))
422 if (IS_DEBUG_OSPF (nssa
, NSSA
))
423 zlog_debug ("ospf_abr_nssa_check_status: "
425 area
->NSSATranslatorState
= OSPF_NSSA_TRANSLATE_DISABLED
;
429 switch (area
->NSSATranslatorRole
)
431 case OSPF_NSSA_ROLE_NEVER
:
432 /* We never Translate Type-7 LSA. */
433 /* TODO: check previous state and flush? */
434 if (IS_DEBUG_OSPF (nssa
, NSSA
))
435 zlog_debug ("ospf_abr_nssa_check_status: "
437 area
->NSSATranslatorState
= OSPF_NSSA_TRANSLATE_DISABLED
;
440 case OSPF_NSSA_ROLE_ALWAYS
:
441 /* We always translate if we are an ABR
442 * TODO: originate new LSAs if state change?
443 * or let the nssa abr task take care of it?
445 if (IS_DEBUG_OSPF (nssa
, NSSA
))
446 zlog_debug ("ospf_abr_nssa_check_status: "
448 area
->NSSATranslatorState
= OSPF_NSSA_TRANSLATE_ENABLED
;
451 case OSPF_NSSA_ROLE_CANDIDATE
:
452 /* We are a candidate for Translation */
453 if (ospf_abr_nssa_am_elected (area
) > 0)
455 area
->NSSATranslatorState
= OSPF_NSSA_TRANSLATE_ENABLED
;
456 if (IS_DEBUG_OSPF (nssa
, NSSA
))
457 zlog_debug ("ospf_abr_nssa_check_status: "
458 "elected translator");
462 area
->NSSATranslatorState
= OSPF_NSSA_TRANSLATE_DISABLED
;
463 if (IS_DEBUG_OSPF (nssa
, NSSA
))
464 zlog_debug ("ospf_abr_nssa_check_status: " "not elected");
470 * All NSSA border routers must set the E-bit in the Type-1 router-LSAs
471 * of their directly attached non-stub areas, even when they are not
474 if (old_state
!= area
->NSSATranslatorState
)
476 if (old_state
== OSPF_NSSA_TRANSLATE_DISABLED
)
477 ospf_asbr_status_update (ospf
, ++ospf
->redistribute
);
478 else if (area
->NSSATranslatorState
== OSPF_NSSA_TRANSLATE_DISABLED
)
479 ospf_asbr_status_update (ospf
, --ospf
->redistribute
);
484 /* Check area border router status. */
486 ospf_check_abr_status (struct ospf
*ospf
)
488 struct ospf_area
*area
;
489 struct listnode
*node
, *nnode
;
490 int bb_configured
= 0;
491 int bb_act_attached
= 0;
492 int areas_configured
= 0;
493 int areas_act_attached
= 0;
494 u_char new_flags
= ospf
->flags
;
496 if (IS_DEBUG_OSPF_EVENT
)
497 zlog_debug ("ospf_check_abr_status(): Start");
499 for (ALL_LIST_ELEMENTS (ospf
->areas
, node
, nnode
, area
))
501 if (listcount (area
->oiflist
))
505 if (OSPF_IS_AREA_BACKBONE (area
))
509 if (ospf_area_actively_attached (area
))
511 areas_act_attached
++;
513 if (OSPF_IS_AREA_BACKBONE (area
))
518 if (IS_DEBUG_OSPF_EVENT
)
520 zlog_debug ("ospf_check_abr_status(): looked through areas");
521 zlog_debug ("ospf_check_abr_status(): bb_configured: %d", bb_configured
);
522 zlog_debug ("ospf_check_abr_status(): bb_act_attached: %d",
524 zlog_debug ("ospf_check_abr_status(): areas_configured: %d",
526 zlog_debug ("ospf_check_abr_status(): areas_act_attached: %d",
530 switch (ospf
->abr_type
)
532 case OSPF_ABR_SHORTCUT
:
534 if (areas_act_attached
> 1)
535 SET_FLAG (new_flags
, OSPF_FLAG_ABR
);
537 UNSET_FLAG (new_flags
, OSPF_FLAG_ABR
);
541 if ((areas_act_attached
> 1) && bb_configured
)
542 SET_FLAG (new_flags
, OSPF_FLAG_ABR
);
544 UNSET_FLAG (new_flags
, OSPF_FLAG_ABR
);
548 if ((areas_configured
> 1) && bb_act_attached
)
549 SET_FLAG (new_flags
, OSPF_FLAG_ABR
);
551 UNSET_FLAG (new_flags
, OSPF_FLAG_ABR
);
557 if (new_flags
!= ospf
->flags
)
559 ospf_flag_spf_reason (SPF_FLAG_ABR_STATUS_CHANGE
);
560 ospf_spf_calculate_schedule (ospf
);
561 if (IS_DEBUG_OSPF_EVENT
)
562 zlog_debug ("ospf_check_abr_status(): new router flags: %x",new_flags
);
563 ospf
->flags
= new_flags
;
564 ospf_router_lsa_update (ospf
);
569 ospf_abr_update_aggregate (struct ospf_area_range
*range
,
570 struct ospf_route
*or, struct ospf_area
*area
)
572 if (IS_DEBUG_OSPF_EVENT
)
573 zlog_debug ("ospf_abr_update_aggregate(): Start");
575 if (CHECK_FLAG (area
->stub_router_state
, OSPF_AREA_IS_STUB_ROUTED
) &&
576 (range
->cost
!= OSPF_STUB_MAX_METRIC_SUMMARY_COST
))
578 range
->cost
= OSPF_STUB_MAX_METRIC_SUMMARY_COST
;
579 if (IS_DEBUG_OSPF_EVENT
)
580 zlog_debug ("ospf_abr_update_aggregate(): use summary max-metric 0x%08x",
583 else if (range
->cost_config
!= OSPF_AREA_RANGE_COST_UNSPEC
)
585 if (IS_DEBUG_OSPF_EVENT
)
586 zlog_debug ("ospf_abr_update_aggregate(): use configured cost %d",
589 range
->cost
= range
->cost_config
;
593 if (range
->specifics
== 0)
595 if (IS_DEBUG_OSPF_EVENT
)
596 zlog_debug ("ospf_abr_update_aggregate(): use or->cost %d",
599 range
->cost
= or->cost
; /* 1st time get 1st cost */
602 if (or->cost
> range
->cost
)
604 if (IS_DEBUG_OSPF_EVENT
)
605 zlog_debug ("ospf_abr_update_aggregate(): update to %d", or->cost
);
607 range
->cost
= or->cost
;
615 set_metric (struct ospf_lsa
*lsa
, u_int32_t metric
)
617 struct summary_lsa
*header
;
619 metric
= htonl (metric
);
620 mp
= (u_char
*) &metric
;
622 header
= (struct summary_lsa
*) lsa
->data
;
623 memcpy(header
->metric
, mp
, 3);
626 /* ospf_abr_translate_nssa */
628 ospf_abr_translate_nssa (struct ospf_area
*area
, struct ospf_lsa
*lsa
)
630 /* Incoming Type-7 or later aggregated Type-7
632 * LSA is skipped if P-bit is off.
633 * LSA is aggregated if within range.
635 * The Type-7 is translated, Installed/Approved as a Type-5 into
636 * global LSDB, then Flooded through AS
638 * Later, any Unapproved Translated Type-5's are flushed/discarded
641 struct ospf_lsa
*old
= NULL
,
643 struct as_external_lsa
*ext7
;
644 struct prefix_ipv4 p
;
646 if (! CHECK_FLAG (lsa
->data
->options
, OSPF_OPTION_NP
))
648 if (IS_DEBUG_OSPF_NSSA
)
649 zlog_debug ("ospf_abr_translate_nssa(): LSA Id %s, P-bit off, NO Translation",
650 inet_ntoa (lsa
->data
->id
));
654 if (IS_DEBUG_OSPF_NSSA
)
655 zlog_debug ("ospf_abr_translate_nssa(): LSA Id %s, TRANSLATING 7 to 5",
656 inet_ntoa (lsa
->data
->id
));
658 ext7
= (struct as_external_lsa
*)(lsa
->data
);
659 p
.prefix
= lsa
->data
->id
;
660 p
.prefixlen
= ip_masklen (ext7
->mask
);
662 if (ext7
->e
[0].fwd_addr
.s_addr
== OSPF_DEFAULT_DESTINATION
)
664 if (IS_DEBUG_OSPF_NSSA
)
665 zlog_debug ("ospf_abr_translate_nssa(): LSA Id %s, "
666 "Forward address is 0, NO Translation",
667 inet_ntoa (lsa
->data
->id
));
671 /* try find existing AS-External LSA for this prefix */
673 old
= ospf_external_info_find_lsa (area
->ospf
, &p
);
677 if (IS_DEBUG_OSPF_NSSA
)
678 zlog_debug ("ospf_abr_translate_nssa(): "
679 "found old translated LSA Id %s, refreshing",
680 inet_ntoa (old
->data
->id
));
683 new = ospf_translated_nssa_refresh (area
->ospf
, lsa
, old
);
686 if (IS_DEBUG_OSPF_NSSA
)
687 zlog_debug ("ospf_abr_translate_nssa(): "
688 "could not refresh translated LSA Id %s",
689 inet_ntoa (old
->data
->id
));
694 /* no existing external route for this LSA Id
695 * originate translated LSA
698 if ((new = ospf_translated_nssa_originate (area
->ospf
, lsa
))
701 if (IS_DEBUG_OSPF_NSSA
)
702 zlog_debug ("ospf_abr_translate_nssa(): Could not translate "
703 "Type-7 for %s to Type-5",
704 inet_ntoa (lsa
->data
->id
));
709 /* Area where Aggregate testing will be inserted, just like summary
711 /* ospf_abr_check_nssa_range (p_arg, lsa-> cost, lsa -> area); */
717 ospf_abr_translate_nssa_range (struct prefix_ipv4
*p
, u_int32_t cost
)
719 /* The Type-7 is created from the aggregated prefix and forwarded
720 for lsa installation and flooding... to be added... */
724 ospf_abr_announce_network_to_area (struct prefix_ipv4
*p
, u_int32_t cost
,
725 struct ospf_area
*area
)
727 struct ospf_lsa
*lsa
, *old
= NULL
;
728 struct summary_lsa
*sl
= NULL
;
731 if (IS_DEBUG_OSPF_EVENT
)
732 zlog_debug ("ospf_abr_announce_network_to_area(): Start");
734 if (CHECK_FLAG (area
->stub_router_state
, OSPF_AREA_IS_STUB_ROUTED
))
735 full_cost
= OSPF_STUB_MAX_METRIC_SUMMARY_COST
;
739 old
= ospf_lsa_lookup_by_prefix (area
->lsdb
, OSPF_SUMMARY_LSA
,
740 (struct prefix_ipv4
*) p
,
741 area
->ospf
->router_id
);
744 if (IS_DEBUG_OSPF_EVENT
)
745 zlog_debug ("ospf_abr_announce_network_to_area(): old summary found");
747 sl
= (struct summary_lsa
*) old
->data
;
749 if (IS_DEBUG_OSPF_EVENT
)
750 zlog_debug ("ospf_abr_announce_network_to_area(): "
751 "old metric: %d, new metric: %d",
752 GET_METRIC (sl
->metric
), cost
);
754 if ((GET_METRIC (sl
->metric
) == full_cost
) &&
755 ((old
->flags
& OSPF_LSA_IN_MAXAGE
) == 0))
757 /* unchanged. simply reapprove it */
758 if (IS_DEBUG_OSPF_EVENT
)
759 zlog_debug ("ospf_abr_announce_network_to_area(): "
760 "old summary approved");
761 SET_FLAG (old
->flags
, OSPF_LSA_APPROVED
);
765 /* LSA is changed, refresh it */
766 if (IS_DEBUG_OSPF_EVENT
)
767 zlog_debug ("ospf_abr_announce_network_to_area(): "
768 "refreshing summary");
769 set_metric (old
, full_cost
);
770 lsa
= ospf_lsa_refresh (area
->ospf
, old
);
774 char buf
[INET_ADDRSTRLEN
+ 3]; /* ipv4 and /XX */
776 prefix2str ((struct prefix
*) p
, buf
, sizeof(buf
));
777 zlog_warn ("%s: Could not refresh %s to %s",
780 inet_ntoa (area
->area_id
));
784 SET_FLAG (lsa
->flags
, OSPF_LSA_APPROVED
);
785 /* This will flood through area. */
790 if (IS_DEBUG_OSPF_EVENT
)
791 zlog_debug ("ospf_abr_announce_network_to_area(): "
792 "creating new summary");
793 lsa
= ospf_summary_lsa_originate ( (struct prefix_ipv4
*)p
, full_cost
, area
);
794 /* This will flood through area. */
798 char buf
[INET_ADDRSTRLEN
+ 3]; /* ipv4 and /XX */
800 prefix2str ((struct prefix
*)p
, buf
, sizeof(buf
));
801 zlog_warn ("%s: Could not originate %s to %s",
804 inet_ntoa (area
->area_id
));
808 SET_FLAG (lsa
->flags
, OSPF_LSA_APPROVED
);
809 if (IS_DEBUG_OSPF_EVENT
)
810 zlog_debug ("ospf_abr_announce_network_to_area(): "
811 "flooding new version of summary");
814 if (IS_DEBUG_OSPF_EVENT
)
815 zlog_debug ("ospf_abr_announce_network_to_area(): Stop");
819 ospf_abr_nexthops_belong_to_area (struct ospf_route
*or,
820 struct ospf_area
*area
)
822 struct listnode
*node
, *nnode
;
823 struct ospf_path
*path
;
824 struct ospf_interface
*oi
;
826 for (ALL_LIST_ELEMENTS_RO (or->paths
, node
, path
))
827 for (ALL_LIST_ELEMENTS_RO (area
->oiflist
, nnode
, oi
))
828 if (oi
->ifp
&& oi
->ifp
->ifindex
== path
->ifindex
)
835 ospf_abr_should_accept (struct prefix_ipv4
*p
, struct ospf_area
*area
)
837 if (IMPORT_NAME (area
))
839 if (IMPORT_LIST (area
) == NULL
)
840 IMPORT_LIST (area
) = access_list_lookup (AFI_IP
, IMPORT_NAME (area
));
842 if (IMPORT_LIST (area
))
843 if (access_list_apply (IMPORT_LIST (area
), p
) == FILTER_DENY
)
851 ospf_abr_plist_in_check (struct ospf_area
*area
, struct ospf_route
*or,
852 struct prefix_ipv4
*p
)
854 if (PREFIX_NAME_IN (area
))
856 if (PREFIX_LIST_IN (area
) == NULL
)
857 PREFIX_LIST_IN (area
) = prefix_list_lookup (AFI_IP
,
858 PREFIX_NAME_IN (area
));
859 if (PREFIX_LIST_IN (area
))
860 if (prefix_list_apply (PREFIX_LIST_IN (area
), p
) != PREFIX_PERMIT
)
867 ospf_abr_plist_out_check (struct ospf_area
*area
, struct ospf_route
*or,
868 struct prefix_ipv4
*p
)
870 if (PREFIX_NAME_OUT (area
))
872 if (PREFIX_LIST_OUT (area
) == NULL
)
873 PREFIX_LIST_OUT (area
) = prefix_list_lookup (AFI_IP
,
874 PREFIX_NAME_OUT (area
));
875 if (PREFIX_LIST_OUT (area
))
876 if (prefix_list_apply (PREFIX_LIST_OUT (area
), p
) != PREFIX_PERMIT
)
883 ospf_abr_announce_network (struct ospf
*ospf
,
884 struct prefix_ipv4
*p
, struct ospf_route
*or)
886 struct ospf_area_range
*range
;
887 struct ospf_area
*area
, *or_area
;
888 struct listnode
*node
;
890 if (IS_DEBUG_OSPF_EVENT
)
891 zlog_debug ("ospf_abr_announce_network(): Start");
893 or_area
= ospf_area_lookup_by_area_id (ospf
, or->u
.std
.area_id
);
896 for (ALL_LIST_ELEMENTS_RO (ospf
->areas
, node
, area
))
898 if (IS_DEBUG_OSPF_EVENT
)
899 zlog_debug ("ospf_abr_announce_network(): looking at area %s",
900 inet_ntoa (area
->area_id
));
902 if (IPV4_ADDR_SAME (&or->u
.std
.area_id
, &area
->area_id
))
905 if (ospf_abr_nexthops_belong_to_area (or, area
))
908 if (!ospf_abr_should_accept (p
, area
))
910 if (IS_DEBUG_OSPF_EVENT
)
911 zlog_debug ("ospf_abr_announce_network(): "
912 "prefix %s/%d was denied by import-list",
913 inet_ntoa (p
->prefix
), p
->prefixlen
);
917 if (!ospf_abr_plist_in_check (area
, or, p
))
919 if (IS_DEBUG_OSPF_EVENT
)
920 zlog_debug ("ospf_abr_announce_network(): "
921 "prefix %s/%d was denied by prefix-list",
922 inet_ntoa (p
->prefix
), p
->prefixlen
);
926 if (area
->external_routing
!= OSPF_AREA_DEFAULT
&& area
->no_summary
)
928 if (IS_DEBUG_OSPF_EVENT
)
929 zlog_debug ("ospf_abr_announce_network(): "
930 "area %s is stub and no_summary",
931 inet_ntoa (area
->area_id
));
935 if (or->path_type
== OSPF_PATH_INTER_AREA
)
937 if (IS_DEBUG_OSPF_EVENT
)
938 zlog_debug ("ospf_abr_announce_network(): this is "
939 "inter-area route to %s/%d",
940 inet_ntoa (p
->prefix
), p
->prefixlen
);
942 if (!OSPF_IS_AREA_BACKBONE (area
))
943 ospf_abr_announce_network_to_area (p
, or->cost
, area
);
946 if (or->path_type
== OSPF_PATH_INTRA_AREA
)
948 if (IS_DEBUG_OSPF_EVENT
)
949 zlog_debug ("ospf_abr_announce_network(): "
950 "this is intra-area route to %s/%d",
951 inet_ntoa (p
->prefix
), p
->prefixlen
);
952 if ((range
= ospf_area_range_match (or_area
, p
))
953 && !ospf_area_is_transit (area
))
954 ospf_abr_update_aggregate (range
, or, area
);
956 ospf_abr_announce_network_to_area (p
, or->cost
, area
);
962 ospf_abr_should_announce (struct ospf
*ospf
,
963 struct prefix_ipv4
*p
, struct ospf_route
*or)
965 struct ospf_area
*area
;
967 area
= ospf_area_lookup_by_area_id (ospf
, or->u
.std
.area_id
);
971 if (EXPORT_NAME (area
))
973 if (EXPORT_LIST (area
) == NULL
)
974 EXPORT_LIST (area
) = access_list_lookup (AFI_IP
, EXPORT_NAME (area
));
976 if (EXPORT_LIST (area
))
977 if (access_list_apply (EXPORT_LIST (area
), p
) == FILTER_DENY
)
985 ospf_abr_process_nssa_translates (struct ospf
*ospf
)
987 /* Scan through all NSSA_LSDB records for all areas;
989 If P-bit is on, translate all Type-7's to 5's and aggregate or
990 flood install as approved in Type-5 LSDB with XLATE Flag on
991 later, do same for all aggregates... At end, DISCARD all
992 remaining UNAPPROVED Type-5's (Aggregate is for future ) */
993 struct listnode
*node
;
994 struct ospf_area
*area
;
995 struct route_node
*rn
;
996 struct ospf_lsa
*lsa
;
998 if (IS_DEBUG_OSPF_NSSA
)
999 zlog_debug ("ospf_abr_process_nssa_translates(): Start");
1001 for (ALL_LIST_ELEMENTS_RO (ospf
->areas
, node
, area
))
1003 if (! area
->NSSATranslatorState
)
1004 continue; /* skip if not translator */
1006 if (area
->external_routing
!= OSPF_AREA_NSSA
)
1007 continue; /* skip if not Nssa Area */
1009 if (IS_DEBUG_OSPF_NSSA
)
1010 zlog_debug ("ospf_abr_process_nssa_translates(): "
1011 "looking at area %s", inet_ntoa (area
->area_id
));
1013 LSDB_LOOP (NSSA_LSDB (area
), rn
, lsa
)
1014 ospf_abr_translate_nssa (area
, lsa
);
1017 if (IS_DEBUG_OSPF_NSSA
)
1018 zlog_debug ("ospf_abr_process_nssa_translates(): Stop");
1023 ospf_abr_process_network_rt (struct ospf
*ospf
,
1024 struct route_table
*rt
)
1026 struct ospf_area
*area
;
1027 struct ospf_route
*or;
1028 struct route_node
*rn
;
1030 if (IS_DEBUG_OSPF_EVENT
)
1031 zlog_debug ("ospf_abr_process_network_rt(): Start");
1033 for (rn
= route_top (rt
); rn
; rn
= route_next (rn
))
1035 if ((or = rn
->info
) == NULL
)
1038 if (!(area
= ospf_area_lookup_by_area_id (ospf
, or->u
.std
.area_id
)))
1040 if (IS_DEBUG_OSPF_EVENT
)
1041 zlog_debug ("ospf_abr_process_network_rt(): area %s no longer exists",
1042 inet_ntoa (or->u
.std
.area_id
));
1046 if (IS_DEBUG_OSPF_EVENT
)
1047 zlog_debug ("ospf_abr_process_network_rt(): this is a route to %s/%d",
1048 inet_ntoa (rn
->p
.u
.prefix4
), rn
->p
.prefixlen
);
1049 if (or->path_type
>= OSPF_PATH_TYPE1_EXTERNAL
)
1051 if (IS_DEBUG_OSPF_EVENT
)
1052 zlog_debug ("ospf_abr_process_network_rt(): "
1053 "this is an External router, skipping");
1057 if (or->cost
>= OSPF_LS_INFINITY
)
1059 if (IS_DEBUG_OSPF_EVENT
)
1060 zlog_debug ("ospf_abr_process_network_rt():"
1061 " this route's cost is infinity, skipping");
1065 if (or->type
== OSPF_DESTINATION_DISCARD
)
1067 if (IS_DEBUG_OSPF_EVENT
)
1068 zlog_debug ("ospf_abr_process_network_rt():"
1069 " this is a discard entry, skipping");
1073 if (or->path_type
== OSPF_PATH_INTRA_AREA
&&
1074 !ospf_abr_should_announce (ospf
, (struct prefix_ipv4
*) &rn
->p
, or))
1076 if (IS_DEBUG_OSPF_EVENT
)
1077 zlog_debug("ospf_abr_process_network_rt(): denied by export-list");
1081 if (or->path_type
== OSPF_PATH_INTRA_AREA
&&
1082 !ospf_abr_plist_out_check (area
, or, (struct prefix_ipv4
*) &rn
->p
))
1084 if (IS_DEBUG_OSPF_EVENT
)
1085 zlog_debug("ospf_abr_process_network_rt(): denied by prefix-list");
1089 if ((or->path_type
== OSPF_PATH_INTER_AREA
) &&
1090 !OSPF_IS_AREA_ID_BACKBONE (or->u
.std
.area_id
))
1092 if (IS_DEBUG_OSPF_EVENT
)
1093 zlog_debug ("ospf_abr_process_network_rt():"
1094 " this is route is not backbone one, skipping");
1099 if ((ospf
->abr_type
== OSPF_ABR_CISCO
) ||
1100 (ospf
->abr_type
== OSPF_ABR_IBM
))
1102 if (!ospf_act_bb_connection (ospf
) &&
1103 or->path_type
!= OSPF_PATH_INTRA_AREA
)
1105 if (IS_DEBUG_OSPF_EVENT
)
1106 zlog_debug ("ospf_abr_process_network_rt(): ALT ABR: "
1107 "No BB connection, skip not intra-area routes");
1111 if (IS_DEBUG_OSPF_EVENT
)
1112 zlog_debug ("ospf_abr_process_network_rt(): announcing");
1113 ospf_abr_announce_network (ospf
, (struct prefix_ipv4
*)&rn
->p
, or);
1116 if (IS_DEBUG_OSPF_EVENT
)
1117 zlog_debug ("ospf_abr_process_network_rt(): Stop");
1121 ospf_abr_announce_rtr_to_area (struct prefix_ipv4
*p
, u_int32_t cost
,
1122 struct ospf_area
*area
)
1124 struct ospf_lsa
*lsa
, *old
= NULL
;
1125 struct summary_lsa
*slsa
= NULL
;
1127 if (IS_DEBUG_OSPF_EVENT
)
1128 zlog_debug ("ospf_abr_announce_rtr_to_area(): Start");
1130 old
= ospf_lsa_lookup_by_prefix (area
->lsdb
, OSPF_ASBR_SUMMARY_LSA
,
1131 p
, area
->ospf
->router_id
);
1134 if (IS_DEBUG_OSPF_EVENT
)
1135 zlog_debug ("ospf_abr_announce_rtr_to_area(): old summary found");
1136 slsa
= (struct summary_lsa
*) old
->data
;
1138 if (IS_DEBUG_OSPF_EVENT
)
1139 zlog_debug ("ospf_abr_announce_network_to_area(): "
1140 "old metric: %d, new metric: %d",
1141 GET_METRIC (slsa
->metric
), cost
);
1144 if (old
&& (GET_METRIC (slsa
->metric
) == cost
) &&
1145 ((old
->flags
& OSPF_LSA_IN_MAXAGE
) == 0))
1147 if (IS_DEBUG_OSPF_EVENT
)
1148 zlog_debug ("ospf_abr_announce_rtr_to_area(): old summary approved");
1149 SET_FLAG (old
->flags
, OSPF_LSA_APPROVED
);
1153 if (IS_DEBUG_OSPF_EVENT
)
1154 zlog_debug ("ospf_abr_announce_rtr_to_area(): 2.2");
1158 set_metric (old
, cost
);
1159 lsa
= ospf_lsa_refresh (area
->ospf
, old
);
1162 lsa
= ospf_summary_asbr_lsa_originate (p
, cost
, area
);
1165 char buf
[INET_ADDRSTRLEN
+ 3]; /* ipv4 and /XX */
1167 prefix2str ((struct prefix
*)p
, buf
, sizeof(buf
));
1168 zlog_warn ("%s: Could not refresh/originate %s to %s",
1171 inet_ntoa (area
->area_id
));
1175 if (IS_DEBUG_OSPF_EVENT
)
1176 zlog_debug ("ospf_abr_announce_rtr_to_area(): "
1177 "flooding new version of summary");
1180 zlog_info ("ospf_abr_announce_rtr_to_area(): creating new summary");
1181 lsa = ospf_summary_asbr_lsa (p, cost, area, old); */
1183 SET_FLAG (lsa
->flags
, OSPF_LSA_APPROVED
);
1184 /* ospf_flood_through_area (area, NULL, lsa);*/
1187 if (IS_DEBUG_OSPF_EVENT
)
1188 zlog_debug ("ospf_abr_announce_rtr_to_area(): Stop");
1193 ospf_abr_announce_rtr (struct ospf
*ospf
,
1194 struct prefix_ipv4
*p
, struct ospf_route
*or)
1196 struct listnode
*node
;
1197 struct ospf_area
*area
;
1199 if (IS_DEBUG_OSPF_EVENT
)
1200 zlog_debug ("ospf_abr_announce_rtr(): Start");
1202 for (ALL_LIST_ELEMENTS_RO (ospf
->areas
, node
, area
))
1204 if (IS_DEBUG_OSPF_EVENT
)
1205 zlog_debug ("ospf_abr_announce_rtr(): looking at area %s",
1206 inet_ntoa (area
->area_id
));
1208 if (IPV4_ADDR_SAME (&or->u
.std
.area_id
, &area
->area_id
))
1211 if (ospf_abr_nexthops_belong_to_area (or, area
))
1214 if (area
->external_routing
!= OSPF_AREA_DEFAULT
)
1216 if (IS_DEBUG_OSPF_EVENT
)
1217 zlog_debug ("ospf_abr_announce_rtr(): "
1218 "area %s doesn't support external routing",
1219 inet_ntoa(area
->area_id
));
1223 if (or->path_type
== OSPF_PATH_INTER_AREA
)
1225 if (IS_DEBUG_OSPF_EVENT
)
1226 zlog_debug ("ospf_abr_announce_rtr(): "
1227 "this is inter-area route to %s", inet_ntoa (p
->prefix
));
1228 if (!OSPF_IS_AREA_BACKBONE (area
))
1229 ospf_abr_announce_rtr_to_area (p
, or->cost
, area
);
1232 if (or->path_type
== OSPF_PATH_INTRA_AREA
)
1234 if (IS_DEBUG_OSPF_EVENT
)
1235 zlog_debug ("ospf_abr_announce_rtr(): "
1236 "this is intra-area route to %s", inet_ntoa (p
->prefix
));
1237 ospf_abr_announce_rtr_to_area (p
, or->cost
, area
);
1241 if (IS_DEBUG_OSPF_EVENT
)
1242 zlog_debug ("ospf_abr_announce_rtr(): Stop");
1246 ospf_abr_process_router_rt (struct ospf
*ospf
, struct route_table
*rt
)
1248 struct ospf_route
*or;
1249 struct route_node
*rn
;
1252 if (IS_DEBUG_OSPF_EVENT
)
1253 zlog_debug ("ospf_abr_process_router_rt(): Start");
1255 for (rn
= route_top (rt
); rn
; rn
= route_next (rn
))
1257 struct listnode
*node
, *nnode
;
1259 struct ospf_route
*best
= NULL
;
1261 if (rn
->info
== NULL
)
1266 if (IS_DEBUG_OSPF_EVENT
)
1267 zlog_debug ("ospf_abr_process_router_rt(): this is a route to %s",
1268 inet_ntoa (rn
->p
.u
.prefix4
));
1270 for (ALL_LIST_ELEMENTS (l
, node
, nnode
, or))
1272 if (!ospf_area_lookup_by_area_id (ospf
, or->u
.std
.area_id
))
1274 if (IS_DEBUG_OSPF_EVENT
)
1275 zlog_debug ("ospf_abr_process_router_rt(): area %s no longer exists",
1276 inet_ntoa (or->u
.std
.area_id
));
1281 if (!CHECK_FLAG (or->u
.std
.flags
, ROUTER_LSA_EXTERNAL
))
1283 if (IS_DEBUG_OSPF_EVENT
)
1284 zlog_debug ("ospf_abr_process_router_rt(): "
1285 "This is not an ASBR, skipping");
1291 best
= ospf_find_asbr_route (ospf
, rt
,
1292 (struct prefix_ipv4
*) &rn
->p
);
1301 if (IS_DEBUG_OSPF_EVENT
)
1302 zlog_debug ("ospf_abr_process_router_rt(): "
1303 "This route is not the best among possible, skipping");
1307 if (or->path_type
== OSPF_PATH_INTER_AREA
&&
1308 !OSPF_IS_AREA_ID_BACKBONE (or->u
.std
.area_id
))
1310 if (IS_DEBUG_OSPF_EVENT
)
1311 zlog_debug ("ospf_abr_process_router_rt(): "
1312 "This route is not a backbone one, skipping");
1316 if (or->cost
>= OSPF_LS_INFINITY
)
1318 if (IS_DEBUG_OSPF_EVENT
)
1319 zlog_debug ("ospf_abr_process_router_rt(): "
1320 "This route has LS_INFINITY metric, skipping");
1324 if (ospf
->abr_type
== OSPF_ABR_CISCO
1325 || ospf
->abr_type
== OSPF_ABR_IBM
)
1326 if (!ospf_act_bb_connection (ospf
)
1327 && or->path_type
!= OSPF_PATH_INTRA_AREA
)
1329 if (IS_DEBUG_OSPF_EVENT
)
1330 zlog_debug("ospf_abr_process_network_rt(): ALT ABR: "
1331 "No BB connection, skip not intra-area routes");
1335 ospf_abr_announce_rtr (ospf
, (struct prefix_ipv4
*) &rn
->p
, or);
1341 if (IS_DEBUG_OSPF_EVENT
)
1342 zlog_debug ("ospf_abr_process_router_rt(): Stop");
1346 ospf_abr_unapprove_translates (struct ospf
*ospf
) /* For NSSA Translations */
1348 struct ospf_lsa
*lsa
;
1349 struct route_node
*rn
;
1351 if (IS_DEBUG_OSPF_NSSA
)
1352 zlog_debug ("ospf_abr_unapprove_translates(): Start");
1354 /* NSSA Translator is not checked, because it may have gone away,
1355 and we would want to flush any residuals anyway */
1357 LSDB_LOOP (EXTERNAL_LSDB (ospf
), rn
, lsa
)
1358 if (CHECK_FLAG (lsa
->flags
, OSPF_LSA_LOCAL_XLT
))
1360 UNSET_FLAG (lsa
->flags
, OSPF_LSA_APPROVED
);
1361 if (IS_DEBUG_OSPF_NSSA
)
1362 zlog_debug ("ospf_abr_unapprove_translates(): "
1363 "approved unset on link id %s",
1364 inet_ntoa (lsa
->data
->id
));
1367 if (IS_DEBUG_OSPF_NSSA
)
1368 zlog_debug ("ospf_abr_unapprove_translates(): Stop");
1372 ospf_abr_unapprove_summaries (struct ospf
*ospf
)
1374 struct listnode
*node
;
1375 struct ospf_area
*area
;
1376 struct route_node
*rn
;
1377 struct ospf_lsa
*lsa
;
1379 if (IS_DEBUG_OSPF_EVENT
)
1380 zlog_debug ("ospf_abr_unapprove_summaries(): Start");
1382 for (ALL_LIST_ELEMENTS_RO (ospf
->areas
, node
, area
))
1384 if (IS_DEBUG_OSPF_EVENT
)
1385 zlog_debug ("ospf_abr_unapprove_summaries(): "
1386 "considering area %s",
1387 inet_ntoa (area
->area_id
));
1388 LSDB_LOOP (SUMMARY_LSDB (area
), rn
, lsa
)
1389 if (ospf_lsa_is_self_originated (ospf
, lsa
))
1391 if (IS_DEBUG_OSPF_EVENT
)
1392 zlog_debug ("ospf_abr_unapprove_summaries(): "
1393 "approved unset on summary link id %s",
1394 inet_ntoa (lsa
->data
->id
));
1395 UNSET_FLAG (lsa
->flags
, OSPF_LSA_APPROVED
);
1398 LSDB_LOOP (ASBR_SUMMARY_LSDB (area
), rn
, lsa
)
1399 if (ospf_lsa_is_self_originated (ospf
, lsa
))
1401 if (IS_DEBUG_OSPF_EVENT
)
1402 zlog_debug ("ospf_abr_unapprove_summaries(): "
1403 "approved unset on asbr-summary link id %s",
1404 inet_ntoa (lsa
->data
->id
));
1405 UNSET_FLAG (lsa
->flags
, OSPF_LSA_APPROVED
);
1409 if (IS_DEBUG_OSPF_EVENT
)
1410 zlog_debug ("ospf_abr_unapprove_summaries(): Stop");
1414 ospf_abr_prepare_aggregates (struct ospf
*ospf
)
1416 struct listnode
*node
;
1417 struct route_node
*rn
;
1418 struct ospf_area_range
*range
;
1419 struct ospf_area
*area
;
1421 if (IS_DEBUG_OSPF_EVENT
)
1422 zlog_debug ("ospf_abr_prepare_aggregates(): Start");
1424 for (ALL_LIST_ELEMENTS_RO (ospf
->areas
, node
, area
))
1426 for (rn
= route_top (area
->ranges
); rn
; rn
= route_next (rn
))
1427 if ((range
= rn
->info
) != NULL
)
1430 range
->specifics
= 0;
1434 if (IS_DEBUG_OSPF_EVENT
)
1435 zlog_debug ("ospf_abr_prepare_aggregates(): Stop");
1439 ospf_abr_announce_aggregates (struct ospf
*ospf
)
1441 struct ospf_area
*area
, *ar
;
1442 struct ospf_area_range
*range
;
1443 struct route_node
*rn
;
1445 struct listnode
*node
, *n
;
1447 if (IS_DEBUG_OSPF_EVENT
)
1448 zlog_debug ("ospf_abr_announce_aggregates(): Start");
1450 for (ALL_LIST_ELEMENTS_RO (ospf
->areas
, node
, area
))
1452 if (IS_DEBUG_OSPF_EVENT
)
1453 zlog_debug ("ospf_abr_announce_aggregates(): looking at area %s",
1454 inet_ntoa (area
->area_id
));
1456 for (rn
= route_top (area
->ranges
); rn
; rn
= route_next (rn
))
1457 if ((range
= rn
->info
))
1459 if (!CHECK_FLAG (range
->flags
, OSPF_AREA_RANGE_ADVERTISE
))
1461 if (IS_DEBUG_OSPF_EVENT
)
1462 zlog_debug ("ospf_abr_announce_aggregates():"
1463 " discarding suppress-ranges");
1468 p
.u
.prefix4
= range
->addr
;
1469 p
.prefixlen
= range
->masklen
;
1471 if (IS_DEBUG_OSPF_EVENT
)
1472 zlog_debug ("ospf_abr_announce_aggregates():"
1473 " this is range: %s/%d",
1474 inet_ntoa (p
.u
.prefix4
), p
.prefixlen
);
1476 if (CHECK_FLAG (range
->flags
, OSPF_AREA_RANGE_SUBSTITUTE
))
1479 p
.u
.prefix4
= range
->subst_addr
;
1480 p
.prefixlen
= range
->subst_masklen
;
1483 if (range
->specifics
)
1485 if (IS_DEBUG_OSPF_EVENT
)
1486 zlog_debug ("ospf_abr_announce_aggregates(): active range");
1488 for (ALL_LIST_ELEMENTS_RO (ospf
->areas
, n
, ar
))
1493 /* We do not check nexthops here, because
1494 intra-area routes can be associated with
1497 /* backbone routes are not summarized
1498 when announced into transit areas */
1500 if (ospf_area_is_transit (ar
) &&
1501 OSPF_IS_AREA_BACKBONE (area
))
1503 if (IS_DEBUG_OSPF_EVENT
)
1504 zlog_debug ("ospf_abr_announce_aggregates(): Skipping "
1505 "announcement of BB aggregate into"
1509 ospf_abr_announce_network_to_area ((struct prefix_ipv4
*)&p
, range
->cost
, ar
);
1515 if (IS_DEBUG_OSPF_EVENT
)
1516 zlog_debug ("ospf_abr_announce_aggregates(): Stop");
1520 ospf_abr_send_nssa_aggregates (struct ospf
*ospf
) /* temporarily turned off */
1522 struct listnode
*node
; /*, n; */
1523 struct ospf_area
*area
; /*, *ar; */
1524 struct route_node
*rn
;
1525 struct ospf_area_range
*range
;
1526 struct prefix_ipv4 p
;
1528 if (IS_DEBUG_OSPF_NSSA
)
1529 zlog_debug ("ospf_abr_send_nssa_aggregates(): Start");
1531 for (ALL_LIST_ELEMENTS_RO (ospf
->areas
, node
, area
))
1533 if (! area
->NSSATranslatorState
)
1536 if (IS_DEBUG_OSPF_NSSA
)
1537 zlog_debug ("ospf_abr_send_nssa_aggregates(): looking at area %s",
1538 inet_ntoa (area
->area_id
));
1540 for (rn
= route_top (area
->ranges
); rn
; rn
= route_next (rn
))
1542 if (rn
->info
== NULL
)
1547 if (!CHECK_FLAG (range
->flags
, OSPF_AREA_RANGE_ADVERTISE
))
1549 if (IS_DEBUG_OSPF_NSSA
)
1550 zlog_debug ("ospf_abr_send_nssa_aggregates():"
1551 " discarding suppress-ranges");
1556 p
.prefix
= range
->addr
;
1557 p
.prefixlen
= range
->masklen
;
1559 if (IS_DEBUG_OSPF_NSSA
)
1560 zlog_debug ("ospf_abr_send_nssa_aggregates():"
1561 " this is range: %s/%d",
1562 inet_ntoa (p
.prefix
), p
.prefixlen
);
1564 if (CHECK_FLAG (range
->flags
, OSPF_AREA_RANGE_SUBSTITUTE
))
1567 p
.prefix
= range
->subst_addr
;
1568 p
.prefixlen
= range
->subst_masklen
;
1571 if (range
->specifics
)
1573 if (IS_DEBUG_OSPF_NSSA
)
1574 zlog_debug ("ospf_abr_send_nssa_aggregates(): active range");
1576 /* Fetch LSA-Type-7 from aggregate prefix, and then
1577 * translate, Install (as Type-5), Approve, and Flood
1579 ospf_abr_translate_nssa_range (&p
, range
->cost
);
1581 } /* all area ranges*/
1584 if (IS_DEBUG_OSPF_NSSA
)
1585 zlog_debug ("ospf_abr_send_nssa_aggregates(): Stop");
1589 ospf_abr_announce_stub_defaults (struct ospf
*ospf
)
1591 struct listnode
*node
;
1592 struct ospf_area
*area
;
1593 struct prefix_ipv4 p
;
1595 if (! IS_OSPF_ABR (ospf
))
1598 if (IS_DEBUG_OSPF_EVENT
)
1599 zlog_debug ("ospf_abr_announce_stub_defaults(): Start");
1602 p
.prefix
.s_addr
= OSPF_DEFAULT_DESTINATION
;
1605 for (ALL_LIST_ELEMENTS_RO (ospf
->areas
, node
, area
))
1607 if (IS_DEBUG_OSPF_EVENT
)
1608 zlog_debug ("ospf_abr_announce_stub_defaults(): looking at area %s",
1609 inet_ntoa (area
->area_id
));
1611 if ( (area
->external_routing
!= OSPF_AREA_STUB
)
1612 && (area
->external_routing
!= OSPF_AREA_NSSA
)
1616 if (OSPF_IS_AREA_BACKBONE (area
))
1617 continue; /* Sanity Check */
1619 if (IS_DEBUG_OSPF_EVENT
)
1620 zlog_debug ("ospf_abr_announce_stub_defaults(): "
1621 "announcing 0.0.0.0/0 to area %s",
1622 inet_ntoa (area
->area_id
));
1623 ospf_abr_announce_network_to_area (&p
, area
->default_cost
, area
);
1626 if (IS_DEBUG_OSPF_EVENT
)
1627 zlog_debug ("ospf_abr_announce_stub_defaults(): Stop");
1631 ospf_abr_remove_unapproved_translates_apply (struct ospf
*ospf
,
1632 struct ospf_lsa
*lsa
)
1634 if (CHECK_FLAG (lsa
->flags
, OSPF_LSA_LOCAL_XLT
)
1635 && ! CHECK_FLAG (lsa
->flags
, OSPF_LSA_APPROVED
))
1637 zlog_info ("ospf_abr_remove_unapproved_translates(): "
1638 "removing unapproved translates, ID: %s",
1639 inet_ntoa (lsa
->data
->id
));
1641 /* FLUSH THROUGHOUT AS */
1642 ospf_lsa_flush_as (ospf
, lsa
);
1644 /* DISCARD from LSDB */
1650 ospf_abr_remove_unapproved_translates (struct ospf
*ospf
)
1652 struct route_node
*rn
;
1653 struct ospf_lsa
*lsa
;
1655 /* All AREA PROCESS should have APPROVED necessary LSAs */
1656 /* Remove any left over and not APPROVED */
1657 if (IS_DEBUG_OSPF_NSSA
)
1658 zlog_debug ("ospf_abr_remove_unapproved_translates(): Start");
1660 LSDB_LOOP (EXTERNAL_LSDB (ospf
), rn
, lsa
)
1661 ospf_abr_remove_unapproved_translates_apply (ospf
, lsa
);
1663 if (IS_DEBUG_OSPF_NSSA
)
1664 zlog_debug ("ospf_abr_remove_unapproved_translates(): Stop");
1668 ospf_abr_remove_unapproved_summaries (struct ospf
*ospf
)
1670 struct listnode
*node
;
1671 struct ospf_area
*area
;
1672 struct route_node
*rn
;
1673 struct ospf_lsa
*lsa
;
1675 if (IS_DEBUG_OSPF_EVENT
)
1676 zlog_debug ("ospf_abr_remove_unapproved_summaries(): Start");
1678 for (ALL_LIST_ELEMENTS_RO (ospf
->areas
, node
, area
))
1680 if (IS_DEBUG_OSPF_EVENT
)
1681 zlog_debug ("ospf_abr_remove_unapproved_summaries(): "
1682 "looking at area %s", inet_ntoa (area
->area_id
));
1684 LSDB_LOOP (SUMMARY_LSDB (area
), rn
, lsa
)
1685 if (ospf_lsa_is_self_originated (ospf
, lsa
))
1686 if (!CHECK_FLAG (lsa
->flags
, OSPF_LSA_APPROVED
))
1687 ospf_lsa_flush_area (lsa
, area
);
1689 LSDB_LOOP (ASBR_SUMMARY_LSDB (area
), rn
, lsa
)
1690 if (ospf_lsa_is_self_originated (ospf
, lsa
))
1691 if (!CHECK_FLAG (lsa
->flags
, OSPF_LSA_APPROVED
))
1692 ospf_lsa_flush_area (lsa
, area
);
1695 if (IS_DEBUG_OSPF_EVENT
)
1696 zlog_debug ("ospf_abr_remove_unapproved_summaries(): Stop");
1700 ospf_abr_manage_discard_routes (struct ospf
*ospf
)
1702 struct listnode
*node
, *nnode
;
1703 struct route_node
*rn
;
1704 struct ospf_area
*area
;
1705 struct ospf_area_range
*range
;
1707 for (ALL_LIST_ELEMENTS (ospf
->areas
, node
, nnode
, area
))
1708 for (rn
= route_top (area
->ranges
); rn
; rn
= route_next (rn
))
1709 if ((range
= rn
->info
) != NULL
)
1710 if (CHECK_FLAG (range
->flags
, OSPF_AREA_RANGE_ADVERTISE
))
1712 if (range
->specifics
)
1713 ospf_add_discard_route (ospf
->new_table
, area
,
1714 (struct prefix_ipv4
*) &rn
->p
);
1716 ospf_delete_discard_route (ospf
->new_table
,
1717 (struct prefix_ipv4
*) &rn
->p
);
1721 /* This is the function taking care about ABR NSSA, i.e. NSSA
1722 Translator, -LSA aggregation and flooding. For all NSSAs
1724 Any SELF-AS-LSA is in the Type-5 LSDB and Type-7 LSDB. These LSA's
1725 are refreshed from the Type-5 LSDB, installed into the Type-7 LSDB
1728 Any received Type-5s are legal for an ABR, else illegal for IR.
1729 Received Type-7s are installed, by area, with incoming P-bit. They
1730 are flooded; if the Elected NSSA Translator, then P-bit off.
1732 Additionally, this ABR will place "translated type-7's" into the
1733 Type-5 LSDB in order to keep track of APPROVAL or not.
1735 It will scan through every area, looking for Type-7 LSAs with P-Bit
1736 SET. The Type-7's are either AS-FLOODED & 5-INSTALLED or
1737 AGGREGATED. Later, the AGGREGATED LSAs are AS-FLOODED &
1740 5-INSTALLED is into the Type-5 LSDB; Any UNAPPROVED Type-5 LSAs
1741 left over are FLUSHED and DISCARDED.
1743 For External Calculations, any NSSA areas use the Type-7 AREA-LSDB,
1744 any ABR-non-NSSA areas use the Type-5 GLOBAL-LSDB. */
1747 ospf_abr_nssa_task (struct ospf
*ospf
) /* called only if any_nssa */
1749 if (IS_DEBUG_OSPF_NSSA
)
1750 zlog_debug ("Check for NSSA-ABR Tasks():");
1752 if (! IS_OSPF_ABR (ospf
))
1755 if (! ospf
->anyNSSA
)
1758 /* Each area must confirm TranslatorRole */
1759 if (IS_DEBUG_OSPF_NSSA
)
1760 zlog_debug ("ospf_abr_nssa_task(): Start");
1762 /* For all Global Entries flagged "local-translate", unset APPROVED */
1763 if (IS_DEBUG_OSPF_NSSA
)
1764 zlog_debug ("ospf_abr_nssa_task(): unapprove translates");
1766 ospf_abr_unapprove_translates (ospf
);
1768 /* RESET all Ranges in every Area, same as summaries */
1769 if (IS_DEBUG_OSPF_NSSA
)
1770 zlog_debug ("ospf_abr_nssa_task(): NSSA initialize aggregates");
1771 ospf_abr_prepare_aggregates (ospf
); /*TURNED OFF just for now */
1773 /* For all NSSAs, Type-7s, translate to 5's, INSTALL/FLOOD, or
1774 * Aggregate as Type-7
1775 * Install or Approve in Type-5 Global LSDB
1777 if (IS_DEBUG_OSPF_NSSA
)
1778 zlog_debug ("ospf_abr_nssa_task(): process translates");
1779 ospf_abr_process_nssa_translates (ospf
);
1781 /* Translate/Send any "ranged" aggregates, and also 5-Install and
1783 * Scan Type-7's for aggregates, translate to Type-5's,
1784 * Install/Flood/Approve
1786 if (IS_DEBUG_OSPF_NSSA
)
1787 zlog_debug("ospf_abr_nssa_task(): send NSSA aggregates");
1788 ospf_abr_send_nssa_aggregates (ospf
); /*TURNED OFF FOR NOW */
1790 /* Send any NSSA defaults as Type-5
1791 *if (IS_DEBUG_OSPF_NSSA)
1792 * zlog_debug ("ospf_abr_nssa_task(): announce nssa defaults");
1793 *ospf_abr_announce_nssa_defaults (ospf);
1794 * havnt a clue what above is supposed to do.
1797 /* Flush any unapproved previous translates from Global Data Base */
1798 if (IS_DEBUG_OSPF_NSSA
)
1799 zlog_debug ("ospf_abr_nssa_task(): remove unapproved translates");
1800 ospf_abr_remove_unapproved_translates (ospf
);
1802 ospf_abr_manage_discard_routes (ospf
); /* same as normal...discard */
1804 if (IS_DEBUG_OSPF_NSSA
)
1805 zlog_debug ("ospf_abr_nssa_task(): Stop");
1808 /* This is the function taking care about ABR stuff, i.e.
1809 summary-LSA origination and flooding. */
1811 ospf_abr_task (struct ospf
*ospf
)
1813 if (IS_DEBUG_OSPF_EVENT
)
1814 zlog_debug ("ospf_abr_task(): Start");
1816 if (ospf
->new_table
== NULL
|| ospf
->new_rtrs
== NULL
)
1818 if (IS_DEBUG_OSPF_EVENT
)
1819 zlog_debug ("ospf_abr_task(): Routing tables are not yet ready");
1823 if (IS_DEBUG_OSPF_EVENT
)
1824 zlog_debug ("ospf_abr_task(): unapprove summaries");
1825 ospf_abr_unapprove_summaries (ospf
);
1827 if (IS_DEBUG_OSPF_EVENT
)
1828 zlog_debug ("ospf_abr_task(): prepare aggregates");
1829 ospf_abr_prepare_aggregates (ospf
);
1831 if (IS_OSPF_ABR (ospf
))
1833 if (IS_DEBUG_OSPF_EVENT
)
1834 zlog_debug ("ospf_abr_task(): process network RT");
1835 ospf_abr_process_network_rt (ospf
, ospf
->new_table
);
1837 if (IS_DEBUG_OSPF_EVENT
)
1838 zlog_debug ("ospf_abr_task(): process router RT");
1839 ospf_abr_process_router_rt (ospf
, ospf
->new_rtrs
);
1841 if (IS_DEBUG_OSPF_EVENT
)
1842 zlog_debug ("ospf_abr_task(): announce aggregates");
1843 ospf_abr_announce_aggregates (ospf
);
1845 if (IS_DEBUG_OSPF_EVENT
)
1846 zlog_debug ("ospf_abr_task(): announce stub defaults");
1847 ospf_abr_announce_stub_defaults (ospf
);
1850 if (IS_DEBUG_OSPF_EVENT
)
1851 zlog_debug ("ospf_abr_task(): remove unapproved summaries");
1852 ospf_abr_remove_unapproved_summaries (ospf
);
1854 ospf_abr_manage_discard_routes (ospf
);
1856 if (IS_DEBUG_OSPF_EVENT
)
1857 zlog_debug ("ospf_abr_task(): Stop");
1861 ospf_abr_task_timer (struct thread
*thread
)
1863 struct ospf
*ospf
= THREAD_ARG (thread
);
1865 ospf
->t_abr_task
= 0;
1867 if (IS_DEBUG_OSPF_EVENT
)
1868 zlog_debug ("Running ABR task on timer");
1870 ospf_check_abr_status (ospf
);
1871 ospf_abr_nssa_check_status (ospf
);
1873 ospf_abr_task (ospf
);
1874 ospf_abr_nssa_task (ospf
); /* if nssa-abr, then scan Type-7 LSDB */
1880 ospf_schedule_abr_task (struct ospf
*ospf
)
1882 if (IS_DEBUG_OSPF_EVENT
)
1883 zlog_debug ("Scheduling ABR task");
1885 if (ospf
->t_abr_task
== NULL
)
1886 ospf
->t_abr_task
= thread_add_timer (master
, ospf_abr_task_timer
,
1887 ospf
, OSPF_ABR_TASK_DELAY
);