]> git.proxmox.com Git - mirror_frr.git/commitdiff
Added json formating support to show-...-neighbors-... bgp commands.
authorMorgan Stewart <morgan@cumulusnetworks.com>
Wed, 12 Aug 2015 13:59:18 +0000 (06:59 -0700)
committerMorgan Stewart <morgan@cumulusnetworks.com>
Wed, 12 Aug 2015 20:24:02 +0000 (13:24 -0700)
Ticket: CM-6789
Reviewed By: CCR-3263
Testing Done: Manual Testing and smoke tests

Whenever some sort of output is encountered, added a json version with
proper logic as well.

17 files changed:
bgpd/bgp_bfd.c
bgpd/bgp_bfd.h
bgpd/bgp_damp.c
bgpd/bgp_damp.h
bgpd/bgp_fsm.c
bgpd/bgp_mplsvpn.c
bgpd/bgp_open.c
bgpd/bgp_open.h
bgpd/bgp_route.c
bgpd/bgp_route.h
bgpd/bgp_updgrp_adv.c
bgpd/bgp_vty.c
bgpd/bgp_zebra.c
bgpd/bgpd.c
bgpd/bgpd.h
lib/plist.c
lib/plist.h

index 87feebe8a6ebc46f8a0c4d49f5b9bab358121ec4..22b8adcdb65f0a436f7f338a4d5ce230877d7814 100644 (file)
@@ -33,6 +33,7 @@
 #include "zclient.h"
 #include "vty.h"
 #include "bfd.h"
 #include "zclient.h"
 #include "vty.h"
 #include "bfd.h"
+#include "lib/json.h"
 #include "bgpd/bgpd.h"
 #include "bgp_fsm.h"
 #include "bgpd/bgp_bfd.h"
 #include "bgpd/bgpd.h"
 #include "bgp_fsm.h"
 #include "bgpd/bgp_bfd.h"
@@ -383,22 +384,40 @@ bgp_bfd_peer_config_write(struct vty *vty, struct peer *peer, char *addr)
  * bgp_bfd_show_info - Show the peer BFD information.
  */
 void
  * bgp_bfd_show_info - Show the peer BFD information.
  */
 void
-bgp_bfd_show_info(struct vty *vty, struct peer *peer)
+bgp_bfd_show_info(struct vty *vty, struct peer *peer, u_char use_json, json_object *json_neigh)
 {
   struct bfd_info *bfd_info;
 {
   struct bfd_info *bfd_info;
+  json_object *json_bfd = NULL;
 
   if (!peer->bfd_info)
     return;
 
 
   if (!peer->bfd_info)
     return;
 
+  if (use_json)
+    json_bfd = json_object_new_object();
+
   bfd_info = (struct bfd_info *)peer->bfd_info;
 
   bfd_info = (struct bfd_info *)peer->bfd_info;
 
-  vty_out (vty, "  BFD: Multi-hop: %s%s",
-       (bgp_bfd_is_peer_multihop(peer)) ? "yes" : "no", VTY_NEWLINE);
-  vty_out (vty, "    Detect Mul: %d, Min Rx interval: %d,"
-                " Min Tx interval: %d%s",
-                    bfd_info->detect_mult, bfd_info->required_min_rx,
-                    bfd_info->desired_min_tx, VTY_NEWLINE);
-  vty_out (vty, "%s", VTY_NEWLINE);
+  if (use_json)
+    {
+      if (bgp_bfd_is_peer_multihop(peer))
+        json_object_string_add(json_bfd, "bfdMultiHop", "yes");
+      else
+        json_object_string_add(json_bfd, "bfdMultiHop", "no");
+      json_object_int_add(json_bfd, "detectMultiplier", bfd_info->detect_mult);
+      json_object_int_add(json_bfd, "rxMinInterval", bfd_info->required_min_rx);
+      json_object_int_add(json_bfd, "txMinInterval", bfd_info->desired_min_tx);
+      json_object_object_add(json_neigh, "peerBfdInfo", json_bfd);
+    }
+  else
+    {
+      vty_out (vty, "  BFD: Multi-hop: %s%s",
+               (bgp_bfd_is_peer_multihop(peer)) ? "yes" : "no", VTY_NEWLINE);
+      vty_out (vty, "    Detect Mul: %d, Min Rx interval: %d,"
+               " Min Tx interval: %d%s",
+               bfd_info->detect_mult, bfd_info->required_min_rx,
+               bfd_info->desired_min_tx, VTY_NEWLINE);
+      vty_out (vty, "%s", VTY_NEWLINE);
+    }
 }
 
 DEFUN (neighbor_bfd,
 }
 
 DEFUN (neighbor_bfd,
index 97ad093eeea8a154f0d5e4768c9255f3b5e9c6d3..4e554af6968fbae80ea7a2712910e0f7e1002a35 100644 (file)
@@ -40,6 +40,6 @@ extern void
 bgp_bfd_peer_config_write(struct vty *vty, struct peer *peer, char *addr);
 
 extern void
 bgp_bfd_peer_config_write(struct vty *vty, struct peer *peer, char *addr);
 
 extern void
-bgp_bfd_show_info(struct vty *vty, struct peer *peer);
+bgp_bfd_show_info(struct vty *vty, struct peer *peer, u_char use_json, json_object *json_neigh);
 
 #endif /* _QUAGGA_BGP_BFD_H */
 
 #endif /* _QUAGGA_BGP_BFD_H */
index 408350ae60861b9628acb8707da081976f0a108f..21df08657a7da034e215d4db4f7581ed45bcde0c 100644 (file)
@@ -543,10 +543,11 @@ bgp_config_write_damp (struct vty *vty)
 }
 
 static const char *
 }
 
 static const char *
-bgp_get_reuse_time (unsigned int penalty, char *buf, size_t len)
+bgp_get_reuse_time (unsigned int penalty, char *buf, size_t len, u_char use_json, json_object *json)
 {
   time_t reuse_time = 0;
   struct tm *tm = NULL;
 {
   time_t reuse_time = 0;
   struct tm *tm = NULL;
+  int time_store = 0;
 
   if (penalty > damp->reuse_limit)
     {
 
   if (penalty > damp->reuse_limit)
     {
@@ -564,16 +565,45 @@ bgp_get_reuse_time (unsigned int penalty, char *buf, size_t len)
 #define ONE_DAY_SECOND 60*60*24
 #define ONE_WEEK_SECOND 60*60*24*7
   if (reuse_time == 0)
 #define ONE_DAY_SECOND 60*60*24
 #define ONE_WEEK_SECOND 60*60*24*7
   if (reuse_time == 0)
-    snprintf (buf, len, "00:00:00");
+    {
+      if (use_json)
+        json_object_int_add(json, "reuseTimerMsecs", 0);
+      else
+        snprintf (buf, len, "00:00:00");
+    }
   else if (reuse_time < ONE_DAY_SECOND)
   else if (reuse_time < ONE_DAY_SECOND)
-    snprintf (buf, len, "%02d:%02d:%02d", 
-              tm->tm_hour, tm->tm_min, tm->tm_sec);
+    {
+      if (use_json)
+        {
+          time_store = (3600000 * tm->tm_hour) + (60000 * tm->tm_min) + (1000 * tm->tm_sec);
+          json_object_int_add(json, "reuseTimerMsecs", time_store);
+        }
+      else
+        snprintf (buf, len, "%02d:%02d:%02d",
+                tm->tm_hour, tm->tm_min, tm->tm_sec);
+    }
   else if (reuse_time < ONE_WEEK_SECOND)
   else if (reuse_time < ONE_WEEK_SECOND)
-    snprintf (buf, len, "%dd%02dh%02dm", 
-              tm->tm_yday, tm->tm_hour, tm->tm_min);
+    {
+      if (use_json)
+        {
+          time_store = (86400000 * tm->tm_yday) + (3600000 * tm->tm_hour) + (60000 * tm->tm_min) + (1000 * tm->tm_sec);
+          json_object_int_add(json, "reuseTimerMsecs", time_store);
+        }
+      else
+        snprintf (buf, len, "%dd%02dh%02dm",
+                tm->tm_yday, tm->tm_hour, tm->tm_min);
+    }
   else
   else
-    snprintf (buf, len, "%02dw%dd%02dh", 
-              tm->tm_yday/7, tm->tm_yday - ((tm->tm_yday/7) * 7), tm->tm_hour); 
+    {
+      if (use_json)
+        {
+          time_store = (604800000 * tm->tm_yday/7) + (86400000 * (tm->tm_yday - ((tm->tm_yday/7) * 7))) + (3600000 * tm->tm_hour) + (60000 * tm->tm_min) + (1000 * tm->tm_sec);
+          json_object_int_add(json, "reuseTimerMsecs", time_store);
+        }
+      else
+        snprintf (buf, len, "%02dw%dd%02dh",
+                tm->tm_yday/7, tm->tm_yday - ((tm->tm_yday/7) * 7), tm->tm_hour);
+    }
 
   return buf;
 }
 
   return buf;
 }
@@ -607,26 +637,22 @@ bgp_damp_info_vty (struct vty *vty, struct bgp_info *binfo,
     {
       json_object_int_add(json_path, "dampeningPenalty", penalty);
       json_object_int_add(json_path, "dampeningFlapCount", bdi->flap);
     {
       json_object_int_add(json_path, "dampeningPenalty", penalty);
       json_object_int_add(json_path, "dampeningFlapCount", bdi->flap);
-      json_object_string_add(json_path, "dampeningFlapPeriod",
-                              peer_uptime (bdi->start_time, timebuf, BGP_UPTIME_LEN));
+      peer_uptime (bdi->start_time, timebuf, BGP_UPTIME_LEN, 1, json_path);
 
       if (CHECK_FLAG (binfo->flags, BGP_INFO_DAMPED)
           && ! CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
 
       if (CHECK_FLAG (binfo->flags, BGP_INFO_DAMPED)
           && ! CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
-        {
-          json_object_string_add(json_path, "dampeningReuseIn",
-                                 bgp_get_reuse_time (penalty, timebuf, BGP_UPTIME_LEN));
-        }
+        bgp_get_reuse_time (penalty, timebuf, BGP_UPTIME_LEN, 1, json_path);
     }
   else
     {
       vty_out (vty, "      Dampinfo: penalty %d, flapped %d times in %s",
                penalty, bdi->flap,
     }
   else
     {
       vty_out (vty, "      Dampinfo: penalty %d, flapped %d times in %s",
                penalty, bdi->flap,
-              peer_uptime (bdi->start_time, timebuf, BGP_UPTIME_LEN));
+              peer_uptime (bdi->start_time, timebuf, BGP_UPTIME_LEN, 0, json_path));
 
       if (CHECK_FLAG (binfo->flags, BGP_INFO_DAMPED)
           && ! CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
         vty_out (vty, ", reuse in %s",
 
       if (CHECK_FLAG (binfo->flags, BGP_INFO_DAMPED)
           && ! CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
         vty_out (vty, ", reuse in %s",
-              bgp_get_reuse_time (penalty, timebuf, BGP_UPTIME_LEN));
+              bgp_get_reuse_time (penalty, timebuf, BGP_UPTIME_LEN, 0, json_path));
 
       vty_out (vty, "%s", VTY_NEWLINE);
     }
 
       vty_out (vty, "%s", VTY_NEWLINE);
     }
@@ -634,7 +660,7 @@ bgp_damp_info_vty (struct vty *vty, struct bgp_info *binfo,
 
 const char *
 bgp_damp_reuse_time_vty (struct vty *vty, struct bgp_info *binfo,
 
 const char *
 bgp_damp_reuse_time_vty (struct vty *vty, struct bgp_info *binfo,
-                         char *timebuf, size_t len)
+                         char *timebuf, size_t len, u_char use_json, json_object *json)
 {
   struct bgp_damp_info *bdi;
   time_t t_now, t_diff;
 {
   struct bgp_damp_info *bdi;
   time_t t_now, t_diff;
@@ -656,5 +682,5 @@ bgp_damp_reuse_time_vty (struct vty *vty, struct bgp_info *binfo,
   t_diff = t_now - bdi->t_updated;
   penalty = bgp_damp_decay (t_diff, bdi->penalty);
 
   t_diff = t_now - bdi->t_updated;
   penalty = bgp_damp_decay (t_diff, bdi->penalty);
 
-  return  bgp_get_reuse_time (penalty, timebuf, len);
+  return  bgp_get_reuse_time (penalty, timebuf, len, use_json, json);
 }
 }
index 31c6c307ad0cd1cc81a330d5fd4baa94e0ed197b..6853696378163a87a5f38d754e6d393e9faf2e11 100644 (file)
@@ -21,8 +21,6 @@ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 #ifndef _QUAGGA_BGP_DAMP_H
 #define _QUAGGA_BGP_DAMP_H
 
 #ifndef _QUAGGA_BGP_DAMP_H
 #define _QUAGGA_BGP_DAMP_H
 
-#include "lib/json.h"
-
 /* Structure maintained on a per-route basis. */
 struct bgp_damp_info
 {
 /* Structure maintained on a per-route basis. */
 struct bgp_damp_info
 {
@@ -144,6 +142,6 @@ extern int bgp_damp_decay (time_t, int);
 extern void bgp_config_write_damp (struct vty *);
 extern void bgp_damp_info_vty (struct vty *, struct bgp_info *, json_object *json_path);
 extern const char * bgp_damp_reuse_time_vty (struct vty *, struct bgp_info *,
 extern void bgp_config_write_damp (struct vty *);
 extern void bgp_damp_info_vty (struct vty *, struct bgp_info *, json_object *json_path);
 extern const char * bgp_damp_reuse_time_vty (struct vty *, struct bgp_info *,
-                                             char *, size_t);
+                                             char *, size_t, u_char, json_object *);
 
 #endif /* _QUAGGA_BGP_DAMP_H */
 
 #endif /* _QUAGGA_BGP_DAMP_H */
index ec9427bb497ad07b8f3115d1027525ba2f7fd4b3..b1874315972938befe0f1b0ac7f54b9d48a4f8e3 100644 (file)
@@ -33,6 +33,7 @@ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 #include "workqueue.h"
 #include "queue.h"
 
 #include "workqueue.h"
 #include "queue.h"
 
+#include "lib/json.h"
 #include "bgpd/bgpd.h"
 #include "bgpd/bgp_attr.h"
 #include "bgpd/bgp_debug.h"
 #include "bgpd/bgpd.h"
 #include "bgpd/bgp_attr.h"
 #include "bgpd/bgp_debug.h"
index 9a1d90335081a500d86f5eab3a4b057c6fe1c31b..09f137fe4c6bf5e4508878d9ae8b5e906a1df089 100644 (file)
@@ -27,6 +27,7 @@ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 #include "stream.h"
 #include "queue.h"
 
 #include "stream.h"
 #include "queue.h"
 
+#include "lib/json.h"
 #include "bgpd/bgpd.h"
 #include "bgpd/bgp_table.h"
 #include "bgpd/bgp_route.h"
 #include "bgpd/bgpd.h"
 #include "bgpd/bgp_table.h"
 #include "bgpd/bgp_route.h"
@@ -331,7 +332,7 @@ DEFUN (no_vpnv4_network,
 }
 
 static int
 }
 
 static int
-show_adj_route_vpn (struct vty *vty, struct peer *peer, struct prefix_rd *prd)
+show_adj_route_vpn (struct vty *vty, struct peer *peer, struct prefix_rd *prd, u_char use_json)
 {
   struct bgp *bgp;
   struct bgp_table *table;
 {
   struct bgp *bgp;
   struct bgp_table *table;
@@ -341,14 +342,39 @@ show_adj_route_vpn (struct vty *vty, struct peer *peer, struct prefix_rd *prd)
   int rd_header;
   int header = 1;
   char v4_header[] = "   Network          Next Hop            Metric LocPrf Weight Path%s";
   int rd_header;
   int header = 1;
   char v4_header[] = "   Network          Next Hop            Metric LocPrf Weight Path%s";
+  json_object *json = NULL;
+  json_object *json_scode = NULL;
+  json_object *json_ocode = NULL;
+  json_object *json_routes = NULL;
+  json_object *json_array = NULL;
 
   bgp = bgp_get_default ();
   if (bgp == NULL)
     {
 
   bgp = bgp_get_default ();
   if (bgp == NULL)
     {
-      vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
+      if (!use_json)
+        vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
       return CMD_WARNING;
     }
 
       return CMD_WARNING;
     }
 
+  if (use_json)
+    {
+      json_scode = json_object_new_object();
+      json_ocode = json_object_new_object();
+      json_routes = json_object_new_object();
+      json = json_object_new_object();
+
+      json_object_string_add(json_scode, "suppressed", "s");
+      json_object_string_add(json_scode, "damped", "d");
+      json_object_string_add(json_scode, "history", "h");
+      json_object_string_add(json_scode, "valid", "*");
+      json_object_string_add(json_scode, "best", ">");
+      json_object_string_add(json_scode, "internal", "i");
+
+      json_object_string_add(json_ocode, "igp", "i");
+      json_object_string_add(json_ocode, "egp", "e");
+      json_object_string_add(json_ocode, "incomplete", "?");
+    }
+
   for (rn = bgp_table_top (bgp->rib[AFI_IP][SAFI_MPLS_VPN]); rn;
        rn = bgp_route_next (rn))
     {
   for (rn = bgp_table_top (bgp->rib[AFI_IP][SAFI_MPLS_VPN]); rn;
        rn = bgp_route_next (rn))
     {
@@ -357,54 +383,98 @@ show_adj_route_vpn (struct vty *vty, struct peer *peer, struct prefix_rd *prd)
 
       if ((table = rn->info) != NULL)
         {
 
       if ((table = rn->info) != NULL)
         {
+          if (use_json)
+            json_array = json_object_new_array();
+          else
+            json_array = NULL;
+
           rd_header = 1;
 
           for (rm = bgp_table_top (table); rm; rm = bgp_route_next (rm))
           rd_header = 1;
 
           for (rm = bgp_table_top (table); rm; rm = bgp_route_next (rm))
-            if ((attr = rm->info) != NULL)
-              {
-                if (header)
-                  {
-                    vty_out (vty, "BGP table version is 0, local router ID is %s%s",
-                             inet_ntoa (bgp->router_id), VTY_NEWLINE);
-                    vty_out (vty, "Status codes: s suppressed, d damped, h history, * valid, > best, i - internal%s",
-                             VTY_NEWLINE);
-                    vty_out (vty, "Origin codes: i - IGP, e - EGP, ? - incomplete%s%s",
-                             VTY_NEWLINE, VTY_NEWLINE);
-                    vty_out (vty, v4_header, VTY_NEWLINE);
-                    header = 0;
-                  }
-
-                if (rd_header)
-                  {
-                    u_int16_t type;
-                    struct rd_as rd_as;
-                    struct rd_ip rd_ip;
-                    u_char *pnt;
-
-                    pnt = rn->p.u.val;
-
-                    /* Decode RD type. */
-                    type = decode_rd_type (pnt);
-                    /* Decode RD value. */
-                    if (type == RD_TYPE_AS)
-                      decode_rd_as (pnt + 2, &rd_as);
-                    else if (type == RD_TYPE_IP)
-                      decode_rd_ip (pnt + 2, &rd_ip);
-
-                    vty_out (vty, "Route Distinguisher: ");
-
-                    if (type == RD_TYPE_AS)
-                      vty_out (vty, "%u:%d", rd_as.as, rd_as.val);
-                    else if (type == RD_TYPE_IP)
-                      vty_out (vty, "%s:%d", inet_ntoa (rd_ip.ip), rd_ip.val);
-
-                    vty_out (vty, "%s", VTY_NEWLINE);
-                    rd_header = 0;
-                  }
-                route_vty_out_tmp (vty, &rm->p, attr, SAFI_MPLS_VPN);
-              }
+            {
+              if ((attr = rm->info) != NULL)
+                {
+                  if (header)
+                    {
+                      if (use_json)
+                        {
+                          json_object_int_add(json, "bgpTableVersion", 0);
+                          json_object_string_add(json, "bgpLocalRouterId", inet_ntoa (bgp->router_id));
+                          json_object_object_add(json, "bgpStatusCodes", json_scode);
+                          json_object_object_add(json, "bgpOriginCodes", json_ocode);
+                        }
+                      else
+                        {
+                          vty_out (vty, "BGP table version is 0, local router ID is %s%s",
+                                   inet_ntoa (bgp->router_id), VTY_NEWLINE);
+                          vty_out (vty, "Status codes: s suppressed, d damped, h history, * valid, > best, i - internal%s",
+                                   VTY_NEWLINE);
+                          vty_out (vty, "Origin codes: i - IGP, e - EGP, ? - incomplete%s%s",
+                                   VTY_NEWLINE, VTY_NEWLINE);
+                          vty_out (vty, v4_header, VTY_NEWLINE);
+                        }
+                      header = 0;
+                    }
+
+                  if (rd_header)
+                    {
+                      u_int16_t type;
+                      struct rd_as rd_as;
+                      struct rd_ip rd_ip;
+                      u_char *pnt;
+
+                      pnt = rn->p.u.val;
+
+                      /* Decode RD type. */
+                      type = decode_rd_type (pnt);
+                      /* Decode RD value. */
+                      if (type == RD_TYPE_AS)
+                        decode_rd_as (pnt + 2, &rd_as);
+                      else if (type == RD_TYPE_IP)
+                        decode_rd_ip (pnt + 2, &rd_ip);
+
+                      if (use_json)
+                        {
+                          char buffer[BUFSIZ];
+                          if (type == RD_TYPE_AS)
+                            sprintf (buffer, "%u:%d", rd_as.as, rd_as.val);
+                          else if (type == RD_TYPE_IP)
+                            sprintf (buffer, "%u:%d", rd_as.as, rd_as.val);
+                          json_object_string_add(json_routes, "routeDistinguisher", buffer);
+                        }
+                      else
+                        {
+                          vty_out (vty, "Route Distinguisher: ");
+
+                          if (type == RD_TYPE_AS)
+                            vty_out (vty, "%u:%d", rd_as.as, rd_as.val);
+                          else if (type == RD_TYPE_IP)
+                            vty_out (vty, "%s:%d", inet_ntoa (rd_ip.ip), rd_ip.val);
+
+                          vty_out (vty, "%s", VTY_NEWLINE);
+                        }
+                      rd_header = 0;
+                    }
+                  route_vty_out_tmp (vty, &rm->p, attr, SAFI_MPLS_VPN, use_json, json_array);
+                }
+            }
+          if (use_json)
+            {
+              struct prefix *p;
+              char buf_a[BUFSIZ];
+              char buf_b[BUFSIZ];
+              p = &rm->p;
+              sprintf(buf_a, "%s/%d", inet_ntop (p->family, &p->u.prefix, buf_b, BUFSIZ), p->prefixlen);
+              json_object_object_add(json_routes, buf_a, json_array);
+            }
         }
     }
         }
     }
+  if (use_json)
+    {
+      json_object_object_add(json, "routes", json_routes);
+      vty_out (vty, "%s%s", json_object_to_json_string(json), VTY_NEWLINE);
+      json_object_free(json);
+    }
   return CMD_SUCCESS;
 }
 
   return CMD_SUCCESS;
 }
 
@@ -426,7 +496,7 @@ enum bgp_show_type
 
 static int
 bgp_show_mpls_vpn (struct vty *vty, struct prefix_rd *prd, enum bgp_show_type type,
 
 static int
 bgp_show_mpls_vpn (struct vty *vty, struct prefix_rd *prd, enum bgp_show_type type,
-                  void *output_arg, int tags)
+                  void *output_arg, int tags, u_char use_json)
 {
   struct bgp *bgp;
   struct bgp_table *table;
 {
   struct bgp *bgp;
   struct bgp_table *table;
@@ -437,15 +507,42 @@ bgp_show_mpls_vpn (struct vty *vty, struct prefix_rd *prd, enum bgp_show_type ty
   int header = 1;
   char v4_header[] = "   Network          Next Hop            Metric LocPrf Weight Path%s";
   char v4_header_tag[] = "   Network          Next Hop      In tag/Out tag%s";
   int header = 1;
   char v4_header[] = "   Network          Next Hop            Metric LocPrf Weight Path%s";
   char v4_header_tag[] = "   Network          Next Hop      In tag/Out tag%s";
+  json_object *json = NULL;
+  json_object *json_mroute = NULL;
+  json_object *json_nroute = NULL;
+  json_object *json_array = NULL;
+  json_object *json_scode = NULL;
+  json_object *json_ocode = NULL;
 
   bgp = bgp_get_default ();
   if (bgp == NULL)
     {
 
   bgp = bgp_get_default ();
   if (bgp == NULL)
     {
-      vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
+      if (!use_json)
+        vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
       return CMD_WARNING;
     }
       return CMD_WARNING;
     }
-  
-  for (rn = bgp_table_top (bgp->rib[AFI_IP][SAFI_MPLS_VPN]); rn; rn = bgp_route_next (rn))
+
+  if (use_json)
+    {
+      json_scode = json_object_new_object();
+      json_ocode = json_object_new_object();
+      json = json_object_new_object();
+      json_mroute = json_object_new_object();
+      json_nroute = json_object_new_object();
+
+      json_object_string_add(json_scode, "suppressed", "s");
+      json_object_string_add(json_scode, "damped", "d");
+      json_object_string_add(json_scode, "history", "h");
+      json_object_string_add(json_scode, "valid", "*");
+      json_object_string_add(json_scode, "best", ">");
+      json_object_string_add(json_scode, "internal", "i");
+
+      json_object_string_add(json_ocode, "igp", "i");
+      json_object_string_add(json_ocode, "egp", "e");
+      json_object_string_add(json_ocode, "incomplete", "?");
+    }
+
+ for (rn = bgp_table_top (bgp->rib[AFI_IP][SAFI_MPLS_VPN]); rn; rn = bgp_route_next (rn))
     {
       if (prd && memcmp (rn->p.u.val, prd->val, 8) != 0)
        continue;
     {
       if (prd && memcmp (rn->p.u.val, prd->val, 8) != 0)
        continue;
@@ -455,66 +552,124 @@ bgp_show_mpls_vpn (struct vty *vty, struct prefix_rd *prd, enum bgp_show_type ty
          rd_header = 1;
 
          for (rm = bgp_table_top (table); rm; rm = bgp_route_next (rm))
          rd_header = 1;
 
          for (rm = bgp_table_top (table); rm; rm = bgp_route_next (rm))
-           for (ri = rm->info; ri; ri = ri->next)
-             {
-               if (type == bgp_show_type_neighbor)
-                 {
-                   union sockunion *su = output_arg;
-
-                   if (ri->peer->su_remote == NULL || ! sockunion_same(ri->peer->su_remote, su))
-                     continue;
-                 }
-               if (header)
-                 {
-                   if (tags)
-                     vty_out (vty, v4_header_tag, VTY_NEWLINE);
-                   else
-                     {
-                       vty_out (vty, "BGP table version is 0, local router ID is %s%s",
-                                inet_ntoa (bgp->router_id), VTY_NEWLINE);
-                       vty_out (vty, "Status codes: s suppressed, d damped, h history, * valid, > best, i - internal%s",
-                                VTY_NEWLINE);
-                       vty_out (vty, "Origin codes: i - IGP, e - EGP, ? - incomplete%s%s",
-                                VTY_NEWLINE, VTY_NEWLINE);
-                       vty_out (vty, v4_header, VTY_NEWLINE);
-                     }
-                   header = 0;
-                 }
-
-               if (rd_header)
-                 {
-                   u_int16_t type;
-                   struct rd_as rd_as;
-                   struct rd_ip rd_ip;
-                   u_char *pnt;
-
-                   pnt = rn->p.u.val;
-
-                   /* Decode RD type. */
-                   type = decode_rd_type (pnt);
-                   /* Decode RD value. */
-                   if (type == RD_TYPE_AS)
-                     decode_rd_as (pnt + 2, &rd_as);
-                   else if (type == RD_TYPE_IP)
-                     decode_rd_ip (pnt + 2, &rd_ip);
-
-                   vty_out (vty, "Route Distinguisher: ");
-
-                   if (type == RD_TYPE_AS)
-                     vty_out (vty, "%u:%d", rd_as.as, rd_as.val);
-                   else if (type == RD_TYPE_IP)
-                     vty_out (vty, "%s:%d", inet_ntoa (rd_ip.ip), rd_ip.val);
-                 
-                   vty_out (vty, "%s", VTY_NEWLINE);             
-                   rd_header = 0;
-                 }
-               if (tags)
-                 route_vty_out_tag (vty, &rm->p, ri, 0, SAFI_MPLS_VPN);
-               else
-                 route_vty_out (vty, &rm->p, ri, 0, SAFI_MPLS_VPN, NULL);
-             }
+           {
+              if (use_json)
+                json_array = json_object_new_array();
+              else
+                json_array = NULL;
+
+              for (ri = rm->info; ri; ri = ri->next)
+               {
+                 if (type == bgp_show_type_neighbor)
+                   {
+                     union sockunion *su = output_arg;
+
+                     if (ri->peer->su_remote == NULL || ! sockunion_same(ri->peer->su_remote, su))
+                       continue;
+                    }
+                 if (header)
+                   {
+                      if (use_json)
+                        {
+                          if (!tags)
+                            {
+                              json_object_int_add(json, "bgpTableVersion", 0);
+                              json_object_string_add(json, "bgpLocalRouterId", inet_ntoa (bgp->router_id));
+                              json_object_object_add(json, "bgpStatusCodes", json_scode);
+                              json_object_object_add(json, "bgpOriginCodes", json_ocode);
+                            }
+                        }
+                      else
+                        {
+                         if (tags)
+                           vty_out (vty, v4_header_tag, VTY_NEWLINE);
+                         else
+                           {
+                             vty_out (vty, "BGP table version is 0, local router ID is %s%s",
+                                      inet_ntoa (bgp->router_id), VTY_NEWLINE);
+                             vty_out (vty, "Status codes: s suppressed, d damped, h history, * valid, > best, i - internal%s",
+                                      VTY_NEWLINE);
+                             vty_out (vty, "Origin codes: i - IGP, e - EGP, ? - incomplete%s%s",
+                                      VTY_NEWLINE, VTY_NEWLINE);
+                             vty_out (vty, v4_header, VTY_NEWLINE);
+                           }
+                        }
+                     header = 0;
+                   }
+
+                 if (rd_header)
+                   {
+                     u_int16_t type;
+                     struct rd_as rd_as;
+                     struct rd_ip rd_ip;
+                     u_char *pnt;
+
+                     pnt = rn->p.u.val;
+
+                     /* Decode RD type. */
+                     type = decode_rd_type (pnt);
+                     /* Decode RD value. */
+                     if (type == RD_TYPE_AS)
+                       decode_rd_as (pnt + 2, &rd_as);
+                     else if (type == RD_TYPE_IP)
+                       decode_rd_ip (pnt + 2, &rd_ip);
+
+                      if (use_json)
+                        {
+                          char buffer[BUFSIZ];
+                          if (type == RD_TYPE_AS)
+                            sprintf (buffer, "%u:%d", rd_as.as, rd_as.val);
+                          else if (type == RD_TYPE_IP)
+                            sprintf (buffer, "%s:%d", inet_ntoa (rd_ip.ip), rd_ip.val);
+                          json_object_string_add(json_nroute, "routeDistinguisher", buffer);
+                        }
+                      else
+                        {
+                         vty_out (vty, "Route Distinguisher: ");
+
+                         if (type == RD_TYPE_AS)
+                           vty_out (vty, "%u:%d", rd_as.as, rd_as.val);
+                         else if (type == RD_TYPE_IP)
+                           vty_out (vty, "%s:%d", inet_ntoa (rd_ip.ip), rd_ip.val);
+                         vty_out (vty, "%s", VTY_NEWLINE);
+                        }
+                     rd_header = 0;
+                   }
+                 if (tags)
+                   route_vty_out_tag (vty, &rm->p, ri, 0, SAFI_MPLS_VPN, json_array);
+                 else
+                   route_vty_out (vty, &rm->p, ri, 0, SAFI_MPLS_VPN, json_array);
+                }
+
+              if (use_json)
+                {
+                  struct prefix *p;
+                  char buf_a[BUFSIZ];
+                  char buf_b[BUFSIZ];
+                  p = &rm->p;
+                  sprintf(buf_a, "%s/%d", inet_ntop (p->family, &p->u.prefix, buf_b, BUFSIZ), p->prefixlen);
+                  json_object_object_add(json_mroute, buf_a, json_array);
+                }
+           }
+
+          if (use_json)
+            {
+              struct prefix *p;
+              char buf_a[BUFSIZ];
+              char buf_b[BUFSIZ];
+              p = &rn->p;
+              sprintf(buf_a, "%s/%d", inet_ntop (p->family, &p->u.prefix, buf_b, BUFSIZ), p->prefixlen);
+              json_object_object_add(json_nroute, buf_a, json_mroute);
+            }
         }
     }
         }
     }
+
+  if (use_json)
+    {
+      json_object_object_add(json, "routes", json_nroute);
+      vty_out (vty, "%s%s", json_object_to_json_string(json), VTY_NEWLINE);
+      json_object_free(json);
+    }
   return CMD_SUCCESS;
 }
 
   return CMD_SUCCESS;
 }
 
@@ -527,7 +682,7 @@ DEFUN (show_ip_bgp_vpnv4_all,
        "Display VPNv4 NLRI specific information\n"
        "Display information about all VPNv4 NLRIs\n")
 {
        "Display VPNv4 NLRI specific information\n"
        "Display information about all VPNv4 NLRIs\n")
 {
-  return bgp_show_mpls_vpn (vty, NULL, bgp_show_type_normal, NULL, 0);
+  return bgp_show_mpls_vpn (vty, NULL, bgp_show_type_normal, NULL, 0, 0);
 }
 
 DEFUN (show_ip_bgp_vpnv4_rd,
 }
 
 DEFUN (show_ip_bgp_vpnv4_rd,
@@ -549,7 +704,7 @@ DEFUN (show_ip_bgp_vpnv4_rd,
       vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
       return CMD_WARNING;
     }
       vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
       return CMD_WARNING;
     }
-  return bgp_show_mpls_vpn (vty, &prd, bgp_show_type_normal, NULL, 0);
+  return bgp_show_mpls_vpn (vty, &prd, bgp_show_type_normal, NULL, 0, 0);
 }
 
 DEFUN (show_ip_bgp_vpnv4_all_tags,
 }
 
 DEFUN (show_ip_bgp_vpnv4_all_tags,
@@ -562,7 +717,7 @@ DEFUN (show_ip_bgp_vpnv4_all_tags,
        "Display information about all VPNv4 NLRIs\n"
        "Display BGP tags for prefixes\n")
 {
        "Display information about all VPNv4 NLRIs\n"
        "Display BGP tags for prefixes\n")
 {
-  return bgp_show_mpls_vpn (vty, NULL, bgp_show_type_normal, NULL,  1);
+  return bgp_show_mpls_vpn (vty, NULL, bgp_show_type_normal, NULL,  1, 0);
 }
 
 DEFUN (show_ip_bgp_vpnv4_rd_tags,
 }
 
 DEFUN (show_ip_bgp_vpnv4_rd_tags,
@@ -585,12 +740,12 @@ DEFUN (show_ip_bgp_vpnv4_rd_tags,
       vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
       return CMD_WARNING;
     }
       vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
       return CMD_WARNING;
     }
-  return bgp_show_mpls_vpn (vty, &prd, bgp_show_type_normal, NULL, 1);
+  return bgp_show_mpls_vpn (vty, &prd, bgp_show_type_normal, NULL, 1, 0);
 }
 
 DEFUN (show_ip_bgp_vpnv4_all_neighbor_routes,
        show_ip_bgp_vpnv4_all_neighbor_routes_cmd,
 }
 
 DEFUN (show_ip_bgp_vpnv4_all_neighbor_routes,
        show_ip_bgp_vpnv4_all_neighbor_routes_cmd,
-       "show ip bgp vpnv4 all neighbors A.B.C.D routes",
+       "show ip bgp vpnv4 all neighbors A.B.C.D routes {json}",
        SHOW_STR
        IP_STR
        BGP_STR
        SHOW_STR
        IP_STR
        BGP_STR
@@ -598,32 +753,52 @@ DEFUN (show_ip_bgp_vpnv4_all_neighbor_routes,
        "Display information about all VPNv4 NLRIs\n"
        "Detailed information on TCP and BGP neighbor connections\n"
        "Neighbor to display information about\n"
        "Display information about all VPNv4 NLRIs\n"
        "Detailed information on TCP and BGP neighbor connections\n"
        "Neighbor to display information about\n"
-       "Display routes learned from neighbor\n")
+       "Display routes learned from neighbor\n"
+       "JavaScript Object Notation\n")
 {
   union sockunion su;
   struct peer *peer;
   int ret;
 {
   union sockunion su;
   struct peer *peer;
   int ret;
+  u_char use_json = (argv[1] != NULL);
 
   ret = str2sockunion (argv[0], &su);
   if (ret < 0)
     {
 
   ret = str2sockunion (argv[0], &su);
   if (ret < 0)
     {
-      vty_out (vty, "Malformed address: %s%s", argv[0], VTY_NEWLINE);
+      if (use_json)
+        {
+          json_object *json_no = NULL;
+          json_no = json_object_new_object();
+          json_object_string_add(json_no, "warning", "Malformed address");
+          vty_out (vty, "%s%s", json_object_to_json_string(json_no), VTY_NEWLINE);
+          json_object_free(json_no);
+        }
+      else
+        vty_out (vty, "Malformed address: %s%s", argv[0], VTY_NEWLINE);
       return CMD_WARNING;
     }
 
   peer = peer_lookup (NULL, &su);
   if (! peer || ! peer->afc[AFI_IP][SAFI_MPLS_VPN])
     {
       return CMD_WARNING;
     }
 
   peer = peer_lookup (NULL, &su);
   if (! peer || ! peer->afc[AFI_IP][SAFI_MPLS_VPN])
     {
-      vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
+      if (use_json)
+        {
+          json_object *json_no = NULL;
+          json_no = json_object_new_object();
+          json_object_string_add(json_no, "warning", "No such neighbor or address family");
+          vty_out (vty, "%s%s", json_object_to_json_string(json_no), VTY_NEWLINE);
+          json_object_free(json_no);
+        }
+      else
+        vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
       return CMD_WARNING;
     }
 
       return CMD_WARNING;
     }
 
-  return bgp_show_mpls_vpn (vty, NULL, bgp_show_type_neighbor, &su, 0);
+  return bgp_show_mpls_vpn (vty, NULL, bgp_show_type_neighbor, &su, 0, use_json);
 }
 
 DEFUN (show_ip_bgp_vpnv4_rd_neighbor_routes,
        show_ip_bgp_vpnv4_rd_neighbor_routes_cmd,
 }
 
 DEFUN (show_ip_bgp_vpnv4_rd_neighbor_routes,
        show_ip_bgp_vpnv4_rd_neighbor_routes_cmd,
-       "show ip bgp vpnv4 rd ASN:nn_or_IP-address:nn neighbors A.B.C.D routes",
+       "show ip bgp vpnv4 rd ASN:nn_or_IP-address:nn neighbors A.B.C.D routes {json}",
        SHOW_STR
        IP_STR
        BGP_STR
        SHOW_STR
        IP_STR
        BGP_STR
@@ -632,40 +807,69 @@ DEFUN (show_ip_bgp_vpnv4_rd_neighbor_routes,
        "VPN Route Distinguisher\n"
        "Detailed information on TCP and BGP neighbor connections\n"
        "Neighbor to display information about\n"
        "VPN Route Distinguisher\n"
        "Detailed information on TCP and BGP neighbor connections\n"
        "Neighbor to display information about\n"
-       "Display routes learned from neighbor\n")
+       "Display routes learned from neighbor\n"
+       "JavaScript Object Notation\n")
 {
   int ret;
   union sockunion su;
   struct peer *peer;
   struct prefix_rd prd;
 {
   int ret;
   union sockunion su;
   struct peer *peer;
   struct prefix_rd prd;
+  u_char use_json = (argv[2] != NULL);
 
   ret = str2prefix_rd (argv[0], &prd);
   if (! ret)
     {
 
   ret = str2prefix_rd (argv[0], &prd);
   if (! ret)
     {
-      vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
+      if (use_json)
+        {
+          json_object *json_no = NULL;
+          json_no = json_object_new_object();
+          json_object_string_add(json_no, "warning", "Malformed Route Distinguisher");
+          vty_out (vty, "%s%s", json_object_to_json_string(json_no), VTY_NEWLINE);
+          json_object_free(json_no);
+        }
+      else
+        vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
       return CMD_WARNING;
     }
 
   ret = str2sockunion (argv[1], &su);
   if (ret < 0)
     {
       return CMD_WARNING;
     }
 
   ret = str2sockunion (argv[1], &su);
   if (ret < 0)
     {
-      vty_out (vty, "Malformed address: %s%s", argv[0], VTY_NEWLINE);
+      if (use_json)
+        {
+          json_object *json_no = NULL;
+          json_no = json_object_new_object();
+          json_object_string_add(json_no, "warning", "Malformed address");
+          vty_out (vty, "%s%s", json_object_to_json_string(json_no), VTY_NEWLINE);
+          json_object_free(json_no);
+        }
+      else
+        vty_out (vty, "Malformed address: %s%s", argv[0], VTY_NEWLINE);
       return CMD_WARNING;
     }
 
   peer = peer_lookup (NULL, &su);
   if (! peer || ! peer->afc[AFI_IP][SAFI_MPLS_VPN])
     {
       return CMD_WARNING;
     }
 
   peer = peer_lookup (NULL, &su);
   if (! peer || ! peer->afc[AFI_IP][SAFI_MPLS_VPN])
     {
-      vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
+      if (use_json)
+        {
+          json_object *json_no = NULL;
+          json_no = json_object_new_object();
+          json_object_string_add(json_no, "warning", "No such neighbor or address family");
+          vty_out (vty, "%s%s", json_object_to_json_string(json_no), VTY_NEWLINE);
+          json_object_free(json_no);
+        }
+      else
+        vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
       return CMD_WARNING;
     }
 
       return CMD_WARNING;
     }
 
-  return bgp_show_mpls_vpn (vty, &prd, bgp_show_type_neighbor, &su, 0);
+  return bgp_show_mpls_vpn (vty, &prd, bgp_show_type_neighbor, &su, 0, use_json);
 }
 
 DEFUN (show_ip_bgp_vpnv4_all_neighbor_advertised_routes,
        show_ip_bgp_vpnv4_all_neighbor_advertised_routes_cmd,
 }
 
 DEFUN (show_ip_bgp_vpnv4_all_neighbor_advertised_routes,
        show_ip_bgp_vpnv4_all_neighbor_advertised_routes_cmd,
-       "show ip bgp vpnv4 all neighbors A.B.C.D advertised-routes",
+       "show ip bgp vpnv4 all neighbors A.B.C.D advertised-routes {json}",
        SHOW_STR
        IP_STR
        BGP_STR
        SHOW_STR
        IP_STR
        BGP_STR
@@ -673,31 +877,51 @@ DEFUN (show_ip_bgp_vpnv4_all_neighbor_advertised_routes,
        "Display information about all VPNv4 NLRIs\n"
        "Detailed information on TCP and BGP neighbor connections\n"
        "Neighbor to display information about\n"
        "Display information about all VPNv4 NLRIs\n"
        "Detailed information on TCP and BGP neighbor connections\n"
        "Neighbor to display information about\n"
-       "Display the routes advertised to a BGP neighbor\n")
+       "Display the routes advertised to a BGP neighbor\n"
+       "JavaScript Object Notation\n")
 {
   int ret;
   struct peer *peer;
   union sockunion su;
 {
   int ret;
   struct peer *peer;
   union sockunion su;
+  u_char use_json = (argv[1] != NULL);
 
   ret = str2sockunion (argv[0], &su);
   if (ret < 0)
     {
 
   ret = str2sockunion (argv[0], &su);
   if (ret < 0)
     {
-      vty_out (vty, "%% Malformed address: %s%s", argv[0], VTY_NEWLINE);
+      if (use_json)
+        {
+          json_object *json_no = NULL;
+          json_no = json_object_new_object();
+          json_object_string_add(json_no, "warning", "Malformed address");
+          vty_out (vty, "%s%s", json_object_to_json_string(json_no), VTY_NEWLINE);
+          json_object_free(json_no);
+        }
+      else
+        vty_out (vty, "Malformed address: %s%s", argv[0], VTY_NEWLINE);
       return CMD_WARNING;
     }
   peer = peer_lookup (NULL, &su);
   if (! peer || ! peer->afc[AFI_IP][SAFI_MPLS_VPN])
     {
       return CMD_WARNING;
     }
   peer = peer_lookup (NULL, &su);
   if (! peer || ! peer->afc[AFI_IP][SAFI_MPLS_VPN])
     {
-      vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
+      if (use_json)
+        {
+          json_object *json_no = NULL;
+          json_no = json_object_new_object();
+          json_object_string_add(json_no, "warning", "No such neighbor or address family");
+          vty_out (vty, "%s%s", json_object_to_json_string(json_no), VTY_NEWLINE);
+          json_object_free(json_no);
+        }
+      else
+        vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
       return CMD_WARNING;
     }
 
       return CMD_WARNING;
     }
 
-  return show_adj_route_vpn (vty, peer, NULL);
+  return show_adj_route_vpn (vty, peer, NULL, use_json);
 }
 
 DEFUN (show_ip_bgp_vpnv4_rd_neighbor_advertised_routes,
        show_ip_bgp_vpnv4_rd_neighbor_advertised_routes_cmd,
 }
 
 DEFUN (show_ip_bgp_vpnv4_rd_neighbor_advertised_routes,
        show_ip_bgp_vpnv4_rd_neighbor_advertised_routes_cmd,
-       "show ip bgp vpnv4 rd ASN:nn_or_IP-address:nn neighbors A.B.C.D advertised-routes",
+       "show ip bgp vpnv4 rd ASN:nn_or_IP-address:nn neighbors A.B.C.D advertised-routes {json}",
        SHOW_STR
        IP_STR
        BGP_STR
        SHOW_STR
        IP_STR
        BGP_STR
@@ -706,34 +930,63 @@ DEFUN (show_ip_bgp_vpnv4_rd_neighbor_advertised_routes,
        "VPN Route Distinguisher\n"
        "Detailed information on TCP and BGP neighbor connections\n"
        "Neighbor to display information about\n"
        "VPN Route Distinguisher\n"
        "Detailed information on TCP and BGP neighbor connections\n"
        "Neighbor to display information about\n"
-       "Display the routes advertised to a BGP neighbor\n")
+       "Display the routes advertised to a BGP neighbor\n"
+       "JavaScript Object Notation\n")
 {
   int ret;
   struct peer *peer;
   struct prefix_rd prd;
   union sockunion su;
 {
   int ret;
   struct peer *peer;
   struct prefix_rd prd;
   union sockunion su;
+  u_char use_json = (argv[2] != NULL);
 
   ret = str2sockunion (argv[1], &su);
   if (ret < 0)
     {
 
   ret = str2sockunion (argv[1], &su);
   if (ret < 0)
     {
-      vty_out (vty, "%% Malformed address: %s%s", argv[0], VTY_NEWLINE);
+      if (use_json)
+        {
+          json_object *json_no = NULL;
+          json_no = json_object_new_object();
+          json_object_string_add(json_no, "warning", "Malformed address");
+          vty_out (vty, "%s%s", json_object_to_json_string(json_no), VTY_NEWLINE);
+          json_object_free(json_no);
+        }
+      else
+        vty_out (vty, "Malformed address: %s%s", argv[0], VTY_NEWLINE);
       return CMD_WARNING;
     }
   peer = peer_lookup (NULL, &su);
   if (! peer || ! peer->afc[AFI_IP][SAFI_MPLS_VPN])
     {
       return CMD_WARNING;
     }
   peer = peer_lookup (NULL, &su);
   if (! peer || ! peer->afc[AFI_IP][SAFI_MPLS_VPN])
     {
-      vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
+      if (use_json)
+        {
+          json_object *json_no = NULL;
+          json_no = json_object_new_object();
+          json_object_string_add(json_no, "warning", "No such neighbor or address family");
+          vty_out (vty, "%s%s", json_object_to_json_string(json_no), VTY_NEWLINE);
+          json_object_free(json_no);
+        }
+      else
+        vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
       return CMD_WARNING;
     }
 
   ret = str2prefix_rd (argv[0], &prd);
   if (! ret)
     {
       return CMD_WARNING;
     }
 
   ret = str2prefix_rd (argv[0], &prd);
   if (! ret)
     {
-      vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
+      if (use_json)
+        {
+          json_object *json_no = NULL;
+          json_no = json_object_new_object();
+          json_object_string_add(json_no, "warning", "Malformed Route Distinguisher");
+          vty_out (vty, "%s%s", json_object_to_json_string(json_no), VTY_NEWLINE);
+          json_object_free(json_no);
+        }
+      else
+        vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
       return CMD_WARNING;
     }
 
       return CMD_WARNING;
     }
 
-  return show_adj_route_vpn (vty, peer, &prd);
+  return show_adj_route_vpn (vty, peer, &prd, use_json);
 }
 
 void
 }
 
 void
index 78da37e12ea1291a6c55cd658250d7f47612deef..a530542a49719d49a839b9a70d2a1c6345b61872 100644 (file)
@@ -29,6 +29,7 @@ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 #include "memory.h"
 #include "queue.h"
 
 #include "memory.h"
 #include "queue.h"
 
+#include "lib/json.h"
 #include "bgpd/bgpd.h"
 #include "bgpd/bgp_attr.h"
 #include "bgpd/bgp_debug.h"
 #include "bgpd/bgpd.h"
 #include "bgpd/bgp_attr.h"
 #include "bgpd/bgp_debug.h"
@@ -49,12 +50,16 @@ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
    inforation at each peer. */
 
 void
    inforation at each peer. */
 
 void
-bgp_capability_vty_out (struct vty *vty, struct peer *peer)
+bgp_capability_vty_out (struct vty *vty, struct peer *peer, u_char use_json, json_object *json_neigh)
 {
   char *pnt;
   char *end;
   struct capability_mp_data mpc;
   struct capability_header *hdr;
 {
   char *pnt;
   char *end;
   struct capability_mp_data mpc;
   struct capability_header *hdr;
+  json_object *json_cap = NULL;
+
+  if (use_json)
+    json_cap = json_object_new_object();
 
   pnt = peer->notify.data;
   end = pnt + peer->notify.length;
 
   pnt = peer->notify.data;
   end = pnt + peer->notify.length;
@@ -72,46 +77,89 @@ bgp_capability_vty_out (struct vty *vty, struct peer *peer)
 
       if (hdr->code == CAPABILITY_CODE_MP)
        {
 
       if (hdr->code == CAPABILITY_CODE_MP)
        {
-         vty_out (vty, "  Capability error for: Multi protocol ");
-
-         switch (ntohs (mpc.afi))
-           {
-           case AFI_IP:
-             vty_out (vty, "AFI IPv4, ");
-             break;
-           case AFI_IP6:
-             vty_out (vty, "AFI IPv6, ");
-             break;
-           default:
-             vty_out (vty, "AFI Unknown %d, ", ntohs (mpc.afi));
-             break;
-           }
-         switch (mpc.safi)
-           {
-           case SAFI_UNICAST:
-             vty_out (vty, "SAFI Unicast");
-             break;
-           case SAFI_MULTICAST:
-             vty_out (vty, "SAFI Multicast");
-             break;
-           case SAFI_MPLS_LABELED_VPN:
-             vty_out (vty, "SAFI MPLS-labeled VPN");
-             break;
-           default:
-             vty_out (vty, "SAFI Unknown %d ", mpc.safi);
-             break;
-           }
-         vty_out (vty, "%s", VTY_NEWLINE);
-       }
+          if (use_json)
+            {
+              switch (ntohs (mpc.afi))
+                {
+                  case AFI_IP:
+                    json_object_string_add(json_cap, "capabilityErrorMultiProtocolAfi", "IPv4");
+                  break;
+                  case AFI_IP6:
+                    json_object_string_add(json_cap, "capabilityErrorMultiProtocolAfi", "IPv6");
+                  break;
+                  default:
+                    json_object_int_add(json_cap, "capabilityErrorMultiProtocolAfiUnknown", ntohs (mpc.afi));
+                  break;
+                }
+              switch (mpc.safi)
+                {
+                  case SAFI_UNICAST:
+                    json_object_string_add(json_cap, "capabilityErrorMultiProtocolSafi", "unicast");
+                  break;
+                  case SAFI_MULTICAST:
+                    json_object_string_add(json_cap, "capabilityErrorMultiProtocolSafi", "multicast");
+                  break;
+                  case SAFI_MPLS_LABELED_VPN:
+                    json_object_string_add(json_cap, "capabilityErrorMultiProtocolSafi", "MPLS-labeled VPN");
+                  break;
+                  default:
+                    json_object_int_add(json_cap, "capabilityErrorMultiProtocolSafiUnknown", mpc.safi);
+                  break;
+                }
+            }
+          else
+            {
+              vty_out (vty, "  Capability error for: Multi protocol ");
+              switch (ntohs (mpc.afi))
+                {
+                  case AFI_IP:
+                    vty_out (vty, "AFI IPv4, ");
+                  break;
+                  case AFI_IP6:
+                    vty_out (vty, "AFI IPv6, ");
+                  break;
+                  default:
+                    vty_out (vty, "AFI Unknown %d, ", ntohs (mpc.afi));
+                  break;
+                }
+              switch (mpc.safi)
+                {
+                  case SAFI_UNICAST:
+                    vty_out (vty, "SAFI Unicast");
+                  break;
+                  case SAFI_MULTICAST:
+                    vty_out (vty, "SAFI Multicast");
+                  break;
+                 case SAFI_MPLS_LABELED_VPN:
+                    vty_out (vty, "SAFI MPLS-labeled VPN");
+                  break;
+                  default:
+                    vty_out (vty, "SAFI Unknown %d ", mpc.safi);
+                  break;
+                }
+              vty_out (vty, "%s", VTY_NEWLINE);
+            }
+        }
       else if (hdr->code >= 128)
       else if (hdr->code >= 128)
-       vty_out (vty, "  Capability error: vendor specific capability code %d",
-                hdr->code);
+        {
+          if (use_json)
+            json_object_int_add(json_cap, "capabilityErrorVendorSpecificCapabilityCode", hdr->code);
+          else
+            vty_out (vty, "  Capability error: vendor specific capability code %d",
+                     hdr->code);
+        }
       else
       else
-       vty_out (vty, "  Capability error: unknown capability code %d", 
-                hdr->code);
-
+        {
+          if (use_json)
+            json_object_int_add(json_cap, "capabilityErrorUnknownCapabilityCode", hdr->code);
+          else
+            vty_out (vty, "  Capability error: unknown capability code %d",
+                     hdr->code);
+        }
       pnt += hdr->length + 2;
     }
       pnt += hdr->length + 2;
     }
+  if (use_json)
+    json_object_object_add(json_neigh, "capabilityErrors", json_cap);
 }
 
 static void 
 }
 
 static void 
index ca40c64b6414aca7242d71ae43848a1549d3d1d3..f47d04015eae0621c7b5102f0c2f947070de34a7 100644 (file)
@@ -109,7 +109,7 @@ struct capability_gr
 
 extern int bgp_open_option_parse (struct peer *, u_char, int *);
 extern void bgp_open_capability (struct stream *, struct peer *);
 
 extern int bgp_open_option_parse (struct peer *, u_char, int *);
 extern void bgp_open_capability (struct stream *, struct peer *);
-extern void bgp_capability_vty_out (struct vty *, struct peer *);
+extern void bgp_capability_vty_out (struct vty *, struct peer *, u_char, json_object *);
 extern as_t peek_for_as4_capability (struct peer *, u_char);
 extern int bgp_afi_safi_valid_indices (afi_t, safi_t *);
 
 extern as_t peek_for_as4_capability (struct peer *, u_char);
 extern int bgp_afi_safi_valid_indices (afi_t, safi_t *);
 
index 24ebdaaa6afb50e0ff40266d44ef048c8dc75b98..1f2346c743b2f6939fca9f83cedadad1106d8dcc 100644 (file)
@@ -20,6 +20,7 @@ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 
 #include <zebra.h>
 
 
 #include <zebra.h>
 
+#include "lib/json.h"
 #include "prefix.h"
 #include "linklist.h"
 #include "memory.h"
 #include "prefix.h"
 #include "linklist.h"
 #include "memory.h"
@@ -6478,14 +6479,14 @@ route_vty_out_route (struct prefix *p, struct vty *vty)
       destination = ntohl (p->u.prefix4.s_addr);
 
       if ((IN_CLASSC (destination) && p->prefixlen == 24)
       destination = ntohl (p->u.prefix4.s_addr);
 
       if ((IN_CLASSC (destination) && p->prefixlen == 24)
-         || (IN_CLASSB (destination) && p->prefixlen == 16)
-         || (IN_CLASSA (destination) && p->prefixlen == 8)
-         || p->u.prefix4.s_addr == 0)
-       {
-         /* When mask is natural, mask is not displayed. */
-       }
+          || (IN_CLASSB (destination) && p->prefixlen == 16)
+          || (IN_CLASSA (destination) && p->prefixlen == 8)
+          || p->u.prefix4.s_addr == 0)
+        {
+          /* When mask is natural, mask is not displayed. */
+        }
       else
       else
-       len += vty_out (vty, "/%d", p->prefixlen);
+        len += vty_out (vty, "/%d", p->prefixlen);
     }
   else
     len = vty_out (vty, "%s/%d", inet_ntop (p->family, &p->u.prefix, buf, BUFSIZ),
     }
   else
     len = vty_out (vty, "%s/%d", inet_ntop (p->family, &p->u.prefix, buf, BUFSIZ),
@@ -6765,6 +6766,13 @@ route_vty_out (struct vty *vty, struct prefix *p,
       else
         vty_out (vty, "%s", bgp_origin_str[attr->origin]);
     }
       else
         vty_out (vty, "%s", bgp_origin_str[attr->origin]);
     }
+  else
+    {
+      if (json_paths)
+        json_object_string_add(json_path, "alert", "No attributes");
+      else
+        vty_out (vty, "No attributes to print%s", VTY_NEWLINE);
+    }
 
   if (json_paths)
     {
 
   if (json_paths)
     {
@@ -6789,89 +6797,156 @@ route_vty_out (struct vty *vty, struct prefix *p,
 
 /* called from terminal list command */
 void
 
 /* called from terminal list command */
 void
-route_vty_out_tmp (struct vty *vty, struct prefix *p,
-                  struct attr *attr, safi_t safi)
+route_vty_out_tmp (struct vty *vty, struct prefix *p, struct attr *attr, safi_t safi,
+                   u_char use_json, json_object *json_ar)
 {
 {
+  json_object *json_status = NULL;
+  json_object *json_net = NULL;
+  char buff[BUFSIZ];
   /* Route status display. */
   /* Route status display. */
-  vty_out (vty, "*");
-  vty_out (vty, ">");
-  vty_out (vty, " ");
+  if (use_json)
+    {
+      json_status = json_object_new_object();
+      json_net = json_object_new_object();
+    }
+  else
+    {
+      vty_out (vty, "*");
+      vty_out (vty, ">");
+      vty_out (vty, " ");
+    }
 
   /* print prefix and mask */
 
   /* print prefix and mask */
-  route_vty_out_route (p, vty);
+  if (use_json)
+    json_object_string_add(json_net, "addrPrefix", inet_ntop (p->family, &p->u.prefix, buff, BUFSIZ));
+  else
+    route_vty_out_route (p, vty);
 
   /* Print attribute */
   if (attr) 
     {
 
   /* Print attribute */
   if (attr) 
     {
-      if (p->family == AF_INET
-          && (safi == SAFI_MPLS_VPN || !BGP_ATTR_NEXTHOP_AFI_IP6(attr)))
-       {
-         if (safi == SAFI_MPLS_VPN)
-           vty_out (vty, "%-16s",
-                     inet_ntoa (attr->extra->mp_nexthop_global_in));
-         else
-           vty_out (vty, "%-16s", inet_ntoa (attr->nexthop));
-       }
-#ifdef HAVE_IPV6
-      else if (p->family == AF_INET6 || BGP_ATTR_NEXTHOP_AFI_IP6(attr))
+      if (use_json)
         {
         {
-          int len;
-          char buf[BUFSIZ];
-          
-          assert (attr->extra);
+          if (p->family == AF_INET && (safi == SAFI_MPLS_VPN || !BGP_ATTR_NEXTHOP_AFI_IP6(attr)))
+            {
+              if (safi == SAFI_MPLS_VPN)
+                json_object_string_add(json_net, "nextHop", inet_ntoa (attr->extra->mp_nexthop_global_in));
+              else
+                json_object_string_add(json_net, "nextHop", inet_ntoa (attr->nexthop));
+            }
+#ifdef HAVE_IPV6
+          else if (p->family == AF_INET6 || BGP_ATTR_NEXTHOP_AFI_IP6(attr))
+            {
+              char buf[BUFSIZ];
 
 
-          len = vty_out (vty, "%s",
-                         inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
-                         buf, BUFSIZ));
-          len = 16 - len;
-          if (len < 1)
-            vty_out (vty, "%s%*s", VTY_NEWLINE, 36, " ");
+              json_object_string_add(json_net, "netHopGloabal", inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
+                                  buf, BUFSIZ));
+            }
+#endif /* HAVE_IPV6 */
+
+          if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC))
+            json_object_int_add(json_net, "metric", attr->med);
+
+          if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF))
+            json_object_int_add(json_net, "localPref", attr->local_pref);
+
+          if (attr->extra)
+            json_object_int_add(json_net, "weight", attr->extra->weight);
           else
           else
-            vty_out (vty, "%*s", len, " ");
+            json_object_int_add(json_net, "weight", 0);
+
+          /* Print aspath */
+          if (attr->aspath)
+            json_object_string_add(json_net, "asPath", attr->aspath->str);
+
+          /* Print origin */
+          json_object_string_add(json_net, "bgpOriginCode", bgp_origin_str[attr->origin]);
         }
         }
+      else
+        {
+          if (p->family == AF_INET && (safi == SAFI_MPLS_VPN || !BGP_ATTR_NEXTHOP_AFI_IP6(attr)))
+            {
+              if (safi == SAFI_MPLS_VPN)
+                vty_out (vty, "%-16s",
+                         inet_ntoa (attr->extra->mp_nexthop_global_in));
+              else
+                vty_out (vty, "%-16s", inet_ntoa (attr->nexthop));
+            }
+#ifdef HAVE_IPV6
+          else if (p->family == AF_INET6 || BGP_ATTR_NEXTHOP_AFI_IP6(attr))
+            {
+              int len;
+              char buf[BUFSIZ];
+
+              assert (attr->extra);
+
+              len = vty_out (vty, "%s",
+                             inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
+                             buf, BUFSIZ));
+              len = 16 - len;
+              if (len < 1)
+                vty_out (vty, "%s%*s", VTY_NEWLINE, 36, " ");
+              else
+                vty_out (vty, "%*s", len, " ");
+            }
 #endif /* HAVE_IPV6 */
 #endif /* HAVE_IPV6 */
+          if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC))
+            vty_out (vty, "%10u", attr->med);
+          else
+            vty_out (vty, "          ");
 
 
-      if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC))
-       vty_out (vty, "%10u", attr->med);
-      else
-       vty_out (vty, "          ");
+          if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF))
+            vty_out (vty, "%7u", attr->local_pref);
+          else
+            vty_out (vty, "       ");
 
 
-      if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF))
-       vty_out (vty, "%7u", attr->local_pref);
-      else
-       vty_out (vty, "       ");
-      
-      vty_out (vty, "%7u ", (attr->extra ? attr->extra->weight : 0));
-      
-      /* Print aspath */
-      if (attr->aspath)
-        aspath_print_vty (vty, "%s", attr->aspath, " ");
+          vty_out (vty, "%7u ", (attr->extra ? attr->extra->weight : 0));
 
 
-      /* Print origin */
-      vty_out (vty, "%s", bgp_origin_str[attr->origin]);
-    }
+          /* Print aspath */
+          if (attr->aspath)
+            aspath_print_vty (vty, "%s", attr->aspath, " ");
 
 
-  vty_out (vty, "%s", VTY_NEWLINE);
+          /* Print origin */
+          vty_out (vty, "%s", bgp_origin_str[attr->origin]);
+        }
+    }
+  if (use_json)
+    {
+      json_object_boolean_true_add(json_status, "*");
+      json_object_boolean_true_add(json_status, ">");
+      json_object_object_add(json_net, "appliedStatusSymbols", json_status);
+      char buf_cut[BUFSIZ];
+      json_object_object_add(json_ar, inet_ntop (p->family, &p->u.prefix, buf_cut, BUFSIZ), json_net);
+    }
+  else
+    vty_out (vty, "%s", VTY_NEWLINE);
 }  
 
 void
 route_vty_out_tag (struct vty *vty, struct prefix *p,
 }  
 
 void
 route_vty_out_tag (struct vty *vty, struct prefix *p,
-                  struct bgp_info *binfo, int display, safi_t safi)
+                  struct bgp_info *binfo, int display, safi_t safi, json_object *json)
 {
 {
+  json_object *json_out = NULL;
   struct attr *attr;
   u_int32_t label = 0;
   
   if (!binfo->extra)
     return;
   struct attr *attr;
   u_int32_t label = 0;
   
   if (!binfo->extra)
     return;
+
+  if (json)
+    json_out = json_object_new_object();
   
   /* short status lead text */ 
   
   /* short status lead text */ 
-  route_vty_short_status_out (vty, binfo, NULL);
+  route_vty_short_status_out (vty, binfo, json_out);
     
   /* print prefix and mask */
     
   /* print prefix and mask */
-  if (! display)
-    route_vty_out_route (p, vty);
-  else
-    vty_out (vty, "%*s", 17, " ");
+  if (json == NULL)
+    {
+      if (! display)
+        route_vty_out_route (p, vty);
+      else
+        vty_out (vty, "%*s", 17, " ");
+    }
 
   /* Print attribute */
   attr = binfo->attr;
 
   /* Print attribute */
   attr = binfo->attr;
@@ -6881,65 +6956,115 @@ route_vty_out_tag (struct vty *vty, struct prefix *p,
           && (safi == SAFI_MPLS_VPN || !BGP_ATTR_NEXTHOP_AFI_IP6(attr)))
        {
          if (safi == SAFI_MPLS_VPN)
           && (safi == SAFI_MPLS_VPN || !BGP_ATTR_NEXTHOP_AFI_IP6(attr)))
        {
          if (safi == SAFI_MPLS_VPN)
-           vty_out (vty, "%-16s",
-                     inet_ntoa (attr->extra->mp_nexthop_global_in));
+            {
+              if (json)
+                json_object_string_add(json_out, "mpNexthopGlobalIn", inet_ntoa (attr->extra->mp_nexthop_global_in));
+              else
+                vty_out (vty, "%-16s", inet_ntoa (attr->extra->mp_nexthop_global_in));
+            }
          else
          else
-           vty_out (vty, "%-16s", inet_ntoa (attr->nexthop));
+            {
+              if (json)
+                json_object_string_add(json_out, "nexthop", inet_ntoa (attr->nexthop));
+              else
+                vty_out (vty, "%-16s", inet_ntoa (attr->nexthop));
+            }
        }
 #ifdef HAVE_IPV6      
       else if (p->family == AF_INET6 || BGP_ATTR_NEXTHOP_AFI_IP6(attr))
        {
          assert (attr->extra);
        }
 #ifdef HAVE_IPV6      
       else if (p->family == AF_INET6 || BGP_ATTR_NEXTHOP_AFI_IP6(attr))
        {
          assert (attr->extra);
-         char buf[BUFSIZ];
-         char buf1[BUFSIZ];
+         char buf_a[BUFSIZ];
+         char buf_b[BUFSIZ];
+          char buf_c[BUFSIZ];
          if (attr->extra->mp_nexthop_len == BGP_ATTR_NHLEN_IPV6_GLOBAL)
          if (attr->extra->mp_nexthop_len == BGP_ATTR_NHLEN_IPV6_GLOBAL)
-           vty_out (vty, "%s", 
-                    inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
-                     buf, BUFSIZ));
+            {
+              if (json)
+                json_object_string_add(json_out, "mpNexthopGlobalIn",
+                                       inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global, buf_a, BUFSIZ));
+              else
+                vty_out (vty, "%s",
+                         inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
+                                    buf_a, BUFSIZ));
+            }
          else if (attr->extra->mp_nexthop_len == BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL)
          else if (attr->extra->mp_nexthop_len == BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL)
-           vty_out (vty, "%s(%s)",
-                    inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
-                               buf, BUFSIZ),
-                    inet_ntop (AF_INET6, &attr->extra->mp_nexthop_local,
-                               buf1, BUFSIZ));
-         
+            {
+              if (json)
+                {
+                  inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
+                             buf_a, BUFSIZ);
+                  inet_ntop (AF_INET6, &attr->extra->mp_nexthop_local,
+                             buf_b, BUFSIZ);
+                  sprintf(buf_c, "%s(%s)", buf_a, buf_b);
+                  json_object_string_add(json_out, "mpNexthopGlobalLocal", buf_c);
+                }
+              else
+                vty_out (vty, "%s(%s)",
+                         inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
+                                    buf_a, BUFSIZ),
+                         inet_ntop (AF_INET6, &attr->extra->mp_nexthop_local,
+                                    buf_b, BUFSIZ));
+            }
+
        }
 #endif /* HAVE_IPV6 */
     }
 
   label = decode_label (binfo->extra->tag);
 
        }
 #endif /* HAVE_IPV6 */
     }
 
   label = decode_label (binfo->extra->tag);
 
-  vty_out (vty, "notag/%d", label);
-
-  vty_out (vty, "%s", VTY_NEWLINE);
+  if (json)
+    {
+      if (label)
+        json_object_int_add(json_out, "notag", label);
+      json_object_array_add(json, json_out);
+    }
+  else
+    {
+      vty_out (vty, "notag/%d", label);
+      vty_out (vty, "%s", VTY_NEWLINE);
+    }
 }  
 
 /* dampening route */
 static void
 }  
 
 /* dampening route */
 static void
-damp_route_vty_out (struct vty *vty, struct prefix *p,
-                   struct bgp_info *binfo, int display, safi_t safi)
+damp_route_vty_out (struct vty *vty, struct prefix *p, struct bgp_info *binfo,
+                    int display, safi_t safi, u_char use_json, json_object *json)
 {
   struct attr *attr;
   int len;
   char timebuf[BGP_UPTIME_LEN];
 
   /* short status lead text */ 
 {
   struct attr *attr;
   int len;
   char timebuf[BGP_UPTIME_LEN];
 
   /* short status lead text */ 
-  route_vty_short_status_out (vty, binfo, NULL);
+  route_vty_short_status_out (vty, binfo, json);
   
   /* print prefix and mask */
   
   /* print prefix and mask */
-  if (! display)
-    route_vty_out_route (p, vty);
-  else
-    vty_out (vty, "%*s", 17, " ");
+  if (!use_json)
+    {
+      if (! display)
+        route_vty_out_route (p, vty);
+      else
+        vty_out (vty, "%*s", 17, " ");
+    }
 
   len = vty_out (vty, "%s", binfo->peer->host);
   len = 17 - len;
   if (len < 1)
 
   len = vty_out (vty, "%s", binfo->peer->host);
   len = 17 - len;
   if (len < 1)
-    vty_out (vty, "%s%*s", VTY_NEWLINE, 34, " ");
+    {
+      if (!use_json)
+        vty_out (vty, "%s%*s", VTY_NEWLINE, 34, " ");
+    }
   else
   else
-    vty_out (vty, "%*s", len, " ");
+    {
+      if (use_json)
+        json_object_int_add(json, "peerHost", len);
+      else
+        vty_out (vty, "%*s", len, " ");
+    }
 
 
-  vty_out (vty, "%s ", bgp_damp_reuse_time_vty (vty, binfo, timebuf, BGP_UPTIME_LEN));
+  if (use_json)
+    bgp_damp_reuse_time_vty (vty, binfo, timebuf, BGP_UPTIME_LEN, use_json, json);
+  else
+    vty_out (vty, "%s ", bgp_damp_reuse_time_vty (vty, binfo, timebuf, BGP_UPTIME_LEN, use_json, json));
 
   /* Print attribute */
   attr = binfo->attr;
 
   /* Print attribute */
   attr = binfo->attr;
@@ -6947,18 +7072,27 @@ damp_route_vty_out (struct vty *vty, struct prefix *p,
     {
       /* Print aspath */
       if (attr->aspath)
     {
       /* Print aspath */
       if (attr->aspath)
-       aspath_print_vty (vty, "%s", attr->aspath, " ");
+        {
+          if (use_json)
+            json_object_string_add(json, "asPath", attr->aspath->str);
+          else
+            aspath_print_vty (vty, "%s", attr->aspath, " ");
+        }
 
       /* Print origin */
 
       /* Print origin */
-      vty_out (vty, "%s", bgp_origin_str[attr->origin]);
+      if (use_json)
+        json_object_string_add(json, "origin", bgp_origin_str[attr->origin]);
+      else
+        vty_out (vty, "%s", bgp_origin_str[attr->origin]);
     }
     }
-  vty_out (vty, "%s", VTY_NEWLINE);
+  if (!use_json)
+    vty_out (vty, "%s", VTY_NEWLINE);
 }
 
 /* flap route */
 static void
 }
 
 /* flap route */
 static void
-flap_route_vty_out (struct vty *vty, struct prefix *p,
-                   struct bgp_info *binfo, int display, safi_t safi)
+flap_route_vty_out (struct vty *vty, struct prefix *p, struct bgp_info *binfo,
+                    int display, safi_t safi, u_char use_json, json_object *json)
 {
   struct attr *attr;
   struct bgp_damp_info *bdi;
 {
   struct attr *attr;
   struct bgp_damp_info *bdi;
@@ -6971,36 +7105,66 @@ flap_route_vty_out (struct vty *vty, struct prefix *p,
   bdi = binfo->extra->damp_info;
 
   /* short status lead text */
   bdi = binfo->extra->damp_info;
 
   /* short status lead text */
-  route_vty_short_status_out (vty, binfo, NULL);
+  route_vty_short_status_out (vty, binfo, json);
   
   /* print prefix and mask */
   
   /* print prefix and mask */
-  if (! display)
-    route_vty_out_route (p, vty);
-  else
-    vty_out (vty, "%*s", 17, " ");
+  if (!use_json)
+    {
+      if (! display)
+        route_vty_out_route (p, vty);
+      else
+        vty_out (vty, "%*s", 17, " ");
+    }
 
   len = vty_out (vty, "%s", binfo->peer->host);
   len = 16 - len;
   if (len < 1)
 
   len = vty_out (vty, "%s", binfo->peer->host);
   len = 16 - len;
   if (len < 1)
-    vty_out (vty, "%s%*s", VTY_NEWLINE, 33, " ");
+    {
+      if (!use_json)
+        vty_out (vty, "%s%*s", VTY_NEWLINE, 33, " ");
+    }
   else
   else
-    vty_out (vty, "%*s", len, " ");
+    {
+      if (use_json)
+        json_object_int_add(json, "peerHost", len);
+      else
+        vty_out (vty, "%*s", len, " ");
+    }
 
   len = vty_out (vty, "%d", bdi->flap);
   len = 5 - len;
   if (len < 1)
 
   len = vty_out (vty, "%d", bdi->flap);
   len = 5 - len;
   if (len < 1)
-    vty_out (vty, " ");
+    {
+      if (!use_json)
+        vty_out (vty, " ");
+    }
   else
   else
-    vty_out (vty, "%*s ", len, " ");
-    
-  vty_out (vty, "%s ", peer_uptime (bdi->start_time,
-          timebuf, BGP_UPTIME_LEN));
+    {
+      if (use_json)
+        json_object_int_add(json, "bdiFlap", len);
+      else
+        vty_out (vty, "%*s", len, " ");
+    }
+
+  if (use_json)
+    peer_uptime (bdi->start_time, timebuf, BGP_UPTIME_LEN, use_json, json);
+  else
+    vty_out (vty, "%s ", peer_uptime (bdi->start_time,
+             timebuf, BGP_UPTIME_LEN, 0, NULL));
 
   if (CHECK_FLAG (binfo->flags, BGP_INFO_DAMPED)
       && ! CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
 
   if (CHECK_FLAG (binfo->flags, BGP_INFO_DAMPED)
       && ! CHECK_FLAG (binfo->flags, BGP_INFO_HISTORY))
-    vty_out (vty, "%s ", bgp_damp_reuse_time_vty (vty, binfo, timebuf, BGP_UPTIME_LEN));
+    {
+      if (use_json)
+        bgp_damp_reuse_time_vty (vty, binfo, timebuf, BGP_UPTIME_LEN, use_json, json);
+      else
+        vty_out (vty, "%s ", bgp_damp_reuse_time_vty (vty, binfo, timebuf, BGP_UPTIME_LEN, use_json, json));
+    }
   else
   else
-    vty_out (vty, "%*s ", 8, " ");
+    {
+      if (!use_json)
+        vty_out (vty, "%*s ", 8, " ");
+    }
 
   /* Print attribute */
   attr = binfo->attr;
 
   /* Print attribute */
   attr = binfo->attr;
@@ -7008,12 +7172,21 @@ flap_route_vty_out (struct vty *vty, struct prefix *p,
     {
       /* Print aspath */
       if (attr->aspath)
     {
       /* Print aspath */
       if (attr->aspath)
-       aspath_print_vty (vty, "%s", attr->aspath, " ");
+        {
+          if (use_json)
+            json_object_string_add(json, "asPath", attr->aspath->str);
+          else
+            aspath_print_vty (vty, "%s", attr->aspath, " ");
+        }
 
       /* Print origin */
 
       /* Print origin */
-      vty_out (vty, "%s", bgp_origin_str[attr->origin]);
+      if (use_json)
+        json_object_string_add(json, "origin", bgp_origin_str[attr->origin]);
+      else
+        vty_out (vty, "%s", bgp_origin_str[attr->origin]);
     }
     }
-  vty_out (vty, "%s", VTY_NEWLINE);
+  if (!use_json)
+    vty_out (vty, "%s", VTY_NEWLINE);
 }
 
 static void
 }
 
 static void
@@ -7644,7 +7817,7 @@ enum bgp_show_type
 
 static int
 bgp_show_table (struct vty *vty, struct bgp_table *table, struct in_addr *router_id,
 
 static int
 bgp_show_table (struct vty *vty, struct bgp_table *table, struct in_addr *router_id,
-               enum bgp_show_type type, void *output_arg, u_char use_json)
+                enum bgp_show_type type, void *output_arg, u_char use_json)
 {
   struct bgp_info *ri;
   struct bgp_node *rn;
 {
   struct bgp_info *ri;
   struct bgp_node *rn;
@@ -7673,216 +7846,225 @@ bgp_show_table (struct vty *vty, struct bgp_table *table, struct in_addr *router
   for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn)) 
     if (rn->info != NULL)
       {
   for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn)) 
     if (rn->info != NULL)
       {
-       display = 0;
+        display = 0;
 
         if (use_json)
           json_paths = json_object_new_array();
         else
           json_paths = NULL;
 
 
         if (use_json)
           json_paths = json_object_new_array();
         else
           json_paths = NULL;
 
-       for (ri = rn->info; ri; ri = ri->next)
-         {
-           if (type == bgp_show_type_flap_statistics
-               || type == bgp_show_type_flap_address
-               || type == bgp_show_type_flap_prefix
-               || type == bgp_show_type_flap_cidr_only
-               || type == bgp_show_type_flap_regexp
-               || type == bgp_show_type_flap_filter_list
-               || type == bgp_show_type_flap_prefix_list
-               || type == bgp_show_type_flap_prefix_longer
-               || type == bgp_show_type_flap_route_map
-               || type == bgp_show_type_flap_neighbor
-               || type == bgp_show_type_dampend_paths
-               || type == bgp_show_type_damp_neighbor)
-             {
-               if (!(ri->extra && ri->extra->damp_info))
-                 continue;
-             }
-           if (type == bgp_show_type_regexp
-               || type == bgp_show_type_flap_regexp)
-             {
-               regex_t *regex = output_arg;
-                   
-               if (bgp_regexec (regex, ri->attr->aspath) == REG_NOMATCH)
-                 continue;
-             }
-           if (type == bgp_show_type_prefix_list
-               || type == bgp_show_type_flap_prefix_list)
-             {
-               struct prefix_list *plist = output_arg;
-                   
-               if (prefix_list_apply (plist, &rn->p) != PREFIX_PERMIT)
-                 continue;
-             }
-           if (type == bgp_show_type_filter_list
-               || type == bgp_show_type_flap_filter_list)
-             {
-               struct as_list *as_list = output_arg;
+        for (ri = rn->info; ri; ri = ri->next)
+          {
+            if (type == bgp_show_type_flap_statistics
+                || type == bgp_show_type_flap_address
+                || type == bgp_show_type_flap_prefix
+                || type == bgp_show_type_flap_cidr_only
+                || type == bgp_show_type_flap_regexp
+                || type == bgp_show_type_flap_filter_list
+                || type == bgp_show_type_flap_prefix_list
+                || type == bgp_show_type_flap_prefix_longer
+                || type == bgp_show_type_flap_route_map
+                || type == bgp_show_type_flap_neighbor
+                || type == bgp_show_type_dampend_paths
+                || type == bgp_show_type_damp_neighbor)
+              {
+                if (!(ri->extra && ri->extra->damp_info))
+                  continue;
+              }
+            if (type == bgp_show_type_regexp
+                || type == bgp_show_type_flap_regexp)
+              {
+                regex_t *regex = output_arg;
 
 
-               if (as_list_apply (as_list, ri->attr->aspath) != AS_FILTER_PERMIT)
-                 continue;
-             }
-           if (type == bgp_show_type_route_map
-               || type == bgp_show_type_flap_route_map)
-             {
-               struct route_map *rmap = output_arg;
-               struct bgp_info binfo;
-               struct attr dummy_attr;
-               struct attr_extra dummy_extra;
-               int ret;
+                if (bgp_regexec (regex, ri->attr->aspath) == REG_NOMATCH)
+                  continue;
+              }
+            if (type == bgp_show_type_prefix_list
+                || type == bgp_show_type_flap_prefix_list)
+              {
+                struct prefix_list *plist = output_arg;
 
 
-               dummy_attr.extra = &dummy_extra;
-               bgp_attr_dup (&dummy_attr, ri->attr);
+                if (prefix_list_apply (plist, &rn->p) != PREFIX_PERMIT)
+                  continue;
+              }
+            if (type == bgp_show_type_filter_list
+                || type == bgp_show_type_flap_filter_list)
+              {
+                struct as_list *as_list = output_arg;
 
 
-               binfo.peer = ri->peer;
-               binfo.attr = &dummy_attr;
+                if (as_list_apply (as_list, ri->attr->aspath) != AS_FILTER_PERMIT)
+                  continue;
+              }
+            if (type == bgp_show_type_route_map
+                || type == bgp_show_type_flap_route_map)
+              {
+                struct route_map *rmap = output_arg;
+                struct bgp_info binfo;
+                struct attr dummy_attr;
+                struct attr_extra dummy_extra;
+                int ret;
 
 
-               ret = route_map_apply (rmap, &rn->p, RMAP_BGP, &binfo);
-               if (ret == RMAP_DENYMATCH)
-                 continue;
-             }
-           if (type == bgp_show_type_neighbor
-               || type == bgp_show_type_flap_neighbor
-               || type == bgp_show_type_damp_neighbor)
-             {
-               union sockunion *su = output_arg;
+                dummy_attr.extra = &dummy_extra;
+                bgp_attr_dup (&dummy_attr, ri->attr);
 
 
-               if (ri->peer->su_remote == NULL || ! sockunion_same(ri->peer->su_remote, su))
-                 continue;
-             }
-           if (type == bgp_show_type_cidr_only
-               || type == bgp_show_type_flap_cidr_only)
-             {
-               u_int32_t destination;
-
-               destination = ntohl (rn->p.u.prefix4.s_addr);
-               if (IN_CLASSC (destination) && rn->p.prefixlen == 24)
-                 continue;
-               if (IN_CLASSB (destination) && rn->p.prefixlen == 16)
-                 continue;
-               if (IN_CLASSA (destination) && rn->p.prefixlen == 8)
-                 continue;
-             }
-           if (type == bgp_show_type_prefix_longer
-               || type == bgp_show_type_flap_prefix_longer)
-             {
-               struct prefix *p = output_arg;
+                binfo.peer = ri->peer;
+                binfo.attr = &dummy_attr;
 
 
-               if (! prefix_match (p, &rn->p))
-                 continue;
-             }
-           if (type == bgp_show_type_community_all)
-             {
-               if (! ri->attr->community)
-                 continue;
-             }
-           if (type == bgp_show_type_community)
-             {
-               struct community *com = output_arg;
+                ret = route_map_apply (rmap, &rn->p, RMAP_BGP, &binfo);
+                if (ret == RMAP_DENYMATCH)
+                  continue;
+              }
+            if (type == bgp_show_type_neighbor
+                || type == bgp_show_type_flap_neighbor
+                || type == bgp_show_type_damp_neighbor)
+              {
+                union sockunion *su = output_arg;
 
 
-               if (! ri->attr->community ||
-                   ! community_match (ri->attr->community, com))
-                 continue;
-             }
-           if (type == bgp_show_type_community_exact)
-             {
-               struct community *com = output_arg;
+                if (ri->peer->su_remote == NULL || ! sockunion_same(ri->peer->su_remote, su))
+                  continue;
+              }
+            if (type == bgp_show_type_cidr_only
+                || type == bgp_show_type_flap_cidr_only)
+              {
+                u_int32_t destination;
 
 
-               if (! ri->attr->community ||
-                   ! community_cmp (ri->attr->community, com))
-                 continue;
-             }
-           if (type == bgp_show_type_community_list)
-             {
-               struct community_list *list = output_arg;
+                destination = ntohl (rn->p.u.prefix4.s_addr);
+                if (IN_CLASSC (destination) && rn->p.prefixlen == 24)
+                  continue;
+                if (IN_CLASSB (destination) && rn->p.prefixlen == 16)
+                  continue;
+                if (IN_CLASSA (destination) && rn->p.prefixlen == 8)
+                  continue;
+              }
+            if (type == bgp_show_type_prefix_longer
+                || type == bgp_show_type_flap_prefix_longer)
+              {
+                struct prefix *p = output_arg;
 
 
-               if (! community_list_match (ri->attr->community, list))
-                 continue;
-             }
-           if (type == bgp_show_type_community_list_exact)
-             {
-               struct community_list *list = output_arg;
+                if (! prefix_match (p, &rn->p))
+                  continue;
+              }
+            if (type == bgp_show_type_community_all)
+              {
+                if (! ri->attr->community)
+                  continue;
+              }
+            if (type == bgp_show_type_community)
+              {
+                struct community *com = output_arg;
 
 
-               if (! community_list_exact_match (ri->attr->community, list))
-                 continue;
-             }
-           if (type == bgp_show_type_flap_address
-               || type == bgp_show_type_flap_prefix)
-             {
-               struct prefix *p = output_arg;
+                if (! ri->attr->community ||
+                    ! community_match (ri->attr->community, com))
+                  continue;
+              }
+            if (type == bgp_show_type_community_exact)
+              {
+                struct community *com = output_arg;
 
 
-               if (! prefix_match (&rn->p, p))
-                 continue;
+                if (! ri->attr->community ||
+                    ! community_cmp (ri->attr->community, com))
+                  continue;
+              }
+            if (type == bgp_show_type_community_list)
+              {
+                struct community_list *list = output_arg;
 
 
-               if (type == bgp_show_type_flap_prefix)
-                 if (p->prefixlen != rn->p.prefixlen)
-                   continue;
-             }
-           if (type == bgp_show_type_dampend_paths
-               || type == bgp_show_type_damp_neighbor)
-             {
-               if (! CHECK_FLAG (ri->flags, BGP_INFO_DAMPED)
-                   || CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
-                 continue;
-             }
+                if (! community_list_match (ri->attr->community, list))
+                  continue;
+              }
+            if (type == bgp_show_type_community_list_exact)
+              {
+                struct community_list *list = output_arg;
 
 
-           if (!use_json && header)
-             {
-               vty_out (vty, "BGP table version is %" PRIu64 ", local router ID is %s%s", table->version, inet_ntoa (*router_id), VTY_NEWLINE);
-               vty_out (vty, BGP_SHOW_SCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
-               vty_out (vty, BGP_SHOW_OCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
-               if (type == bgp_show_type_dampend_paths
-                   || type == bgp_show_type_damp_neighbor)
-                 vty_out (vty, BGP_SHOW_DAMP_HEADER, VTY_NEWLINE);
-               else if (type == bgp_show_type_flap_statistics
-                        || type == bgp_show_type_flap_address
-                        || type == bgp_show_type_flap_prefix
-                        || type == bgp_show_type_flap_cidr_only
-                        || type == bgp_show_type_flap_regexp
-                        || type == bgp_show_type_flap_filter_list
-                        || type == bgp_show_type_flap_prefix_list
-                        || type == bgp_show_type_flap_prefix_longer
-                        || type == bgp_show_type_flap_route_map
-                        || type == bgp_show_type_flap_neighbor)
-                 vty_out (vty, BGP_SHOW_FLAP_HEADER, VTY_NEWLINE);
-               else
-                 vty_out (vty, BGP_SHOW_HEADER, VTY_NEWLINE);
-               header = 0;
-             }
+                if (! community_list_exact_match (ri->attr->community, list))
+                  continue;
+              }
+            if (type == bgp_show_type_flap_address
+                || type == bgp_show_type_flap_prefix)
+              {
+                struct prefix *p = output_arg;
 
 
-           if (type == bgp_show_type_dampend_paths
-               || type == bgp_show_type_damp_neighbor)
-             damp_route_vty_out (vty, &rn->p, ri, display, SAFI_UNICAST);
-           else if (type == bgp_show_type_flap_statistics
-                    || type == bgp_show_type_flap_address
-                    || type == bgp_show_type_flap_prefix
-                    || type == bgp_show_type_flap_cidr_only
-                    || type == bgp_show_type_flap_regexp
-                    || type == bgp_show_type_flap_filter_list
-                    || type == bgp_show_type_flap_prefix_list
-                    || type == bgp_show_type_flap_prefix_longer
-                    || type == bgp_show_type_flap_route_map
-                    || type == bgp_show_type_flap_neighbor)
-             flap_route_vty_out (vty, &rn->p, ri, display, SAFI_UNICAST);
-           else
-             route_vty_out (vty, &rn->p, ri, display, SAFI_UNICAST, json_paths);
-           display++;
-         }
+                if (! prefix_match (&rn->p, p))
+                  continue;
 
 
-        if (use_json)
-          {
-            p = &rn->p;
-            sprintf(buf2, "%s/%d", inet_ntop (p->family, &p->u.prefix, buf, BUFSIZ), p->prefixlen);
-            json_object_object_add(json_routes, buf2, json_paths);
+                if (type == bgp_show_type_flap_prefix)
+                  if (p->prefixlen != rn->p.prefixlen)
+                    continue;
+              }
+            if (type == bgp_show_type_dampend_paths
+                || type == bgp_show_type_damp_neighbor)
+              {
+                if (! CHECK_FLAG (ri->flags, BGP_INFO_DAMPED)
+                    || CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
+                  continue;
+              }
+
+            if (!use_json && header)
+              {
+                vty_out (vty, "BGP table version is %" PRIu64 ", local router ID is %s%s", table->version, inet_ntoa (*router_id), VTY_NEWLINE);
+                vty_out (vty, BGP_SHOW_SCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
+                vty_out (vty, BGP_SHOW_OCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
+                if (type == bgp_show_type_dampend_paths
+                    || type == bgp_show_type_damp_neighbor)
+                  vty_out (vty, BGP_SHOW_DAMP_HEADER, VTY_NEWLINE);
+                else if (type == bgp_show_type_flap_statistics
+                         || type == bgp_show_type_flap_address
+                         || type == bgp_show_type_flap_prefix
+                         || type == bgp_show_type_flap_cidr_only
+                         || type == bgp_show_type_flap_regexp
+                         || type == bgp_show_type_flap_filter_list
+                         || type == bgp_show_type_flap_prefix_list
+                         || type == bgp_show_type_flap_prefix_longer
+                         || type == bgp_show_type_flap_route_map
+                         || type == bgp_show_type_flap_neighbor)
+                  vty_out (vty, BGP_SHOW_FLAP_HEADER, VTY_NEWLINE);
+                else
+                  vty_out (vty, BGP_SHOW_HEADER, VTY_NEWLINE);
+                header = 0;
+              }
+
+            if (type == bgp_show_type_dampend_paths
+                || type == bgp_show_type_damp_neighbor)
+              damp_route_vty_out (vty, &rn->p, ri, display, SAFI_UNICAST, use_json, json_paths);
+            else if (type == bgp_show_type_flap_statistics
+                     || type == bgp_show_type_flap_address
+                     || type == bgp_show_type_flap_prefix
+                     || type == bgp_show_type_flap_cidr_only
+                     || type == bgp_show_type_flap_regexp
+                     || type == bgp_show_type_flap_filter_list
+                     || type == bgp_show_type_flap_prefix_list
+                     || type == bgp_show_type_flap_prefix_longer
+                     || type == bgp_show_type_flap_route_map
+                     || type == bgp_show_type_flap_neighbor)
+              flap_route_vty_out (vty, &rn->p, ri, display, SAFI_UNICAST, use_json, json_paths);
+            else
+              route_vty_out (vty, &rn->p, ri, display, SAFI_UNICAST, json_paths);
+            display++;
           }
 
           }
 
-       if (display)
-         output_count++;
+        if (display)
+          {
+            output_count++;
+            if (use_json)
+              {
+                p = &rn->p;
+                sprintf(buf2, "%s/%d", inet_ntop (p->family, &p->u.prefix, buf, BUFSIZ), p->prefixlen);
+                json_object_object_add(json_routes, buf2, json_paths);
+              }
+          }
       }
 
   if (use_json)
     {
       }
 
   if (use_json)
     {
-      json_object_object_add(json, "routes", json_routes);
+      if (output_count == 0)
+        {
+          if (type == bgp_show_type_normal)
+            json_object_string_add(json, "alert", "No BGP network exists");
+          else
+            json_object_string_add(json, "alert", "No route output");
+        }
+      else
+        json_object_object_add(json, "routes", json_routes);
       vty_out (vty, "%s%s", json_object_to_json_string(json), VTY_NEWLINE);
       json_object_free(json);
     }
       vty_out (vty, "%s%s", json_object_to_json_string(json), VTY_NEWLINE);
       json_object_free(json);
     }
@@ -7892,11 +8074,11 @@ bgp_show_table (struct vty *vty, struct bgp_table *table, struct in_addr *router
       if (output_count == 0)
         {
           if (type == bgp_show_type_normal)
       if (output_count == 0)
         {
           if (type == bgp_show_type_normal)
-           vty_out (vty, "No BGP network exists%s", VTY_NEWLINE);
+            vty_out (vty, "No BGP network exists%s", VTY_NEWLINE);
         }
       else
         vty_out (vty, "%sTotal number of prefixes %ld%s",
         }
       else
         vty_out (vty, "%sTotal number of prefixes %ld%s",
-                VTY_NEWLINE, output_count, VTY_NEWLINE);
+                 VTY_NEWLINE, output_count, VTY_NEWLINE);
     }
 
   return CMD_SUCCESS;
     }
 
   return CMD_SUCCESS;
@@ -7904,21 +8086,22 @@ bgp_show_table (struct vty *vty, struct bgp_table *table, struct in_addr *router
 
 static int
 bgp_show (struct vty *vty, struct bgp *bgp, afi_t afi, safi_t safi,
 
 static int
 bgp_show (struct vty *vty, struct bgp *bgp, afi_t afi, safi_t safi,
-         enum bgp_show_type type, void *output_arg, u_char use_json)
+          enum bgp_show_type type, void *output_arg, u_char use_json)
 {
   struct bgp_table *table;
 
 {
   struct bgp_table *table;
 
-  if (bgp == NULL) {
-    bgp = bgp_get_default ();
-  }
+  if (bgp == NULL)
+    {
+      bgp = bgp_get_default ();
+    }
 
   if (bgp == NULL)
     {
 
   if (bgp == NULL)
     {
-      vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
+      if (!use_json)
+        vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
       return CMD_WARNING;
     }
 
       return CMD_WARNING;
     }
 
-
   table = bgp->rib[afi][safi];
 
   return bgp_show_table (vty, table, &bgp->router_id, type, output_arg, use_json);
   table = bgp->rib[afi][safi];
 
   return bgp_show_table (vty, table, &bgp->router_id, type, output_arg, use_json);
@@ -11089,7 +11272,7 @@ DEFUN (show_ipv6_mbgp_prefix_longer,
 
 static struct peer *
 peer_lookup_in_view (struct vty *vty, const char *view_name, 
 
 static struct peer *
 peer_lookup_in_view (struct vty *vty, const char *view_name, 
-                     const char *ip_str)
+                     const char *ip_str, u_char use_json)
 {
   int ret;
   struct bgp *bgp;
 {
   int ret;
   struct bgp *bgp;
@@ -11102,7 +11285,16 @@ peer_lookup_in_view (struct vty *vty, const char *view_name,
       bgp = bgp_lookup_by_name (view_name);
       if (! bgp)
         {
       bgp = bgp_lookup_by_name (view_name);
       if (! bgp)
         {
-          vty_out (vty, "Can't find BGP view %s%s", view_name, VTY_NEWLINE);
+          if (use_json)
+            {
+              json_object *json_no = NULL;
+              json_no = json_object_new_object();
+              json_object_string_add(json_no, "warning", "Can't find BGP view");
+              vty_out (vty, "%s%s", json_object_to_json_string(json_no), VTY_NEWLINE);
+              json_object_free(json_no);
+            }
+          else
+            vty_out (vty, "Can't find BGP view %s%s", view_name, VTY_NEWLINE);
           return NULL;
         }      
     }
           return NULL;
         }      
     }
@@ -11111,7 +11303,16 @@ peer_lookup_in_view (struct vty *vty, const char *view_name,
       bgp = bgp_get_default ();
       if (! bgp)
         {
       bgp = bgp_get_default ();
       if (! bgp)
         {
-          vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
+          if (use_json)
+            {
+              json_object *json_no = NULL;
+              json_no = json_object_new_object();
+              json_object_string_add(json_no, "warning", "No BGP process configured");
+              vty_out (vty, "%s%s", json_object_to_json_string(json_no), VTY_NEWLINE);
+              json_object_free(json_no);
+            }
+          else
+            vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
           return NULL;
         }
     }
           return NULL;
         }
     }
@@ -11123,8 +11324,17 @@ peer_lookup_in_view (struct vty *vty, const char *view_name,
       peer = peer_lookup_by_conf_if (bgp, ip_str);
       if (!peer)
         {
       peer = peer_lookup_by_conf_if (bgp, ip_str);
       if (!peer)
         {
-         vty_out (vty, "%% Malformed address or name: %s%s", ip_str, VTY_NEWLINE);
-         return NULL;
+          if (use_json)
+            {
+              json_object *json_no = NULL;
+              json_no = json_object_new_object();
+              json_object_string_add(json_no, "malformedAddressOrName", ip_str);
+              vty_out (vty, "%s%s", json_object_to_json_string(json_no), VTY_NEWLINE);
+              json_object_free(json_no);
+            }
+          else
+            vty_out (vty, "%% Malformed address or name: %s%s", ip_str, VTY_NEWLINE);
+          return NULL;
         }
       return peer;
     }
         }
       return peer;
     }
@@ -11133,7 +11343,16 @@ peer_lookup_in_view (struct vty *vty, const char *view_name,
   peer = peer_lookup (bgp, &su);
   if (! peer)
     {
   peer = peer_lookup (bgp, &su);
   if (! peer)
     {
-      vty_out (vty, "No such neighbor%s", VTY_NEWLINE);
+      if (use_json)
+        {
+          json_object *json_no = NULL;
+          json_no = json_object_new_object();
+          json_object_string_add(json_no, "warning","No such neighbor");
+          vty_out (vty, "%s%s", json_object_to_json_string(json_no), VTY_NEWLINE);
+          json_object_free(json_no);
+        }
+      else
+        vty_out (vty, "No such neighbor%s", VTY_NEWLINE);
       return NULL;
     }
   
       return NULL;
     }
   
@@ -11588,15 +11807,31 @@ bgp_peer_count_walker (struct thread *t)
 }
 
 static int
 }
 
 static int
-bgp_peer_counts (struct vty *vty, struct peer *peer, afi_t afi, safi_t safi)
+bgp_peer_counts (struct vty *vty, struct peer *peer, afi_t afi, safi_t safi, u_char use_json)
 {
   struct peer_pcounts pcounts = { .peer = peer };
   unsigned int i;
 {
   struct peer_pcounts pcounts = { .peer = peer };
   unsigned int i;
+  json_object *json = NULL;
+  json_object *json_loop = NULL;
+
+  if (use_json)
+    {
+      json = json_object_new_object();
+      json_loop = json_object_new_object();
+    }
   
   if (!peer || !peer->bgp || !peer->afc[afi][safi]
       || !peer->bgp->rib[afi][safi])
     {
   
   if (!peer || !peer->bgp || !peer->afc[afi][safi]
       || !peer->bgp->rib[afi][safi])
     {
-      vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
+      if (use_json)
+        {
+          json_object_string_add(json, "warning", "No such neighbor or address family");
+          vty_out (vty, "%s%s", json_object_to_json_string(json), VTY_NEWLINE);
+          json_object_free(json);
+        }
+      else
+        vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
+
       return CMD_WARNING;
     }
   
       return CMD_WARNING;
     }
   
@@ -11605,27 +11840,48 @@ bgp_peer_counts (struct vty *vty, struct peer *peer, afi_t afi, safi_t safi)
   pcounts.table = peer->bgp->rib[afi][safi];
   
   /* in-place call via thread subsystem so as to record execution time
   pcounts.table = peer->bgp->rib[afi][safi];
   
   /* in-place call via thread subsystem so as to record execution time
-   * stats for the thread-walk (i.e. ensure this can't be blamed on
-   * on just vty_read()).
-   */
*    * stats for the thread-walk (i.e. ensure this can't be blamed on
*       * on just vty_read()).
*          */
   thread_execute (bm->master, bgp_peer_count_walker, &pcounts, 0);
 
   thread_execute (bm->master, bgp_peer_count_walker, &pcounts, 0);
 
-  vty_out (vty, "Prefix counts for %s, %s%s",
-           peer->host, afi_safi_print (afi, safi), VTY_NEWLINE);
-  vty_out (vty, "PfxCt: %ld%s", peer->pcount[afi][safi], VTY_NEWLINE);
-  vty_out (vty, "%sCounts from RIB table walk:%s%s", 
-           VTY_NEWLINE, VTY_NEWLINE, VTY_NEWLINE);
+  if (use_json)
+    {
+      json_object_string_add(json, "prefixCountsFor", peer->host);
+      json_object_string_add(json, "multiProtocol", afi_safi_print (afi, safi));
+      json_object_int_add(json, "pfxCounter", peer->pcount[afi][safi]);
+
+      for (i = 0; i < PCOUNT_MAX; i++)
+        json_object_int_add(json_loop, pcount_strs[i], pcounts.count[i]);
 
 
-  for (i = 0; i < PCOUNT_MAX; i++)
-      vty_out (vty, "%20s: %-10d%s",
-               pcount_strs[i], pcounts.count[i], VTY_NEWLINE);
+      json_object_object_add(json, "ribTableWalkCounters", json_loop);
 
 
-  if (pcounts.count[PCOUNT_PFCNT] != peer->pcount[afi][safi])
+      if (pcounts.count[PCOUNT_PFCNT] != peer->pcount[afi][safi])
+        {
+          json_object_string_add(json, "pfxctDriftFor", peer->host);
+          json_object_string_add(json, "recommended", "Please report this bug, with the above command output");
+        }
+      vty_out (vty, "%s%s", json_object_to_json_string(json), VTY_NEWLINE);
+      json_object_free(json);
+    }
+  else
     {
     {
-      vty_out (vty, "%s [pcount] PfxCt drift!%s",
-               peer->host, VTY_NEWLINE);
-      vty_out (vty, "Please report this bug, with the above command output%s",
-              VTY_NEWLINE);
+      vty_out (vty, "Prefix counts for %s, %s%s",
+               peer->host, afi_safi_print (afi, safi), VTY_NEWLINE);
+      vty_out (vty, "PfxCt: %ld%s", peer->pcount[afi][safi], VTY_NEWLINE);
+      vty_out (vty, "%sCounts from RIB table walk:%s%s",
+               VTY_NEWLINE, VTY_NEWLINE, VTY_NEWLINE);
+
+      for (i = 0; i < PCOUNT_MAX; i++)
+        vty_out (vty, "%20s: %-10d%s", pcount_strs[i], pcounts.count[i], VTY_NEWLINE);
+
+      if (pcounts.count[PCOUNT_PFCNT] != peer->pcount[afi][safi])
+        {
+          vty_out (vty, "%s [pcount] PfxCt drift!%s",
+                   peer->host, VTY_NEWLINE);
+          vty_out (vty, "Please report this bug, with the above command output%s",
+                   VTY_NEWLINE);
+        }
     }
                
   return CMD_SUCCESS;
     }
                
   return CMD_SUCCESS;
@@ -11633,7 +11889,7 @@ bgp_peer_counts (struct vty *vty, struct peer *peer, afi_t afi, safi_t safi)
 
 DEFUN (show_ip_bgp_neighbor_prefix_counts,
        show_ip_bgp_neighbor_prefix_counts_cmd,
 
 DEFUN (show_ip_bgp_neighbor_prefix_counts,
        show_ip_bgp_neighbor_prefix_counts_cmd,
-       "show ip bgp neighbors (A.B.C.D|X:X::X:X|WORD) prefix-counts",
+       "show ip bgp neighbors (A.B.C.D|X:X::X:X|WORD) prefix-counts {json}",
        SHOW_STR
        IP_STR
        BGP_STR
        SHOW_STR
        IP_STR
        BGP_STR
@@ -11641,20 +11897,27 @@ DEFUN (show_ip_bgp_neighbor_prefix_counts,
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
-       "Display detailed prefix count information\n")
+       "Display detailed prefix count information\n"
+       "JavaScript Object Notation\n")
 {
   struct peer *peer;
 {
   struct peer *peer;
+  u_char use_json;
 
 
-  peer = peer_lookup_in_view (vty, NULL, argv[0]);  
+  if (argv[argc - 1] && strcmp(argv[argc - 1], "json") == 0)
+    use_json = 1;
+  else
+    use_json = 0;
+
+  peer = peer_lookup_in_view (vty, NULL, argv[0], use_json);
   if (! peer) 
     return CMD_WARNING;
  
   if (! peer) 
     return CMD_WARNING;
  
-  return bgp_peer_counts (vty, peer, AFI_IP, SAFI_UNICAST);
+  return bgp_peer_counts (vty, peer, AFI_IP, SAFI_UNICAST, use_json);
 }
 
 DEFUN (show_bgp_ipv6_neighbor_prefix_counts,
        show_bgp_ipv6_neighbor_prefix_counts_cmd,
 }
 
 DEFUN (show_bgp_ipv6_neighbor_prefix_counts,
        show_bgp_ipv6_neighbor_prefix_counts_cmd,
-       "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X|WORD) prefix-counts",
+       "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X|WORD) prefix-counts {json}",
        SHOW_STR
        BGP_STR
        "Address family\n"
        SHOW_STR
        BGP_STR
        "Address family\n"
@@ -11662,20 +11925,27 @@ DEFUN (show_bgp_ipv6_neighbor_prefix_counts,
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
-       "Display detailed prefix count information\n")
+       "Display detailed prefix count information\n"
+       "JavaScript Object Notation\n")
 {
   struct peer *peer;
 {
   struct peer *peer;
+  u_char use_json;
+
+  if (argv[argc - 1] && strcmp(argv[argc - 1], "json") == 0)
+    use_json = 1;
+  else
+    use_json = 0;
 
 
-  peer = peer_lookup_in_view (vty, NULL, argv[0]);  
+  peer = peer_lookup_in_view (vty, NULL, argv[0], use_json);
   if (! peer) 
     return CMD_WARNING;
  
   if (! peer) 
     return CMD_WARNING;
  
-  return bgp_peer_counts (vty, peer, AFI_IP6, SAFI_UNICAST);
+  return bgp_peer_counts (vty, peer, AFI_IP6, SAFI_UNICAST, use_json);
 }
 
 DEFUN (show_ip_bgp_ipv4_neighbor_prefix_counts,
        show_ip_bgp_ipv4_neighbor_prefix_counts_cmd,
 }
 
 DEFUN (show_ip_bgp_ipv4_neighbor_prefix_counts,
        show_ip_bgp_ipv4_neighbor_prefix_counts_cmd,
-       "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X|WORD) prefix-counts",
+       "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X|WORD) prefix-counts {json}",
        SHOW_STR
        IP_STR
        BGP_STR
        SHOW_STR
        IP_STR
        BGP_STR
@@ -11686,23 +11956,30 @@ DEFUN (show_ip_bgp_ipv4_neighbor_prefix_counts,
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
-       "Display detailed prefix count information\n")
+       "Display detailed prefix count information\n"
+       "JavaScript Object Notation\n")
 {
   struct peer *peer;
 {
   struct peer *peer;
+  u_char use_json;
+
+  if (argv[argc - 1] && strcmp(argv[argc - 1], "json") == 0)
+    use_json = 1;
+  else
+    use_json = 0;
 
 
-  peer = peer_lookup_in_view (vty, NULL, argv[1]);
+  peer = peer_lookup_in_view (vty, NULL, argv[1], use_json);
   if (! peer)
     return CMD_WARNING;
 
   if (strncmp (argv[0], "m", 1) == 0)
   if (! peer)
     return CMD_WARNING;
 
   if (strncmp (argv[0], "m", 1) == 0)
-    return bgp_peer_counts (vty, peer, AFI_IP, SAFI_MULTICAST);
+    return bgp_peer_counts (vty, peer, AFI_IP, SAFI_MULTICAST, use_json);
 
 
-  return bgp_peer_counts (vty, peer, AFI_IP, SAFI_UNICAST);
+  return bgp_peer_counts (vty, peer, AFI_IP, SAFI_UNICAST, use_json);
 }
 
 DEFUN (show_ip_bgp_vpnv4_neighbor_prefix_counts,
        show_ip_bgp_vpnv4_neighbor_prefix_counts_cmd,
 }
 
 DEFUN (show_ip_bgp_vpnv4_neighbor_prefix_counts,
        show_ip_bgp_vpnv4_neighbor_prefix_counts_cmd,
-       "show ip bgp vpnv4 all neighbors (A.B.C.D|X:X::X:X|WORD) prefix-counts",
+       "show ip bgp vpnv4 all neighbors (A.B.C.D|X:X::X:X|WORD) prefix-counts {json}",
        SHOW_STR
        IP_STR
        BGP_STR
        SHOW_STR
        IP_STR
        BGP_STR
@@ -11713,20 +11990,27 @@ DEFUN (show_ip_bgp_vpnv4_neighbor_prefix_counts,
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
-       "Display detailed prefix count information\n")
+       "Display detailed prefix count information\n"
+       "JavaScript Object Notation\n")
 {
   struct peer *peer;
 {
   struct peer *peer;
+  u_char use_json;
+
+  if (argv[argc - 1] && strcmp(argv[argc - 1], "json") == 0)
+    use_json = 1;
+  else
+    use_json = 0;
 
 
-  peer = peer_lookup_in_view (vty, NULL, argv[0]);
+  peer = peer_lookup_in_view (vty, NULL, argv[0], use_json);
   if (! peer)
     return CMD_WARNING;
   
   if (! peer)
     return CMD_WARNING;
   
-  return bgp_peer_counts (vty, peer, AFI_IP, SAFI_MPLS_VPN);
+  return bgp_peer_counts (vty, peer, AFI_IP, SAFI_MPLS_VPN, use_json);
 }
 
 static void
 show_adj_route (struct vty *vty, struct peer *peer, afi_t afi, safi_t safi,
 }
 
 static void
 show_adj_route (struct vty *vty, struct peer *peer, afi_t afi, safi_t safi,
-               int in, const char *rmap_name)
+                int in, const char *rmap_name, u_char use_json, json_object *json)
 {
   struct bgp_table *table;
   struct bgp_adj_in *ain;
 {
   struct bgp_table *table;
   struct bgp_adj_in *ain;
@@ -11741,11 +12025,46 @@ show_adj_route (struct vty *vty, struct peer *peer, afi_t afi, safi_t safi,
   struct attr_extra extra;
   int ret;
   struct update_subgroup *subgrp;
   struct attr_extra extra;
   int ret;
   struct update_subgroup *subgrp;
+  json_object *json_scode = NULL;
+  json_object *json_ocode = NULL;
+  json_object *json_ar = NULL;
+
+  if (use_json)
+    {
+      json_scode = json_object_new_object();
+      json_ocode = json_object_new_object();
+      json_ar = json_object_new_object();
+
+      json_object_string_add(json_scode, "suppressed", "s");
+      json_object_string_add(json_scode, "damped", "d");
+      json_object_string_add(json_scode, "history", "h");
+      json_object_string_add(json_scode, "valid", "*");
+      json_object_string_add(json_scode, "best", ">");
+      json_object_string_add(json_scode, "multipath", "=");
+      json_object_string_add(json_scode, "internal", "i");
+      json_object_string_add(json_scode, "ribFailure", "r");
+      json_object_string_add(json_scode, "stale", "S");
+      json_object_string_add(json_scode, "removed", "R");
+
+      json_object_string_add(json_ocode, "igp", "i");
+      json_object_string_add(json_ocode, "egp", "e");
+      json_object_string_add(json_ocode, "incomplete", "?");
+    }
 
   bgp = peer->bgp;
 
   if (! bgp)
 
   bgp = peer->bgp;
 
   if (! bgp)
-    return;
+    {
+      if (use_json)
+        {
+          json_object_string_add(json, "alert", "no BGP");
+          vty_out (vty, "%s%s", json_object_to_json_string(json), VTY_NEWLINE);
+          json_object_free(json);
+        }
+      else
+        vty_out (vty, "%% No bgp%s", VTY_NEWLINE);
+      return;
+    }
 
   table = bgp->rib[afi][safi];
 
 
   table = bgp->rib[afi][safi];
 
@@ -11754,114 +12073,180 @@ show_adj_route (struct vty *vty, struct peer *peer, afi_t afi, safi_t safi,
 
   if (!in && subgrp && CHECK_FLAG (subgrp->sflags, SUBGRP_STATUS_DEFAULT_ORIGINATE))
     {
 
   if (!in && subgrp && CHECK_FLAG (subgrp->sflags, SUBGRP_STATUS_DEFAULT_ORIGINATE))
     {
-      vty_out (vty, "BGP table version is %" PRIu64 ", local router ID is %s%s", table->version, inet_ntoa (bgp->router_id), VTY_NEWLINE);
-      vty_out (vty, BGP_SHOW_SCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
-      vty_out (vty, BGP_SHOW_OCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
+      if (use_json)
+        {
+          json_object_int_add(json, "bgpTableVersion", table->version);
+          json_object_string_add(json, "bgpLocalRouterId", inet_ntoa (bgp->router_id));
+          json_object_object_add(json, "bgpStatusCodes", json_scode);
+          json_object_object_add(json, "bgpOriginCodes", json_ocode);
+          json_object_string_add(json, "bgpOriginatingDefaultNetwork", "0.0.0.0");
+        }
+      else
+        {
+          vty_out (vty, "BGP table version is %" PRIu64 ", local router ID is %s%s", table->version, inet_ntoa (bgp->router_id), VTY_NEWLINE);
+          vty_out (vty, BGP_SHOW_SCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
+          vty_out (vty, BGP_SHOW_OCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
 
 
-      vty_out (vty, "Originating default network 0.0.0.0%s%s",
-              VTY_NEWLINE, VTY_NEWLINE);
+          vty_out (vty, "Originating default network 0.0.0.0%s%s",
+                   VTY_NEWLINE, VTY_NEWLINE);
+        }
       header1 = 0;
     }
 
   attr.extra = &extra;
   for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
       header1 = 0;
     }
 
   attr.extra = &extra;
   for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
-    if (in)
-      {
-       for (ain = rn->adj_in; ain; ain = ain->next)
-         if (ain->peer == peer)
-           {
-             if (header1)
-               {
-                 vty_out (vty, "BGP table version is 0, local router ID is %s%s", inet_ntoa (bgp->router_id), VTY_NEWLINE);
-                 vty_out (vty, BGP_SHOW_SCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
-                 vty_out (vty, BGP_SHOW_OCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
-                 header1 = 0;
-               }
-             if (header2)
-               {
-                 vty_out (vty, BGP_SHOW_HEADER, VTY_NEWLINE);
-                 header2 = 0;
-               }
-             if (ain->attr)
-               {
-                 bgp_attr_dup(&attr, ain->attr);
-                 if (bgp_input_modifier(peer, &rn->p, &attr, afi,
-                                        safi, rmap_name) != RMAP_DENY)
-                   {
-                     route_vty_out_tmp (vty, &rn->p, &attr, safi);
-                     output_count++;
-                   }
-                 else
-                   filtered_count++;
-               }
-           }
-      }
-    else
-      {
-       adj = bgp_adj_peer_lookup(peer, rn);
-       if (adj)
-         {
-           if (header1)
-             {
-               vty_out (vty, "BGP table version is %" PRIu64 ", local router ID "
-                        "is %s%s", table->version,
-                        inet_ntoa (bgp->router_id), VTY_NEWLINE);
-               vty_out (vty, BGP_SHOW_SCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
-               vty_out (vty, BGP_SHOW_OCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
-               header1 = 0;
-             }
-           if (header2)
-             {
-               vty_out (vty, BGP_SHOW_HEADER, VTY_NEWLINE);
-               header2 = 0;
-             }
-           if (adj->attr)
-             {
-                bgp_attr_dup(&attr, adj->attr);
-                ret = bgp_output_modifier(peer, &rn->p, &attr, afi,
-                                          safi, rmap_name);
-
-               if (ret != RMAP_DENY)
-                 {
-                   route_vty_out_tmp (vty, &rn->p, &attr, safi);
-                   output_count++;
-                 }
-               else
-                 filtered_count++;
-             }
-         }
-      }
+    {
+      if (in)
+        {
+          for (ain = rn->adj_in; ain; ain = ain->next)
+            {
+              if (ain->peer == peer)
+                {
+                  if (header1)
+                    {
+                      if (use_json)
+                        {
+                          json_object_int_add(json, "bgpTableVersion", 0);
+                          json_object_string_add(json, "bgpLocalRouterId", inet_ntoa (bgp->router_id));
+                          json_object_object_add(json, "bgpStatusCodes", json_scode);
+                          json_object_object_add(json, "bgpOriginCodes", json_ocode);
+                        }
+                      else
+                        {
+                          vty_out (vty, "BGP table version is 0, local router ID is %s%s", inet_ntoa (bgp->router_id), VTY_NEWLINE);
+                          vty_out (vty, BGP_SHOW_SCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
+                          vty_out (vty, BGP_SHOW_OCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
+                        }
+                      header1 = 0;
+                    }
+                  if (header2)
+                    {
+                      if (!use_json)
+                        vty_out (vty, BGP_SHOW_HEADER, VTY_NEWLINE);
+                      header2 = 0;
+                    }
+                  if (ain->attr)
+                    {
+                      bgp_attr_dup(&attr, ain->attr);
+                      if (bgp_input_modifier(peer, &rn->p, &attr, afi, safi, rmap_name) != RMAP_DENY)
+                        {
+                          route_vty_out_tmp (vty, &rn->p, &attr, safi, use_json, json_ar);
+                          output_count++;
+                        }
+                      else
+                        filtered_count++;
+                    }
+                }
+            }
+        }
+      else
+        {
+          adj = bgp_adj_peer_lookup(peer, rn);
+          if (adj)
+            {
+              if (header1)
+                {
+                  if (use_json)
+                    {
+                      json_object_int_add(json, "bgpTableVersion", table->version);
+                      json_object_string_add(json, "bgpLocalRouterId", inet_ntoa (bgp->router_id));
+                      json_object_object_add(json, "bgpStatusCodes", json_scode);
+                      json_object_object_add(json, "bgpOriginCodes", json_ocode);
+                    }
+                  else
+                    {
+                      vty_out (vty, "BGP table version is %" PRIu64 ", local router ID is %s%s", table->version,
+                               inet_ntoa (bgp->router_id), VTY_NEWLINE);
+                      vty_out (vty, BGP_SHOW_SCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
+                      vty_out (vty, BGP_SHOW_OCODE_HEADER, VTY_NEWLINE, VTY_NEWLINE);
+                    }
+                  header1 = 0;
+                }
+              if (header2)
+                {
+                  if (!use_json)
+                    vty_out (vty, BGP_SHOW_HEADER, VTY_NEWLINE);
+                  header2 = 0;
+                }
+              if (adj->attr)
+                {
+                  bgp_attr_dup(&attr, adj->attr);
+                  ret = bgp_output_modifier(peer, &rn->p, &attr, afi, safi, rmap_name);
+                  if (ret != RMAP_DENY)
+                    {
+                      route_vty_out_tmp (vty, &rn->p, &attr, safi, use_json, json_ar);
+                      output_count++;
+                    }
+                  else
+                    filtered_count++;
+                }
+            }
+        }
+    }
+  if (use_json)
+    json_object_object_add(json, "advertisedRoutes", json_ar);
 
   if (output_count != 0)
 
   if (output_count != 0)
-    vty_out (vty, "%sTotal number of prefixes %ld%s",
-            VTY_NEWLINE, output_count, VTY_NEWLINE);
+    {
+      if (use_json)
+        json_object_int_add(json, "totalPrefixCounter", output_count);
+      else
+        vty_out (vty, "%sTotal number of prefixes %ld%s",
+                 VTY_NEWLINE, output_count, VTY_NEWLINE);
+    }
+  if (use_json)
+    {
+      vty_out (vty, "%s%s", json_object_to_json_string(json), VTY_NEWLINE);
+      json_object_free(json);
+    }
+
 }
 
 static int
 peer_adj_routes (struct vty *vty, struct peer *peer, afi_t afi, safi_t safi,
 }
 
 static int
 peer_adj_routes (struct vty *vty, struct peer *peer, afi_t afi, safi_t safi,
-                int in, const char *rmap_name)
-{    
-  if (! peer || ! peer->afc[afi][safi])
+                 int in, const char *rmap_name, u_char use_json)
+{
+  json_object *json = NULL;
+
+  if (use_json)
+    json = json_object_new_object();
+
+  if (!peer || !peer->afc[afi][safi])
     {
     {
-      vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
+      if (use_json)
+        {
+          json_object_string_add(json, "warning", "No such neighbor or address family");
+          vty_out (vty, "%s%s", json_object_to_json_string(json), VTY_NEWLINE);
+          json_object_free(json);
+        }
+      else
+        vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
+
       return CMD_WARNING;
     }
 
       return CMD_WARNING;
     }
 
-  if (in && ! CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG))
+  if (in && !CHECK_FLAG(peer->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG))
     {
     {
-      vty_out (vty, "%% Inbound soft reconfiguration not enabled%s",
-              VTY_NEWLINE);
+      if (use_json)
+        {
+          json_object_string_add(json, "warning", "Inbound soft reconfiguration not enabled");
+          vty_out (vty, "%s%s", json_object_to_json_string(json), VTY_NEWLINE);
+          json_object_free(json);
+        }
+      else
+        vty_out (vty, "%% Inbound soft reconfiguration not enabled%s", VTY_NEWLINE);
+
       return CMD_WARNING;
     }
 
       return CMD_WARNING;
     }
 
-  show_adj_route (vty, peer, afi, safi, in, rmap_name);
+  show_adj_route (vty, peer, afi, safi, in, rmap_name, use_json, json);
 
   return CMD_SUCCESS;
 }
 
 DEFUN (show_ip_bgp_view_neighbor_advertised_route,
        show_ip_bgp_view_neighbor_advertised_route_cmd,
 
   return CMD_SUCCESS;
 }
 
 DEFUN (show_ip_bgp_view_neighbor_advertised_route,
        show_ip_bgp_view_neighbor_advertised_route_cmd,
-       "show ip bgp view WORD neighbors (A.B.C.D|X:X::X:X|WORD) advertised-routes",
+       "show ip bgp view WORD neighbors (A.B.C.D|X:X::X:X|WORD) advertised-routes {json}",
        SHOW_STR
        IP_STR
        BGP_STR
        SHOW_STR
        IP_STR
        BGP_STR
@@ -11870,24 +12255,32 @@ DEFUN (show_ip_bgp_view_neighbor_advertised_route,
        "Detailed information on TCP and BGP neighbor connections\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Detailed information on TCP and BGP neighbor connections\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
-       "Display the routes advertised to a BGP neighbor\n")
+       "Display the routes advertised to a BGP neighbor\n"
+       "JavaScript Object Notation\n")
 {
   struct peer *peer;
 
 {
   struct peer *peer;
 
-  if (argc == 2)
-    peer = peer_lookup_in_view (vty, argv[0], argv[1]);
+  u_char use_json;
+
+  if (argv[argc - 1] && strcmp(argv[argc - 1], "json") == 0)
+    use_json = 1;
+  else
+    use_json = 0;
+
+  if (argc == 3 || (argc == 2 && argv[1] && strcmp(argv[1], "json") != 0))
+    peer = peer_lookup_in_view (vty, argv[0], argv[1], use_json);
   else
   else
-    peer = peer_lookup_in_view (vty, NULL, argv[0]);
+    peer = peer_lookup_in_view (vty, NULL, argv[0], use_json);
 
   if (! peer) 
     return CMD_WARNING;
 
 
   if (! peer) 
     return CMD_WARNING;
 
-  return peer_adj_routes (vty, peer, AFI_IP, SAFI_UNICAST, 0, NULL);
+  return peer_adj_routes (vty, peer, AFI_IP, SAFI_UNICAST, 0, NULL, use_json);
 }
 
 DEFUN (show_ip_bgp_neighbor_advertised_route,
        show_ip_bgp_neighbor_advertised_route_cmd,
 }
 
 DEFUN (show_ip_bgp_neighbor_advertised_route,
        show_ip_bgp_neighbor_advertised_route_cmd,
-       "show ip bgp neighbors (A.B.C.D|X:X::X:X|WORD) advertised-routes",
+       "show ip bgp neighbors (A.B.C.D|X:X::X:X|WORD) advertised-routes {json}",
        SHOW_STR
        IP_STR
        BGP_STR
        SHOW_STR
        IP_STR
        BGP_STR
@@ -11895,26 +12288,34 @@ DEFUN (show_ip_bgp_neighbor_advertised_route,
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
-       "Display the routes advertised to a BGP neighbor\n")
+       "Display the routes advertised to a BGP neighbor\n"
+       "JavaScript Object Notation\n")
 
 {
   struct peer *peer;
   const char *rmap_name = NULL;
 
 {
   struct peer *peer;
   const char *rmap_name = NULL;
+  u_char use_json;
+
+  if (argv[argc - 1] && strcmp(argv[argc - 1], "json") == 0)
+    use_json = 1;
+  else
+    use_json = 0;
 
 
-  peer = peer_lookup_in_view (vty, NULL, argv[0]);
+  peer = peer_lookup_in_view (vty, NULL, argv[0], use_json);
 
   if (! peer)
     return CMD_WARNING;
 
 
   if (! peer)
     return CMD_WARNING;
 
-  if (argc == 2)
+  if ((argc == 2 && argv[1] && strcmp(argv[1], "json") != 0)
+      || (argc == 3))
     rmap_name = argv[1];
 
     rmap_name = argv[1];
 
-  return peer_adj_routes (vty, peer, AFI_IP, SAFI_UNICAST, 0, rmap_name);
+  return peer_adj_routes (vty, peer, AFI_IP, SAFI_UNICAST, 0, rmap_name, use_json);
 }
 
 ALIAS (show_ip_bgp_neighbor_advertised_route,
        show_ip_bgp_neighbor_advertised_route_rmap_cmd,
 }
 
 ALIAS (show_ip_bgp_neighbor_advertised_route,
        show_ip_bgp_neighbor_advertised_route_rmap_cmd,
-       "show ip bgp neighbors (A.B.C.D|X:X::X:X|WORD) advertised-routes route-map WORD",
+       "show ip bgp neighbors (A.B.C.D|X:X::X:X|WORD) advertised-routes route-map WORD {json}",
        SHOW_STR
        IP_STR
        BGP_STR
        SHOW_STR
        IP_STR
        BGP_STR
@@ -11922,11 +12323,12 @@ ALIAS (show_ip_bgp_neighbor_advertised_route,
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
-       "Display the routes advertised to a BGP neighbor\n")
+       "Display the routes advertised to a BGP neighbor\n"
+       "JavaScript Object Notation\n")
 
 DEFUN (show_ip_bgp_ipv4_neighbor_advertised_route,
        show_ip_bgp_ipv4_neighbor_advertised_route_cmd,
 
 DEFUN (show_ip_bgp_ipv4_neighbor_advertised_route,
        show_ip_bgp_ipv4_neighbor_advertised_route_cmd,
-       "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X|WORD) advertised-routes",
+       "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X|WORD) advertised-routes {json}",
        SHOW_STR
        IP_STR
        BGP_STR
        SHOW_STR
        IP_STR
        BGP_STR
@@ -11937,27 +12339,34 @@ DEFUN (show_ip_bgp_ipv4_neighbor_advertised_route,
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
-       "Display the routes advertised to a BGP neighbor\n")
+       "Display the routes advertised to a BGP neighbor\n"
+       "JavaScript Object Notation\n")
 {
   struct peer *peer;
   const char *rmap_name = NULL;
 {
   struct peer *peer;
   const char *rmap_name = NULL;
+  u_char use_json;
+
+  if (argv[argc - 1] && strcmp(argv[argc - 1], "json") == 0)
+    use_json = 1;
+  else
+    use_json = 0;
 
 
-  peer = peer_lookup_in_view (vty, NULL, argv[1]);
+  peer = peer_lookup_in_view (vty, NULL, argv[1], use_json);
   if (! peer)
     return CMD_WARNING;
 
   if (! peer)
     return CMD_WARNING;
 
-  if (argc == 3)
+  if ((argc == 4) || (argc == 3 && argv[2] && strcmp(argv[2], "json") != 0))
     rmap_name = argv[2];
 
   if (strncmp (argv[0], "m", 1) == 0)
     rmap_name = argv[2];
 
   if (strncmp (argv[0], "m", 1) == 0)
-    return peer_adj_routes (vty, peer, AFI_IP, SAFI_MULTICAST, 0, rmap_name);
-
-  return peer_adj_routes (vty, peer, AFI_IP, SAFI_UNICAST, 0, rmap_name);
+    return peer_adj_routes (vty, peer, AFI_IP, SAFI_MULTICAST, 0, rmap_name, use_json);
+  else
+    return peer_adj_routes (vty, peer, AFI_IP, SAFI_UNICAST, 0, rmap_name, use_json);
 }
 
 ALIAS (show_ip_bgp_ipv4_neighbor_advertised_route,
        show_ip_bgp_ipv4_neighbor_advertised_route_rmap_cmd,
 }
 
 ALIAS (show_ip_bgp_ipv4_neighbor_advertised_route,
        show_ip_bgp_ipv4_neighbor_advertised_route_rmap_cmd,
-       "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X|WORD) advertised-routes route-map WORD",
+       "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X|WORD) advertised-routes route-map WORD {json}",
        SHOW_STR
        IP_STR
        BGP_STR
        SHOW_STR
        IP_STR
        BGP_STR
@@ -11969,12 +12378,13 @@ ALIAS (show_ip_bgp_ipv4_neighbor_advertised_route,
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        "Display the routes advertised to a BGP neighbor\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        "Display the routes advertised to a BGP neighbor\n"
-       "Route-map to control what is displayed\n")
+       "Route-map to control what is displayed\n"
+       "JavaScript Object Notation\n")
 
 #ifdef HAVE_IPV6
 DEFUN (show_bgp_view_neighbor_advertised_route,
        show_bgp_view_neighbor_advertised_route_cmd,
 
 #ifdef HAVE_IPV6
 DEFUN (show_bgp_view_neighbor_advertised_route,
        show_bgp_view_neighbor_advertised_route_cmd,
-       "show bgp view WORD neighbors (A.B.C.D|X:X::X:X|WORD) advertised-routes",
+       "show bgp view WORD neighbors (A.B.C.D|X:X::X:X|WORD) advertised-routes {json}",
        SHOW_STR
        BGP_STR
        "BGP view\n"
        SHOW_STR
        BGP_STR
        "BGP view\n"
@@ -11983,24 +12393,31 @@ DEFUN (show_bgp_view_neighbor_advertised_route,
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
-       "Display the routes advertised to a BGP neighbor\n")
+       "Display the routes advertised to a BGP neighbor\n"
+       "JavaScript Object Notation\n")
 {
   struct peer *peer;
 {
   struct peer *peer;
+  u_char use_json;
 
 
-  if (argc == 2)
-    peer = peer_lookup_in_view (vty, argv[0], argv[1]);
+  if (argv[argc - 1] && strcmp(argv[argc - 1], "json") == 0)
+    use_json = 1;
+  else
+    use_json = 0;
+
+  if (argc == 3 || (argc == 2 && argv[1] && strcmp(argv[1], "json") != 0))
+    peer = peer_lookup_in_view (vty, argv[0], argv[1], use_json);
   else
   else
-    peer = peer_lookup_in_view (vty, NULL, argv[0]);
+    peer = peer_lookup_in_view (vty, NULL, argv[0], use_json);
 
   if (! peer)
     return CMD_WARNING;
 
 
   if (! peer)
     return CMD_WARNING;
 
-  return peer_adj_routes (vty, peer, AFI_IP6, SAFI_UNICAST, 0, NULL);
+  return peer_adj_routes (vty, peer, AFI_IP6, SAFI_UNICAST, 0, NULL, use_json);
 }
 
 ALIAS (show_bgp_view_neighbor_advertised_route,
        show_bgp_view_ipv6_neighbor_advertised_route_cmd,
 }
 
 ALIAS (show_bgp_view_neighbor_advertised_route,
        show_bgp_view_ipv6_neighbor_advertised_route_cmd,
-       "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X|WORD) advertised-routes",
+       "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X|WORD) advertised-routes {json}",
        SHOW_STR
        BGP_STR
        "BGP view\n"
        SHOW_STR
        BGP_STR
        "BGP view\n"
@@ -12010,60 +12427,45 @@ ALIAS (show_bgp_view_neighbor_advertised_route,
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
-       "Display the routes advertised to a BGP neighbor\n")
+       "Display the routes advertised to a BGP neighbor\n"
+       "JavaScript Object Notation\n")
 
 DEFUN (show_bgp_neighbor_advertised_route,
        show_bgp_neighbor_advertised_route_cmd,
 
 DEFUN (show_bgp_neighbor_advertised_route,
        show_bgp_neighbor_advertised_route_cmd,
-       "show bgp neighbors (A.B.C.D|X:X::X:X|WORD) advertised-routes",
+       "show bgp neighbors (A.B.C.D|X:X::X:X|WORD) advertised-routes {json}",
        SHOW_STR
        BGP_STR
        "Detailed information on TCP and BGP neighbor connections\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        SHOW_STR
        BGP_STR
        "Detailed information on TCP and BGP neighbor connections\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
-       "Display the routes advertised to a BGP neighbor\n")
+       "Display the routes advertised to a BGP neighbor\n"
+       "JavaScript Object Notation\n")
 
 {
   struct peer *peer;
   const char *rmap_name = NULL;
 
 {
   struct peer *peer;
   const char *rmap_name = NULL;
+  u_char use_json;
 
 
-  peer = peer_lookup_in_view (vty, NULL, argv[0]);
+  if (argv[argc - 1] && strcmp(argv[argc - 1], "json") == 0)
+    use_json = 1;
+  else
+    use_json = 0;
 
 
-  if (! peer)
+  peer = peer_lookup_in_view (vty, NULL, argv[0], use_json);
+
+  if (!peer)
     return CMD_WARNING;
 
     return CMD_WARNING;
 
-  if (argc == 2)
+  if (argc == 3 || (argc == 2 && argv[1] && strcmp(argv[1], "json") != 0))
     rmap_name = argv[1];
 
     rmap_name = argv[1];
 
-  return peer_adj_routes (vty, peer, AFI_IP6, SAFI_UNICAST, 0, rmap_name);
+  return peer_adj_routes (vty, peer, AFI_IP6, SAFI_UNICAST, 0, rmap_name, use_json);
 }
 
 }
 
-ALIAS (show_bgp_neighbor_advertised_route,
-       show_bgp_neighbor_advertised_route_rmap_cmd,
-       "show bgp neighbors (A.B.C.D|X:X::X:X|WORD) advertised-routes route-map WORD",
-       SHOW_STR
-       BGP_STR
-       "Detailed information on TCP and BGP neighbor connections\n"
-       "Neighbor to display information about\n"
-       "Neighbor to display information about\n"
-       "Neighbor on bgp configured interface\n"
-       "Display the routes advertised to a BGP neighbor\n")
-
 ALIAS (show_bgp_neighbor_advertised_route,
        show_bgp_ipv6_neighbor_advertised_route_cmd,
 ALIAS (show_bgp_neighbor_advertised_route,
        show_bgp_ipv6_neighbor_advertised_route_cmd,
-       "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X|WORD) advertised-routes",
-       SHOW_STR
-       BGP_STR
-       "Address family\n"
-       "Detailed information on TCP and BGP neighbor connections\n"
-       "Neighbor to display information about\n"
-       "Neighbor to display information about\n"
-       "Neighbor on bgp configured interface\n"
-       "Display the routes advertised to a BGP neighbor\n")
-
-ALIAS (show_bgp_neighbor_advertised_route,
-       show_bgp_ipv6_neighbor_advertised_route_rmap_cmd,
-       "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X|WORD) advertised-routes route-map WORD",
+       "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X|WORD) advertised-routes {json}",
        SHOW_STR
        BGP_STR
        "Address family\n"
        SHOW_STR
        BGP_STR
        "Address family\n"
@@ -12071,12 +12473,13 @@ ALIAS (show_bgp_neighbor_advertised_route,
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
-       "Display the routes advertised to a BGP neighbor\n")
+       "Display the routes advertised to a BGP neighbor\n"
+       "JavaScript Object Notation\n")
 
 /* old command */
 ALIAS (show_bgp_neighbor_advertised_route,
        ipv6_bgp_neighbor_advertised_route_cmd,
 
 /* old command */
 ALIAS (show_bgp_neighbor_advertised_route,
        ipv6_bgp_neighbor_advertised_route_cmd,
-       "show ipv6 bgp neighbors (A.B.C.D|X:X::X:X|WORD) advertised-routes",
+       "show ipv6 bgp neighbors (A.B.C.D|X:X::X:X|WORD) advertised-routes {json}",
        SHOW_STR
        IPV6_STR
        BGP_STR
        SHOW_STR
        IPV6_STR
        BGP_STR
@@ -12084,12 +12487,13 @@ ALIAS (show_bgp_neighbor_advertised_route,
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
-       "Display the routes advertised to a BGP neighbor\n")
+       "Display the routes advertised to a BGP neighbor\n"
+       "JavaScript Object Notation\n")
   
 /* old command */
 DEFUN (ipv6_mbgp_neighbor_advertised_route,
        ipv6_mbgp_neighbor_advertised_route_cmd,
   
 /* old command */
 DEFUN (ipv6_mbgp_neighbor_advertised_route,
        ipv6_mbgp_neighbor_advertised_route_cmd,
-       "show ipv6 mbgp neighbors (A.B.C.D|X:X::X:X|WORD) advertised-routes",
+       "show ipv6 mbgp neighbors (A.B.C.D|X:X::X:X|WORD) advertised-routes {json}",
        SHOW_STR
        IPV6_STR
        MBGP_STR
        SHOW_STR
        IPV6_STR
        MBGP_STR
@@ -12098,21 +12502,28 @@ DEFUN (ipv6_mbgp_neighbor_advertised_route,
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        "Neighbor on bgp configured interface\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        "Neighbor on bgp configured interface\n"
-       "Display the routes advertised to a BGP neighbor\n")
+       "Display the routes advertised to a BGP neighbor\n"
+       "JavaScript Object Notation\n")
 {
   struct peer *peer;
 {
   struct peer *peer;
+  u_char use_json;
+
+  if (argv[argc - 1] && strcmp(argv[argc - 1], "json") == 0)
+    use_json = 1;
+  else
+    use_json = 0;
 
 
-  peer = peer_lookup_in_view (vty, NULL, argv[0]);
+  peer = peer_lookup_in_view (vty, NULL, argv[0], use_json);
   if (! peer)
   if (! peer)
-    return CMD_WARNING;  
+    return CMD_WARNING;
 
 
-  return peer_adj_routes (vty, peer, AFI_IP6, SAFI_MULTICAST, 0, NULL);
+  return peer_adj_routes (vty, peer, AFI_IP6, SAFI_MULTICAST, 0, NULL, use_json);
 }
 #endif /* HAVE_IPV6 */
 
 DEFUN (show_bgp_view_neighbor_received_routes,
        show_bgp_view_neighbor_received_routes_cmd,
 }
 #endif /* HAVE_IPV6 */
 
 DEFUN (show_bgp_view_neighbor_received_routes,
        show_bgp_view_neighbor_received_routes_cmd,
-       "show bgp view WORD neighbors (A.B.C.D|X:X::X:X|WORD) received-routes",
+       "show bgp view WORD neighbors (A.B.C.D|X:X::X:X|WORD) received-routes {json}",
        SHOW_STR
        BGP_STR
        "BGP view\n"
        SHOW_STR
        BGP_STR
        "BGP view\n"
@@ -12121,24 +12532,41 @@ DEFUN (show_bgp_view_neighbor_received_routes,
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
-       "Display the received routes from neighbor\n")
+       "Display the received routes from neighbor\n"
+       "JavaScript Object Notation\n")
 {
   struct peer *peer;
 {
   struct peer *peer;
+  u_char use_json;
 
 
-  if (argc == 2)
-    peer = peer_lookup_in_view (vty, argv[0], argv[1]);
+  if (argv[argc - 1] && strcmp(argv[argc - 1], "json") == 0)
+    use_json = 1;
+  else
+    use_json = 0;
+
+  if (use_json)
+    {
+      if (argc == 3)
+        peer = peer_lookup_in_view (vty, argv[0], argv[1], use_json);
+      else
+        peer = peer_lookup_in_view (vty, NULL, argv[0], use_json);
+    }
   else
   else
-    peer = peer_lookup_in_view (vty, NULL, argv[0]);
+    {
+      if (argc == 2)
+        peer = peer_lookup_in_view (vty, argv[0], argv[1], use_json);
+      else
+        peer = peer_lookup_in_view (vty, NULL, argv[0], use_json);
+    }
 
   if (! peer)
     return CMD_WARNING;
 
 
   if (! peer)
     return CMD_WARNING;
 
-  return peer_adj_routes (vty, peer, AFI_IP6, SAFI_UNICAST, 1, NULL);
+  return peer_adj_routes (vty, peer, AFI_IP6, SAFI_UNICAST, 1, NULL, use_json);
 }
 
 DEFUN (show_ip_bgp_view_neighbor_received_routes,
        show_ip_bgp_view_neighbor_received_routes_cmd,
 }
 
 DEFUN (show_ip_bgp_view_neighbor_received_routes,
        show_ip_bgp_view_neighbor_received_routes_cmd,
-       "show ip bgp view WORD neighbors (A.B.C.D|X:X::X:X|WORD) received-routes",
+       "show ip bgp view WORD neighbors (A.B.C.D|X:X::X:X|WORD) received-routes {json}",
        SHOW_STR
        IP_STR
        BGP_STR
        SHOW_STR
        IP_STR
        BGP_STR
@@ -12148,24 +12576,31 @@ DEFUN (show_ip_bgp_view_neighbor_received_routes,
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
-       "Display the received routes from neighbor\n")
+       "Display the received routes from neighbor\n"
+       "JavaScript Object Notation\n")
 {
   struct peer *peer;
 {
   struct peer *peer;
+  u_char use_json;
 
 
-  if (argc == 2)
-    peer = peer_lookup_in_view (vty, argv[0], argv[1]);
+  if (argv[argc - 1] && strcmp(argv[argc - 1], "json") == 0)
+    use_json = 1;
+  else
+    use_json = 0;
+
+  if (argc == 3 || (argc == 2 && argv[1] && strcmp(argv[1], "json") != 0))
+    peer = peer_lookup_in_view (vty, argv[0], argv[1], use_json);
   else
   else
-    peer = peer_lookup_in_view (vty, NULL, argv[0]);
+    peer = peer_lookup_in_view (vty, NULL, argv[0], use_json);
 
   if (! peer)
     return CMD_WARNING;
 
 
   if (! peer)
     return CMD_WARNING;
 
-  return peer_adj_routes (vty, peer, AFI_IP, SAFI_UNICAST, 1, NULL);
+  return peer_adj_routes (vty, peer, AFI_IP, SAFI_UNICAST, 1, NULL, use_json);
 }
 
 ALIAS (show_bgp_view_neighbor_received_routes,
        show_bgp_view_ipv6_neighbor_received_routes_cmd,
 }
 
 ALIAS (show_bgp_view_neighbor_received_routes,
        show_bgp_view_ipv6_neighbor_received_routes_cmd,
-       "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X|WORD) received-routes",
+       "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X|WORD) received-routes {json}",
        SHOW_STR
        BGP_STR
        "BGP view\n"
        SHOW_STR
        BGP_STR
        "BGP view\n"
@@ -12175,11 +12610,12 @@ ALIAS (show_bgp_view_neighbor_received_routes,
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
-       "Display the received routes from neighbor\n")
+       "Display the received routes from neighbor\n"
+       "JavaScript Object Notation\n")
 
 DEFUN (show_ip_bgp_neighbor_received_routes,
        show_ip_bgp_neighbor_received_routes_cmd,
 
 DEFUN (show_ip_bgp_neighbor_received_routes,
        show_ip_bgp_neighbor_received_routes_cmd,
-       "show ip bgp neighbors (A.B.C.D|X:X::X:X|WORD) received-routes",
+       "show ip bgp neighbors (A.B.C.D|X:X::X:X|WORD) received-routes {json}",
        SHOW_STR
        IP_STR
        BGP_STR
        SHOW_STR
        IP_STR
        BGP_STR
@@ -12187,26 +12623,33 @@ DEFUN (show_ip_bgp_neighbor_received_routes,
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
-       "Display the received routes from neighbor\n")
+       "Display the received routes from neighbor\n"
+       "JavaScript Object Notation\n")
 
 {
   struct peer *peer;
   const char *rmap_name = NULL;
 
 {
   struct peer *peer;
   const char *rmap_name = NULL;
+  u_char use_json;
+
+  if (argv[argc - 1] && strcmp(argv[argc - 1], "json") == 0)
+    use_json = 1;
+  else
+    use_json = 0;
 
 
-  peer = peer_lookup_in_view (vty, NULL, argv[0]);
+  peer = peer_lookup_in_view (vty, NULL, argv[0], use_json);
 
   if (! peer)
     return CMD_WARNING;
 
 
   if (! peer)
     return CMD_WARNING;
 
-  if (argc == 2)
+  if (argc == 3 || (argc == 2 && argv[1] && strcmp(argv[1], "json") != 0))
     rmap_name = argv[1];
 
     rmap_name = argv[1];
 
-  return peer_adj_routes (vty, peer, AFI_IP, SAFI_UNICAST, 1, rmap_name);
+  return peer_adj_routes (vty, peer, AFI_IP, SAFI_UNICAST, 1, rmap_name, use_json);
 }
 
 ALIAS (show_ip_bgp_neighbor_received_routes,
        show_ip_bgp_neighbor_received_routes_rmap_cmd,
 }
 
 ALIAS (show_ip_bgp_neighbor_received_routes,
        show_ip_bgp_neighbor_received_routes_rmap_cmd,
-       "show ip bgp neighbors (A.B.C.D|X:X::X:X|WORD) received-routes route-map WORD",
+       "show ip bgp neighbors (A.B.C.D|X:X::X:X|WORD) received-routes route-map WORD {json}",
        SHOW_STR
        IP_STR
        BGP_STR
        SHOW_STR
        IP_STR
        BGP_STR
@@ -12214,11 +12657,12 @@ ALIAS (show_ip_bgp_neighbor_received_routes,
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
-       "Display the received routes from neighbor\n")
+       "Display the received routes from neighbor\n"
+       "JavaScript Object Notation\n")
 
 DEFUN (show_ip_bgp_ipv4_neighbor_received_routes,
        show_ip_bgp_ipv4_neighbor_received_routes_cmd,
 
 DEFUN (show_ip_bgp_ipv4_neighbor_received_routes,
        show_ip_bgp_ipv4_neighbor_received_routes_cmd,
-       "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X|WORD) received-routes",
+       "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X|WORD) received-routes {json}",
        SHOW_STR
        IP_STR
        BGP_STR
        SHOW_STR
        IP_STR
        BGP_STR
@@ -12229,27 +12673,34 @@ DEFUN (show_ip_bgp_ipv4_neighbor_received_routes,
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
-       "Display the received routes from neighbor\n")
+       "Display the received routes from neighbor\n"
+       "JavaScript Object Notation\n")
 {
   struct peer *peer;
   const char *rmap_name = NULL;
 {
   struct peer *peer;
   const char *rmap_name = NULL;
+  u_char use_json;
 
 
-  peer = peer_lookup_in_view (vty, NULL, argv[1]);
+  if (argv[argc - 1] && strcmp(argv[argc - 1], "json") == 0)
+    use_json = 1;
+  else
+    use_json = 0;
+
+  peer = peer_lookup_in_view (vty, NULL, argv[1], use_json);
   if (! peer)
     return CMD_WARNING;
 
   if (! peer)
     return CMD_WARNING;
 
-  if (argc == 3)
+  if (argc == 4 || (argc == 3 && argv[2] && strcmp(argv[2], "json") != 0))
     rmap_name = argv[2];
 
   if (strncmp (argv[0], "m", 1) == 0)
     rmap_name = argv[2];
 
   if (strncmp (argv[0], "m", 1) == 0)
-    return peer_adj_routes (vty, peer, AFI_IP, SAFI_MULTICAST, 1, rmap_name);
-
-  return peer_adj_routes (vty, peer, AFI_IP, SAFI_UNICAST, 1, rmap_name);
+    return peer_adj_routes (vty, peer, AFI_IP, SAFI_MULTICAST, 1, rmap_name, use_json);
+  else
+    return peer_adj_routes (vty, peer, AFI_IP, SAFI_UNICAST, 1, rmap_name, use_json);
 }
 
 ALIAS (show_ip_bgp_ipv4_neighbor_received_routes,
        show_ip_bgp_ipv4_neighbor_received_routes_rmap_cmd,
 }
 
 ALIAS (show_ip_bgp_ipv4_neighbor_received_routes,
        show_ip_bgp_ipv4_neighbor_received_routes_rmap_cmd,
-       "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X|WORD) received-routes route-map WORD",
+       "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X|WORD) received-routes route-map WORD {json}",
        SHOW_STR
        IP_STR
        BGP_STR
        SHOW_STR
        IP_STR
        BGP_STR
@@ -12260,14 +12711,15 @@ ALIAS (show_ip_bgp_ipv4_neighbor_received_routes,
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
-       "Display the received routes from neighbor\n")
+       "Display the received routes from neighbor\n"
+       "JavaScript Object Notation\n")
 
 DEFUN (show_bgp_view_afi_safi_neighbor_adv_recd_routes,
        show_bgp_view_afi_safi_neighbor_adv_recd_routes_cmd,
 #ifdef HAVE_IPV6
 
 DEFUN (show_bgp_view_afi_safi_neighbor_adv_recd_routes,
        show_bgp_view_afi_safi_neighbor_adv_recd_routes_cmd,
 #ifdef HAVE_IPV6
-       "show bgp view WORD (ipv4|ipv6) (unicast|multicast) neighbors (A.B.C.D|X:X::X:X|WORD) (advertised-routes|received-routes)",
+       "show bgp view WORD (ipv4|ipv6) (unicast|multicast) neighbors (A.B.C.D|X:X::X:X|WORD) (advertised-routes|received-routes) {json}",
 #else
 #else
-       "show bgp view WORD ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X|WORD) (advertised-routes|received-routes)",
+       "show bgp view WORD ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X|WORD) (advertised-routes|received-routes) {json}",
 #endif
        SHOW_STR
        BGP_STR
 #endif
        SHOW_STR
        BGP_STR
@@ -12284,17 +12736,24 @@ DEFUN (show_bgp_view_afi_safi_neighbor_adv_recd_routes,
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        "Display the advertised routes to neighbor\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        "Display the advertised routes to neighbor\n"
-       "Display the received routes from neighbor\n")
+       "Display the received routes from neighbor\n"
+       "JavaScript Object Notation\n")
 {
   int afi;
   int safi;
   int in;
   struct peer *peer;
 {
   int afi;
   int safi;
   int in;
   struct peer *peer;
+  u_char use_json;
+
+  if (argv[argc - 1] && strcmp(argv[argc - 1], "json") == 0)
+    use_json = 1;
+  else
+    use_json = 0;
 
 #ifdef HAVE_IPV6
 
 #ifdef HAVE_IPV6
-    peer = peer_lookup_in_view (vty, argv[0], argv[3]);
+    peer = peer_lookup_in_view (vty, argv[0], argv[3], use_json);
 #else
 #else
-    peer = peer_lookup_in_view (vty, argv[0], argv[2]);
+    peer = peer_lookup_in_view (vty, argv[0], argv[2], use_json);
 #endif
 
   if (! peer)
 #endif
 
   if (! peer)
@@ -12310,12 +12769,12 @@ DEFUN (show_bgp_view_afi_safi_neighbor_adv_recd_routes,
   in = (strncmp (argv[3], "r", 1) == 0) ? 1 : 0;
 #endif
 
   in = (strncmp (argv[3], "r", 1) == 0) ? 1 : 0;
 #endif
 
-  return peer_adj_routes (vty, peer, afi, safi, in, NULL);
+  return peer_adj_routes (vty, peer, afi, safi, in, NULL, use_json);
 }
 
 DEFUN (show_ip_bgp_neighbor_received_prefix_filter,
        show_ip_bgp_neighbor_received_prefix_filter_cmd,
 }
 
 DEFUN (show_ip_bgp_neighbor_received_prefix_filter,
        show_ip_bgp_neighbor_received_prefix_filter_cmd,
-       "show ip bgp neighbors (A.B.C.D|X:X::X:X|WORD) received prefix-filter",
+       "show ip bgp neighbors (A.B.C.D|X:X::X:X|WORD) received prefix-filter {json}",
        SHOW_STR
        IP_STR
        BGP_STR
        SHOW_STR
        IP_STR
        BGP_STR
@@ -12324,20 +12783,40 @@ DEFUN (show_ip_bgp_neighbor_received_prefix_filter,
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        "Display information received from a BGP neighbor\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        "Display information received from a BGP neighbor\n"
-       "Display the prefixlist filter\n")
+       "Display the prefixlist filter\n"
+       "JavaScript Object Notation\n")
 {
   char name[BUFSIZ];
   union sockunion su;
   struct peer *peer;
   int count, ret;
 {
   char name[BUFSIZ];
   union sockunion su;
   struct peer *peer;
   int count, ret;
+  u_char use_json;
+
+  if (argv[argc - 1] && strcmp(argv[argc - 1], "json") == 0)
+    use_json = 1;
+  else
+    use_json = 0;
 
   ret = str2sockunion (argv[0], &su);
   if (ret < 0)
     {
       peer = peer_lookup_by_conf_if (NULL, argv[0]);
 
   ret = str2sockunion (argv[0], &su);
   if (ret < 0)
     {
       peer = peer_lookup_by_conf_if (NULL, argv[0]);
-      if (!peer)
+      if (! peer)
         {
         {
-          vty_out (vty, "Malformed address or name: %s%s", argv[0], VTY_NEWLINE);
+          if (use_json)
+            {
+              json_object *json_no = NULL;
+              json_object *json_sub = NULL;
+              json_no = json_object_new_object();
+              json_sub = json_object_new_object();
+              json_object_string_add(json_no, "warning", "Malformed address or name");
+              json_object_string_add(json_sub, "warningCause", argv[0]);
+              json_object_object_add(json_no, "detail", json_sub);
+              vty_out (vty, "%s%s", json_object_to_json_string(json_no), VTY_NEWLINE);
+              json_object_free(json_no);
+            }
+          else
+            vty_out (vty, "%% Malformed address or name: %s%s", argv[0], VTY_NEWLINE);
           return CMD_WARNING;
         }
     }
           return CMD_WARNING;
         }
     }
@@ -12345,15 +12824,41 @@ DEFUN (show_ip_bgp_neighbor_received_prefix_filter,
     {
       peer = peer_lookup (NULL, &su);
       if (! peer)
     {
       peer = peer_lookup (NULL, &su);
       if (! peer)
-        return CMD_WARNING;
+        {
+          if (use_json)
+            {
+              json_object *json_no = NULL;
+              json_no = json_object_new_object();
+              json_object_string_add(json_no, "warning", "Peer not found");
+              vty_out (vty, "%s%s", json_object_to_json_string(json_no), VTY_NEWLINE);
+              json_object_free(json_no);
+            }
+          else
+            vty_out (vty, "No peer%s", VTY_NEWLINE);
+          return CMD_WARNING;
+        }
     }
 
   sprintf (name, "%s.%d.%d", peer->host, AFI_IP, SAFI_UNICAST);
     }
 
   sprintf (name, "%s.%d.%d", peer->host, AFI_IP, SAFI_UNICAST);
-  count =  prefix_bgp_show_prefix_list (NULL, AFI_IP, name);
+  count =  prefix_bgp_show_prefix_list (NULL, AFI_IP, name, use_json);
   if (count)
     {
   if (count)
     {
-      vty_out (vty, "Address family: IPv4 Unicast%s", VTY_NEWLINE);
-      prefix_bgp_show_prefix_list (vty, AFI_IP, name);
+      if (!use_json)
+        vty_out (vty, "Address family: IPv4 Unicast%s", VTY_NEWLINE);
+      prefix_bgp_show_prefix_list (vty, AFI_IP, name, use_json);
+    }
+  else
+    {
+      if (use_json)
+        {
+          json_object *json_no = NULL;
+          json_no = json_object_new_object();
+          json_object_boolean_true_add(json_no, "noFuntionalOutput");
+          vty_out (vty, "%s%s", json_object_to_json_string(json_no), VTY_NEWLINE);
+          json_object_free(json_no);
+        }
+      else
+        vty_out (vty, "No functional output%s", VTY_NEWLINE);
     }
 
   return CMD_SUCCESS;
     }
 
   return CMD_SUCCESS;
@@ -12361,7 +12866,7 @@ DEFUN (show_ip_bgp_neighbor_received_prefix_filter,
 
 DEFUN (show_ip_bgp_ipv4_neighbor_received_prefix_filter,
        show_ip_bgp_ipv4_neighbor_received_prefix_filter_cmd,
 
 DEFUN (show_ip_bgp_ipv4_neighbor_received_prefix_filter,
        show_ip_bgp_ipv4_neighbor_received_prefix_filter_cmd,
-       "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X|WORD) received prefix-filter",
+       "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X|WORD) received prefix-filter {json}",
        SHOW_STR
        IP_STR
        BGP_STR
        SHOW_STR
        IP_STR
        BGP_STR
@@ -12373,20 +12878,40 @@ DEFUN (show_ip_bgp_ipv4_neighbor_received_prefix_filter,
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        "Display information received from a BGP neighbor\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        "Display information received from a BGP neighbor\n"
-       "Display the prefixlist filter\n")
+       "Display the prefixlist filter\n"
+       "JavaScript Object Notation\n")
 {
   char name[BUFSIZ];
   union sockunion su;
   struct peer *peer;
   int count, ret;
 {
   char name[BUFSIZ];
   union sockunion su;
   struct peer *peer;
   int count, ret;
+  u_char use_json;
+
+  if (argv[argc - 1] && strcmp(argv[argc - 1], "json") == 0)
+    use_json = 1;
+  else
+    use_json = 0;
 
   ret = str2sockunion (argv[1], &su);
   if (ret < 0)
     {
       peer = peer_lookup_by_conf_if (NULL, argv[1]);
 
   ret = str2sockunion (argv[1], &su);
   if (ret < 0)
     {
       peer = peer_lookup_by_conf_if (NULL, argv[1]);
-      if (!peer)
+      if (! peer)
         {
         {
-          vty_out (vty, "Malformed address or name: %s%s", argv[1], VTY_NEWLINE);
+          if (use_json)
+            {
+              json_object *json_no = NULL;
+              json_object *json_sub = NULL;
+              json_no = json_object_new_object();
+              json_sub = json_object_new_object();
+              json_object_string_add(json_no, "warning", "Malformed address or name");
+              json_object_string_add(json_sub, "warningCause", argv[1]);
+              json_object_object_add(json_no, "detail", json_sub);
+              vty_out (vty, "%s%s", json_object_to_json_string(json_no), VTY_NEWLINE);
+              json_object_free(json_no);
+            }
+          else
+            vty_out (vty, "%% Malformed address or name: %s%s", argv[1], VTY_NEWLINE);
           return CMD_WARNING;
         }
     }
           return CMD_WARNING;
         }
     }
@@ -12394,72 +12919,88 @@ DEFUN (show_ip_bgp_ipv4_neighbor_received_prefix_filter,
     {
       peer = peer_lookup (NULL, &su);
       if (! peer)
     {
       peer = peer_lookup (NULL, &su);
       if (! peer)
-        return CMD_WARNING;
+        {
+          if (use_json)
+            {
+              json_object *json_no = NULL;
+              json_no = json_object_new_object();
+              json_object_string_add(json_no, "warning", "Peer not found");
+              vty_out (vty, "%s%s", json_object_to_json_string(json_no), VTY_NEWLINE);
+              json_object_free(json_no);
+            }
+          else
+            vty_out (vty, "No peer%s", VTY_NEWLINE);
+          return CMD_WARNING;
+        }
     }
 
   if (strncmp (argv[0], "m", 1) == 0)
     {
       sprintf (name, "%s.%d.%d", peer->host, AFI_IP, SAFI_MULTICAST);
     }
 
   if (strncmp (argv[0], "m", 1) == 0)
     {
       sprintf (name, "%s.%d.%d", peer->host, AFI_IP, SAFI_MULTICAST);
-      count =  prefix_bgp_show_prefix_list (NULL, AFI_IP, name);
+      count =  prefix_bgp_show_prefix_list (NULL, AFI_IP, name, use_json);
       if (count)
       if (count)
-       {
-         vty_out (vty, "Address family: IPv4 Multicast%s", VTY_NEWLINE);
-         prefix_bgp_show_prefix_list (vty, AFI_IP, name);
-       }
+        {
+          if (!use_json)
+            vty_out (vty, "Address family: IPv4 Multicast%s", VTY_NEWLINE);
+          prefix_bgp_show_prefix_list (vty, AFI_IP, name, use_json);
+        }
+      else
+        {
+          if (use_json)
+            {
+              json_object *json_no = NULL;
+              json_no = json_object_new_object();
+              json_object_boolean_true_add(json_no, "noFuntionalOutput");
+              vty_out (vty, "%s%s", json_object_to_json_string(json_no), VTY_NEWLINE);
+              json_object_free(json_no);
+            }
+          else
+            vty_out (vty, "No functional output%s", VTY_NEWLINE);
+        }
     }
   else 
     {
       sprintf (name, "%s.%d.%d", peer->host, AFI_IP, SAFI_UNICAST);
     }
   else 
     {
       sprintf (name, "%s.%d.%d", peer->host, AFI_IP, SAFI_UNICAST);
-      count =  prefix_bgp_show_prefix_list (NULL, AFI_IP, name);
+      count =  prefix_bgp_show_prefix_list (NULL, AFI_IP, name, use_json);
       if (count)
       if (count)
-       {
-         vty_out (vty, "Address family: IPv4 Unicast%s", VTY_NEWLINE);
-         prefix_bgp_show_prefix_list (vty, AFI_IP, name);
-       }
+        {
+          if (!use_json)
+            vty_out (vty, "Address family: IPv4 Unicast%s", VTY_NEWLINE);
+          prefix_bgp_show_prefix_list (vty, AFI_IP, name, use_json);
+        }
+      else
+        {
+          if (use_json)
+            {
+              json_object *json_no = NULL;
+              json_no = json_object_new_object();
+              json_object_boolean_true_add(json_no, "noFuntionalOutput");
+              vty_out (vty, "%s%s", json_object_to_json_string(json_no), VTY_NEWLINE);
+              json_object_free(json_no);
+            }
+          else
+            vty_out (vty, "No functional output%s", VTY_NEWLINE);
+        }
     }
 
   return CMD_SUCCESS;
 }
     }
 
   return CMD_SUCCESS;
 }
-
-
 #ifdef HAVE_IPV6
 ALIAS (show_bgp_view_neighbor_received_routes,
        show_bgp_neighbor_received_routes_cmd,
 #ifdef HAVE_IPV6
 ALIAS (show_bgp_view_neighbor_received_routes,
        show_bgp_neighbor_received_routes_cmd,
-       "show bgp neighbors (A.B.C.D|X:X::X:X|WORD) received-routes",
+       "show bgp neighbors (A.B.C.D|X:X::X:X|WORD) received-routes {json}",
        SHOW_STR
        BGP_STR
        "Detailed information on TCP and BGP neighbor connections\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        SHOW_STR
        BGP_STR
        "Detailed information on TCP and BGP neighbor connections\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
-       "Display the received routes from neighbor\n")
+       "Display the received routes from neighbor\n"
+       "JavaScript Object Notation\n")
 
 ALIAS (show_bgp_view_neighbor_received_routes,
        show_bgp_ipv6_neighbor_received_routes_cmd,
 
 ALIAS (show_bgp_view_neighbor_received_routes,
        show_bgp_ipv6_neighbor_received_routes_cmd,
-       "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X|WORD) received-routes",
-       SHOW_STR
-       BGP_STR
-       "Address family\n"
-       "Detailed information on TCP and BGP neighbor connections\n"
-       "Neighbor to display information about\n"
-       "Neighbor to display information about\n"
-       "Neighbor on bgp configured interface\n"
-       "Display the received routes from neighbor\n")
-
-ALIAS (show_bgp_view_neighbor_received_routes,
-       show_bgp_neighbor_received_routes_rmap_cmd,
-       "show bgp neighbors (A.B.C.D|X:X::X:X|WORD) received-routes route-map WORD",
-       SHOW_STR
-       BGP_STR
-       "Detailed information on TCP and BGP neighbor connections\n"
-       "Neighbor to display information about\n"
-       "Neighbor to display information about\n"
-       "Neighbor on bgp configured interface\n"
-       "Display the received routes from neighbor\n")
-
-ALIAS (show_bgp_view_neighbor_received_routes,
-       show_bgp_ipv6_neighbor_received_routes_rmap_cmd,
-       "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X|WORD) received-routes route-map WORD",
+       "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X|WORD) received-routes {json}",
        SHOW_STR
        BGP_STR
        "Address family\n"
        SHOW_STR
        BGP_STR
        "Address family\n"
@@ -12467,11 +13008,12 @@ ALIAS (show_bgp_view_neighbor_received_routes,
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
-       "Display the received routes from neighbor\n")
+       "Display the received routes from neighbor\n"
+       "JavaScript Object Notation\n")
 
 DEFUN (show_bgp_neighbor_received_prefix_filter,
        show_bgp_neighbor_received_prefix_filter_cmd,
 
 DEFUN (show_bgp_neighbor_received_prefix_filter,
        show_bgp_neighbor_received_prefix_filter_cmd,
-       "show bgp neighbors (A.B.C.D|X:X::X:X|WORD) received prefix-filter",
+       "show bgp neighbors (A.B.C.D|X:X::X:X|WORD) received prefix-filter {json}",
        SHOW_STR
        BGP_STR
        "Detailed information on TCP and BGP neighbor connections\n"
        SHOW_STR
        BGP_STR
        "Detailed information on TCP and BGP neighbor connections\n"
@@ -12479,20 +13021,40 @@ DEFUN (show_bgp_neighbor_received_prefix_filter,
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        "Display information received from a BGP neighbor\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        "Display information received from a BGP neighbor\n"
-       "Display the prefixlist filter\n")
+       "Display the prefixlist filter\n"
+       "JavaScript Object Notation\n")
 {
   char name[BUFSIZ];
   union sockunion su;
   struct peer *peer;
   int count, ret;
 {
   char name[BUFSIZ];
   union sockunion su;
   struct peer *peer;
   int count, ret;
+  u_char use_json;
+
+  if (argv[argc - 1] && strcmp(argv[argc - 1], "json") == 0)
+    use_json = 1;
+  else
+    use_json = 0;
 
   ret = str2sockunion (argv[0], &su);
   if (ret < 0)
     {
       peer = peer_lookup_by_conf_if (NULL, argv[0]);
 
   ret = str2sockunion (argv[0], &su);
   if (ret < 0)
     {
       peer = peer_lookup_by_conf_if (NULL, argv[0]);
-      if (!peer)
+      if (! peer)
         {
         {
-          vty_out (vty, "Malformed address or name: %s%s", argv[0], VTY_NEWLINE);
+          if (use_json)
+            {
+              json_object *json_no = NULL;
+              json_object *json_sub = NULL;
+              json_no = json_object_new_object();
+              json_sub = json_object_new_object();
+              json_object_string_add(json_no, "warning", "Malformed address or name");
+              json_object_string_add(json_sub, "warningCause", argv[0]);
+              json_object_object_add(json_no, "detail", json_sub);
+              vty_out (vty, "%s%s", json_object_to_json_string(json_no), VTY_NEWLINE);
+              json_object_free(json_no);
+            }
+          else
+            vty_out (vty, "%% Malformed address or name: %s%s", argv[0], VTY_NEWLINE);
           return CMD_WARNING;
         }
     }
           return CMD_WARNING;
         }
     }
@@ -12500,15 +13062,41 @@ DEFUN (show_bgp_neighbor_received_prefix_filter,
     {
       peer = peer_lookup (NULL, &su);
       if (! peer)
     {
       peer = peer_lookup (NULL, &su);
       if (! peer)
-        return CMD_WARNING;
+        {
+          if (use_json)
+            {
+              json_object *json_no = NULL;
+              json_no = json_object_new_object();
+              json_object_string_add(json_no, "warning", "No Peer");
+              vty_out (vty, "%s%s", json_object_to_json_string(json_no), VTY_NEWLINE);
+              json_object_free(json_no);
+            }
+          else
+            vty_out (vty, "No peer%s", VTY_NEWLINE);
+          return CMD_WARNING;
+        }
     }
 
   sprintf (name, "%s.%d.%d", peer->host, AFI_IP6, SAFI_UNICAST);
     }
 
   sprintf (name, "%s.%d.%d", peer->host, AFI_IP6, SAFI_UNICAST);
-  count =  prefix_bgp_show_prefix_list (NULL, AFI_IP6, name);
+  count =  prefix_bgp_show_prefix_list (NULL, AFI_IP6, name, use_json);
   if (count)
     {
   if (count)
     {
-      vty_out (vty, "Address family: IPv6 Unicast%s", VTY_NEWLINE);
-      prefix_bgp_show_prefix_list (vty, AFI_IP6, name);
+      if (!use_json)
+        vty_out (vty, "Address family: IPv6 Unicast%s", VTY_NEWLINE);
+      prefix_bgp_show_prefix_list (vty, AFI_IP6, name, use_json);
+    }
+  else
+    {
+      if (use_json)
+        {
+          json_object *json_no = NULL;
+          json_no = json_object_new_object();
+          json_object_boolean_true_add(json_no, "noFuntionalOutput");
+          vty_out (vty, "%s%s", json_object_to_json_string(json_no), VTY_NEWLINE);
+          json_object_free(json_no);
+        }
+      else
+        vty_out (vty, "No functional output%s", VTY_NEWLINE);
     }
 
   return CMD_SUCCESS;
     }
 
   return CMD_SUCCESS;
@@ -12516,7 +13104,7 @@ DEFUN (show_bgp_neighbor_received_prefix_filter,
 
 ALIAS (show_bgp_neighbor_received_prefix_filter,
        show_bgp_ipv6_neighbor_received_prefix_filter_cmd,
 
 ALIAS (show_bgp_neighbor_received_prefix_filter,
        show_bgp_ipv6_neighbor_received_prefix_filter_cmd,
-       "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X|WORD) received prefix-filter",
+       "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X|WORD) received prefix-filter {json}",
        SHOW_STR
        BGP_STR
        "Address family\n"
        SHOW_STR
        BGP_STR
        "Address family\n"
@@ -12525,12 +13113,13 @@ ALIAS (show_bgp_neighbor_received_prefix_filter,
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        "Display information received from a BGP neighbor\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        "Display information received from a BGP neighbor\n"
-       "Display the prefixlist filter\n")
+       "Display the prefixlist filter\n"
+       "JavaScript Object Notation\n")
 
 /* old command */
 ALIAS (show_bgp_view_neighbor_received_routes,
        ipv6_bgp_neighbor_received_routes_cmd,
 
 /* old command */
 ALIAS (show_bgp_view_neighbor_received_routes,
        ipv6_bgp_neighbor_received_routes_cmd,
-       "show ipv6 bgp neighbors (A.B.C.D|X:X::X:X|WORD) received-routes",
+       "show ipv6 bgp neighbors (A.B.C.D|X:X::X:X|WORD) received-routes {json}",
        SHOW_STR
        IPV6_STR
        BGP_STR
        SHOW_STR
        IPV6_STR
        BGP_STR
@@ -12538,12 +13127,13 @@ ALIAS (show_bgp_view_neighbor_received_routes,
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
-       "Display the received routes from neighbor\n")
+       "Display the received routes from neighbor\n"
+       "JavaScript Object Notation\n")
 
 /* old command */
 DEFUN (ipv6_mbgp_neighbor_received_routes,
        ipv6_mbgp_neighbor_received_routes_cmd,
 
 /* old command */
 DEFUN (ipv6_mbgp_neighbor_received_routes,
        ipv6_mbgp_neighbor_received_routes_cmd,
-       "show ipv6 mbgp neighbors (A.B.C.D|X:X::X:X|WORD) received-routes",
+       "show ipv6 mbgp neighbors (A.B.C.D|X:X::X:X|WORD) received-routes {json}",
        SHOW_STR
        IPV6_STR
        MBGP_STR
        SHOW_STR
        IPV6_STR
        MBGP_STR
@@ -12551,20 +13141,27 @@ DEFUN (ipv6_mbgp_neighbor_received_routes,
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
-       "Display the received routes from neighbor\n")
+       "Display the received routes from neighbor\n"
+       "JavaScript Object Notation\n")
 {
   struct peer *peer;
 {
   struct peer *peer;
+  u_char use_json;
+
+  if (argv[argc - 1] && strcmp(argv[argc - 1], "json") == 0)
+    use_json = 1;
+  else
+    use_json = 0;
 
 
-  peer = peer_lookup_in_view (vty, NULL, argv[0]);
+  peer = peer_lookup_in_view (vty, NULL, argv[0], use_json);
   if (! peer)
     return CMD_WARNING;
 
   if (! peer)
     return CMD_WARNING;
 
-  return peer_adj_routes (vty, peer, AFI_IP6, SAFI_MULTICAST, 1, NULL);
+  return peer_adj_routes (vty, peer, AFI_IP6, SAFI_MULTICAST, 1, NULL,use_json);
 }
 
 DEFUN (show_bgp_view_neighbor_received_prefix_filter,
        show_bgp_view_neighbor_received_prefix_filter_cmd,
 }
 
 DEFUN (show_bgp_view_neighbor_received_prefix_filter,
        show_bgp_view_neighbor_received_prefix_filter_cmd,
-       "show bgp view WORD neighbors (A.B.C.D|X:X::X:X|WORD) received prefix-filter",
+       "show bgp view WORD neighbors (A.B.C.D|X:X::X:X|WORD) received prefix-filter {json}",
        SHOW_STR
        BGP_STR
        "BGP view\n"
        SHOW_STR
        BGP_STR
        "BGP view\n"
@@ -12574,29 +13171,58 @@ DEFUN (show_bgp_view_neighbor_received_prefix_filter,
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        "Display information received from a BGP neighbor\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        "Display information received from a BGP neighbor\n"
-       "Display the prefixlist filter\n")
+       "Display the prefixlist filter\n"
+       "JavaScript Object Notation\n")
 {
   char name[BUFSIZ];
   union sockunion su;
   struct peer *peer;
   struct bgp *bgp;
   int count, ret;
 {
   char name[BUFSIZ];
   union sockunion su;
   struct peer *peer;
   struct bgp *bgp;
   int count, ret;
+  u_char use_json;
+
+  if (argv[argc - 1] && strcmp(argv[argc - 1], "json") == 0)
+    use_json = 1;
+  else
+    use_json = 0;
 
   /* BGP structure lookup. */
   bgp = bgp_lookup_by_name (argv[0]);
   if (bgp == NULL)
 
   /* BGP structure lookup. */
   bgp = bgp_lookup_by_name (argv[0]);
   if (bgp == NULL)
-  {  
-         vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
-         return CMD_WARNING;
-       }
-  
+    {
+      if (use_json)
+        {
+          json_object *json_no = NULL;
+          json_no = json_object_new_object();
+          json_object_string_add(json_no, "warning", "Can't find BGP view");
+          vty_out (vty, "%s%s", json_object_to_json_string(json_no), VTY_NEWLINE);
+          json_object_free(json_no);
+        }
+      else
+        vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
+      return CMD_WARNING;
+    }
+
   ret = str2sockunion (argv[1], &su);
   if (ret < 0)
     {
       peer = peer_lookup_by_conf_if (bgp, argv[1]);
   ret = str2sockunion (argv[1], &su);
   if (ret < 0)
     {
       peer = peer_lookup_by_conf_if (bgp, argv[1]);
-      if (!peer)
+      if (! peer)
         {
         {
-          vty_out (vty, "%% Malformed address or name: %s%s", argv[1], VTY_NEWLINE);
+          if (use_json)
+            {
+              json_object *json_no = NULL;
+              json_object *json_sub = NULL;
+              json_no = json_object_new_object();
+              json_sub = json_object_new_object();
+              json_object_string_add(json_no, "warning", "Malformed address or name");
+              json_object_string_add(json_sub, "warningCause", argv[1]);
+              json_object_object_add(json_no, "detail", json_sub);
+              vty_out (vty, "%s%s", json_object_to_json_string(json_no), VTY_NEWLINE);
+              json_object_free(json_no);
+            }
+          else
+            vty_out (vty, "%% Malformed address or name: %s%s", argv[1], VTY_NEWLINE);
           return CMD_WARNING;
         }
     }
           return CMD_WARNING;
         }
     }
@@ -12604,23 +13230,36 @@ DEFUN (show_bgp_view_neighbor_received_prefix_filter,
     {
       peer = peer_lookup (bgp, &su);
       if (! peer)
     {
       peer = peer_lookup (bgp, &su);
       if (! peer)
-        return CMD_WARNING;
+        {
+          if (use_json)
+            {
+              json_object *json_no = NULL;
+              json_no = json_object_new_object();
+              json_object_boolean_true_add(json_no, "noPeer");
+              vty_out (vty, "%s%s", json_object_to_json_string(json_no), VTY_NEWLINE);
+              json_object_free(json_no);
+            }
+          else
+            vty_out (vty, "No peer%s", VTY_NEWLINE);
+          return CMD_WARNING;
+        }
+
     }
 
   sprintf (name, "%s.%d.%d", peer->host, AFI_IP6, SAFI_UNICAST);
     }
 
   sprintf (name, "%s.%d.%d", peer->host, AFI_IP6, SAFI_UNICAST);
-  count =  prefix_bgp_show_prefix_list (NULL, AFI_IP6, name);
+  count =  prefix_bgp_show_prefix_list (NULL, AFI_IP6, name, use_json);
   if (count)
     {
   if (count)
     {
-      vty_out (vty, "Address family: IPv6 Unicast%s", VTY_NEWLINE);
-      prefix_bgp_show_prefix_list (vty, AFI_IP6, name);
+      if (!use_json)
+        vty_out (vty, "Address family: IPv6 Unicast%s", VTY_NEWLINE);
+      prefix_bgp_show_prefix_list (vty, AFI_IP6, name, use_json);
     }
 
   return CMD_SUCCESS;
 }
     }
 
   return CMD_SUCCESS;
 }
-
 ALIAS (show_bgp_view_neighbor_received_prefix_filter,
        show_bgp_view_ipv6_neighbor_received_prefix_filter_cmd,
 ALIAS (show_bgp_view_neighbor_received_prefix_filter,
        show_bgp_view_ipv6_neighbor_received_prefix_filter_cmd,
-       "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X|WORD) received prefix-filter",
+       "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X|WORD) received prefix-filter {json}",
        SHOW_STR
        BGP_STR
        "BGP view\n"
        SHOW_STR
        BGP_STR
        "BGP view\n"
@@ -12631,25 +13270,35 @@ ALIAS (show_bgp_view_neighbor_received_prefix_filter,
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        "Display information received from a BGP neighbor\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        "Display information received from a BGP neighbor\n"
-       "Display the prefixlist filter\n")
+       "Display the prefixlist filter\n"
+       "JavaScript Object NOtation\n")
 #endif /* HAVE_IPV6 */
 
 static int
 bgp_show_neighbor_route (struct vty *vty, struct peer *peer, afi_t afi,
 #endif /* HAVE_IPV6 */
 
 static int
 bgp_show_neighbor_route (struct vty *vty, struct peer *peer, afi_t afi,
-                        safi_t safi, enum bgp_show_type type)
+                        safi_t safi, enum bgp_show_type type, u_char use_json)
 {
   if (! peer || ! peer->afc[afi][safi])
     {
 {
   if (! peer || ! peer->afc[afi][safi])
     {
-      vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
+      if (use_json)
+        {
+          json_object *json_no = NULL;
+          json_no = json_object_new_object();
+          json_object_string_add(json_no, "warning", "No such neighbor or address family");
+          vty_out (vty, "%s%s", json_object_to_json_string(json_no), VTY_NEWLINE);
+          json_object_free(json_no);
+        }
+      else
+        vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
       return CMD_WARNING;
     }
 
       return CMD_WARNING;
     }
 
-  return bgp_show (vty, peer->bgp, afi, safi, type, &peer->su, 0);
+  return bgp_show (vty, peer->bgp, afi, safi, type, &peer->su, use_json);
 }
 
 DEFUN (show_ip_bgp_neighbor_routes,
        show_ip_bgp_neighbor_routes_cmd,
 }
 
 DEFUN (show_ip_bgp_neighbor_routes,
        show_ip_bgp_neighbor_routes_cmd,
-       "show ip bgp neighbors (A.B.C.D|X:X::X:X|WORD) routes",
+       "show ip bgp neighbors (A.B.C.D|X:X::X:X|WORD) routes {json}",
        SHOW_STR
        IP_STR
        BGP_STR
        SHOW_STR
        IP_STR
        BGP_STR
@@ -12657,21 +13306,28 @@ DEFUN (show_ip_bgp_neighbor_routes,
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
-       "Display routes learned from neighbor\n")
+       "Display routes learned from neighbor\n"
+       "JavaScript Object Notation\n")
 {
   struct peer *peer;
 {
   struct peer *peer;
+  u_char use_json;
 
 
-  peer = peer_lookup_in_view (vty, NULL, argv[0]);
+  if (argv[argc - 1] && strcmp(argv[argc - 1], "json") == 0)
+    use_json = 1;
+  else
+    use_json = 0;
+
+  peer = peer_lookup_in_view (vty, NULL, argv[0], use_json);
   if (! peer)
     return CMD_WARNING;
     
   return bgp_show_neighbor_route (vty, peer, AFI_IP, SAFI_UNICAST,
   if (! peer)
     return CMD_WARNING;
     
   return bgp_show_neighbor_route (vty, peer, AFI_IP, SAFI_UNICAST,
-                                 bgp_show_type_neighbor);
+                                 bgp_show_type_neighbor, use_json);
 }
 
 DEFUN (show_ip_bgp_neighbor_flap,
        show_ip_bgp_neighbor_flap_cmd,
 }
 
 DEFUN (show_ip_bgp_neighbor_flap,
        show_ip_bgp_neighbor_flap_cmd,
-       "show ip bgp neighbors (A.B.C.D|X:X::X:X|WORD) flap-statistics",
+       "show ip bgp neighbors (A.B.C.D|X:X::X:X|WORD) flap-statistics {json}",
        SHOW_STR
        IP_STR
        BGP_STR
        SHOW_STR
        IP_STR
        BGP_STR
@@ -12679,21 +13335,28 @@ DEFUN (show_ip_bgp_neighbor_flap,
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
-       "Display flap statistics of the routes learned from neighbor\n")
+       "Display flap statistics of the routes learned from neighbor\n"
+       "JavaScript Object Notation\n")
 {
   struct peer *peer;
 {
   struct peer *peer;
+  u_char use_json;
+
+  if (argv[argc - 1] && strcmp(argv[argc - 1], "json") == 0)
+    use_json = 1;
+  else
+    use_json = 0;
 
 
-  peer = peer_lookup_in_view (vty, NULL, argv[0]);
+  peer = peer_lookup_in_view (vty, NULL, argv[0], use_json);
   if (! peer)
     return CMD_WARNING;
     
   return bgp_show_neighbor_route (vty, peer, AFI_IP, SAFI_UNICAST,
   if (! peer)
     return CMD_WARNING;
     
   return bgp_show_neighbor_route (vty, peer, AFI_IP, SAFI_UNICAST,
-                                 bgp_show_type_flap_neighbor);
+                                 bgp_show_type_flap_neighbor, use_json);
 }
 
 DEFUN (show_ip_bgp_neighbor_damp,
        show_ip_bgp_neighbor_damp_cmd,
 }
 
 DEFUN (show_ip_bgp_neighbor_damp,
        show_ip_bgp_neighbor_damp_cmd,
-       "show ip bgp neighbors (A.B.C.D|X:X::X:X|WORD) dampened-routes",
+       "show ip bgp neighbors (A.B.C.D|X:X::X:X|WORD) dampened-routes {json}",
        SHOW_STR
        IP_STR
        BGP_STR
        SHOW_STR
        IP_STR
        BGP_STR
@@ -12701,21 +13364,28 @@ DEFUN (show_ip_bgp_neighbor_damp,
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
-       "Display the dampened routes received from neighbor\n")
+       "Display the dampened routes received from neighbor\n"
+       "JavaScript Object Notation\n")
 {
   struct peer *peer;
 {
   struct peer *peer;
+  u_char use_json;
+
+  if (argv[argc - 1] && strcmp(argv[argc - 1], "json") == 0)
+    use_json = 1;
+  else
+    use_json = 0;
 
 
-  peer = peer_lookup_in_view (vty, NULL, argv[0]);
+  peer = peer_lookup_in_view (vty, NULL, argv[0], use_json);
   if (! peer)
     return CMD_WARNING;
     
   return bgp_show_neighbor_route (vty, peer, AFI_IP, SAFI_UNICAST,
   if (! peer)
     return CMD_WARNING;
     
   return bgp_show_neighbor_route (vty, peer, AFI_IP, SAFI_UNICAST,
-                                 bgp_show_type_damp_neighbor);
+                                 bgp_show_type_damp_neighbor, use_json);
 }
 
 DEFUN (show_ip_bgp_ipv4_neighbor_routes,
        show_ip_bgp_ipv4_neighbor_routes_cmd,
 }
 
 DEFUN (show_ip_bgp_ipv4_neighbor_routes,
        show_ip_bgp_ipv4_neighbor_routes_cmd,
-       "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X|WORD) routes",
+       "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X|WORD) routes {json}",
        SHOW_STR
        IP_STR
        BGP_STR
        SHOW_STR
        IP_STR
        BGP_STR
@@ -12726,20 +13396,27 @@ DEFUN (show_ip_bgp_ipv4_neighbor_routes,
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
-       "Display routes learned from neighbor\n")
+       "Display routes learned from neighbor\n"
+       "JavaScript Object Notation\n")
 {
   struct peer *peer;
 {
   struct peer *peer;
+  u_char use_json;
+
+  if (argv[argc - 1] && strcmp(argv[argc - 1], "json") == 0)
+    use_json = 1;
+  else
+    use_json = 0;
 
 
-  peer = peer_lookup_in_view (vty, NULL, argv[1]);
+  peer = peer_lookup_in_view (vty, NULL, argv[1], use_json);
   if (! peer)
     return CMD_WARNING;
  
   if (strncmp (argv[0], "m", 1) == 0)
     return bgp_show_neighbor_route (vty, peer, AFI_IP, SAFI_MULTICAST,
   if (! peer)
     return CMD_WARNING;
  
   if (strncmp (argv[0], "m", 1) == 0)
     return bgp_show_neighbor_route (vty, peer, AFI_IP, SAFI_MULTICAST,
-                                   bgp_show_type_neighbor);
+                                   bgp_show_type_neighbor, use_json);
 
   return bgp_show_neighbor_route (vty, peer, AFI_IP, SAFI_UNICAST,
 
   return bgp_show_neighbor_route (vty, peer, AFI_IP, SAFI_UNICAST,
-                                 bgp_show_type_neighbor);
+                                 bgp_show_type_neighbor, use_json);
 }
 
 DEFUN (show_ip_bgp_view_rsclient,
 }
 
 DEFUN (show_ip_bgp_view_rsclient,
@@ -12757,9 +13434,9 @@ DEFUN (show_ip_bgp_view_rsclient,
   struct peer *peer;
 
   if (argc == 2)
   struct peer *peer;
 
   if (argc == 2)
-    peer = peer_lookup_in_view (vty, argv[0], argv[1]);
+    peer = peer_lookup_in_view (vty, argv[0], argv[1], 0);
   else
   else
-    peer = peer_lookup_in_view (vty, NULL, argv[0]);
+    peer = peer_lookup_in_view (vty, NULL, argv[0], 0);
 
   if (! peer)
     return CMD_WARNING;
 
   if (! peer)
     return CMD_WARNING;
@@ -12812,10 +13489,10 @@ DEFUN (show_bgp_view_ipv4_safi_rsclient,
   safi_t safi;
 
   if (argc == 3) {
   safi_t safi;
 
   if (argc == 3) {
-    peer = peer_lookup_in_view (vty, argv[0], argv[2]);
+    peer = peer_lookup_in_view (vty, argv[0], argv[2], 0);
     safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
   } else {
     safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
   } else {
-    peer = peer_lookup_in_view (vty, NULL, argv[1]);
+    peer = peer_lookup_in_view (vty, NULL, argv[1], 0);
     safi = (strncmp (argv[0], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
   }
 
     safi = (strncmp (argv[0], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
   }
 
@@ -12890,9 +13567,9 @@ DEFUN (show_ip_bgp_view_rsclient_route,
     }
 
   if (argc == 3)
     }
 
   if (argc == 3)
-    peer = peer_lookup_in_view (vty, argv[0], argv[1]);
+    peer = peer_lookup_in_view (vty, argv[0], argv[1], 0);
   else
   else
-    peer = peer_lookup_in_view (vty, NULL, argv[0]);
+    peer = peer_lookup_in_view (vty, NULL, argv[0], 0);
 
   if (! peer)
     return CMD_WARNING;
 
   if (! peer)
     return CMD_WARNING;
@@ -12966,10 +13643,10 @@ DEFUN (show_bgp_view_ipv4_safi_rsclient_route,
     }
 
   if (argc == 4) {
     }
 
   if (argc == 4) {
-    peer = peer_lookup_in_view (vty, argv[0], argv[2]);
+    peer = peer_lookup_in_view (vty, argv[0], argv[2], 0);
     safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
   } else {
     safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
   } else {
-    peer = peer_lookup_in_view (vty, NULL, argv[1]);
+    peer = peer_lookup_in_view (vty, NULL, argv[1], 0);
     safi = (strncmp (argv[0], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
   }
 
     safi = (strncmp (argv[0], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
   }
 
@@ -13044,9 +13721,9 @@ DEFUN (show_ip_bgp_view_rsclient_prefix,
     }
 
   if (argc == 3)
     }
 
   if (argc == 3)
-    peer = peer_lookup_in_view (vty, argv[0], argv[1]);
+    peer = peer_lookup_in_view (vty, argv[0], argv[1], 0);
   else
   else
-  peer = peer_lookup_in_view (vty, NULL, argv[0]);
+    peer = peer_lookup_in_view (vty, NULL, argv[0], 0);
 
   if (! peer)
     return CMD_WARNING;
 
   if (! peer)
     return CMD_WARNING;
@@ -13120,10 +13797,10 @@ DEFUN (show_bgp_view_ipv4_safi_rsclient_prefix,
     }
 
   if (argc == 4) {
     }
 
   if (argc == 4) {
-    peer = peer_lookup_in_view (vty, argv[0], argv[2]);
+    peer = peer_lookup_in_view (vty, argv[0], argv[2], 0);
     safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
   } else {
     safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
   } else {
-    peer = peer_lookup_in_view (vty, NULL, argv[1]);
+    peer = peer_lookup_in_view (vty, NULL, argv[1], 0);
     safi = (strncmp (argv[0], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
   }
 
     safi = (strncmp (argv[0], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
   }
 
@@ -13165,7 +13842,7 @@ ALIAS (show_bgp_view_ipv4_safi_rsclient_prefix,
 #ifdef HAVE_IPV6
 DEFUN (show_bgp_view_neighbor_routes,
        show_bgp_view_neighbor_routes_cmd,
 #ifdef HAVE_IPV6
 DEFUN (show_bgp_view_neighbor_routes,
        show_bgp_view_neighbor_routes_cmd,
-       "show bgp view WORD neighbors (A.B.C.D|X:X::X:X|WORD) routes",
+       "show bgp view WORD neighbors (A.B.C.D|X:X::X:X|WORD) routes {json}",
        SHOW_STR
        BGP_STR
        "BGP view\n"
        SHOW_STR
        BGP_STR
        "BGP view\n"
@@ -13174,25 +13851,33 @@ DEFUN (show_bgp_view_neighbor_routes,
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
-       "Display routes learned from neighbor\n")
+       "Display routes learned from neighbor\n"
+       "JavaScript Object Notation\n")
 {
   struct peer *peer;
 {
   struct peer *peer;
+  u_char use_json;
 
 
-  if (argc == 2)
-    peer = peer_lookup_in_view (vty, argv[0], argv[1]);
+  if (argv[argc - 1] && strcmp(argv[argc - 1], "json") == 0)
+    use_json = 1;
+  else
+    use_json = 0;
+
+  if ((argc == 3 && argv[2] && strcmp(argv[2], "json") == 0)
+      || (argc == 2 && argv[1] && strcmp(argv[1], "json") != 0))
+    peer = peer_lookup_in_view (vty, argv[0], argv[1], use_json);
   else
   else
-    peer = peer_lookup_in_view (vty, NULL, argv[0]);
+    peer = peer_lookup_in_view (vty, NULL, argv[0], use_json);
    
   if (! peer)
     return CMD_WARNING;
 
   return bgp_show_neighbor_route (vty, peer, AFI_IP6, SAFI_UNICAST,
    
   if (! peer)
     return CMD_WARNING;
 
   return bgp_show_neighbor_route (vty, peer, AFI_IP6, SAFI_UNICAST,
-                                 bgp_show_type_neighbor);
+                                 bgp_show_type_neighbor, use_json);
 }
 
 ALIAS (show_bgp_view_neighbor_routes,
        show_bgp_view_ipv6_neighbor_routes_cmd,
 }
 
 ALIAS (show_bgp_view_neighbor_routes,
        show_bgp_view_ipv6_neighbor_routes_cmd,
-       "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X|WORD) routes",
+       "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X|WORD) routes {json}",
        SHOW_STR
        BGP_STR
        "BGP view\n"
        SHOW_STR
        BGP_STR
        "BGP view\n"
@@ -13202,11 +13887,12 @@ ALIAS (show_bgp_view_neighbor_routes,
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
-       "Display routes learned from neighbor\n")
+       "Display routes learned from neighbor\n"
+       "JavaScript Object Notation\n")
 
 DEFUN (show_bgp_view_neighbor_damp,
        show_bgp_view_neighbor_damp_cmd,
 
 DEFUN (show_bgp_view_neighbor_damp,
        show_bgp_view_neighbor_damp_cmd,
-       "show bgp view WORD neighbors (A.B.C.D|X:X::X:X|WORD) dampened-routes",
+       "show bgp view WORD neighbors (A.B.C.D|X:X::X:X|WORD) dampened-routes {json}",
        SHOW_STR
        BGP_STR
        "BGP view\n"
        SHOW_STR
        BGP_STR
        "BGP view\n"
@@ -13215,25 +13901,33 @@ DEFUN (show_bgp_view_neighbor_damp,
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
-       "Display the dampened routes received from neighbor\n")
+       "Display the dampened routes received from neighbor\n"
+       "JavaScript Object Notation\n")
 {
   struct peer *peer;
 {
   struct peer *peer;
+  u_char use_json;
 
 
-  if (argc == 2)
-    peer = peer_lookup_in_view (vty, argv[0], argv[1]);
+  if (argv[argc - 1] && strcmp(argv[argc - 1], "json") == 0)
+    use_json = 1;
+  else
+    use_json = 0;
+
+  if ((argc == 3 && argv[2] && strcmp(argv[2], "json") == 0)
+      || (argc == 2 && argv[1] && strcmp(argv[1], "json") != 0))
+    peer = peer_lookup_in_view (vty, argv[0], argv[1], use_json);
   else
   else
-    peer = peer_lookup_in_view (vty, NULL, argv[0]);
+    peer = peer_lookup_in_view (vty, NULL, argv[0], use_json);
 
   if (! peer)
     return CMD_WARNING;
 
   return bgp_show_neighbor_route (vty, peer, AFI_IP6, SAFI_UNICAST,
 
   if (! peer)
     return CMD_WARNING;
 
   return bgp_show_neighbor_route (vty, peer, AFI_IP6, SAFI_UNICAST,
-                                 bgp_show_type_damp_neighbor);
+                                 bgp_show_type_damp_neighbor, use_json);
 }
 
 ALIAS (show_bgp_view_neighbor_damp,
        show_bgp_view_ipv6_neighbor_damp_cmd,
 }
 
 ALIAS (show_bgp_view_neighbor_damp,
        show_bgp_view_ipv6_neighbor_damp_cmd,
-       "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X|WORD) dampened-routes",
+       "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X|WORD) dampened-routes {json}",
        SHOW_STR
        BGP_STR
        "BGP view\n"
        SHOW_STR
        BGP_STR
        "BGP view\n"
@@ -13243,11 +13937,12 @@ ALIAS (show_bgp_view_neighbor_damp,
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
-       "Display the dampened routes received from neighbor\n")
+       "Display the dampened routes received from neighbor\n"
+       "JavaScript Object Notation\n")
 
 DEFUN (show_bgp_view_neighbor_flap,
        show_bgp_view_neighbor_flap_cmd,
 
 DEFUN (show_bgp_view_neighbor_flap,
        show_bgp_view_neighbor_flap_cmd,
-       "show bgp view WORD neighbors (A.B.C.D|X:X::X:X|WORD) flap-statistics",
+       "show bgp view WORD neighbors (A.B.C.D|X:X::X:X|WORD) flap-statistics {json}",
        SHOW_STR
        BGP_STR
        "BGP view\n"
        SHOW_STR
        BGP_STR
        "BGP view\n"
@@ -13256,25 +13951,33 @@ DEFUN (show_bgp_view_neighbor_flap,
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
-       "Display flap statistics of the routes learned from neighbor\n")
+       "Display flap statistics of the routes learned from neighbor\n"
+       "JavaScript Object Notation\n")
 {
   struct peer *peer;
 {
   struct peer *peer;
+  u_char use_json;
 
 
-  if (argc == 2)
-    peer = peer_lookup_in_view (vty, argv[0], argv[1]);
+  if (argv[argc - 1] && strcmp(argv[argc - 1], "json") == 0)
+    use_json = 1;
+  else
+    use_json = 0;
+
+  if ((argc == 3 && argv[2] && strcmp(argv[2], "json") == 0)
+      || (argc == 2 && argv[1] && strcmp(argv[1], "json") != 0))
+    peer = peer_lookup_in_view (vty, argv[0], argv[1], use_json);
   else
   else
-    peer = peer_lookup_in_view (vty, NULL, argv[0]);
+    peer = peer_lookup_in_view (vty, NULL, argv[0], use_json);
 
   if (! peer)
     return CMD_WARNING;
 
   return bgp_show_neighbor_route (vty, peer, AFI_IP6, SAFI_UNICAST,
 
   if (! peer)
     return CMD_WARNING;
 
   return bgp_show_neighbor_route (vty, peer, AFI_IP6, SAFI_UNICAST,
-                                 bgp_show_type_flap_neighbor);
+                                 bgp_show_type_flap_neighbor, use_json);
 }
 
 ALIAS (show_bgp_view_neighbor_flap,
        show_bgp_view_ipv6_neighbor_flap_cmd,
 }
 
 ALIAS (show_bgp_view_neighbor_flap,
        show_bgp_view_ipv6_neighbor_flap_cmd,
-       "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X|WORD) flap-statistics",
+       "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X|WORD) flap-statistics {json}",
        SHOW_STR
        BGP_STR
        "BGP view\n"
        SHOW_STR
        BGP_STR
        "BGP view\n"
@@ -13284,23 +13987,25 @@ ALIAS (show_bgp_view_neighbor_flap,
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
-       "Display flap statistics of the routes learned from neighbor\n")
+       "Display flap statistics of the routes learned from neighbor\n"
+       "JavaScript Object Notation\n")
        
 ALIAS (show_bgp_view_neighbor_routes,
        show_bgp_neighbor_routes_cmd,
        
 ALIAS (show_bgp_view_neighbor_routes,
        show_bgp_neighbor_routes_cmd,
-       "show bgp neighbors (A.B.C.D|X:X::X:X|WORD) routes",
+       "show bgp neighbors (A.B.C.D|X:X::X:X|WORD) routes {json}",
        SHOW_STR
        BGP_STR
        "Detailed information on TCP and BGP neighbor connections\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        SHOW_STR
        BGP_STR
        "Detailed information on TCP and BGP neighbor connections\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
-       "Display routes learned from neighbor\n")
+       "Display routes learned from neighbor\n"
+       "JavaScript Object Notation\n")
 
 
 ALIAS (show_bgp_view_neighbor_routes,
        show_bgp_ipv6_neighbor_routes_cmd,
 
 
 ALIAS (show_bgp_view_neighbor_routes,
        show_bgp_ipv6_neighbor_routes_cmd,
-       "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X|WORD) routes",
+       "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X|WORD) routes {json}",
        SHOW_STR
        BGP_STR
        "Address family\n"
        SHOW_STR
        BGP_STR
        "Address family\n"
@@ -13308,12 +14013,13 @@ ALIAS (show_bgp_view_neighbor_routes,
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
-       "Display routes learned from neighbor\n")
+       "Display routes learned from neighbor\n"
+       "JavaScript Object Notation\n")
 
 /* old command */
 ALIAS (show_bgp_view_neighbor_routes,
        ipv6_bgp_neighbor_routes_cmd,
 
 /* old command */
 ALIAS (show_bgp_view_neighbor_routes,
        ipv6_bgp_neighbor_routes_cmd,
-       "show ipv6 bgp neighbors (A.B.C.D|X:X::X:X|WORD) routes",
+       "show ipv6 bgp neighbors (A.B.C.D|X:X::X:X|WORD) routes {json}",
        SHOW_STR
        IPV6_STR
        BGP_STR
        SHOW_STR
        IPV6_STR
        BGP_STR
@@ -13321,12 +14027,13 @@ ALIAS (show_bgp_view_neighbor_routes,
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
-       "Display routes learned from neighbor\n")
+       "Display routes learned from neighbor\n"
+       "JavaScript Object Notation\n")
 
 /* old command */
 DEFUN (ipv6_mbgp_neighbor_routes,
        ipv6_mbgp_neighbor_routes_cmd,
 
 /* old command */
 DEFUN (ipv6_mbgp_neighbor_routes,
        ipv6_mbgp_neighbor_routes_cmd,
-       "show ipv6 mbgp neighbors (A.B.C.D|X:X::X:X|WORD) routes",
+       "show ipv6 mbgp neighbors (A.B.C.D|X:X::X:X|WORD) routes {json}",
        SHOW_STR
        IPV6_STR
        MBGP_STR
        SHOW_STR
        IPV6_STR
        MBGP_STR
@@ -13334,32 +14041,40 @@ DEFUN (ipv6_mbgp_neighbor_routes,
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
-       "Display routes learned from neighbor\n")
+       "Display routes learned from neighbor\n"
+       "JavaScript Object Notation\n")
 {
   struct peer *peer;
 {
   struct peer *peer;
+  u_char use_json;
+
+  if (argv[argc - 1] && strcmp(argv[argc - 1], "json") == 0)
+    use_json = 1;
+  else
+    use_json = 0;
 
 
-  peer = peer_lookup_in_view (vty, NULL, argv[0]);
+  peer = peer_lookup_in_view (vty, NULL, argv[0], use_json);
   if (! peer)
     return CMD_WARNING;
  
   return bgp_show_neighbor_route (vty, peer, AFI_IP6, SAFI_MULTICAST,
   if (! peer)
     return CMD_WARNING;
  
   return bgp_show_neighbor_route (vty, peer, AFI_IP6, SAFI_MULTICAST,
-                                 bgp_show_type_neighbor);
+                                 bgp_show_type_neighbor, use_json);
 }
 
 ALIAS (show_bgp_view_neighbor_flap,
        show_bgp_neighbor_flap_cmd,
 }
 
 ALIAS (show_bgp_view_neighbor_flap,
        show_bgp_neighbor_flap_cmd,
-       "show bgp neighbors (A.B.C.D|X:X::X:X|WORD) flap-statistics",
+       "show bgp neighbors (A.B.C.D|X:X::X:X|WORD) flap-statistics {json}",
        SHOW_STR
        BGP_STR
        "Detailed information on TCP and BGP neighbor connections\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        SHOW_STR
        BGP_STR
        "Detailed information on TCP and BGP neighbor connections\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
-       "Display flap statistics of the routes learned from neighbor\n")
+       "Display flap statistics of the routes learned from neighbor\n"
+       "JavaScript Object Notation\n")
 
 ALIAS (show_bgp_view_neighbor_flap,
        show_bgp_ipv6_neighbor_flap_cmd,
 
 ALIAS (show_bgp_view_neighbor_flap,
        show_bgp_ipv6_neighbor_flap_cmd,
-       "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X|WORD) flap-statistics",
+       "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X|WORD) flap-statistics {json}",
        SHOW_STR
        BGP_STR
        "Address family\n"
        SHOW_STR
        BGP_STR
        "Address family\n"
@@ -13367,22 +14082,24 @@ ALIAS (show_bgp_view_neighbor_flap,
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
-       "Display flap statistics of the routes learned from neighbor\n")
+       "Display flap statistics of the routes learned from neighbor\n"
+       "JavaScript Object Notation\n")
 
 ALIAS (show_bgp_view_neighbor_damp,
        show_bgp_neighbor_damp_cmd,
 
 ALIAS (show_bgp_view_neighbor_damp,
        show_bgp_neighbor_damp_cmd,
-       "show bgp neighbors (A.B.C.D|X:X::X:X|WORD) dampened-routes",
+       "show bgp neighbors (A.B.C.D|X:X::X:X|WORD) dampened-routes {json}",
        SHOW_STR
        BGP_STR
        "Detailed information on TCP and BGP neighbor connections\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        SHOW_STR
        BGP_STR
        "Detailed information on TCP and BGP neighbor connections\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
-       "Display the dampened routes received from neighbor\n")
+       "Display the dampened routes received from neighbor\n"
+       "JavaScript Object Notation\n")
 
 ALIAS (show_bgp_view_neighbor_damp,
        show_bgp_ipv6_neighbor_damp_cmd,
 
 ALIAS (show_bgp_view_neighbor_damp,
        show_bgp_ipv6_neighbor_damp_cmd,
-       "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X|WORD) dampened-routes",
+       "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X|WORD) dampened-routes {json}",
        SHOW_STR
        BGP_STR
        "Address family\n"
        SHOW_STR
        BGP_STR
        "Address family\n"
@@ -13390,7 +14107,8 @@ ALIAS (show_bgp_view_neighbor_damp,
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Neighbor on bgp configured interface\n"
-       "Display the dampened routes received from neighbor\n")
+       "Display the dampened routes received from neighbor\n"
+       "JavaScript Object Notation\n")
 
 DEFUN (show_bgp_view_rsclient,
        show_bgp_view_rsclient_cmd,
 
 DEFUN (show_bgp_view_rsclient,
        show_bgp_view_rsclient_cmd,
@@ -13406,9 +14124,9 @@ DEFUN (show_bgp_view_rsclient,
   struct peer *peer;
 
   if (argc == 2)
   struct peer *peer;
 
   if (argc == 2)
-    peer = peer_lookup_in_view (vty, argv[0], argv[1]);
+    peer = peer_lookup_in_view (vty, argv[0], argv[1], 0);
   else
   else
-    peer = peer_lookup_in_view (vty, NULL, argv[0]);
+    peer = peer_lookup_in_view (vty, NULL, argv[0], 0);
 
   if (! peer)
     return CMD_WARNING;
 
   if (! peer)
     return CMD_WARNING;
@@ -13460,10 +14178,10 @@ DEFUN (show_bgp_view_ipv6_safi_rsclient,
   safi_t safi;
 
   if (argc == 3) {
   safi_t safi;
 
   if (argc == 3) {
-    peer = peer_lookup_in_view (vty, argv[0], argv[2]);
+    peer = peer_lookup_in_view (vty, argv[0], argv[2], 0);
     safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
   } else {
     safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
   } else {
-    peer = peer_lookup_in_view (vty, NULL, argv[1]);
+    peer = peer_lookup_in_view (vty, NULL, argv[1], 0);
     safi = (strncmp (argv[0], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
   }
 
     safi = (strncmp (argv[0], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
   }
 
@@ -13537,9 +14255,9 @@ DEFUN (show_bgp_view_rsclient_route,
     }
 
   if (argc == 3)
     }
 
   if (argc == 3)
-    peer = peer_lookup_in_view (vty, argv[0], argv[1]);
+    peer = peer_lookup_in_view (vty, argv[0], argv[1], 0);
   else
   else
-    peer = peer_lookup_in_view (vty, NULL, argv[0]);
+    peer = peer_lookup_in_view (vty, NULL, argv[0], 0);
 
   if (! peer)
     return CMD_WARNING;
 
   if (! peer)
     return CMD_WARNING;
@@ -13612,10 +14330,10 @@ DEFUN (show_bgp_view_ipv6_safi_rsclient_route,
     }
 
   if (argc == 4) {
     }
 
   if (argc == 4) {
-    peer = peer_lookup_in_view (vty, argv[0], argv[2]);
+    peer = peer_lookup_in_view (vty, argv[0], argv[2], 0);
     safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
   } else {
     safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
   } else {
-    peer = peer_lookup_in_view (vty, NULL, argv[1]);
+    peer = peer_lookup_in_view (vty, NULL, argv[1], 0);
     safi = (strncmp (argv[0], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
   }
 
     safi = (strncmp (argv[0], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
   }
 
@@ -13689,9 +14407,9 @@ DEFUN (show_bgp_view_rsclient_prefix,
     }
 
   if (argc == 3)
     }
 
   if (argc == 3)
-    peer = peer_lookup_in_view (vty, argv[0], argv[1]);
+    peer = peer_lookup_in_view (vty, argv[0], argv[1], 0);
   else
   else
-    peer = peer_lookup_in_view (vty, NULL, argv[0]);
+    peer = peer_lookup_in_view (vty, NULL, argv[0], 0);
 
   if (! peer)
     return CMD_WARNING;
 
   if (! peer)
     return CMD_WARNING;
@@ -13764,10 +14482,10 @@ DEFUN (show_bgp_view_ipv6_safi_rsclient_prefix,
     }
 
   if (argc == 4) {
     }
 
   if (argc == 4) {
-    peer = peer_lookup_in_view (vty, argv[0], argv[2]);
+    peer = peer_lookup_in_view (vty, argv[0], argv[2], 0);
     safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
   } else {
     safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
   } else {
-    peer = peer_lookup_in_view (vty, NULL, argv[1]);
+    peer = peer_lookup_in_view (vty, NULL, argv[1], 0);
     safi = (strncmp (argv[0], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
   }
 
     safi = (strncmp (argv[0], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
   }
 
index 865a24d3ff5a0bcc756bcc7ea82b1858ee2997ce..59003438b0bb1c8dedd444aec2e9535f5180677a 100644 (file)
@@ -21,7 +21,6 @@ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 #ifndef _QUAGGA_BGP_ROUTE_H
 #define _QUAGGA_BGP_ROUTE_H
 
 #ifndef _QUAGGA_BGP_ROUTE_H
 #define _QUAGGA_BGP_ROUTE_H
 
-#include "lib/json.h"
 #include "queue.h"
 #include "bgp_table.h"
 
 #include "queue.h"
 #include "bgp_table.h"
 
@@ -299,8 +298,8 @@ extern afi_t bgp_node_afi (struct vty *);
 extern safi_t bgp_node_safi (struct vty *);
 
 extern void route_vty_out (struct vty *, struct prefix *, struct bgp_info *, int, safi_t, json_object *);
 extern safi_t bgp_node_safi (struct vty *);
 
 extern void route_vty_out (struct vty *, struct prefix *, struct bgp_info *, int, safi_t, json_object *);
-extern void route_vty_out_tag (struct vty *, struct prefix *, struct bgp_info *, int, safi_t);
-extern void route_vty_out_tmp (struct vty *, struct prefix *, struct attr *, safi_t);
+extern void route_vty_out_tag (struct vty *, struct prefix *, struct bgp_info *, int, safi_t, json_object *);
+extern void route_vty_out_tmp (struct vty *, struct prefix *, struct attr *, safi_t, u_char, json_object *);
 
 extern int
 subgroup_process_announce_selected (struct update_subgroup *subgrp,
 
 extern int
 subgroup_process_announce_selected (struct update_subgroup *subgrp,
index 4eeca365fbc096a6feea45ea92ac4df374ed7111..d885e5e7d27f66c71218e372a56c911156292075 100644 (file)
@@ -138,13 +138,12 @@ subgrp_show_adjq_vty (struct update_subgroup *subgrp, struct vty *vty,
            }
          if ((flags & UPDWALK_FLAGS_ADVQUEUE) && adj->adv && adj->adv->baa)
            {
            }
          if ((flags & UPDWALK_FLAGS_ADVQUEUE) && adj->adv && adj->adv->baa)
            {
-             route_vty_out_tmp (vty, &rn->p, adj->adv->baa->attr,
-                                SUBGRP_SAFI (subgrp));
+             route_vty_out_tmp (vty, &rn->p, adj->adv->baa->attr, SUBGRP_SAFI (subgrp), 0, NULL);
              output_count++;
            }
          if ((flags & UPDWALK_FLAGS_ADVERTISED) && adj->attr)
            {
              output_count++;
            }
          if ((flags & UPDWALK_FLAGS_ADVERTISED) && adj->attr)
            {
-             route_vty_out_tmp (vty, &rn->p, adj->attr, SUBGRP_SAFI (subgrp));
+             route_vty_out_tmp (vty, &rn->p, adj->attr, SUBGRP_SAFI (subgrp), 0, NULL);
              output_count++;
            }
        }
              output_count++;
            }
        }
index a8e23bf1b4d192282ec6428b82b308319aefca89..7eaccf77d8a4b01688151a6b2f95a18256b77cab 100644 (file)
@@ -20,6 +20,7 @@ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 
 #include <zebra.h>
 
 
 #include <zebra.h>
 
+#include "lib/json.h"
 #include "command.h"
 #include "prefix.h"
 #include "plist.h"
 #include "command.h"
 #include "prefix.h"
 #include "plist.h"
@@ -8573,8 +8574,7 @@ bgp_show_summary (struct vty *vty, struct bgp *bgp, int afi, int safi,
               json_object_int_add(json_peer, "tableVersion", peer->version[afi][safi]);
               json_object_int_add(json_peer, "outq", peer->obuf->count);
               json_object_int_add(json_peer, "inq", 0);
               json_object_int_add(json_peer, "tableVersion", peer->version[afi][safi]);
               json_object_int_add(json_peer, "outq", peer->obuf->count);
               json_object_int_add(json_peer, "inq", 0);
-              json_object_string_add(json_peer, "uptime",
-                                     peer_uptime (peer->uptime, timebuf, BGP_UPTIME_LEN));
+              peer_uptime (peer->uptime, timebuf, BGP_UPTIME_LEN, use_json, json_peer);
               json_object_int_add(json_peer, "prefixReceivedCount", peer->pcount[afi][safi]);
               json_object_int_add(json_peer, "prefixAdvertisedCount", bgp_adj_out_count(peer, afi, safi));
 
               json_object_int_add(json_peer, "prefixReceivedCount", peer->pcount[afi][safi]);
               json_object_int_add(json_peer, "prefixAdvertisedCount", bgp_adj_out_count(peer, afi, safi));
 
@@ -8626,7 +8626,7 @@ bgp_show_summary (struct vty *vty, struct bgp *bgp, int afi, int safi,
                        peer->obuf->count);
 
               vty_out (vty, "%-8s",
                        peer->obuf->count);
 
               vty_out (vty, "%-8s",
-                       peer_uptime (peer->uptime, timebuf, BGP_UPTIME_LEN));
+                       peer_uptime (peer->uptime, timebuf, BGP_UPTIME_LEN, 0, NULL));
 
               if (peer->status == Established)
                   vty_out (vty, " %8ld", peer->pcount[afi][safi]);
 
               if (peer->status == Established)
                   vty_out (vty, " %8ld", peer->pcount[afi][safi]);
@@ -8972,270 +8972,480 @@ enum show_type
 };
 
 static void
 };
 
 static void
-bgp_show_peer_afi_orf_cap (struct vty *vty, struct peer *p,
-                          afi_t afi, safi_t safi,
-                          u_int16_t adv_smcap, u_int16_t adv_rmcap,
-                          u_int16_t rcv_smcap, u_int16_t rcv_rmcap)
+bgp_show_peer_afi_orf_cap (struct vty *vty, struct peer *p, afi_t afi, safi_t safi,
+                           u_int16_t adv_smcap, u_int16_t adv_rmcap, u_int16_t rcv_smcap,
+                           u_int16_t rcv_rmcap, u_char use_json, json_object *json_pref)
 {
   /* Send-Mode */
   if (CHECK_FLAG (p->af_cap[afi][safi], adv_smcap)
       || CHECK_FLAG (p->af_cap[afi][safi], rcv_smcap))
     {
 {
   /* Send-Mode */
   if (CHECK_FLAG (p->af_cap[afi][safi], adv_smcap)
       || CHECK_FLAG (p->af_cap[afi][safi], rcv_smcap))
     {
-      vty_out (vty, "      Send-mode: ");
-      if (CHECK_FLAG (p->af_cap[afi][safi], adv_smcap))
-       vty_out (vty, "advertised");
-      if (CHECK_FLAG (p->af_cap[afi][safi], rcv_smcap))
-       vty_out (vty, "%sreceived",
-                CHECK_FLAG (p->af_cap[afi][safi], adv_smcap) ?
-                ", " : "");
-      vty_out (vty, "%s", VTY_NEWLINE);
+      if (use_json)
+        {
+          if (CHECK_FLAG (p->af_cap[afi][safi], adv_smcap) && CHECK_FLAG (p->af_cap[afi][safi], rcv_smcap))
+           json_object_string_add(json_pref, "sendMode", "advertisedAndReceived");
+          else if (CHECK_FLAG (p->af_cap[afi][safi], adv_smcap))
+           json_object_string_add(json_pref, "sendMode", "advertised");
+          else if (CHECK_FLAG (p->af_cap[afi][safi], rcv_smcap))
+           json_object_string_add(json_pref, "sendMode", "received");
+        }
+      else
+        {
+          vty_out (vty, "      Send-mode: ");
+          if (CHECK_FLAG (p->af_cap[afi][safi], adv_smcap))
+           vty_out (vty, "advertised");
+          if (CHECK_FLAG (p->af_cap[afi][safi], rcv_smcap))
+           vty_out (vty, "%sreceived",
+                    CHECK_FLAG (p->af_cap[afi][safi], adv_smcap) ?
+                    ", " : "");
+          vty_out (vty, "%s", VTY_NEWLINE);
+        }
     }
 
   /* Receive-Mode */
   if (CHECK_FLAG (p->af_cap[afi][safi], adv_rmcap)
       || CHECK_FLAG (p->af_cap[afi][safi], rcv_rmcap))
     {
     }
 
   /* Receive-Mode */
   if (CHECK_FLAG (p->af_cap[afi][safi], adv_rmcap)
       || CHECK_FLAG (p->af_cap[afi][safi], rcv_rmcap))
     {
-      vty_out (vty, "      Receive-mode: ");
-      if (CHECK_FLAG (p->af_cap[afi][safi], adv_rmcap))
-       vty_out (vty, "advertised");
-      if (CHECK_FLAG (p->af_cap[afi][safi], rcv_rmcap))
-       vty_out (vty, "%sreceived",
-                CHECK_FLAG (p->af_cap[afi][safi], adv_rmcap) ?
-                ", " : "");
-      vty_out (vty, "%s", VTY_NEWLINE);
+      if (use_json)
+        {
+          if (CHECK_FLAG (p->af_cap[afi][safi], adv_rmcap) && CHECK_FLAG (p->af_cap[afi][safi], rcv_rmcap))
+           json_object_string_add(json_pref, "recvMode", "advertisedAndReceived");
+          else if (CHECK_FLAG (p->af_cap[afi][safi], adv_rmcap))
+           json_object_string_add(json_pref, "recvMode", "advertised");
+          else if (CHECK_FLAG (p->af_cap[afi][safi], rcv_rmcap))
+           json_object_string_add(json_pref, "recvMode", "received");
+        }
+      else
+        {
+          vty_out (vty, "      Receive-mode: ");
+          if (CHECK_FLAG (p->af_cap[afi][safi], adv_rmcap))
+           vty_out (vty, "advertised");
+          if (CHECK_FLAG (p->af_cap[afi][safi], rcv_rmcap))
+            vty_out (vty, "%sreceived",
+                     CHECK_FLAG (p->af_cap[afi][safi], adv_rmcap) ?
+                     ", " : "");
+          vty_out (vty, "%s", VTY_NEWLINE);
+        }
     }
 }
 
 static void
     }
 }
 
 static void
-bgp_show_peer_afi (struct vty *vty, struct peer *p, afi_t afi, safi_t safi)
+bgp_show_peer_afi (struct vty *vty, struct peer *p, afi_t afi, safi_t safi,
+                   u_char use_json, json_object *json_neigh)
 {
   struct bgp_filter *filter;
   struct peer_af *paf;
   char orf_pfx_name[BUFSIZ];
   int orf_pfx_count;
 {
   struct bgp_filter *filter;
   struct peer_af *paf;
   char orf_pfx_name[BUFSIZ];
   int orf_pfx_count;
+  json_object *json_af = NULL;
+  json_object *json_prefA = NULL;
+  json_object *json_prefB = NULL;
+  json_object *json_addr = NULL;
 
 
-  filter = &p->filter[afi][safi];
+  if (use_json)
+    {
+      json_addr = json_object_new_object();
+      json_af = json_object_new_object();
+      json_prefA = json_object_new_object();
+      json_prefB = json_object_new_object();
+      filter = &p->filter[afi][safi];
 
 
-  vty_out (vty, " For address family: %s%s", afi_safi_print (afi, safi),
-          VTY_NEWLINE);
+      if (p->af_group[afi][safi])
+        json_object_string_add(json_addr, "peerGroupMember", p->group->name);
 
 
-  if (p->af_group[afi][safi])
-    vty_out (vty, "  %s peer-group member%s", p->group->name, VTY_NEWLINE);
-
-  paf = peer_af_find(p, afi, safi);
-  if (paf && PAF_SUBGRP(paf))
-    {
-      vty_out (vty, "  Update group %" PRIu64 ", subgroup %" PRIu64 "%s",
-              PAF_UPDGRP(paf)->id, PAF_SUBGRP(paf)->id, VTY_NEWLINE);
-      vty_out (vty, "  Packet Queue length %d%s",
-              bpacket_queue_virtual_length(paf), VTY_NEWLINE);
-    } else
-    {
-      vty_out(vty, "  Not part of any update group%s", VTY_NEWLINE);
-    }
-  if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_ADV)
-      || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_RCV)
-      || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_OLD_RCV)
-      || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_ADV)
-      || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_RCV)
-      || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_OLD_RCV))
-    vty_out (vty, "  AF-dependant capabilities:%s", VTY_NEWLINE);
-
-  if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_ADV)
-      || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_RCV)
-      || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_ADV)
-      || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_RCV))
-    {
-      vty_out (vty, "    Outbound Route Filter (ORF) type (%d) Prefix-list:%s",
-              ORF_TYPE_PREFIX, VTY_NEWLINE);
-      bgp_show_peer_afi_orf_cap (vty, p, afi, safi,
-                                PEER_CAP_ORF_PREFIX_SM_ADV,
-                                PEER_CAP_ORF_PREFIX_RM_ADV,
-                                PEER_CAP_ORF_PREFIX_SM_RCV,
-                                PEER_CAP_ORF_PREFIX_RM_RCV);
-    }
-  if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_ADV)
-      || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_OLD_RCV)
-      || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_ADV)
-      || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_OLD_RCV))
-    {
-      vty_out (vty, "    Outbound Route Filter (ORF) type (%d) Prefix-list:%s",
-              ORF_TYPE_PREFIX_OLD, VTY_NEWLINE);
-      bgp_show_peer_afi_orf_cap (vty, p, afi, safi,
-                                PEER_CAP_ORF_PREFIX_SM_ADV,
-                                PEER_CAP_ORF_PREFIX_RM_ADV,
-                                PEER_CAP_ORF_PREFIX_SM_OLD_RCV,
-                                PEER_CAP_ORF_PREFIX_RM_OLD_RCV);
-    }
-
-  sprintf (orf_pfx_name, "%s.%d.%d", p->host, afi, safi);
-  orf_pfx_count =  prefix_bgp_show_prefix_list (NULL, afi, orf_pfx_name);
-
-  if (CHECK_FLAG (p->af_sflags[afi][safi], PEER_STATUS_ORF_PREFIX_SEND)
-      || orf_pfx_count)
-    {
-      vty_out (vty, "  Outbound Route Filter (ORF):");
-      if (CHECK_FLAG (p->af_sflags[afi][safi], PEER_STATUS_ORF_PREFIX_SEND))
-         vty_out (vty, " sent;");
-      if (orf_pfx_count)
-       vty_out (vty, " received (%d entries)", orf_pfx_count);
-      vty_out (vty, "%s", VTY_NEWLINE);
-    }
-  if (CHECK_FLAG (p->af_sflags[afi][safi], PEER_STATUS_ORF_WAIT_REFRESH))
-      vty_out (vty, "  First update is deferred until ORF or ROUTE-REFRESH is received%s", VTY_NEWLINE);
-
-  if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_REFLECTOR_CLIENT))
-    vty_out (vty, "  Route-Reflector Client%s", VTY_NEWLINE);
-  if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
-    vty_out (vty, "  Route-Server Client%s", VTY_NEWLINE);
-  if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG))
-    vty_out (vty, "  Inbound soft reconfiguration allowed%s", VTY_NEWLINE);
-
-  if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE))
-    vty_out (vty, "  Private AS numbers replaced in updates to this neighbor%s", VTY_NEWLINE);
-  else if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_REMOVE_PRIVATE_AS))
-    vty_out (vty, "  Private AS numbers removed in updates to this neighbor%s", VTY_NEWLINE);
-
-  if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_AS_OVERRIDE))
-    vty_out (vty, "  Override ASNs in outbound updates if aspath equals remote-as%s", VTY_NEWLINE);
-
-  if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_NEXTHOP_SELF) ||
-      CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_FORCE_NEXTHOP_SELF))
-    vty_out (vty, "  NEXT_HOP is always this router%s", VTY_NEWLINE);
-  if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_AS_PATH_UNCHANGED))
-    vty_out (vty, "  AS_PATH is propagated unchanged to this neighbor%s", VTY_NEWLINE);
-  if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_NEXTHOP_UNCHANGED))
-    vty_out (vty, "  NEXT_HOP is propagated unchanged to this neighbor%s", VTY_NEWLINE);
-  if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_MED_UNCHANGED))
-    vty_out (vty, "  MED is propagated unchanged to this neighbor%s", VTY_NEWLINE);
-  if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_SEND_COMMUNITY)
-      || CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_SEND_EXT_COMMUNITY))
-    {
-      vty_out (vty, "  Community attribute sent to this neighbor");
+      paf = peer_af_find(p, afi, safi);
+      if (paf && PAF_SUBGRP(paf))
+        {
+          json_object_int_add(json_addr, "updateGroupId", PAF_UPDGRP(paf)->id);
+          json_object_int_add(json_addr, "subGroupId", PAF_SUBGRP(paf)->id);
+          json_object_int_add(json_addr, "packetQueueLength", bpacket_queue_virtual_length(paf));
+        }
+
+      if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_ADV)
+          || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_RCV)
+          || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_ADV)
+          || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_RCV))
+        {
+          json_object_int_add(json_af, "orfType", ORF_TYPE_PREFIX);
+          bgp_show_peer_afi_orf_cap (vty, p, afi, safi,
+                                    PEER_CAP_ORF_PREFIX_SM_ADV,
+                                    PEER_CAP_ORF_PREFIX_RM_ADV,
+                                    PEER_CAP_ORF_PREFIX_SM_RCV,
+                                    PEER_CAP_ORF_PREFIX_RM_RCV, use_json, json_prefA);
+          json_object_object_add(json_af, "orfPrefixList", json_prefA);
+        }
+
+      if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_ADV)
+          || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_OLD_RCV)
+          || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_ADV)
+          || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_OLD_RCV))
+        {
+          json_object_int_add(json_af, "orfOldType", ORF_TYPE_PREFIX_OLD);
+          bgp_show_peer_afi_orf_cap (vty, p, afi, safi,
+                                    PEER_CAP_ORF_PREFIX_SM_ADV,
+                                    PEER_CAP_ORF_PREFIX_RM_ADV,
+                                    PEER_CAP_ORF_PREFIX_SM_OLD_RCV,
+                                    PEER_CAP_ORF_PREFIX_RM_OLD_RCV, use_json, json_prefB);
+          json_object_object_add(json_af, "orfOldPrefixList", json_prefB);
+        }
+
+      if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_ADV)
+          || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_RCV)
+          || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_OLD_RCV)
+          || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_ADV)
+          || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_RCV)
+          || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_OLD_RCV))
+        json_object_object_add(json_addr, "afDependentCap", json_af);
+
+      sprintf (orf_pfx_name, "%s.%d.%d", p->host, afi, safi);
+      orf_pfx_count =  prefix_bgp_show_prefix_list (NULL, afi, orf_pfx_name, use_json);
+
+      if (CHECK_FLAG (p->af_sflags[afi][safi], PEER_STATUS_ORF_PREFIX_SEND)
+          || orf_pfx_count)
+        {
+          if (CHECK_FLAG (p->af_sflags[afi][safi], PEER_STATUS_ORF_PREFIX_SEND))
+           json_object_boolean_true_add(json_neigh, "orfSent");
+          if (orf_pfx_count)
+            json_object_int_add(json_addr, "orfRecvCounter", orf_pfx_count);
+        }
+      if (CHECK_FLAG (p->af_sflags[afi][safi], PEER_STATUS_ORF_WAIT_REFRESH))
+        json_object_string_add(json_addr, "orfFirstUpdate", "deferredUntilORFOrRouteRefreshRecvd");
+
+      if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_REFLECTOR_CLIENT))
+        json_object_boolean_true_add(json_addr, "routeReflectorClient");
+      if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
+        json_object_boolean_true_add(json_addr, "routeServerClient");
+      if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG))
+        json_object_boolean_true_add(json_addr, "inboundSoftConfigPermit");
+
+      if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE))
+        json_object_boolean_true_add(json_addr, "privateAsNumsReplacedInUpdatesToNbr");
+      else if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_REMOVE_PRIVATE_AS))
+        json_object_boolean_true_add(json_addr, "privateAsNumsRemovedInUpdatesToNbr");
+
+      if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_AS_OVERRIDE))
+        json_object_string_add(json_addr, "overrideASNsInOutboundUpdates", "ifAspathEqualRemoteAs");
+
+      if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_NEXTHOP_SELF) ||
+          CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_FORCE_NEXTHOP_SELF))
+        json_object_boolean_true_add(json_addr, "routerAlwaysNextHop");
+      if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_AS_PATH_UNCHANGED))
+        json_object_boolean_true_add(json_addr, "unchangedAsPathPropogatedToNbr");
+      if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_NEXTHOP_UNCHANGED))
+        json_object_boolean_true_add(json_addr, "unchangedNextHopPropogatedToNbr");
+      if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_MED_UNCHANGED))
+        json_object_boolean_true_add(json_addr, "unchangedMedPropogatedToNbr");
       if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_SEND_COMMUNITY)
       if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_SEND_COMMUNITY)
-       && CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_SEND_EXT_COMMUNITY))
-       vty_out (vty, "(both)%s", VTY_NEWLINE);
-      else if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_SEND_EXT_COMMUNITY))
-       vty_out (vty, "(extended)%s", VTY_NEWLINE);
-      else 
-       vty_out (vty, "(standard)%s", VTY_NEWLINE);
-    }
-  if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_DEFAULT_ORIGINATE))
-    {
-      vty_out (vty, "  Default information originate,");
-
-      if (p->default_rmap[afi][safi].name)
-       vty_out (vty, " default route-map %s%s,",
-                p->default_rmap[afi][safi].map ? "*" : "",
-                p->default_rmap[afi][safi].name);
-      if (paf && PAF_SUBGRP(paf) && CHECK_FLAG(PAF_SUBGRP(paf)->sflags,
-                                            SUBGRP_STATUS_DEFAULT_ORIGINATE))
-       vty_out (vty, " default sent%s", VTY_NEWLINE);
+          || CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_SEND_EXT_COMMUNITY))
+        {
+          if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_SEND_COMMUNITY)
+             && CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_SEND_EXT_COMMUNITY))
+           json_object_string_add(json_addr, "commAttriSentToNbr", "extendedAndStandard");
+          else if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_SEND_EXT_COMMUNITY))
+           json_object_string_add(json_addr, "commAttriSentToNbr", "extended");
+          else
+           json_object_string_add(json_addr, "commAttriSentToNbr", "standard");
+        }
+      if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_DEFAULT_ORIGINATE))
+        {
+          if (p->default_rmap[afi][safi].name)
+           json_object_string_add(json_addr, "defaultRouteMap", p->default_rmap[afi][safi].name);
+
+          if (paf && PAF_SUBGRP(paf) && CHECK_FLAG(PAF_SUBGRP(paf)->sflags, SUBGRP_STATUS_DEFAULT_ORIGINATE))
+            json_object_boolean_true_add(json_addr, "defaultSent");
+          else
+            json_object_boolean_true_add(json_addr, "defaultNotSent");
+        }
+
+      if (filter->plist[FILTER_IN].name
+          || filter->dlist[FILTER_IN].name
+          || filter->aslist[FILTER_IN].name
+          || filter->map[RMAP_IN].name)
+        json_object_boolean_true_add(json_addr, "inboundPathPolicyConfig");
+      if (filter->plist[FILTER_OUT].name
+          || filter->dlist[FILTER_OUT].name
+          || filter->aslist[FILTER_OUT].name
+          || filter->map[RMAP_OUT].name
+          || filter->usmap.name)
+        json_object_boolean_true_add(json_addr, "outboundPathPolicyConfig");
+      if (filter->map[RMAP_IMPORT].name)
+        json_object_boolean_true_add(json_addr, "importPolicyRsClientConfig");
+      if (filter->map[RMAP_EXPORT].name)
+        json_object_boolean_true_add(json_addr, "exportPolicyRsClientConfig");
+
+      /* prefix-list */
+      if (filter->plist[FILTER_IN].name)
+        json_object_string_add(json_addr, "incomingUpdatePrefixFilterList", filter->plist[FILTER_IN].name);
+      if (filter->plist[FILTER_OUT].name)
+        json_object_string_add(json_addr, "outgoingUpdatePrefixFilterList", filter->plist[FILTER_OUT].name);
+
+      /* distribute-list */
+      if (filter->dlist[FILTER_IN].name)
+        json_object_string_add(json_addr, "incomingUpdateNetworkFilterList", filter->dlist[FILTER_IN].name);
+      if (filter->dlist[FILTER_OUT].name)
+        json_object_string_add(json_addr, "outgoingUpdateNetworkFilterList", filter->dlist[FILTER_OUT].name);
+
+      /* filter-list. */
+      if (filter->aslist[FILTER_IN].name)
+        json_object_string_add(json_addr, "incomingUpdateAsPathFilterList", filter->aslist[FILTER_IN].name);
+      if (filter->aslist[FILTER_OUT].name)
+        json_object_string_add(json_addr, "outgoingUpdateAsPathFilterList", filter->aslist[FILTER_OUT].name);
+
+      /* route-map. */
+      if (filter->map[RMAP_IN].name)
+        json_object_string_add(json_addr, "routeMapForIncomingAdvertisements", filter->map[RMAP_IN].name);
+      if (filter->map[RMAP_OUT].name)
+        json_object_string_add(json_addr, "routeMapForOutgoingAdvertisements", filter->map[RMAP_OUT].name);
+      if (filter->map[RMAP_IMPORT].name)
+        json_object_string_add(json_addr, "routeMapForAdvertisementsIntoRsClient", filter->map[RMAP_IMPORT].name);
+      if (filter->map[RMAP_EXPORT].name)
+        json_object_string_add(json_addr, "routeMapForAdvertisementsFromRsClient", filter->map[RMAP_EXPORT].name);
+
+      /* unsuppress-map */
+      if (filter->usmap.name)
+        json_object_string_add(json_addr, "selectiveUnsuppressRouteMap", filter->usmap.name);
+
+      /* Receive prefix count */
+      json_object_int_add(json_addr, "acceptedPrefixCounter", p->pcount[afi][safi]);
+
+      /* Maximum prefix */
+      if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX))
+        {
+          json_object_int_add(json_addr, "prefixAllowedMax", p->pmax[afi][safi]);
+          if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_WARNING))
+            json_object_boolean_true_add(json_addr, "prefixAllowedMaxWarning");
+          json_object_int_add(json_addr, "prefixAllowedWarningThresh", p->pmax_threshold[afi][safi]);
+          if (p->pmax_restart[afi][safi])
+            json_object_int_add(json_addr, "prefixAllowedRestartIntervalMsecs", p->pmax_restart[afi][safi] * 60000);
+        }
+      json_object_object_add(json_neigh, afi_safi_print (afi, safi), json_addr);
+
+    }
+  else
+    {
+      filter = &p->filter[afi][safi];
+
+      vty_out (vty, " For address family: %s%s", afi_safi_print (afi, safi),
+              VTY_NEWLINE);
+
+      if (p->af_group[afi][safi])
+        vty_out (vty, "  %s peer-group member%s", p->group->name, VTY_NEWLINE);
+
+      paf = peer_af_find(p, afi, safi);
+      if (paf && PAF_SUBGRP(paf))
+        {
+          vty_out (vty, "  Update group %" PRIu64 ", subgroup %" PRIu64 "%s",
+                  PAF_UPDGRP(paf)->id, PAF_SUBGRP(paf)->id, VTY_NEWLINE);
+          vty_out (vty, "  Packet Queue length %d%s",
+                   bpacket_queue_virtual_length(paf), VTY_NEWLINE);
+        }
       else
       else
-       vty_out (vty, " default not sent%s", VTY_NEWLINE);
-    }
-
-  if (filter->plist[FILTER_IN].name
-      || filter->dlist[FILTER_IN].name
-      || filter->aslist[FILTER_IN].name
-      || filter->map[RMAP_IN].name)
-    vty_out (vty, "  Inbound path policy configured%s", VTY_NEWLINE);
-  if (filter->plist[FILTER_OUT].name
-      || filter->dlist[FILTER_OUT].name
-      || filter->aslist[FILTER_OUT].name
-      || filter->map[RMAP_OUT].name
-      || filter->usmap.name)
-    vty_out (vty, "  Outbound path policy configured%s", VTY_NEWLINE);
-  if (filter->map[RMAP_IMPORT].name)
-    vty_out (vty, "  Import policy for this RS-client configured%s", VTY_NEWLINE);
-  if (filter->map[RMAP_EXPORT].name)
-    vty_out (vty, "  Export policy for this RS-client configured%s", VTY_NEWLINE);
-
-  /* prefix-list */
-  if (filter->plist[FILTER_IN].name)
-    vty_out (vty, "  Incoming update prefix filter list is %s%s%s",
-            filter->plist[FILTER_IN].plist ? "*" : "",
-            filter->plist[FILTER_IN].name,
-            VTY_NEWLINE);
-  if (filter->plist[FILTER_OUT].name)
-    vty_out (vty, "  Outgoing update prefix filter list is %s%s%s",
-            filter->plist[FILTER_OUT].plist ? "*" : "",
-            filter->plist[FILTER_OUT].name,
-            VTY_NEWLINE);
+        {
+          vty_out(vty, "  Not part of any update group%s", VTY_NEWLINE);
+        }
+      if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_ADV)
+          || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_RCV)
+          || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_OLD_RCV)
+          || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_ADV)
+          || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_RCV)
+          || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_OLD_RCV))
+        vty_out (vty, "  AF-dependant capabilities:%s", VTY_NEWLINE);
+
+      if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_ADV)
+          || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_RCV)
+          || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_ADV)
+          || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_RCV))
+        {
+          vty_out (vty, "    Outbound Route Filter (ORF) type (%d) Prefix-list:%s",
+                   ORF_TYPE_PREFIX, VTY_NEWLINE);
+          bgp_show_peer_afi_orf_cap (vty, p, afi, safi,
+                                    PEER_CAP_ORF_PREFIX_SM_ADV,
+                                    PEER_CAP_ORF_PREFIX_RM_ADV,
+                                    PEER_CAP_ORF_PREFIX_SM_RCV,
+                                    PEER_CAP_ORF_PREFIX_RM_RCV, use_json, NULL);
+        }
+      if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_ADV)
+          || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_OLD_RCV)
+          || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_ADV)
+          || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_OLD_RCV))
+        {
+          vty_out (vty, "    Outbound Route Filter (ORF) type (%d) Prefix-list:%s",
+                  ORF_TYPE_PREFIX_OLD, VTY_NEWLINE);
+          bgp_show_peer_afi_orf_cap (vty, p, afi, safi,
+                                    PEER_CAP_ORF_PREFIX_SM_ADV,
+                                    PEER_CAP_ORF_PREFIX_RM_ADV,
+                                    PEER_CAP_ORF_PREFIX_SM_OLD_RCV,
+                                    PEER_CAP_ORF_PREFIX_RM_OLD_RCV, use_json, NULL);
+        }
 
 
-  /* distribute-list */
-  if (filter->dlist[FILTER_IN].name)
-    vty_out (vty, "  Incoming update network filter list is %s%s%s",
-            filter->dlist[FILTER_IN].alist ? "*" : "",
-            filter->dlist[FILTER_IN].name,
-            VTY_NEWLINE);
-  if (filter->dlist[FILTER_OUT].name)
-    vty_out (vty, "  Outgoing update network filter list is %s%s%s",
-            filter->dlist[FILTER_OUT].alist ? "*" : "",
-            filter->dlist[FILTER_OUT].name,
-            VTY_NEWLINE);
+      sprintf (orf_pfx_name, "%s.%d.%d", p->host, afi, safi);
+      orf_pfx_count =  prefix_bgp_show_prefix_list (NULL, afi, orf_pfx_name, use_json);
 
 
-  /* filter-list. */
-  if (filter->aslist[FILTER_IN].name)
-    vty_out (vty, "  Incoming update AS path filter list is %s%s%s",
-            filter->aslist[FILTER_IN].aslist ? "*" : "",
-            filter->aslist[FILTER_IN].name,
-            VTY_NEWLINE);
-  if (filter->aslist[FILTER_OUT].name)
-    vty_out (vty, "  Outgoing update AS path filter list is %s%s%s",
-            filter->aslist[FILTER_OUT].aslist ? "*" : "",
-            filter->aslist[FILTER_OUT].name,
-            VTY_NEWLINE);
+      if (CHECK_FLAG (p->af_sflags[afi][safi], PEER_STATUS_ORF_PREFIX_SEND)
+          || orf_pfx_count)
+        {
+          vty_out (vty, "  Outbound Route Filter (ORF):");
+          if (CHECK_FLAG (p->af_sflags[afi][safi], PEER_STATUS_ORF_PREFIX_SEND))
+             vty_out (vty, " sent;");
+          if (orf_pfx_count)
+            vty_out (vty, " received (%d entries)", orf_pfx_count);
+          vty_out (vty, "%s", VTY_NEWLINE);
+        }
+      if (CHECK_FLAG (p->af_sflags[afi][safi], PEER_STATUS_ORF_WAIT_REFRESH))
+          vty_out (vty, "  First update is deferred until ORF or ROUTE-REFRESH is received%s", VTY_NEWLINE);
+
+      if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_REFLECTOR_CLIENT))
+        vty_out (vty, "  Route-Reflector Client%s", VTY_NEWLINE);
+      if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
+        vty_out (vty, "  Route-Server Client%s", VTY_NEWLINE);
+      if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG))
+        vty_out (vty, "  Inbound soft reconfiguration allowed%s", VTY_NEWLINE);
+
+      if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE))
+        vty_out (vty, "  Private AS numbers replaced in updates to this neighbor%s", VTY_NEWLINE);
+      else if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_REMOVE_PRIVATE_AS))
+        vty_out (vty, "  Private AS numbers removed in updates to this neighbor%s", VTY_NEWLINE);
+
+      if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_AS_OVERRIDE))
+        vty_out (vty, "  Override ASNs in outbound updates if aspath equals remote-as%s", VTY_NEWLINE);
+
+      if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_NEXTHOP_SELF) ||
+          CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_FORCE_NEXTHOP_SELF))
+        vty_out (vty, "  NEXT_HOP is always this router%s", VTY_NEWLINE);
+      if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_AS_PATH_UNCHANGED))
+        vty_out (vty, "  AS_PATH is propagated unchanged to this neighbor%s", VTY_NEWLINE);
+      if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_NEXTHOP_UNCHANGED))
+        vty_out (vty, "  NEXT_HOP is propagated unchanged to this neighbor%s", VTY_NEWLINE);
+      if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_MED_UNCHANGED))
+        vty_out (vty, "  MED is propagated unchanged to this neighbor%s", VTY_NEWLINE);
+      if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_SEND_COMMUNITY)
+          || CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_SEND_EXT_COMMUNITY))
+        {
+          vty_out (vty, "  Community attribute sent to this neighbor");
+          if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_SEND_COMMUNITY)
+             && CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_SEND_EXT_COMMUNITY))
+           vty_out (vty, "(both)%s", VTY_NEWLINE);
+          else if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_SEND_EXT_COMMUNITY))
+           vty_out (vty, "(extended)%s", VTY_NEWLINE);
+          else
+           vty_out (vty, "(standard)%s", VTY_NEWLINE);
+        }
+      if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_DEFAULT_ORIGINATE))
+        {
+          vty_out (vty, "  Default information originate,");
+
+          if (p->default_rmap[afi][safi].name)
+           vty_out (vty, " default route-map %s%s,",
+                    p->default_rmap[afi][safi].map ? "*" : "",
+                    p->default_rmap[afi][safi].name);
+          if (paf && PAF_SUBGRP(paf) && CHECK_FLAG(PAF_SUBGRP(paf)->sflags, SUBGRP_STATUS_DEFAULT_ORIGINATE))
+            vty_out (vty, " default sent%s", VTY_NEWLINE);
+          else
+            vty_out (vty, " default not sent%s", VTY_NEWLINE);
+        }
 
 
-  /* route-map. */
-  if (filter->map[RMAP_IN].name)
-    vty_out (vty, "  Route map for incoming advertisements is %s%s%s",
-            filter->map[RMAP_IN].map ? "*" : "",
-            filter->map[RMAP_IN].name,
-            VTY_NEWLINE);
-  if (filter->map[RMAP_OUT].name)
-    vty_out (vty, "  Route map for outgoing advertisements is %s%s%s",
-            filter->map[RMAP_OUT].map ? "*" : "",
-            filter->map[RMAP_OUT].name,
-            VTY_NEWLINE);
-  if (filter->map[RMAP_IMPORT].name)
-    vty_out (vty, "  Route map for advertisements going into this RS-client's table is %s%s%s",
-            filter->map[RMAP_IMPORT].map ? "*" : "",
-            filter->map[RMAP_IMPORT].name,
-            VTY_NEWLINE);
-  if (filter->map[RMAP_EXPORT].name)
-    vty_out (vty, "  Route map for advertisements coming from this RS-client is %s%s%s",
-            filter->map[RMAP_EXPORT].map ? "*" : "",
-            filter->map[RMAP_EXPORT].name,
-            VTY_NEWLINE);
+      if (filter->plist[FILTER_IN].name
+          || filter->dlist[FILTER_IN].name
+          || filter->aslist[FILTER_IN].name
+          || filter->map[RMAP_IN].name)
+        vty_out (vty, "  Inbound path policy configured%s", VTY_NEWLINE);
+      if (filter->plist[FILTER_OUT].name
+          || filter->dlist[FILTER_OUT].name
+          || filter->aslist[FILTER_OUT].name
+          || filter->map[RMAP_OUT].name
+          || filter->usmap.name)
+        vty_out (vty, "  Outbound path policy configured%s", VTY_NEWLINE);
+      if (filter->map[RMAP_IMPORT].name)
+        vty_out (vty, "  Import policy for this RS-client configured%s", VTY_NEWLINE);
+      if (filter->map[RMAP_EXPORT].name)
+        vty_out (vty, "  Export policy for this RS-client configured%s", VTY_NEWLINE);
+
+      /* prefix-list */
+      if (filter->plist[FILTER_IN].name)
+        vty_out (vty, "  Incoming update prefix filter list is %s%s%s",
+                filter->plist[FILTER_IN].plist ? "*" : "",
+                filter->plist[FILTER_IN].name,
+                VTY_NEWLINE);
+      if (filter->plist[FILTER_OUT].name)
+        vty_out (vty, "  Outgoing update prefix filter list is %s%s%s",
+                filter->plist[FILTER_OUT].plist ? "*" : "",
+                filter->plist[FILTER_OUT].name,
+                VTY_NEWLINE);
+
+      /* distribute-list */
+      if (filter->dlist[FILTER_IN].name)
+        vty_out (vty, "  Incoming update network filter list is %s%s%s",
+                filter->dlist[FILTER_IN].alist ? "*" : "",
+                filter->dlist[FILTER_IN].name,
+                VTY_NEWLINE);
+      if (filter->dlist[FILTER_OUT].name)
+        vty_out (vty, "  Outgoing update network filter list is %s%s%s",
+                filter->dlist[FILTER_OUT].alist ? "*" : "",
+                filter->dlist[FILTER_OUT].name,
+                VTY_NEWLINE);
+
+      /* filter-list. */
+      if (filter->aslist[FILTER_IN].name)
+        vty_out (vty, "  Incoming update AS path filter list is %s%s%s",
+                filter->aslist[FILTER_IN].aslist ? "*" : "",
+                filter->aslist[FILTER_IN].name,
+                VTY_NEWLINE);
+      if (filter->aslist[FILTER_OUT].name)
+        vty_out (vty, "  Outgoing update AS path filter list is %s%s%s",
+                filter->aslist[FILTER_OUT].aslist ? "*" : "",
+                filter->aslist[FILTER_OUT].name,
+                VTY_NEWLINE);
+
+      /* route-map. */
+      if (filter->map[RMAP_IN].name)
+        vty_out (vty, "  Route map for incoming advertisements is %s%s%s",
+                 filter->map[RMAP_IN].map ? "*" : "",
+                 filter->map[RMAP_IN].name,
+                VTY_NEWLINE);
+      if (filter->map[RMAP_OUT].name)
+        vty_out (vty, "  Route map for outgoing advertisements is %s%s%s",
+                 filter->map[RMAP_OUT].map ? "*" : "",
+                 filter->map[RMAP_OUT].name,
+                 VTY_NEWLINE);
+      if (filter->map[RMAP_IMPORT].name)
+        vty_out (vty, "  Route map for advertisements going into this RS-client's table is %s%s%s",
+                 filter->map[RMAP_IMPORT].map ? "*" : "",
+                 filter->map[RMAP_IMPORT].name,
+                 VTY_NEWLINE);
+      if (filter->map[RMAP_EXPORT].name)
+        vty_out (vty, "  Route map for advertisements coming from this RS-client is %s%s%s",
+                 filter->map[RMAP_EXPORT].map ? "*" : "",
+                 filter->map[RMAP_EXPORT].name,
+                VTY_NEWLINE);
+
+      /* unsuppress-map */
+      if (filter->usmap.name)
+        vty_out (vty, "  Route map for selective unsuppress is %s%s%s",
+                filter->usmap.map ? "*" : "",
+                filter->usmap.name, VTY_NEWLINE);
+
+      /* Receive prefix count */
+      vty_out (vty, "  %ld accepted prefixes%s", p->pcount[afi][safi], VTY_NEWLINE);
+
+      /* Maximum prefix */
+      if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX))
+        {
+          vty_out (vty, "  Maximum prefixes allowed %ld%s%s", p->pmax[afi][safi],
+                  CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_WARNING)
+                  ? " (warning-only)" : "", VTY_NEWLINE);
+          vty_out (vty, "  Threshold for warning message %d%%",
+                  p->pmax_threshold[afi][safi]);
+          if (p->pmax_restart[afi][safi])
+            vty_out (vty, ", restart interval %d min", p->pmax_restart[afi][safi]);
+          vty_out (vty, "%s", VTY_NEWLINE);
+        }
 
 
-  /* unsuppress-map */
-  if (filter->usmap.name)
-    vty_out (vty, "  Route map for selective unsuppress is %s%s%s",
-            filter->usmap.map ? "*" : "",
-            filter->usmap.name, VTY_NEWLINE);
-
-  /* Receive prefix count */
-  vty_out (vty, "  %ld accepted prefixes%s", p->pcount[afi][safi], VTY_NEWLINE);
-
-  /* Maximum prefix */
-  if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX))
-    {
-      vty_out (vty, "  Maximum prefixes allowed %ld%s%s", p->pmax[afi][safi],
-              CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_WARNING)
-              ? " (warning-only)" : "", VTY_NEWLINE);
-      vty_out (vty, "  Threshold for warning message %d%%",
-              p->pmax_threshold[afi][safi]);
-      if (p->pmax_restart[afi][safi])
-       vty_out (vty, ", restart interval %d min", p->pmax_restart[afi][safi]);
       vty_out (vty, "%s", VTY_NEWLINE);
     }
       vty_out (vty, "%s", VTY_NEWLINE);
     }
-
-  vty_out (vty, "%s", VTY_NEWLINE);
 }
 
 static void
 }
 
 static void
-bgp_show_peer (struct vty *vty, struct peer *p)
+bgp_show_peer (struct vty *vty, struct peer *p, u_char use_json, json_object *json, json_object *json_neigh)
 {
   struct bgp *bgp;
   char buf1[BUFSIZ], buf[SU_ADDRSTRLEN];
 {
   struct bgp *bgp;
   char buf1[BUFSIZ], buf[SU_ADDRSTRLEN];
@@ -9248,115 +9458,248 @@ bgp_show_peer (struct vty *vty, struct peer *p)
 
   bgp = p->bgp;
 
 
   bgp = p->bgp;
 
-  if (p->conf_if) /* Configured interface name. */
-    vty_out (vty, "BGP neighbor on %s: %s, ", p->conf_if,
-             BGP_PEER_SU_UNSPEC(p) ? "None" :
-             sockunion2str (&p->su, buf, SU_ADDRSTRLEN));
-  else /* Configured IP address. */
+  if (!use_json)
     {
     {
-      memset(dn_flag, '\0', sizeof(dn_flag));
-      if (peer_dynamic_neighbor(p))
-        dn_flag[0] = '*';
+      if (p->conf_if) /* Configured interface name. */
+        vty_out (vty, "BGP neighbor on %s: %s, ", p->conf_if,
+                 BGP_PEER_SU_UNSPEC(p) ? "None" :
+                 sockunion2str (&p->su, buf, SU_ADDRSTRLEN));
+      else /* Configured IP address. */
+        {
+          memset(dn_flag, '\0', sizeof(dn_flag));
+          if (peer_dynamic_neighbor(p))
+            dn_flag[0] = '*';
 
 
-      vty_out (vty, "BGP neighbor is %s%s, ", dn_flag, p->host);
+          vty_out (vty, "BGP neighbor is %s%s, ", dn_flag, p->host);
+        }
     }
 
     }
 
-  vty_out (vty, "remote AS %u, ", p->as);
-  vty_out (vty, "local AS %u%s%s, ",
-          p->change_local_as ? p->change_local_as : p->local_as,
-          CHECK_FLAG (p->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND) ?
-          " no-prepend" : "",
-          CHECK_FLAG (p->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS) ?
-          " replace-as" : "");
+  if (use_json)
+    {
+      if (p->conf_if && BGP_PEER_SU_UNSPEC(p))
+        json_object_string_add(json_neigh, "bgpNeighborAddr", "none");
+      else if (p->conf_if && !BGP_PEER_SU_UNSPEC(p))
+        json_object_string_add(json_neigh, "bgpNeighborAddr", sockunion2str (&p->su, buf, SU_ADDRSTRLEN));
+
+      json_object_int_add(json_neigh, "remoteAs", p->as);
+
+      if (p->change_local_as)
+        json_object_int_add(json_neigh, "localAs", p->change_local_as);
+      else
+        json_object_int_add(json_neigh, "localAs", p->local_as);
 
 
+      if (CHECK_FLAG (p->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND))
+        json_object_boolean_true_add(json_neigh, "localAsNoPrepend");
+
+      if (CHECK_FLAG (p->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS))
+        json_object_boolean_true_add(json_neigh, "localAsReplaceAs");
+    }
+  else
+    {
+      vty_out (vty, "remote AS %u, ", p->as);
+      vty_out (vty, "local AS %u%s%s, ",
+              p->change_local_as ? p->change_local_as : p->local_as,
+              CHECK_FLAG (p->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND) ?
+              " no-prepend" : "",
+              CHECK_FLAG (p->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS) ?
+              " replace-as" : "");
+    }
   /* peer type internal, external, confed-internal or confed-external */
   if (p->as == p->local_as)
     {
   /* peer type internal, external, confed-internal or confed-external */
   if (p->as == p->local_as)
     {
-      if (CHECK_FLAG(bgp->config, BGP_CONFIG_CONFEDERATION))
-        vty_out (vty, "confed-internal link%s", VTY_NEWLINE);
+      if (use_json)
+        {
+          if (CHECK_FLAG(bgp->config, BGP_CONFIG_CONFEDERATION))
+            json_object_boolean_true_add(json_neigh, "nbrConfedInternalLink");
+          else
+            json_object_boolean_true_add(json_neigh, "nbrInternalLink");
+        }
       else
       else
-        vty_out (vty, "internal link%s", VTY_NEWLINE);
+        {
+          if (CHECK_FLAG(bgp->config, BGP_CONFIG_CONFEDERATION))
+            vty_out (vty, "confed-internal link%s", VTY_NEWLINE);
+          else
+            vty_out (vty, "internal link%s", VTY_NEWLINE);
+        }
     }
   else
     {
     }
   else
     {
-      if (bgp_confederation_peers_check(bgp, p->as))
-        vty_out (vty, "confed-external link%s", VTY_NEWLINE);
+      if (use_json)
+        {
+          if (CHECK_FLAG(bgp->config, BGP_CONFIG_CONFEDERATION))
+            json_object_boolean_true_add(json_neigh, "nbrConfedExternalLink");
+          else
+            json_object_boolean_true_add(json_neigh, "nbrExternalLink");
+        }
       else
       else
-        vty_out (vty, "external link%s", VTY_NEWLINE);
+        {
+         if (bgp_confederation_peers_check(bgp, p->as))
+           vty_out (vty, "confed-external link%s", VTY_NEWLINE);
+         else
+           vty_out (vty, "external link%s", VTY_NEWLINE);
+        }
     }
 
   /* Description. */
   if (p->desc)
     }
 
   /* Description. */
   if (p->desc)
-    vty_out (vty, " Description: %s%s", p->desc, VTY_NEWLINE);
+    {
+      if (use_json)
+        json_object_string_add(json_neigh, "nbrDesc", p->desc);
+      else
+        vty_out (vty, " Description: %s%s", p->desc, VTY_NEWLINE);
+    }
 
   /* Peer-group */
   if (p->group)
     {
 
   /* Peer-group */
   if (p->group)
     {
-      vty_out (vty, " Member of peer-group %s for session parameters%s",
-               p->group->name, VTY_NEWLINE);
+      if (use_json)
+        {
+          json_object_string_add(json_neigh, "peerGroup", p->group->name);
 
 
-      if (dn_flag[0])
+          if (dn_flag[0])
+            {
+              struct prefix *prefix = NULL, *range = NULL;
+
+              prefix = sockunion2hostprefix(&(p->su));
+              if (prefix)
+                range = peer_group_lookup_dynamic_neighbor_range (p->group, prefix);
+
+              if (range)
+                {
+                  prefix2str(range, buf1, sizeof(buf1));
+                  json_object_string_add(json_neigh, "peerSubnetRangeGroup", buf1);
+                }
+            }
+        }
+      else
         {
         {
-          struct prefix *prefix = NULL, *range = NULL;
+          vty_out (vty, " Member of peer-group %s for session parameters%s",
+                   p->group->name, VTY_NEWLINE);
 
 
-          prefix = sockunion2hostprefix(&(p->su));
-          if (prefix)
-            range = peer_group_lookup_dynamic_neighbor_range (p->group,
-                                                              prefix);
-          if (range)
+          if (dn_flag[0])
             {
             {
-              prefix2str(range, buf1, sizeof(buf1));
-              vty_out (vty, " Belongs to the subnet range group: %s%s",
-                       buf1, VTY_NEWLINE);
+              struct prefix *prefix = NULL, *range = NULL;
+
+              prefix = sockunion2hostprefix(&(p->su));
+              if (prefix)
+                range = peer_group_lookup_dynamic_neighbor_range (p->group, prefix);
+
+              if (range)
+                {
+                  prefix2str(range, buf1, sizeof(buf1));
+                  vty_out (vty, " Belongs to the subnet range group: %s%s", buf1, VTY_NEWLINE);
+                }
             }
         }
     }
 
             }
         }
     }
 
-  /* Administrative shutdown. */
-  if (CHECK_FLAG (p->flags, PEER_FLAG_SHUTDOWN))
-    vty_out (vty, " Administratively shut down%s", VTY_NEWLINE);
+  if (use_json)
+    {
+      /* Administrative shutdown. */
+      if (CHECK_FLAG (p->flags, PEER_FLAG_SHUTDOWN))
+        json_object_boolean_true_add(json_neigh, "adminShutDown");
 
 
-  /* BGP Version. */
-  vty_out (vty, "  BGP version 4");
-  vty_out (vty, ", remote router ID %s%s", 
-          inet_ntop (AF_INET, &p->remote_id, buf1, BUFSIZ),
-          VTY_NEWLINE);
+      /* BGP Version. */
+      json_object_int_add(json_neigh, "bgpVersion", 4);
+      json_object_string_add(json_neigh, "remoteRouterId", inet_ntop (AF_INET, &p->remote_id, buf1, BUFSIZ));
 
 
-  /* Confederation */
-  if (CHECK_FLAG (bgp->config, BGP_CONFIG_CONFEDERATION)
-      && bgp_confederation_peers_check (bgp, p->as))
-    vty_out (vty, "  Neighbor under common administration%s", VTY_NEWLINE);
-  
-  /* Status. */
-  vty_out (vty, "  BGP state = %s",  
-          LOOKUP (bgp_status_msg, p->status));
-  if (p->status == Established) 
-    vty_out (vty, ", up for %8s", 
-            peer_uptime (p->uptime, timebuf, BGP_UPTIME_LEN));
-  else if (p->status == Active)
-    {
-      if (CHECK_FLAG (p->flags, PEER_FLAG_PASSIVE))
-       vty_out (vty, " (passive)"); 
-      else if (CHECK_FLAG (p->sflags, PEER_STATUS_NSF_WAIT))
-       vty_out (vty, " (NSF passive)"); 
+      /* Confederation */
+      if (CHECK_FLAG (bgp->config, BGP_CONFIG_CONFEDERATION) && bgp_confederation_peers_check (bgp, p->as))
+        json_object_boolean_true_add(json_neigh, "nbrCommonAdmin");
+
+      /* Status. */
+      json_object_string_add(json_neigh, "bgpState", LOOKUP (bgp_status_msg, p->status));
+
+      if (p->status == Established)
+        {
+          time_t uptime;
+          struct tm *tm;
+
+          uptime = bgp_clock();
+          uptime -= p->uptime;
+          tm = gmtime(&uptime);
+
+          json_object_int_add(json_neigh, "bgpTimerUp", (tm->tm_sec * 1000) + (tm->tm_min * 60000) + (tm->tm_hour * 3600000));
+        }
+
+      else if (p->status == Active)
+        {
+          if (CHECK_FLAG (p->flags, PEER_FLAG_PASSIVE))
+            json_object_string_add(json_neigh, "bgpStateIs", "passive");
+          else if (CHECK_FLAG (p->sflags, PEER_STATUS_NSF_WAIT))
+            json_object_string_add(json_neigh, "bgpStateIs", "passiveNSF");
+        }
+
+      /* read timer */
+      time_t uptime;
+      struct tm *tm;
+
+      uptime = bgp_clock();
+      uptime -= p->readtime;
+      tm = gmtime(&uptime);
+      json_object_int_add(json_neigh, "bgpTimerLastRead", (tm->tm_sec * 1000) + (tm->tm_min * 60000) + (tm->tm_hour * 3600000));
+
+      uptime = bgp_clock();
+      uptime -= p->last_write;
+      tm = gmtime(&uptime);
+      json_object_int_add(json_neigh, "bgpTimerLastRead", (tm->tm_sec * 1000) + (tm->tm_min * 60000) + (tm->tm_hour * 3600000));
+
+      /* Configured timer values. */
+      json_object_int_add(json_neigh, "bgpTimerHoldTimeMsecs", p->v_holdtime * 1000);
+      json_object_int_add(json_neigh, "bgpTimerKeepAliveIntervalMsecs", p->v_keepalive * 1000);
+
+      if (CHECK_FLAG (p->config, PEER_CONFIG_TIMER))
+        {
+          json_object_int_add(json_neigh, "bgpTimerConfiguredHoldTimeMsecs", p->holdtime * 1000);
+          json_object_int_add(json_neigh, "bgpTimerConfiguredKeepAliveIntervalMsecs", p->keepalive * 1000);
+        }
     }
     }
-  vty_out (vty, "%s", VTY_NEWLINE);
+  else
+    {
+      /* Administrative shutdown. */
+      if (CHECK_FLAG (p->flags, PEER_FLAG_SHUTDOWN))
+        vty_out (vty, " Administratively shut down%s", VTY_NEWLINE);
+
+      /* BGP Version. */
+      vty_out (vty, "  BGP version 4");
+      vty_out (vty, ", remote router ID %s%s", inet_ntop (AF_INET, &p->remote_id, buf1, BUFSIZ),
+               VTY_NEWLINE);
+
+      /* Confederation */
+      if (CHECK_FLAG (bgp->config, BGP_CONFIG_CONFEDERATION)
+          && bgp_confederation_peers_check (bgp, p->as))
+        vty_out (vty, "  Neighbor under common administration%s", VTY_NEWLINE);
   
   
-  /* read timer */
-  vty_out (vty, "  Last read %s", peer_uptime (p->readtime, timebuf, BGP_UPTIME_LEN));
-  vty_out (vty, ", Last write %s%s",
-          peer_uptime (p->last_write, timebuf, BGP_UPTIME_LEN), VTY_NEWLINE);
+      /* Status. */
+      vty_out (vty, "  BGP state = %s", LOOKUP (bgp_status_msg, p->status));
 
 
-  /* Configured timer values. */
-  vty_out (vty, "  Hold time is %d, keepalive interval is %d seconds%s",
-          p->v_holdtime, p->v_keepalive, VTY_NEWLINE);
-  if (CHECK_FLAG (p->config, PEER_CONFIG_TIMER))
-    {
-      vty_out (vty, "  Configured hold time is %d", p->holdtime);
-      vty_out (vty, ", keepalive interval is %d seconds%s",
-              p->keepalive, VTY_NEWLINE);
-    }
+      if (p->status == Established)
+        vty_out (vty, ", up for %8s", peer_uptime (p->uptime, timebuf, BGP_UPTIME_LEN, 0, NULL));
+
+      else if (p->status == Active)
+        {
+          if (CHECK_FLAG (p->flags, PEER_FLAG_PASSIVE))
+            vty_out (vty, " (passive)");
+        else if (CHECK_FLAG (p->sflags, PEER_STATUS_NSF_WAIT))
+               vty_out (vty, " (NSF passive)");
+        }
+      vty_out (vty, "%s", VTY_NEWLINE);
 
 
+      /* read timer */
+      vty_out (vty, "  Last read %s", peer_uptime (p->readtime, timebuf, BGP_UPTIME_LEN, 0, NULL));
+      vty_out (vty, ", Last write %s%s",
+               peer_uptime (p->last_write, timebuf, BGP_UPTIME_LEN, 0, NULL), VTY_NEWLINE);
+
+      /* Configured timer values. */
+      vty_out (vty, "  Hold time is %d, keepalive interval is %d seconds%s",
+              p->v_holdtime, p->v_keepalive, VTY_NEWLINE);
+      if (CHECK_FLAG (p->config, PEER_CONFIG_TIMER))
+        {
+          vty_out (vty, "  Configured hold time is %d", p->holdtime);
+          vty_out (vty, ", keepalive interval is %d seconds%s",
+                  p->keepalive, VTY_NEWLINE);
+        }
+    }
   /* Capability. */
   if (p->status == Established) 
     {
   /* Capability. */
   if (p->status == Established) 
     {
@@ -9374,163 +9717,365 @@ bgp_show_peer (struct vty *vty, struct peer *p)
          || p->afc_adv[AFI_IP][SAFI_MPLS_VPN]
          || p->afc_recv[AFI_IP][SAFI_MPLS_VPN])
        {
          || p->afc_adv[AFI_IP][SAFI_MPLS_VPN]
          || p->afc_recv[AFI_IP][SAFI_MPLS_VPN])
        {
-         vty_out (vty, "  Neighbor capabilities:%s", VTY_NEWLINE);
+          if (use_json)
+            {
+             json_object *json_cap = NULL;
+
+              json_cap = json_object_new_object();
+
+             /* AS4 */
+             if (CHECK_FLAG (p->cap, PEER_CAP_AS4_RCV)
+                 || CHECK_FLAG (p->cap, PEER_CAP_AS4_ADV))
+               {
+                 if (CHECK_FLAG (p->cap, PEER_CAP_AS4_ADV) && CHECK_FLAG (p->cap, PEER_CAP_AS4_RCV))
+                   json_object_string_add(json_cap, "4byteAs", "advertisedAndReceived");
+                 else if (CHECK_FLAG (p->cap, PEER_CAP_AS4_ADV))
+                   json_object_string_add(json_cap, "4byteAs", "advertised");
+                 else if (CHECK_FLAG (p->cap, PEER_CAP_AS4_RCV))
+                   json_object_string_add(json_cap, "4byteAs", "received");
+               }
+
+             /* AddPath */
+             if (CHECK_FLAG (p->cap, PEER_CAP_ADDPATH_RCV)
+                 || CHECK_FLAG (p->cap, PEER_CAP_ADDPATH_ADV))
+                {
+                 json_object *json_add = NULL;
+                  const char *print_store;
 
 
-         /* AS4 */
-         if (CHECK_FLAG (p->cap, PEER_CAP_AS4_RCV)
-             || CHECK_FLAG (p->cap, PEER_CAP_AS4_ADV))
-           {
-             vty_out (vty, "    4 Byte AS:");
-             if (CHECK_FLAG (p->cap, PEER_CAP_AS4_ADV))
-               vty_out (vty, " advertised");
-             if (CHECK_FLAG (p->cap, PEER_CAP_AS4_RCV))
-               vty_out (vty, " %sreceived",
-                        CHECK_FLAG (p->cap, PEER_CAP_AS4_ADV) ? "and " : "");
-             vty_out (vty, "%s", VTY_NEWLINE);
-           }
+                  json_add = json_object_new_object();
 
 
-         /* AddPath */
-         if (CHECK_FLAG (p->cap, PEER_CAP_ADDPATH_RCV)
-             || CHECK_FLAG (p->cap, PEER_CAP_ADDPATH_ADV))
-            {
-             vty_out (vty, "    AddPath:%s", VTY_NEWLINE);
+                  for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
+                    for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
+                      {
+                       json_object *json_sub = NULL;
+                        json_sub = json_object_new_object();
+                        print_store = afi_safi_print (afi, safi);
+
+                        if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_TX_ADV) ||
+                            CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_TX_RCV))
+                          {
+                           if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_TX_ADV) && CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_TX_RCV))
+                             json_object_boolean_true_add(json_sub, "txAdvertisedAndReceived");
+                           else if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_TX_ADV))
+                             json_object_boolean_true_add(json_sub, "txAdvertised");
+                           else if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_TX_RCV))
+                             json_object_boolean_true_add(json_sub, "txReceived");
+                          }
+
+                        if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_RX_ADV) ||
+                            CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_RX_RCV))
+                          {
+                           if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_RX_ADV) && CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_RX_RCV))
+                             json_object_boolean_true_add(json_sub, "rxAdvertisedAndReceived");
+                           else if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_RX_ADV))
+                             json_object_boolean_true_add(json_sub, "rxAdvertised");
+                           else if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_RX_RCV))
+                             json_object_boolean_true_add(json_sub, "rxReceived");
+                          }
+
+                        if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_TX_ADV) ||
+                            CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_TX_RCV) ||
+                            CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_RX_ADV) ||
+                            CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_RX_RCV))
+                          json_object_object_add(json_add, print_store, json_sub);
+                      }
 
 
-              for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
-                for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
-                  {
+                  json_object_object_add(json_cap, "addPath", json_add);
+                }
 
 
-                    if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_TX_ADV) ||
-                        CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_TX_RCV))
+             /* Dynamic */
+             if (CHECK_FLAG (p->cap, PEER_CAP_DYNAMIC_RCV)
+                 || CHECK_FLAG (p->cap, PEER_CAP_DYNAMIC_ADV))
+               {
+                 if (CHECK_FLAG (p->cap, PEER_CAP_DYNAMIC_ADV) && CHECK_FLAG (p->cap, PEER_CAP_DYNAMIC_RCV))
+                   json_object_string_add(json_cap, "dynamic", "advertisedAndReceived");
+                 else if (CHECK_FLAG (p->cap, PEER_CAP_DYNAMIC_ADV))
+                   json_object_string_add(json_cap, "dynamic", "advertised");
+                 else if (CHECK_FLAG (p->cap, PEER_CAP_DYNAMIC_RCV))
+                   json_object_string_add(json_cap, "dynamic", "received");
+               }
+
+             /* Extended nexthop */
+             if (CHECK_FLAG (p->cap, PEER_CAP_ENHE_RCV)
+                 || CHECK_FLAG (p->cap, PEER_CAP_ENHE_ADV))
+               {
+                 json_object *json_nxt = NULL;
+                  const char *print_store;
+
+                  json_nxt = json_object_new_object();
+
+                 if (CHECK_FLAG (p->cap, PEER_CAP_ENHE_ADV) && CHECK_FLAG (p->cap, PEER_CAP_ENHE_RCV))
+                   json_object_string_add(json_cap, "extendedNexthop", "advertisedAndReceived");
+                 else if (CHECK_FLAG (p->cap, PEER_CAP_ENHE_ADV))
+                   json_object_string_add(json_cap, "extendedNexthop", "advertised");
+                 else if (CHECK_FLAG (p->cap, PEER_CAP_ENHE_RCV))
+                   json_object_string_add(json_cap, "extendedNexthop", "received");
+
+                  if (CHECK_FLAG (p->cap, PEER_CAP_ENHE_RCV))
+                   {
+                      for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
+                        {
+                          if (CHECK_FLAG (p->af_cap[AFI_IP][safi], PEER_CAP_ENHE_AF_RCV))
+                            {
+                              print_store = afi_safi_print (AFI_IP, safi);
+                              json_object_string_add(json_nxt, print_store, "recieved");
+                            }
+                        }
+                      json_object_object_add(json_cap, "extendedNexthopFamililesByPeer", json_nxt);
+                    }
+               }
+
+             /* Route Refresh */
+             if (CHECK_FLAG (p->cap, PEER_CAP_REFRESH_ADV)
+                 || CHECK_FLAG (p->cap, PEER_CAP_REFRESH_NEW_RCV)
+                 || CHECK_FLAG (p->cap, PEER_CAP_REFRESH_OLD_RCV))
+               {
+                 if (CHECK_FLAG (p->cap, PEER_CAP_REFRESH_ADV) && (CHECK_FLAG (p->cap, PEER_CAP_REFRESH_NEW_RCV) || CHECK_FLAG (p->cap, PEER_CAP_REFRESH_OLD_RCV)))
+                    {
+                     if (CHECK_FLAG (p->cap, PEER_CAP_REFRESH_OLD_RCV) && CHECK_FLAG (p->cap, PEER_CAP_REFRESH_NEW_RCV))
+                        json_object_string_add(json_cap, "routeRefresh", "advertisedAndReceivedOldNew");
+                      else
+                        {
+                          if (CHECK_FLAG (p->cap, PEER_CAP_REFRESH_OLD_RCV))
+                            json_object_string_add(json_cap, "routeRefresh", "advertisedAndReceivedOld");
+                          else
+                            json_object_string_add(json_cap, "routeRefresh", "advertisedAndReceivedNew");
+                        }
+                    }
+                 else if (CHECK_FLAG (p->cap, PEER_CAP_REFRESH_ADV))
+                   json_object_string_add(json_cap, "routeRefresh", "advertised");
+                 else if (CHECK_FLAG (p->cap, PEER_CAP_REFRESH_NEW_RCV) || CHECK_FLAG (p->cap, PEER_CAP_REFRESH_OLD_RCV))
+                   json_object_string_add(json_cap, "routeRefresh", "received");
+                }
+
+             /* Multiprotocol Extensions */
+             json_object *json_multi = NULL;
+              json_multi = json_object_new_object();
+
+             for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
+               {
+                  for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
+                   {
+                      if (p->afc_adv[afi][safi] || p->afc_recv[afi][safi])
+                       {
+                         json_object *json_exten = NULL;
+                          json_exten = json_object_new_object();
+
+                          if (p->afc_adv[afi][safi] && p->afc_recv[afi][safi])
+                            json_object_boolean_true_add(json_exten, "advertisedAndReceived");
+                          else if (p->afc_adv[afi][safi])
+                            json_object_boolean_true_add(json_exten, "advertised");
+                          else if (p->afc_recv[afi][safi])
+                            json_object_boolean_true_add(json_exten, "received");
+
+                          json_object_object_add(json_multi, afi_safi_print (afi, safi), json_exten);
+                       }
+                    }
+                }
+              json_object_object_add(json_cap, "multiprotocolExtensions", json_multi);
+
+             /* Gracefull Restart */
+             if (CHECK_FLAG (p->cap, PEER_CAP_RESTART_RCV)
+                 || CHECK_FLAG (p->cap, PEER_CAP_RESTART_ADV))
+               {
+                 if (CHECK_FLAG (p->cap, PEER_CAP_RESTART_ADV) && CHECK_FLAG (p->cap, PEER_CAP_RESTART_RCV))
+                   json_object_string_add(json_cap, "gracefulRestart", "advertisedAndReceived");
+                 else if (CHECK_FLAG (p->cap, PEER_CAP_RESTART_ADV))
+                   json_object_string_add(json_cap, "gracefulRestartCapability", "advertised");
+                 else if (CHECK_FLAG (p->cap, PEER_CAP_RESTART_RCV))
+                   json_object_string_add(json_cap, "gracefulRestartCapability", "received");
+
+                 if (CHECK_FLAG (p->cap, PEER_CAP_RESTART_RCV))
+                   {
+                     int restart_af_count = 0;
+                      json_object *json_restart = NULL;
+                      json_restart = json_object_new_object();
+
+                     json_object_int_add(json_cap, "gracefulRestartRemoteTimerMsecs", p->v_gr_restart * 1000);
+
+                     for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
+                       {
+                          for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
+                           {
+                              if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_RESTART_AF_RCV))
+                               {
+                                 json_object *json_sub = NULL;
+                                  json_sub = json_object_new_object();
+
+                                  if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_RESTART_AF_PRESERVE_RCV))
+                                    json_object_boolean_true_add(json_sub, "preserved");
+                                 restart_af_count++;
+                                  json_object_object_add(json_restart, afi_safi_print (afi, safi), json_sub);
+                               }
+                            }
+                        }
+                     if (! restart_af_count)
+                       json_object_string_add(json_cap, "addressFamiliesByPeer", "none");
+                      else
+                        json_object_object_add(json_cap, "addressFamiliesByPeer", json_restart);
+                    }
+                }
+              json_object_object_add(json_neigh, "neighborCapabilities", json_cap);
+            }
+          else
+            {
+             vty_out (vty, "  Neighbor capabilities:%s", VTY_NEWLINE);
+
+             /* AS4 */
+             if (CHECK_FLAG (p->cap, PEER_CAP_AS4_RCV)
+                 || CHECK_FLAG (p->cap, PEER_CAP_AS4_ADV))
+               {
+                 vty_out (vty, "    4 Byte AS:");
+                 if (CHECK_FLAG (p->cap, PEER_CAP_AS4_ADV))
+                   vty_out (vty, " advertised");
+                 if (CHECK_FLAG (p->cap, PEER_CAP_AS4_RCV))
+                   vty_out (vty, " %sreceived",
+                            CHECK_FLAG (p->cap, PEER_CAP_AS4_ADV) ? "and " : "");
+                 vty_out (vty, "%s", VTY_NEWLINE);
+               }
+
+             /* AddPath */
+             if (CHECK_FLAG (p->cap, PEER_CAP_ADDPATH_RCV)
+                 || CHECK_FLAG (p->cap, PEER_CAP_ADDPATH_ADV))
+                {
+                 vty_out (vty, "    AddPath:%s", VTY_NEWLINE);
+
+                  for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
+                    for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
                       {
                       {
-                        vty_out (vty, "      %s: TX ", afi_safi_print (afi, safi));
+                        if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_TX_ADV) ||
+                            CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_TX_RCV))
+                          {
+                            vty_out (vty, "      %s: TX ", afi_safi_print (afi, safi));
 
 
-                        if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_TX_ADV))
-                          vty_out (vty, "advertised %s", afi_safi_print (afi, safi));
+                            if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_TX_ADV))
+                              vty_out (vty, "advertised %s", afi_safi_print (afi, safi));
 
 
-                        if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_TX_RCV))
-                          vty_out (vty, "%sreceived", CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_TX_ADV) ? " and " : "" );
+                            if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_TX_RCV))
+                              vty_out (vty, "%sreceived", CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_TX_ADV) ? " and " : "" );
 
 
-                        vty_out (vty, "%s", VTY_NEWLINE);
-                      }
+                            vty_out (vty, "%s", VTY_NEWLINE);
+                          }
 
 
-                    if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_RX_ADV) ||
+                        if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_RX_ADV) ||
                         CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_RX_RCV))
                         CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_RX_RCV))
-                      {
-                        vty_out (vty, "      %s: RX ", afi_safi_print (afi, safi));
+                          {
+                            vty_out (vty, "      %s: RX ", afi_safi_print (afi, safi));
 
 
-                        if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_RX_ADV))
-                          vty_out (vty, "advertised %s", afi_safi_print (afi, safi));
+                            if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_RX_ADV))
+                              vty_out (vty, "advertised %s", afi_safi_print (afi, safi));
 
 
-                        if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_RX_RCV))
-                          vty_out (vty, "%sreceived", CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_RX_ADV) ? " and " : "" );
+                            if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_RX_RCV))
+                              vty_out (vty, "%sreceived", CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_RX_ADV) ? " and " : "" );
 
 
-                        vty_out (vty, "%s", VTY_NEWLINE);
+                            vty_out (vty, "%s", VTY_NEWLINE);
+                          }
                       }
                       }
-                  }
-            }
+                }
 
 
-         /* Dynamic */
-         if (CHECK_FLAG (p->cap, PEER_CAP_DYNAMIC_RCV)
-             || CHECK_FLAG (p->cap, PEER_CAP_DYNAMIC_ADV))
-           {
-             vty_out (vty, "    Dynamic:");
-             if (CHECK_FLAG (p->cap, PEER_CAP_DYNAMIC_ADV))
-               vty_out (vty, " advertised");
-             if (CHECK_FLAG (p->cap, PEER_CAP_DYNAMIC_RCV))
-               vty_out (vty, " %sreceived",
-                        CHECK_FLAG (p->cap, PEER_CAP_DYNAMIC_ADV) ? "and " : "");
-             vty_out (vty, "%s", VTY_NEWLINE);
-           }
+             /* Dynamic */
+             if (CHECK_FLAG (p->cap, PEER_CAP_DYNAMIC_RCV)
+                 || CHECK_FLAG (p->cap, PEER_CAP_DYNAMIC_ADV))
+               {
+                 vty_out (vty, "    Dynamic:");
+                 if (CHECK_FLAG (p->cap, PEER_CAP_DYNAMIC_ADV))
+                   vty_out (vty, " advertised");
+                 if (CHECK_FLAG (p->cap, PEER_CAP_DYNAMIC_RCV))
+                   vty_out (vty, " %sreceived",
+                            CHECK_FLAG (p->cap, PEER_CAP_DYNAMIC_ADV) ? "and " : "");
+                 vty_out (vty, "%s", VTY_NEWLINE);
+               }
+
+             /* Extended nexthop */
+             if (CHECK_FLAG (p->cap, PEER_CAP_ENHE_RCV)
+                 || CHECK_FLAG (p->cap, PEER_CAP_ENHE_ADV))
+               {
+                 vty_out (vty, "    Extended nexthop:");
+                 if (CHECK_FLAG (p->cap, PEER_CAP_ENHE_ADV))
+                   vty_out (vty, " advertised");
+                 if (CHECK_FLAG (p->cap, PEER_CAP_ENHE_RCV))
+                   vty_out (vty, " %sreceived",
+                            CHECK_FLAG (p->cap, PEER_CAP_ENHE_ADV) ? "and " : "");
+                 vty_out (vty, "%s", VTY_NEWLINE);
 
 
-         /* Extended nexthop */
-         if (CHECK_FLAG (p->cap, PEER_CAP_ENHE_RCV)
-             || CHECK_FLAG (p->cap, PEER_CAP_ENHE_ADV))
-           {
-             vty_out (vty, "    Extended nexthop:");
-             if (CHECK_FLAG (p->cap, PEER_CAP_ENHE_ADV))
-               vty_out (vty, " advertised");
-             if (CHECK_FLAG (p->cap, PEER_CAP_ENHE_RCV))
-               vty_out (vty, " %sreceived",
-                        CHECK_FLAG (p->cap, PEER_CAP_ENHE_ADV) ? "and " : "");
-             vty_out (vty, "%s", VTY_NEWLINE);
+                  if (CHECK_FLAG (p->cap, PEER_CAP_ENHE_RCV))
+                   {
+                     vty_out (vty, "      Address families by peer:%s        ", VTY_NEWLINE);
+                      for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
+                        if (CHECK_FLAG (p->af_cap[AFI_IP][safi], PEER_CAP_ENHE_AF_RCV))
+                          vty_out (vty, "           %s%s",
+                                   afi_safi_print (AFI_IP, safi), VTY_NEWLINE);
+                    }
+               }
 
 
-              if (CHECK_FLAG (p->cap, PEER_CAP_ENHE_RCV))
-               {
-                 vty_out (vty, "      Address families by peer:%s        ", VTY_NEWLINE);
-                  for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
-                    if (CHECK_FLAG (p->af_cap[AFI_IP][safi], PEER_CAP_ENHE_AF_RCV))
-                      vty_out (vty, "           %s%s",
-                               afi_safi_print (AFI_IP, safi), VTY_NEWLINE);
-                }
-           }
+             /* Route Refresh */
+              if (CHECK_FLAG (p->cap, PEER_CAP_REFRESH_ADV)
+                  || CHECK_FLAG (p->cap, PEER_CAP_REFRESH_NEW_RCV)
+                  || CHECK_FLAG (p->cap, PEER_CAP_REFRESH_OLD_RCV))
+                {
+                  vty_out (vty, "    Route refresh:");
+                  if (CHECK_FLAG (p->cap, PEER_CAP_REFRESH_ADV))
+                    vty_out (vty, " advertised");
+                  if (CHECK_FLAG (p->cap, PEER_CAP_REFRESH_NEW_RCV)
+                      || CHECK_FLAG (p->cap, PEER_CAP_REFRESH_OLD_RCV))
+                    vty_out (vty, " %sreceived(%s)",
+                             CHECK_FLAG (p->cap, PEER_CAP_REFRESH_ADV) ? "and " : "",
+                             (CHECK_FLAG (p->cap, PEER_CAP_REFRESH_OLD_RCV)
+                             && CHECK_FLAG (p->cap, PEER_CAP_REFRESH_NEW_RCV)) ?
+                             "old & new" : CHECK_FLAG (p->cap, PEER_CAP_REFRESH_OLD_RCV) ? "old" : "new");
 
 
-         /* Route Refresh */
-         if (CHECK_FLAG (p->cap, PEER_CAP_REFRESH_ADV)
-             || CHECK_FLAG (p->cap, PEER_CAP_REFRESH_NEW_RCV)
-             || CHECK_FLAG (p->cap, PEER_CAP_REFRESH_OLD_RCV))
-           {
-             vty_out (vty, "    Route refresh:");
-             if (CHECK_FLAG (p->cap, PEER_CAP_REFRESH_ADV))
-               vty_out (vty, " advertised");
-             if (CHECK_FLAG (p->cap, PEER_CAP_REFRESH_NEW_RCV)
-                 || CHECK_FLAG (p->cap, PEER_CAP_REFRESH_OLD_RCV))
-               vty_out (vty, " %sreceived(%s)",
-                        CHECK_FLAG (p->cap, PEER_CAP_REFRESH_ADV) ? "and " : "",
-                        (CHECK_FLAG (p->cap, PEER_CAP_REFRESH_OLD_RCV)
-                         && CHECK_FLAG (p->cap, PEER_CAP_REFRESH_NEW_RCV)) ?
-                        "old & new" : CHECK_FLAG (p->cap, PEER_CAP_REFRESH_OLD_RCV) ? "old" : "new");
+                  vty_out (vty, "%s", VTY_NEWLINE);
+                }
 
 
-             vty_out (vty, "%s", VTY_NEWLINE);
-           }
+             /* Multiprotocol Extensions */
+             for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
+               for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
+                 if (p->afc_adv[afi][safi] || p->afc_recv[afi][safi])
+                   {
+                     vty_out (vty, "    Address family %s:", afi_safi_print (afi, safi));
+                     if (p->afc_adv[afi][safi])
+                       vty_out (vty, " advertised");
+                     if (p->afc_recv[afi][safi])
+                       vty_out (vty, " %sreceived", p->afc_adv[afi][safi] ? "and " : "");
+                     vty_out (vty, "%s", VTY_NEWLINE);
+                   }
 
 
-         /* Multiprotocol Extensions */
-         for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
-           for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
-             if (p->afc_adv[afi][safi] || p->afc_recv[afi][safi])
-               {
-                 vty_out (vty, "    Address family %s:", afi_safi_print (afi, safi));
-                 if (p->afc_adv[afi][safi]) 
+             /* Gracefull Restart */
+             if (CHECK_FLAG (p->cap, PEER_CAP_RESTART_RCV)
+                 || CHECK_FLAG (p->cap, PEER_CAP_RESTART_ADV))
+               {
+                 vty_out (vty, "    Graceful Restart Capabilty:");
+                 if (CHECK_FLAG (p->cap, PEER_CAP_RESTART_ADV))
                    vty_out (vty, " advertised");
                    vty_out (vty, " advertised");
-                 if (p->afc_recv[afi][safi])
-                   vty_out (vty, " %sreceived", p->afc_adv[afi][safi] ? "and " : "");
-                 vty_out (vty, "%s", VTY_NEWLINE);
-               } 
-
-         /* Gracefull Restart */
-         if (CHECK_FLAG (p->cap, PEER_CAP_RESTART_RCV)
-             || CHECK_FLAG (p->cap, PEER_CAP_RESTART_ADV))
-           {
-             vty_out (vty, "    Graceful Restart Capabilty:");
-             if (CHECK_FLAG (p->cap, PEER_CAP_RESTART_ADV))
-               vty_out (vty, " advertised");
-             if (CHECK_FLAG (p->cap, PEER_CAP_RESTART_RCV))
-               vty_out (vty, " %sreceived",
-                        CHECK_FLAG (p->cap, PEER_CAP_RESTART_ADV) ? "and " : "");
-             vty_out (vty, "%s", VTY_NEWLINE);
+                 if (CHECK_FLAG (p->cap, PEER_CAP_RESTART_RCV))
+                   vty_out (vty, " %sreceived",
+                            CHECK_FLAG (p->cap, PEER_CAP_RESTART_ADV) ? "and " : "");
+                 vty_out (vty, "%s", VTY_NEWLINE);
 
 
-             if (CHECK_FLAG (p->cap, PEER_CAP_RESTART_RCV))
-               {
-                 int restart_af_count = 0;
-
-                 vty_out (vty, "      Remote Restart timer is %d seconds%s",
-                          p->v_gr_restart, VTY_NEWLINE);       
-                 vty_out (vty, "      Address families by peer:%s        ", VTY_NEWLINE);
-
-                 for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
-                   for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
-                     if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_RESTART_AF_RCV))
-                       {
-                         vty_out (vty, "%s%s(%s)", restart_af_count ? ", " : "",
-                                  afi_safi_print (afi, safi),
-                                  CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_RESTART_AF_PRESERVE_RCV) ?
-                                  "preserved" : "not preserved");
-                         restart_af_count++;
-                       }
-                 if (! restart_af_count)
-                   vty_out (vty, "none");
-                 vty_out (vty, "%s", VTY_NEWLINE);
-               }
-           }
+                 if (CHECK_FLAG (p->cap, PEER_CAP_RESTART_RCV))
+                   {
+                     int restart_af_count = 0;
+
+                     vty_out (vty, "      Remote Restart timer is %d seconds%s",
+                              p->v_gr_restart, VTY_NEWLINE);
+                     vty_out (vty, "      Address families by peer:%s        ", VTY_NEWLINE);
+
+                     for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
+                       for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
+                         if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_RESTART_AF_RCV))
+                           {
+                             vty_out (vty, "%s%s(%s)", restart_af_count ? ", " : "",
+                                      afi_safi_print (afi, safi),
+                                      CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_RESTART_AF_PRESERVE_RCV) ?
+                                      "preserved" : "not preserved");
+                             restart_af_count++;
+                           }
+                     if (! restart_af_count)
+                       vty_out (vty, "none");
+                     vty_out (vty, "%s", VTY_NEWLINE);
+                   }
+               }
+            }
        }
     }
 
        }
     }
 
@@ -9539,168 +10084,351 @@ bgp_show_peer (struct vty *vty, struct peer *p)
       || p->t_gr_restart
       || p->t_gr_stale)
     {
       || p->t_gr_restart
       || p->t_gr_stale)
     {
+      json_object *json_grace = NULL;
+      json_object *json_grace_send = NULL;
+      json_object *json_grace_recv = NULL;
       int eor_send_af_count = 0;
       int eor_receive_af_count = 0;
 
       int eor_send_af_count = 0;
       int eor_receive_af_count = 0;
 
-      vty_out (vty, "  Graceful restart informations:%s", VTY_NEWLINE);
-      if (p->status == Established) 
-       {
-         vty_out (vty, "    End-of-RIB send: ");
-         for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
-           for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
-             if (CHECK_FLAG (p->af_sflags[afi][safi], PEER_STATUS_EOR_SEND))
-               {
-                 vty_out (vty, "%s%s", eor_send_af_count ? ", " : "",
-                          afi_safi_print (afi, safi));
-                 eor_send_af_count++;
-               }
-         vty_out (vty, "%s", VTY_NEWLINE);
-
-         vty_out (vty, "    End-of-RIB received: ");
-         for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
-           for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
-             if (CHECK_FLAG (p->af_sflags[afi][safi], PEER_STATUS_EOR_RECEIVED))
-               {
-                 vty_out (vty, "%s%s", eor_receive_af_count ? ", " : "",
-                          afi_safi_print (afi, safi));
-                 eor_receive_af_count++;
-               }
-         vty_out (vty, "%s", VTY_NEWLINE);
-       }
+      if (use_json)
+        {
+          json_grace = json_object_new_object();
+          json_grace_send = json_object_new_object();
+          json_grace_recv = json_object_new_object();
+
+          if (p->status == Established)
+           {
+             for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
+               {
+                  for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
+                   {
+                      if (CHECK_FLAG (p->af_sflags[afi][safi], PEER_STATUS_EOR_SEND))
+                       {
+                         json_object_boolean_true_add(json_grace_send, afi_safi_print (afi, safi));
+                         eor_send_af_count++;
+                       }
+                    }
+                }
+             for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
+               {
+                  for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
+                   {
+                      if (CHECK_FLAG (p->af_sflags[afi][safi], PEER_STATUS_EOR_RECEIVED))
+                       {
+                         json_object_boolean_true_add(json_grace_recv, afi_safi_print (afi, safi));
+                          eor_receive_af_count++;
+                        }
+                   }
+                }
+            }
+
+          json_object_object_add(json_grace, "endOfRibSend", json_grace_send);
+          json_object_object_add(json_grace, "endOfRibRecv", json_grace_recv);
 
 
-      if (p->t_gr_restart)
-        vty_out (vty, "    The remaining time of restart timer is %ld%s",
-                 thread_timer_remain_second (p->t_gr_restart), VTY_NEWLINE);
+          if (p->t_gr_restart)
+            json_object_int_add(json_grace, "gracefulRestartTimerMsecs", thread_timer_remain_second (p->t_gr_restart) * 1000);
+
+          if (p->t_gr_stale)
+            json_object_int_add(json_grace, "gracefulStalepathTimerMsecs", thread_timer_remain_second (p->t_gr_stale) * 1000);
+
+          json_object_object_add(json_neigh, "gracefulRestartInfo", json_grace);
+        }
+      else
+        {
+          vty_out (vty, "  Graceful restart informations:%s", VTY_NEWLINE);
+          if (p->status == Established)
+           {
+             vty_out (vty, "    End-of-RIB send: ");
+             for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
+               {
+                  for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
+                   {
+                      if (CHECK_FLAG (p->af_sflags[afi][safi], PEER_STATUS_EOR_SEND))
+                       {
+                         vty_out (vty, "%s%s", eor_send_af_count ? ", " : "",
+                                  afi_safi_print (afi, safi));
+                         eor_send_af_count++;
+                       }
+                    }
+                }
+             vty_out (vty, "%s", VTY_NEWLINE);
+             vty_out (vty, "    End-of-RIB received: ");
+             for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
+               {
+                  for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
+                   {
+                      if (CHECK_FLAG (p->af_sflags[afi][safi], PEER_STATUS_EOR_RECEIVED))
+                       {
+                         vty_out (vty, "%s%s", eor_receive_af_count ? ", " : "",
+                                  afi_safi_print (afi, safi));
+                         eor_receive_af_count++;
+                        }
+                   }
+                }
+             vty_out (vty, "%s", VTY_NEWLINE);
+            }
+
+          if (p->t_gr_restart)
+            vty_out (vty, "    The remaining time of restart timer is %ld%s",
+                     thread_timer_remain_second (p->t_gr_restart), VTY_NEWLINE);
       
       
-      if (p->t_gr_stale)
-        vty_out (vty, "    The remaining time of stalepath timer is %ld%s",
-                 thread_timer_remain_second (p->t_gr_stale), VTY_NEWLINE);
-    }
-
-  /* Packet counts. */
-  vty_out (vty, "  Message statistics:%s", VTY_NEWLINE);
-  vty_out (vty, "    Inq depth is 0%s", VTY_NEWLINE);
-  vty_out (vty, "    Outq depth is %lu%s", (unsigned long) p->obuf->count, VTY_NEWLINE);
-  vty_out (vty, "                         Sent       Rcvd%s", VTY_NEWLINE);
-  vty_out (vty, "    Opens:         %10d %10d%s", p->open_out, p->open_in, VTY_NEWLINE);
-  vty_out (vty, "    Notifications: %10d %10d%s", p->notify_out, p->notify_in, VTY_NEWLINE);
-  vty_out (vty, "    Updates:       %10d %10d%s", p->update_out, p->update_in, VTY_NEWLINE);
-  vty_out (vty, "    Keepalives:    %10d %10d%s", p->keepalive_out, p->keepalive_in, VTY_NEWLINE);
-  vty_out (vty, "    Route Refresh: %10d %10d%s", p->refresh_out, p->refresh_in, VTY_NEWLINE);
-  vty_out (vty, "    Capability:    %10d %10d%s", p->dynamic_cap_out, p->dynamic_cap_in, VTY_NEWLINE);
-  vty_out (vty, "    Total:         %10d %10d%s", p->open_out + p->notify_out +
-          p->update_out + p->keepalive_out + p->refresh_out + p->dynamic_cap_out,
-          p->open_in + p->notify_in + p->update_in + p->keepalive_in + p->refresh_in +
-          p->dynamic_cap_in, VTY_NEWLINE);
-
-  /* advertisement-interval */
-  vty_out (vty, "  Minimum time between advertisement runs is %d seconds%s",
-          p->v_routeadv, VTY_NEWLINE);
-
-  /* Update-source. */
-  if (p->update_if || p->update_source)
-    {
-      vty_out (vty, "  Update source is ");
-      if (p->update_if)
-       vty_out (vty, "%s", p->update_if);
-      else if (p->update_source)
-       vty_out (vty, "%s",
-                sockunion2str (p->update_source, buf1, SU_ADDRSTRLEN));
-      vty_out (vty, "%s", VTY_NEWLINE);
+          if (p->t_gr_stale)
+            vty_out (vty, "    The remaining time of stalepath timer is %ld%s",
+                     thread_timer_remain_second (p->t_gr_stale), VTY_NEWLINE);
+        }
+    }
+  if (use_json)
+    {
+      json_object *json_stat = NULL;
+      json_stat = json_object_new_object();
+      /* Packet counts. */
+      json_object_int_add(json_stat, "depthInq", 0);
+      json_object_int_add(json_stat, "depthOutq", (unsigned long) p->obuf->count);
+      json_object_int_add(json_stat, "opensSent",  p->open_out);
+      json_object_int_add(json_stat, "opensRecv", p->open_in);
+      json_object_int_add(json_stat, "notificationsSent", p->notify_out);
+      json_object_int_add(json_stat, "notificationsRecv", p->notify_in);
+      json_object_int_add(json_stat, "updatesSent", p->update_out);
+      json_object_int_add(json_stat, "updatesRecv", p->update_in);
+      json_object_int_add(json_stat, "keepalivesSent", p->keepalive_out);
+      json_object_int_add(json_stat, "keepalivesRecv", p->keepalive_in);
+      json_object_int_add(json_stat, "routeRefreshSent", p->refresh_out);
+      json_object_int_add(json_stat, "routeRefreshRecv", p->refresh_in);
+      json_object_int_add(json_stat, "capabilitySent", p->dynamic_cap_out);
+      json_object_int_add(json_stat, "capabilityRecv", p->dynamic_cap_in);
+      json_object_int_add(json_stat, "totalSent", p->open_out + p->notify_out + p->update_out + p->keepalive_out + p->refresh_out + p->dynamic_cap_out);
+      json_object_int_add(json_stat, "totalRecv", p->open_in + p->notify_in + p->update_in + p->keepalive_in + p->refresh_in + p->dynamic_cap_in);
+      json_object_object_add(json_neigh, "messageStats", json_stat);
+    }
+  else
+    {
+      /* Packet counts. */
+      vty_out (vty, "  Message statistics:%s", VTY_NEWLINE);
+      vty_out (vty, "    Inq depth is 0%s", VTY_NEWLINE);
+      vty_out (vty, "    Outq depth is %lu%s", (unsigned long) p->obuf->count, VTY_NEWLINE);
+      vty_out (vty, "                         Sent       Rcvd%s", VTY_NEWLINE);
+      vty_out (vty, "    Opens:         %10d %10d%s", p->open_out, p->open_in, VTY_NEWLINE);
+      vty_out (vty, "    Notifications: %10d %10d%s", p->notify_out, p->notify_in, VTY_NEWLINE);
+      vty_out (vty, "    Updates:       %10d %10d%s", p->update_out, p->update_in, VTY_NEWLINE);
+      vty_out (vty, "    Keepalives:    %10d %10d%s", p->keepalive_out, p->keepalive_in, VTY_NEWLINE);
+      vty_out (vty, "    Route Refresh: %10d %10d%s", p->refresh_out, p->refresh_in, VTY_NEWLINE);
+      vty_out (vty, "    Capability:    %10d %10d%s", p->dynamic_cap_out, p->dynamic_cap_in, VTY_NEWLINE);
+      vty_out (vty, "    Total:         %10d %10d%s", p->open_out + p->notify_out +
+               p->update_out + p->keepalive_out + p->refresh_out + p->dynamic_cap_out,
+               p->open_in + p->notify_in + p->update_in + p->keepalive_in + p->refresh_in +
+               p->dynamic_cap_in, VTY_NEWLINE);
     }
 
     }
 
-  /* Default weight */
-  if (CHECK_FLAG (p->config, PEER_CONFIG_WEIGHT))
-    vty_out (vty, "  Default weight %d%s", p->weight,
-            VTY_NEWLINE);
+  if (use_json)
+    {
+      /* advertisement-interval */
+      json_object_int_add(json_neigh, "minBtwnAdvertisementRunsTimerMsecs", p->v_routeadv * 1000);
 
 
-  vty_out (vty, "%s", VTY_NEWLINE);
+      /* Update-source. */
+      if (p->update_if || p->update_source)
+        {
+          if (p->update_if)
+            json_object_string_add(json_neigh, "updateSource", p->update_if);
+          else if (p->update_source)
+            json_object_string_add(json_neigh, "updateSource", sockunion2str (p->update_source, buf1, SU_ADDRSTRLEN));
+        }
+
+      /* Default weight */
+      if (CHECK_FLAG (p->config, PEER_CONFIG_WEIGHT))
+        json_object_int_add(json_neigh, "defaultWeight", p->weight);
+
+    }
+  else
+    {
+      /* advertisement-interval */
+      vty_out (vty, "  Minimum time between advertisement runs is %d seconds%s",
+               p->v_routeadv, VTY_NEWLINE);
+
+      /* Update-source. */
+      if (p->update_if || p->update_source)
+        {
+          vty_out (vty, "  Update source is ");
+          if (p->update_if)
+            vty_out (vty, "%s", p->update_if);
+          else if (p->update_source)
+            vty_out (vty, "%s", sockunion2str (p->update_source, buf1, SU_ADDRSTRLEN));
+          vty_out (vty, "%s", VTY_NEWLINE);
+        }
+
+      /* Default weight */
+      if (CHECK_FLAG (p->config, PEER_CONFIG_WEIGHT))
+        vty_out (vty, "  Default weight %d%s", p->weight, VTY_NEWLINE);
+
+      vty_out (vty, "%s", VTY_NEWLINE);
+    }
 
   /* Address Family Information */
 
   /* Address Family Information */
+  json_object *json_hold = NULL;
+
+  if (use_json)
+    json_hold = json_object_new_object();
+
   for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
     for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
       if (p->afc[afi][safi])
   for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
     for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
       if (p->afc[afi][safi])
-       bgp_show_peer_afi (vty, p, afi, safi);
+       bgp_show_peer_afi (vty, p, afi, safi, use_json, json_hold);
 
 
-  vty_out (vty, "  Connections established %d; dropped %d%s",
-          p->established, p->dropped,
-          VTY_NEWLINE);
+  if (use_json)
+    {
+      json_object_int_add(json_hold, "connectionsEstablished", p->established);
+      json_object_int_add(json_hold, "connectionsDropped", p->dropped);
+    }
+  else
+    vty_out (vty, "  Connections established %d; dropped %d%s", p->established, p->dropped,
+            VTY_NEWLINE);
 
   if (! p->last_reset)
 
   if (! p->last_reset)
-    vty_out (vty, "  Last reset never%s", VTY_NEWLINE);
+    {
+      if (use_json)
+        json_object_string_add(json_hold, "lastReset", "never");
+      else
+        vty_out (vty, "  Last reset never%s", VTY_NEWLINE);
+    }
   else
     {
   else
     {
-      vty_out (vty, "  Last reset %s, due to %s%s",
-              peer_uptime (p->resettime, timebuf, BGP_UPTIME_LEN),
-              peer_down_str[(int) p->last_reset], VTY_NEWLINE);
-
-      if (p->last_reset_cause_size)
+      if (use_json)
         {
         {
-          msg = p->last_reset_cause;
-          vty_out(vty, "  Message received that caused BGP to send a NOTIFICATION:%s    ", VTY_NEWLINE);
-          for (i = 1; i <= p->last_reset_cause_size; i++)
+          time_t uptime;
+          struct tm *tm;
+
+          uptime = bgp_clock();
+          uptime -= p->resettime;
+          tm = gmtime(&uptime);
+          json_object_int_add(json_hold, "lastResetTimerMsecs", (tm->tm_sec * 1000) + (tm->tm_min * 60000) + (tm->tm_hour * 3600000));
+          json_object_string_add(json_hold, "lastResetDueTo", peer_down_str[(int) p->last_reset]);
+          if (p->last_reset_cause_size)
             {
             {
-             vty_out(vty, "%02X", *msg++);
+              msg = p->last_reset_cause;
+              char adapter[BUFSIZ];
+              sprintf(adapter, "%s", msg);
+              json_object_string_add(json_hold, "messageReceivedThatCausedBgpNotification", adapter);
+            }
+        }
+      else
+        {
+          vty_out (vty, "  Last reset %s, due to %s%s",
+                  peer_uptime (p->resettime, timebuf, BGP_UPTIME_LEN, 0, NULL),
+                  peer_down_str[(int) p->last_reset], VTY_NEWLINE);
 
 
-             if (i != p->last_reset_cause_size)
-               {
-                 if (i % 16 == 0)
-                   {
-                     vty_out(vty, "%s    ", VTY_NEWLINE);
-                   }
-                 else if (i % 4 == 0)
-                   {
-                     vty_out(vty, " ");
-                   }
-               }
+          if (p->last_reset_cause_size)
+            {
+              msg = p->last_reset_cause;
+              vty_out(vty, "  Message received that caused BGP to send a NOTIFICATION:%s    ", VTY_NEWLINE);
+              for (i = 1; i <= p->last_reset_cause_size; i++)
+                {
+                  vty_out(vty, "%02X", *msg++);
+
+                  if (i != p->last_reset_cause_size)
+                    {
+                      if (i % 16 == 0)
+                        {
+                          vty_out(vty, "%s    ", VTY_NEWLINE);
+                        }
+                      else if (i % 4 == 0)
+                        {
+                          vty_out(vty, " ");
+                        }
+                    }
+                }
+              vty_out(vty, "%s", VTY_NEWLINE);
             }
             }
-          vty_out(vty, "%s", VTY_NEWLINE);
         }
     }
 
   if (CHECK_FLAG (p->sflags, PEER_STATUS_PREFIX_OVERFLOW))
     {
         }
     }
 
   if (CHECK_FLAG (p->sflags, PEER_STATUS_PREFIX_OVERFLOW))
     {
-      vty_out (vty, "  Peer had exceeded the max. no. of prefixes configured.%s", VTY_NEWLINE);
+      if (use_json)
+        json_object_boolean_true_add(json_hold, "prefixesConfigExceedMax");
+      else
+        vty_out (vty, "  Peer had exceeded the max. no. of prefixes configured.%s", VTY_NEWLINE);
 
       if (p->t_pmax_restart)
 
       if (p->t_pmax_restart)
-       vty_out (vty, "  Reduce the no. of prefix from %s, will restart in %ld seconds%s",
-                p->host, thread_timer_remain_second (p->t_pmax_restart),
-                VTY_NEWLINE);
+        {
+          if (use_json)
+            {
+              json_object_string_add(json_hold, "reducePrefixNumFrom", p->host);
+              json_object_int_add(json_hold, "restartInTimerMsec", thread_timer_remain_second (p->t_pmax_restart) * 1000);
+            }
+          else
+            vty_out (vty, "  Reduce the no. of prefix from %s, will restart in %ld seconds%s",
+                     p->host, thread_timer_remain_second (p->t_pmax_restart),
+                     VTY_NEWLINE);
+        }
       else
       else
-       vty_out (vty, "  Reduce the no. of prefix and clear ip bgp %s to restore peering%s",
-                p->host, VTY_NEWLINE);
+        {
+          if (use_json)
+            json_object_string_add(json_hold, "reducePrefixNumAndClearIpBgp", p->host);
+          else
+            vty_out (vty, "  Reduce the no. of prefix and clear ip bgp %s to restore peering%s",
+                    p->host, VTY_NEWLINE);
+        }
     }
 
     }
 
+  if (use_json)
+    json_object_object_add(json_neigh, "addressFamilyInfo", json_hold);
+
   /* EBGP Multihop and GTSM */
   if (p->sort != BGP_PEER_IBGP)
     {
   /* EBGP Multihop and GTSM */
   if (p->sort != BGP_PEER_IBGP)
     {
-      if (p->gtsm_hops > 0)
-       vty_out (vty, "  External BGP neighbor may be up to %d hops away.%s",
-                p->gtsm_hops, VTY_NEWLINE);
-      else if (p->ttl > 1)
-       vty_out (vty, "  External BGP neighbor may be up to %d hops away.%s",
-                p->ttl, VTY_NEWLINE);
+      if (use_json)
+        {
+          if (p->gtsm_hops > 0)
+            json_object_int_add(json_neigh, "externalBgpNbrMaxHopsAway", p->gtsm_hops);
+          else if (p->ttl > 1)
+            json_object_int_add(json_neigh, "externalBgpNbrMaxHopsAway", p->ttl);
+        }
+      else
+        {
+          if (p->gtsm_hops > 0)
+            vty_out (vty, "  External BGP neighbor may be up to %d hops away.%s",
+                     p->gtsm_hops, VTY_NEWLINE);
+          else if (p->ttl > 1)
+            vty_out (vty, "  External BGP neighbor may be up to %d hops away.%s",
+                     p->ttl, VTY_NEWLINE);
+        }
     }
   else
     {
       if (p->gtsm_hops > 0)
     }
   else
     {
       if (p->gtsm_hops > 0)
-       vty_out (vty, "  Internal BGP neighbor may be up to %d hops away.%s",
-                p->gtsm_hops, VTY_NEWLINE);
+        {
+          if (use_json)
+            json_object_int_add(json_neigh, "internalBgpNbrMaxHopsAway", p->gtsm_hops);
+          else
+            vty_out (vty, "  Internal BGP neighbor may be up to %d hops away.%s",
+                     p->gtsm_hops, VTY_NEWLINE);
+        }
     }
 
   /* Local address. */
   if (p->su_local)
     {
     }
 
   /* Local address. */
   if (p->su_local)
     {
-      vty_out (vty, "Local host: %s, Local port: %d%s",
-              sockunion2str (p->su_local, buf1, SU_ADDRSTRLEN),
-              ntohs (p->su_local->sin.sin_port),
-              VTY_NEWLINE);
+      if (use_json)
+        {
+          json_object_string_add(json_neigh, "hostLocal", sockunion2str (p->su_local, buf1, SU_ADDRSTRLEN));
+          json_object_int_add(json_neigh, "portLocal", ntohs (p->su_local->sin.sin_port));
+        }
+      else
+        vty_out (vty, "Local host: %s, Local port: %d%s",
+                sockunion2str (p->su_local, buf1, SU_ADDRSTRLEN),
+                ntohs (p->su_local->sin.sin_port),
+                VTY_NEWLINE);
     }
       
   /* Remote address. */
   if (p->su_remote)
     {
     }
       
   /* Remote address. */
   if (p->su_remote)
     {
-      vty_out (vty, "Foreign host: %s, Foreign port: %d%s",
+      if (use_json)
+        {
+          json_object_string_add(json_neigh, "hostForeign", sockunion2str (p->su_remote, buf1, SU_ADDRSTRLEN));
+          json_object_int_add(json_neigh, "portForeign", ntohs (p->su_remote->sin.sin_port));
+        }
+      else
+        vty_out (vty, "Foreign host: %s, Foreign port: %d%s",
               sockunion2str (p->su_remote, buf1, SU_ADDRSTRLEN),
               ntohs (p->su_remote->sin.sin_port),
               VTY_NEWLINE);
               sockunion2str (p->su_remote, buf1, SU_ADDRSTRLEN),
               ntohs (p->su_remote->sin.sin_port),
               VTY_NEWLINE);
@@ -9709,56 +10437,108 @@ bgp_show_peer (struct vty *vty, struct peer *p)
   /* Nexthop display. */
   if (p->su_local)
     {
   /* Nexthop display. */
   if (p->su_local)
     {
-      vty_out (vty, "Nexthop: %s%s", 
-              inet_ntop (AF_INET, &p->nexthop.v4, buf1, BUFSIZ),
-              VTY_NEWLINE);
+      if (use_json)
+        {
+          json_object_string_add(json_neigh, "nexthop", inet_ntop (AF_INET, &p->nexthop.v4, buf1, BUFSIZ));
 #ifdef HAVE_IPV6
 #ifdef HAVE_IPV6
-      vty_out (vty, "Nexthop global: %s%s", 
-              inet_ntop (AF_INET6, &p->nexthop.v6_global, buf1, BUFSIZ),
-              VTY_NEWLINE);
-      vty_out (vty, "Nexthop local: %s%s",
-              inet_ntop (AF_INET6, &p->nexthop.v6_local, buf1, BUFSIZ),
-              VTY_NEWLINE);
-      vty_out (vty, "BGP connection: %s%s",
-              p->shared_network ? "shared network" : "non shared network",
-              VTY_NEWLINE);
+          json_object_string_add(json_neigh, "nexthopGlobal", inet_ntop (AF_INET6, &p->nexthop.v6_global, buf1, BUFSIZ));
+          json_object_string_add(json_neigh, "nexthopLocal", inet_ntop (AF_INET6, &p->nexthop.v6_local, buf1, BUFSIZ));
+          if (p->shared_network)
+            json_object_string_add(json_neigh, "bgpConnection", "sharedNetwork");
+          else
+            json_object_string_add(json_neigh, "bgpConnection", "nonSharedNetwork");
 #endif /* HAVE_IPV6 */
 #endif /* HAVE_IPV6 */
+        }
+      else
+        {
+          vty_out (vty, "Nexthop: %s%s",
+                  inet_ntop (AF_INET, &p->nexthop.v4, buf1, BUFSIZ),
+                  VTY_NEWLINE);
+#ifdef HAVE_IPV6
+          vty_out (vty, "Nexthop global: %s%s",
+                  inet_ntop (AF_INET6, &p->nexthop.v6_global, buf1, BUFSIZ),
+                  VTY_NEWLINE);
+          vty_out (vty, "Nexthop local: %s%s",
+                  inet_ntop (AF_INET6, &p->nexthop.v6_local, buf1, BUFSIZ),
+                  VTY_NEWLINE);
+          vty_out (vty, "BGP connection: %s%s",
+                  p->shared_network ? "shared network" : "non shared network",
+                  VTY_NEWLINE);
+#endif /* HAVE_IPV6 */
+        }
     }
 
   /* Timer information. */
     }
 
   /* Timer information. */
-  if (p->t_start)
-    vty_out (vty, "Next start timer due in %ld seconds%s",
-            thread_timer_remain_second (p->t_start), VTY_NEWLINE);
-  if (p->t_connect)
-    vty_out (vty, "Next connect timer due in %ld seconds%s",
-            thread_timer_remain_second (p->t_connect), VTY_NEWLINE);
-  if (p->t_routeadv)
-    vty_out (vty, "MRAI (interval %u) timer expires in %ld seconds%s",
-            p->v_routeadv, thread_timer_remain_second (p->t_routeadv),
-            VTY_NEWLINE);
+  if (use_json)
+    {
+      if (p->t_start)
+        json_object_int_add(json_neigh, "nextStartTimerDueInMsecs", thread_timer_remain_second (p->t_start) * 1000);
+      if (p->t_connect)
+        json_object_int_add(json_neigh, "nextConnectTimerDueInMsecs", thread_timer_remain_second (p->t_connect) * 1000);
+      if (p->t_routeadv)
+        {
+          json_object_int_add(json_neigh, "mraiInterval", p->v_routeadv);
+          json_object_int_add(json_neigh, "mraiTimerExpireInMsecs", thread_timer_remain_second (p->t_routeadv) * 1000);
+        }
 
 
-  vty_out (vty, "Read thread: %s  Write thread: %s%s",
-          p->t_read ? "on" : "off",
-          p->t_write ? "on" : "off",
-          VTY_NEWLINE);
+      if (p->t_read)
+        json_object_string_add(json_neigh, "readThread", "on");
+      else
+        json_object_string_add(json_neigh, "readThread", "off");
+      if (p->t_write)
+        json_object_string_add(json_neigh, "writeThread", "on");
+      else
+        json_object_string_add(json_neigh, "writeThread", "off");
+    }
+  else
+    {
+      if (p->t_start)
+        vty_out (vty, "Next start timer due in %ld seconds%s",
+                 thread_timer_remain_second (p->t_start), VTY_NEWLINE);
+      if (p->t_connect)
+        vty_out (vty, "Next connect timer due in %ld seconds%s",
+                 thread_timer_remain_second (p->t_connect), VTY_NEWLINE);
+      if (p->t_routeadv)
+        vty_out (vty, "MRAI (interval %u) timer expires in %ld seconds%s",
+                 p->v_routeadv, thread_timer_remain_second (p->t_routeadv),
+                 VTY_NEWLINE);
+
+      vty_out (vty, "Read thread: %s  Write thread: %s%s",
+               p->t_read ? "on" : "off",
+               p->t_write ? "on" : "off",
+               VTY_NEWLINE);
+    }
 
   if (p->notify.code == BGP_NOTIFY_OPEN_ERR
       && p->notify.subcode == BGP_NOTIFY_OPEN_UNSUP_CAPBL)
 
   if (p->notify.code == BGP_NOTIFY_OPEN_ERR
       && p->notify.subcode == BGP_NOTIFY_OPEN_UNSUP_CAPBL)
-    bgp_capability_vty_out (vty, p);
-  vty_out (vty, "%s", VTY_NEWLINE);
+    bgp_capability_vty_out (vty, p, use_json, json_neigh);
+
+  if (!use_json)
+    vty_out (vty, "%s", VTY_NEWLINE);
 
   /* BFD information. */
 
   /* BFD information. */
-  bgp_bfd_show_info(vty, p);
+  bgp_bfd_show_info(vty, p, use_json, json_neigh);
+
+  if (use_json)
+    {
+      if (p->conf_if) /* Configured interface name. */
+        json_object_object_add(json, p->conf_if, json_neigh);
+      else /* Configured IP address. */
+        json_object_object_add(json, p->host, json_neigh);
+    }
 }
 
 static int
 }
 
 static int
-bgp_show_neighbor (struct vty *vty, struct bgp *bgp,
-                  enum show_type type, union sockunion *su, const char *conf_if)
+bgp_show_neighbor (struct vty *vty, struct bgp *bgp, enum show_type type,
+                   union sockunion *su, const char *conf_if, u_char use_json, json_object *json)
 {
   struct listnode *node, *nnode;
   struct peer *peer;
   int find = 0;
 {
   struct listnode *node, *nnode;
   struct peer *peer;
   int find = 0;
+  json_object *json_neigh = NULL;
+
+  if (use_json)
+    json_neigh = json_object_new_object();
 
   for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
     {
 
   for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
     {
@@ -9766,51 +10546,78 @@ bgp_show_neighbor (struct vty *vty, struct bgp *bgp,
        continue;
 
       switch (type)
        continue;
 
       switch (type)
-       {
-       case show_all:
-         bgp_show_peer (vty, peer);
-         break;
-       case show_peer:
-    if (conf_if)
-      {
-        if (peer->conf_if && !strcmp(peer->conf_if, conf_if))
-          {
-            find = 1;
-            bgp_show_peer (vty, peer);
-          }
-      }
-    else
-      {
-        if (sockunion_same (&peer->su, su))
-          {
-            find = 1;
-            bgp_show_peer (vty, peer);
-          }
-      }
-         break;
+        {
+          case show_all:
+            bgp_show_peer (vty, peer, use_json, json, json_neigh);
+          break;
+          case show_peer:
+            if (conf_if)
+              {
+                if (peer->conf_if && !strcmp(peer->conf_if, conf_if))
+                  {
+                    find = 1;
+                    bgp_show_peer (vty, peer, use_json, json, json_neigh);
+                  }
+              }
+            else
+              {
+               if (sockunion_same (&peer->su, su))
+                 {
+                   find = 1;
+                   bgp_show_peer (vty, peer, use_json, json, json_neigh);
+                 }
+              }
+          break;
        }
     }
 
   if (type == show_peer && ! find)
        }
     }
 
   if (type == show_peer && ! find)
-    vty_out (vty, "%% No such neighbor%s", VTY_NEWLINE);
-  
+    {
+      if (use_json)
+        json_object_boolean_true_add(json, "bgpNoSuchNeighbor");
+      else
+        vty_out (vty, "%% No such neighbor%s", VTY_NEWLINE);
+    }
+
+  if (use_json)
+    {
+      vty_out (vty, "%s%s", json_object_to_json_string(json), VTY_NEWLINE);
+      json_object_free(json);
+    }
+  else
+    {
+      vty_out (vty, "%s", VTY_NEWLINE);
+    }
+
   return CMD_SUCCESS;
 }
 
 static int 
 bgp_show_neighbor_vty (struct vty *vty, const char *name, 
   return CMD_SUCCESS;
 }
 
 static int 
 bgp_show_neighbor_vty (struct vty *vty, const char *name, 
-                       enum show_type type, const char *ip_str)
+                       enum show_type type, const char *ip_str, u_char use_json)
 {
   int ret;
   struct bgp *bgp;
   union sockunion su;
 {
   int ret;
   struct bgp *bgp;
   union sockunion su;
+  json_object *json = NULL;
+
+  if (use_json)
+    json = json_object_new_object();
 
   if (name)
     {
       bgp = bgp_lookup_by_name (name);
       if (! bgp)
         {
 
   if (name)
     {
       bgp = bgp_lookup_by_name (name);
       if (! bgp)
         {
-          vty_out (vty, "%% No such BGP instance exist%s", VTY_NEWLINE); 
+          if (use_json)
+            {
+              json_object_boolean_true_add(json, "bgpNoSuchInstance");
+              vty_out (vty, "%s%s", json_object_to_json_string(json), VTY_NEWLINE);
+              json_object_free(json);
+            }
+          else
+            vty_out (vty, "%% No such BGP instance exist%s", VTY_NEWLINE);
+
           return CMD_WARNING;
         }
     }
           return CMD_WARNING;
         }
     }
@@ -9825,13 +10632,13 @@ bgp_show_neighbor_vty (struct vty *vty, const char *name,
         {
           ret = str2sockunion (ip_str, &su);
           if (ret < 0)
         {
           ret = str2sockunion (ip_str, &su);
           if (ret < 0)
-            bgp_show_neighbor (vty, bgp, type, NULL, ip_str);
+            bgp_show_neighbor (vty, bgp, type, NULL, ip_str, use_json, json);
           else
           else
-            bgp_show_neighbor (vty, bgp, type, &su, NULL);
+            bgp_show_neighbor (vty, bgp, type, &su, NULL, use_json, json);
         }
       else
         {
         }
       else
         {
-          bgp_show_neighbor (vty, bgp, type, NULL, NULL);
+          bgp_show_neighbor (vty, bgp, type, NULL, NULL, use_json, json);
         }
     }
 
         }
     }
 
@@ -9841,79 +10648,100 @@ bgp_show_neighbor_vty (struct vty *vty, const char *name,
 /* "show ip bgp neighbors" commands.  */
 DEFUN (show_ip_bgp_neighbors,
        show_ip_bgp_neighbors_cmd,
 /* "show ip bgp neighbors" commands.  */
 DEFUN (show_ip_bgp_neighbors,
        show_ip_bgp_neighbors_cmd,
-       "show ip bgp neighbors",
+       "show ip bgp neighbors {json}",
        SHOW_STR
        IP_STR
        BGP_STR
        SHOW_STR
        IP_STR
        BGP_STR
-       "Detailed information on TCP and BGP neighbor connections\n")
+       "Detailed information on TCP and BGP neighbor connections\n"
+       "JavaScript Object Notation\n")
 {
 {
-  return bgp_show_neighbor_vty (vty, NULL, show_all, NULL);
+  u_char use_json;
+
+  if (argv[argc - 1] && strcmp(argv[argc - 1], "json") == 0)
+    use_json = 1;
+  else
+    use_json = 0;
+
+  return bgp_show_neighbor_vty (vty, NULL, show_all, NULL, use_json);
 }
 
 ALIAS (show_ip_bgp_neighbors,
        show_ip_bgp_ipv4_neighbors_cmd,
 }
 
 ALIAS (show_ip_bgp_neighbors,
        show_ip_bgp_ipv4_neighbors_cmd,
-       "show ip bgp ipv4 (unicast|multicast) neighbors",
+       "show ip bgp ipv4 (unicast|multicast) neighbors {json}",
        SHOW_STR
        IP_STR
        BGP_STR
        "Address family\n"
        "Address Family modifier\n"
        "Address Family modifier\n"
        SHOW_STR
        IP_STR
        BGP_STR
        "Address family\n"
        "Address Family modifier\n"
        "Address Family modifier\n"
-       "Detailed information on TCP and BGP neighbor connections\n")
+       "Detailed information on TCP and BGP neighbor connections\n"
+       "JavaScript Object Notation\n")
 
 ALIAS (show_ip_bgp_neighbors,
        show_ip_bgp_vpnv4_all_neighbors_cmd,
 
 ALIAS (show_ip_bgp_neighbors,
        show_ip_bgp_vpnv4_all_neighbors_cmd,
-       "show ip bgp vpnv4 all neighbors",
+       "show ip bgp vpnv4 all neighbors {json}",
        SHOW_STR
        IP_STR
        BGP_STR
        "Display VPNv4 NLRI specific information\n"
        "Display information about all VPNv4 NLRIs\n"
        SHOW_STR
        IP_STR
        BGP_STR
        "Display VPNv4 NLRI specific information\n"
        "Display information about all VPNv4 NLRIs\n"
-       "Detailed information on TCP and BGP neighbor connections\n")
+       "Detailed information on TCP and BGP neighbor connections\n"
+       "JavaScript Object Notation\n")
 
 ALIAS (show_ip_bgp_neighbors,
        show_ip_bgp_vpnv4_rd_neighbors_cmd,
 
 ALIAS (show_ip_bgp_neighbors,
        show_ip_bgp_vpnv4_rd_neighbors_cmd,
-       "show ip bgp vpnv4 rd ASN:nn_or_IP-address:nn neighbors",
+       "show ip bgp vpnv4 rd ASN:nn_or_IP-address:nn neighbors {json}",
        SHOW_STR
        IP_STR
        BGP_STR
        "Display VPNv4 NLRI specific information\n"
        "Display information for a route distinguisher\n"
        "VPN Route Distinguisher\n"
        SHOW_STR
        IP_STR
        BGP_STR
        "Display VPNv4 NLRI specific information\n"
        "Display information for a route distinguisher\n"
        "VPN Route Distinguisher\n"
-       "Detailed information on TCP and BGP neighbor connections\n")
+       "Detailed information on TCP and BGP neighbor connections\n"
+       "JavaScript Object Notation\n")
 
 ALIAS (show_ip_bgp_neighbors,
        show_bgp_neighbors_cmd,
 
 ALIAS (show_ip_bgp_neighbors,
        show_bgp_neighbors_cmd,
-       "show bgp neighbors",
+       "show bgp neighbors {json}",
        SHOW_STR
        BGP_STR
        SHOW_STR
        BGP_STR
-       "Detailed information on TCP and BGP neighbor connections\n")
+       "Detailed information on TCP and BGP neighbor connections\n"
+       "JavaScript Object Notation\n")
 
 ALIAS (show_ip_bgp_neighbors,
        show_bgp_ipv6_neighbors_cmd,
 
 ALIAS (show_ip_bgp_neighbors,
        show_bgp_ipv6_neighbors_cmd,
-       "show bgp ipv6 neighbors",
+       "show bgp ipv6 neighbors {json}",
        SHOW_STR
        BGP_STR
        "Address family\n"
        SHOW_STR
        BGP_STR
        "Address family\n"
-       "Detailed information on TCP and BGP neighbor connections\n")
+       "Detailed information on TCP and BGP neighbor connections\n"
+       "JavaScript Object Notation\n")
 
 DEFUN (show_ip_bgp_neighbors_peer,
        show_ip_bgp_neighbors_peer_cmd,
 
 DEFUN (show_ip_bgp_neighbors_peer,
        show_ip_bgp_neighbors_peer_cmd,
-       "show ip bgp neighbors (A.B.C.D|X:X::X:X|WORD)",
+       "show ip bgp neighbors (A.B.C.D|X:X::X:X|WORD) {json}",
        SHOW_STR
        IP_STR
        BGP_STR
        "Detailed information on TCP and BGP neighbor connections\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        SHOW_STR
        IP_STR
        BGP_STR
        "Detailed information on TCP and BGP neighbor connections\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
-       "Neighbor on bgp configured interface\n")
+       "Neighbor on bgp configured interface\n"
+       "JavaScript Object Notation\n")
 {
 {
-  return bgp_show_neighbor_vty (vty, NULL, show_peer, argv[argc - 1]);
+  u_char use_json;
+
+  if (argv[argc - 1] && strcmp(argv[argc - 1], "json") == 0)
+    use_json = 1;
+  else
+    use_json = 0;
+
+  return bgp_show_neighbor_vty (vty, NULL, show_peer, argv[argc - 2], use_json);
 }
 
 ALIAS (show_ip_bgp_neighbors_peer,
        show_ip_bgp_ipv4_neighbors_peer_cmd,
 }
 
 ALIAS (show_ip_bgp_neighbors_peer,
        show_ip_bgp_ipv4_neighbors_peer_cmd,
-       "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X|WORD)",
+       "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X|WORD) {json}",
        SHOW_STR
        IP_STR
        BGP_STR
        SHOW_STR
        IP_STR
        BGP_STR
@@ -9923,86 +10751,101 @@ ALIAS (show_ip_bgp_neighbors_peer,
        "Detailed information on TCP and BGP neighbor connections\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Detailed information on TCP and BGP neighbor connections\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
-       "Neighbor on bgp configured interface\n")
+       "Neighbor on bgp configured interface\n"
+       "JavaScript Object Notation\n")
 
 ALIAS (show_ip_bgp_neighbors_peer,
        show_ip_bgp_vpnv4_all_neighbors_peer_cmd,
 
 ALIAS (show_ip_bgp_neighbors_peer,
        show_ip_bgp_vpnv4_all_neighbors_peer_cmd,
-       "show ip bgp vpnv4 all neighbors A.B.C.D",
+       "show ip bgp vpnv4 all neighbors A.B.C.D {json}",
        SHOW_STR
        IP_STR
        BGP_STR
        "Display VPNv4 NLRI specific information\n"
        "Display information about all VPNv4 NLRIs\n"
        "Detailed information on TCP and BGP neighbor connections\n"
        SHOW_STR
        IP_STR
        BGP_STR
        "Display VPNv4 NLRI specific information\n"
        "Display information about all VPNv4 NLRIs\n"
        "Detailed information on TCP and BGP neighbor connections\n"
-       "Neighbor to display information about\n")
+       "Neighbor to display information about\n"
+       "JavaScript Object Notation\n")
 
 ALIAS (show_ip_bgp_neighbors_peer,
        show_ip_bgp_vpnv4_rd_neighbors_peer_cmd,
 
 ALIAS (show_ip_bgp_neighbors_peer,
        show_ip_bgp_vpnv4_rd_neighbors_peer_cmd,
-       "show ip bgp vpnv4 rd ASN:nn_or_IP-address:nn neighbors A.B.C.D",
+       "show ip bgp vpnv4 rd ASN:nn_or_IP-address:nn neighbors A.B.C.D {json}",
        SHOW_STR
        IP_STR
        BGP_STR
        "Display VPNv4 NLRI specific information\n"
        "Display information about all VPNv4 NLRIs\n"
        "Detailed information on TCP and BGP neighbor connections\n"
        SHOW_STR
        IP_STR
        BGP_STR
        "Display VPNv4 NLRI specific information\n"
        "Display information about all VPNv4 NLRIs\n"
        "Detailed information on TCP and BGP neighbor connections\n"
-       "Neighbor to display information about\n")
+       "Neighbor to display information about\n"
+       "JavaScript Object Notation\n")
 
 ALIAS (show_ip_bgp_neighbors_peer,
        show_bgp_neighbors_peer_cmd,
 
 ALIAS (show_ip_bgp_neighbors_peer,
        show_bgp_neighbors_peer_cmd,
-       "show bgp neighbors (A.B.C.D|X:X::X:X|WORD)",
+       "show bgp neighbors (A.B.C.D|X:X::X:X|WORD) {json}",
        SHOW_STR
        BGP_STR
        "Detailed information on TCP and BGP neighbor connections\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        SHOW_STR
        BGP_STR
        "Detailed information on TCP and BGP neighbor connections\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
-       "Neighbor on bgp configured interface\n")
+       "Neighbor on bgp configured interface\n"
+       "JavaScript Object Notation\n")
 
 ALIAS (show_ip_bgp_neighbors_peer,
        show_bgp_ipv6_neighbors_peer_cmd,
 
 ALIAS (show_ip_bgp_neighbors_peer,
        show_bgp_ipv6_neighbors_peer_cmd,
-       "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X|WORD)",
+       "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X|WORD) {json}",
        SHOW_STR
        BGP_STR
        "Address family\n"
        "Detailed information on TCP and BGP neighbor connections\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        SHOW_STR
        BGP_STR
        "Address family\n"
        "Detailed information on TCP and BGP neighbor connections\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
-       "Neighbor on bgp configured interface\n")
+       "Neighbor on bgp configured interface\n"
+       "JavaScript Object Notation\n")
 
 DEFUN (show_ip_bgp_instance_neighbors,
        show_ip_bgp_instance_neighbors_cmd,
 
 DEFUN (show_ip_bgp_instance_neighbors,
        show_ip_bgp_instance_neighbors_cmd,
-       "show ip bgp view WORD neighbors",
+       "show ip bgp view WORD neighbors {json}",
        SHOW_STR
        IP_STR
        BGP_STR
        "BGP view\n"
        "View name\n"
        SHOW_STR
        IP_STR
        BGP_STR
        "BGP view\n"
        "View name\n"
-       "Detailed information on TCP and BGP neighbor connections\n")
+       "Detailed information on TCP and BGP neighbor connections\n"
+       "JavaScript Object Notation\n")
 {
 {
-  return bgp_show_neighbor_vty (vty, argv[0], show_all, NULL);
+  u_char use_json;
+
+  if (argv[1] && strcmp(argv[1], "json") == 0)
+    use_json = 1;
+  else
+    use_json = 0;
+
+  return bgp_show_neighbor_vty (vty, argv[0], show_all, NULL, use_json);
 }
 
 ALIAS (show_ip_bgp_instance_neighbors,
        show_bgp_instance_neighbors_cmd,
 }
 
 ALIAS (show_ip_bgp_instance_neighbors,
        show_bgp_instance_neighbors_cmd,
-       "show bgp view WORD neighbors",
+       "show bgp view WORD neighbors {json}",
        SHOW_STR
        BGP_STR
        "BGP view\n"
        "View name\n"
        SHOW_STR
        BGP_STR
        "BGP view\n"
        "View name\n"
-       "Detailed information on TCP and BGP neighbor connections\n")
+       "Detailed information on TCP and BGP neighbor connections\n"
+       "JavaScript Object Notation\n")
 
 ALIAS (show_ip_bgp_instance_neighbors,
        show_bgp_instance_ipv6_neighbors_cmd,
 
 ALIAS (show_ip_bgp_instance_neighbors,
        show_bgp_instance_ipv6_neighbors_cmd,
-       "show bgp view WORD ipv6 neighbors",
+       "show bgp view WORD ipv6 neighbors {json}",
        SHOW_STR
        BGP_STR
        "BGP view\n"
        "View name\n"
        "Address family\n"
        SHOW_STR
        BGP_STR
        "BGP view\n"
        "View name\n"
        "Address family\n"
-       "Detailed information on TCP and BGP neighbor connections\n")
+       "Detailed information on TCP and BGP neighbor connections\n"
+       "JavaScript Object Notation\n")
 
 DEFUN (show_ip_bgp_instance_neighbors_peer,
        show_ip_bgp_instance_neighbors_peer_cmd,
 
 DEFUN (show_ip_bgp_instance_neighbors_peer,
        show_ip_bgp_instance_neighbors_peer_cmd,
-       "show ip bgp view WORD neighbors (A.B.C.D|X:X::X:X|WORD)",
+       "show ip bgp view WORD neighbors (A.B.C.D|X:X::X:X|WORD) {json}",
        SHOW_STR
        IP_STR
        BGP_STR
        SHOW_STR
        IP_STR
        BGP_STR
@@ -10011,14 +10854,22 @@ DEFUN (show_ip_bgp_instance_neighbors_peer,
        "Detailed information on TCP and BGP neighbor connections\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Detailed information on TCP and BGP neighbor connections\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
-       "Neighbor on bgp configured interface\n")
+       "Neighbor on bgp configured interface\n"
+       "JavaScript Object Notation\n")
 {
 {
-  return bgp_show_neighbor_vty (vty, argv[0], show_peer, argv[1]);
+  u_char use_json;
+
+  if (argv[2] && strcmp(argv[2], "json") == 0)
+    use_json = 1;
+  else
+    use_json = 0;
+
+  return bgp_show_neighbor_vty (vty, argv[0], show_peer, argv[1], use_json);
 }
 
 ALIAS (show_ip_bgp_instance_neighbors_peer,
        show_bgp_instance_neighbors_peer_cmd,
 }
 
 ALIAS (show_ip_bgp_instance_neighbors_peer,
        show_bgp_instance_neighbors_peer_cmd,
-       "show bgp view WORD neighbors (A.B.C.D|X:X::X:X|WORD)",
+       "show bgp view WORD neighbors (A.B.C.D|X:X::X:X|WORD) {json}",
        SHOW_STR
        BGP_STR
        "BGP view\n"
        SHOW_STR
        BGP_STR
        "BGP view\n"
@@ -10026,11 +10877,12 @@ ALIAS (show_ip_bgp_instance_neighbors_peer,
        "Detailed information on TCP and BGP neighbor connections\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Detailed information on TCP and BGP neighbor connections\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
-       "Neighbor on bgp configured interface\n")
+       "Neighbor on bgp configured interface\n"
+       "JavaScript Object Notation\n")
 
 ALIAS (show_ip_bgp_instance_neighbors_peer,
        show_bgp_instance_ipv6_neighbors_peer_cmd,
 
 ALIAS (show_ip_bgp_instance_neighbors_peer,
        show_bgp_instance_ipv6_neighbors_peer_cmd,
-       "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X|WORD)",
+       "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X|WORD) {json}",
        SHOW_STR
        BGP_STR
        "BGP view\n"
        SHOW_STR
        BGP_STR
        "BGP view\n"
@@ -10039,7 +10891,8 @@ ALIAS (show_ip_bgp_instance_neighbors_peer,
        "Detailed information on TCP and BGP neighbor connections\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
        "Detailed information on TCP and BGP neighbor connections\n"
        "Neighbor to display information about\n"
        "Neighbor to display information about\n"
-       "Neighbor on bgp configured interface\n")
+       "Neighbor on bgp configured interface\n"
+       "JavaScript Object Notation\n")
        
 /* Show BGP's AS paths internal data.  There are both `show ip bgp
    paths' and `show ip mbgp paths'.  Those functions results are the
        
 /* Show BGP's AS paths internal data.  There are both `show ip bgp
    paths' and `show ip mbgp paths'.  Those functions results are the
@@ -10171,7 +11024,7 @@ bgp_write_rsclient_summary (struct vty *vty, struct peer *rsclient,
     rmname = "<none>";
   vty_out (vty, " %13s ", rmname);
 
     rmname = "<none>";
   vty_out (vty, " %13s ", rmname);
 
-  vty_out (vty, "%8s", peer_uptime (rsclient->uptime, timebuf, BGP_UPTIME_LEN));
+  vty_out (vty, "%8s", peer_uptime (rsclient->uptime, timebuf, BGP_UPTIME_LEN, 0, NULL));
 
   if (CHECK_FLAG (rsclient->flags, PEER_FLAG_SHUTDOWN))
     vty_out (vty, " Idle (Admin)");
 
   if (CHECK_FLAG (rsclient->flags, PEER_FLAG_SHUTDOWN))
     vty_out (vty, " Idle (Admin)");
index ada6a0ea960189ae0e774979f2cae3386dcd7fac..cb28b5cb30cdcae61807e343a30154896e9c5514 100644 (file)
@@ -30,6 +30,7 @@ Boston, MA 02111-1307, USA.  */
 #include "routemap.h"
 #include "thread.h"
 #include "queue.h"
 #include "routemap.h"
 #include "thread.h"
 #include "queue.h"
+#include "lib/json.h"
 
 #include "bgpd/bgpd.h"
 #include "bgpd/bgp_route.h"
 
 #include "bgpd/bgpd.h"
 #include "bgpd/bgp_route.h"
index 7651505a650b5c642ad936a3b3bf685a812343cc..3d6553cac27663e89fffe1a6b96f1a4aa6fd3f4f 100644 (file)
@@ -20,6 +20,7 @@ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 
 #include <zebra.h>
 
 
 #include <zebra.h>
 
+#include "lib/json.h"
 #include "prefix.h"
 #include "thread.h"
 #include "buffer.h"
 #include "prefix.h"
 #include "thread.h"
 #include "buffer.h"
@@ -5853,7 +5854,7 @@ peer_clear_soft (struct peer *peer, afi_t afi, safi_t safi,
 /* Display peer uptime.*/
 /* XXX: why does this function return char * when it takes buffer? */
 char *
 /* Display peer uptime.*/
 /* XXX: why does this function return char * when it takes buffer? */
 char *
-peer_uptime (time_t uptime2, char *buf, size_t len)
+peer_uptime (time_t uptime2, char *buf, size_t len, u_char use_json, json_object *json)
 {
   time_t uptime1;
   struct tm *tm;
 {
   time_t uptime1;
   struct tm *tm;
@@ -5861,16 +5862,22 @@ peer_uptime (time_t uptime2, char *buf, size_t len)
   /* Check buffer length. */
   if (len < BGP_UPTIME_LEN)
     {
   /* Check buffer length. */
   if (len < BGP_UPTIME_LEN)
     {
-      zlog_warn ("peer_uptime (): buffer shortage %lu", (u_long)len);
-      /* XXX: should return status instead of buf... */
-      snprintf (buf, len, "<error> "); 
+      if (!use_json)
+        {
+          zlog_warn ("peer_uptime (): buffer shortage %lu", (u_long)len);
+          /* XXX: should return status instead of buf... */
+          snprintf (buf, len, "<error> ");
+        }
       return buf;
     }
 
   /* If there is no connection has been done before print `never'. */
   if (uptime2 == 0)
     {
       return buf;
     }
 
   /* If there is no connection has been done before print `never'. */
   if (uptime2 == 0)
     {
-      snprintf (buf, len, "never");
+      if (use_json)
+        json_object_string_add(json, "peerUptime", "never");
+      else
+        snprintf (buf, len, "never");
       return buf;
     }
 
       return buf;
     }
 
@@ -5883,15 +5890,48 @@ peer_uptime (time_t uptime2, char *buf, size_t len)
 #define ONE_DAY_SECOND 60*60*24
 #define ONE_WEEK_SECOND 60*60*24*7
 
 #define ONE_DAY_SECOND 60*60*24
 #define ONE_WEEK_SECOND 60*60*24*7
 
-  if (uptime1 < ONE_DAY_SECOND)
-    snprintf (buf, len, "%02d:%02d:%02d", 
-             tm->tm_hour, tm->tm_min, tm->tm_sec);
-  else if (uptime1 < ONE_WEEK_SECOND)
-    snprintf (buf, len, "%dd%02dh%02dm", 
-             tm->tm_yday, tm->tm_hour, tm->tm_min);
+  if (use_json)
+    {
+      int time_store;
+      int day_msec = 86400000;
+      int hour_msec = 3600000;
+      int minute_msec = 60000;
+      int sec_msec = 1000;
+
+      if (uptime1 < ONE_DAY_SECOND)
+        {
+          time_store = hour_msec * tm->tm_hour + minute_msec * tm->tm_min + sec_msec * tm->tm_sec;
+          json_object_int_add(json, "peerUptimeMsec", time_store);
+          snprintf (buf, len, "%02d:%02d:%02d",
+                   tm->tm_hour, tm->tm_min, tm->tm_sec);
+        }
+      else if (uptime1 < ONE_WEEK_SECOND)
+        {
+          time_store = day_msec * tm->tm_yday + hour_msec * tm->tm_hour + minute_msec * tm->tm_min + sec_msec * tm->tm_sec;
+          json_object_int_add(json, "peerUptimeMsec", time_store);
+          snprintf (buf, len, "%dd%02dh%02dm",
+                   tm->tm_yday, tm->tm_hour, tm->tm_min);
+        }
+      else
+        {
+          time_store = day_msec * tm->tm_yday + hour_msec * tm->tm_hour + minute_msec * tm->tm_min + sec_msec * tm->tm_sec;
+          json_object_int_add(json, "peerUptimeMsec", time_store);
+          snprintf (buf, len, "%02dw%dd%02dh",
+                    tm->tm_yday/7, tm->tm_yday - ((tm->tm_yday/7) * 7), tm->tm_hour);
+        }
+    }
   else
   else
-    snprintf (buf, len, "%02dw%dd%02dh", 
-             tm->tm_yday/7, tm->tm_yday - ((tm->tm_yday/7) * 7), tm->tm_hour);
+    {
+      if (uptime1 < ONE_DAY_SECOND)
+        snprintf (buf, len, "%02d:%02d:%02d",
+                 tm->tm_hour, tm->tm_min, tm->tm_sec);
+      else if (uptime1 < ONE_WEEK_SECOND)
+        snprintf (buf, len, "%dd%02dh%02dm",
+                 tm->tm_yday, tm->tm_hour, tm->tm_min);
+      else
+        snprintf (buf, len, "%02dw%dd%02dh",
+                 tm->tm_yday/7, tm->tm_yday - ((tm->tm_yday/7) * 7), tm->tm_hour);
+    }
   return buf;
 }
 
   return buf;
 }
 
index 851132cb8bf4860ea2b8740f04d489b4940f5b2d..f3edb668491042f7bbd7de1fd68ea21e0c84db0e 100644 (file)
@@ -21,6 +21,7 @@ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 #ifndef _QUAGGA_BGPD_H
 #define _QUAGGA_BGPD_H
 
 #ifndef _QUAGGA_BGPD_H
 #define _QUAGGA_BGPD_H
 
+#include "lib/json.h"
 /* For union sockunion.  */
 #include "queue.h"
 #include "sockunion.h"
 /* For union sockunion.  */
 #include "queue.h"
 #include "sockunion.h"
@@ -1147,7 +1148,8 @@ extern struct peer *peer_create(union sockunion *, const char *, struct bgp *,
                                 as_t, as_t, int, afi_t, safi_t);
 extern struct peer *peer_create_accept (struct bgp *);
 extern void peer_xfer_config (struct peer *dst, struct peer *src);
                                 as_t, as_t, int, afi_t, safi_t);
 extern struct peer *peer_create_accept (struct bgp *);
 extern void peer_xfer_config (struct peer *dst, struct peer *src);
-extern char *peer_uptime (time_t, char *, size_t);
+extern char *peer_uptime (time_t, char *, size_t, u_char, json_object *);
+
 extern int bgp_config_write (struct vty *);
 extern void bgp_config_write_family_header (struct vty *, afi_t, safi_t, int *);
 
 extern int bgp_config_write (struct vty *);
 extern void bgp_config_write_family_header (struct vty *, afi_t, safi_t, int *);
 
index 10012f3dc476339eadfadeb34e30dbac6bfb33e5..2418c8621dcb561639a1360c390d5da8b0879d9c 100644 (file)
@@ -20,6 +20,7 @@
  */
 
 #include <zebra.h>
  */
 
 #include <zebra.h>
+#include "lib/json.h"
 
 #include "prefix.h"
 #include "command.h"
 
 #include "prefix.h"
 #include "command.h"
@@ -2559,10 +2560,13 @@ prefix_bgp_orf_remove_all (char *name)
 
 /* return prefix count */
 int
 
 /* return prefix count */
 int
-prefix_bgp_show_prefix_list (struct vty *vty, afi_t afi, char *name)
+prefix_bgp_show_prefix_list (struct vty *vty, afi_t afi, char *name, u_char use_json)
 {
   struct prefix_list *plist;
   struct prefix_list_entry *pentry;
 {
   struct prefix_list *plist;
   struct prefix_list_entry *pentry;
+  json_object *json = NULL;
+  json_object *json_prefix = NULL;
+  json_object *json_list = NULL;
 
   plist = prefix_list_lookup (AFI_ORF_PREFIX, name);
   if (! plist)
 
   plist = prefix_list_lookup (AFI_ORF_PREFIX, name);
   if (! plist)
@@ -2571,26 +2575,65 @@ prefix_bgp_show_prefix_list (struct vty *vty, afi_t afi, char *name)
   if (! vty)
     return plist->count;
 
   if (! vty)
     return plist->count;
 
-  vty_out (vty, "ip%s prefix-list %s: %d entries%s",
-          afi == AFI_IP ? "" : "v6",
-          plist->name, plist->count, VTY_NEWLINE);
-
-  for (pentry = plist->head; pentry; pentry = pentry->next)
+  if(use_json)
     {
     {
-      struct prefix *p = &pentry->prefix;
-      char buf[BUFSIZ];
+      json = json_object_new_object();
+      json_prefix = json_object_new_object();
+      json_list = json_object_new_object();
 
 
-      vty_out (vty, "   seq %d %s %s/%d", pentry->seq,
-              prefix_list_type_str (pentry),
-              inet_ntop (p->family, &p->u.prefix, buf, BUFSIZ),
-              p->prefixlen);
+      json_object_int_add(json_prefix, "prefixListCounter", plist->count);
+      json_object_string_add(json_prefix, "prefixListName", plist->name);
 
 
-      if (pentry->ge)
-       vty_out (vty, " ge %d", pentry->ge);
-      if (pentry->le)
-       vty_out (vty, " le %d", pentry->le);
+      for (pentry = plist->head; pentry; pentry = pentry->next)
+        {
+          struct prefix *p = &pentry->prefix;
+          char buf_a[BUFSIZ];
+          char buf_b[BUFSIZ];
+
+          sprintf(buf_a, "%s/%d", inet_ntop (p->family, &p->u.prefix, buf_b, BUFSIZ),
+                            p->prefixlen);
+
+          json_object_int_add(json_list, "seq", pentry->seq);
+          json_object_string_add(json_list, "seqPrefixListType", prefix_list_type_str (pentry));
+
+          if (pentry->ge)
+            json_object_int_add(json_list, "ge", pentry->ge);
+          if (pentry->le)
+            json_object_int_add(json_list, "le", pentry->le);
+
+          json_object_object_add(json_prefix, buf_a, json_list);
+        }
+      if (afi == AFI_IP)
+        json_object_object_add(json, "ipPrefixList", json_prefix);
+      else
+        json_object_object_add(json, "ipv6PrefixList", json_prefix);
 
 
-      vty_out (vty, "%s", VTY_NEWLINE);
+      vty_out (vty, "%s%s", json_object_to_json_string(json), VTY_NEWLINE);
+      json_object_free(json);
+    }
+  else
+    {
+      vty_out (vty, "ip%s prefix-list %s: %d entries%s",
+               afi == AFI_IP ? "" : "v6",
+               plist->name, plist->count, VTY_NEWLINE);
+
+      for (pentry = plist->head; pentry; pentry = pentry->next)
+        {
+          struct prefix *p = &pentry->prefix;
+          char buf[BUFSIZ];
+
+          vty_out (vty, "   seq %d %s %s/%d", pentry->seq,
+                   prefix_list_type_str (pentry),
+                   inet_ntop (p->family, &p->u.prefix, buf, BUFSIZ),
+                   p->prefixlen);
+
+          if (pentry->ge)
+            vty_out (vty, " ge %d", pentry->ge);
+          if (pentry->le)
+            vty_out (vty, " le %d", pentry->le);
+
+          vty_out (vty, "%s", VTY_NEWLINE);
+        }
     }
   return plist->count;
 }
     }
   return plist->count;
 }
index fb3168a6ee6dba317bf6b19a801dc959d599dbae..4359a8935c216476cf1132b4fc16416d942d180a 100644 (file)
@@ -78,6 +78,6 @@ extern struct stream * prefix_bgp_orf_entry (struct stream *,
                                              u_char, u_char, u_char);
 extern int prefix_bgp_orf_set (char *, afi_t, struct orf_prefix *, int, int);
 extern void prefix_bgp_orf_remove_all (char *);
                                              u_char, u_char, u_char);
 extern int prefix_bgp_orf_set (char *, afi_t, struct orf_prefix *, int, int);
 extern void prefix_bgp_orf_remove_all (char *);
-extern int prefix_bgp_show_prefix_list (struct vty *, afi_t, char *);
+extern int prefix_bgp_show_prefix_list (struct vty *, afi_t, char *, u_char);
 
 #endif /* _QUAGGA_PLIST_H */
 
 #endif /* _QUAGGA_PLIST_H */