summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--proto/ospf/iface.c5
-rw-r--r--proto/ospf/iface.h1
-rw-r--r--proto/ospf/neighbor.c4
-rw-r--r--proto/ospf/ospf.c12
-rw-r--r--proto/ospf/ospf.h1
-rw-r--r--proto/ospf/topology.c15
6 files changed, 34 insertions, 4 deletions
diff --git a/proto/ospf/iface.c b/proto/ospf/iface.c
index 9cd46929..ac34d634 100644
--- a/proto/ospf/iface.c
+++ b/proto/ospf/iface.c
@@ -494,3 +494,8 @@ ospf_ifa_add(struct object_lock *lock)
ospf_int_sm(ifa, ISM_UP);
}
+void
+schedule_net_lsa(struct ospf_iface *ifa)
+{
+ ifa->orignet=1;
+}
diff --git a/proto/ospf/iface.h b/proto/ospf/iface.h
index 99a32bfe..350f5317 100644
--- a/proto/ospf/iface.h
+++ b/proto/ospf/iface.h
@@ -23,5 +23,6 @@ struct ospf_iface *find_iface(struct proto_ospf *p, struct iface *what);
void ospf_if_notify(struct proto *p, unsigned flags, struct iface *iface);
void ospf_iface_info(struct ospf_iface *ifa);
void ospf_ifa_add(struct object_lock *lock);
+void schedule_net_lsa(struct ospf_iface *ifa);
#endif /* _BIRD_OSPF_IFACE_H_ */
diff --git a/proto/ospf/neighbor.c b/proto/ospf/neighbor.c
index ca92e9d6..cbb3e5e1 100644
--- a/proto/ospf/neighbor.c
+++ b/proto/ospf/neighbor.c
@@ -58,14 +58,14 @@ neigh_chstate(struct ospf_neighbor *n, u8 state)
{
ifa->fadj--;
schedule_rt_lsa(ifa->oa);
- originate_net_lsa(ifa);
+ schedule_net_lsa(ifa);
}
if(state==NEIGHBOR_FULL) /* Increase number of adjacencies */
{
ifa->fadj++;
schedule_rt_lsa(ifa->oa);
- originate_net_lsa(ifa);
+ schedule_net_lsa(ifa);
}
if(oldstate>=NEIGHBOR_EXSTART && state<NEIGHBOR_EXSTART)
{
diff --git a/proto/ospf/ospf.c b/proto/ospf/ospf.c
index 151187f9..8447e698 100644
--- a/proto/ospf/ospf.c
+++ b/proto/ospf/ospf.c
@@ -265,7 +265,8 @@ schedule_rtcalc(struct ospf_area *oa)
* @timer: it's called every @ospf_area->tick seconds
*
* It ivokes aging and when @ospf_area->origrt is set to 1, start
- * function for origination of router LSA. It also start routing
+ * function for origination of router LSA and network LSA's.
+ * It also start routing
* table calculation when @ospf_area->calcrt is set.
*/
void
@@ -273,13 +274,20 @@ area_disp(timer *timer)
{
struct ospf_area *oa=timer->data;
struct top_hash_entry *en,*nxt;
+ struct proto_ospf *po=oa->po;
+ struct ospf_iface *ifa;
/* First of all try to age LSA DB */
ospf_age(oa);
/* Now try to originage rt_lsa */
if(oa->origrt) originate_rt_lsa(oa);
- oa->origrt=0;
+
+ /* Now try to originate network LSA's */
+ WALK_LIST(ifa, po->iface_list)
+ {
+ if(ifa->orignet&&(ifa->an==oa->areaid)) originate_net_lsa(ifa);
+ }
if(oa->calcrt) ospf_rt_spfa(oa);
oa->calcrt=0;
diff --git a/proto/ospf/ospf.h b/proto/ospf/ospf.h
index 3eb46598..11283a7e 100644
--- a/proto/ospf/ospf.h
+++ b/proto/ospf/ospf.h
@@ -136,6 +136,7 @@ struct ospf_iface {
* - using 4*HELLO
*/
struct top_hash_entry *nlsa; /* Originated net lsa */
+ int orignet; /* Schedule network LSA origination */
int fadj; /* Number of full adjacent neigh */
list nbma_list;
};
diff --git a/proto/ospf/topology.c b/proto/ospf/topology.c
index a0dd18a6..c07b1a79 100644
--- a/proto/ospf/topology.c
+++ b/proto/ospf/topology.c
@@ -189,6 +189,13 @@ originate_rt_lsa(struct ospf_area *oa)
struct top_hash_entry *en;
void *body;
+ if((oa->rt)&&((oa->rt->inst_t+MINLSINTERVAL))>now) return;
+ /*
+ * Tick is probably set to very low value. We cannot
+ * originate new LSA before MINLSINTERVAL. We will
+ * try to do it next tick.
+ */
+
OSPF_TRACE(D_EVENTS, "Originating RT_lsa for area \"%I\".",oa->areaid);
lsa.age=0;
@@ -210,6 +217,7 @@ originate_rt_lsa(struct ospf_area *oa)
oa->rt=en;
flood_lsa(NULL,NULL,&oa->rt->lsa,po,NULL,oa,1);
schedule_rtcalc(oa);
+ oa->origrt=0;
}
void *
@@ -260,6 +268,12 @@ originate_net_lsa(struct ospf_iface *ifa)
struct proto *p=&po->proto;
void *body;
+ if(ifa->nlsa&&((ifa->nlsa->inst_t+MINLSINTERVAL)>now)) return;
+ /*
+ * It's too early to originate new network LSA. We will
+ * try to do it next tick
+ */
+
OSPF_TRACE(D_EVENTS, "Originating Net lsa for iface \"%s\".",
ifa->iface->name);
@@ -300,6 +314,7 @@ originate_net_lsa(struct ospf_iface *ifa)
lsasum_calculate(&lsa,body,po);
ifa->nlsa=lsa_install_new(&lsa, body, ifa->oa);
flood_lsa(NULL,NULL,&ifa->nlsa->lsa,po,NULL,ifa->oa,1);
+ ifa->orignet=0;
}
static void *