Many bugfixes. (I added one entry twice to slist.)
Debug cleanup. Retransmiting of unacknolegded LSAs
This commit is contained in:
parent
5f743d9697
commit
9669362f05
7 changed files with 64 additions and 22 deletions
|
@ -149,7 +149,7 @@ rxmt_timer_hook(timer *timer)
|
||||||
n=(struct ospf_neighbor *)timer->data;
|
n=(struct ospf_neighbor *)timer->data;
|
||||||
ifa=n->ifa;
|
ifa=n->ifa;
|
||||||
p=(struct proto *)(ifa->proto);
|
p=(struct proto *)(ifa->proto);
|
||||||
debug("%s: RXMT timer fired on interface %s for neigh: %I.\n",
|
DBG("%s: RXMT timer fired on interface %s for neigh: %I.\n",
|
||||||
p->name, ifa->iface->name, n->rid);
|
p->name, ifa->iface->name, n->rid);
|
||||||
if(n->state<NEIGHBOR_LOADING) ospf_dbdes_tx(n);
|
if(n->state<NEIGHBOR_LOADING) ospf_dbdes_tx(n);
|
||||||
else
|
else
|
||||||
|
|
|
@ -183,7 +183,7 @@ hello_timer_hook(timer *timer)
|
||||||
|
|
||||||
ifa=(struct ospf_iface *)timer->data;
|
ifa=(struct ospf_iface *)timer->data;
|
||||||
p=(struct proto *)(ifa->proto);
|
p=(struct proto *)(ifa->proto);
|
||||||
debug("%s: Hello timer fired on interface %s.\n",
|
DBG("%s: Hello timer fired on interface %s.\n",
|
||||||
p->name, ifa->iface->name);
|
p->name, ifa->iface->name);
|
||||||
/* Now we should send a hello packet */
|
/* Now we should send a hello packet */
|
||||||
/* First a common packet header */
|
/* First a common packet header */
|
||||||
|
|
|
@ -15,6 +15,7 @@ ospf_lsack_direct_tx(struct ospf_neighbor *n,struct ospf_lsa_header *h)
|
||||||
struct ospf_packet *op;
|
struct ospf_packet *op;
|
||||||
struct ospf_lsack_packet *pk;
|
struct ospf_lsack_packet *pk;
|
||||||
sock *sk=n->ifa->ip_sk;
|
sock *sk=n->ifa->ip_sk;
|
||||||
|
struct proto *p=&n->ifa->proto->proto;
|
||||||
u16 len;
|
u16 len;
|
||||||
|
|
||||||
DBG("Sending direct ACK to %I for Type: %u, ID: %I, RT: %I\n",n->rid,
|
DBG("Sending direct ACK to %I for Type: %u, ID: %I, RT: %I\n",n->rid,
|
||||||
|
@ -30,6 +31,7 @@ ospf_lsack_direct_tx(struct ospf_neighbor *n,struct ospf_lsa_header *h)
|
||||||
op->length=htons(len);
|
op->length=htons(len);
|
||||||
ospf_pkt_finalize(n->ifa, op);
|
ospf_pkt_finalize(n->ifa, op);
|
||||||
sk_send_to(sk,len, n->ip, OSPF_PROTO);
|
sk_send_to(sk,len, n->ip, OSPF_PROTO);
|
||||||
|
debug("%s: LS ack sent to %I\n", p->name, n->ip);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -160,13 +162,16 @@ ospf_lsack_rx(struct ospf_lsack_packet *ps, struct proto *p,
|
||||||
|
|
||||||
if((n=find_neigh(ifa, nrid))==NULL)
|
if((n=find_neigh(ifa, nrid))==NULL)
|
||||||
{
|
{
|
||||||
debug("%s: Received lsack from unknown neigbor! (%I)\n", p->name,
|
debug("%s: Received LS ack from unknown neigbor! (%I)\n", p->name,
|
||||||
nrid);
|
nrid);
|
||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(n->state<NEIGHBOR_EXCHANGE) return;
|
if(n->state<NEIGHBOR_EXCHANGE) return;
|
||||||
|
|
||||||
|
debug("%s: Received LS ack from %I\n", p->name,
|
||||||
|
n->ip);
|
||||||
|
|
||||||
nolsa=(ntohs(ps->ospf_packet.length)-sizeof(struct ospf_lsack_packet))/
|
nolsa=(ntohs(ps->ospf_packet.length)-sizeof(struct ospf_lsack_packet))/
|
||||||
sizeof(struct ospf_lsa_header);
|
sizeof(struct ospf_lsa_header);
|
||||||
DBG("Received %d lsa ack(s)\n",nolsa);
|
DBG("Received %d lsa ack(s)\n",nolsa);
|
||||||
|
@ -180,6 +185,9 @@ ospf_lsack_rx(struct ospf_lsack_packet *ps, struct proto *p,
|
||||||
if(lsa_comp(&lsa,&en->lsa)!=CMP_SAME)
|
if(lsa_comp(&lsa,&en->lsa)!=CMP_SAME)
|
||||||
{
|
{
|
||||||
log("Strange LS acknoledgement from %I",n->rid);
|
log("Strange LS acknoledgement from %I",n->rid);
|
||||||
|
log("Id: %I, Rt: %I, Type: %u",lsa.id, lsa.rt, lsa.type);
|
||||||
|
log("I have: Age: %u, Seqno: %u", en->lsa.age, en->lsa.sn);
|
||||||
|
log("He has: Age: %u, Seqno: %u", lsa.age, lsa.sn);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,7 @@ ospf_lsreq_tx(struct ospf_neighbor *n)
|
||||||
struct ospf_lsreq_header *lsh;
|
struct ospf_lsreq_header *lsh;
|
||||||
u16 length;
|
u16 length;
|
||||||
int i,j;
|
int i,j;
|
||||||
|
struct proto *p=&n->ifa->proto->proto;
|
||||||
|
|
||||||
pk=(struct ospf_lsreq_packet *)n->ifa->ip_sk->tbuf;
|
pk=(struct ospf_lsreq_packet *)n->ifa->ip_sk->tbuf;
|
||||||
op=(struct ospf_packet *)n->ifa->ip_sk->tbuf;
|
op=(struct ospf_packet *)n->ifa->ip_sk->tbuf;
|
||||||
|
@ -54,7 +55,7 @@ ospf_lsreq_tx(struct ospf_neighbor *n)
|
||||||
op->length=htons(length);
|
op->length=htons(length);
|
||||||
ospf_pkt_finalize(n->ifa, op);
|
ospf_pkt_finalize(n->ifa, op);
|
||||||
sk_send_to(n->ifa->ip_sk,length, n->ip, OSPF_PROTO);
|
sk_send_to(n->ifa->ip_sk,length, n->ip, OSPF_PROTO);
|
||||||
DBG("Lsreq send to: %I\n", n->rid);
|
debug("%s: LS request sent to: %I\n", p->name, n->rid);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -63,16 +64,39 @@ lsrr_timer_hook(timer *timer)
|
||||||
struct ospf_iface *ifa;
|
struct ospf_iface *ifa;
|
||||||
struct proto *p;
|
struct proto *p;
|
||||||
struct ospf_neighbor *n;
|
struct ospf_neighbor *n;
|
||||||
|
struct top_hash_entry *en;
|
||||||
|
|
||||||
n=(struct ospf_neighbor *)timer->data;
|
n=(struct ospf_neighbor *)timer->data;
|
||||||
ifa=n->ifa;
|
ifa=n->ifa;
|
||||||
p=(struct proto *)(ifa->proto);
|
p=(struct proto *)(ifa->proto);
|
||||||
debug("%s: LSRR timer fired on interface %s for neigh: %I.\n",
|
|
||||||
|
DBG("%s: LSRR timer fired on interface %s for neigh: %I.\n",
|
||||||
p->name, ifa->iface->name, n->rid);
|
p->name, ifa->iface->name, n->rid);
|
||||||
if(n->state<NEIGHBOR_FULL) ospf_lsreq_tx(n);
|
if(n->state<NEIGHBOR_FULL) ospf_lsreq_tx(n);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
int i; /* FIXME Retransmit lsupd again */
|
if(!EMPTY_SLIST(n->lsrtl))
|
||||||
|
{
|
||||||
|
list uplist;
|
||||||
|
slab *upslab;
|
||||||
|
struct l_lsr_head *llsh;
|
||||||
|
|
||||||
|
init_list(&uplist);
|
||||||
|
upslab=sl_new(p->pool,sizeof(struct l_lsr_head));
|
||||||
|
|
||||||
|
WALK_SLIST(SNODE en,n->lsrtl)
|
||||||
|
{
|
||||||
|
if((SNODE en)->next==(SNODE en)) die("BUGGGGGG");
|
||||||
|
llsh=sl_alloc(upslab);
|
||||||
|
llsh->lsh.id=en->lsa.id;
|
||||||
|
llsh->lsh.rt=en->lsa.rt;
|
||||||
|
llsh->lsh.type=en->lsa.type;
|
||||||
|
DBG("Working on ID: %I, RT: %I, Type: %u\n",en->lsa.id,en->lsa.rt,en->lsa.type);
|
||||||
|
add_tail(&uplist, NODE llsh);
|
||||||
|
}
|
||||||
|
ospf_lsupd_tx_list(n, &uplist);
|
||||||
|
rfree(upslab);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -95,11 +119,13 @@ ospf_lsreq_rx(struct ospf_lsreq_packet *ps, struct proto *p,
|
||||||
|
|
||||||
if((n=find_neigh(ifa, nrid))==NULL)
|
if((n=find_neigh(ifa, nrid))==NULL)
|
||||||
{
|
{
|
||||||
debug("%s: Received lsreq from unknown neigbor! (%I)\n", p->name,
|
debug("%s: Received lsreq from unknown neighbor! (%I)\n", p->name,
|
||||||
nrid);
|
nrid);
|
||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
if(n->state<NEIGHBOR_EXCHANGE) debug("%s: Ignoring it.\n", p->name);
|
if(n->state<NEIGHBOR_EXCHANGE) return;
|
||||||
|
|
||||||
|
debug("%s: Received LS req from neighbor: %I\n",p->name, n->ip);
|
||||||
|
|
||||||
length=htons(ps->ospf_packet.length);
|
length=htons(ps->ospf_packet.length);
|
||||||
lsh=(void *)(ps+1);
|
lsh=(void *)(ps+1);
|
||||||
|
|
|
@ -69,9 +69,18 @@ flood_lsa(struct ospf_neighbor *n, struct ospf_lsa_header *hn,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(nn==n) continue;
|
if(nn==n) continue;
|
||||||
en=ospf_hash_get_header(nn->lsrth, hh);
|
if((en=ospf_hash_find_header(nn->lsrth, hh))==NULL)
|
||||||
|
{
|
||||||
|
en=ospf_hash_get_header(nn->lsrth, hh);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
s_rem_node(SNODE en);
|
||||||
|
}
|
||||||
s_add_tail(&nn->lsrtl, SNODE en);
|
s_add_tail(&nn->lsrtl, SNODE en);
|
||||||
ret=1;
|
ret=1;
|
||||||
|
DBG("Adding LSA lsrt RT: %I, Id: %I, Type: %u for n: %I\n",
|
||||||
|
en->lsa.rt,en->lsa.id, en->lsa.type, nn->ip);
|
||||||
}
|
}
|
||||||
if(ret==0) continue;
|
if(ret==0) continue;
|
||||||
if(ifa==iff)
|
if(ifa==iff)
|
||||||
|
@ -147,6 +156,7 @@ ospf_lsupd_tx_list(struct ospf_neighbor *n, list *l)
|
||||||
struct top_hash_entry *en;
|
struct top_hash_entry *en;
|
||||||
struct ospf_lsupd_packet *pk;
|
struct ospf_lsupd_packet *pk;
|
||||||
struct ospf_packet *op;
|
struct ospf_packet *op;
|
||||||
|
struct proto *p=&n->ifa->oa->po->proto;
|
||||||
void *pktpos;
|
void *pktpos;
|
||||||
u8 ii;
|
u8 ii;
|
||||||
u8 *jj=n->ifa->ip_sk->tbuf;
|
u8 *jj=n->ifa->ip_sk->tbuf;
|
||||||
|
@ -174,10 +184,8 @@ ospf_lsupd_tx_list(struct ospf_neighbor *n, list *l)
|
||||||
op->length=htons(len);
|
op->length=htons(len);
|
||||||
ospf_pkt_finalize(n->ifa, op);
|
ospf_pkt_finalize(n->ifa, op);
|
||||||
|
|
||||||
for(ii=0;ii<(len-SIPH);ii+=4)
|
|
||||||
DBG("Out dump: %d,%d,%d,%d\n", *(jj+ii), *(jj+ii+1), *(jj+ii+2), *(jj+ii+3));
|
|
||||||
|
|
||||||
sk_send_to(n->ifa->ip_sk,len, n->ip, OSPF_PROTO);
|
sk_send_to(n->ifa->ip_sk,len, n->ip, OSPF_PROTO);
|
||||||
|
debug("%s: LS upd sent to %I\n", p->name, n->ip);
|
||||||
|
|
||||||
DBG("LSupd: next packet\n");
|
DBG("LSupd: next packet\n");
|
||||||
fill_ospf_pkt_hdr(n->ifa, pk, LSUPD);
|
fill_ospf_pkt_hdr(n->ifa, pk, LSUPD);
|
||||||
|
@ -201,7 +209,7 @@ ospf_lsupd_tx_list(struct ospf_neighbor *n, list *l)
|
||||||
DBG("Out dump: %d,%d,%d,%d\n", *(jj+ii), *(jj+ii+1), *(jj+ii+2), *(jj+ii+3));
|
DBG("Out dump: %d,%d,%d,%d\n", *(jj+ii), *(jj+ii+1), *(jj+ii+2), *(jj+ii+3));
|
||||||
|
|
||||||
sk_send_to(n->ifa->ip_sk,len, n->ip, OSPF_PROTO);
|
sk_send_to(n->ifa->ip_sk,len, n->ip, OSPF_PROTO);
|
||||||
DBG("LSupd: sent\n");
|
debug("%s: LS upd sent to %I\n", p->name, n->ip);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -233,6 +241,8 @@ ospf_lsupd_rx(struct ospf_lsupd_packet *ps, struct proto *p,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
debug("%s: Received LS upd from (%I)\n", p->name, n->ip);
|
||||||
|
|
||||||
lsa=(struct ospf_lsa_header *)(ps+1);
|
lsa=(struct ospf_lsa_header *)(ps+1);
|
||||||
area=htonl(ps->ospf_packet.areaid);
|
area=htonl(ps->ospf_packet.areaid);
|
||||||
oa=ospf_find_area((struct proto_ospf *)p,area);
|
oa=ospf_find_area((struct proto_ospf *)p,area);
|
||||||
|
|
|
@ -27,8 +27,6 @@
|
||||||
#include "conf/conf.h"
|
#include "conf/conf.h"
|
||||||
#include "lib/string.h"
|
#include "lib/string.h"
|
||||||
|
|
||||||
#define LOCAL_DEBUG
|
|
||||||
|
|
||||||
#define OSPF_PROTO 89
|
#define OSPF_PROTO 89
|
||||||
#ifndef IPV6
|
#ifndef IPV6
|
||||||
#define OSPF_VERSION 2
|
#define OSPF_VERSION 2
|
||||||
|
|
|
@ -7,8 +7,6 @@
|
||||||
* 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.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define LOCAL_DEBUG
|
|
||||||
|
|
||||||
#include "nest/bird.h"
|
#include "nest/bird.h"
|
||||||
#include "lib/string.h"
|
#include "lib/string.h"
|
||||||
|
|
||||||
|
@ -34,9 +32,10 @@ originate_rt_lsa_body(struct ospf_area *oa, u16 *length, struct proto_ospf *p)
|
||||||
struct top_hash_entry *old;
|
struct top_hash_entry *old;
|
||||||
struct proto_ospf *po=(struct proto_ospf *)p;
|
struct proto_ospf *po=(struct proto_ospf *)p;
|
||||||
|
|
||||||
DBG("%s: Originating RT_lsa body for area \"%I\".\n", po->proto.name, oa->areaid);
|
DBG("%s: Originating RT_lsa body for area \"%I\".\n", po->proto.name,
|
||||||
|
oa->areaid);
|
||||||
|
|
||||||
WALK_LIST (ifa, p->iface_list) i++;
|
WALK_LIST (ifa, p->iface_list)
|
||||||
{
|
{
|
||||||
if((ifa->an==oa->areaid) && (ifa->state!=OSPF_IS_DOWN))
|
if((ifa->an==oa->areaid) && (ifa->state!=OSPF_IS_DOWN))
|
||||||
{
|
{
|
||||||
|
@ -226,7 +225,7 @@ originate_rt_lsa(struct ospf_area *oa, struct proto_ospf *po)
|
||||||
struct top_hash_entry *en;
|
struct top_hash_entry *en;
|
||||||
void *body;
|
void *body;
|
||||||
|
|
||||||
DBG("%s: Originating RT_lsa for area \"%I\".\n", po->proto.name, oa->areaid);
|
debug("%s: Originating RT_lsa for area \"%I\".\n",po->proto.name,oa->areaid);
|
||||||
|
|
||||||
lsa.age=0;
|
lsa.age=0;
|
||||||
lsa.id=rtid;
|
lsa.id=rtid;
|
||||||
|
@ -287,7 +286,8 @@ originate_net_lsa(struct ospf_iface *ifa, struct proto_ospf *po)
|
||||||
|
|
||||||
if(ifa->state!=OSPF_IS_DR) return;
|
if(ifa->state!=OSPF_IS_DR) return;
|
||||||
|
|
||||||
DBG("%s: Originating Net lsa for iface \"%s\".\n", po->proto.name, ifa->iface->name);
|
debug("%s: Originating Net lsa for iface \"%s\".\n", po->proto.name,
|
||||||
|
ifa->iface->name);
|
||||||
|
|
||||||
if(ifa->fadj==0)
|
if(ifa->fadj==0)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue