From aaf46b1edc369dc7605f7008720e6af27381d3b0 Mon Sep 17 00:00:00 2001 From: Sarita Patra Date: Tue, 12 Jul 2022 04:16:17 -0700 Subject: [PATCH] pimd: Add vrf optional parameter in "show ip pim bsr" cmd Added common API pim_show_bsr_helper to suppport both PIM and PIMV6. pim_show_bsr() is moved to pim_cmd_common.c file. Signed-off-by: Sarita Patra --- pimd/pim_cmd.c | 87 ++---------------------------------------- pimd/pim_cmd_common.c | 89 +++++++++++++++++++++++++++++++++++++++++++ pimd/pim_cmd_common.h | 2 + 3 files changed, 95 insertions(+), 83 deletions(-) diff --git a/pimd/pim_cmd.c b/pimd/pim_cmd.c index c6f2e8dbde..858d467287 100644 --- a/pimd/pim_cmd.c +++ b/pimd/pim_cmd.c @@ -1439,77 +1439,6 @@ static void igmp_show_source_retransmission(struct pim_instance *pim, } /* scan interfaces */ } -static void pim_show_bsr(struct pim_instance *pim, - struct vty *vty, - bool uj) -{ - char uptime[10]; - char last_bsm_seen[10]; - time_t now; - char bsr_state[20]; - json_object *json = NULL; - - if (pim_addr_is_any(pim->global_scope.current_bsr)) { - pim_time_uptime(uptime, sizeof(uptime), - pim->global_scope.current_bsr_first_ts); - pim_time_uptime(last_bsm_seen, sizeof(last_bsm_seen), - pim->global_scope.current_bsr_last_ts); - } - - else { - now = pim_time_monotonic_sec(); - pim_time_uptime(uptime, sizeof(uptime), - (now - pim->global_scope.current_bsr_first_ts)); - pim_time_uptime(last_bsm_seen, sizeof(last_bsm_seen), - now - pim->global_scope.current_bsr_last_ts); - } - - switch (pim->global_scope.state) { - case NO_INFO: - strlcpy(bsr_state, "NO_INFO", sizeof(bsr_state)); - break; - case ACCEPT_ANY: - strlcpy(bsr_state, "ACCEPT_ANY", sizeof(bsr_state)); - break; - case ACCEPT_PREFERRED: - strlcpy(bsr_state, "ACCEPT_PREFERRED", sizeof(bsr_state)); - break; - default: - strlcpy(bsr_state, "", sizeof(bsr_state)); - } - - - if (uj) { - json = json_object_new_object(); - json_object_string_addf(json, "bsr", "%pPA", - &pim->global_scope.current_bsr); - json_object_int_add(json, "priority", - pim->global_scope.current_bsr_prio); - json_object_int_add(json, "fragmentTag", - pim->global_scope.bsm_frag_tag); - json_object_string_add(json, "state", bsr_state); - json_object_string_add(json, "upTime", uptime); - json_object_string_add(json, "lastBsmSeen", last_bsm_seen); - } - - else { - vty_out(vty, "PIMv2 Bootstrap information\n"); - vty_out(vty, "Current preferred BSR address: %pPA\n", - &pim->global_scope.current_bsr); - vty_out(vty, - "Priority Fragment-Tag State UpTime\n"); - vty_out(vty, " %-12d %-12d %-13s %7s\n", - pim->global_scope.current_bsr_prio, - pim->global_scope.bsm_frag_tag, - bsr_state, - uptime); - vty_out(vty, "Last BSM seen: %s\n", last_bsm_seen); - } - - if (uj) - vty_json(vty, json); -} - static void clear_igmp_interfaces(struct pim_instance *pim) { struct interface *ifp; @@ -3586,25 +3515,17 @@ DEFUN (show_ip_pim_group_type, return CMD_SUCCESS; } -DEFUN (show_ip_pim_bsr, +DEFPY (show_ip_pim_bsr, show_ip_pim_bsr_cmd, - "show ip pim bsr [json]", + "show ip pim bsr [vrf NAME] [json$json]", SHOW_STR IP_STR PIM_STR "boot-strap router information\n" + VRF_CMD_HELP_STR JSON_STR) { - int idx = 2; - struct vrf *vrf = pim_cmd_lookup_vrf(vty, argv, argc, &idx); - bool uj = use_json(argc, argv); - - if (!vrf) - return CMD_WARNING; - - pim_show_bsr(vrf->info, vty, uj); - - return CMD_SUCCESS; + return pim_show_bsr_helper(vrf, vty, !!json); } DEFUN (ip_ssmpingd, diff --git a/pimd/pim_cmd_common.c b/pimd/pim_cmd_common.c index 4b17d0bafd..38a2cbb95f 100644 --- a/pimd/pim_cmd_common.c +++ b/pimd/pim_cmd_common.c @@ -5243,3 +5243,92 @@ void clear_pim_interfaces(struct pim_instance *pim) pim_neighbor_delete_all(ifp, "interface cleared"); } } + +void pim_show_bsr(struct pim_instance *pim, struct vty *vty, bool uj) +{ + char uptime[10]; + char last_bsm_seen[10]; + time_t now; + char bsr_state[20]; + json_object *json = NULL; + + if (pim_addr_is_any(pim->global_scope.current_bsr)) { + pim_time_uptime(uptime, sizeof(uptime), + pim->global_scope.current_bsr_first_ts); + pim_time_uptime(last_bsm_seen, sizeof(last_bsm_seen), + pim->global_scope.current_bsr_last_ts); + } + + else { + now = pim_time_monotonic_sec(); + pim_time_uptime(uptime, sizeof(uptime), + (now - pim->global_scope.current_bsr_first_ts)); + pim_time_uptime(last_bsm_seen, sizeof(last_bsm_seen), + now - pim->global_scope.current_bsr_last_ts); + } + + switch (pim->global_scope.state) { + case NO_INFO: + strlcpy(bsr_state, "NO_INFO", sizeof(bsr_state)); + break; + case ACCEPT_ANY: + strlcpy(bsr_state, "ACCEPT_ANY", sizeof(bsr_state)); + break; + case ACCEPT_PREFERRED: + strlcpy(bsr_state, "ACCEPT_PREFERRED", sizeof(bsr_state)); + break; + default: + strlcpy(bsr_state, "", sizeof(bsr_state)); + } + + + if (uj) { + json = json_object_new_object(); + json_object_string_addf(json, "bsr", "%pPA", + &pim->global_scope.current_bsr); + json_object_int_add(json, "priority", + pim->global_scope.current_bsr_prio); + json_object_int_add(json, "fragmentTag", + pim->global_scope.bsm_frag_tag); + json_object_string_add(json, "state", bsr_state); + json_object_string_add(json, "upTime", uptime); + json_object_string_add(json, "lastBsmSeen", last_bsm_seen); + } + + else { + vty_out(vty, "PIMv2 Bootstrap information\n"); + vty_out(vty, "Current preferred BSR address: %pPA\n", + &pim->global_scope.current_bsr); + vty_out(vty, + "Priority Fragment-Tag State UpTime\n"); + vty_out(vty, " %-12d %-12d %-13s %7s\n", + pim->global_scope.current_bsr_prio, + pim->global_scope.bsm_frag_tag, bsr_state, uptime); + vty_out(vty, "Last BSM seen: %s\n", last_bsm_seen); + } + + if (uj) + vty_json(vty, json); +} + +int pim_show_bsr_helper(const char *vrf, struct vty *vty, bool uj) +{ + struct pim_instance *pim; + struct vrf *v; + + 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; + } + + pim_show_bsr(v->info, vty, uj); + + return CMD_SUCCESS; +} diff --git a/pimd/pim_cmd_common.h b/pimd/pim_cmd_common.h index 6a72664a55..5ab2fabd07 100644 --- a/pimd/pim_cmd_common.h +++ b/pimd/pim_cmd_common.h @@ -190,6 +190,8 @@ void pim_show_interface_traffic(struct pim_instance *pim, struct vty *vty, int pim_show_interface_traffic_helper(const char *vrf, const char *if_name, struct vty *vty, bool uj); void clear_pim_interfaces(struct pim_instance *pim); +void pim_show_bsr(struct pim_instance *pim, struct vty *vty, bool uj); +int pim_show_bsr_helper(const char *vrf, struct vty *vty, bool uj); /* * Special Macro to allow us to get the correct pim_instance; */ -- 2.39.5