]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Fixed several bugs in protocol state machine. Reconfigurations and
authorMartin Mares <mj@ucw.cz>
Wed, 26 Apr 2000 12:30:41 +0000 (12:30 +0000)
committerMartin Mares <mj@ucw.cz>
Wed, 26 Apr 2000 12:30:41 +0000 (12:30 +0000)
restarts of BGP seem to work now.

nest/proto.c

index da3f14c8fc5fe05151ff5c0c3955f3a79cc20c5d..f6eb32c6b0c4d0fb84abc1e585ec234d73b47e40 100644 (file)
@@ -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);