lsack.c cleaned. Better names for functions and
DIRECT acks can be sent in one packet now.
This commit is contained in:
parent
28de5133ec
commit
c76ba51a5f
6 changed files with 45 additions and 57 deletions
|
@ -1,54 +1,35 @@
|
||||||
/*
|
/*
|
||||||
* BIRD -- OSPF
|
* BIRD -- OSPF
|
||||||
*
|
*
|
||||||
* (c) 2000 Ondrej Filip <feela@network.cz>
|
* (c) 2000-2004 Ondrej Filip <feela@network.cz>
|
||||||
*
|
*
|
||||||
* Can be freely distributed and used under the terms of the GNU GPL.
|
* Can be freely distributed and used under the terms of the GNU GPL.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "ospf.h"
|
#include "ospf.h"
|
||||||
|
|
||||||
/* Note, that h is in network endianity! */
|
char *s_queue[]={ "direct", "delayed" };
|
||||||
|
|
||||||
|
/*
|
||||||
|
* =====================================
|
||||||
|
* Note, that h is in network endianity!
|
||||||
|
* =====================================
|
||||||
|
*/
|
||||||
void
|
void
|
||||||
ospf_lsack_direct_tx(struct ospf_neighbor *n,struct ospf_lsa_header *h)
|
ospf_lsack_enqueue(struct ospf_neighbor *n,struct ospf_lsa_header *h,
|
||||||
{
|
struct proto *p, int queue)
|
||||||
struct ospf_packet *op;
|
|
||||||
struct ospf_lsack_packet *pk;
|
|
||||||
sock *sk=n->ifa->ip_sk;
|
|
||||||
struct proto *p=&n->ifa->proto->proto;
|
|
||||||
u16 len;
|
|
||||||
|
|
||||||
DBG("Sending direct ACK to %I for Type: %u, ID: %I, RT: %I\n",n->rid,
|
|
||||||
h->type, ntohl(h->id), ntohl(h->rt));
|
|
||||||
|
|
||||||
pk=(struct ospf_lsack_packet *)sk->tbuf;
|
|
||||||
op=(struct ospf_packet *)sk->tbuf;
|
|
||||||
|
|
||||||
fill_ospf_pkt_hdr(n->ifa, pk, LSACK_P);
|
|
||||||
|
|
||||||
memcpy(pk+1,h,sizeof(struct ospf_lsa_header));
|
|
||||||
len=sizeof(struct ospf_lsack_packet)+sizeof(struct ospf_lsa_header);
|
|
||||||
op->length=htons(len);
|
|
||||||
ospf_pkt_finalize(n->ifa, op);
|
|
||||||
sk_send_to(sk,len, n->ip, OSPF_PROTO);
|
|
||||||
OSPF_TRACE(D_PACKETS, "LS ack sent to %I", n->ip);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
ospf_lsa_delay(struct ospf_neighbor *n,struct ospf_lsa_header *h,
|
|
||||||
struct proto *p)
|
|
||||||
{
|
{
|
||||||
struct lsah_n *no;
|
struct lsah_n *no;
|
||||||
|
|
||||||
no=mb_alloc(n->pool,sizeof(struct lsah_n));
|
no=mb_alloc(n->pool,sizeof(struct lsah_n));
|
||||||
memcpy(&no->lsa,h,sizeof(struct ospf_lsa_header));
|
memcpy(&no->lsa,h,sizeof(struct ospf_lsa_header));
|
||||||
add_tail(&n->ackl, NODE no);
|
add_tail(&n->ackl[queue], NODE no);
|
||||||
DBG("Adding delay ack for %I, ID: %I, RT: %I, Type: %u\n",n->rid,
|
DBG("Adding (%s) ack for %I, ID: %I, RT: %I, Type: %u\n", s_queue[queue], n->rid,
|
||||||
ntohl(h->id), ntohl(h->rt),h->type);
|
ntohl(h->id), ntohl(h->rt),h->type);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
ospf_lsack_delay_tx(struct ospf_neighbor *n)
|
ospf_lsack_send(struct ospf_neighbor *n, int queue)
|
||||||
{
|
{
|
||||||
struct ospf_packet *op;
|
struct ospf_packet *op;
|
||||||
struct ospf_lsack_packet *pk;
|
struct ospf_lsack_packet *pk;
|
||||||
|
@ -59,7 +40,9 @@ ospf_lsack_delay_tx(struct ospf_neighbor *n)
|
||||||
struct ospf_iface *ifa=n->ifa;
|
struct ospf_iface *ifa=n->ifa;
|
||||||
struct proto *p=&n->ifa->proto->proto;
|
struct proto *p=&n->ifa->proto->proto;
|
||||||
|
|
||||||
OSPF_TRACE(D_PACKETS, "LS ack sent to %I (delayed)",n->ip);
|
if(EMPTY_LIST(n->ackl[queue])) return;
|
||||||
|
|
||||||
|
OSPF_TRACE(D_PACKETS, "LS ack sent to %I (%s)", n->ip, s_queue[queue]);
|
||||||
|
|
||||||
if(ifa->type==OSPF_IT_BCAST)
|
if(ifa->type==OSPF_IT_BCAST)
|
||||||
{
|
{
|
||||||
|
@ -76,9 +59,9 @@ ospf_lsack_delay_tx(struct ospf_neighbor *n)
|
||||||
fill_ospf_pkt_hdr(n->ifa, pk, LSACK_P);
|
fill_ospf_pkt_hdr(n->ifa, pk, LSACK_P);
|
||||||
h=(struct ospf_lsa_header *)(pk+1);
|
h=(struct ospf_lsa_header *)(pk+1);
|
||||||
|
|
||||||
while(!EMPTY_LIST(n->ackl))
|
while(!EMPTY_LIST(n->ackl[queue]))
|
||||||
{
|
{
|
||||||
no=(struct lsah_n *)HEAD(n->ackl);
|
no=(struct lsah_n *)HEAD(n->ackl[queue]);
|
||||||
memcpy(h+i,&no->lsa, sizeof(struct ospf_lsa_header));
|
memcpy(h+i,&no->lsa, sizeof(struct ospf_lsa_header));
|
||||||
i++;
|
i++;
|
||||||
DBG("Iter %u ID: %I, RT: %I, Type: %u\n",i, ntohl((h+i)->id),
|
DBG("Iter %u ID: %I, RT: %I, Type: %u\n",i, ntohl((h+i)->id),
|
||||||
|
@ -88,7 +71,7 @@ ospf_lsack_delay_tx(struct ospf_neighbor *n)
|
||||||
if((i*sizeof(struct ospf_lsa_header)+sizeof(struct ospf_lsack_packet)+SIPH)>
|
if((i*sizeof(struct ospf_lsa_header)+sizeof(struct ospf_lsack_packet)+SIPH)>
|
||||||
n->ifa->iface->mtu)
|
n->ifa->iface->mtu)
|
||||||
{
|
{
|
||||||
if(!EMPTY_LIST(n->ackl))
|
if(!EMPTY_LIST(n->ackl[queue]))
|
||||||
{
|
{
|
||||||
len=sizeof(struct ospf_lsack_packet)+i*sizeof(struct ospf_lsa_header);
|
len=sizeof(struct ospf_lsack_packet)+i*sizeof(struct ospf_lsa_header);
|
||||||
op->length=htons(len);
|
op->length=htons(len);
|
||||||
|
@ -131,11 +114,11 @@ ospf_lsack_delay_tx(struct ospf_neighbor *n)
|
||||||
{
|
{
|
||||||
if((ifa->state==OSPF_IS_DR)||(ifa->state==OSPF_IS_BACKUP))
|
if((ifa->state==OSPF_IS_DR)||(ifa->state==OSPF_IS_BACKUP))
|
||||||
{
|
{
|
||||||
sk_send_to(sk ,len, AllSPFRouters, OSPF_PROTO);
|
sk_send_to(sk, len, AllSPFRouters, OSPF_PROTO);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
sk_send_to(sk ,len, AllDRouters, OSPF_PROTO);
|
sk_send_to(sk, len, AllDRouters, OSPF_PROTO);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -145,7 +128,7 @@ ospf_lsack_delay_tx(struct ospf_neighbor *n)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
ospf_lsack_rx(struct ospf_lsack_packet *ps, struct proto *p,
|
ospf_lsack_receive(struct ospf_lsack_packet *ps, struct proto *p,
|
||||||
struct ospf_iface *ifa, u16 size)
|
struct ospf_iface *ifa, u16 size)
|
||||||
{
|
{
|
||||||
u32 nrid, myrid;
|
u32 nrid, myrid;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* BIRD -- OSPF
|
* BIRD -- OSPF
|
||||||
*
|
*
|
||||||
* (c) 2000 Ondrej Filip <feela@network.cz>
|
* (c) 2000--2004 Ondrej Filip <feela@network.cz>
|
||||||
*
|
*
|
||||||
* Can be freely distributed and used under the terms of the GNU GPL.
|
* Can be freely distributed and used under the terms of the GNU GPL.
|
||||||
*
|
*
|
||||||
|
@ -14,10 +14,9 @@ struct lsah_n {
|
||||||
struct ospf_lsa_header lsa;
|
struct ospf_lsa_header lsa;
|
||||||
};
|
};
|
||||||
|
|
||||||
void ospf_lsack_direct_tx(struct ospf_neighbor *n,struct ospf_lsa_header *h);
|
void ospf_lsack_receive(struct ospf_lsack_packet *ps, struct proto *p,
|
||||||
void ospf_lsack_rx(struct ospf_lsack_packet *ps, struct proto *p,
|
|
||||||
struct ospf_iface *ifa, u16 size);
|
struct ospf_iface *ifa, u16 size);
|
||||||
void ospf_lsack_delay_tx(struct ospf_neighbor *n);
|
void ospf_lsack_send(struct ospf_neighbor *n, int queue);
|
||||||
void ospf_lsa_delay(struct ospf_neighbor *n,struct ospf_lsa_header *h,
|
void ospf_lsack_enqueue(struct ospf_neighbor *n,struct ospf_lsa_header *h,
|
||||||
struct proto *p);
|
struct proto *p, int queue);
|
||||||
#endif /* _BIRD_OSPF_LSACK_H_ */
|
#endif /* _BIRD_OSPF_LSACK_H_ */
|
||||||
|
|
|
@ -366,7 +366,7 @@ ospf_lsupd_rx(struct ospf_lsupd_packet *ps, struct proto *p,
|
||||||
/* pg 143 (4) */
|
/* pg 143 (4) */
|
||||||
if((lsatmp.age==LSA_MAXAGE)&&(lsadb==NULL)&&can_flush_lsa(oa))
|
if((lsatmp.age==LSA_MAXAGE)&&(lsadb==NULL)&&can_flush_lsa(oa))
|
||||||
{
|
{
|
||||||
ospf_lsack_direct_tx(n,lsa);
|
ospf_lsack_enqueue(n, lsa, p, ACKL_DIRECT);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -399,7 +399,7 @@ ospf_lsupd_rx(struct ospf_lsupd_packet *ps, struct proto *p,
|
||||||
|
|
||||||
if((lsatmp.age==LSA_MAXAGE)&&(lsatmp.sn==LSA_MAXSEQNO))
|
if((lsatmp.age==LSA_MAXAGE)&&(lsatmp.sn==LSA_MAXSEQNO))
|
||||||
{
|
{
|
||||||
ospf_lsack_direct_tx(n,lsa);
|
ospf_lsack_enqueue(n, lsa, p, ACKL_DIRECT);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -432,9 +432,9 @@ ospf_lsupd_rx(struct ospf_lsupd_packet *ps, struct proto *p,
|
||||||
DBG("Wasn't flooded back\n"); /* ps 144(5e), pg 153 */
|
DBG("Wasn't flooded back\n"); /* ps 144(5e), pg 153 */
|
||||||
if(ifa->state==OSPF_IS_BACKUP)
|
if(ifa->state==OSPF_IS_BACKUP)
|
||||||
{
|
{
|
||||||
if(ifa->drid==n->rid) ospf_lsa_delay(n, lsa, p);
|
if(ifa->drid==n->rid) ospf_lsack_enqueue(n, lsa, p, ACKL_DELAY);
|
||||||
}
|
}
|
||||||
else ospf_lsa_delay(n, lsa, p);
|
else ospf_lsack_enqueue(n, lsa, p, ACKL_DELAY);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Remove old from all ret lists */
|
/* Remove old from all ret lists */
|
||||||
|
@ -488,13 +488,13 @@ ospf_lsupd_rx(struct ospf_lsupd_packet *ps, struct proto *p,
|
||||||
ospf_hash_delete(n->lsrth, en);
|
ospf_hash_delete(n->lsrth, en);
|
||||||
if(ifa->state==OSPF_IS_BACKUP)
|
if(ifa->state==OSPF_IS_BACKUP)
|
||||||
{
|
{
|
||||||
if(n->rid==ifa->drid) ospf_lsa_delay(n, lsa, p);
|
if(n->rid==ifa->drid) ospf_lsack_enqueue(n, lsa, p, ACKL_DELAY);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* pg145 (7b) */
|
/* pg145 (7b) */
|
||||||
ospf_lsack_direct_tx(n,lsa);
|
ospf_lsack_enqueue(n, lsa, p, ACKL_DIRECT);
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -517,6 +517,9 @@ ospf_lsupd_rx(struct ospf_lsupd_packet *ps, struct proto *p,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Send direct LSAs */
|
||||||
|
ospf_lsack_send(n, ACKL_DIRECT);
|
||||||
|
|
||||||
if(n->state==NEIGHBOR_LOADING)
|
if(n->state==NEIGHBOR_LOADING)
|
||||||
{
|
{
|
||||||
ospf_lsreq_tx(n); /* Send me another part of database */
|
ospf_lsreq_tx(n); /* Send me another part of database */
|
||||||
|
|
|
@ -67,7 +67,8 @@ ospf_neighbor_new(struct ospf_iface *ifa)
|
||||||
n->ackd_timer->randomize = 0;
|
n->ackd_timer->randomize = 0;
|
||||||
n->ackd_timer->hook = ackd_timer_hook;
|
n->ackd_timer->hook = ackd_timer_hook;
|
||||||
n->ackd_timer->recurrent = ifa->rxmtint/2;
|
n->ackd_timer->recurrent = ifa->rxmtint/2;
|
||||||
init_list(&n->ackl);
|
init_list(&n->ackl[ACKL_DIRECT]);
|
||||||
|
init_list(&n->ackl[ACKL_DELAY]);
|
||||||
tm_start(n->ackd_timer,n->ifa->rxmtint/2);
|
tm_start(n->ackd_timer,n->ifa->rxmtint/2);
|
||||||
DBG("%s: Installing ackd timer.\n", p->name);
|
DBG("%s: Installing ackd timer.\n", p->name);
|
||||||
|
|
||||||
|
@ -306,10 +307,10 @@ ospf_neigh_sm(struct ospf_neighbor *n, int event)
|
||||||
{
|
{
|
||||||
neigh_chstate(n,NEIGHBOR_EXCHANGE);
|
neigh_chstate(n,NEIGHBOR_EXCHANGE);
|
||||||
s_init(&(n->dbsi), &(n->ifa->oa->lsal));
|
s_init(&(n->dbsi), &(n->ifa->oa->lsal));
|
||||||
while(!EMPTY_LIST(n->ackl))
|
while(!EMPTY_LIST(n->ackl[ACKL_DELAY]))
|
||||||
{
|
{
|
||||||
struct lsah_n *no;
|
struct lsah_n *no;
|
||||||
no=(struct lsah_n *)HEAD(n->ackl);
|
no=(struct lsah_n *)HEAD(n->ackl[ACKL_DELAY]);
|
||||||
rem_node(NODE no);
|
rem_node(NODE no);
|
||||||
mb_free(no);
|
mb_free(no);
|
||||||
}
|
}
|
||||||
|
@ -611,6 +612,6 @@ void
|
||||||
ackd_timer_hook(timer *t)
|
ackd_timer_hook(timer *t)
|
||||||
{
|
{
|
||||||
struct ospf_neighbor *n=t->data;
|
struct ospf_neighbor *n=t->data;
|
||||||
if(!EMPTY_LIST(n->ackl)) ospf_lsack_delay_tx(n);
|
ospf_lsack_send(n, ACKL_DELAY);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -356,7 +356,9 @@ struct ospf_neighbor
|
||||||
struct top_graph *lsrth;
|
struct top_graph *lsrth;
|
||||||
void *ldbdes; /* Last database description packet */
|
void *ldbdes; /* Last database description packet */
|
||||||
timer *rxmt_timer; /* RXMT timer */
|
timer *rxmt_timer; /* RXMT timer */
|
||||||
list ackl;
|
list ackl[2];
|
||||||
|
#define ACKL_DIRECT 0
|
||||||
|
#define ACKL_DELAY 1
|
||||||
timer *ackd_timer; /* Delayed ack timer */
|
timer *ackd_timer; /* Delayed ack timer */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -192,7 +192,7 @@ ospf_rx_hook (sock * sk, int size)
|
||||||
break;
|
break;
|
||||||
case LSACK_P:
|
case LSACK_P:
|
||||||
DBG ("%s: Link state ack received.\n", p->name);
|
DBG ("%s: Link state ack received.\n", p->name);
|
||||||
ospf_lsack_rx ((struct ospf_lsack_packet *) ps, p, ifa, size);
|
ospf_lsack_receive((struct ospf_lsack_packet *) ps, p, ifa, size);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
log ("%s: Bad packet received: wrong type %u", p->name, ps->type);
|
log ("%s: Bad packet received: wrong type %u", p->name, ps->type);
|
||||||
|
|
Loading…
Reference in a new issue