Small bux fixes. A neigh_chstate added.
This commit is contained in:
parent
a7d388d23e
commit
032df28048
1 changed files with 26 additions and 34 deletions
|
@ -23,16 +23,28 @@
|
||||||
|
|
||||||
#include "ospf.h"
|
#include "ospf.h"
|
||||||
|
|
||||||
|
void
|
||||||
|
neigh_chstate(struct ospf_neighbor *n, int state)
|
||||||
|
{
|
||||||
|
struct ospf_iface *ifa;
|
||||||
|
struct proto *p;
|
||||||
|
|
||||||
|
ifa=n->ifa;
|
||||||
|
p=(struct proto *)(ifa->proto);
|
||||||
|
|
||||||
|
debug("%s: Neigbor '%u' changes state from %u to %u.\n", p->name, n->rid,
|
||||||
|
n->state, state);
|
||||||
|
n->state=state;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Try to build neighbor adjacency (if does not exists) */
|
/* Try to build neighbor adjacency (if does not exists) */
|
||||||
void
|
void
|
||||||
tryadj(struct ospf_neighbor *n, struct proto *p)
|
tryadj(struct ospf_neighbor *n, struct proto *p)
|
||||||
{
|
{
|
||||||
if(n->state==NEIGHBOR_INIT)
|
|
||||||
{
|
|
||||||
DBG("%s: Going to build adjacency.\n", p->name);
|
DBG("%s: Going to build adjacency.\n", p->name);
|
||||||
n->state=NEIGHBOR_EXSTART;
|
neigh_chstate(n,NEIGHBOR_EXSTART);
|
||||||
/* FIXME Go on */
|
/* FIXME Go on */
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Neighbor is inactive for a long time. Remove it. */
|
/* Neighbor is inactive for a long time. Remove it. */
|
||||||
|
@ -257,7 +269,7 @@ ospf_hello_rx(struct ospf_hello_packet *ps, struct proto *p,
|
||||||
|
|
||||||
if(n==NULL)
|
if(n==NULL)
|
||||||
{
|
{
|
||||||
log("%s: New neighbor found: %u.",p->name,nrid);
|
log("%s: New neighbor found: %u.", p->name,nrid);
|
||||||
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->inactim=tm_new(p->pool);
|
n->inactim=tm_new(p->pool);
|
||||||
|
@ -266,12 +278,13 @@ ospf_hello_rx(struct ospf_hello_packet *ps, struct proto *p,
|
||||||
n->inactim->hook=neighbor_timer_hook;
|
n->inactim->hook=neighbor_timer_hook;
|
||||||
n->inactim->recurrent=0;
|
n->inactim->recurrent=0;
|
||||||
DBG("%s: Installing inactivity timer.\n", p->name);
|
DBG("%s: Installing inactivity timer.\n", p->name);
|
||||||
n->state=NEIGHBOR_INIT;
|
|
||||||
n->rid=nrid;
|
n->rid=nrid;
|
||||||
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;
|
||||||
n->options=ps->options;
|
n->options=ps->options;
|
||||||
|
n->ifa=ifa;
|
||||||
|
neigh_chstate(n,NEIGHBOR_INIT);
|
||||||
}
|
}
|
||||||
tm_start(n->inactim,ifa->deadc*ifa->helloint);
|
tm_start(n->inactim,ifa->deadc*ifa->helloint);
|
||||||
|
|
||||||
|
@ -290,14 +303,14 @@ ospf_hello_rx(struct ospf_hello_packet *ps, struct proto *p,
|
||||||
|
|
||||||
if(twoway)
|
if(twoway)
|
||||||
{
|
{
|
||||||
if(n->state<NEIGHBOR_2WAY) n->state=NEIGHBOR_2WAY;
|
if(n->state<NEIGHBOR_2WAY) neigh_chstate(n,NEIGHBOR_2WAY);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if(n->state>=NEIGHBOR_2WAY)
|
if(n->state>=NEIGHBOR_2WAY)
|
||||||
{
|
{
|
||||||
/* FIXME Delete all learnt */
|
/* FIXME Delete all learnt */
|
||||||
n->state=NEIGHBOR_INIT;
|
neigh_chstate(n,NEIGHBOR_INIT);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -352,34 +365,13 @@ ospf_hello_rx(struct ospf_hello_packet *ps, struct proto *p,
|
||||||
DBG("\n");
|
DBG("\n");
|
||||||
break;
|
break;
|
||||||
case OSPF_IS_DROTHER:
|
case OSPF_IS_DROTHER:
|
||||||
if(twoway)
|
if(((n->rid==ifa->drid) || (n->rid==ifa->bdrid))
|
||||||
{
|
&& (n->state==NEIGHBOR_2WAY)) tryadj(n,p);
|
||||||
if((n->rid==n->dr) || (n->rid==n->bdr)) tryadj(n,p);
|
|
||||||
else n->state=NEIGHBOR_2WAY;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if(n->state==NEIGHBOR_2WAY) n->state=NEIGHBOR_INIT;
|
|
||||||
if(n->state>NEIGHBOR_2WAY)
|
|
||||||
{
|
|
||||||
/* FIXME Kill adjacency */;
|
|
||||||
n->state=NEIGHBOR_INIT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case OSPF_IS_PTP:
|
case OSPF_IS_PTP:
|
||||||
case OSPF_IS_BACKUP:
|
case OSPF_IS_BACKUP:
|
||||||
case OSPF_IS_DR:
|
case OSPF_IS_DR:
|
||||||
if(twoway) tryadj(n,p);
|
if(n->state==NEIGHBOR_2WAY) tryadj(n,p);
|
||||||
else
|
|
||||||
{
|
|
||||||
if(n->state==NEIGHBOR_2WAY) n->state=NEIGHBOR_INIT;
|
|
||||||
if(n->state>NEIGHBOR_2WAY)
|
|
||||||
{
|
|
||||||
/* FIXME Kill adjacency */;
|
|
||||||
n->state=NEIGHBOR_INIT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
die("%s: Iface %s in unknown state?",p->name, ifa->iface->name);
|
die("%s: Iface %s in unknown state?",p->name, ifa->iface->name);
|
||||||
|
|
Loading…
Reference in a new issue