void ospf_abr_nssa_task (struct ospf *ospf) /* called only if any_nssa */ { if (IS_DEBUG_OSPF_NSSA) zlog_info ("Check for NSSA-ABR Tasks():"); if (! IS_OSPF_ABR (ospf)) return; if (! ospf->anyNSSA) return; /* Each area must confirm TranslatorRole */ if (IS_DEBUG_OSPF_NSSA) zlog_info ("ospf_abr_nssa_task(): Start"); /* For all Global Entries flagged "local-translate", unset APPROVED */ if (IS_DEBUG_OSPF_NSSA) zlog_info ("ospf_abr_nssa_task(): unapprove translates"); ospf_abr_unapprove_translates (ospf); /* RESET all Ranges in every Area, same as summaries */ if (IS_DEBUG_OSPF_NSSA) zlog_info ("ospf_abr_nssa_task(): NSSA initialize aggregates"); /* ospf_abr_prepare_aggregates (); TURNED OFF just for now */ /* For all NSSAs, Type-7s, translate to 5's, INSTALL/FLOOD, or Aggregate as Type-7 */ /* Install or Approve in Type-5 Global LSDB */ if (IS_DEBUG_OSPF_NSSA) zlog_info ("ospf_abr_nssa_task(): process translates"); ospf_abr_process_nssa_translates (ospf); /* Translate/Send any "ranged" aggregates, and also 5-Install and Approve */ /* Scan Type-7's for aggregates, translate to Type-5's, Install/Flood/Approve */ if (IS_DEBUG_OSPF_NSSA) zlog_info("ospf_abr_nssa_task(): send NSSA aggregates"); /* ospf_abr_send_nssa_aggregates (); TURNED OFF FOR NOW */ /* Send any NSSA defaults as Type-5 */ if (IS_DEBUG_OSPF_NSSA) zlog_info ("ospf_abr_nssa_task(): announce nssa defaults"); ospf_abr_announce_nssa_defaults (ospf); /* Flush any unapproved previous translates from Global Data Base */ if (IS_DEBUG_OSPF_NSSA) zlog_info ("ospf_abr_nssa_task(): remove unapproved translates"); ospf_abr_remove_unapproved_translates (ospf); ospf_abr_manage_discard_routes (ospf); /* same as normal...discard */ if (IS_DEBUG_OSPF_NSSA) zlog_info ("ospf_abr_nssa_task(): Stop"); }
/* This is the function taking care about ABR stuff, i.e. summary-LSA origination and flooding. */ void ospf_abr_task (struct ospf *ospf) { if (IS_DEBUG_OSPF_EVENT) zlog_info ("ospf_abr_task(): Start"); if (ospf->new_table == NULL || ospf->new_rtrs == NULL) { if (IS_DEBUG_OSPF_EVENT) zlog_info ("ospf_abr_task(): Routing tables are not yet ready"); return; } if (IS_DEBUG_OSPF_EVENT) zlog_info ("ospf_abr_task(): unapprove summaries"); ospf_abr_unapprove_summaries (ospf); if (IS_DEBUG_OSPF_EVENT) zlog_info ("ospf_abr_task(): prepare aggregates"); ospf_abr_prepare_aggregates (ospf); if (IS_OSPF_ABR (ospf)) { if (IS_DEBUG_OSPF_EVENT) zlog_info ("ospf_abr_task(): process network RT"); ospf_abr_process_network_rt (ospf, ospf->new_table); if (IS_DEBUG_OSPF_EVENT) zlog_info ("ospf_abr_task(): process router RT"); ospf_abr_process_router_rt (ospf, ospf->new_rtrs); if (IS_DEBUG_OSPF_EVENT) zlog_info ("ospf_abr_task(): announce aggregates"); ospf_abr_announce_aggregates (ospf); if (IS_DEBUG_OSPF_EVENT) zlog_info ("ospf_abr_task(): announce stub defaults"); ospf_abr_announce_stub_defaults (ospf); } if (IS_DEBUG_OSPF_EVENT) zlog_info ("ospf_abr_task(): remove unapproved summaries"); ospf_abr_remove_unapproved_summaries (ospf); ospf_abr_manage_discard_routes (ospf); #ifdef HAVE_NSSA ospf_abr_nssa_task (ospf); /* if nssa-abr, then scan Type-7 LSDB */ #endif /* HAVE_NSSA */ if (IS_DEBUG_OSPF_EVENT) zlog_info ("ospf_abr_task(): Stop"); }
void ospf_abr_announce_stub_defaults (struct ospf *ospf) { listnode node; struct ospf_area *area; struct prefix_ipv4 p; if (! IS_OSPF_ABR (ospf)) return; if (IS_DEBUG_OSPF_EVENT) zlog_info ("ospf_abr_announce_stub_defaults(): Start"); p.family = AF_INET; p.prefix.s_addr = OSPF_DEFAULT_DESTINATION; p.prefixlen = 0; for (node = listhead (ospf->areas); node; nextnode (node)) { area = getdata (node); if (IS_DEBUG_OSPF_EVENT) zlog_info ("ospf_abr_announce_stub_defaults(): looking at area %s", inet_ntoa (area->area_id)); #ifdef HAVE_NSSA if (area->external_routing != OSPF_AREA_STUB) #else /* ! HAVE_NSSA */ if (area->external_routing == OSPF_AREA_DEFAULT) #endif /* HAVE_NSSA */ continue; if (OSPF_IS_AREA_BACKBONE (area)) continue; /* Sanity Check */ if (IS_DEBUG_OSPF_EVENT) zlog_info ("ospf_abr_announce_stub_defaults(): " "announcing 0.0.0.0/0 to this area"); ospf_abr_announce_network_to_area (&p, area->default_cost, area); } if (IS_DEBUG_OSPF_EVENT) zlog_info ("ospf_abr_announce_stub_defaults(): Stop"); }
void ospf_abr_announce_nssa_defaults (struct ospf *ospf) /* By ABR-Translator */ { listnode node; struct ospf_area *area; struct prefix_ipv4 p; if (! IS_OSPF_ABR (ospf)) return; if (IS_DEBUG_OSPF_NSSA) zlog_info ("ospf_abr_announce_stub_defaults(): Start"); p.family = AF_INET; p.prefix.s_addr = OSPF_DEFAULT_DESTINATION; p.prefixlen = 0; for (node = listhead (ospf->areas); node; nextnode (node)) { area = getdata (node); if (IS_DEBUG_OSPF_NSSA) zlog_info ("ospf_abr_announce_nssa_defaults(): looking at area %s", inet_ntoa (area->area_id)); if (area->external_routing != OSPF_AREA_NSSA) continue; if (OSPF_IS_AREA_BACKBONE (area)) continue; /* Sanity Check */ /* if (!TranslatorRole continue V 1.0 look for "always" conf */ if (area->NSSATranslator) { if (IS_DEBUG_OSPF_NSSA) zlog_info ("ospf_abr_announce_nssa_defaults(): " "announcing 0.0.0.0/0 to this nssa"); /* ospf_abr_announce_nssa_asbr_to_as (&p, area->default_cost, area); */ } } }
static int process_summary_lsa (struct ospf_area *area, struct route_table *rt, struct route_table *rtrs, struct ospf_lsa *lsa) { struct ospf *ospf = area->ospf; struct ospf_area_range *range; struct ospf_route *abr_or, *new_or; struct summary_lsa *sl; struct prefix_ipv4 p, abr; u_int32_t metric; if (lsa == NULL) return 0; sl = (struct summary_lsa *) lsa->data; if (IS_DEBUG_OSPF_EVENT) zlog_debug ("process_summary_lsa(): LS ID: %s", inet_ntoa (sl->header.id)); metric = GET_METRIC (sl->metric); if (metric == OSPF_LS_INFINITY) return 0; if (IS_LSA_MAXAGE (lsa)) return 0; if (ospf_lsa_is_self_originated (area->ospf, lsa)) return 0; p.family = AF_INET; p.prefix = sl->header.id; if (sl->header.type == OSPF_SUMMARY_LSA) p.prefixlen = ip_masklen (sl->mask); else p.prefixlen = IPV4_MAX_BITLEN; apply_mask_ipv4 (&p); if (sl->header.type == OSPF_SUMMARY_LSA && (range = ospf_area_range_match_any (ospf, &p)) && ospf_area_range_active (range)) return 0; /* XXX: This check seems dubious to me. If an ABR has already decided * to consider summaries received in this area, then why would one wish * to exclude default? */ if (IS_OSPF_ABR(ospf) && ospf->abr_type != OSPF_ABR_STAND && area->external_routing != OSPF_AREA_DEFAULT && p.prefix.s_addr == OSPF_DEFAULT_DESTINATION && p.prefixlen == 0) return 0; /* Ignore summary default from a stub area */ abr.family = AF_INET; abr.prefix = sl->header.adv_router; abr.prefixlen = IPV4_MAX_BITLEN; apply_mask_ipv4 (&abr); abr_or = ospf_find_abr_route (rtrs, &abr, area); if (abr_or == NULL) return 0; new_or = ospf_route_new (); new_or->type = OSPF_DESTINATION_NETWORK; new_or->id = sl->header.id; new_or->mask = sl->mask; new_or->u.std.options = sl->header.options; new_or->u.std.origin = (struct lsa_header *) sl; new_or->cost = abr_or->cost + metric; new_or->u.std.area_id = area->area_id; new_or->u.std.external_routing = area->external_routing; new_or->path_type = OSPF_PATH_INTER_AREA; if (sl->header.type == OSPF_SUMMARY_LSA) ospf_ia_network_route (ospf, rt, &p, new_or, abr_or); else { new_or->type = OSPF_DESTINATION_ROUTER; new_or->u.std.flags = ROUTER_LSA_EXTERNAL; ospf_ia_router_route (ospf, rtrs, &p, new_or, abr_or); } return 0; }