diff options
Diffstat (limited to 'proto')
-rw-r--r-- | proto/ospf/lsalib.c | 41 | ||||
-rw-r--r-- | proto/ospf/lsalib.h | 3 | ||||
-rw-r--r-- | proto/ospf/ospf.c | 4 | ||||
-rw-r--r-- | proto/ospf/ospf.h | 1 | ||||
-rw-r--r-- | proto/ospf/rt.c | 4 | ||||
-rw-r--r-- | 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 d462bbd..62ea0b8 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) - { - 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) + 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); - 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 f9cc8f3..8dc1561 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 701c323..bc9a636 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 8176035..087e6e7 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 27c6efb..d13c9e5 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 901f4ae..6dd4495 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; |