* bgpd.[ch], bgp_vty.c, bgp_route.c: "Restart session after
	  maximum-prefix limit" feature support.

	[merge from GNU Zebra]
diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c
index 40a61b6..2e7f7b3 100644
--- a/bgpd/bgp_route.c
+++ b/bgpd/bgp_route.c
@@ -52,6 +52,7 @@
 #include "bgpd/bgp_damp.h"
 #include "bgpd/bgp_advertise.h"
 #include "bgpd/bgp_zebra.h"
+#include "bgpd/bgp_vty.h"
 
 /* Extern from bgp_dump.c */
 extern char *bgp_origin_str[];
@@ -1267,7 +1268,24 @@
     }
   return 0;
 }
-  
+
+int
+bgp_maximum_prefix_restart_timer (struct thread *thread)
+{
+  struct peer *peer;
+
+  peer = THREAD_ARG (thread);
+  peer->t_pmax_restart = NULL;
+
+  if (BGP_DEBUG (events, EVENTS))
+    zlog_debug ("%s Maximum-prefix restart timer expired, restore peering",
+		peer->host);
+
+  peer_clear (peer);
+
+  return 0;
+}
+
 int
 bgp_maximum_prefix_overflow (struct peer *peer, afi_t afi, 
                              safi_t safi, int always)
@@ -1282,8 +1300,9 @@
        return 0;
 
       zlog (peer->log, LOG_INFO,
-           "%%MAXPFXEXCEED: No. of prefix received from %s (afi %d): %ld exceed limit %ld",
-           peer->host, afi, peer->pcount[afi][safi], peer->pmax[afi][safi]);
+	    "%%MAXPFXEXCEED: No. of %s prefix received from %s %ld exceed, "
+	    "limit %ld", afi_safi_print (afi, safi), peer->host,
+	    peer->pcount[afi][safi], peer->pmax[afi][safi]);
       SET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_LIMIT);
 
       if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_WARNING))
@@ -1307,6 +1326,20 @@
        bgp_notify_send_with_data (peer, BGP_NOTIFY_CEASE,
                                   BGP_NOTIFY_CEASE_MAX_PREFIX, ndata, 7);
       }
+
+      /* restart timer start */
+      if (peer->pmax_restart[afi][safi])
+	{
+	  peer->v_pmax_restart = peer->pmax_restart[afi][safi] * 60;
+
+	  if (BGP_DEBUG (events, EVENTS))
+	    zlog_debug ("%s Maximum-prefix restart timer started for %d secs",
+			peer->host, peer->v_pmax_restart);
+
+	  BGP_TIMER_ON (peer->t_pmax_restart, bgp_maximum_prefix_restart_timer,
+			peer->v_pmax_restart);
+	}
+
       return 1;
     }
   else
@@ -1319,8 +1352,9 @@
        return 0;
 
       zlog (peer->log, LOG_INFO,
-           "%%MAXPFX: No. of prefix received from %s (afi %d) reaches %ld, max %ld",
-           peer->host, afi, peer->pcount[afi][safi], peer->pmax[afi][safi]);
+	    "%%MAXPFX: No. of %s prefix received from %s reaches %ld, max %ld",
+	    afi_safi_print (afi, safi), peer->host, peer->pcount[afi][safi],
+	    peer->pmax[afi][safi]);
       SET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_THRESHOLD);
     }
   else