[bgpd] Bug #302 fixes. ClearingCompleted event gets flushed, leaving peers stuck in Clearing.

2006-10-14 Paul Jakma <paul.jakma@sun.com>

	* bgp_fsm.h: Remove BGP_EVENT_FLUSH_ADD, dangerous and not
	  needed.
	* bgp_fsm.c: (bgp_stop) Move BGP_EVENT_FLUSH to the top of the
	  of the function, otherwise it could flush a ClearingCompleted
          event, bug #302.
	* bgp_packet.c: Replace all BGP_EVENT_FLUSH_ADD with
	  BGP_EVENT_ADD, fixing bug #302.
diff --git a/bgpd/ChangeLog b/bgpd/ChangeLog
index 2294f89..c33562d 100644
--- a/bgpd/ChangeLog
+++ b/bgpd/ChangeLog
@@ -1,3 +1,13 @@
+2006-10-14 Paul Jakma <paul.jakma@sun.com>
+
+	* bgp_fsm.h: Remove BGP_EVENT_FLUSH_ADD, dangerous and not
+	  needed.
+	* bgp_fsm.c: (bgp_stop) Move BGP_EVENT_FLUSH to the top of the
+	  of the function, otherwise it could flush a ClearingCompleted
+          event, bug #302.
+	* bgp_packet.c: Replace all BGP_EVENT_FLUSH_ADD with
+	  BGP_EVENT_ADD, fixing bug #302.
+
 2006-09-19 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
 
 	* bgpd.c: (peer_uptime) Fix printf format/arg mismatch in
diff --git a/bgpd/bgp_fsm.c b/bgpd/bgp_fsm.c
index cc2b2c3..ef8dfea 100644
--- a/bgpd/bgp_fsm.c
+++ b/bgpd/bgp_fsm.c
@@ -428,6 +428,9 @@
   safi_t safi;
   char orf_name[BUFSIZ];
 
+  /* Delete all existing events of the peer */
+  BGP_EVENT_FLUSH (peer);
+
   /* Increment Dropped count. */
   if (peer->status == Established)
     {
@@ -499,9 +502,6 @@
   BGP_TIMER_OFF (peer->t_asorig);
   BGP_TIMER_OFF (peer->t_routeadv);
 
-  /* Delete all existing events of the peer */
-  BGP_EVENT_FLUSH (peer);
-  
   /* Stream reset. */
   peer->packet_size = 0;
 
diff --git a/bgpd/bgp_fsm.h b/bgpd/bgp_fsm.h
index c51bed3..a749f8e 100644
--- a/bgpd/bgp_fsm.h
+++ b/bgpd/bgp_fsm.h
@@ -71,12 +71,6 @@
     thread_cancel_event (master, (P)); 		\
   } while (0)
 
-#define BGP_EVENT_FLUSH_ADD(P,E)	\
-  do {					\
-    BGP_EVENT_FLUSH(P);			\
-    BGP_EVENT_ADD(P,E);			\
-  } while (0)
-
 /* Prototypes. */
 extern int bgp_event (struct thread *);
 extern int bgp_stop (struct peer *peer);
diff --git a/bgpd/bgp_packet.c b/bgpd/bgp_packet.c
index da59d32..cf6d00f 100644
--- a/bgpd/bgp_packet.c
+++ b/bgpd/bgp_packet.c
@@ -637,7 +637,7 @@
 	  if (write_errno == EWOULDBLOCK || write_errno == EAGAIN)
 	      break;
 
-	  BGP_EVENT_FLUSH_ADD (peer, TCP_fatal_error);
+	  BGP_EVENT_ADD (peer, TCP_fatal_error);
 	  return 0;
 	}
       if (num != writenum)
@@ -672,7 +672,7 @@
 	    peer->v_start = (60 * 2);
 
 	  /* Flush any existing events */
-	  BGP_EVENT_FLUSH_ADD (peer, BGP_Stop);
+	  BGP_EVENT_ADD (peer, BGP_Stop);
 	  return 0;
 	case BGP_MSG_KEEPALIVE:
 	  peer->keepalive_out++;
@@ -717,7 +717,7 @@
   ret = writen (peer->fd, STREAM_DATA (s), stream_get_endp (s));
   if (ret <= 0)
     {
-      BGP_EVENT_FLUSH_ADD (peer, TCP_fatal_error);
+      BGP_EVENT_ADD (peer, TCP_fatal_error);
       return 0;
     }
 
@@ -737,7 +737,7 @@
   if (peer->v_start >= (60 * 2))
     peer->v_start = (60 * 2);
 
-  BGP_EVENT_FLUSH_ADD (peer, BGP_Stop);
+  BGP_EVENT_ADD (peer, BGP_Stop);
 
   return 0;
 }