From ebd3720f8335cecd671382c23fe61f03b7e2acaa Mon Sep 17 00:00:00 2001 From: Martin Mares Date: Wed, 26 Apr 2000 12:30:41 +0000 Subject: Fixed several bugs in protocol state machine. Reconfigurations and restarts of BGP seem to work now. --- nest/proto.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) (limited to 'nest/proto.c') 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); -- cgit v1.2.3