Originating of network LSA.
This commit is contained in:
parent
92bbd812e3
commit
0bf2f2039e
3 changed files with 58 additions and 2 deletions
|
@ -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);
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue