From d1660fd3f38c29739ff36c86c6010d65fb90c608 Mon Sep 17 00:00:00 2001 From: Ondrej Filip Date: Wed, 31 May 2000 14:21:56 +0000 Subject: [PATCH] Sort cleanup in aging. --- proto/ospf/lsalib.c | 41 ++++++++++++++++++++++++----------------- proto/ospf/lsalib.h | 3 +-- proto/ospf/ospf.c | 4 +--- proto/ospf/ospf.h | 1 + proto/ospf/rt.c | 4 ++-- proto/ospf/topology.c | 1 + 6 files changed, 30 insertions(+), 24 deletions(-) diff --git a/proto/ospf/lsalib.c b/proto/ospf/lsalib.c index d462bbd0..62ea0b86 100644 --- a/proto/ospf/lsalib.c +++ b/proto/ospf/lsalib.c @@ -16,28 +16,35 @@ flush_lsa(struct top_hash_entry *en, struct ospf_area *oa) } void -ospf_age(struct top_hash_entry *en, bird_clock_t delta, int flush, - struct ospf_area *oa) +ospf_age(struct ospf_area *oa) { struct proto *p=&oa->po->proto; struct proto_ospf *po=(struct proto_ospf *)p; - if(en->lsa.age==LSA_MAXAGE) + struct top_hash_entry *en,*nxt; + int flush=can_flush_lsa(oa); + bird_clock_t delta=now-oa->lage; + + WALK_SLIST_DELSAFE(en,nxt,oa->lsal) { - if(flush) flush_lsa(en,oa); - return; - } - if((en->lsa.rt==p->cf->global->router_id)&&(en->lsa.age>LSREFRESHTIME)) - { - en->lsa.sn++; - en->lsa.age=0; - flood_lsa(NULL,NULL,&en->lsa,po,NULL,oa,1); - return; - } - if((en->lsa.age+=delta)>LSA_MAXAGE) - { - if(flush) flush_lsa(en,oa); - else en->lsa.age=LSA_MAXAGE; + if(en->lsa.age==LSA_MAXAGE) + { + if(flush) flush_lsa(en,oa); + return; + } + if((en->lsa.rt==p->cf->global->router_id)&&(en->lsa.age>LSREFRESHTIME)) + { + en->lsa.sn++; + en->lsa.age=0; + flood_lsa(NULL,NULL,&en->lsa,po,NULL,oa,1); + return; + } + if((en->lsa.age+=delta)>LSA_MAXAGE) + { + if(flush) flush_lsa(en,oa); + else en->lsa.age=LSA_MAXAGE; + } } + oa->lage=now; } void diff --git a/proto/ospf/lsalib.h b/proto/ospf/lsalib.h index f9cc8f39..8dc1561b 100644 --- a/proto/ospf/lsalib.h +++ b/proto/ospf/lsalib.h @@ -23,7 +23,6 @@ u16 lsasum_check(struct ospf_lsa_header *h,void *body,struct proto_ospf *po); int lsa_comp(struct ospf_lsa_header *l1, struct ospf_lsa_header *l2); struct top_hash_entry *lsa_install_new(struct ospf_lsa_header *lsa, void *body, struct ospf_area *oa, struct proto *p); -void ospf_age(struct top_hash_entry *en, bird_clock_t delta, int flush, - struct ospf_area *oa); +void ospf_age(struct ospf_area *oa); #endif /* _BIRD_OSPF_LSALIB_H_ */ diff --git a/proto/ospf/ospf.c b/proto/ospf/ospf.c index 701c3230..bc9a636b 100644 --- a/proto/ospf/ospf.c +++ b/proto/ospf/ospf.c @@ -162,11 +162,9 @@ area_disp(timer *timer) { struct ospf_area *oa=timer->data; struct top_hash_entry *en,*nxt; - int flush=0; /* First of all try to age LSA DB */ - flush=can_flush_lsa(oa); - WALK_SLIST_DELSAFE(en,nxt,oa->lsal) ospf_age(en,DISPTICK,flush,oa); + ospf_age(oa); /* Now try to originage rt_lsa */ if(oa->origrt) originate_rt_lsa(oa); diff --git a/proto/ospf/ospf.h b/proto/ospf/ospf.h index 81760355..087e6e79 100644 --- a/proto/ospf/ospf.h +++ b/proto/ospf/ospf.h @@ -325,6 +325,7 @@ struct ospf_area { node n; u32 areaid; timer *disp_timer; /* Area's dispatcher hear beat */ + bird_clock_t lage; /* Time of last aging */ int calcrt; /* Routing table calculation scheduled? */ int origrt; /* Rt lsa origination scheduled? */ struct top_graph *gr; /* LSA graph */ diff --git a/proto/ospf/rt.c b/proto/ospf/rt.c index 27c6efb6..d13c9e59 100644 --- a/proto/ospf/rt.c +++ b/proto/ospf/rt.c @@ -33,7 +33,7 @@ init_efib(struct fib_node *fn) void ospf_rt_spfa(struct ospf_area *oa) { - struct top_hash_entry *en, *nx; + struct top_hash_entry *en; u32 i,*rts; struct ospf_lsa_rt *rt; struct ospf_lsa_rt_link *rtl,*rr; @@ -50,7 +50,7 @@ ospf_rt_spfa(struct ospf_area *oa) debug("%s: Starting routing table calculation for area %I\n",p->name, oa->areaid); - WALK_SLIST_DELSAFE(SNODE en, nx, oa->lsal) + WALK_SLIST(SNODE en, oa->lsal) { en->color=OUTSPF; en->dist=LSINFINITY; diff --git a/proto/ospf/topology.c b/proto/ospf/topology.c index 901f4ae7..6dd4495e 100644 --- a/proto/ospf/topology.c +++ b/proto/ospf/topology.c @@ -184,6 +184,7 @@ addifa_rtlsa(struct ospf_iface *ifa) oa->disp_timer->randomize=0; oa->disp_timer->hook=area_disp; oa->disp_timer->recurrent=DISPTICK; + oa->lage=now; tm_start(oa->disp_timer,DISPTICK); oa->calcrt=1; oa->origrt=0;