Sending DBDES packet in EXSTART done.
This commit is contained in:
parent
1183b6b229
commit
986e34131d
2 changed files with 103 additions and 44 deletions
|
@ -20,6 +20,79 @@
|
||||||
#define IAMMASTER(x) ((x) & DBDES_MS)
|
#define IAMMASTER(x) ((x) & DBDES_MS)
|
||||||
#define INISET(x) ((x) & DBDES_I)
|
#define INISET(x) ((x) & DBDES_I)
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
fill_ospf_pkt_hdr(struct ospf_iface *ifa, void *buf, u8 h_type)
|
||||||
|
{
|
||||||
|
struct ospf_packet *pkt;
|
||||||
|
struct proto *p;
|
||||||
|
|
||||||
|
p=(struct proto *)(ifa->proto);
|
||||||
|
|
||||||
|
pkt=(struct ospf_packet *)buf;
|
||||||
|
|
||||||
|
pkt->version=OSPF_VERSION;
|
||||||
|
|
||||||
|
pkt->type=h_type;
|
||||||
|
|
||||||
|
pkt->routerid=htonl(p->cf->global->router_id);
|
||||||
|
pkt->areaid=htonl(ifa->area);
|
||||||
|
pkt->autype=htons(ifa->autype);
|
||||||
|
pkt->checksum=0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ospf_tx_authenticate(struct ospf_iface *ifa, struct ospf_packet *pkt)
|
||||||
|
{
|
||||||
|
/* FIXME Nothing done */
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ospf_pkt_finalize(struct ospf_iface *ifa, struct ospf_packet *pkt)
|
||||||
|
{
|
||||||
|
ospf_tx_authenticate(ifa, pkt);
|
||||||
|
|
||||||
|
/* Count checksum */
|
||||||
|
pkt->checksum=ipsum_calculate(pkt,sizeof(struct ospf_packet)-8,
|
||||||
|
(pkt+1),ntohs(pkt->length)-sizeof(struct ospf_packet),NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ospf_dbdes_tx(struct ospf_iface *ifa)
|
||||||
|
{
|
||||||
|
struct ospf_dbdes_packet *pkt;
|
||||||
|
struct ospf_packet *op;
|
||||||
|
struct ospf_neighbor *n;
|
||||||
|
u16 length;
|
||||||
|
struct proto *p;
|
||||||
|
|
||||||
|
p=(struct proto *)(ifa->proto);
|
||||||
|
|
||||||
|
WALK_LIST (n, ifa->neigh_list) /* Try to send db_des */
|
||||||
|
{
|
||||||
|
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= ((struct iface *)ifa)->mtu;
|
||||||
|
pkt->options= ifa->options;
|
||||||
|
pkt->imms=n->myimms;
|
||||||
|
pkt->ddseq=n->dds;
|
||||||
|
length=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);
|
||||||
|
debug("%s: DB_DES sent for %u.\n", p->name, n->rid);
|
||||||
|
|
||||||
|
/*case NEIGHBOR_EXCHANGE: */
|
||||||
|
default: /* Ignore it */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
rxmt_timer_hook(timer *timer)
|
rxmt_timer_hook(timer *timer)
|
||||||
{
|
{
|
||||||
|
@ -30,6 +103,7 @@ rxmt_timer_hook(timer *timer)
|
||||||
p=(struct proto *)(ifa->proto);
|
p=(struct proto *)(ifa->proto);
|
||||||
debug("%s: RXMT timer fired on interface %s.\n",
|
debug("%s: RXMT timer fired on interface %s.\n",
|
||||||
p->name, ifa->iface->name);
|
p->name, ifa->iface->name);
|
||||||
|
ospf_dbdes_tx(ifa);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ospf_neighbor *
|
struct ospf_neighbor *
|
||||||
|
@ -560,8 +634,10 @@ ospf_dbdes_rx(struct ospf_dbdes_packet *ps, struct proto *p,
|
||||||
debug("%s: I'm slave to %u. \n", p->name, nrid);
|
debug("%s: I'm slave to %u. \n", p->name, nrid);
|
||||||
ospf_neigh_sm(n, INM_NEGDONE);
|
ospf_neigh_sm(n, INM_NEGDONE);
|
||||||
}
|
}
|
||||||
if(((ps->imms | DBDES_M)== DBDES_M) && (n->rid < myrid) &&
|
else
|
||||||
(n->dds == ps->ddseq) && (size == sizeof(struct ospf_dbdes_packet)))
|
{
|
||||||
|
if(((ps->imms & (DBDES_I|DBDES_MS))== 0) && (n->rid < myrid) &&
|
||||||
|
(n->dds == ps->ddseq))
|
||||||
{
|
{
|
||||||
/* I'm master! */
|
/* I'm master! */
|
||||||
n->options=ps->options;
|
n->options=ps->options;
|
||||||
|
@ -570,6 +646,12 @@ ospf_dbdes_rx(struct ospf_dbdes_packet *ps, struct proto *p,
|
||||||
debug("%s: I'm master to %u. \n", p->name, nrid);
|
debug("%s: I'm master to %u. \n", p->name, nrid);
|
||||||
ospf_neigh_sm(n, INM_NEGDONE);
|
ospf_neigh_sm(n, INM_NEGDONE);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
debug("%s: Nothing happend to %u (imms=%u)", p->name, nrid,
|
||||||
|
ps->imms);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case NEIGHBOR_EXCHANGE:
|
case NEIGHBOR_EXCHANGE:
|
||||||
|
@ -639,12 +721,15 @@ ospf_dbdes_rx(struct ospf_dbdes_packet *ps, struct proto *p,
|
||||||
ospf_neigh_sm(n, INM_SEQMIS);
|
ospf_neigh_sm(n, INM_SEQMIS);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
defaut:
|
||||||
|
die("%s: Received dbdes from %u in unknown state. (%u)\n", p->name, nrid);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
ospf_hello_rx(struct ospf_hello_packet *ps, struct proto *p,
|
ospf_hello_rx(struct ospf_hello_packet *ps, struct proto *p,
|
||||||
struct ospf_iface *ifa, int size)
|
struct ospf_iface *ifa, int size, ip_addr faddr)
|
||||||
{
|
{
|
||||||
char sip[100]; /* FIXME: Should be smaller */
|
char sip[100]; /* FIXME: Should be smaller */
|
||||||
u32 nrid, *pnrid;
|
u32 nrid, *pnrid;
|
||||||
|
@ -692,6 +777,7 @@ ospf_hello_rx(struct ospf_hello_packet *ps, struct proto *p,
|
||||||
n=mb_alloc(p->pool, sizeof(struct ospf_neighbor));
|
n=mb_alloc(p->pool, sizeof(struct ospf_neighbor));
|
||||||
add_tail(&ifa->neigh_list, NODE n);
|
add_tail(&ifa->neigh_list, NODE n);
|
||||||
n->rid=nrid;
|
n->rid=nrid;
|
||||||
|
n->ip=faddr;
|
||||||
n->dr=ntohl(ps->dr);
|
n->dr=ntohl(ps->dr);
|
||||||
n->bdr=ntohl(ps->bdr);
|
n->bdr=ntohl(ps->bdr);
|
||||||
n->priority=ps->priority;
|
n->priority=ps->priority;
|
||||||
|
@ -730,7 +816,6 @@ ospf_hello_rx(struct ospf_hello_packet *ps, struct proto *p,
|
||||||
(n->state>=NEIGHBOR_2WAY))
|
(n->state>=NEIGHBOR_2WAY))
|
||||||
{
|
{
|
||||||
ospf_int_sm(ifa, ISM_BACKS);
|
ospf_int_sm(ifa, ISM_BACKS);
|
||||||
DBG("BACKS");
|
|
||||||
}
|
}
|
||||||
if((n->rid==ntohl(ps->dr)) && (n->dr!=ntohl(ps->dr)))
|
if((n->rid==ntohl(ps->dr)) && (n->dr!=ntohl(ps->dr)))
|
||||||
{
|
{
|
||||||
|
@ -746,7 +831,6 @@ ospf_hello_rx(struct ospf_hello_packet *ps, struct proto *p,
|
||||||
if((n->rid==ntohl(ps->bdr)) && (n->state>=NEIGHBOR_2WAY))
|
if((n->rid==ntohl(ps->bdr)) && (n->state>=NEIGHBOR_2WAY))
|
||||||
{
|
{
|
||||||
ospf_int_sm(ifa, ISM_BACKS);
|
ospf_int_sm(ifa, ISM_BACKS);
|
||||||
DBG("BACKS");
|
|
||||||
}
|
}
|
||||||
if((n->rid==ntohl(ps->bdr)) && (n->bdr!=ntohl(ps->bdr)))
|
if((n->rid==ntohl(ps->bdr)) && (n->bdr!=ntohl(ps->bdr)))
|
||||||
{
|
{
|
||||||
|
@ -769,7 +853,7 @@ ospf_rx_hook(sock *sk, int size)
|
||||||
struct ospf_packet *ps;
|
struct ospf_packet *ps;
|
||||||
struct ospf_iface *ifa;
|
struct ospf_iface *ifa;
|
||||||
struct proto *p;
|
struct proto *p;
|
||||||
u8 i;
|
int i;
|
||||||
u8 *pu8;
|
u8 *pu8;
|
||||||
|
|
||||||
|
|
||||||
|
@ -849,7 +933,7 @@ ospf_rx_hook(sock *sk, int size)
|
||||||
{
|
{
|
||||||
case HELLO:
|
case HELLO:
|
||||||
DBG("%s: Hello received.\n", p->name);
|
DBG("%s: Hello received.\n", p->name);
|
||||||
ospf_hello_rx((struct ospf_hello_packet *)ps, p, ifa, size);
|
ospf_hello_rx((struct ospf_hello_packet *)ps, p, ifa, size, sk->faddr);
|
||||||
break;
|
break;
|
||||||
case DBDES:
|
case DBDES:
|
||||||
DBG("%s: Database description received.\n", p->name);
|
DBG("%s: Database description received.\n", p->name);
|
||||||
|
@ -1003,26 +1087,6 @@ ospf_iface_clasify(struct iface *ifa)
|
||||||
return OSPF_IT_PTP;
|
return OSPF_IT_PTP;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
fill_ospf_pkt_hdr(struct ospf_iface *ifa, void *buf, u8 h_type)
|
|
||||||
{
|
|
||||||
struct ospf_packet *pkt;
|
|
||||||
struct proto *p;
|
|
||||||
|
|
||||||
p=(struct proto *)(ifa->proto);
|
|
||||||
|
|
||||||
pkt=(struct ospf_packet *)buf;
|
|
||||||
|
|
||||||
pkt->version=OSPF_VERSION;
|
|
||||||
|
|
||||||
pkt->type=h_type;
|
|
||||||
|
|
||||||
pkt->routerid=htonl(p->cf->global->router_id);
|
|
||||||
pkt->areaid=htonl(ifa->area);
|
|
||||||
pkt->autype=htons(ifa->autype);
|
|
||||||
pkt->checksum=0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
hello_timer_hook(timer *timer)
|
hello_timer_hook(timer *timer)
|
||||||
{
|
{
|
||||||
|
@ -1068,14 +1132,9 @@ hello_timer_hook(timer *timer)
|
||||||
}
|
}
|
||||||
|
|
||||||
length=sizeof(struct ospf_hello_packet)+i*sizeof(u32);
|
length=sizeof(struct ospf_hello_packet)+i*sizeof(u32);
|
||||||
|
op->length=htons(length);
|
||||||
|
|
||||||
op->length=ntohs(length);
|
ospf_pkt_finalize(ifa, op);
|
||||||
|
|
||||||
/* FIXME Do authentification */
|
|
||||||
|
|
||||||
/* Count checksum */
|
|
||||||
op->checksum=ipsum_calculate(op,sizeof(struct ospf_packet)-8,
|
|
||||||
&(pkt->netmask),length-sizeof(struct ospf_packet),NULL);
|
|
||||||
|
|
||||||
/* And finally send it :-) */
|
/* And finally send it :-) */
|
||||||
sk_send(ifa->hello_sk,length);
|
sk_send(ifa->hello_sk,length);
|
||||||
|
|
|
@ -160,14 +160,14 @@ struct ospf_neighbor
|
||||||
#define NEIGHBOR_LOADING 6
|
#define NEIGHBOR_LOADING 6
|
||||||
#define NEIGHBOR_FULL 7
|
#define NEIGHBOR_FULL 7
|
||||||
timer *inactim; /* Inactivity timer */
|
timer *inactim; /* Inactivity timer */
|
||||||
u8 imms; /* I, M, Master/slave */
|
u8 imms; /* I, M, Master/slave received */
|
||||||
u32 dds; /* DD Sequence number being sent */
|
u32 dds; /* DD Sequence number being sent */
|
||||||
u32 ddr; /* last Dat Des packet received */
|
u32 ddr; /* last Dat Des packet received */
|
||||||
u8 myimms; /* I, M MS received */
|
u8 myimms; /* I, M Master/slave */
|
||||||
u8 myoptions; /* Options received */
|
|
||||||
u32 rid; /* Router ID */
|
u32 rid; /* Router ID */
|
||||||
|
ip_addr ip; /* IP of it's interface */
|
||||||
u8 priority; /* Priority */
|
u8 priority; /* Priority */
|
||||||
u8 options; /* Options */
|
u8 options; /* Options received */
|
||||||
u32 dr; /* Neigbour's idea of DR */
|
u32 dr; /* Neigbour's idea of DR */
|
||||||
u32 bdr; /* Neigbour's idea of BDR */
|
u32 bdr; /* Neigbour's idea of BDR */
|
||||||
u8 adj; /* built adjacency? */
|
u8 adj; /* built adjacency? */
|
||||||
|
|
Loading…
Reference in a new issue