summaryrefslogtreecommitdiffstats
path: root/proto/ospf
diff options
context:
space:
mode:
Diffstat (limited to 'proto/ospf')
-rw-r--r--proto/ospf/dbdes.c45
-rw-r--r--proto/ospf/neighbor.c4
-rw-r--r--proto/ospf/topology.c11
3 files changed, 43 insertions, 17 deletions
diff --git a/proto/ospf/dbdes.c b/proto/ospf/dbdes.c
index eb65b5f..cf7a747 100644
--- a/proto/ospf/dbdes.c
+++ b/proto/ospf/dbdes.c
@@ -48,14 +48,14 @@ ospf_dbdes_tx(struct ospf_neighbor *n)
ifa=n->ifa;
p=(struct proto *)(ifa->proto);
- pkt=(struct ospf_dbdes_packet *)(ifa->ip_sk->tbuf);
- op=(struct ospf_packet *)pkt;
switch(n->state)
{
case NEIGHBOR_EXSTART: /* Send empty packets */
+ pkt=(struct ospf_dbdes_packet *)(ifa->ip_sk->tbuf);
+ op=(struct ospf_packet *)pkt;
fill_ospf_pkt_hdr(ifa, pkt, DBDES);
- pkt->iface_mtu=ifa->iface->mtu;
+ pkt->iface_mtu=htons(ifa->iface->mtu);
pkt->options= ifa->options;
pkt->imms=n->myimms;
pkt->ddseq=n->dds;
@@ -63,62 +63,78 @@ ospf_dbdes_tx(struct ospf_neighbor *n)
op->length=htons(length);
ospf_pkt_finalize(ifa, op);
sk_send_to(ifa->ip_sk,length, n->ip, OSPF_PROTO);
- debug("%s: DB_DES sent for %u.\n", p->name, n->rid);
+ debug("%s: DB_DES (I) sent for %u.\n", p->name, n->rid);
break;
case NEIGHBOR_EXCHANGE:
- if(! ((IAMMASTER(n->myimms) && (n->dds==n->ddr+1)) || ((!IAMMASTER(n->myimms)) && (n->dds==n->ddr))))
+ if(! ((IAMMASTER(n->myimms) && (n->dds==n->ddr+1)) ||
+ ((!IAMMASTER(n->myimms)) && (n->dds==n->ddr))))
{
snode *sn; /* Send next */
struct ospf_lsa_header *lsa;
+
+ pkt=n->ldbdes;
+ op=(struct ospf_packet *)pkt;
fill_ospf_pkt_hdr(ifa, pkt, DBDES);
- pkt->iface_mtu= ifa->iface->mtu;
+ pkt->iface_mtu=htons(ifa->iface->mtu);
pkt->options= ifa->options;
pkt->ddseq=n->dds;
- sn=s_get(&(n->dbsi));
- j=i=(pkt->iface_mtu-sizeof(struct ospf_dbdes_packet))/
+ j=i=(ifa->iface->mtu-sizeof(struct ospf_dbdes_packet))/
sizeof(struct ospf_lsa_header); /* Number of lsaheaders */
lsa=(n->ldbdes+sizeof(struct ospf_dbdes_packet));
+ sn=s_get(&(n->dbsi));
+
+ DBG("Number of LSA: %d\n", j);
for(;i>0;i--)
{
struct top_hash_entry *en;
en=(struct top_hash_entry *)sn;
htonlsah(&(en->lsa), lsa);
+ DBG("Working on: %d\n", i);
+ debug("\t%04x %08x %08x %p\n", en->lsa.type, en->lsa.id,
+ en->lsa.rt, en->lsa_body);
+
if(sn->next==NULL)
{
break; /* Should set some flag? */
}
sn=sn->next;
+ lsa++;
}
- s_put(&(n->dbsi),sn);
+ i--;
if(sn->next==NULL)
{
+ DBG("Number of LSA NOT sent: %d\n", i);
+ DBG("M bit unset.\n");
n->myimms=(n->myimms-DBDES_M); /* Unset more bit */
}
+ s_put(&(n->dbsi),sn);
+
pkt->imms=n->myimms;
- length=j*sizeof(struct ospf_lsa_header)+
+ length=(j-i)*sizeof(struct ospf_lsa_header)+
sizeof(struct ospf_dbdes_packet);
op->length=htons(length);
ospf_pkt_finalize(ifa, op);
- sk_send_to(ifa->ip_sk,length, n->ip, OSPF_PROTO);
}
aa=ifa->ip_sk->tbuf;
bb=n->ldbdes;
+ op=n->ldbdes;
length=ntohs(op->length);
for(i=0; i<ifa->iface->mtu; i++)
{
- *(aa+i)=*(bb+i); /* Copy last sent packet again */
+ *(bb+i)=*(aa+i); /* Copy last sent packet again */
}
sk_send_to(ifa->ip_sk,length, n->ip, OSPF_PROTO);
+ debug("%s: DB_DES sent for %u.\n", p->name, n->rid);
default: /* Ignore it */
break;
@@ -227,18 +243,21 @@ ospf_dbdes_rx(struct ospf_dbdes_packet *ps, struct proto *p,
if(IAMMASTER(ps->imms)!=IAMMASTER(n->myimms)) /* M/S bit differs */
{
+ DBG("SEQMIS-IMMS\n");
ospf_neigh_sm(n, INM_SEQMIS);
break;
}
if(INISET(ps->imms)) /* I bit is set */
{
+ DBG("SEQMIS-BIT-I\n");
ospf_neigh_sm(n, INM_SEQMIS);
break;
}
if(ps->options!=n->options) /* Options differs */
{
+ DBG("SEQMIS-OPT\n");
ospf_neigh_sm(n, INM_SEQMIS);
break;
}
@@ -247,6 +266,7 @@ ospf_dbdes_rx(struct ospf_dbdes_packet *ps, struct proto *p,
{
if(ps->ddseq!=n->dds)
{
+ DBG("SEQMIS-MASTER\n");
ospf_neigh_sm(n, INM_SEQMIS);
break;
}
@@ -255,6 +275,7 @@ ospf_dbdes_rx(struct ospf_dbdes_packet *ps, struct proto *p,
{
if(ps->ddseq!=(n->dds+1))
{
+ DBG("SEQMIS-SLAVE\n");
ospf_neigh_sm(n, INM_SEQMIS);
break;
}
diff --git a/proto/ospf/neighbor.c b/proto/ospf/neighbor.c
index f348586..20c2f3c 100644
--- a/proto/ospf/neighbor.c
+++ b/proto/ospf/neighbor.c
@@ -206,9 +206,7 @@ ospf_neigh_sm(struct ospf_neighbor *n, int event)
neigh_chstate(n,NEIGHBOR_EXCHANGE);
s_init_list(&(n->lsrql));
s_init_list(&(n->lsrtl));
- DBG("OK1\n");
s_init(&(n->dbsi), &(n->ifa->oa->lsal));
- DBG("OK2\n");
ospf_dbdes_tx(n);
}
break;
@@ -243,7 +241,7 @@ ospf_neigh_sm(struct ospf_neighbor *n, int event)
if(n->state>=NEIGHBOR_EXCHANGE)
{
neigh_chstate(n,NEIGHBOR_EXSTART);
- /* Go on....*/
+ /* FIXME: Go on....*/
}
break;
case INM_KILLNBR:
diff --git a/proto/ospf/topology.c b/proto/ospf/topology.c
index ae49228..fe236ba 100644
--- a/proto/ospf/topology.c
+++ b/proto/ospf/topology.c
@@ -174,6 +174,8 @@ addifa_rtlsa(struct ospf_iface *ifa)
if(oa==NULL) /* New area */
{
+ struct ospf_lsa_header *lsa;
+
oa=po->firstarea;
po->firstarea=mb_alloc(po->proto.pool, sizeof(struct ospf_area));
po->firstarea->next=oa;
@@ -183,9 +185,14 @@ addifa_rtlsa(struct ospf_iface *ifa)
s_init_list(&(oa->lsal));
oa->rt=ospf_hash_get(oa->gr, rtid, rtid, LSA_T_RT);
s_add_head(&(oa->lsal), (snode *)oa->rt);
+ ((snode *)oa->rt)->next=NULL;
+ lsa=&(oa->rt->lsa);
oa->rt->lsa_body=NULL;
- oa->rt->lsa.age=0;
- oa->rt->lsa.sn=LSA_INITSEQNO-1; /* FIXME Check it latter */
+ lsa->age=0;
+ lsa->sn=LSA_INITSEQNO-1; /* FIXME Check it latter */
+ lsa->checksum=0;
+ lsa->checksum=ipsum_calculate(lsa,sizeof(struct ospf_lsa_header),NULL);
+ ifa->oa=oa;
DBG("%s: New OSPF area \"%d\" added.\n", po->proto.name, ifa->an);
}