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