diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index aba8260e2b..4c98ffcf09 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -11588,7 +11588,16 @@ static int bgp_show_table(struct vty *vty, struct bgp *bgp, safi_t safi, else vty_out(vty, ",\"%pFX\": ", dest_p); } - vty_json(vty, json_paths); + /* + * We are using no_pretty here because under + * extremely high settings( say lots and lots of + * routes with lots and lots of ways to reach + * that route via different paths ) this can + * save several minutes of output when FRR + * is run on older cpu's or more underperforming + * routers out there + */ + vty_json_no_pretty(vty, json_paths); json_paths = NULL; first = 0; } else diff --git a/lib/vty.c b/lib/vty.c index 76d907408c..2a0bb9446a 100644 --- a/lib/vty.c +++ b/lib/vty.c @@ -284,7 +284,8 @@ done: return len; } -int vty_json(struct vty *vty, struct json_object *json) +static int vty_json_helper(struct vty *vty, struct json_object *json, + uint32_t options) { const char *text; @@ -299,6 +300,18 @@ int vty_json(struct vty *vty, struct json_object *json) return CMD_SUCCESS; } +int vty_json(struct vty *vty, struct json_object *json) +{ + return vty_json_helper(vty, json, + JSON_C_TO_STRING_PRETTY | + JSON_C_TO_STRING_NOSLASHESCAPE); +} + +int vty_json_no_pretty(struct vty *vty, struct json_object *json) +{ + return vty_json_helper(vty, json, JSON_C_TO_STRING_NOSLASHESCAPE); +} + /* Output current time to the vty. */ void vty_time_print(struct vty *vty, int cr) { diff --git a/lib/vty.h b/lib/vty.h index 0b3fd2443f..45349d91af 100644 --- a/lib/vty.h +++ b/lib/vty.h @@ -353,8 +353,12 @@ extern void vty_endframe(struct vty *, const char *); extern bool vty_set_include(struct vty *vty, const char *regexp); /* returns CMD_SUCCESS so you can do a one-line "return vty_json(...)" * NULL check and json_object_free() is included. + * + * _no_pretty means do not add a bunch of newlines and dump the output + * as densely as possible. */ extern int vty_json(struct vty *vty, struct json_object *json); +extern int vty_json_no_pretty(struct vty *vty, struct json_object *json); /* post fd to be passed to the vtysh client * fd is owned by the VTY code after this and will be closed when done