[bgpd] Bug #302, bgpd can get stuck in state Clearing

2006-12-07 Paul Jakma <paul.jakma@sun.com>

	* bgp_fsm.c: Bug #302 fix, diagnosis, suggestions and testing
	  by Juergen Kammer <j.kammer@eurodata.de>. Fix follows from
	  his suggested fix, just made in a slightly different way.
	  (bgp_event) Transitions into Clearing always must call
	  bgp_clear_route_all().
	  (bgp_stop) No need to clear routes here, BGP FSM should do
	  it.
diff --git a/bgpd/ChangeLog b/bgpd/ChangeLog
index 7ad200a..97f78ca 100644
--- a/bgpd/ChangeLog
+++ b/bgpd/ChangeLog
@@ -1,3 +1,13 @@
+2006-12-07 Paul Jakma <paul.jakma@sun.com>
+
+	* bgp_fsm.c: Bug #302 fix, diagnosis, suggestions and testing
+	  by Juergen Kammer <j.kammer@eurodata.de>. Fix follows from
+	  his suggested fix, just made in a slightly different way.
+	  (bgp_event) Transitions into Clearing always must call
+	  bgp_clear_route_all().
+	  (bgp_stop) No need to clear routes here, BGP FSM should do
+	  it.
+ 
 2006-11-30 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
 
 	* bgp_debug.h: Declare new bgp_debug_zebra conf and term flags,
diff --git a/bgpd/bgp_fsm.c b/bgpd/bgp_fsm.c
index ef8dfea..d704c29 100644
--- a/bgpd/bgp_fsm.c
+++ b/bgpd/bgp_fsm.c
@@ -483,9 +483,6 @@
       /* Reset uptime. */
       bgp_uptime_reset (peer);
 
-      /* Need of clear of peer. */
-      bgp_clear_route_all (peer);
-
       /* Reset peer synctime */
       peer->synctime = 0;
     }
@@ -1092,8 +1089,14 @@
     {
       /* If status is changed. */
       if (next != peer->status)
-        bgp_fsm_change_status (peer, next);
-
+        {
+          /* Transition into Clearing must /always/ clear all routes.. */
+          if (next == Clearing)
+            bgp_clear_route_all (peer);
+          
+          bgp_fsm_change_status (peer, next);
+        }
+      
       /* Make sure timer is set. */
       bgp_timer_set (peer);
     }