2003-06-19 Paul Jakma <paul@dishone.st>

* ospf_abr.c (ospf_abr_nssa_am_elected): new function.
	  Look through LSDB for an area and try determine whether other
	  routers are more 'electable' than this router. Presumes caller
	  has checked Role.
	  (ospf_abr_nssa_check_status): new function. check any NSSA related
          status changes. At present determines NSSATranslatorState should
	  be enabled or disabled.
	  (ospf_abr_announce_network_to_area): remove the redundant
	  call to ospf_abr_announce_network_to_area() (as per Vadim,
	  [zebra 14710], problem 7).
	  (global): Update NSSATranslator to NSSATranslatorState as per
	  ospfd.h changes
	  (ospf_abr_announce_nssa_defaults): call
	  ospf_abr_announce_network_to_area() to inject default summaries.
	  (ospf_abr_nssa_task): undo commented out calls to
	  ospf_abr_prepare_aggregates() and ospf_abr_send_nssa_aggregates(),
	  if they're borked, lets fix them.
	  (ospf_abr_task): remove call to ospf_abr_nssa_task() - move this
	  to the timer scheduler.
	  (ospf_abr_task_timer): call ospf_abr_nssa_task() and
	  ospf_abr_nssa_check_status()
	  (misc): some minor reformatting.
This commit is contained in:
paul 2003-06-22 08:49:25 +00:00
parent 084c7844ae
commit e2c6c153d1

View File

@ -347,6 +347,133 @@ ospf_act_bb_connection (struct ospf *ospf)
return ospf->backbone->full_nbrs;
}
#ifdef HAVE_NSSA
/* Determine whether this router is elected translator or not for area */
int
ospf_abr_nssa_am_elected (struct ospf_area *area)
{
struct route_node *rn;
struct ospf_lsa *lsa;
struct router_lsa *rlsa;
struct in_addr *best = NULL;
LSDB_LOOP ( ROUTER_LSDB (area), rn, lsa)
{
/* sanity checks */
if (!lsa
|| (lsa->data->type != OSPF_ROUTER_LSA)
|| IS_LSA_SELF (lsa))
continue;
rlsa = (struct router_lsa *) lsa->data;
/* ignore non-ABR routers */
if (!IS_ROUTER_LSA_BORDER (rlsa))
continue;
/* Router has Nt flag - always translate */
if (IS_ROUTER_LSA_NT (rlsa))
{
if (IS_DEBUG_OSPF_NSSA)
zlog_info ("ospf_abr_nssa_am_elected: ",
"router %s asserts Nt",
inet_ntoa (lsa->data->id) );
return 0;
}
if (best == NULL)
best = &lsa->data->id;
else
if ( IPV4_ADDR_CMP (&best, &lsa->data->id) < 0)
best = &lsa->data->id;
}
if (IS_DEBUG_OSPF_NSSA)
zlog_info ("ospf_abr_nssa_am_elected: best electable ABR is: %s",
(best) ? inet_ntoa (*best) : "<none>" );
if (best == NULL)
return 1;
if ( IPV4_ADDR_CMP (&best, &area->ospf->router_id) < 0)
return 1;
else
return 0;
}
/* Check NSSA ABR status
* assumes there are nssa areas
*/
void
ospf_abr_nssa_check_status (struct ospf *ospf)
{
struct ospf_area *area;
listnode lnode;
LIST_LOOP (ospf->areas, area, lnode)
{
if (area->external_routing != OSPF_AREA_NSSA)
continue;
if (IS_DEBUG_OSPF (nssa, NSSA))
zlog_info ("ospf_abr_nssa_check_status: "
"checking area %s",
inet_ntoa (area->area_id));
if (!IS_OSPF_ABR (area->ospf))
{
if (IS_DEBUG_OSPF (nssa, NSSA))
zlog_info ("ospf_abr_nssa_check_status: "
"not ABR");
area->NSSATranslatorState = OSPF_NSSA_STATE_DISABLED;
continue;
}
switch (area->NSSATranslatorRole)
{
case OSPF_NSSA_ROLE_NEVER:
/* We never Translate Type-7 LSA. */
/* TODO: check previous state and flush? */
if (IS_DEBUG_OSPF (nssa, NSSA))
zlog_info ("ospf_abr_nssa_check_status: "
"never translate");
area->NSSATranslatorState = OSPF_NSSA_STATE_DISABLED;
continue;
case OSPF_NSSA_ROLE_ALWAYS:
/* We always translate if we are an ABR
* TODO: originate new LSAs if state change?
* or let the nssa abr task take care of it?
*/
if (IS_DEBUG_OSPF (nssa, NSSA))
zlog_info ("ospf_abr_nssa_check_status: "
"translate always");
area->NSSATranslatorState = OSPF_NSSA_STATE_ENABLED;
continue;
case OSPF_NSSA_ROLE_CANDIDATE:
/* We are a candidate for Translation */
if (ospf_abr_nssa_am_elected (area) > 0 )
{
area->NSSATranslatorState = OSPF_NSSA_STATE_ENABLED;
if (IS_DEBUG_OSPF (nssa, NSSA))
zlog_info ("ospf_abr_nssa_check_status: "
"elected translator");
}
else
{
area->NSSATranslatorState = OSPF_NSSA_STATE_DISABLED;
if (IS_DEBUG_OSPF (nssa, NSSA))
zlog_info ("ospf_abr_nssa_check_status: "
"not elected");
}
continue;
}
}
}
#endif /* HAVE_NSSA */
/* Check area border router status. */
void
ospf_check_abr_status (struct ospf *ospf)
@ -365,7 +492,7 @@ ospf_check_abr_status (struct ospf *ospf)
for (node = listhead (ospf->areas); node; nextnode (node))
{
area = getdata (node);
if (listcount (area->oiflist))
{
areas_configured++;
@ -604,9 +731,6 @@ ospf_abr_announce_network_to_area (struct prefix_ipv4 *p, u_int32_t cost,
zlog_info ("ospf_abr_announce_network_to_area(): "
"flooding new version of summary");
#ifndef HAVE_NSSA
ospf_flood_through_area (area, NULL, lsa);
#endif /* ! HAVE_NSSA */
}
if (IS_DEBUG_OSPF_EVENT)
@ -808,7 +932,7 @@ ospf_abr_process_nssa_translates (struct ospf *ospf)
{
area = getdata (node);
if (! area->NSSATranslator)
if (! area->NSSATranslatorState)
continue; /* skip if not translator */
if (area->external_routing != OSPF_AREA_NSSA)
@ -1320,7 +1444,7 @@ ospf_abr_send_nssa_aggregates (struct ospf *ospf) /* temporarily turned off */
{
area = getdata (node);
if (! area->NSSATranslator)
if (! area->NSSATranslatorState)
continue;
if (IS_DEBUG_OSPF_NSSA)
@ -1359,15 +1483,16 @@ ospf_abr_send_nssa_aggregates (struct ospf *ospf) /* temporarily turned off */
}
if (range->specifics)
{
if (IS_DEBUG_OSPF_NSSA)
zlog_info ("ospf_abr_send_nssa_aggregates(): active range");
{
if (IS_DEBUG_OSPF_NSSA)
zlog_info ("ospf_abr_send_nssa_aggregates(): active range");
/* Fetch LSA-Type-7 from aggregate prefix, and then
translate, Install (as Type-5), Approve, and Flood */
ospf_abr_translate_nssa_range (&p, range->cost);
} /* if (range->specifics)*/
} /* all area ranges*/
/* Fetch LSA-Type-7 from aggregate prefix, and then
* translate, Install (as Type-5), Approve, and Flood
*/
ospf_abr_translate_nssa_range (&p, range->cost);
}
} /* all area ranges*/
} /* all areas */
if (IS_DEBUG_OSPF_NSSA)
@ -1395,23 +1520,24 @@ ospf_abr_announce_nssa_defaults (struct ospf *ospf) /* By ABR-Translator */
{
area = getdata (node);
if (IS_DEBUG_OSPF_NSSA)
zlog_info ("ospf_abr_announce_nssa_defaults(): looking at area %s",
inet_ntoa (area->area_id));
zlog_info ("ospf_abr_announce_nssa_defaults(): looking at area %s",
inet_ntoa (area->area_id));
if (area->external_routing != OSPF_AREA_NSSA)
continue;
continue;
if (OSPF_IS_AREA_BACKBONE (area))
continue; /* Sanity Check */
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); */
}
if (area->NSSATranslatorState)
{
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); */
ospf_abr_announce_network_to_area (&p, area->default_cost, area);
}
}
}
#endif /* HAVE_NSSA */
@ -1606,24 +1732,24 @@ ospf_abr_nssa_task (struct ospf *ospf) /* called only if any_nssa */
/* 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 */
ospf_abr_prepare_aggregates (ospf); /*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 */
* 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 */
* 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 */
ospf_abr_send_nssa_aggregates (ospf); /*TURNED OFF FOR NOW */
/* Send any NSSA defaults as Type-5 */
if (IS_DEBUG_OSPF_NSSA)
@ -1690,10 +1816,6 @@ ospf_abr_task (struct ospf *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");
}
@ -1712,6 +1834,10 @@ ospf_abr_task_timer (struct thread *thread)
ospf_check_abr_status (ospf);
ospf_abr_task (ospf);
#ifdef HAVE_NSSA
ospf_abr_nssa_check_status (ospf);
ospf_abr_nssa_task (ospf); /* if nssa-abr, then scan Type-7 LSDB */
#endif /* HAVE_NSSA */
return 0;
}