diff options
author | Martin Mares <mj@ucw.cz> | 2000-04-26 14:30:41 +0200 |
---|---|---|
committer | Martin Mares <mj@ucw.cz> | 2000-04-26 14:30:41 +0200 |
commit | ebd3720f8335cecd671382c23fe61f03b7e2acaa (patch) | |
tree | 1d85f85ac50c6d9bdc9f5d76fde9a6de8aa49c5f | |
parent | c010f4cb3771536fc62e534549e22c725285bbd2 (diff) | |
download | bird-ebd3720f8335cecd671382c23fe61f03b7e2acaa.tar bird-ebd3720f8335cecd671382c23fe61f03b7e2acaa.zip |
Fixed several bugs in protocol state machine. Reconfigurations and
restarts of BGP seem to work now.
-rw-r--r-- | nest/proto.c | 18 |
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); |