* bgp_fsm.c, bgp_open.c, bgp_packet.c, bgp_route.[ch], bgp_vty.c,
	  bgpd.[ch]: Add BGP_INFO_STALE flag and end-of-rib support. "bgp
	  graceful-restart" commands added. Show numbers of individual
	  messages in "show ip bgp neighbor" command. Final pieces of graceful
	  restart.

	[merge from GNU Zebra]
diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c
index 1a50476..279c546 100644
--- a/bgpd/bgpd.c
+++ b/bgpd/bgpd.c
@@ -1040,6 +1040,34 @@
   return 0;
 }
 
+void
+peer_nsf_stop (struct peer *peer)
+{
+  afi_t afi;
+  safi_t safi;
+
+  UNSET_FLAG (peer->sflags, PEER_STATUS_NSF_WAIT);
+  UNSET_FLAG (peer->sflags, PEER_STATUS_NSF_MODE);
+
+  for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
+    for (safi = SAFI_UNICAST ; safi < SAFI_UNICAST_MULTICAST ; safi++)
+      peer->nsf[afi][safi] = 0;
+
+  if (peer->t_gr_restart)
+    {
+      BGP_TIMER_OFF (peer->t_gr_restart);
+      if (BGP_DEBUG (events, EVENTS))
+	zlog_debug ("%s graceful restart timer stopped", peer->host);
+    }
+  if (peer->t_gr_stale)
+    {
+      BGP_TIMER_OFF (peer->t_gr_stale);
+      if (BGP_DEBUG (events, EVENTS))
+	zlog_debug ("%s graceful restart stalepath timer stopped", peer->host);
+    }
+  bgp_clear_route_all (peer);
+}
+
 /* Delete peer from confguration. */
 int
 peer_delete (struct peer *peer)
@@ -1052,6 +1080,9 @@
 
   bgp = peer->bgp;
 
+  if (CHECK_FLAG (peer->sflags, PEER_STATUS_NSF_WAIT))
+    peer_nsf_stop (peer);
+
   /* If this peer belongs to peer group.  Clearn up the
      relationship.  */
   if (peer->group)
@@ -1075,6 +1106,8 @@
   BGP_TIMER_OFF (peer->t_asorig);
   BGP_TIMER_OFF (peer->t_routeadv);
   BGP_TIMER_OFF (peer->t_pmax_restart);
+  BGP_TIMER_OFF (peer->t_gr_restart);
+  BGP_TIMER_OFF (peer->t_gr_stale);
 
   /* Delete from all peer list. */
   if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
@@ -2148,6 +2181,9 @@
     {
       if (CHECK_FLAG (peer->flags, flag))
 	{
+	  if (CHECK_FLAG (peer->sflags, PEER_STATUS_NSF_WAIT))
+	    peer_nsf_stop (peer);
+
 	  UNSET_FLAG (peer->sflags, PEER_STATUS_PREFIX_OVERFLOW);
 	  if (peer->t_pmax_restart)
 	    {
@@ -2157,6 +2193,9 @@
 			    peer->host);
 	    }
 
+      if (CHECK_FLAG (peer->sflags, PEER_STATUS_NSF_WAIT))
+	peer_nsf_stop (peer);
+
 	  if (peer->status == Established)
 	    bgp_notify_send (peer, BGP_NOTIFY_CEASE,
 			     BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN);
@@ -4703,6 +4742,9 @@
 	vty_out (vty, " bgp deterministic-med%s", VTY_NEWLINE);
 
       /* BGP graceful-restart. */
+      if (bgp->stalepath_time != BGP_DEFAULT_STALEPATH_TIME)
+	vty_out (vty, " bgp graceful-restart stalepath-time %d%s",
+		 bgp->stalepath_time, VTY_NEWLINE);
       if (bgp_flag_check (bgp, BGP_FLAG_GRACEFUL_RESTART))
        vty_out (vty, " bgp graceful-restart%s", VTY_NEWLINE);