0
0
mirror of https://gitlab.nic.cz/labs/bird.git synced 2024-12-22 01:31:55 +00:00

LS ack bugfix. (I didn't remove LSA from LSret hash.)

This commit is contained in:
Ondrej Filip 2000-04-18 21:40:11 +00:00
parent 19fc4c763e
commit 84228eee27
2 changed files with 32 additions and 25 deletions

View File

@ -14,7 +14,7 @@ ospf_lsupd_tx(struct ospf_neighbor *n)
/* FIXME Go on! */
}
void
int
flood_lsa(struct ospf_neighbor *n, struct ospf_lsa_header *hn,
struct ospf_lsa_header *hh, struct proto_ospf *po, struct ospf_iface *iff,
struct ospf_area *oa)
@ -22,7 +22,7 @@ flood_lsa(struct ospf_neighbor *n, struct ospf_lsa_header *hn,
struct ospf_iface *ifa;
struct ospf_neighbor *nn;
struct top_hash_entry *en;
int ret;
int ret,retval=0;
/* pg 148 */
WALK_LIST(NODE ifa,po->iface_list)
@ -83,7 +83,8 @@ flood_lsa(struct ospf_neighbor *n, struct ospf_lsa_header *hn,
if(ifa==iff)
{
if((n->rid==iff->drid)||n->rid==iff->bdrid) continue;
if(iff->state=OSPF_IS_BACKUP) continue;
if(iff->state==OSPF_IS_BACKUP) continue;
retval=1;
}
/* FIXME directly flood */
{
@ -132,6 +133,7 @@ flood_lsa(struct ospf_neighbor *n, struct ospf_lsa_header *hn,
}
}
}
return retval;
}
void /* I send all I received in LSREQ */
@ -270,11 +272,11 @@ ospf_lsupd_rx(struct ospf_lsupd_packet *ps, struct proto *p,
if((ntmp->state==NEIGHBOR_EXCHANGE)&&
(ntmp->state==NEIGHBOR_LOADING))
flag=1;
DBG("PG143(4): Flag=%u\n",flag);
if(flag==0)
{
ospf_lsack_direct_tx(n,lsa);
continue;
}
}
@ -284,11 +286,19 @@ ospf_lsupd_rx(struct ospf_lsupd_packet *ps, struct proto *p,
struct ospf_iface *ift=NULL;
void *body;
DBG("PG143(5): Received LSA is newer\n");
/* pg 144 (5a) */
if(lsadb && ((lsadb->inst_t-now)<MINLSARRIVAL)) continue;
flood_lsa(n,lsa,&lsatmp,po,ifa,ifa->oa);
if(flood_lsa(n,lsa,&lsatmp,po,ifa,ifa->oa)==0)
{
if(ifa->state==OSPF_IS_BACKUP)
{
if(ifa->drid==n->rid) ospf_lsa_delay(n, lsa, p);
}
else ospf_lsa_delay(n, lsa, p);
}
/* Remove old from all ret lists */
/* pg 144 (5c) */
@ -312,11 +322,6 @@ ospf_lsupd_rx(struct ospf_lsupd_packet *ps, struct proto *p,
lsadb=lsa_install_new(&lsatmp,body, oa);
DBG("New LSA installed in DB\n");
if(ifa->state==OSPF_IS_BACKUP)
{
if(ifa->drid==n->rid) ospf_lsa_delay(n, lsa, p);
}
else if(ifa->drid==n->rid) ospf_lsa_delay(n, lsa, p);
/* FIXME 145 (5f) self originated? */
continue;
@ -327,20 +332,22 @@ ospf_lsupd_rx(struct ospf_lsupd_packet *ps, struct proto *p,
/* pg145 (7) */
if(lsa_comp(&lsatmp,&lsadb->lsa)==CMP_SAME)
{
struct top_hash_entry *en;
if((en=ospf_hash_find_header(n->lsrth,&lsadb->lsa))!=NULL)
{
s_rem_node(SNODE en);
if(ifa->state==OSPF_IS_BACKUP)
{
if(n->rid==ifa->drid) ospf_lsa_delay(n, lsa, p);
}
}
else
{
ospf_lsack_direct_tx(n,lsa);
}
continue;
struct top_hash_entry *en;
DBG("PG145(6) Got the same LSA\n");
if((en=ospf_hash_find_header(n->lsrth,&lsadb->lsa))!=NULL)
{
s_rem_node(SNODE en);
ospf_hash_delete(n->lsrth, en);
if(ifa->state==OSPF_IS_BACKUP)
{
if(n->rid==ifa->drid) ospf_lsa_delay(n, lsa, p);
}
}
else
{
ospf_lsack_direct_tx(n,lsa);
}
continue;
}
/* pg145 (8) */

View File

@ -14,7 +14,7 @@ void ospf_lsupd_tx(struct ospf_neighbor *n);
void ospf_lsupd_tx_list(struct ospf_neighbor *n, list *l);
void ospf_lsupd_rx(struct ospf_lsupd_packet *ps, struct proto *p,
struct ospf_iface *ifa, u16 size);
void flood_lsa(struct ospf_neighbor *n, struct ospf_lsa_header *hn,
int flood_lsa(struct ospf_neighbor *n, struct ospf_lsa_header *hn,
struct ospf_lsa_header *hh, struct proto_ospf *po, struct ospf_iface *iff,
struct ospf_area *oa);