diff options
Diffstat (limited to 'proto')
-rw-r--r-- | proto/ospf/neighbor.c | 51 |
1 files changed, 26 insertions, 25 deletions
diff --git a/proto/ospf/neighbor.c b/proto/ospf/neighbor.c index db97823b..15279371 100644 --- a/proto/ospf/neighbor.c +++ b/proto/ospf/neighbor.c @@ -21,11 +21,15 @@ neigh_chstate(struct ospf_neighbor *n, u8 state) { struct ospf_iface *ifa; struct proto *p; + u8 oldstate; - if(n->state!=state) + oldstate=n->state; + + if(oldstate!=state) { ifa=n->ifa; - if(n->state==NEIGHBOR_FULL) + n->state=state; + if(oldstate==NEIGHBOR_FULL) /* Decrease number of adjacencies */ { ifa->fadj--; n->state=state; @@ -35,14 +39,31 @@ neigh_chstate(struct ospf_neighbor *n, u8 state) p=(struct proto *)(ifa->proto); debug("%s: Neighbor %I changes state from \"%s\" to \"%s\".\n", - p->name, n->ip, ospf_ns[n->state], ospf_ns[state]); - n->state=state; - if(state==NEIGHBOR_FULL) + p->name, n->ip, ospf_ns[oldstate], ospf_ns[state]); + if(state==NEIGHBOR_FULL) /* Increase number of adjacencies */ { ifa->fadj++; originate_rt_lsa(n->ifa->oa,n->ifa->oa->po); originate_net_lsa(ifa,ifa->oa->po); } + if(oldstate>=NEIGHBOR_EXSTART && state<NEIGHBOR_EXSTART) + { + tm_stop(n->rxmt_timer); + /* Stop RXMT timers */ + } + if(state==NEIGHBOR_EXSTART) + { + if(n->adj==0) /* First time adjacency */ + { + n->dds=random_u32(); + } + n->dds++; + n->myimms.byte=0; + n->myimms.bit.ms=1; + n->myimms.bit.m=1; + n->myimms.bit.i=1; + tm_start(n->rxmt_timer,1); /* Or some other number ? */ + } } } @@ -169,24 +190,6 @@ can_do_adj(struct ospf_neighbor *n) return i; } -/* Try to build neighbor adjacency (if does not exists) */ -void -tryadj(struct ospf_neighbor *n, struct proto *p) -{ - DBG("%s: Going to build adjacency.\n", p->name); - neigh_chstate(n,NEIGHBOR_EXSTART); - if(n->adj==0) /* First time adjacency */ - { - n->dds=random_u32(); - } - n->dds++; - n->myimms.byte=0; - n->myimms.bit.ms=1; - n->myimms.bit.m=1; - n->myimms.bit.i=1; - tm_start(n->rxmt_timer,1); /* Or some other number ? */ -} - void ospf_neigh_sm(struct ospf_neighbor *n, int event) /* Interface state machine */ @@ -222,7 +225,6 @@ ospf_neigh_sm(struct ospf_neighbor *n, int event) if(can_do_adj(n)) { neigh_chstate(n,NEIGHBOR_EXSTART); - tryadj(n,p); } ospf_int_sm(n->ifa, ISM_NEICH); } @@ -258,7 +260,6 @@ ospf_neigh_sm(struct ospf_neighbor *n, int event) if(can_do_adj(n)) { neigh_chstate(n,NEIGHBOR_EXSTART); - tryadj(n,p); } break; default: |