summaryrefslogtreecommitdiffstats
path: root/nest
diff options
context:
space:
mode:
authorMartin Mares <mj@ucw.cz>2000-04-26 14:30:41 +0200
committerMartin Mares <mj@ucw.cz>2000-04-26 14:30:41 +0200
commitebd3720f8335cecd671382c23fe61f03b7e2acaa (patch)
tree1d85f85ac50c6d9bdc9f5d76fde9a6de8aa49c5f /nest
parentc010f4cb3771536fc62e534549e22c725285bbd2 (diff)
downloadbird-ebd3720f8335cecd671382c23fe61f03b7e2acaa.tar
bird-ebd3720f8335cecd671382c23fe61f03b7e2acaa.zip
Fixed several bugs in protocol state machine. Reconfigurations and
restarts of BGP seem to work now.
Diffstat (limited to 'nest')
-rw-r--r--nest/proto.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/nest/proto.c b/nest/proto.c
index da3f14c..f6eb32c 100644
--- a/nest/proto.c
+++ b/nest/proto.c
@@ -288,12 +288,17 @@ proto_rethink_goal(struct proto *p)
/* Determine what state we want to reach */
if (p->disabled || p->reconfiguring)
- p->core_goal = FS_HUNGRY;
+ {
+ p->core_goal = FS_HUNGRY;
+ if (p->core_state == FS_HUNGRY && p->proto_state == PS_DOWN)
+ return;
+ }
else
- p->core_goal = FS_HAPPY;
-
- if (p->core_state == p->core_goal)
- return;
+ {
+ p->core_goal = FS_HAPPY;
+ if (p->core_state == FS_HAPPY && p->proto_state == PS_UP)
+ return;
+ }
q = p->proto;
if (p->core_goal == FS_HAPPY) /* Going up */
@@ -424,6 +429,7 @@ proto_notify_state(struct proto *p, unsigned ps)
case PS_DOWN:
if (cs == FS_HUNGRY) /* Shutdown finished */
{
+ p->proto_state = ps;
proto_fell_down(p);
return; /* The protocol might have ceased to exist */
}
@@ -445,7 +451,7 @@ proto_notify_state(struct proto *p, unsigned ps)
ev_schedule(p->attn);
break;
case PS_STOP:
- if (cs == FS_FEEDING || cs == FS_HAPPY)
+ if (ops != PS_DOWN)
{
schedule_flush:
DBG("%s: Scheduling flush\n", p->name);