mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-08 12:49:18 +00:00
json support for "show ip route" for "show ipv6 route"
Signed-off-by: Daniel Walton <dwalton@cumulusnetworks.com> Reviewed-by: Donald Sharp <sharpd@cumulusnetworks.com> Ticket: CM-12633
This commit is contained in:
parent
ea8b7c71a7
commit
18a4ded2a7
@ -35,13 +35,18 @@
|
|||||||
#include "zebra/zebra_rnh.h"
|
#include "zebra/zebra_rnh.h"
|
||||||
#include "zebra/redistribute.h"
|
#include "zebra/redistribute.h"
|
||||||
#include "zebra/zebra_routemap.h"
|
#include "zebra/zebra_routemap.h"
|
||||||
|
#include "lib/json.h"
|
||||||
|
|
||||||
extern int allow_delete;
|
extern int allow_delete;
|
||||||
|
|
||||||
static int do_show_ip_route(struct vty *vty, const char *vrf_name, safi_t safi);
|
static int do_show_ip_route(struct vty *vty, const char *vrf_name,
|
||||||
|
safi_t safi, u_char use_json);
|
||||||
static void vty_show_ip_route_detail (struct vty *vty, struct route_node *rn,
|
static void vty_show_ip_route_detail (struct vty *vty, struct route_node *rn,
|
||||||
int mcast);
|
int mcast);
|
||||||
|
|
||||||
|
#define ONE_DAY_SECOND 60*60*24
|
||||||
|
#define ONE_WEEK_SECOND 60*60*24*7
|
||||||
|
|
||||||
/* General function for static route. */
|
/* General function for static route. */
|
||||||
static int
|
static int
|
||||||
zebra_static_ipv4 (struct vty *vty, safi_t safi, int add_cmd,
|
zebra_static_ipv4 (struct vty *vty, safi_t safi, int add_cmd,
|
||||||
@ -278,7 +283,7 @@ DEFUN (show_ip_rpf,
|
|||||||
IP_STR
|
IP_STR
|
||||||
"Display RPF information for multicast source\n")
|
"Display RPF information for multicast source\n")
|
||||||
{
|
{
|
||||||
return do_show_ip_route(vty, VRF_DEFAULT_NAME, SAFI_MULTICAST);
|
return do_show_ip_route(vty, VRF_DEFAULT_NAME, SAFI_MULTICAST, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFUN (show_ip_rpf_addr,
|
DEFUN (show_ip_rpf_addr,
|
||||||
@ -1946,8 +1951,6 @@ vty_show_ip_route_detail (struct vty *vty, struct route_node *rn, int mcast)
|
|||||||
vty_out (vty, ", reject");
|
vty_out (vty, ", reject");
|
||||||
vty_out (vty, "%s", VTY_NEWLINE);
|
vty_out (vty, "%s", VTY_NEWLINE);
|
||||||
|
|
||||||
#define ONE_DAY_SECOND 60*60*24
|
|
||||||
#define ONE_WEEK_SECOND 60*60*24*7
|
|
||||||
if (rib->type == ZEBRA_ROUTE_RIP
|
if (rib->type == ZEBRA_ROUTE_RIP
|
||||||
|| rib->type == ZEBRA_ROUTE_OSPF
|
|| rib->type == ZEBRA_ROUTE_OSPF
|
||||||
|| rib->type == ZEBRA_ROUTE_ISIS
|
|| rib->type == ZEBRA_ROUTE_ISIS
|
||||||
@ -2050,12 +2053,151 @@ vty_show_ip_route_detail (struct vty *vty, struct route_node *rn, int mcast)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
vty_show_ip_route (struct vty *vty, struct route_node *rn, struct rib *rib)
|
vty_show_ip_route (struct vty *vty, struct route_node *rn, struct rib *rib,
|
||||||
|
json_object *json)
|
||||||
{
|
{
|
||||||
struct nexthop *nexthop, *tnexthop;
|
struct nexthop *nexthop, *tnexthop;
|
||||||
int recursing;
|
int recursing;
|
||||||
int len = 0;
|
int len = 0;
|
||||||
char buf[BUFSIZ];
|
char buf[BUFSIZ];
|
||||||
|
json_object *json_nexthops = NULL;
|
||||||
|
json_object *json_nexthop = NULL;
|
||||||
|
json_object *json_route = NULL;
|
||||||
|
|
||||||
|
if (json)
|
||||||
|
{
|
||||||
|
json_route = json_object_new_object();
|
||||||
|
json_nexthops = json_object_new_array();
|
||||||
|
|
||||||
|
json_object_string_add(json_route, "prefix", prefix2str (&rn->p, buf, sizeof buf));
|
||||||
|
json_object_string_add(json_route, "protocol", zebra_route_string(rib->type));
|
||||||
|
|
||||||
|
if (rib->instance)
|
||||||
|
json_object_int_add(json_route, "instance", rib->instance);
|
||||||
|
|
||||||
|
if (rib->vrf_id)
|
||||||
|
json_object_int_add(json_route, "vrfId", rib->vrf_id);
|
||||||
|
|
||||||
|
if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_SELECTED))
|
||||||
|
json_object_boolean_true_add(json_route, "selected");
|
||||||
|
|
||||||
|
if (rib->type != ZEBRA_ROUTE_CONNECT && rib->type != ZEBRA_ROUTE_KERNEL)
|
||||||
|
{
|
||||||
|
json_object_int_add(json_route, "distance", rib->distance);
|
||||||
|
json_object_int_add(json_route, "metric", rib->metric);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_BLACKHOLE))
|
||||||
|
json_object_boolean_true_add(json_route, "blackhole");
|
||||||
|
|
||||||
|
if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_REJECT))
|
||||||
|
json_object_boolean_true_add(json_route, "reject");
|
||||||
|
|
||||||
|
if (rib->type == ZEBRA_ROUTE_RIP
|
||||||
|
|| rib->type == ZEBRA_ROUTE_OSPF
|
||||||
|
|| rib->type == ZEBRA_ROUTE_ISIS
|
||||||
|
|| rib->type == ZEBRA_ROUTE_TABLE
|
||||||
|
|| rib->type == ZEBRA_ROUTE_BGP)
|
||||||
|
{
|
||||||
|
time_t uptime;
|
||||||
|
struct tm *tm;
|
||||||
|
|
||||||
|
uptime = time (NULL);
|
||||||
|
uptime -= rib->uptime;
|
||||||
|
tm = gmtime (&uptime);
|
||||||
|
|
||||||
|
if (uptime < ONE_DAY_SECOND)
|
||||||
|
sprintf(buf, "%02d:%02d:%02d", tm->tm_hour, tm->tm_min, tm->tm_sec);
|
||||||
|
else if (uptime < ONE_WEEK_SECOND)
|
||||||
|
sprintf(buf, "%dd%02dh%02dm", tm->tm_yday, tm->tm_hour, tm->tm_min);
|
||||||
|
else
|
||||||
|
sprintf(buf, "%02dw%dd%02dh", tm->tm_yday/7, tm->tm_yday - ((tm->tm_yday/7) * 7), tm->tm_hour);
|
||||||
|
|
||||||
|
json_object_string_add(json_route, "uptime", buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (ALL_NEXTHOPS_RO(rib->nexthop, nexthop, tnexthop, recursing))
|
||||||
|
{
|
||||||
|
json_nexthop = json_object_new_object();
|
||||||
|
|
||||||
|
if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB))
|
||||||
|
json_object_boolean_true_add(json_nexthop, "fib");
|
||||||
|
|
||||||
|
switch (nexthop->type)
|
||||||
|
{
|
||||||
|
case NEXTHOP_TYPE_IPV4:
|
||||||
|
case NEXTHOP_TYPE_IPV4_IFINDEX:
|
||||||
|
json_object_string_add(json_nexthop, "ip", inet_ntoa (nexthop->gate.ipv4));
|
||||||
|
json_object_string_add(json_nexthop, "afi", "ipv4");
|
||||||
|
|
||||||
|
if (nexthop->ifindex)
|
||||||
|
{
|
||||||
|
json_object_int_add(json_nexthop, "interfaceIndex", nexthop->ifindex);
|
||||||
|
json_object_string_add(json_nexthop, "interfaceName", ifindex2ifname_vrf (nexthop->ifindex, rib->vrf_id));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case NEXTHOP_TYPE_IPV6:
|
||||||
|
case NEXTHOP_TYPE_IPV6_IFINDEX:
|
||||||
|
json_object_string_add(json_nexthop, "ip", inet_ntop (AF_INET6, &nexthop->gate.ipv6, buf, BUFSIZ));
|
||||||
|
json_object_string_add(json_nexthop, "afi", "ipv6");
|
||||||
|
|
||||||
|
if (nexthop->ifindex)
|
||||||
|
{
|
||||||
|
json_object_int_add(json_nexthop, "interfaceIndex", nexthop->ifindex);
|
||||||
|
json_object_string_add(json_nexthop, "interfaceName", ifindex2ifname_vrf (nexthop->ifindex, rib->vrf_id));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NEXTHOP_TYPE_IFINDEX:
|
||||||
|
json_object_boolean_true_add(json_nexthop, "directlyConnected");
|
||||||
|
json_object_int_add(json_nexthop, "interfaceIndex", nexthop->ifindex);
|
||||||
|
json_object_string_add(json_nexthop, "interfaceName", ifindex2ifname_vrf (nexthop->ifindex, rib->vrf_id));
|
||||||
|
break;
|
||||||
|
case NEXTHOP_TYPE_BLACKHOLE:
|
||||||
|
json_object_boolean_true_add(json_nexthop, "blackhole");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE))
|
||||||
|
json_object_boolean_true_add(json_nexthop, "active");
|
||||||
|
|
||||||
|
if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ONLINK))
|
||||||
|
json_object_boolean_true_add(json_nexthop, "onLink");
|
||||||
|
|
||||||
|
if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_RECURSIVE))
|
||||||
|
json_object_boolean_true_add(json_nexthop, "recursive");
|
||||||
|
|
||||||
|
switch (nexthop->type)
|
||||||
|
{
|
||||||
|
case NEXTHOP_TYPE_IPV4:
|
||||||
|
case NEXTHOP_TYPE_IPV4_IFINDEX:
|
||||||
|
if (nexthop->src.ipv4.s_addr)
|
||||||
|
{
|
||||||
|
if (inet_ntop(AF_INET, &nexthop->src.ipv4, buf, sizeof buf))
|
||||||
|
json_object_string_add(json_nexthop, "source", buf);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case NEXTHOP_TYPE_IPV6:
|
||||||
|
case NEXTHOP_TYPE_IPV6_IFINDEX:
|
||||||
|
if (!IPV6_ADDR_SAME(&nexthop->src.ipv6, &in6addr_any))
|
||||||
|
{
|
||||||
|
if (inet_ntop(AF_INET6, &nexthop->src.ipv6, buf, sizeof buf))
|
||||||
|
json_object_string_add(json_nexthop, "source", buf);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
json_object_array_add(json_nexthops, json_nexthop);
|
||||||
|
}
|
||||||
|
|
||||||
|
json_object_object_add(json_route, "nexthops", json_nexthops);
|
||||||
|
json_object_array_add(json, json_route);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* Nexthop information. */
|
/* Nexthop information. */
|
||||||
for (ALL_NEXTHOPS_RO(rib->nexthop, nexthop, tnexthop, recursing))
|
for (ALL_NEXTHOPS_RO(rib->nexthop, nexthop, tnexthop, recursing))
|
||||||
@ -2162,9 +2304,6 @@ vty_show_ip_route (struct vty *vty, struct route_node *rn, struct rib *rib)
|
|||||||
uptime -= rib->uptime;
|
uptime -= rib->uptime;
|
||||||
tm = gmtime (&uptime);
|
tm = gmtime (&uptime);
|
||||||
|
|
||||||
#define ONE_DAY_SECOND 60*60*24
|
|
||||||
#define ONE_WEEK_SECOND 60*60*24*7
|
|
||||||
|
|
||||||
if (uptime < ONE_DAY_SECOND)
|
if (uptime < ONE_DAY_SECOND)
|
||||||
vty_out (vty, ", %02d:%02d:%02d",
|
vty_out (vty, ", %02d:%02d:%02d",
|
||||||
tm->tm_hour, tm->tm_min, tm->tm_sec);
|
tm->tm_hour, tm->tm_min, tm->tm_sec);
|
||||||
@ -2182,41 +2321,83 @@ vty_show_ip_route (struct vty *vty, struct route_node *rn, struct rib *rib)
|
|||||||
|
|
||||||
DEFUN (show_ip_route,
|
DEFUN (show_ip_route,
|
||||||
show_ip_route_cmd,
|
show_ip_route_cmd,
|
||||||
"show ip route",
|
"show ip route {json}",
|
||||||
SHOW_STR
|
SHOW_STR
|
||||||
IP_STR
|
IP_STR
|
||||||
"IP routing table\n")
|
"IP routing table\n")
|
||||||
{
|
{
|
||||||
return do_show_ip_route (vty, VRF_DEFAULT_NAME, SAFI_UNICAST);
|
return do_show_ip_route (vty, VRF_DEFAULT_NAME, SAFI_UNICAST, use_json(argc, argv));
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
do_show_ip_route(struct vty *vty, const char *vrf_name, safi_t safi)
|
do_show_ip_route (struct vty *vty, const char *vrf_name, safi_t safi,
|
||||||
|
u_char use_json)
|
||||||
{
|
{
|
||||||
struct route_table *table;
|
struct route_table *table;
|
||||||
struct route_node *rn;
|
struct route_node *rn;
|
||||||
struct rib *rib;
|
struct rib *rib;
|
||||||
int first = 1;
|
int first = 1;
|
||||||
struct zebra_vrf *zvrf = NULL;
|
struct zebra_vrf *zvrf = NULL;
|
||||||
|
char buf[BUFSIZ];
|
||||||
|
json_object *json = NULL;
|
||||||
|
json_object *json_prefix = NULL;
|
||||||
|
|
||||||
if (!(zvrf = zebra_vrf_list_lookup_by_name (vrf_name)))
|
if (!(zvrf = zebra_vrf_list_lookup_by_name (vrf_name)))
|
||||||
{
|
{
|
||||||
|
if (use_json)
|
||||||
|
vty_out (vty, "{}%s", VTY_NEWLINE);
|
||||||
|
else
|
||||||
vty_out (vty, "vrf %s not defined%s", vrf_name, VTY_NEWLINE);
|
vty_out (vty, "vrf %s not defined%s", vrf_name, VTY_NEWLINE);
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (zvrf->vrf_id == VRF_UNKNOWN)
|
if (zvrf->vrf_id == VRF_UNKNOWN)
|
||||||
{
|
{
|
||||||
|
if (use_json)
|
||||||
|
vty_out (vty, "{}%s", VTY_NEWLINE);
|
||||||
|
else
|
||||||
vty_out (vty, "vrf %s inactive%s", vrf_name, VTY_NEWLINE);
|
vty_out (vty, "vrf %s inactive%s", vrf_name, VTY_NEWLINE);
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
table = zebra_vrf_table (AFI_IP, safi, zvrf->vrf_id);
|
table = zebra_vrf_table (AFI_IP, safi, zvrf->vrf_id);
|
||||||
if (! table)
|
if (! table)
|
||||||
|
{
|
||||||
|
if (use_json)
|
||||||
|
vty_out (vty, "{}%s", VTY_NEWLINE);
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (use_json)
|
||||||
|
{
|
||||||
|
json = json_object_new_object();
|
||||||
|
|
||||||
/* Show all IPv4 routes. */
|
/* Show all IPv4 routes. */
|
||||||
for (rn = route_top (table); rn; rn = route_next (rn))
|
for (rn = route_top (table); rn; rn = route_next (rn))
|
||||||
|
{
|
||||||
|
RNODE_FOREACH_RIB (rn, rib)
|
||||||
|
{
|
||||||
|
if (!json_prefix)
|
||||||
|
json_prefix = json_object_new_array();
|
||||||
|
vty_show_ip_route (vty, rn, rib, json_prefix);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (json_prefix)
|
||||||
|
{
|
||||||
|
prefix2str (&rn->p, buf, sizeof buf);
|
||||||
|
json_object_object_add(json, buf, json_prefix);
|
||||||
|
json_prefix = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
vty_out (vty, "%s%s", json_object_to_json_string(json), VTY_NEWLINE);
|
||||||
|
json_object_free(json);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Show all IPv4 routes. */
|
||||||
|
for (rn = route_top (table); rn; rn = route_next (rn))
|
||||||
|
{
|
||||||
RNODE_FOREACH_RIB (rn, rib)
|
RNODE_FOREACH_RIB (rn, rib)
|
||||||
{
|
{
|
||||||
if (first)
|
if (first)
|
||||||
@ -2224,20 +2405,28 @@ do_show_ip_route(struct vty *vty, const char *vrf_name, safi_t safi)
|
|||||||
vty_out (vty, SHOW_ROUTE_V4_HEADER);
|
vty_out (vty, SHOW_ROUTE_V4_HEADER);
|
||||||
first = 0;
|
first = 0;
|
||||||
}
|
}
|
||||||
vty_show_ip_route (vty, rn, rib);
|
vty_show_ip_route (vty, rn, rib, NULL);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFUN (show_ip_route_vrf,
|
DEFUN (show_ip_route_vrf,
|
||||||
show_ip_route_vrf_cmd,
|
show_ip_route_vrf_cmd,
|
||||||
"show ip route " VRF_CMD_STR,
|
"show ip route " VRF_CMD_STR " {json}",
|
||||||
SHOW_STR
|
SHOW_STR
|
||||||
IP_STR
|
IP_STR
|
||||||
"IP routing table\n"
|
"IP routing table\n"
|
||||||
VRF_CMD_HELP_STR)
|
VRF_CMD_HELP_STR)
|
||||||
{
|
{
|
||||||
return do_show_ip_route (vty, argv[0], SAFI_UNICAST);
|
u_char uj = use_json(argc, argv);
|
||||||
|
|
||||||
|
if (argc == 1 && uj)
|
||||||
|
return do_show_ip_route (vty, NULL, SAFI_UNICAST, uj);
|
||||||
|
else
|
||||||
|
return do_show_ip_route (vty, argv[0], SAFI_UNICAST, uj);
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFUN (show_ip_nht,
|
DEFUN (show_ip_nht,
|
||||||
@ -2432,7 +2621,7 @@ DEFUN (show_ip_route_tag,
|
|||||||
vty_out (vty, SHOW_ROUTE_V4_HEADER);
|
vty_out (vty, SHOW_ROUTE_V4_HEADER);
|
||||||
first = 0;
|
first = 0;
|
||||||
}
|
}
|
||||||
vty_show_ip_route (vty, rn, rib);
|
vty_show_ip_route (vty, rn, rib, NULL);
|
||||||
}
|
}
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
@ -2492,7 +2681,7 @@ DEFUN (show_ip_route_prefix_longer,
|
|||||||
vty_out (vty, SHOW_ROUTE_V4_HEADER);
|
vty_out (vty, SHOW_ROUTE_V4_HEADER);
|
||||||
first = 0;
|
first = 0;
|
||||||
}
|
}
|
||||||
vty_show_ip_route (vty, rn, rib);
|
vty_show_ip_route (vty, rn, rib, NULL);
|
||||||
}
|
}
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
@ -2544,7 +2733,7 @@ DEFUN (show_ip_route_supernets,
|
|||||||
vty_out (vty, SHOW_ROUTE_V4_HEADER);
|
vty_out (vty, SHOW_ROUTE_V4_HEADER);
|
||||||
first = 0;
|
first = 0;
|
||||||
}
|
}
|
||||||
vty_show_ip_route (vty, rn, rib);
|
vty_show_ip_route (vty, rn, rib, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
@ -2602,7 +2791,7 @@ DEFUN (show_ip_route_protocol,
|
|||||||
vty_out (vty, SHOW_ROUTE_V4_HEADER);
|
vty_out (vty, SHOW_ROUTE_V4_HEADER);
|
||||||
first = 0;
|
first = 0;
|
||||||
}
|
}
|
||||||
vty_show_ip_route (vty, rn, rib);
|
vty_show_ip_route (vty, rn, rib, NULL);
|
||||||
}
|
}
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
@ -2647,7 +2836,7 @@ DEFUN (show_ip_route_ospf_instance,
|
|||||||
vty_out (vty, SHOW_ROUTE_V4_HEADER);
|
vty_out (vty, SHOW_ROUTE_V4_HEADER);
|
||||||
first = 0;
|
first = 0;
|
||||||
}
|
}
|
||||||
vty_show_ip_route (vty, rn, rib);
|
vty_show_ip_route (vty, rn, rib, NULL);
|
||||||
}
|
}
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
@ -3016,7 +3205,7 @@ DEFUN (show_ip_route_vrf_all,
|
|||||||
vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf->name, VTY_NEWLINE);
|
vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf->name, VTY_NEWLINE);
|
||||||
vrf_header = 0;
|
vrf_header = 0;
|
||||||
}
|
}
|
||||||
vty_show_ip_route (vty, rn, rib);
|
vty_show_ip_route (vty, rn, rib, NULL);
|
||||||
}
|
}
|
||||||
vrf_header = 1;
|
vrf_header = 1;
|
||||||
}
|
}
|
||||||
@ -3070,7 +3259,7 @@ DEFUN (show_ip_route_vrf_all_tag,
|
|||||||
vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf->name, VTY_NEWLINE);
|
vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf->name, VTY_NEWLINE);
|
||||||
vrf_header = 0;
|
vrf_header = 0;
|
||||||
}
|
}
|
||||||
vty_show_ip_route (vty, rn, rib);
|
vty_show_ip_route (vty, rn, rib, NULL);
|
||||||
}
|
}
|
||||||
vrf_header = 1;
|
vrf_header = 1;
|
||||||
}
|
}
|
||||||
@ -3126,7 +3315,7 @@ DEFUN (show_ip_route_vrf_all_prefix_longer,
|
|||||||
vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf->name, VTY_NEWLINE);
|
vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf->name, VTY_NEWLINE);
|
||||||
vrf_header = 0;
|
vrf_header = 0;
|
||||||
}
|
}
|
||||||
vty_show_ip_route (vty, rn, rib);
|
vty_show_ip_route (vty, rn, rib, NULL);
|
||||||
}
|
}
|
||||||
vrf_header = 1;
|
vrf_header = 1;
|
||||||
}
|
}
|
||||||
@ -3179,7 +3368,7 @@ DEFUN (show_ip_route_vrf_all_supernets,
|
|||||||
vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf->name, VTY_NEWLINE);
|
vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf->name, VTY_NEWLINE);
|
||||||
vrf_header = 0;
|
vrf_header = 0;
|
||||||
}
|
}
|
||||||
vty_show_ip_route (vty, rn, rib);
|
vty_show_ip_route (vty, rn, rib, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
vrf_header = 1;
|
vrf_header = 1;
|
||||||
@ -3235,7 +3424,7 @@ DEFUN (show_ip_route_vrf_all_protocol,
|
|||||||
vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf->name, VTY_NEWLINE);
|
vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf->name, VTY_NEWLINE);
|
||||||
vrf_header = 0;
|
vrf_header = 0;
|
||||||
}
|
}
|
||||||
vty_show_ip_route (vty, rn, rib);
|
vty_show_ip_route (vty, rn, rib, NULL);
|
||||||
}
|
}
|
||||||
vrf_header = 1;
|
vrf_header = 1;
|
||||||
}
|
}
|
||||||
@ -4546,7 +4735,7 @@ DEFUN (no_ipv6_route_ifname_flags_pref_tag_vrf,
|
|||||||
|
|
||||||
DEFUN (show_ipv6_route,
|
DEFUN (show_ipv6_route,
|
||||||
show_ipv6_route_cmd,
|
show_ipv6_route_cmd,
|
||||||
"show ipv6 route",
|
"show ipv6 route {json}",
|
||||||
SHOW_STR
|
SHOW_STR
|
||||||
IP_STR
|
IP_STR
|
||||||
"IPv6 routing table\n")
|
"IPv6 routing table\n")
|
||||||
@ -4557,17 +4746,27 @@ DEFUN (show_ipv6_route,
|
|||||||
int first = 1;
|
int first = 1;
|
||||||
vrf_id_t vrf_id = VRF_DEFAULT;
|
vrf_id_t vrf_id = VRF_DEFAULT;
|
||||||
struct zebra_vrf *zvrf = NULL;
|
struct zebra_vrf *zvrf = NULL;
|
||||||
|
char buf[BUFSIZ];
|
||||||
|
json_object *json = NULL;
|
||||||
|
json_object *json_prefix = NULL;
|
||||||
|
u_char uj = use_json(argc, argv);
|
||||||
|
|
||||||
if (argc > 0)
|
if (argc > 0 && argv[0] && strcmp(argv[0], "json") != 0)
|
||||||
{
|
{
|
||||||
if (!(zvrf = zebra_vrf_list_lookup_by_name (argv[0])))
|
if (!(zvrf = zebra_vrf_list_lookup_by_name (argv[0])))
|
||||||
{
|
{
|
||||||
|
if (uj)
|
||||||
|
vty_out (vty, "{}%s", VTY_NEWLINE);
|
||||||
|
else
|
||||||
vty_out (vty, "vrf %s not defined%s", argv[0], VTY_NEWLINE);
|
vty_out (vty, "vrf %s not defined%s", argv[0], VTY_NEWLINE);
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (zvrf->vrf_id == VRF_UNKNOWN)
|
if (zvrf->vrf_id == VRF_UNKNOWN)
|
||||||
{
|
{
|
||||||
|
if (uj)
|
||||||
|
vty_out (vty, "{}%s", VTY_NEWLINE);
|
||||||
|
else
|
||||||
vty_out (vty, "vrf %s inactive%s", argv[0], VTY_NEWLINE);
|
vty_out (vty, "vrf %s inactive%s", argv[0], VTY_NEWLINE);
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
@ -4577,10 +4776,42 @@ DEFUN (show_ipv6_route,
|
|||||||
|
|
||||||
table = zebra_vrf_table (AFI_IP6, SAFI_UNICAST, vrf_id);
|
table = zebra_vrf_table (AFI_IP6, SAFI_UNICAST, vrf_id);
|
||||||
if (! table)
|
if (! table)
|
||||||
|
{
|
||||||
|
if (uj)
|
||||||
|
vty_out (vty, "{}%s", VTY_NEWLINE);
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (uj)
|
||||||
|
{
|
||||||
|
json = json_object_new_object();
|
||||||
|
|
||||||
/* Show all IPv6 route. */
|
/* Show all IPv6 route. */
|
||||||
for (rn = route_top (table); rn; rn = route_next (rn))
|
for (rn = route_top (table); rn; rn = route_next (rn))
|
||||||
|
{
|
||||||
|
RNODE_FOREACH_RIB (rn, rib)
|
||||||
|
{
|
||||||
|
if (!json_prefix)
|
||||||
|
json_prefix = json_object_new_array();
|
||||||
|
vty_show_ip_route (vty, rn, rib, json_prefix);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (json_prefix)
|
||||||
|
{
|
||||||
|
prefix2str (&rn->p, buf, sizeof buf);
|
||||||
|
json_object_object_add(json, buf, json_prefix);
|
||||||
|
json_prefix = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
vty_out (vty, "%s%s", json_object_to_json_string(json), VTY_NEWLINE);
|
||||||
|
json_object_free(json);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Show all IPv6 route. */
|
||||||
|
for (rn = route_top (table); rn; rn = route_next (rn))
|
||||||
|
{
|
||||||
RNODE_FOREACH_RIB (rn, rib)
|
RNODE_FOREACH_RIB (rn, rib)
|
||||||
{
|
{
|
||||||
if (first)
|
if (first)
|
||||||
@ -4588,14 +4819,17 @@ DEFUN (show_ipv6_route,
|
|||||||
vty_out (vty, SHOW_ROUTE_V6_HEADER);
|
vty_out (vty, SHOW_ROUTE_V6_HEADER);
|
||||||
first = 0;
|
first = 0;
|
||||||
}
|
}
|
||||||
vty_show_ip_route (vty, rn, rib);
|
vty_show_ip_route (vty, rn, rib, NULL);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
ALIAS (show_ipv6_route,
|
ALIAS (show_ipv6_route,
|
||||||
show_ipv6_route_vrf_cmd,
|
show_ipv6_route_vrf_cmd,
|
||||||
"show ipv6 route " VRF_CMD_STR,
|
"show ipv6 route " VRF_CMD_STR " {json}",
|
||||||
SHOW_STR
|
SHOW_STR
|
||||||
IP_STR
|
IP_STR
|
||||||
"IPv6 routing table\n"
|
"IPv6 routing table\n"
|
||||||
@ -4641,7 +4875,7 @@ DEFUN (show_ipv6_route_tag,
|
|||||||
vty_out (vty, SHOW_ROUTE_V6_HEADER);
|
vty_out (vty, SHOW_ROUTE_V6_HEADER);
|
||||||
first = 0;
|
first = 0;
|
||||||
}
|
}
|
||||||
vty_show_ip_route (vty, rn, rib);
|
vty_show_ip_route (vty, rn, rib, NULL);
|
||||||
}
|
}
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
@ -4701,7 +4935,7 @@ DEFUN (show_ipv6_route_prefix_longer,
|
|||||||
vty_out (vty, SHOW_ROUTE_V6_HEADER);
|
vty_out (vty, SHOW_ROUTE_V6_HEADER);
|
||||||
first = 0;
|
first = 0;
|
||||||
}
|
}
|
||||||
vty_show_ip_route (vty, rn, rib);
|
vty_show_ip_route (vty, rn, rib, NULL);
|
||||||
}
|
}
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
@ -4759,7 +4993,7 @@ DEFUN (show_ipv6_route_protocol,
|
|||||||
vty_out (vty, SHOW_ROUTE_V6_HEADER);
|
vty_out (vty, SHOW_ROUTE_V6_HEADER);
|
||||||
first = 0;
|
first = 0;
|
||||||
}
|
}
|
||||||
vty_show_ip_route (vty, rn, rib);
|
vty_show_ip_route (vty, rn, rib, NULL);
|
||||||
}
|
}
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
@ -4985,7 +5219,7 @@ DEFUN (show_ipv6_mroute,
|
|||||||
vty_out (vty, SHOW_ROUTE_V6_HEADER);
|
vty_out (vty, SHOW_ROUTE_V6_HEADER);
|
||||||
first = 0;
|
first = 0;
|
||||||
}
|
}
|
||||||
vty_show_ip_route (vty, rn, rib);
|
vty_show_ip_route (vty, rn, rib, NULL);
|
||||||
}
|
}
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
@ -5035,7 +5269,7 @@ DEFUN (show_ipv6_route_vrf_all,
|
|||||||
vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf->name, VTY_NEWLINE);
|
vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf->name, VTY_NEWLINE);
|
||||||
vrf_header = 0;
|
vrf_header = 0;
|
||||||
}
|
}
|
||||||
vty_show_ip_route (vty, rn, rib);
|
vty_show_ip_route (vty, rn, rib, NULL);
|
||||||
}
|
}
|
||||||
vrf_header = 1;
|
vrf_header = 1;
|
||||||
}
|
}
|
||||||
@ -5089,7 +5323,7 @@ DEFUN (show_ipv6_route_vrf_all_tag,
|
|||||||
vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf->name, VTY_NEWLINE);
|
vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf->name, VTY_NEWLINE);
|
||||||
vrf_header = 0;
|
vrf_header = 0;
|
||||||
}
|
}
|
||||||
vty_show_ip_route (vty, rn, rib);
|
vty_show_ip_route (vty, rn, rib, NULL);
|
||||||
}
|
}
|
||||||
vrf_header = 1;
|
vrf_header = 1;
|
||||||
}
|
}
|
||||||
@ -5146,7 +5380,7 @@ DEFUN (show_ipv6_route_vrf_all_prefix_longer,
|
|||||||
vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf->name, VTY_NEWLINE);
|
vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf->name, VTY_NEWLINE);
|
||||||
vrf_header = 0;
|
vrf_header = 0;
|
||||||
}
|
}
|
||||||
vty_show_ip_route (vty, rn, rib);
|
vty_show_ip_route (vty, rn, rib, NULL);
|
||||||
}
|
}
|
||||||
vrf_header = 1;
|
vrf_header = 1;
|
||||||
}
|
}
|
||||||
@ -5201,7 +5435,7 @@ DEFUN (show_ipv6_route_vrf_all_protocol,
|
|||||||
vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf->name, VTY_NEWLINE);
|
vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf->name, VTY_NEWLINE);
|
||||||
vrf_header = 0;
|
vrf_header = 0;
|
||||||
}
|
}
|
||||||
vty_show_ip_route (vty, rn, rib);
|
vty_show_ip_route (vty, rn, rib, NULL);
|
||||||
}
|
}
|
||||||
vrf_header = 1;
|
vrf_header = 1;
|
||||||
}
|
}
|
||||||
@ -5345,7 +5579,7 @@ DEFUN (show_ipv6_mroute_vrf_all,
|
|||||||
vty_out (vty, SHOW_ROUTE_V6_HEADER);
|
vty_out (vty, SHOW_ROUTE_V6_HEADER);
|
||||||
first = 0;
|
first = 0;
|
||||||
}
|
}
|
||||||
vty_show_ip_route (vty, rn, rib);
|
vty_show_ip_route (vty, rn, rib, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
|
Loading…
Reference in New Issue
Block a user