I mark all LSA as in distance INFINITY in process of aging.
I don't have to WALK twice through it.
This commit is contained in:
parent
1186369bbd
commit
25a3f3da7a
2 changed files with 19 additions and 15 deletions
|
@ -29,6 +29,9 @@ flush_lsa(struct top_hash_entry *en, struct ospf_area *oa)
|
||||||
*
|
*
|
||||||
* RFC says, that router should check checksum of every LSA to detect some
|
* RFC says, that router should check checksum of every LSA to detect some
|
||||||
* hardware problem. BIRD does not do it to minimalize CPU utilization.
|
* hardware problem. BIRD does not do it to minimalize CPU utilization.
|
||||||
|
*
|
||||||
|
* If routing table calculation is scheduled, it also invalidates old routing
|
||||||
|
* table calculation results.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
ospf_age(struct ospf_area *oa)
|
ospf_age(struct ospf_area *oa)
|
||||||
|
@ -41,6 +44,15 @@ ospf_age(struct ospf_area *oa)
|
||||||
|
|
||||||
WALK_SLIST_DELSAFE(en,nxt,oa->lsal)
|
WALK_SLIST_DELSAFE(en,nxt,oa->lsal)
|
||||||
{
|
{
|
||||||
|
if(oa->calcrt)
|
||||||
|
{
|
||||||
|
en->color=OUTSPF;
|
||||||
|
en->dist=LSINFINITY;
|
||||||
|
en->nhi=NULL;
|
||||||
|
en->nh=ipa_from_u32(0);
|
||||||
|
DBG("Infinitying Type: %u, Id: %I, Rt: %I\n", en->lsa.type, en->lsa.id,
|
||||||
|
en->lsa.rt);
|
||||||
|
}
|
||||||
if(en->lsa.age==LSA_MAXAGE)
|
if(en->lsa.age==LSA_MAXAGE)
|
||||||
{
|
{
|
||||||
if(flush) flush_lsa(en,oa);
|
if(flush) flush_lsa(en,oa);
|
||||||
|
|
|
@ -59,16 +59,6 @@ ospf_rt_spfa(struct ospf_area *oa)
|
||||||
|
|
||||||
if(oa->rt==NULL) return;
|
if(oa->rt==NULL) return;
|
||||||
|
|
||||||
WALK_SLIST(SNODE en, oa->lsal)
|
|
||||||
{
|
|
||||||
en->color=OUTSPF;
|
|
||||||
en->dist=LSINFINITY;
|
|
||||||
en->nhi=NULL;
|
|
||||||
en->nh=ipa_from_u32(0);
|
|
||||||
DBG("Infinitying Type: %u, Id: %I, Rt: %I\n", en->lsa.type, en->lsa.id,
|
|
||||||
en->lsa.rt);
|
|
||||||
}
|
|
||||||
|
|
||||||
FIB_WALK(in,nftmp)
|
FIB_WALK(in,nftmp)
|
||||||
{
|
{
|
||||||
nf=(struct infib *)nftmp;
|
nf=(struct infib *)nftmp;
|
||||||
|
@ -85,7 +75,8 @@ ospf_rt_spfa(struct ospf_area *oa)
|
||||||
oa->rt->dist=0;
|
oa->rt->dist=0;
|
||||||
oa->rt->color=CANDIDATE;
|
oa->rt->color=CANDIDATE;
|
||||||
add_head(&oa->cand, &oa->rt->cn);
|
add_head(&oa->cand, &oa->rt->cn);
|
||||||
DBG("RT LSA: rt: %I, id: %I, type: %u\n",oa->rt->lsa.rt,oa->rt->lsa.id,oa->rt->lsa.type);
|
DBG("RT LSA: rt: %I, id: %I, type: %u\n",oa->rt->lsa.rt,
|
||||||
|
oa->rt->lsa.id,oa->rt->lsa.type);
|
||||||
|
|
||||||
while(!EMPTY_LIST(oa->cand))
|
while(!EMPTY_LIST(oa->cand))
|
||||||
{
|
{
|
||||||
|
@ -97,7 +88,8 @@ ospf_rt_spfa(struct ospf_area *oa)
|
||||||
act=SKIP_BACK(struct top_hash_entry, cn, n);
|
act=SKIP_BACK(struct top_hash_entry, cn, n);
|
||||||
rem_node(n);
|
rem_node(n);
|
||||||
|
|
||||||
DBG("Working on LSA: rt: %I, id: %I, type: %u\n",act->lsa.rt,act->lsa.id,act->lsa.type);
|
DBG("Working on LSA: rt: %I, id: %I, type: %u\n",act->lsa.rt,
|
||||||
|
act->lsa.id,act->lsa.type);
|
||||||
|
|
||||||
act->color=INSPF;
|
act->color=INSPF;
|
||||||
switch(act->lsa.type)
|
switch(act->lsa.type)
|
||||||
|
@ -176,7 +168,7 @@ ospf_rt_spfa(struct ospf_area *oa)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Now sync our fib with nest's */
|
/* Now sync our fib with nest's */
|
||||||
DBG("\nNow syncing my rt table with nest's\n\n");
|
DBG("Now syncing my rt table with nest's\n");
|
||||||
FIB_ITERATE_INIT(&fit,in);
|
FIB_ITERATE_INIT(&fit,in);
|
||||||
again:
|
again:
|
||||||
FIB_ITERATE_START(in,&fit,nftmp)
|
FIB_ITERATE_START(in,&fit,nftmp)
|
||||||
|
@ -382,7 +374,7 @@ ospf_ext_spfa(struct proto_ospf *po) /* FIXME looking into inter-area */
|
||||||
|
|
||||||
if(nf==NULL)
|
if(nf==NULL)
|
||||||
{
|
{
|
||||||
DBG("Cannot find network route (GW=%I\n",lt->fwaddr);
|
DBG("Cannot find network route (GW=%I)\n",lt->fwaddr);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -441,7 +433,7 @@ ospf_ext_spfa(struct proto_ospf *po) /* FIXME looking into inter-area */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DBG("\nNow syncing my rt table with nest's\n\n");
|
DBG("Now syncing my rt table with nest's\n");
|
||||||
FIB_ITERATE_INIT(&fit,ef);
|
FIB_ITERATE_INIT(&fit,ef);
|
||||||
noch:
|
noch:
|
||||||
FIB_ITERATE_START(ef,&fit,nftmp)
|
FIB_ITERATE_START(ef,&fit,nftmp)
|
||||||
|
|
Loading…
Reference in a new issue