summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--proto/ospf/iface.c3
-rw-r--r--proto/ospf/ospf.c5
-rw-r--r--proto/ospf/ospf.h1
-rw-r--r--proto/ospf/topology.c34
-rw-r--r--proto/ospf/topology.h1
5 files changed, 43 insertions, 1 deletions
diff --git a/proto/ospf/iface.c b/proto/ospf/iface.c
index 0ee5e68..cd8b035 100644
--- a/proto/ospf/iface.c
+++ b/proto/ospf/iface.c
@@ -40,6 +40,7 @@ ospf_int_sm(struct ospf_iface *ifa, int event)
case ISM_UP:
if(ifa->state==OSPF_IS_DOWN)
{
+ /* Now, nothing should be adjacent */
restart_hellotim(ifa);
if((ifa->type==OSPF_IT_PTP) || (ifa->type==OSPF_IT_VLINK))
{
@@ -57,6 +58,7 @@ ospf_int_sm(struct ospf_iface *ifa, int event)
restart_waittim(ifa);
}
}
+ addifa_rtlsa(ifa);
}
break;
case ISM_BACKS:
@@ -307,6 +309,7 @@ ospf_if_notify(struct proto *p, unsigned flags, struct iface *iface)
ifa->waitint=0;
ospf_add_timers(ifa,p->pool);
add_tail(&((struct proto_ospf *)p)->iface_list, NODE ifa);
+ ifa->state=OSPF_IS_DOWN;
ospf_int_sm(ifa, ISM_UP);
}
diff --git a/proto/ospf/ospf.c b/proto/ospf/ospf.c
index 1805ac3..1cf6175 100644
--- a/proto/ospf/ospf.c
+++ b/proto/ospf/ospf.c
@@ -22,7 +22,10 @@ ospf_start(struct proto *p)
po->firstarea->gr=ospf_top_new(po);
po->firstarea->next=NULL;
po->firstarea->areaid=0;
-
+
+ po->areano=0; /* Waiting for interfaces comming up */
+ po->firstarea=NULL;
+ po->areaslab=sl_new(p->pool, sizeof(struct ospf_area));
return PS_UP;
}
diff --git a/proto/ospf/ospf.h b/proto/ospf/ospf.h
index 647deba..05e79e7 100644
--- a/proto/ospf/ospf.h
+++ b/proto/ospf/ospf.h
@@ -220,6 +220,7 @@ struct proto_ospf {
list iface_list; /* Interfaces we really use */
int areano; /* Number of area I belong to */
struct ospf_area *firstarea;
+ slab *areaslab;
};
static int ospf_start(struct proto *p);
diff --git a/proto/ospf/topology.c b/proto/ospf/topology.c
index db2065b..60dbd4f 100644
--- a/proto/ospf/topology.c
+++ b/proto/ospf/topology.c
@@ -23,6 +23,40 @@
#define HASH_LO_STEP 2
#define HASH_LO_MIN 8
+void
+addifa_rtlsa(struct ospf_iface *ifa)
+{
+ struct ospf_area *oa;
+ struct proto_ospf *po;
+
+ po=ifa->proto;
+ oa=po->firstarea;
+
+ while(oa!=NULL)
+ {
+ if(oa->areaid==ifa->area) break;
+ oa=oa->next;
+ }
+
+ if(oa!=NULL) /* Known area */
+ {
+ /**/;
+ }
+ else /* New area */
+ {
+ po->areano++;
+ oa=po->firstarea;
+ po->firstarea=sl_alloc(po->areaslab);
+ po->firstarea->next=oa;
+ po->firstarea->areaid=ifa->area;
+ po->firstarea->gr=ospf_top_new(po);
+ }
+
+ /* FIXME Go on, change router lsa, bits and so on... */
+}
+
+
+
static void
ospf_top_ht_alloc(struct top_graph *f)
{
diff --git a/proto/ospf/topology.h b/proto/ospf/topology.h
index f102851..ec0704c 100644
--- a/proto/ospf/topology.h
+++ b/proto/ospf/topology.h
@@ -36,6 +36,7 @@ void ospf_top_dump(struct top_graph *);
struct top_hash_entry *ospf_hash_find(struct top_graph *, u32 lsa, u32 rtr, u32 type);
struct top_hash_entry *ospf_hash_get(struct top_graph *, u32 lsa, u32 rtr, u32 type);
void ospf_hash_delete(struct top_graph *, struct top_hash_entry *);
+void addifa_rtlsa(struct ospf_iface *ifa);
struct top_graph_rtlsa {
u8 Vbit;