Another bugfix in neighbor state machine.
This commit is contained in:
parent
279a3b76d1
commit
b29c620f90
3 changed files with 30 additions and 41 deletions
|
@ -52,7 +52,8 @@ ospf_hello_rx(struct ospf_hello_packet *ps, struct proto *p,
|
||||||
{
|
{
|
||||||
u32 nrid, *pnrid;
|
u32 nrid, *pnrid;
|
||||||
struct ospf_neighbor *neigh,*n;
|
struct ospf_neighbor *neigh,*n;
|
||||||
u8 i,twoway;
|
u8 i,twoway,oldpriority;
|
||||||
|
u32 olddr,oldbdr;
|
||||||
char *beg=": Bad OSPF hello packet from ", *rec=" received: ";
|
char *beg=": Bad OSPF hello packet from ", *rec=" received: ";
|
||||||
|
|
||||||
nrid=ntohl(((struct ospf_packet *)ps)->routerid);
|
nrid=ntohl(((struct ospf_packet *)ps)->routerid);
|
||||||
|
@ -136,42 +137,34 @@ ospf_hello_rx(struct ospf_hello_packet *ps, struct proto *p,
|
||||||
|
|
||||||
if(!twoway) ospf_neigh_sm(n, INM_1WAYREC);
|
if(!twoway) ospf_neigh_sm(n, INM_1WAYREC);
|
||||||
|
|
||||||
|
olddr = n->dr;
|
||||||
|
n->dr = ntohl(ps->dr);
|
||||||
|
oldbdr = n->bdr;
|
||||||
|
n->bdr = ntohl(ps->bdr);
|
||||||
|
oldpriority = n->priority;
|
||||||
|
n->priority = ps->priority;
|
||||||
|
|
||||||
/* Check priority change */
|
/* Check priority change */
|
||||||
if(n->priority!=(n->priority=ps->priority))
|
if(n->state>=NEIGHBOR_2WAY)
|
||||||
{
|
{
|
||||||
ospf_int_sm(ifa, ISM_NEICH);
|
if(n->priority!=oldpriority) ospf_int_sm(ifa, ISM_NEICH);
|
||||||
}
|
|
||||||
|
|
||||||
/* Check neighbor's designed router idea */
|
/* Router is declaring itself ad DR and there is no BDR */
|
||||||
if((n->rid!=ntohl(ps->dr)) && (ntohl(ps->bdr)==0) &&
|
if((n->rid==n->dr) && (n->bdr==0)) ospf_int_sm(ifa, ISM_BACKS);
|
||||||
(n->state>=NEIGHBOR_2WAY))
|
|
||||||
{
|
|
||||||
ospf_int_sm(ifa, ISM_BACKS);
|
|
||||||
}
|
|
||||||
if((n->rid==ntohl(ps->dr)) && (n->dr!=ntohl(ps->dr)))
|
|
||||||
{
|
|
||||||
ospf_int_sm(ifa, ISM_NEICH);
|
|
||||||
}
|
|
||||||
if((n->rid==n->dr) && (n->dr!=ntohl(ps->dr)))
|
|
||||||
{
|
|
||||||
ospf_int_sm(ifa, ISM_NEICH);
|
|
||||||
}
|
|
||||||
n->dr=ntohl(ps->dr); /* And update it */
|
|
||||||
|
|
||||||
/* Check neighbor's backup designed router idea */
|
/* Neighbor is declaring itself as BDR */
|
||||||
if((n->rid==ntohl(ps->bdr)) && (n->state>=NEIGHBOR_2WAY))
|
if(n->rid==n->bdr) ospf_int_sm(ifa, ISM_BACKS);
|
||||||
{
|
|
||||||
ospf_int_sm(ifa, ISM_BACKS);
|
/* Neighbor is newly declaring itself as DR or BDR */
|
||||||
}
|
if(((n->rid==n->dr) && (n->dr!=olddr)) || ((n->rid==n->bdr) &&
|
||||||
if((n->rid==ntohl(ps->bdr)) && (n->bdr!=ntohl(ps->bdr)))
|
(n->bdr!=oldbdr)))
|
||||||
{
|
ospf_int_sm(ifa, ISM_NEICH);
|
||||||
|
|
||||||
|
/* Neighbor is no more declaring itself as DR or BDR */
|
||||||
|
if(((n->rid==olddr) && (n->dr!=olddr)) || ((n->rid==olbddr) &&
|
||||||
|
(n->dr!=oldbdr)))
|
||||||
ospf_int_sm(ifa, ISM_NEICH);
|
ospf_int_sm(ifa, ISM_NEICH);
|
||||||
}
|
}
|
||||||
if((n->rid==n->bdr) && (n->bdr!=ntohl(ps->bdr)))
|
|
||||||
{
|
|
||||||
ospf_int_sm(ifa, ISM_NEICH);
|
|
||||||
}
|
|
||||||
n->bdr=ntohl(ps->bdr); /* And update it */
|
|
||||||
|
|
||||||
ospf_neigh_sm(n, INM_HELLOREC);
|
ospf_neigh_sm(n, INM_HELLOREC);
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,6 +29,8 @@ neigh_chstate(struct ospf_neighbor *n, u8 state)
|
||||||
{
|
{
|
||||||
ifa=n->ifa;
|
ifa=n->ifa;
|
||||||
n->state=state;
|
n->state=state;
|
||||||
|
if(state==2WAY && oldstate<2WAY) ospf_int_sm(n->ifa, ISM_NEICH);
|
||||||
|
if(state<2WAY && oldstate>=2WAY) ospf_int_sm(n->ifa, ISM_NEICH);
|
||||||
if(oldstate==NEIGHBOR_FULL) /* Decrease number of adjacencies */
|
if(oldstate==NEIGHBOR_FULL) /* Decrease number of adjacencies */
|
||||||
{
|
{
|
||||||
ifa->fadj--;
|
ifa->fadj--;
|
||||||
|
@ -227,7 +229,6 @@ ospf_neigh_sm(struct ospf_neighbor *n, int event)
|
||||||
{
|
{
|
||||||
neigh_chstate(n,NEIGHBOR_EXSTART);
|
neigh_chstate(n,NEIGHBOR_EXSTART);
|
||||||
}
|
}
|
||||||
ospf_int_sm(n->ifa, ISM_NEICH);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case INM_NEGDONE:
|
case INM_NEGDONE:
|
||||||
|
@ -283,14 +284,9 @@ ospf_neigh_sm(struct ospf_neighbor *n, int event)
|
||||||
case INM_LLDOWN:
|
case INM_LLDOWN:
|
||||||
case INM_INACTTIM:
|
case INM_INACTTIM:
|
||||||
neigh_chstate(n,NEIGHBOR_DOWN);
|
neigh_chstate(n,NEIGHBOR_DOWN);
|
||||||
ospf_int_sm(n->ifa, ISM_NEICH);
|
|
||||||
break;
|
break;
|
||||||
case INM_1WAYREC:
|
case INM_1WAYREC:
|
||||||
if(n->state>=NEIGHBOR_2WAY)
|
|
||||||
{
|
|
||||||
neigh_chstate(n,NEIGHBOR_INIT);
|
neigh_chstate(n,NEIGHBOR_INIT);
|
||||||
ospf_int_sm(n->ifa, ISM_NEICH);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
die("%s: INM - Unknown event?",p->name);
|
die("%s: INM - Unknown event?",p->name);
|
||||||
|
|
|
@ -284,11 +284,11 @@ originate_net_lsa(struct ospf_iface *ifa, struct proto_ospf *po)
|
||||||
struct top_hash_entry *en;
|
struct top_hash_entry *en;
|
||||||
void *body;
|
void *body;
|
||||||
|
|
||||||
DBG("%s: Originating Net lsa for iface \"%s\".\n", po->proto.name, ifa->iface->name);
|
|
||||||
DBG("%s: State is:\"%u\" Fadj=%u.\n", po->proto.name, ifa->state,ifa->fadj);
|
|
||||||
|
|
||||||
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);
|
||||||
|
|
||||||
if(ifa->fadj==0)
|
if(ifa->fadj==0)
|
||||||
{
|
{
|
||||||
if(ifa->nlsa==NULL) return;
|
if(ifa->nlsa==NULL) return;
|
||||||
|
|
Loading…
Reference in a new issue