Originating of network LSA.

This commit is contained in:
Ondrej Filip 2000-05-02 23:09:44 +00:00
parent 92bbd812e3
commit 0bf2f2039e
3 changed files with 58 additions and 2 deletions

View file

@ -111,7 +111,6 @@ ospf_int_sm(struct ospf_iface *ifa, int event)
if(ifa->state==OSPF_IS_WAITING) if(ifa->state==OSPF_IS_WAITING)
{ {
bdr_election(ifa ,p); bdr_election(ifa ,p);
originate_rt_lsa(ifa->oa,po);
} }
break; break;
case ISM_NEICH: case ISM_NEICH:
@ -119,8 +118,8 @@ ospf_int_sm(struct ospf_iface *ifa, int event)
(ifa->state==OSPF_IS_BACKUP)) (ifa->state==OSPF_IS_BACKUP))
{ {
bdr_election(ifa ,p); bdr_election(ifa ,p);
}
originate_rt_lsa(ifa->oa,po); originate_rt_lsa(ifa->oa,po);
}
break; break;
case ISM_DOWN: case ISM_DOWN:
iface_chstate(ifa, OSPF_IS_DOWN); iface_chstate(ifa, OSPF_IS_DOWN);

View file

@ -102,6 +102,7 @@ struct ospf_iface {
#define WAIT_DMH 3 /* Value of Wait timer - not found it in RFC #define WAIT_DMH 3 /* Value of Wait timer - not found it in RFC
* - using 3*HELLO * - using 3*HELLO
*/ */
struct top_hash_entry *nlsa;
}; };
struct ospf_packet { struct ospf_packet {

View file

@ -244,6 +244,62 @@ originate_rt_lsa(struct ospf_area *oa, struct proto_ospf *po)
return en; 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 static void