From 0095f482ca70ea74c7099405accfc742ef82bdb3 Mon Sep 17 00:00:00 2001 From: Abhishek N R Date: Mon, 7 Feb 2022 02:13:16 -0800 Subject: [PATCH] pim6d: Implementing "show ipv6 pim rp-info" CLI Adding new show CLI to display pim RP information. Also corrected ipv4 json object. Signed-off-by: Abhishek N R --- pimd/pim6_cmd.c | 92 +++++++++++++++++++++++++++++++++++++++++++++++++ pimd/pim_cmd.c | 73 ++++++++++++++++++++++++--------------- pimd/pim_rp.c | 13 +++---- pimd/pim_rp.h | 3 +- 4 files changed, 144 insertions(+), 37 deletions(-) diff --git a/pimd/pim6_cmd.c b/pimd/pim6_cmd.c index 7b3e04fdc0..251d62058b 100644 --- a/pimd/pim6_cmd.c +++ b/pimd/pim6_cmd.c @@ -622,6 +622,96 @@ DEFPY (interface_no_ipv6_mld_query_interval, "frr-routing:ipv6"); } +DEFPY (show_ipv6_pim_rp, + show_ipv6_pim_rp_cmd, + "show ipv6 pim [vrf NAME] rp-info [X:X::X:X/M$group] [json$json]", + SHOW_STR + IPV6_STR + PIM_STR + VRF_CMD_HELP_STR + "PIM RP information\n" + "Multicast Group range\n" + JSON_STR) +{ + struct pim_instance *pim; + struct vrf *v; + json_object *json_parent = NULL; + struct prefix *range = NULL; + + v = vrf_lookup_by_name(vrf ? vrf : VRF_DEFAULT_NAME); + + if (!v) + return CMD_WARNING; + + pim = pim_get_pim_instance(v->vrf_id); + + if (!pim) { + vty_out(vty, "%% Unable to find pim instance\n"); + return CMD_WARNING; + } + + if (group_str) { + range = prefix_new(); + prefix_copy(range, group); + apply_mask(range); + } + + if (json) + json_parent = json_object_new_object(); + + pim_rp_show_information(pim, range, vty, json_parent); + + if (json) + vty_json(vty, json_parent); + + prefix_free(&range); + + return CMD_SUCCESS; +} + +DEFPY (show_ipv6_pim_rp_vrf_all, + show_ipv6_pim_rp_vrf_all_cmd, + "show ipv6 pim vrf all rp-info [X:X::X:X/M$group] [json$json]", + SHOW_STR + IPV6_STR + PIM_STR + VRF_CMD_HELP_STR + "PIM RP information\n" + "Multicast Group range\n" + JSON_STR) +{ + struct vrf *vrf; + json_object *json_parent = NULL; + json_object *json_vrf = NULL; + struct prefix *range = NULL; + + if (group_str) { + range = prefix_new(); + prefix_copy(range, group); + apply_mask(range); + } + + if (json) + json_parent = json_object_new_object(); + + RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) { + if (!json) + vty_out(vty, "VRF: %s\n", vrf->name); + else + json_vrf = json_object_new_object(); + pim_rp_show_information(vrf->info, range, vty, json_vrf); + if (json) + json_object_object_add(json_parent, vrf->name, + json_vrf); + } + if (json) + vty_json(vty, json_parent); + + prefix_free(&range); + + return CMD_SUCCESS; +} + void pim_cmd_init(void) { if_cmd_init(pim_interface_config_write); @@ -674,4 +764,6 @@ void pim_cmd_init(void) install_element(INTERFACE_NODE, &interface_ipv6_mld_query_interval_cmd); install_element(INTERFACE_NODE, &interface_no_ipv6_mld_query_interval_cmd); + install_element(VIEW_NODE, &show_ipv6_pim_rp_cmd); + install_element(VIEW_NODE, &show_ipv6_pim_rp_vrf_all_cmd); } diff --git a/pimd/pim_cmd.c b/pimd/pim_cmd.c index 86d179fe39..c34135eaf6 100644 --- a/pimd/pim_cmd.c +++ b/pimd/pim_cmd.c @@ -5402,9 +5402,9 @@ DEFUN (show_ip_pim_upstream_rpf, return CMD_SUCCESS; } -DEFUN (show_ip_pim_rp, +DEFPY (show_ip_pim_rp, show_ip_pim_rp_cmd, - "show ip pim [vrf NAME] rp-info [A.B.C.D/M] [json]", + "show ip pim [vrf NAME] rp-info [A.B.C.D/M$group] [json$json]", SHOW_STR IP_STR PIM_STR @@ -5413,28 +5413,45 @@ DEFUN (show_ip_pim_rp, "Multicast Group range\n" JSON_STR) { - int idx = 2; - struct vrf *vrf = pim_cmd_lookup_vrf(vty, argv, argc, &idx); - bool uj = use_json(argc, argv); + struct pim_instance *pim; + struct vrf *v; + json_object *json_parent = NULL; struct prefix *range = NULL; - if (!vrf) + v = vrf_lookup_by_name(vrf ? vrf : VRF_DEFAULT_NAME); + + if (!v) + return CMD_WARNING; + + pim = pim_get_pim_instance(v->vrf_id); + + if (!pim) { + vty_out(vty, "%% Unable to find pim instance\n"); return CMD_WARNING; + } - if (argv_find(argv, argc, "A.B.C.D/M", &idx)) { + if (group_str) { range = prefix_new(); - (void)str2prefix(argv[idx]->arg, range); + prefix_copy(range, group); apply_mask(range); } - pim_rp_show_information(vrf->info, range, vty, uj); + if (json) + json_parent = json_object_new_object(); + + pim_rp_show_information(pim, range, vty, json_parent); + + if (json) + vty_json(vty, json_parent); + + prefix_free(&range); return CMD_SUCCESS; } -DEFUN (show_ip_pim_rp_vrf_all, +DEFPY (show_ip_pim_rp_vrf_all, show_ip_pim_rp_vrf_all_cmd, - "show ip pim vrf all rp-info [A.B.C.D/M] [json]", + "show ip pim vrf all rp-info [A.B.C.D/M$group] [json$json]", SHOW_STR IP_STR PIM_STR @@ -5443,32 +5460,34 @@ DEFUN (show_ip_pim_rp_vrf_all, "Multicast Group range\n" JSON_STR) { - int idx = 0; - bool uj = use_json(argc, argv); struct vrf *vrf; - bool first = true; + json_object *json_parent = NULL; + json_object *json_vrf = NULL; struct prefix *range = NULL; - if (argv_find(argv, argc, "A.B.C.D/M", &idx)) { + if (group_str) { range = prefix_new(); - (void)str2prefix(argv[idx]->arg, range); + prefix_copy(range, group); apply_mask(range); } - if (uj) - vty_out(vty, "{ "); + if (json) + json_parent = json_object_new_object(); + RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) { - if (uj) { - if (!first) - vty_out(vty, ", "); - vty_out(vty, " \"%s\": ", vrf->name); - first = false; - } else + if (!json) vty_out(vty, "VRF: %s\n", vrf->name); - pim_rp_show_information(vrf->info, range, vty, uj); + else + json_vrf = json_object_new_object(); + pim_rp_show_information(vrf->info, range, vty, json_vrf); + if (json) + json_object_object_add(json_parent, vrf->name, + json_vrf); } - if (uj) - vty_out(vty, "}\n"); + if (json) + vty_json(vty, json_parent); + + prefix_free(&range); return CMD_SUCCESS; } diff --git a/pimd/pim_rp.c b/pimd/pim_rp.c index a552e77823..730870fb33 100644 --- a/pimd/pim_rp.c +++ b/pimd/pim_rp.c @@ -1147,20 +1147,17 @@ int pim_rp_config_write(struct pim_instance *pim, struct vty *vty, } void pim_rp_show_information(struct pim_instance *pim, struct prefix *range, - struct vty *vty, bool uj) + struct vty *vty, json_object *json) { struct rp_info *rp_info; struct rp_info *prev_rp_info = NULL; struct listnode *node; char source[7]; - json_object *json = NULL; json_object *json_rp_rows = NULL; json_object *json_row = NULL; - if (uj) - json = json_object_new_object(); - else + if (!json) vty_out(vty, "RP address group/prefix-list OIF I am RP Source Group-Type\n"); for (ALL_LIST_ELEMENTS_RO(pim->rp_list, node, rp_info)) { @@ -1184,7 +1181,7 @@ void pim_rp_show_information(struct pim_instance *pim, struct prefix *range, strlcpy(source, "BSR", sizeof(source)); else strlcpy(source, "None", sizeof(source)); - if (uj) { + if (json) { /* * If we have moved on to a new RP then add the * entry for the previous RP @@ -1257,12 +1254,10 @@ void pim_rp_show_information(struct pim_instance *pim, struct prefix *range, prev_rp_info = rp_info; } - if (uj) { + if (json) { if (prev_rp_info && json_rp_rows) json_object_object_addf(json, json_rp_rows, "%pFXh", &prev_rp_info->rp.rpf_addr); - - vty_json(vty, json); } } diff --git a/pimd/pim_rp.h b/pimd/pim_rp.h index 04faeb5f26..e1bc71a3dc 100644 --- a/pimd/pim_rp.h +++ b/pimd/pim_rp.h @@ -25,6 +25,7 @@ #include "vty.h" #include "plist.h" #include "pim_rpf.h" +#include "lib/json.h" struct pim_interface; @@ -79,7 +80,7 @@ struct pim_rpf *pim_rp_g(struct pim_instance *pim, pim_addr group); #define RP(P, G) pim_rp_g ((P), (G)) void pim_rp_show_information(struct pim_instance *pim, struct prefix *range, - struct vty *vty, bool uj); + struct vty *vty, json_object *json); void pim_resolve_rp_nh(struct pim_instance *pim, struct pim_neighbor *nbr); int pim_rp_list_cmp(void *v1, void *v2); struct rp_info *pim_rp_find_match_group(struct pim_instance *pim, -- 2.39.5