summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--proto/ospf/iface.c3
-rw-r--r--proto/ospf/ospf.h1
-rw-r--r--proto/ospf/topology.c56
3 files changed, 58 insertions, 2 deletions
diff --git a/proto/ospf/iface.c b/proto/ospf/iface.c
index c7dfa2f1..bce763e0 100644
--- a/proto/ospf/iface.c
+++ b/proto/ospf/iface.c
@@ -111,7 +111,6 @@ ospf_int_sm(struct ospf_iface *ifa, int event)
if(ifa->state==OSPF_IS_WAITING)
{
bdr_election(ifa ,p);
- originate_rt_lsa(ifa->oa,po);
}
break;
case ISM_NEICH:
@@ -119,8 +118,8 @@ ospf_int_sm(struct ospf_iface *ifa, int event)
(ifa->state==OSPF_IS_BACKUP))
{
bdr_election(ifa ,p);
+ originate_rt_lsa(ifa->oa,po);
}
- originate_rt_lsa(ifa->oa,po);
break;
case ISM_DOWN:
iface_chstate(ifa, OSPF_IS_DOWN);
diff --git a/proto/ospf/ospf.h b/proto/ospf/ospf.h
index 9ce0be9a..7528921c 100644
--- a/proto/ospf/ospf.h
+++ b/proto/ospf/ospf.h
@@ -102,6 +102,7 @@ struct ospf_iface {
#define WAIT_DMH 3 /* Value of Wait timer - not found it in RFC
* - using 3*HELLO
*/
+ struct top_hash_entry *nlsa;
};
struct ospf_packet {
diff --git a/proto/ospf/topology.c b/proto/ospf/topology.c
index a69c01a2..0020b572 100644
--- a/proto/ospf/topology.c
+++ b/proto/ospf/topology.c
@@ -244,6 +244,62 @@ originate_rt_lsa(struct ospf_area *oa, struct proto_ospf *po)
return en;
}
+void *
+originate_net_lsa_body(struct ospf_iface *ifa, u16 *length,
+ struct proto_ospf *po)
+{
+ u16 i=1;
+ struct ospf_neighbor *n;
+ u32 *body;
+
+ WALK_LIST(n,ifa->neigh_list)
+ {
+ if(n->state==NEIGHBOR_FULL) i++;
+ }
+ body=mb_alloc(po->proto.pool,sizeof(u32)*i);
+ i=1;
+ *body=po->proto.cf->global->router_id;
+ WALK_LIST(n,ifa->neigh_list)
+ {
+ if(n->state==NEIGHBOR_FULL)
+ {
+ *(body+i)=n->rid;
+ i++;
+ }
+ }
+ *length=i*sizeof(u32)+sizeof(struct ospf_lsa_header);
+ return body;
+}
+
+struct top_hash_entry *
+originate_net_lsa(struct ospf_iface *ifa, struct proto_ospf *po)
+{
+ struct ospf_lsa_header lsa;
+ u32 rtid=po->proto.cf->global->router_id;
+ struct top_hash_entry *en;
+ void *body;
+
+ DBG("%s: Originating Net lsa for iface \"%s\".\n", po->proto.name, ifa->iface->name);
+
+ lsa.age=0;
+ lsa.id=rtid;
+ lsa.type=LSA_T_NET;
+ lsa.rt=rtid;
+ if(ifa->nlsa==NULL)
+ {
+ lsa.sn=LSA_INITSEQNO;
+ }
+ else
+ {
+ lsa.sn=ifa->nlsa->lsa.sn+1;
+ }
+ body=originate_net_lsa_body(ifa, &lsa.length, po);
+ lsasum_calculate(&lsa,body,po);
+ en=lsa_install_new(&lsa, body, ifa->oa, &po->proto);
+ return en;
+}
+
+
static void