summaryrefslogtreecommitdiffstats
path: root/proto/ospf
diff options
context:
space:
mode:
Diffstat (limited to 'proto/ospf')
-rw-r--r--proto/ospf/lsalib.c41
-rw-r--r--proto/ospf/lsalib.h3
-rw-r--r--proto/ospf/ospf.c4
-rw-r--r--proto/ospf/ospf.h1
-rw-r--r--proto/ospf/rt.c4
-rw-r--r--proto/ospf/topology.c1
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;