diff options
Diffstat (limited to 'pimd/pim_cmd.c')
| -rw-r--r-- | pimd/pim_cmd.c | 1905 |
1 files changed, 791 insertions, 1114 deletions
diff --git a/pimd/pim_cmd.c b/pimd/pim_cmd.c index 501d69dbf5..86d179fe39 100644 --- a/pimd/pim_cmd.c +++ b/pimd/pim_cmd.c @@ -67,6 +67,7 @@ #include "lib/northbound_cli.h" #include "pim_errors.h" #include "pim_nb.h" +#include "pim_cmd_common.h" #ifndef VTYSH_EXTRACT_PL #include "pimd/pim_cmd_clippy.c" @@ -79,6 +80,14 @@ static struct cmd_node debug_node = { .config_write = pim_debug_config_write, }; +static inline bool pim_sgaddr_match(pim_sgaddr item, pim_sgaddr match) +{ + return (pim_addr_is_any(match.grp) || + !pim_addr_cmp(match.grp, item.grp)) && + (pim_addr_is_any(match.src) || + !pim_addr_cmp(match.src, item.src)); +} + static struct vrf *pim_cmd_lookup_vrf(struct vty *vty, struct cmd_token *argv[], const int argc, int *idx) { @@ -100,8 +109,6 @@ static void pim_show_assert_helper(struct vty *vty, struct pim_interface *pim_ifp, struct pim_ifchannel *ch, time_t now) { - char ch_src_str[INET_ADDRSTRLEN]; - char ch_grp_str[INET_ADDRSTRLEN]; char winner_str[INET_ADDRSTRLEN]; struct in_addr ifaddr; char uptime[10]; @@ -110,18 +117,16 @@ static void pim_show_assert_helper(struct vty *vty, ifaddr = pim_ifp->primary_address; - pim_inet4_dump("<ch_src?>", ch->sg.src, ch_src_str, sizeof(ch_src_str)); - pim_inet4_dump("<ch_grp?>", ch->sg.grp, ch_grp_str, sizeof(ch_grp_str)); pim_inet4_dump("<assrt_win?>", ch->ifassert_winner, winner_str, sizeof(winner_str)); pim_time_uptime(uptime, sizeof(uptime), now - ch->ifassert_creation); pim_time_timer_to_mmss(timer, sizeof(timer), ch->t_ifassert_timer); - vty_out(vty, "%-16s %-15s %-15s %-15s %-6s %-15s %-8s %-5s\n", + vty_out(vty, "%-16s %-15s %-15pPAs %-15pPAs %-6s %-15s %-8s %-5s\n", ch->interface->name, - inet_ntop(AF_INET, &ifaddr, buf, sizeof(buf)), ch_src_str, - ch_grp_str, pim_ifchannel_ifassert_name(ch->ifassert_state), + inet_ntop(AF_INET, &ifaddr, buf, sizeof(buf)), &ch->sg.src, + &ch->sg.grp, pim_ifchannel_ifassert_name(ch->ifassert_state), winner_str, uptime, timer); } @@ -143,6 +148,9 @@ static void pim_show_assert(struct pim_instance *pim, struct vty *vty) continue; RB_FOREACH (ch, pim_ifchannel_rb, &pim_ifp->ifchannel_rb) { + if (ch->ifassert_state == PIM_IFASSERT_NOINFO) + continue; + pim_show_assert_helper(vty, pim_ifp, ch, now); } /* scan interface channels */ } @@ -152,19 +160,15 @@ static void pim_show_assert_internal_helper(struct vty *vty, struct pim_interface *pim_ifp, struct pim_ifchannel *ch) { - char ch_src_str[INET_ADDRSTRLEN]; - char ch_grp_str[INET_ADDRSTRLEN]; struct in_addr ifaddr; char buf[PREFIX_STRLEN]; ifaddr = pim_ifp->primary_address; - pim_inet4_dump("<ch_src?>", ch->sg.src, ch_src_str, sizeof(ch_src_str)); - pim_inet4_dump("<ch_grp?>", ch->sg.grp, ch_grp_str, sizeof(ch_grp_str)); - vty_out(vty, "%-16s %-15s %-15s %-15s %-3s %-3s %-3s %-4s\n", + vty_out(vty, "%-16s %-15s %-15pPAs %-15pPAs %-3s %-3s %-3s %-4s\n", ch->interface->name, - inet_ntop(AF_INET, &ifaddr, buf, sizeof(buf)), - ch_src_str, ch_grp_str, + inet_ntop(AF_INET, &ifaddr, buf, sizeof(buf)), &ch->sg.src, + &ch->sg.grp, PIM_IF_FLAG_TEST_COULD_ASSERT(ch->flags) ? "yes" : "no", pim_macro_ch_could_assert_eval(ch) ? "yes" : "no", PIM_IF_FLAG_TEST_ASSERT_TRACKING_DESIRED(ch->flags) ? "yes" @@ -201,8 +205,6 @@ static void pim_show_assert_metric_helper(struct vty *vty, struct pim_interface *pim_ifp, struct pim_ifchannel *ch) { - char ch_src_str[INET_ADDRSTRLEN]; - char ch_grp_str[INET_ADDRSTRLEN]; char addr_str[INET_ADDRSTRLEN]; struct pim_assert_metric am; struct in_addr ifaddr; @@ -213,14 +215,12 @@ static void pim_show_assert_metric_helper(struct vty *vty, am = pim_macro_spt_assert_metric(&ch->upstream->rpf, pim_ifp->primary_address); - pim_inet4_dump("<ch_src?>", ch->sg.src, ch_src_str, sizeof(ch_src_str)); - pim_inet4_dump("<ch_grp?>", ch->sg.grp, ch_grp_str, sizeof(ch_grp_str)); pim_inet4_dump("<addr?>", am.ip_address, addr_str, sizeof(addr_str)); - vty_out(vty, "%-16s %-15s %-15s %-15s %-3s %4u %6u %-15s\n", + vty_out(vty, "%-16s %-15s %-15pPAs %-15pPAs %-3s %4u %6u %-15s\n", ch->interface->name, - inet_ntop(AF_INET, &ifaddr, buf, sizeof(buf)), - ch_src_str, ch_grp_str, am.rpt_bit_flag ? "yes" : "no", + inet_ntop(AF_INET, &ifaddr, buf, sizeof(buf)), &ch->sg.src, + &ch->sg.grp, am.rpt_bit_flag ? "yes" : "no", am.metric_preference, am.route_metric, addr_str); } @@ -248,8 +248,6 @@ static void pim_show_assert_winner_metric_helper(struct vty *vty, struct pim_interface *pim_ifp, struct pim_ifchannel *ch) { - char ch_src_str[INET_ADDRSTRLEN]; - char ch_grp_str[INET_ADDRSTRLEN]; char addr_str[INET_ADDRSTRLEN]; struct pim_assert_metric *am; struct in_addr ifaddr; @@ -261,8 +259,6 @@ static void pim_show_assert_winner_metric_helper(struct vty *vty, am = &ch->ifassert_winner_metric; - pim_inet4_dump("<ch_src?>", ch->sg.src, ch_src_str, sizeof(ch_src_str)); - pim_inet4_dump("<ch_grp?>", ch->sg.grp, ch_grp_str, sizeof(ch_grp_str)); pim_inet4_dump("<addr?>", am->ip_address, addr_str, sizeof(addr_str)); if (am->metric_preference == PIM_ASSERT_METRIC_PREFERENCE_MAX) @@ -276,11 +272,11 @@ static void pim_show_assert_winner_metric_helper(struct vty *vty, else snprintf(metr_str, sizeof(metr_str), "%6u", am->route_metric); - vty_out(vty, "%-16s %-15s %-15s %-15s %-3s %-4s %-6s %-15s\n", + vty_out(vty, "%-16s %-15s %-15pPAs %-15pPAs %-3s %-4s %-6s %-15s\n", ch->interface->name, - inet_ntop(AF_INET, &ifaddr, buf, sizeof(buf)), ch_src_str, - ch_grp_str, am->rpt_bit_flag ? "yes" : "no", pref_str, metr_str, - addr_str); + inet_ntop(AF_INET, &ifaddr, buf, sizeof(buf)), &ch->sg.src, + &ch->sg.grp, am->rpt_bit_flag ? "yes" : "no", pref_str, + metr_str, addr_str); } static void pim_show_assert_winner_metric(struct pim_instance *pim, @@ -340,14 +336,10 @@ static void pim_show_membership_helper(struct vty *vty, struct pim_ifchannel *ch, struct json_object *json) { - char ch_src_str[INET_ADDRSTRLEN]; - char ch_grp_str[INET_ADDRSTRLEN]; + char ch_grp_str[PIM_ADDRSTRLEN]; json_object *json_iface = NULL; json_object *json_row = NULL; - pim_inet4_dump("<ch_src?>", ch->sg.src, ch_src_str, sizeof(ch_src_str)); - pim_inet4_dump("<ch_grp?>", ch->sg.grp, ch_grp_str, sizeof(ch_grp_str)); - json_object_object_get_ex(json, ch->interface->name, &json_iface); if (!json_iface) { json_iface = json_object_new_object(); @@ -355,8 +347,10 @@ static void pim_show_membership_helper(struct vty *vty, json_object_object_add(json, ch->interface->name, json_iface); } + snprintfrr(ch_grp_str, sizeof(ch_grp_str), "%pPAs", &ch->sg.grp); + json_row = json_object_new_object(); - json_object_string_add(json_row, "source", ch_src_str); + json_object_string_addf(json_row, "source", "%pPAs", &ch->sg.src); json_object_string_add(json_row, "group", ch_grp_str); json_object_string_add(json_row, "localMembership", ch->local_ifmembership == PIM_IFMEMBERSHIP_NOINFO @@ -364,6 +358,7 @@ static void pim_show_membership_helper(struct vty *vty, : "INCLUDE"); json_object_object_add(json_iface, ch_grp_str, json_row); } + static void pim_show_membership(struct pim_instance *pim, struct vty *vty, bool uj) { @@ -460,8 +455,7 @@ static void pim_show_membership(struct pim_instance *pim, struct vty *vty, json_object_free(json); } -static void pim_print_ifp_flags(struct vty *vty, struct interface *ifp, - int mloop) +static void pim_print_ifp_flags(struct vty *vty, struct interface *ifp) { vty_out(vty, "Flags\n"); vty_out(vty, "-----\n"); @@ -474,7 +468,6 @@ static void pim_print_ifp_flags(struct vty *vty, struct interface *ifp, vty_out(vty, "Interface Index : %d\n", ifp->ifindex); vty_out(vty, "Multicast : %s\n", if_is_multicast(ifp) ? "yes" : "no"); - vty_out(vty, "Multicast Loop : %d\n", mloop); vty_out(vty, "Promiscuous : %s\n", (ifp->flags & IFF_PROMISC) ? "yes" : "no"); vty_out(vty, "\n"); @@ -501,14 +494,14 @@ static void igmp_show_interfaces(struct pim_instance *pim, struct vty *vty, FOR_ALL_INTERFACES (pim->vrf, ifp) { struct pim_interface *pim_ifp; struct listnode *sock_node; - struct igmp_sock *igmp; + struct gm_sock *igmp; pim_ifp = ifp->info; if (!pim_ifp) continue; - for (ALL_LIST_ELEMENTS_RO(pim_ifp->igmp_socket_list, sock_node, + for (ALL_LIST_ELEMENTS_RO(pim_ifp->gm_socket_list, sock_node, igmp)) { char uptime[10]; char query_hhmmss[10]; @@ -564,18 +557,15 @@ static void igmp_show_interfaces(struct pim_instance *pim, struct vty *vty, } } - if (uj) { - vty_out(vty, "%s\n", json_object_to_json_string_ext( - json, JSON_C_TO_STRING_PRETTY)); - json_object_free(json); - } + if (uj) + vty_json(vty, json); } static void igmp_show_interfaces_single(struct pim_instance *pim, struct vty *vty, const char *ifname, bool uj) { - struct igmp_sock *igmp; + struct gm_sock *igmp; struct interface *ifp; struct listnode *sock_node; struct pim_interface *pim_ifp; @@ -584,7 +574,6 @@ static void igmp_show_interfaces_single(struct pim_instance *pim, char other_hhmmss[10]; int found_ifname = 0; int sqi; - int mloop = 0; long gmi_msec; /* Group Membership Interval */ long lmqt_msec; long ohpi_msec; @@ -610,7 +599,7 @@ static void igmp_show_interfaces_single(struct pim_instance *pim, if (strcmp(ifname, "detail") && strcmp(ifname, ifp->name)) continue; - for (ALL_LIST_ELEMENTS_RO(pim_ifp->igmp_socket_list, sock_node, + for (ALL_LIST_ELEMENTS_RO(pim_ifp->gm_socket_list, sock_node, igmp)) { found_ifname = 1; pim_time_uptime(uptime, sizeof(uptime), @@ -625,35 +614,29 @@ static void igmp_show_interfaces_single(struct pim_instance *pim, gmi_msec = PIM_IGMP_GMI_MSEC( igmp->querier_robustness_variable, igmp->querier_query_interval, - pim_ifp->igmp_query_max_response_time_dsec); + pim_ifp->gm_query_max_response_time_dsec); - sqi = PIM_IGMP_SQI( - pim_ifp->igmp_default_query_interval); + sqi = PIM_IGMP_SQI(pim_ifp->gm_default_query_interval); oqpi_msec = PIM_IGMP_OQPI_MSEC( igmp->querier_robustness_variable, igmp->querier_query_interval, - pim_ifp->igmp_query_max_response_time_dsec); + pim_ifp->gm_query_max_response_time_dsec); lmqt_msec = PIM_IGMP_LMQT_MSEC( - pim_ifp->igmp_specific_query_max_response_time_dsec, - pim_ifp->igmp_last_member_query_count); + pim_ifp->gm_specific_query_max_response_time_dsec, + pim_ifp->gm_last_member_query_count); ohpi_msec = PIM_IGMP_OHPI_DSEC( igmp->querier_robustness_variable, igmp->querier_query_interval, - pim_ifp->igmp_query_max_response_time_dsec) - * 100; - - qri_msec = pim_ifp->igmp_query_max_response_time_dsec - * 100; - if (pim_ifp->pim_sock_fd >= 0) - mloop = pim_socket_mcastloop_get( - pim_ifp->pim_sock_fd); - else - mloop = 0; - lmqc = pim_ifp->igmp_last_member_query_count; + pim_ifp->gm_query_max_response_time_dsec) * + 100; + + qri_msec = + pim_ifp->gm_query_max_response_time_dsec * 100; + lmqc = pim_ifp->gm_last_member_query_count; if (uj) { json_row = json_object_new_object(); @@ -785,19 +768,15 @@ static void igmp_show_interfaces_single(struct pim_instance *pim, vty_out(vty, "\n"); vty_out(vty, "\n"); - pim_print_ifp_flags(vty, ifp, mloop); + pim_print_ifp_flags(vty, ifp); } } } - if (uj) { - vty_out(vty, "%s\n", json_object_to_json_string_ext( - json, JSON_C_TO_STRING_PRETTY)); - json_object_free(json); - } else { - if (!found_ifname) - vty_out(vty, "%% No such interface\n"); - } + if (uj) + vty_json(vty, json); + else if (!found_ifname) + vty_out(vty, "%% No such interface\n"); } static void igmp_show_interface_join(struct pim_instance *pim, struct vty *vty, @@ -824,7 +803,7 @@ static void igmp_show_interface_join(struct pim_instance *pim, struct vty *vty, FOR_ALL_INTERFACES (pim->vrf, ifp) { struct pim_interface *pim_ifp; struct listnode *join_node; - struct igmp_join *ij; + struct gm_join *ij; struct in_addr pri_addr; char pri_addr_str[INET_ADDRSTRLEN]; @@ -833,14 +812,14 @@ static void igmp_show_interface_join(struct pim_instance *pim, struct vty *vty, if (!pim_ifp) continue; - if (!pim_ifp->igmp_join_list) + if (!pim_ifp->gm_join_list) continue; pri_addr = pim_find_primary_addr(ifp); pim_inet4_dump("<pri?>", pri_addr, pri_addr_str, sizeof(pri_addr_str)); - for (ALL_LIST_ELEMENTS_RO(pim_ifp->igmp_join_list, join_node, + for (ALL_LIST_ELEMENTS_RO(pim_ifp->gm_join_list, join_node, ij)) { char group_str[INET_ADDRSTRLEN]; char source_str[INET_ADDRSTRLEN]; @@ -887,15 +866,12 @@ static void igmp_show_interface_join(struct pim_instance *pim, struct vty *vty, ifp->name, pri_addr_str, source_str, group_str, ij->sock_fd, uptime); } - } /* for (pim_ifp->igmp_join_list) */ + } /* for (pim_ifp->gm_join_list) */ } /* for (iflist) */ - if (uj) { - vty_out(vty, "%s\n", json_object_to_json_string_ext( - json, JSON_C_TO_STRING_PRETTY)); - json_object_free(json); - } + if (uj) + vty_json(vty, json); } static void pim_show_interfaces_single(struct pim_instance *pim, @@ -919,7 +895,6 @@ static void pim_show_interfaces_single(struct pim_instance *pim, char src_str[INET_ADDRSTRLEN]; char stat_uptime[10]; char uptime[10]; - int mloop = 0; int found_ifname = 0; int print_header; json_object *json = NULL; @@ -961,10 +936,6 @@ static void pim_show_interfaces_single(struct pim_instance *pim, pim_ifp->pim_hello_period); pim_time_uptime(stat_uptime, sizeof(stat_uptime), now - pim_ifp->pim_ifstat_start); - if (pim_ifp->pim_sock_fd >= 0) - mloop = pim_socket_mcastloop_get(pim_ifp->pim_sock_fd); - else - mloop = 0; if (uj) { char pbuf[PREFIX2STR_BUFFER]; @@ -1056,10 +1027,10 @@ static void pim_show_interfaces_single(struct pim_instance *pim, json_fhr_sources = json_object_new_object(); - pim_inet4_dump("<src?>", up->sg.src, src_str, - sizeof(src_str)); - pim_inet4_dump("<grp?>", up->sg.grp, grp_str, - sizeof(grp_str)); + snprintfrr(grp_str, sizeof(grp_str), "%pPAs", + &up->sg.grp); + snprintfrr(src_str, sizeof(src_str), "%pPAs", + &up->sg.src); pim_time_uptime(uptime, sizeof(uptime), now - up->state_transition); @@ -1112,8 +1083,6 @@ static void pim_show_interfaces_single(struct pim_instance *pim, pim_ifp->pim_ifstat_hello_sendfail); json_object_int_add(json_row, "helloGenerationId", pim_ifp->pim_generation_id); - json_object_int_add(json_row, "flagMulticastLoop", - mloop); json_object_int_add( json_row, "effectivePropagationDelay", @@ -1233,15 +1202,11 @@ static void pim_show_interfaces_single(struct pim_instance *pim, print_header = 0; } - pim_inet4_dump("<src?>", up->sg.src, src_str, - sizeof(src_str)); - pim_inet4_dump("<grp?>", up->sg.grp, grp_str, - sizeof(grp_str)); pim_time_uptime(uptime, sizeof(uptime), now - up->state_transition); vty_out(vty, - "%s : %s is a source, uptime is %s\n", - grp_str, src_str, uptime); + "%pPAs : %pPAs is a source, uptime is %s\n", + &up->sg.grp, &up->sg.src, uptime); } if (!print_header) { @@ -1270,7 +1235,7 @@ static void pim_show_interfaces_single(struct pim_instance *pim, vty_out(vty, "\n"); vty_out(vty, "\n"); - pim_print_ifp_flags(vty, ifp, mloop); + pim_print_ifp_flags(vty, ifp); vty_out(vty, "Join Prune Interval\n"); vty_out(vty, "-------------------\n"); @@ -1309,28 +1274,31 @@ static void pim_show_interfaces_single(struct pim_instance *pim, } } - if (uj) { - vty_out(vty, "%s\n", json_object_to_json_string_ext( - json, JSON_C_TO_STRING_PRETTY)); - json_object_free(json); - } else { - if (!found_ifname) - vty_out(vty, "%% No such interface\n"); - } + if (uj) + vty_json(vty, json); + else if (!found_ifname) + vty_out(vty, "%% No such interface\n"); } static void igmp_show_statistics(struct pim_instance *pim, struct vty *vty, const char *ifname, bool uj) { struct interface *ifp; - struct igmp_stats rx_stats; + struct igmp_stats igmp_stats; + bool found_ifname = false; + json_object *json = NULL; + + igmp_stats_init(&igmp_stats); - igmp_stats_init(&rx_stats); + if (uj) + json = json_object_new_object(); FOR_ALL_INTERFACES (pim->vrf, ifp) { struct pim_interface *pim_ifp; - struct listnode *sock_node; - struct igmp_sock *igmp; + struct listnode *sock_node, *source_node, *group_node; + struct gm_sock *igmp; + struct gm_group *group; + struct gm_source *src; pim_ifp = ifp->info; @@ -1340,52 +1308,119 @@ static void igmp_show_statistics(struct pim_instance *pim, struct vty *vty, if (ifname && strcmp(ifname, ifp->name)) continue; - for (ALL_LIST_ELEMENTS_RO(pim_ifp->igmp_socket_list, sock_node, + found_ifname = true; + + igmp_stats.joins_failed += pim_ifp->igmp_ifstat_joins_failed; + igmp_stats.joins_sent += pim_ifp->igmp_ifstat_joins_sent; + igmp_stats.total_groups += + pim_ifp->gm_group_list + ? listcount(pim_ifp->gm_group_list) + : 0; + igmp_stats.peak_groups += pim_ifp->igmp_peak_group_count; + + + for (ALL_LIST_ELEMENTS_RO(pim_ifp->gm_group_list, group_node, + group)) { + for (ALL_LIST_ELEMENTS_RO(group->group_source_list, + source_node, src)) { + if (pim_addr_is_any(src->source_addr)) + continue; + + igmp_stats.total_source_groups++; + } + } + + for (ALL_LIST_ELEMENTS_RO(pim_ifp->gm_socket_list, sock_node, igmp)) { - igmp_stats_add(&rx_stats, &igmp->rx_stats); + igmp_stats_add(&igmp_stats, &igmp->igmp_stats); } } - if (uj) { - json_object *json = NULL; - json_object *json_row = NULL; - json = json_object_new_object(); - json_row = json_object_new_object(); + if (!found_ifname) { + if (uj) + vty_json(vty, json); + else + vty_out(vty, "%% No such interface\n"); + return; + } - json_object_string_add(json_row, "name", ifname ? ifname : - "global"); - json_object_int_add(json_row, "queryV1", rx_stats.query_v1); - json_object_int_add(json_row, "queryV2", rx_stats.query_v2); - json_object_int_add(json_row, "queryV3", rx_stats.query_v3); - json_object_int_add(json_row, "leaveV3", rx_stats.leave_v2); - json_object_int_add(json_row, "reportV1", rx_stats.report_v1); - json_object_int_add(json_row, "reportV2", rx_stats.report_v2); - json_object_int_add(json_row, "reportV3", rx_stats.report_v3); + if (uj) { + json_object *json_row = json_object_new_object(); + + json_object_string_add(json_row, "name", + ifname ? ifname : "global"); + json_object_int_add(json_row, "queryV1", igmp_stats.query_v1); + json_object_int_add(json_row, "queryV2", igmp_stats.query_v2); + json_object_int_add(json_row, "queryV3", igmp_stats.query_v3); + json_object_int_add(json_row, "leaveV2", igmp_stats.leave_v2); + json_object_int_add(json_row, "reportV1", igmp_stats.report_v1); + json_object_int_add(json_row, "reportV2", igmp_stats.report_v2); + json_object_int_add(json_row, "reportV3", igmp_stats.report_v3); json_object_int_add(json_row, "mtraceResponse", - rx_stats.mtrace_rsp); + igmp_stats.mtrace_rsp); json_object_int_add(json_row, "mtraceRequest", - rx_stats.mtrace_req); + igmp_stats.mtrace_req); json_object_int_add(json_row, "unsupported", - rx_stats.unsupported); + igmp_stats.unsupported); + json_object_int_add(json_row, "totalReceivedMessages", + igmp_stats.total_recv_messages); + json_object_int_add(json_row, "peakGroups", + igmp_stats.peak_groups); + json_object_int_add(json_row, "totalGroups", + igmp_stats.total_groups); + json_object_int_add(json_row, "totalSourceGroups", + igmp_stats.total_source_groups); + json_object_int_add(json_row, "joinsFailed", + igmp_stats.joins_failed); + json_object_int_add(json_row, "joinsSent", + igmp_stats.joins_sent); + json_object_int_add(json_row, "generalQueriesSent", + igmp_stats.general_queries_sent); + json_object_int_add(json_row, "groupQueriesSent", + igmp_stats.group_queries_sent); json_object_object_add(json, ifname ? ifname : "global", json_row); - vty_out(vty, "%s\n", json_object_to_json_string_ext( - json, JSON_C_TO_STRING_PRETTY)); - json_object_free(json); + vty_json(vty, json); } else { - vty_out(vty, "IGMP RX statistics\n"); - vty_out(vty, "Interface : %s\n", + vty_out(vty, "IGMP statistics\n"); + vty_out(vty, "Interface : %s\n", ifname ? ifname : "global"); - vty_out(vty, "V1 query : %u\n", rx_stats.query_v1); - vty_out(vty, "V2 query : %u\n", rx_stats.query_v2); - vty_out(vty, "V3 query : %u\n", rx_stats.query_v3); - vty_out(vty, "V2 leave : %u\n", rx_stats.leave_v2); - vty_out(vty, "V1 report : %u\n", rx_stats.report_v1); - vty_out(vty, "V2 report : %u\n", rx_stats.report_v2); - vty_out(vty, "V3 report : %u\n", rx_stats.report_v3); - vty_out(vty, "mtrace response : %u\n", rx_stats.mtrace_rsp); - vty_out(vty, "mtrace request : %u\n", rx_stats.mtrace_req); - vty_out(vty, "unsupported : %u\n", rx_stats.unsupported); + vty_out(vty, "V1 query : %u\n", + igmp_stats.query_v1); + vty_out(vty, "V2 query : %u\n", + igmp_stats.query_v2); + vty_out(vty, "V3 query : %u\n", + igmp_stats.query_v3); + vty_out(vty, "V2 leave : %u\n", + igmp_stats.leave_v2); + vty_out(vty, "V1 report : %u\n", + igmp_stats.report_v1); + vty_out(vty, "V2 report : %u\n", + igmp_stats.report_v2); + vty_out(vty, "V3 report : %u\n", + igmp_stats.report_v3); + vty_out(vty, "mtrace response : %u\n", + igmp_stats.mtrace_rsp); + vty_out(vty, "mtrace request : %u\n", + igmp_stats.mtrace_req); + vty_out(vty, "unsupported : %u\n", + igmp_stats.unsupported); + vty_out(vty, "total received messages : %u\n", + igmp_stats.total_recv_messages); + vty_out(vty, "joins failed : %u\n", + igmp_stats.joins_failed); + vty_out(vty, "joins sent : %u\n", + igmp_stats.joins_sent); + vty_out(vty, "general queries sent : %u\n", + igmp_stats.general_queries_sent); + vty_out(vty, "group queries sent : %u\n", + igmp_stats.group_queries_sent); + vty_out(vty, "peak groups : %u\n", + igmp_stats.peak_groups); + vty_out(vty, "total groups : %u\n", + igmp_stats.total_groups); + vty_out(vty, "total source groups : %u\n", + igmp_stats.total_source_groups); } } @@ -1567,11 +1602,8 @@ static void pim_show_interface_traffic(struct pim_instance *pim, pim_ifp->pim_ifstat_bsm_tx); } } - if (uj) { - vty_out(vty, "%s\n", json_object_to_json_string_ext( - json, JSON_C_TO_STRING_PRETTY)); - json_object_free(json); - } + if (uj) + vty_json(vty, json); } static void pim_show_interface_traffic_single(struct pim_instance *pim, @@ -1623,6 +1655,10 @@ static void pim_show_interface_traffic_single(struct pim_instance *pim, pim_ifp->pim_ifstat_join_recv); json_object_int_add(json_row, "joinTx", pim_ifp->pim_ifstat_join_send); + json_object_int_add(json_row, "pruneRx", + pim_ifp->pim_ifstat_prune_recv); + json_object_int_add(json_row, "pruneTx", + pim_ifp->pim_ifstat_prune_send); json_object_int_add(json_row, "registerRx", pim_ifp->pim_ifstat_reg_recv); json_object_int_add(json_row, "registerTx", @@ -1660,22 +1696,16 @@ static void pim_show_interface_traffic_single(struct pim_instance *pim, pim_ifp->pim_ifstat_bsm_tx); } } - if (uj) { - vty_out(vty, "%s\n", json_object_to_json_string_ext( - json, JSON_C_TO_STRING_PRETTY)); - json_object_free(json); - } else { - if (!found_ifname) - vty_out(vty, "%% No such interface\n"); - } + if (uj) + vty_json(vty, json); + else if (!found_ifname) + vty_out(vty, "%% No such interface\n"); } static void pim_show_join_helper(struct vty *vty, struct pim_interface *pim_ifp, struct pim_ifchannel *ch, json_object *json, time_t now, bool uj) { - char ch_src_str[INET_ADDRSTRLEN]; - char ch_grp_str[INET_ADDRSTRLEN]; json_object *json_iface = NULL; json_object *json_row = NULL; json_object *json_grp = NULL; @@ -1687,9 +1717,6 @@ static void pim_show_join_helper(struct vty *vty, struct pim_interface *pim_ifp, ifaddr = pim_ifp->primary_address; - pim_inet4_dump("<ch_src?>", ch->sg.src, ch_src_str, sizeof(ch_src_str)); - pim_inet4_dump("<ch_grp?>", ch->sg.grp, ch_grp_str, sizeof(ch_grp_str)); - pim_time_uptime_begin(uptime, sizeof(uptime), now, ch->ifjoin_creation); pim_time_timer_to_mmss(expire, sizeof(expire), ch->t_ifjoin_expiry_timer); @@ -1697,6 +1724,14 @@ static void pim_show_join_helper(struct vty *vty, struct pim_interface *pim_ifp, ch->t_ifjoin_prune_pending_timer); if (uj) { + char ch_grp_str[PIM_ADDRSTRLEN]; + char ch_src_str[PIM_ADDRSTRLEN]; + + snprintfrr(ch_grp_str, sizeof(ch_grp_str), "%pPAs", + &ch->sg.grp); + snprintfrr(ch_src_str, sizeof(ch_src_str), "%pPAs", + &ch->sg.src); + json_object_object_get_ex(json, ch->interface->name, &json_iface); @@ -1716,8 +1751,13 @@ static void pim_show_join_helper(struct vty *vty, struct pim_interface *pim_ifp, json_object_string_add( json_row, "channelJoinName", pim_ifchannel_ifjoin_name(ch->ifjoin_state, ch->flags)); - if (PIM_IF_FLAG_TEST_S_G_RPT(ch->flags)) + if (PIM_IF_FLAG_TEST_S_G_RPT(ch->flags)) { +#if CONFDATE > 20230131 +CPP_NOTICE("Remove JSON object commands with keys starting with capital") +#endif json_object_int_add(json_row, "SGRpt", 1); + json_object_int_add(json_row, "sgRpt", 1); + } if (PIM_IF_FLAG_TEST_PROTO_PIM(ch->flags)) json_object_int_add(json_row, "protocolPim", 1); if (PIM_IF_FLAG_TEST_PROTO_IGMP(ch->flags)) @@ -1731,17 +1771,17 @@ static void pim_show_join_helper(struct vty *vty, struct pim_interface *pim_ifp, } else json_object_object_add(json_grp, ch_src_str, json_row); } else { - vty_out(vty, "%-16s %-15s %-15s %-15s %-10s %8s %-6s %5s\n", + vty_out(vty, "%-16s %-15s %-15pPAs %-15pPAs %-10s %8s %-6s %5s\n", ch->interface->name, inet_ntop(AF_INET, &ifaddr, buf, sizeof(buf)), - ch_src_str, ch_grp_str, + &ch->sg.src, &ch->sg.grp, pim_ifchannel_ifjoin_name(ch->ifjoin_state, ch->flags), uptime, expire, prune); } } static void pim_show_join(struct pim_instance *pim, struct vty *vty, - struct prefix_sg *sg, bool uj) + pim_sgaddr *sg, bool uj) { struct pim_interface *pim_ifp; struct pim_ifchannel *ch; @@ -1763,21 +1803,14 @@ static void pim_show_join(struct pim_instance *pim, struct vty *vty, continue; RB_FOREACH (ch, pim_ifchannel_rb, &pim_ifp->ifchannel_rb) { - if (sg->grp.s_addr != INADDR_ANY - && sg->grp.s_addr != ch->sg.grp.s_addr) - continue; - if (sg->src.s_addr != INADDR_ANY - && sg->src.s_addr != ch->sg.src.s_addr) + if (!pim_sgaddr_match(ch->sg, *sg)) continue; pim_show_join_helper(vty, pim_ifp, ch, json, now, uj); } /* scan interface channels */ } - if (uj) { - vty_out(vty, "%s\n", json_object_to_json_string_ext( - json, JSON_C_TO_STRING_PRETTY)); - json_object_free(json); - } + if (uj) + vty_json(vty, json); } static void pim_show_neighbors_single(struct pim_instance *pim, struct vty *vty, @@ -1976,17 +2009,10 @@ static void pim_show_neighbors_single(struct pim_instance *pim, struct vty *vty, } } - if (uj) { - vty_out(vty, "%s\n", json_object_to_json_string_ext( - json, JSON_C_TO_STRING_PRETTY)); - json_object_free(json); - } else { - { - if (!found_neighbor) - vty_out(vty, - "%% No such interface or neighbor\n"); - } - } + if (uj) + vty_json(vty, json); + else if (!found_neighbor) + vty_out(vty, "%% No such interface or neighbor\n"); } static void pim_show_state(struct pim_instance *pim, struct vty *vty, @@ -2081,6 +2107,8 @@ static void pim_show_state(struct pim_instance *pim, struct vty *vty, json_ifp_in); json_object_int_add(json_source, "Installed", c_oil->installed); + json_object_int_add(json_source, "installed", + c_oil->installed); if (isRpt) json_object_boolean_true_add( json_source, "isRpt"); @@ -2089,20 +2117,36 @@ static void pim_show_state(struct pim_instance *pim, struct vty *vty, json_source, "isRpt"); json_object_int_add(json_source, "RefCount", c_oil->oil_ref_count); + json_object_int_add(json_source, "refCount", + c_oil->oil_ref_count); json_object_int_add(json_source, "OilListSize", c_oil->oil_size); + json_object_int_add(json_source, "oilListSize", + c_oil->oil_size); json_object_int_add( json_source, "OilRescan", c_oil->oil_inherited_rescan); + json_object_int_add( + json_source, "oilRescan", + c_oil->oil_inherited_rescan); json_object_int_add(json_source, "LastUsed", c_oil->cc.lastused); + json_object_int_add(json_source, "lastUsed", + c_oil->cc.lastused); json_object_int_add(json_source, "PacketCount", c_oil->cc.pktcnt); + json_object_int_add(json_source, "packetCount", + c_oil->cc.pktcnt); json_object_int_add(json_source, "ByteCount", c_oil->cc.bytecnt); + json_object_int_add(json_source, "byteCount", + c_oil->cc.bytecnt); json_object_int_add(json_source, "WrongInterface", c_oil->cc.wrong_if); + json_object_int_add(json_source, + "wrongInterface", + c_oil->cc.wrong_if); } } else { vty_out(vty, "%-6d %-15s %-15s %-3s %-16s ", @@ -2203,13 +2247,10 @@ static void pim_show_state(struct pim_instance *pim, struct vty *vty, } - if (uj) { - vty_out(vty, "%s\n", json_object_to_json_string_ext( - json, JSON_C_TO_STRING_PRETTY)); - json_object_free(json); - } else { + if (uj) + vty_json(vty, json); + else vty_out(vty, "\n"); - } } static void pim_show_neighbors(struct pim_instance *pim, struct vty *vty, @@ -2287,11 +2328,8 @@ static void pim_show_neighbors(struct pim_instance *pim, struct vty *vty, } } - if (uj) { - vty_out(vty, "%s\n", json_object_to_json_string_ext( - json, JSON_C_TO_STRING_PRETTY)); - json_object_free(json); - } + if (uj) + vty_json(vty, json); } static void pim_show_neighbors_secondary(struct pim_instance *pim, @@ -2439,7 +2477,7 @@ static const char *pim_reg_state2brief_str(enum pim_reg_state reg_state, } static void pim_show_upstream(struct pim_instance *pim, struct vty *vty, - struct prefix_sg *sg, bool uj) + pim_sgaddr *sg, bool uj) { struct pim_upstream *up; time_t now; @@ -2456,8 +2494,6 @@ static void pim_show_upstream(struct pim_instance *pim, struct vty *vty, "Iif Source Group State Uptime JoinTimer RSTimer KATimer RefCnt\n"); frr_each (rb_pim_upstream, &pim->upstream_head, up) { - char src_str[INET_ADDRSTRLEN]; - char grp_str[INET_ADDRSTRLEN]; char uptime[10]; char join_timer[10]; char rs_timer[10]; @@ -2465,15 +2501,9 @@ static void pim_show_upstream(struct pim_instance *pim, struct vty *vty, char msdp_reg_timer[10]; char state_str[PIM_REG_STATE_STR_LEN]; - if (sg->grp.s_addr != INADDR_ANY - && sg->grp.s_addr != up->sg.grp.s_addr) - continue; - if (sg->src.s_addr != INADDR_ANY - && sg->src.s_addr != up->sg.src.s_addr) + if (!pim_sgaddr_match(up->sg, *sg)) continue; - pim_inet4_dump("<src?>", up->sg.src, src_str, sizeof(src_str)); - pim_inet4_dump("<grp?>", up->sg.grp, grp_str, sizeof(grp_str)); pim_time_uptime(uptime, sizeof(uptime), now - up->state_transition); pim_time_timer_to_hhmmss(join_timer, sizeof(join_timer), @@ -2486,9 +2516,9 @@ static void pim_show_upstream(struct pim_instance *pim, struct vty *vty, if (!up->t_join_timer && up->rpf.source_nexthop.interface) { struct pim_neighbor *nbr; - nbr = pim_neighbor_find( + nbr = pim_neighbor_find_prefix( up->rpf.source_nexthop.interface, - up->rpf.rpf_addr.u.prefix4); + &up->rpf.rpf_addr); if (nbr) pim_time_timer_to_hhmmss(join_timer, sizeof(join_timer), @@ -2514,6 +2544,14 @@ static void pim_show_upstream(struct pim_instance *pim, struct vty *vty, } if (uj) { + char grp_str[PIM_ADDRSTRLEN]; + char src_str[PIM_ADDRSTRLEN]; + + snprintfrr(grp_str, sizeof(grp_str), "%pPAs", + &up->sg.grp); + snprintfrr(src_str, sizeof(src_str), "%pPAs", + &up->sg.src); + json_object_object_get_ex(json, grp_str, &json_group); if (!json_group) { @@ -2537,8 +2575,8 @@ static void pim_show_upstream(struct pim_instance *pim, struct vty *vty, * we are the FHR, else we just put * the RP as the rpfAddress */ - if (up->flags & PIM_UPSTREAM_FLAG_MASK_FHR - || up->sg.src.s_addr == INADDR_ANY) { + if (up->flags & PIM_UPSTREAM_FLAG_MASK_FHR || + pim_addr_is_any(up->sg.src)) { char rpf[PREFIX_STRLEN]; struct pim_rpf *rpg; @@ -2577,20 +2615,17 @@ static void pim_show_upstream(struct pim_instance *pim, struct vty *vty, json_object_object_add(json_group, src_str, json_row); } else { vty_out(vty, - "%-16s%-15s %-15s %-11s %-8s %-9s %-9s %-9s %6d\n", + "%-16s%-15pPAs %-15pPAs %-11s %-8s %-9s %-9s %-9s %6d\n", up->rpf.source_nexthop.interface ? up->rpf.source_nexthop.interface->name : "Unknown", - src_str, grp_str, state_str, uptime, join_timer, - rs_timer, ka_timer, up->ref_count); + &up->sg.src, &up->sg.grp, state_str, uptime, + join_timer, rs_timer, ka_timer, up->ref_count); } } - if (uj) { - vty_out(vty, "%s\n", json_object_to_json_string_ext( - json, JSON_C_TO_STRING_PRETTY)); - json_object_free(json); - } + if (uj) + vty_json(vty, json); } static void pim_show_channel_helper(struct pim_instance *pim, @@ -2601,14 +2636,15 @@ static void pim_show_channel_helper(struct pim_instance *pim, { struct pim_upstream *up = ch->upstream; json_object *json_group = NULL; - char src_str[INET_ADDRSTRLEN]; - char grp_str[INET_ADDRSTRLEN]; json_object *json_row = NULL; - pim_inet4_dump("<src?>", up->sg.src, src_str, sizeof(src_str)); - pim_inet4_dump("<grp?>", up->sg.grp, grp_str, sizeof(grp_str)); - if (uj) { + char grp_str[PIM_ADDRSTRLEN]; + char src_str[PIM_ADDRSTRLEN]; + + snprintfrr(grp_str, sizeof(grp_str), "%pPAs", &up->sg.grp); + snprintfrr(src_str, sizeof(src_str), "%pPAs", &up->sg.src); + json_object_object_get_ex(json, grp_str, &json_group); if (!json_group) { @@ -2639,8 +2675,8 @@ static void pim_show_channel_helper(struct pim_instance *pim, json_object_object_add(json_group, src_str, json_row); } else { - vty_out(vty, "%-16s %-15s %-15s %-10s %-5s %-10s %-11s %-6s\n", - ch->interface->name, src_str, grp_str, + vty_out(vty, "%-16s %-15pPAs %-15pPAs %-10s %-5s %-10s %-11s %-6s\n", + ch->interface->name, &up->sg.src, &up->sg.grp, pim_macro_ch_lost_assert(ch) ? "yes" : "no", pim_macro_chisin_joins(ch) ? "yes" : "no", pim_macro_chisin_pim_include(ch) ? "yes" : "no", @@ -2681,11 +2717,8 @@ static void pim_show_channel(struct pim_instance *pim, struct vty *vty, } } - if (uj) { - vty_out(vty, "%s\n", json_object_to_json_string_ext( - json, JSON_C_TO_STRING_PRETTY)); - json_object_free(json); - } + if (uj) + vty_json(vty, json); } static void pim_show_join_desired_helper(struct pim_instance *pim, @@ -2694,14 +2727,15 @@ static void pim_show_join_desired_helper(struct pim_instance *pim, json_object *json, bool uj) { json_object *json_group = NULL; - char src_str[INET_ADDRSTRLEN]; - char grp_str[INET_ADDRSTRLEN]; json_object *json_row = NULL; - pim_inet4_dump("<src?>", up->sg.src, src_str, sizeof(src_str)); - pim_inet4_dump("<grp?>", up->sg.grp, grp_str, sizeof(grp_str)); - if (uj) { + char grp_str[PIM_ADDRSTRLEN]; + char src_str[PIM_ADDRSTRLEN]; + + snprintfrr(grp_str, sizeof(grp_str), "%pPAs", &up->sg.grp); + snprintfrr(src_str, sizeof(src_str), "%pPAs", &up->sg.src); + json_object_object_get_ex(json, grp_str, &json_group); if (!json_group) { @@ -2721,8 +2755,8 @@ static void pim_show_join_desired_helper(struct pim_instance *pim, json_object_object_add(json_group, src_str, json_row); } else { - vty_out(vty, "%-15s %-15s %-6s\n", - src_str, grp_str, + vty_out(vty, "%-15pPAs %-15pPAs %-6s\n", + &up->sg.src, &up->sg.grp, pim_upstream_evaluate_join_desired(pim, up) ? "yes" : "no"); } @@ -2747,11 +2781,8 @@ static void pim_show_join_desired(struct pim_instance *pim, struct vty *vty, json, uj); } - if (uj) { - vty_out(vty, "%s\n", json_object_to_json_string_ext( - json, JSON_C_TO_STRING_PRETTY)); - json_object_free(json); - } + if (uj) + vty_json(vty, json); } static void pim_show_upstream_rpf(struct pim_instance *pim, struct vty *vty, @@ -2769,8 +2800,6 @@ static void pim_show_upstream_rpf(struct pim_instance *pim, struct vty *vty, "Source Group RpfIface RibNextHop RpfAddress \n"); frr_each (rb_pim_upstream, &pim->upstream_head, up) { - char src_str[INET_ADDRSTRLEN]; - char grp_str[INET_ADDRSTRLEN]; char rpf_nexthop_str[PREFIX_STRLEN]; char rpf_addr_str[PREFIX_STRLEN]; struct pim_rpf *rpf; @@ -2778,8 +2807,6 @@ static void pim_show_upstream_rpf(struct pim_instance *pim, struct vty *vty, rpf = &up->rpf; - pim_inet4_dump("<src?>", up->sg.src, src_str, sizeof(src_str)); - pim_inet4_dump("<grp?>", up->sg.grp, grp_str, sizeof(grp_str)); pim_addr_dump("<nexthop?>", &rpf->source_nexthop.mrib_nexthop_addr, rpf_nexthop_str, sizeof(rpf_nexthop_str)); @@ -2789,6 +2816,14 @@ static void pim_show_upstream_rpf(struct pim_instance *pim, struct vty *vty, rpf_ifname = rpf->source_nexthop.interface ? rpf->source_nexthop.interface->name : "<ifname?>"; if (uj) { + char grp_str[PIM_ADDRSTRLEN]; + char src_str[PIM_ADDRSTRLEN]; + + snprintfrr(grp_str, sizeof(grp_str), "%pPAs", + &up->sg.grp); + snprintfrr(src_str, sizeof(src_str), "%pPAs", + &up->sg.src); + json_object_object_get_ex(json, grp_str, &json_group); if (!json_group) { @@ -2809,17 +2844,14 @@ static void pim_show_upstream_rpf(struct pim_instance *pim, struct vty *vty, rpf_addr_str); json_object_object_add(json_group, src_str, json_row); } else { - vty_out(vty, "%-15s %-15s %-16s %-15s %-15s\n", src_str, - grp_str, rpf_ifname, rpf_nexthop_str, - rpf_addr_str); + vty_out(vty, "%-15pPAs %-15pPAs %-16s %-15s %-15s\n", + &up->sg.src, &up->sg.grp, rpf_ifname, + rpf_nexthop_str, rpf_addr_str); } } - if (uj) { - vty_out(vty, "%s\n", json_object_to_json_string_ext( - json, JSON_C_TO_STRING_PRETTY)); - json_object_free(json); - } + if (uj) + vty_json(vty, json); } static void show_rpf_refresh_stats(struct vty *vty, struct pim_instance *pim, @@ -2906,15 +2938,11 @@ static void pim_show_rpf(struct pim_instance *pim, struct vty *vty, bool uj) } frr_each (rb_pim_upstream, &pim->upstream_head, up) { - char src_str[INET_ADDRSTRLEN]; - char grp_str[INET_ADDRSTRLEN]; char rpf_addr_str[PREFIX_STRLEN]; char rib_nexthop_str[PREFIX_STRLEN]; const char *rpf_ifname; struct pim_rpf *rpf = &up->rpf; - pim_inet4_dump("<src?>", up->sg.src, src_str, sizeof(src_str)); - pim_inet4_dump("<grp?>", up->sg.grp, grp_str, sizeof(grp_str)); pim_addr_dump("<rpf?>", &rpf->rpf_addr, rpf_addr_str, sizeof(rpf_addr_str)); pim_addr_dump("<nexthop?>", @@ -2924,6 +2952,14 @@ static void pim_show_rpf(struct pim_instance *pim, struct vty *vty, bool uj) rpf_ifname = rpf->source_nexthop.interface ? rpf->source_nexthop.interface->name : "<ifname?>"; if (uj) { + char grp_str[PIM_ADDRSTRLEN]; + char src_str[PIM_ADDRSTRLEN]; + + snprintfrr(grp_str, sizeof(grp_str), "%pPAs", + &up->sg.grp); + snprintfrr(src_str, sizeof(src_str), "%pPAs", + &up->sg.src); + json_object_object_get_ex(json, grp_str, &json_group); if (!json_group) { @@ -2950,19 +2986,16 @@ static void pim_show_rpf(struct pim_instance *pim, struct vty *vty, bool uj) json_object_object_add(json_group, src_str, json_row); } else { - vty_out(vty, "%-15s %-15s %-16s %-15s %-15s %6d %4d\n", - src_str, grp_str, rpf_ifname, rpf_addr_str, - rib_nexthop_str, + vty_out(vty, "%-15pPAs %-15pPAs %-16s %-15s %-15s %6d %4d\n", + &up->sg.src, &up->sg.grp, rpf_ifname, + rpf_addr_str, rib_nexthop_str, rpf->source_nexthop.mrib_route_metric, rpf->source_nexthop.mrib_metric_preference); } } - if (uj) { - vty_out(vty, "%s\n", json_object_to_json_string_ext( - json, JSON_C_TO_STRING_PRETTY)); - json_object_free(json); - } + if (uj) + vty_json(vty, json); } struct pnc_cache_walk_data { @@ -3159,11 +3192,8 @@ static void pim_show_bsm_db(struct pim_instance *pim, struct vty *vty, bool uj) fragment++; } - if (uj) { - vty_out(vty, "%s\n", json_object_to_json_string_ext( - json, JSON_C_TO_STRING_PRETTY)); - json_object_free(json); - } + if (uj) + vty_json(vty, json); } /*Display the group-rp mappings */ @@ -3291,11 +3321,8 @@ static void pim_show_group_rp_mappings_info(struct pim_instance *pim, vty_out(vty, "\n"); } - if (uj) { - vty_out(vty, "%s\n", json_object_to_json_string_ext( - json, JSON_C_TO_STRING_PRETTY)); - json_object_free(json); - } + if (uj) + vty_json(vty, json); } /* pim statistics - just adding only bsm related now. @@ -3366,11 +3393,8 @@ static void pim_show_statistics(struct pim_instance *pim, struct vty *vty, vty_out(vty, "\n"); } - if (uj) { - vty_out(vty, "%s\n", json_object_to_json_string_ext( - json, JSON_C_TO_STRING_PRETTY)); - json_object_free(json); - } + if (uj) + vty_json(vty, json); } static void clear_pim_statistics(struct pim_instance *pim) @@ -3423,13 +3447,13 @@ static void igmp_show_groups(struct pim_instance *pim, struct vty *vty, bool uj) FOR_ALL_INTERFACES (pim->vrf, ifp) { struct pim_interface *pim_ifp = ifp->info; struct listnode *grpnode; - struct igmp_group *grp; + struct gm_group *grp; if (!pim_ifp) continue; /* scan igmp groups */ - for (ALL_LIST_ELEMENTS_RO(pim_ifp->igmp_group_list, grpnode, + for (ALL_LIST_ELEMENTS_RO(pim_ifp->gm_group_list, grpnode, grp)) { char group_str[INET_ADDRSTRLEN]; char hhmmss[10]; @@ -3498,11 +3522,8 @@ static void igmp_show_groups(struct pim_instance *pim, struct vty *vty, bool uj) } /* scan igmp groups */ } /* scan interfaces */ - if (uj) { - vty_out(vty, "%s\n", json_object_to_json_string_ext( - json, JSON_C_TO_STRING_PRETTY)); - json_object_free(json); - } + if (uj) + vty_json(vty, json); } static void igmp_show_group_retransmission(struct pim_instance *pim, @@ -3517,18 +3538,18 @@ static void igmp_show_group_retransmission(struct pim_instance *pim, FOR_ALL_INTERFACES (pim->vrf, ifp) { struct pim_interface *pim_ifp = ifp->info; struct listnode *grpnode; - struct igmp_group *grp; + struct gm_group *grp; if (!pim_ifp) continue; /* scan igmp groups */ - for (ALL_LIST_ELEMENTS_RO(pim_ifp->igmp_group_list, grpnode, + for (ALL_LIST_ELEMENTS_RO(pim_ifp->gm_group_list, grpnode, grp)) { char group_str[INET_ADDRSTRLEN]; char grp_retr_mmss[10]; struct listnode *src_node; - struct igmp_source *src; + struct gm_source *src; int grp_retr_sources = 0; pim_inet4_dump("<group?>", grp->group_addr, group_str, @@ -3556,31 +3577,40 @@ static void igmp_show_group_retransmission(struct pim_instance *pim, } /* scan interfaces */ } -static void igmp_show_sources(struct pim_instance *pim, struct vty *vty) +static void igmp_show_sources(struct pim_instance *pim, struct vty *vty, + bool uj) { struct interface *ifp; time_t now; + json_object *json = NULL; + json_object *json_iface = NULL; + json_object *json_group = NULL; + json_object *json_source = NULL; + json_object *json_sources = NULL; now = pim_time_monotonic_sec(); - vty_out(vty, - "Interface Group Source Timer Fwd Uptime \n"); + if (uj) + json = json_object_new_object(); + else + vty_out(vty, + "Interface Address Group Source Timer Fwd Uptime \n"); /* scan interfaces */ FOR_ALL_INTERFACES (pim->vrf, ifp) { struct pim_interface *pim_ifp = ifp->info; struct listnode *grpnode; - struct igmp_group *grp; + struct gm_group *grp; if (!pim_ifp) continue; /* scan igmp groups */ - for (ALL_LIST_ELEMENTS_RO(pim_ifp->igmp_group_list, grpnode, + for (ALL_LIST_ELEMENTS_RO(pim_ifp->gm_group_list, grpnode, grp)) { char group_str[INET_ADDRSTRLEN]; struct listnode *srcnode; - struct igmp_source *src; + struct gm_source *src; pim_inet4_dump("<group?>", grp->group_addr, group_str, sizeof(group_str)); @@ -3601,17 +3631,70 @@ static void igmp_show_sources(struct pim_instance *pim, struct vty *vty) pim_time_uptime(uptime, sizeof(uptime), now - src->source_creation); - vty_out(vty, "%-16s %-15s %-15s %5s %3s %8s\n", - ifp->name, group_str, source_str, mmss, - IGMP_SOURCE_TEST_FORWARDING( - src->source_flags) - ? "Y" - : "N", - uptime); + if (uj) { + json_object_object_get_ex( + json, ifp->name, &json_iface); + if (!json_iface) { + json_iface = + json_object_new_object(); + json_object_string_add( + json_iface, "name", + ifp->name); + json_object_object_add( + json, ifp->name, + json_iface); + } + json_object_object_get_ex(json_iface, + group_str, + &json_group); + + if (!json_group) { + json_group = + json_object_new_object(); + json_object_string_add( + json_group, "group", + group_str); + json_object_object_add( + json_iface, group_str, + json_group); + json_sources = + json_object_new_array(); + json_object_object_add( + json_group, "sources", + json_sources); + } + json_source = json_object_new_object(); + json_object_string_add(json_source, + "source", + source_str); + json_object_string_add(json_source, + "timer", mmss); + json_object_boolean_add( + json_source, "forwarded", + IGMP_SOURCE_TEST_FORWARDING( + src->source_flags)); + json_object_string_add( + json_source, "uptime", uptime); + json_object_array_add(json_sources, + json_source); + + } else { + vty_out(vty, + "%-16s %-15s %-15s %5s %3s %8s\n", + ifp->name, group_str, + source_str, mmss, + IGMP_SOURCE_TEST_FORWARDING( + src->source_flags) + ? "Y" + : "N", + uptime); + } } /* scan group sources */ - } /* scan igmp groups */ + } /* scan igmp groups */ } /* scan interfaces */ + if (uj) + vty_json(vty, json); } static void igmp_show_source_retransmission(struct pim_instance *pim, @@ -3626,17 +3709,17 @@ static void igmp_show_source_retransmission(struct pim_instance *pim, FOR_ALL_INTERFACES (pim->vrf, ifp) { struct pim_interface *pim_ifp = ifp->info; struct listnode *grpnode; - struct igmp_group *grp; + struct gm_group *grp; if (!pim_ifp) continue; /* scan igmp groups */ - for (ALL_LIST_ELEMENTS_RO(pim_ifp->igmp_group_list, grpnode, + for (ALL_LIST_ELEMENTS_RO(pim_ifp->gm_group_list, grpnode, grp)) { char group_str[INET_ADDRSTRLEN]; struct listnode *srcnode; - struct igmp_source *src; + struct gm_source *src; pim_inet4_dump("<group?>", grp->group_addr, group_str, sizeof(group_str)); @@ -3654,7 +3737,7 @@ static void igmp_show_source_retransmission(struct pim_instance *pim, src->source_query_retransmit_count); } /* scan group sources */ - } /* scan igmp groups */ + } /* scan igmp groups */ } /* scan interfaces */ } @@ -3726,11 +3809,8 @@ static void pim_show_bsr(struct pim_instance *pim, vty_out(vty, "Last BSM seen: %s\n", last_bsm_seen); } - if (uj) { - vty_out(vty, "%s\n", json_object_to_json_string_ext( - json, JSON_C_TO_STRING_PRETTY)); - json_object_free(json); - } + if (uj) + vty_json(vty, json); } static void clear_igmp_interfaces(struct pim_instance *pim) @@ -3770,31 +3850,6 @@ static void clear_interfaces(struct pim_instance *pim) } /** - * Get current node VRF name. - * - * NOTE: - * In case of failure it will print error message to user. - * - * \returns name or NULL if failed to get VRF. - */ -static const char *pim_cli_get_vrf_name(struct vty *vty) -{ - const struct lyd_node *vrf_node; - - /* Not inside any VRF context. */ - if (vty->xpath_index == 0) - return VRF_DEFAULT_NAME; - - vrf_node = yang_dnode_get(vty->candidate_config->dnode, VTY_CURR_XPATH); - if (vrf_node == NULL) { - vty_out(vty, "%% Failed to get vrf dnode in configuration\n"); - return NULL; - } - - return yang_dnode_get_string(vrf_node, "./name"); -} - -/** * Compatibility function to keep the legacy mesh group CLI behavior: * Delete group when there are no more configurations in it. * @@ -3815,7 +3870,7 @@ static void pim_cli_legacy_mesh_group_behavior(struct vty *vty, /* Get mesh group base XPath. */ snprintf(xpath_value, sizeof(xpath_value), - FRR_PIM_AF_XPATH "/msdp-mesh-groups[name='%s']", + FRR_PIM_VRF_XPATH "/msdp-mesh-groups[name='%s']", "frr-pim:pimd", "pim", vrfname, "frr-routing:ipv4", gname); /* Group must exists, otherwise just quit. */ if (!yang_dnode_exists(vty->candidate_config->dnode, xpath_value)) @@ -3908,7 +3963,6 @@ static void clear_mroute(struct pim_instance *pim) /* scan interfaces */ FOR_ALL_INTERFACES (pim->vrf, ifp) { struct pim_interface *pim_ifp = ifp->info; - struct igmp_group *grp; struct pim_ifchannel *ch; if (!pim_ifp) @@ -3921,14 +3975,17 @@ static void clear_mroute(struct pim_instance *pim) pim_ifchannel_delete(ch); } +#if PIM_IPV == 4 /* clean up all igmp groups */ + struct gm_group *grp; - if (pim_ifp->igmp_group_list) { - while (pim_ifp->igmp_group_list->count) { - grp = listnode_head(pim_ifp->igmp_group_list); + if (pim_ifp->gm_group_list) { + while (pim_ifp->gm_group_list->count) { + grp = listnode_head(pim_ifp->gm_group_list); igmp_group_delete(grp); } } +#endif } /* clean up all upstreams*/ @@ -4014,6 +4071,9 @@ DEFUN (clear_ip_pim_interface_traffic, pim_ifp->pim_ifstat_assert_send = 0; pim_ifp->pim_ifstat_bsm_rx = 0; pim_ifp->pim_ifstat_bsm_tx = 0; + pim_ifp->igmp_ifstat_joins_sent = 0; + pim_ifp->igmp_ifstat_joins_failed = 0; + pim_ifp->igmp_peak_group_count = 0; } return CMD_SUCCESS; @@ -4258,12 +4318,13 @@ DEFUN (show_ip_igmp_groups_retransmissions, DEFUN (show_ip_igmp_sources, show_ip_igmp_sources_cmd, - "show ip igmp [vrf NAME] sources", + "show ip igmp [vrf NAME] sources [json]", SHOW_STR IP_STR IGMP_STR VRF_CMD_HELP_STR - IGMP_SOURCE_STR) + IGMP_SOURCE_STR + JSON_STR) { int idx = 2; struct vrf *vrf = pim_cmd_lookup_vrf(vty, argv, argc, &idx); @@ -4271,7 +4332,7 @@ DEFUN (show_ip_igmp_sources, if (!vrf) return CMD_WARNING; - igmp_show_sources(vrf->info, vty); + igmp_show_sources(vrf->info, vty, use_json(argc, argv)); return CMD_SUCCESS; } @@ -4386,9 +4447,7 @@ DEFUN (show_ip_pim_mlag_summary, router->mlag_stats.msg.vxlan_updates); json_object_object_add(json, "connStats", json_stat); - vty_out(vty, "%s\n", json_object_to_json_string_ext( - json, JSON_C_TO_STRING_PRETTY)); - json_object_free(json); + vty_json(vty, json); return CMD_SUCCESS; } @@ -4603,7 +4662,7 @@ DEFPY (show_ip_pim_join, "The Group\n" JSON_STR) { - struct prefix_sg sg = {0}; + pim_sgaddr sg = {0}; struct vrf *v; bool uj = !!json; struct pim_instance *pim; @@ -4644,7 +4703,7 @@ DEFUN (show_ip_pim_join_vrf_all, "PIM interface join information\n" JSON_STR) { - struct prefix_sg sg = {0}; + pim_sgaddr sg = {0}; bool uj = use_json(argc, argv); struct vrf *vrf; bool first = true; @@ -4673,18 +4732,13 @@ static void pim_show_jp_agg_helper(struct vty *vty, struct pim_upstream *up, int is_join) { - char src_str[INET_ADDRSTRLEN]; - char grp_str[INET_ADDRSTRLEN]; char rpf_str[INET_ADDRSTRLEN]; - pim_inet4_dump("<src?>", up->sg.src, src_str, sizeof(src_str)); - pim_inet4_dump("<grp?>", up->sg.grp, grp_str, sizeof(grp_str)); /* pius->address.s_addr */ pim_inet4_dump("<rpf?>", neigh->source_addr, rpf_str, sizeof(rpf_str)); - vty_out(vty, "%-16s %-15s %-15s %-15s %5s\n", - ifp->name, rpf_str, src_str, - grp_str, is_join?"J":"P"); + vty_out(vty, "%-16s %-15s %-15pPAs %-15pPAs %5s\n", ifp->name, rpf_str, + &up->sg.src, &up->sg.grp, is_join ? "J" : "P"); } static void pim_show_jp_agg_list(struct pim_instance *pim, struct vty *vty) @@ -4842,8 +4896,8 @@ static void pim_show_mlag_up_detail(struct vrf *vrf, struct vty *vty, const char *src_or_group, const char *group, bool uj) { - char src_str[INET_ADDRSTRLEN]; - char grp_str[INET_ADDRSTRLEN]; + char src_str[PIM_ADDRSTRLEN]; + char grp_str[PIM_ADDRSTRLEN]; struct pim_upstream *up; struct pim_instance *pim = vrf->info; json_object *json = NULL; @@ -4860,8 +4914,9 @@ static void pim_show_mlag_up_detail(struct vrf *vrf, && !pim_up_mlag_is_local(up)) continue; - pim_inet4_dump("<src?>", up->sg.src, src_str, sizeof(src_str)); - pim_inet4_dump("<grp?>", up->sg.grp, grp_str, sizeof(grp_str)); + snprintfrr(grp_str, sizeof(grp_str), "%pPAs", &up->sg.grp); + snprintfrr(src_str, sizeof(src_str), "%pPAs", &up->sg.src); + /* XXX: strcmps are clearly inefficient. we should do uint comps * here instead. */ @@ -4878,11 +4933,8 @@ static void pim_show_mlag_up_detail(struct vrf *vrf, src_str, grp_str, json); } - if (uj) { - vty_out(vty, "%s\n", json_object_to_json_string_ext( - json, JSON_C_TO_STRING_PRETTY)); - json_object_free(json); - } + if (uj) + vty_json(vty, json); } static void pim_show_mlag_up_vrf(struct vrf *vrf, struct vty *vty, bool uj) @@ -4890,8 +4942,6 @@ static void pim_show_mlag_up_vrf(struct vrf *vrf, struct vty *vty, bool uj) json_object *json = NULL; json_object *json_row; struct pim_upstream *up; - char src_str[INET_ADDRSTRLEN]; - char grp_str[INET_ADDRSTRLEN]; struct pim_instance *pim = vrf->info; json_object *json_group = NULL; @@ -4907,11 +4957,16 @@ static void pim_show_mlag_up_vrf(struct vrf *vrf, struct vty *vty, bool uj) && !(up->flags & PIM_UPSTREAM_FLAG_MASK_MLAG_INTERFACE) && !pim_up_mlag_is_local(up)) continue; - pim_inet4_dump("<src?>", up->sg.src, src_str, sizeof(src_str)); - pim_inet4_dump("<grp?>", up->sg.grp, grp_str, sizeof(grp_str)); if (uj) { + char src_str[PIM_ADDRSTRLEN]; + char grp_str[PIM_ADDRSTRLEN]; json_object *own_list = NULL; + snprintfrr(grp_str, sizeof(grp_str), "%pPAs", + &up->sg.grp); + snprintfrr(src_str, sizeof(src_str), "%pPAs", + &up->sg.src); + json_object_object_get_ex(json, grp_str, &json_group); if (!json_group) { json_group = json_object_new_object(); @@ -4958,19 +5013,16 @@ static void pim_show_mlag_up_vrf(struct vrf *vrf, struct vty *vty, bool uj) if (up->flags & (PIM_UPSTREAM_FLAG_MASK_MLAG_INTERFACE)) strlcat(own_str, "I", sizeof(own_str)); vty_out(vty, - "%-15s %-15s %-6s %-11u %-10u %2s\n", - src_str, grp_str, own_str, + "%-15pPAs %-15pPAs %-6s %-11u %-10u %2s\n", + &up->sg.src, &up->sg.grp, own_str, pim_up_mlag_local_cost(up), pim_up_mlag_peer_cost(up), PIM_UPSTREAM_FLAG_TEST_MLAG_NON_DF(up->flags) ? "n" : "y"); } } - if (uj) { - vty_out(vty, "%s\n", json_object_to_json_string_ext( - json, JSON_C_TO_STRING_PRETTY)); - json_object_free(json); - } + if (uj) + vty_json(vty, json); } static void pim_show_mlag_help_string(struct vty *vty, bool uj) @@ -5223,7 +5275,7 @@ DEFPY (show_ip_pim_upstream, "The Group\n" JSON_STR) { - struct prefix_sg sg = {0}; + pim_sgaddr sg = {0}; struct vrf *v; bool uj = !!json; struct pim_instance *pim; @@ -5263,7 +5315,7 @@ DEFUN (show_ip_pim_upstream_vrf_all, "PIM upstream information\n" JSON_STR) { - struct prefix_sg sg = {0}; + pim_sgaddr sg = {0}; bool uj = use_json(argc, argv); struct vrf *vrf; bool first = true; @@ -5352,39 +5404,56 @@ DEFUN (show_ip_pim_upstream_rpf, DEFUN (show_ip_pim_rp, show_ip_pim_rp_cmd, - "show ip pim [vrf NAME] rp-info [json]", + "show ip pim [vrf NAME] rp-info [A.B.C.D/M] [json]", SHOW_STR IP_STR PIM_STR VRF_CMD_HELP_STR "PIM RP information\n" + "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 prefix *range = NULL; if (!vrf) return CMD_WARNING; - pim_rp_show_information(vrf->info, vty, uj); + if (argv_find(argv, argc, "A.B.C.D/M", &idx)) { + range = prefix_new(); + (void)str2prefix(argv[idx]->arg, range); + apply_mask(range); + } + + pim_rp_show_information(vrf->info, range, vty, uj); return CMD_SUCCESS; } DEFUN (show_ip_pim_rp_vrf_all, show_ip_pim_rp_vrf_all_cmd, - "show ip pim vrf all rp-info [json]", + "show ip pim vrf all rp-info [A.B.C.D/M] [json]", SHOW_STR IP_STR PIM_STR VRF_CMD_HELP_STR "PIM RP information\n" + "Multicast Group range\n" JSON_STR) { + int idx = 0; bool uj = use_json(argc, argv); struct vrf *vrf; bool first = true; + struct prefix *range = NULL; + + if (argv_find(argv, argc, "A.B.C.D/M", &idx)) { + range = prefix_new(); + (void)str2prefix(argv[idx]->arg, range); + apply_mask(range); + } if (uj) vty_out(vty, "{ "); @@ -5396,7 +5465,7 @@ DEFUN (show_ip_pim_rp_vrf_all, first = false; } else vty_out(vty, "VRF: %s\n", vrf->name); - pim_rp_show_information(vrf->info, vty, uj); + pim_rp_show_information(vrf->info, range, vty, uj); } if (uj) vty_out(vty, "}\n"); @@ -5730,12 +5799,8 @@ static void show_multicast_interfaces(struct pim_instance *pim, struct vty *vty, } } - if (uj) { - vty_out(vty, "%s\n", - json_object_to_json_string_ext( - json, JSON_C_TO_STRING_PRETTY)); - json_object_free(json); - } + if (uj) + vty_json(vty, json); } static void pim_cmd_show_ip_multicast_helper(struct pim_instance *pim, @@ -5888,7 +5953,7 @@ DEFUN(show_ip_multicast_count_vrf_all, } static void show_mroute(struct pim_instance *pim, struct vty *vty, - struct prefix_sg *sg, bool fill, bool uj) + pim_sgaddr *sg, bool fill, bool uj) { struct listnode *node; struct channel_oil *c_oil; @@ -5931,11 +5996,11 @@ static void show_mroute(struct pim_instance *pim, struct vty *vty, if (!c_oil->installed) continue; - if (sg->grp.s_addr != INADDR_ANY - && sg->grp.s_addr != c_oil->oil.mfcc_mcastgrp.s_addr) + if (!pim_addr_is_any(sg->grp) && + pim_addr_cmp(sg->grp, c_oil->oil.mfcc_mcastgrp)) continue; - if (sg->src.s_addr != INADDR_ANY - && sg->src.s_addr != c_oil->oil.mfcc_origin.s_addr) + if (!pim_addr_is_any(sg->src) && + pim_addr_cmp(sg->src, c_oil->oil.mfcc_origin)) continue; pim_inet4_dump("<group?>", c_oil->oil.mfcc_mcastgrp, grp_str, @@ -5995,6 +6060,10 @@ static void show_mroute(struct pim_instance *pim, struct vty *vty, /* Find the inbound interface nested under the source, * create it if it doesn't exist */ + json_object_string_add(json_source, "source", + src_str); + json_object_string_add(json_source, "group", + grp_str); json_object_int_add(json_source, "installed", c_oil->installed); json_object_int_add(json_source, "refCount", @@ -6003,6 +6072,8 @@ static void show_mroute(struct pim_instance *pim, struct vty *vty, c_oil->oil_size); json_object_int_add(json_source, "OilInheritedRescan", c_oil->oil_inherited_rescan); + json_object_int_add(json_source, "oilInheritedRescan", + c_oil->oil_inherited_rescan); json_object_string_add(json_source, "iif", in_ifname); json_object_string_add(json_source, "upTime", mroute_uptime); @@ -6254,11 +6325,8 @@ static void show_mroute(struct pim_instance *pim, struct vty *vty, } } - if (uj) { - vty_out(vty, "%s\n", json_object_to_json_string_ext( - json, JSON_C_TO_STRING_PRETTY)); - json_object_free(json); - } + if (uj) + vty_json(vty, json); } DEFPY (show_ip_mroute, @@ -6273,7 +6341,7 @@ DEFPY (show_ip_mroute, "Fill in Assumed data\n" JSON_STR) { - struct prefix_sg sg = {0}; + pim_sgaddr sg = {0}; struct pim_instance *pim; struct vrf *v; @@ -6311,7 +6379,7 @@ DEFUN (show_ip_mroute_vrf_all, "Fill in Assumed data\n" JSON_STR) { - struct prefix_sg sg = {0}; + pim_sgaddr sg = {0}; bool uj = use_json(argc, argv); int idx = 4; struct vrf *vrf; @@ -6450,12 +6518,8 @@ static void show_mroute_count(struct pim_instance *pim, struct vty *vty, for (ALL_LIST_ELEMENTS_RO(pim->static_routes, node, sr)) show_mroute_count_per_channel_oil(&sr->c_oil, json, vty); - if (uj) { - vty_out(vty, "%s\n", - json_object_to_json_string_ext( - json, JSON_C_TO_STRING_PRETTY)); - json_object_free(json); - } + if (uj) + vty_json(vty, json); } DEFUN (show_ip_mroute_count, @@ -6615,12 +6679,8 @@ DEFUN (show_ip_mroute_summary, show_mroute_summary(vrf->info, vty, json); - if (uj) { - vty_out(vty, "%s\n", - json_object_to_json_string_ext( - json, JSON_C_TO_STRING_PRETTY)); - json_object_free(json); - } + if (uj) + vty_json(vty, json); return CMD_SUCCESS; } @@ -6654,12 +6714,8 @@ DEFUN (show_ip_mroute_summary_vrf_all, json_object_object_add(json, vrf->name, json_vrf); } - if (uj) { - vty_out(vty, "%s\n", - json_object_to_json_string_ext( - json, JSON_C_TO_STRING_PRETTY)); - json_object_free(json); - } + if (uj) + vty_json(vty, json); return CMD_SUCCESS; } @@ -6782,38 +6838,12 @@ DEFUN (ip_pim_spt_switchover_infinity, "SPT-Switchover\n" "Never switch to SPT Tree\n") { - const char *vrfname; - char spt_plist_xpath[XPATH_MAXLEN]; - char spt_action_xpath[XPATH_MAXLEN]; - - vrfname = pim_cli_get_vrf_name(vty); - if (vrfname == NULL) - return CMD_WARNING_CONFIG_FAILED; - - snprintf(spt_plist_xpath, sizeof(spt_plist_xpath), - FRR_PIM_AF_XPATH, "frr-pim:pimd", "pim", vrfname, - "frr-routing:ipv4"); - strlcat(spt_plist_xpath, "/spt-switchover/spt-infinity-prefix-list", - sizeof(spt_plist_xpath)); - - snprintf(spt_action_xpath, sizeof(spt_action_xpath), - FRR_PIM_AF_XPATH, "frr-pim:pimd", "pim", vrfname, - "frr-routing:ipv4"); - strlcat(spt_action_xpath, "/spt-switchover/spt-action", - sizeof(spt_action_xpath)); - - if (yang_dnode_exists(vty->candidate_config->dnode, spt_plist_xpath)) - nb_cli_enqueue_change(vty, spt_plist_xpath, NB_OP_DESTROY, - NULL); - nb_cli_enqueue_change(vty, spt_action_xpath, NB_OP_MODIFY, - "PIM_SPT_INFINITY"); - - return nb_cli_apply_changes(vty, NULL); + return pim_process_spt_switchover_infinity_cmd(vty); } -DEFUN (ip_pim_spt_switchover_infinity_plist, +DEFPY (ip_pim_spt_switchover_infinity_plist, ip_pim_spt_switchover_infinity_plist_cmd, - "ip pim spt-switchover infinity-and-beyond prefix-list WORD", + "ip pim spt-switchover infinity-and-beyond prefix-list WORD$plist", IP_STR PIM_STR "SPT-Switchover\n" @@ -6821,32 +6851,7 @@ DEFUN (ip_pim_spt_switchover_infinity_plist, "Prefix-List to control which groups to switch\n" "Prefix-List name\n") { - const char *vrfname; - char spt_plist_xpath[XPATH_MAXLEN]; - char spt_action_xpath[XPATH_MAXLEN]; - - vrfname = pim_cli_get_vrf_name(vty); - if (vrfname == NULL) - return CMD_WARNING_CONFIG_FAILED; - - snprintf(spt_plist_xpath, sizeof(spt_plist_xpath), - FRR_PIM_AF_XPATH, "frr-pim:pimd", "pim", vrfname, - "frr-routing:ipv4"); - strlcat(spt_plist_xpath, "/spt-switchover/spt-infinity-prefix-list", - sizeof(spt_plist_xpath)); - - snprintf(spt_action_xpath, sizeof(spt_action_xpath), - FRR_PIM_AF_XPATH, "frr-pim:pimd", "pim", vrfname, - "frr-routing:ipv4"); - strlcat(spt_action_xpath, "/spt-switchover/spt-action", - sizeof(spt_action_xpath)); - - nb_cli_enqueue_change(vty, spt_action_xpath, NB_OP_MODIFY, - "PIM_SPT_INFINITY"); - nb_cli_enqueue_change(vty, spt_plist_xpath, NB_OP_MODIFY, - argv[5]->arg); - - return nb_cli_apply_changes(vty, NULL); + return pim_process_spt_switchover_prefixlist_cmd(vty, plist); } DEFUN (no_ip_pim_spt_switchover_infinity, @@ -6858,31 +6863,7 @@ DEFUN (no_ip_pim_spt_switchover_infinity, "SPT_Switchover\n" "Never switch to SPT Tree\n") { - const char *vrfname; - char spt_plist_xpath[XPATH_MAXLEN]; - char spt_action_xpath[XPATH_MAXLEN]; - - vrfname = pim_cli_get_vrf_name(vty); - if (vrfname == NULL) - return CMD_WARNING_CONFIG_FAILED; - - snprintf(spt_plist_xpath, sizeof(spt_plist_xpath), - FRR_PIM_AF_XPATH, "frr-pim:pimd", "pim", vrfname, - "frr-routing:ipv4"); - strlcat(spt_plist_xpath, "/spt-switchover/spt-infinity-prefix-list", - sizeof(spt_plist_xpath)); - - snprintf(spt_action_xpath, sizeof(spt_action_xpath), - FRR_PIM_AF_XPATH, "frr-pim:pimd", "pim", vrfname, - "frr-routing:ipv4"); - strlcat(spt_action_xpath, "/spt-switchover/spt-action", - sizeof(spt_action_xpath)); - - nb_cli_enqueue_change(vty, spt_plist_xpath, NB_OP_DESTROY, NULL); - nb_cli_enqueue_change(vty, spt_action_xpath, NB_OP_MODIFY, - "PIM_SPT_IMMEDIATE"); - - return nb_cli_apply_changes(vty, NULL); + return pim_process_no_spt_switchover_cmd(vty); } DEFUN (no_ip_pim_spt_switchover_infinity_plist, @@ -6896,31 +6877,7 @@ DEFUN (no_ip_pim_spt_switchover_infinity_plist, "Prefix-List to control which groups to switch\n" "Prefix-List name\n") { - const char *vrfname; - char spt_plist_xpath[XPATH_MAXLEN]; - char spt_action_xpath[XPATH_MAXLEN]; - - vrfname = pim_cli_get_vrf_name(vty); - if (vrfname == NULL) - return CMD_WARNING_CONFIG_FAILED; - - snprintf(spt_plist_xpath, sizeof(spt_plist_xpath), - FRR_PIM_AF_XPATH, "frr-pim:pimd", "pim", vrfname, - "frr-routing:ipv4"); - strlcat(spt_plist_xpath, "/spt-switchover/spt-infinity-prefix-list", - sizeof(spt_plist_xpath)); - - snprintf(spt_action_xpath, sizeof(spt_action_xpath), - FRR_PIM_AF_XPATH, "frr-pim:pimd", "pim", vrfname, - "frr-routing:ipv4"); - strlcat(spt_action_xpath, "/spt-switchover/spt-action", - sizeof(spt_action_xpath)); - - nb_cli_enqueue_change(vty, spt_plist_xpath, NB_OP_DESTROY, NULL); - nb_cli_enqueue_change(vty, spt_action_xpath, NB_OP_MODIFY, - "PIM_SPT_IMMEDIATE"); - - return nb_cli_apply_changes(vty, NULL); + return pim_process_no_spt_switchover_cmd(vty); } DEFPY (pim_register_accept_list, @@ -6940,7 +6897,7 @@ DEFPY (pim_register_accept_list, return CMD_WARNING_CONFIG_FAILED; snprintf(reg_alist_xpath, sizeof(reg_alist_xpath), - FRR_PIM_AF_XPATH, "frr-pim:pimd", "pim", vrfname, + FRR_PIM_VRF_XPATH, "frr-pim:pimd", "pim", vrfname, "frr-routing:ipv4"); strlcat(reg_alist_xpath, "/register-accept-list", sizeof(reg_alist_xpath)); @@ -6955,18 +6912,15 @@ DEFPY (pim_register_accept_list, return nb_cli_apply_changes(vty, NULL); } -DEFUN (ip_pim_joinprune_time, +DEFPY (ip_pim_joinprune_time, ip_pim_joinprune_time_cmd, - "ip pim join-prune-interval (1-65535)", + "ip pim join-prune-interval (1-65535)$jpi", IP_STR "pim multicast routing\n" "Join Prune Send Interval\n" "Seconds\n") { - nb_cli_enqueue_change(vty, "/frr-pim:pim/join-prune-interval", - NB_OP_MODIFY, argv[3]->arg); - - return nb_cli_apply_changes(vty, NULL); + return pim_process_join_prune_cmd(vty, jpi_str); } DEFUN (no_ip_pim_joinprune_time, @@ -6978,24 +6932,18 @@ DEFUN (no_ip_pim_joinprune_time, "Join Prune Send Interval\n" IGNORED_IN_NO_STR) { - nb_cli_enqueue_change(vty, "/frr-pim:pim/join-prune-interval", - NB_OP_DESTROY, NULL); - - return nb_cli_apply_changes(vty, NULL); + return pim_process_no_join_prune_cmd(vty); } -DEFUN (ip_pim_register_suppress, +DEFPY (ip_pim_register_suppress, ip_pim_register_suppress_cmd, - "ip pim register-suppress-time (1-65535)", + "ip pim register-suppress-time (1-65535)$rst", IP_STR "pim multicast routing\n" "Register Suppress Timer\n" "Seconds\n") { - nb_cli_enqueue_change(vty, "/frr-pim:pim/register-suppress-time", - NB_OP_MODIFY, argv[3]->arg); - - return nb_cli_apply_changes(vty, NULL); + return pim_process_register_suppress_cmd(vty, rst_str); } DEFUN (no_ip_pim_register_suppress, @@ -7007,37 +6955,19 @@ DEFUN (no_ip_pim_register_suppress, "Register Suppress Timer\n" IGNORED_IN_NO_STR) { - nb_cli_enqueue_change(vty, "/frr-pim:pim/register-suppress-time", - NB_OP_DESTROY, NULL); - - return nb_cli_apply_changes(vty, NULL); + return pim_process_no_register_suppress_cmd(vty); } -DEFUN (ip_pim_rp_keep_alive, +DEFPY (ip_pim_rp_keep_alive, ip_pim_rp_keep_alive_cmd, - "ip pim rp keep-alive-timer (1-65535)", + "ip pim rp keep-alive-timer (1-65535)$kat", IP_STR "pim multicast routing\n" "Rendevous Point\n" "Keep alive Timer\n" "Seconds\n") { - const char *vrfname; - char rp_ka_timer_xpath[XPATH_MAXLEN]; - - vrfname = pim_cli_get_vrf_name(vty); - if (vrfname == NULL) - return CMD_WARNING_CONFIG_FAILED; - - snprintf(rp_ka_timer_xpath, sizeof(rp_ka_timer_xpath), - FRR_PIM_XPATH, "frr-pim:pimd", "pim", vrfname); - strlcat(rp_ka_timer_xpath, "/rp-keep-alive-timer", - sizeof(rp_ka_timer_xpath)); - - nb_cli_enqueue_change(vty, rp_ka_timer_xpath, NB_OP_MODIFY, - argv[4]->arg); - - return nb_cli_apply_changes(vty, NULL); + return pim_process_rp_kat_cmd(vty, kat_str); } DEFUN (no_ip_pim_rp_keep_alive, @@ -7050,57 +6980,18 @@ DEFUN (no_ip_pim_rp_keep_alive, "Keep alive Timer\n" IGNORED_IN_NO_STR) { - const char *vrfname; - char rp_ka_timer[6]; - char rp_ka_timer_xpath[XPATH_MAXLEN]; - uint v; - - /* RFC4601 */ - v = yang_dnode_get_uint16(vty->candidate_config->dnode, - "/frr-pim:pim/register-suppress-time"); - v = 3 * v + PIM_REGISTER_PROBE_TIME_DEFAULT; - if (v > UINT16_MAX) - v = UINT16_MAX; - snprintf(rp_ka_timer, sizeof(rp_ka_timer), "%u", v); - - vrfname = pim_cli_get_vrf_name(vty); - if (vrfname == NULL) - return CMD_WARNING_CONFIG_FAILED; - - snprintf(rp_ka_timer_xpath, sizeof(rp_ka_timer_xpath), - FRR_PIM_XPATH, "frr-pim:pimd", "pim", vrfname); - strlcat(rp_ka_timer_xpath, "/rp-keep-alive-timer", - sizeof(rp_ka_timer_xpath)); - - nb_cli_enqueue_change(vty, rp_ka_timer_xpath, NB_OP_MODIFY, - rp_ka_timer); - - return nb_cli_apply_changes(vty, NULL); + return pim_process_no_rp_kat_cmd(vty); } -DEFUN (ip_pim_keep_alive, +DEFPY (ip_pim_keep_alive, ip_pim_keep_alive_cmd, - "ip pim keep-alive-timer (1-65535)", + "ip pim keep-alive-timer (1-65535)$kat", IP_STR "pim multicast routing\n" "Keep alive Timer\n" "Seconds\n") { - const char *vrfname; - char ka_timer_xpath[XPATH_MAXLEN]; - - vrfname = pim_cli_get_vrf_name(vty); - if (vrfname == NULL) - return CMD_WARNING_CONFIG_FAILED; - - snprintf(ka_timer_xpath, sizeof(ka_timer_xpath), FRR_PIM_XPATH, - "frr-pim:pimd", "pim", vrfname); - strlcat(ka_timer_xpath, "/keep-alive-timer", sizeof(ka_timer_xpath)); - - nb_cli_enqueue_change(vty, ka_timer_xpath, NB_OP_MODIFY, - argv[3]->arg); - - return nb_cli_apply_changes(vty, NULL); + return pim_process_keepalivetimer_cmd(vty, kat_str); } DEFUN (no_ip_pim_keep_alive, @@ -7112,23 +7003,10 @@ DEFUN (no_ip_pim_keep_alive, "Keep alive Timer\n" IGNORED_IN_NO_STR) { - const char *vrfname; - char ka_timer_xpath[XPATH_MAXLEN]; - - vrfname = pim_cli_get_vrf_name(vty); - if (vrfname == NULL) - return CMD_WARNING_CONFIG_FAILED; - - snprintf(ka_timer_xpath, sizeof(ka_timer_xpath), FRR_PIM_XPATH, - "frr-pim:pimd", "pim", vrfname); - strlcat(ka_timer_xpath, "/keep-alive-timer", sizeof(ka_timer_xpath)); - - nb_cli_enqueue_change(vty, ka_timer_xpath, NB_OP_DESTROY, NULL); - - return nb_cli_apply_changes(vty, NULL); + return pim_process_no_keepalivetimer_cmd(vty); } -DEFUN (ip_pim_packets, +DEFPY (ip_pim_packets, ip_pim_packets_cmd, "ip pim packets (1-255)", IP_STR @@ -7136,10 +7014,7 @@ DEFUN (ip_pim_packets, "packets to process at one time per fd\n" "Number of packets\n") { - nb_cli_enqueue_change(vty, "/frr-pim:pim/packets", NB_OP_MODIFY, - argv[3]->arg); - - return nb_cli_apply_changes(vty, NULL); + return pim_process_pim_packet_cmd(vty, packets_str); } DEFUN (no_ip_pim_packets, @@ -7151,9 +7026,7 @@ DEFUN (no_ip_pim_packets, "packets to process at one time per fd\n" IGNORED_IN_NO_STR) { - nb_cli_enqueue_change(vty, "/frr-pim:pim/packets", NB_OP_DESTROY, NULL); - - return nb_cli_apply_changes(vty, NULL); + return pim_process_no_pim_packet_cmd(vty); } DEFPY (igmp_group_watermark, @@ -7200,7 +7073,7 @@ DEFUN (ip_pim_v6_secondary, return CMD_WARNING_CONFIG_FAILED; snprintf(send_v6_secondary_xpath, sizeof(send_v6_secondary_xpath), - FRR_PIM_AF_XPATH, + FRR_PIM_VRF_XPATH, "frr-pim:pimd", "pim", vrfname, "frr-routing:ipv4"); strlcat(send_v6_secondary_xpath, "/send-v6-secondary", sizeof(send_v6_secondary_xpath)); @@ -7227,7 +7100,7 @@ DEFUN (no_ip_pim_v6_secondary, return CMD_WARNING_CONFIG_FAILED; snprintf(send_v6_secondary_xpath, sizeof(send_v6_secondary_xpath), - FRR_PIM_AF_XPATH, + FRR_PIM_VRF_XPATH, "frr-pim:pimd", "pim", vrfname, "frr-routing:ipv4"); strlcat(send_v6_secondary_xpath, "/send-v6-secondary", sizeof(send_v6_secondary_xpath)); @@ -7238,98 +7111,36 @@ DEFUN (no_ip_pim_v6_secondary, return nb_cli_apply_changes(vty, NULL); } -DEFUN (ip_pim_rp, +DEFPY (ip_pim_rp, ip_pim_rp_cmd, - "ip pim rp A.B.C.D [A.B.C.D/M]", + "ip pim rp A.B.C.D$rp [A.B.C.D/M]$gp", IP_STR "pim multicast routing\n" "Rendevous Point\n" "ip address of RP\n" "Group Address range to cover\n") { - const char *vrfname; - int idx_rp = 3, idx_group = 4; - char rp_group_xpath[XPATH_MAXLEN]; - int result = 0; - struct prefix group; - struct in_addr rp_addr; - const char *group_str = - (argc == 5) ? argv[idx_group]->arg : "224.0.0.0/4"; - - result = str2prefix(group_str, &group); - if (result) { - struct prefix temp; - - prefix_copy(&temp, &group); - apply_mask(&temp); - if (!prefix_same(&group, &temp)) { - vty_out(vty, "%% Inconsistent address and mask: %s\n", - group_str); - return CMD_WARNING_CONFIG_FAILED; - } - } - - if (!result) { - vty_out(vty, "%% Bad group address specified: %s\n", - group_str); - return CMD_WARNING_CONFIG_FAILED; - } - - result = inet_pton(AF_INET, argv[idx_rp]->arg, &rp_addr); - if (result <= 0) { - vty_out(vty, "%% Bad RP address specified: %s\n", - argv[idx_rp]->arg); - return CMD_WARNING_CONFIG_FAILED; - } - - vrfname = pim_cli_get_vrf_name(vty); - if (vrfname == NULL) - return CMD_WARNING_CONFIG_FAILED; - - snprintf(rp_group_xpath, sizeof(rp_group_xpath), - FRR_PIM_STATIC_RP_XPATH, - "frr-pim:pimd", "pim", vrfname, "frr-routing:ipv4", - argv[idx_rp]->arg); - strlcat(rp_group_xpath, "/group-list", sizeof(rp_group_xpath)); - - nb_cli_enqueue_change(vty, rp_group_xpath, NB_OP_CREATE, group_str); + const char *group_str = (gp_str) ? gp_str : "224.0.0.0/4"; - return nb_cli_apply_changes(vty, NULL); + return pim_process_rp_cmd(vty, rp_str, group_str); } -DEFUN (ip_pim_rp_prefix_list, +DEFPY (ip_pim_rp_prefix_list, ip_pim_rp_prefix_list_cmd, - "ip pim rp A.B.C.D prefix-list WORD", + "ip pim rp A.B.C.D$rp prefix-list WORD$plist", IP_STR "pim multicast routing\n" - "Rendevous Point\n" + "Rendezvous Point\n" "ip address of RP\n" "group prefix-list filter\n" "Name of a prefix-list\n") { - int idx_rp = 3, idx_plist = 5; - const char *vrfname; - char rp_plist_xpath[XPATH_MAXLEN]; - - vrfname = pim_cli_get_vrf_name(vty); - if (vrfname == NULL) - return CMD_WARNING_CONFIG_FAILED; - - snprintf(rp_plist_xpath, sizeof(rp_plist_xpath), - FRR_PIM_STATIC_RP_XPATH, - "frr-pim:pimd", "pim", vrfname, "frr-routing:ipv4", - argv[idx_rp]->arg); - strlcat(rp_plist_xpath, "/prefix-list", sizeof(rp_plist_xpath)); - - nb_cli_enqueue_change(vty, rp_plist_xpath, NB_OP_MODIFY, - argv[idx_plist]->arg); - - return nb_cli_apply_changes(vty, NULL); + return pim_process_rp_plist_cmd(vty, rp_str, plist); } -DEFUN (no_ip_pim_rp, +DEFPY (no_ip_pim_rp, no_ip_pim_rp_cmd, - "no ip pim rp A.B.C.D [A.B.C.D/M]", + "no ip pim rp A.B.C.D$rp [A.B.C.D/M]$gp", NO_STR IP_STR "pim multicast routing\n" @@ -7337,92 +7148,23 @@ DEFUN (no_ip_pim_rp, "ip address of RP\n" "Group Address range to cover\n") { - int idx_rp = 4, idx_group = 5; - const char *group_str = - (argc == 6) ? argv[idx_group]->arg : "224.0.0.0/4"; - char group_list_xpath[XPATH_MAXLEN + 32]; - char group_xpath[XPATH_MAXLEN + 64]; - char rp_xpath[XPATH_MAXLEN]; - const char *vrfname; - const struct lyd_node *group_dnode; + const char *group_str = (gp_str) ? gp_str : "224.0.0.0/4"; - vrfname = pim_cli_get_vrf_name(vty); - if (vrfname == NULL) - return CMD_WARNING_CONFIG_FAILED; - - snprintf(rp_xpath, sizeof(rp_xpath), FRR_PIM_STATIC_RP_XPATH, - "frr-pim:pimd", "pim", vrfname, "frr-routing:ipv4", - argv[idx_rp]->arg); - - snprintf(group_list_xpath, sizeof(group_list_xpath), "%s/group-list", - rp_xpath); - - snprintf(group_xpath, sizeof(group_xpath), "%s[.='%s']", - group_list_xpath, group_str); - - if (!yang_dnode_exists(vty->candidate_config->dnode, group_xpath)) { - vty_out(vty, "%% Unable to find specified RP\n"); - return NB_OK; - } - - group_dnode = yang_dnode_get(vty->candidate_config->dnode, group_xpath); - - if (yang_is_last_list_dnode(group_dnode)) - nb_cli_enqueue_change(vty, rp_xpath, NB_OP_DESTROY, NULL); - else - nb_cli_enqueue_change(vty, group_list_xpath, NB_OP_DESTROY, - group_str); - - return nb_cli_apply_changes(vty, NULL); + return pim_process_no_rp_cmd(vty, rp_str, group_str); } -DEFUN (no_ip_pim_rp_prefix_list, +DEFPY (no_ip_pim_rp_prefix_list, no_ip_pim_rp_prefix_list_cmd, - "no ip pim rp A.B.C.D prefix-list WORD", + "no ip pim rp A.B.C.D$rp prefix-list WORD$plist", NO_STR IP_STR "pim multicast routing\n" - "Rendevous Point\n" + "Rendezvous Point\n" "ip address of RP\n" "group prefix-list filter\n" "Name of a prefix-list\n") { - int idx_rp = 4; - int idx_plist = 6; - char rp_xpath[XPATH_MAXLEN]; - char plist_xpath[XPATH_MAXLEN]; - const char *vrfname; - const struct lyd_node *plist_dnode; - const char *plist; - - vrfname = pim_cli_get_vrf_name(vty); - if (vrfname == NULL) - return CMD_WARNING_CONFIG_FAILED; - - snprintf(rp_xpath, sizeof(rp_xpath), FRR_PIM_STATIC_RP_XPATH, - "frr-pim:pimd", "pim", vrfname, "frr-routing:ipv4", - argv[idx_rp]->arg); - - snprintf(plist_xpath, sizeof(plist_xpath), FRR_PIM_STATIC_RP_XPATH, - "frr-pim:pimd", "pim", vrfname, "frr-routing:ipv4", - argv[idx_rp]->arg); - strlcat(plist_xpath, "/prefix-list", sizeof(plist_xpath)); - - plist_dnode = yang_dnode_get(vty->candidate_config->dnode, plist_xpath); - if (!plist_dnode) { - vty_out(vty, "%% Unable to find specified RP\n"); - return NB_OK; - } - - plist = yang_dnode_get_string(plist_dnode, plist_xpath); - if (strcmp(argv[idx_plist]->arg, plist)) { - vty_out(vty, "%% Unable to find specified RP\n"); - return NB_OK; - } - - nb_cli_enqueue_change(vty, rp_xpath, NB_OP_DESTROY, NULL); - - return nb_cli_apply_changes(vty, NULL); + return pim_process_no_rp_plist_cmd(vty, rp_str, plist); } DEFUN (ip_pim_ssm_prefix_list, @@ -7441,7 +7183,7 @@ DEFUN (ip_pim_ssm_prefix_list, if (vrfname == NULL) return CMD_WARNING_CONFIG_FAILED; - snprintf(ssm_plist_xpath, sizeof(ssm_plist_xpath), FRR_PIM_AF_XPATH, + snprintf(ssm_plist_xpath, sizeof(ssm_plist_xpath), FRR_PIM_VRF_XPATH, "frr-pim:pimd", "pim", vrfname, "frr-routing:ipv4"); strlcat(ssm_plist_xpath, "/ssm-prefix-list", sizeof(ssm_plist_xpath)); @@ -7467,7 +7209,7 @@ DEFUN (no_ip_pim_ssm_prefix_list, return CMD_WARNING_CONFIG_FAILED; snprintf(ssm_plist_xpath, sizeof(ssm_plist_xpath), - FRR_PIM_AF_XPATH, + FRR_PIM_VRF_XPATH, "frr-pim:pimd", "pim", vrfname, "frr-routing:ipv4"); strlcat(ssm_plist_xpath, "/ssm-prefix-list", sizeof(ssm_plist_xpath)); @@ -7496,7 +7238,7 @@ DEFUN (no_ip_pim_ssm_prefix_list_name, return CMD_WARNING_CONFIG_FAILED; snprintf(ssm_plist_xpath, sizeof(ssm_plist_xpath), - FRR_PIM_AF_XPATH, + FRR_PIM_VRF_XPATH, "frr-pim:pimd", "pim", vrfname, "frr-routing:ipv4"); strlcat(ssm_plist_xpath, "/ssm-prefix-list", sizeof(ssm_plist_xpath)); ssm_plist_dnode = yang_dnode_get(vty->candidate_config->dnode, @@ -7534,9 +7276,7 @@ static void ip_pim_ssm_show_group_range(struct pim_instance *pim, json_object *json; json = json_object_new_object(); json_object_string_add(json, "ssmGroups", range_str); - vty_out(vty, "%s\n", json_object_to_json_string_ext( - json, JSON_C_TO_STRING_PRETTY)); - json_object_free(json); + vty_json(vty, json); } else vty_out(vty, "SSM group range : %s\n", range_str); } @@ -7586,9 +7326,7 @@ static void ip_pim_ssm_show_group_type(struct pim_instance *pim, json_object *json; json = json_object_new_object(); json_object_string_add(json, "groupType", type_str); - vty_out(vty, "%s\n", json_object_to_json_string_ext( - json, JSON_C_TO_STRING_PRETTY)); - json_object_free(json); + vty_json(vty, json); } else vty_out(vty, "Group type : %s\n", type_str); } @@ -7655,7 +7393,7 @@ DEFUN (ip_ssmpingd, return CMD_WARNING_CONFIG_FAILED; snprintf(ssmpingd_ip_xpath, sizeof(ssmpingd_ip_xpath), - FRR_PIM_AF_XPATH, + FRR_PIM_VRF_XPATH, "frr-pim:pimd", "pim", vrfname, "frr-routing:ipv4"); strlcat(ssmpingd_ip_xpath, "/ssm-pingd-source-ip", sizeof(ssmpingd_ip_xpath)); @@ -7684,7 +7422,7 @@ DEFUN (no_ip_ssmpingd, return CMD_WARNING_CONFIG_FAILED; snprintf(ssmpingd_ip_xpath, sizeof(ssmpingd_ip_xpath), - FRR_PIM_AF_XPATH, + FRR_PIM_VRF_XPATH, "frr-pim:pimd", "pim", vrfname, "frr-routing:ipv4"); strlcat(ssmpingd_ip_xpath, "/ssm-pingd-source-ip", sizeof(ssmpingd_ip_xpath)); @@ -7709,8 +7447,8 @@ DEFUN (ip_pim_ecmp, if (vrfname == NULL) return CMD_WARNING_CONFIG_FAILED; - snprintf(ecmp_xpath, sizeof(ecmp_xpath), FRR_PIM_XPATH, - "frr-pim:pimd", "pim", vrfname); + snprintf(ecmp_xpath, sizeof(ecmp_xpath), FRR_PIM_VRF_XPATH, + "frr-pim:pimd", "pim", vrfname, "frr-routing:ipv4"); strlcat(ecmp_xpath, "/ecmp", sizeof(ecmp_xpath)); nb_cli_enqueue_change(vty, ecmp_xpath, NB_OP_MODIFY, "true"); @@ -7732,8 +7470,8 @@ DEFUN (no_ip_pim_ecmp, if (vrfname == NULL) return CMD_WARNING_CONFIG_FAILED; - snprintf(ecmp_xpath, sizeof(ecmp_xpath), FRR_PIM_XPATH, - "frr-pim:pimd", "pim", vrfname); + snprintf(ecmp_xpath, sizeof(ecmp_xpath), FRR_PIM_VRF_XPATH, + "frr-pim:pimd", "pim", vrfname, "frr-routing:ipv4"); strlcat(ecmp_xpath, "/ecmp", sizeof(ecmp_xpath)); nb_cli_enqueue_change(vty, ecmp_xpath, NB_OP_MODIFY, "false"); @@ -7757,12 +7495,12 @@ DEFUN (ip_pim_ecmp_rebalance, if (vrfname == NULL) return CMD_WARNING_CONFIG_FAILED; - snprintf(ecmp_xpath, sizeof(ecmp_xpath), FRR_PIM_XPATH, - "frr-pim:pimd", "pim", vrfname); + snprintf(ecmp_xpath, sizeof(ecmp_xpath), FRR_PIM_VRF_XPATH, + "frr-pim:pimd", "pim", vrfname, "frr-routing:ipv4"); strlcat(ecmp_xpath, "/ecmp", sizeof(ecmp_xpath)); snprintf(ecmp_rebalance_xpath, sizeof(ecmp_rebalance_xpath), - FRR_PIM_XPATH, - "frr-pim:pimd", "pim", vrfname); + FRR_PIM_VRF_XPATH, + "frr-pim:pimd", "pim", vrfname, "frr-routing:ipv4"); strlcat(ecmp_rebalance_xpath, "/ecmp-rebalance", sizeof(ecmp_rebalance_xpath)); @@ -7789,8 +7527,8 @@ DEFUN (no_ip_pim_ecmp_rebalance, return CMD_WARNING_CONFIG_FAILED; snprintf(ecmp_rebalance_xpath, sizeof(ecmp_rebalance_xpath), - FRR_PIM_XPATH, - "frr-pim:pimd", "pim", vrfname); + FRR_PIM_VRF_XPATH, + "frr-pim:pimd", "pim", vrfname, "frr-routing:ipv4"); strlcat(ecmp_rebalance_xpath, "/ecmp-rebalance", sizeof(ecmp_rebalance_xpath)); @@ -7805,9 +7543,10 @@ DEFUN (interface_ip_igmp, IP_STR IFACE_IGMP_STR) { - nb_cli_enqueue_change(vty, "./igmp-enable", NB_OP_MODIFY, "true"); + nb_cli_enqueue_change(vty, "./enable", NB_OP_MODIFY, "true"); - return nb_cli_apply_changes(vty, "./frr-igmp:igmp"); + return nb_cli_apply_changes(vty, FRR_GMP_INTERFACE_XPATH, + "frr-routing:ipv4"); } DEFUN (interface_no_ip_igmp, @@ -7818,13 +7557,22 @@ DEFUN (interface_no_ip_igmp, IFACE_IGMP_STR) { const struct lyd_node *pim_enable_dnode; - char pim_if_xpath[XPATH_MAXLEN + 20]; + char pim_if_xpath[XPATH_MAXLEN]; + + int printed = + snprintf(pim_if_xpath, sizeof(pim_if_xpath), + "%s/frr-pim:pim/address-family[address-family='%s']", + VTY_CURR_XPATH, "frr-routing:ipv4"); - snprintf(pim_if_xpath, sizeof(pim_if_xpath), - "%s/frr-pim:pim", VTY_CURR_XPATH); + if (printed >= (int)(sizeof(pim_if_xpath))) { + vty_out(vty, "Xpath too long (%d > %u)", printed + 1, + XPATH_MAXLEN); + return CMD_WARNING_CONFIG_FAILED; + } pim_enable_dnode = yang_dnode_getf(vty->candidate_config->dnode, - "%s/pim-enable", pim_if_xpath); + FRR_PIM_ENABLE_XPATH, VTY_CURR_XPATH, + "frr-routing:ipv4"); if (!pim_enable_dnode) { nb_cli_enqueue_change(vty, pim_if_xpath, NB_OP_DESTROY, NULL); nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL); @@ -7834,11 +7582,12 @@ DEFUN (interface_no_ip_igmp, NULL); nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL); } else - nb_cli_enqueue_change(vty, "./igmp-enable", + nb_cli_enqueue_change(vty, "./enable", NB_OP_MODIFY, "false"); } - return nb_cli_apply_changes(vty, "./frr-igmp:igmp"); + return nb_cli_apply_changes(vty, FRR_GMP_INTERFACE_XPATH, + "frr-routing:ipv4"); } DEFUN (interface_ip_igmp_join, @@ -7866,7 +7615,7 @@ DEFUN (interface_ip_igmp_join, } else source_str = "0.0.0.0"; - snprintf(xpath, sizeof(xpath), FRR_IGMP_JOIN_XPATH, + snprintf(xpath, sizeof(xpath), FRR_GMP_JOIN_XPATH, "frr-routing:ipv4", argv[idx_group]->arg, source_str); nb_cli_enqueue_change(vty, xpath, NB_OP_CREATE, NULL); @@ -7900,7 +7649,7 @@ DEFUN (interface_no_ip_igmp_join, } else source_str = "0.0.0.0"; - snprintf(xpath, sizeof(xpath), FRR_IGMP_JOIN_XPATH, + snprintf(xpath, sizeof(xpath), FRR_GMP_JOIN_XPATH, "frr-routing:ipv4", argv[idx_group]->arg, source_str); nb_cli_enqueue_change(vty, xpath, NB_OP_DESTROY, NULL); @@ -7920,20 +7669,22 @@ DEFUN (interface_ip_igmp_query_interval, pim_enable_dnode = yang_dnode_getf(vty->candidate_config->dnode, - "%s/frr-pim:pim/pim-enable", VTY_CURR_XPATH); + FRR_PIM_ENABLE_XPATH, VTY_CURR_XPATH, + "frr-routing:ipv4"); if (!pim_enable_dnode) { - nb_cli_enqueue_change(vty, "./igmp-enable", NB_OP_MODIFY, + nb_cli_enqueue_change(vty, "./enable", NB_OP_MODIFY, "true"); } else { if (!yang_dnode_get_bool(pim_enable_dnode, ".")) - nb_cli_enqueue_change(vty, "./igmp-enable", + nb_cli_enqueue_change(vty, "./enable", NB_OP_MODIFY, "true"); } nb_cli_enqueue_change(vty, "./query-interval", NB_OP_MODIFY, argv[3]->arg); - return nb_cli_apply_changes(vty, "./frr-igmp:igmp"); + return nb_cli_apply_changes(vty, FRR_GMP_INTERFACE_XPATH, + "frr-routing:ipv4"); } DEFUN (interface_no_ip_igmp_query_interval, @@ -7947,7 +7698,8 @@ DEFUN (interface_no_ip_igmp_query_interval, { nb_cli_enqueue_change(vty, "./query-interval", NB_OP_DESTROY, NULL); - return nb_cli_apply_changes(vty, "./frr-igmp:igmp"); + return nb_cli_apply_changes(vty, FRR_GMP_INTERFACE_XPATH, + "frr-routing:ipv4"); } DEFUN (interface_ip_igmp_version, @@ -7958,11 +7710,13 @@ DEFUN (interface_ip_igmp_version, "IGMP version\n" "IGMP version number\n") { - nb_cli_enqueue_change(vty, "./igmp-enable", NB_OP_MODIFY, + nb_cli_enqueue_change(vty, "./enable", NB_OP_MODIFY, "true"); - nb_cli_enqueue_change(vty, "./version", NB_OP_MODIFY, argv[3]->arg); + nb_cli_enqueue_change(vty, "./igmp-version", NB_OP_MODIFY, + argv[3]->arg); - return nb_cli_apply_changes(vty, "./frr-igmp:igmp"); + return nb_cli_apply_changes(vty, FRR_GMP_INTERFACE_XPATH, + "frr-routing:ipv4"); } DEFUN (interface_no_ip_igmp_version, @@ -7974,9 +7728,10 @@ DEFUN (interface_no_ip_igmp_version, "IGMP version\n" "IGMP version number\n") { - nb_cli_enqueue_change(vty, "./version", NB_OP_DESTROY, NULL); + nb_cli_enqueue_change(vty, "./igmp-version", NB_OP_DESTROY, NULL); - return nb_cli_apply_changes(vty, "./frr-igmp:igmp"); + return nb_cli_apply_changes(vty, FRR_GMP_INTERFACE_XPATH, + "frr-routing:ipv4"); } DEFUN (interface_ip_igmp_query_max_response_time, @@ -7991,21 +7746,23 @@ DEFUN (interface_ip_igmp_query_max_response_time, pim_enable_dnode = yang_dnode_getf(vty->candidate_config->dnode, - "%s/frr-pim:pim/pim-enable", VTY_CURR_XPATH); + FRR_PIM_ENABLE_XPATH, VTY_CURR_XPATH, + "frr-routing:ipv4"); if (!pim_enable_dnode) { - nb_cli_enqueue_change(vty, "./igmp-enable", NB_OP_MODIFY, + nb_cli_enqueue_change(vty, "./enable", NB_OP_MODIFY, "true"); } else { if (!yang_dnode_get_bool(pim_enable_dnode, ".")) - nb_cli_enqueue_change(vty, "./igmp-enable", + nb_cli_enqueue_change(vty, "./enable", NB_OP_MODIFY, "true"); } nb_cli_enqueue_change(vty, "./query-max-response-time", NB_OP_MODIFY, argv[3]->arg); - return nb_cli_apply_changes(vty, "./frr-igmp:igmp"); + return nb_cli_apply_changes(vty, FRR_GMP_INTERFACE_XPATH, + "frr-routing:ipv4"); } DEFUN (interface_no_ip_igmp_query_max_response_time, @@ -8019,7 +7776,8 @@ DEFUN (interface_no_ip_igmp_query_max_response_time, { nb_cli_enqueue_change(vty, "./query-max-response-time", NB_OP_DESTROY, NULL); - return nb_cli_apply_changes(vty, "./frr-igmp:igmp"); + return nb_cli_apply_changes(vty, FRR_GMP_INTERFACE_XPATH, + "frr-routing:ipv4"); } DEFUN_HIDDEN (interface_ip_igmp_query_max_response_time_dsec, @@ -8034,20 +7792,22 @@ DEFUN_HIDDEN (interface_ip_igmp_query_max_response_time_dsec, pim_enable_dnode = yang_dnode_getf(vty->candidate_config->dnode, - "%s/frr-pim:pim/pim-enable", VTY_CURR_XPATH); + FRR_PIM_ENABLE_XPATH, VTY_CURR_XPATH, + "frr-routing:ipv4"); if (!pim_enable_dnode) { - nb_cli_enqueue_change(vty, "./igmp-enable", NB_OP_MODIFY, + nb_cli_enqueue_change(vty, "./enable", NB_OP_MODIFY, "true"); } else { if (!yang_dnode_get_bool(pim_enable_dnode, ".")) - nb_cli_enqueue_change(vty, "./igmp-enable", + nb_cli_enqueue_change(vty, "./enable", NB_OP_MODIFY, "true"); } nb_cli_enqueue_change(vty, "./query-max-response-time", NB_OP_MODIFY, argv[3]->arg); - return nb_cli_apply_changes(vty, "./frr-igmp:igmp"); + return nb_cli_apply_changes(vty, FRR_GMP_INTERFACE_XPATH, + "frr-routing:ipv4"); } DEFUN_HIDDEN (interface_no_ip_igmp_query_max_response_time_dsec, @@ -8062,7 +7822,8 @@ DEFUN_HIDDEN (interface_no_ip_igmp_query_max_response_time_dsec, nb_cli_enqueue_change(vty, "./query-max-response-time", NB_OP_DESTROY, NULL); - return nb_cli_apply_changes(vty, "./frr-igmp:igmp"); + return nb_cli_apply_changes(vty, FRR_GMP_INTERFACE_XPATH, + "frr-routing:ipv4"); } DEFUN (interface_ip_igmp_last_member_query_count, @@ -8077,20 +7838,22 @@ DEFUN (interface_ip_igmp_last_member_query_count, pim_enable_dnode = yang_dnode_getf(vty->candidate_config->dnode, - "%s/frr-pim:pim/pim-enable", VTY_CURR_XPATH); + FRR_PIM_ENABLE_XPATH, VTY_CURR_XPATH, + "frr-routing:ipv4"); if (!pim_enable_dnode) { - nb_cli_enqueue_change(vty, "./igmp-enable", NB_OP_MODIFY, + nb_cli_enqueue_change(vty, "./enable", NB_OP_MODIFY, "true"); } else { if (!yang_dnode_get_bool(pim_enable_dnode, ".")) - nb_cli_enqueue_change(vty, "./igmp-enable", + nb_cli_enqueue_change(vty, "./enable", NB_OP_MODIFY, "true"); } nb_cli_enqueue_change(vty, "./robustness-variable", NB_OP_MODIFY, argv[3]->arg); - return nb_cli_apply_changes(vty, "./frr-igmp:igmp"); + return nb_cli_apply_changes(vty, FRR_GMP_INTERFACE_XPATH, + "frr-routing:ipv4"); } DEFUN (interface_no_ip_igmp_last_member_query_count, @@ -8105,7 +7868,8 @@ DEFUN (interface_no_ip_igmp_last_member_query_count, nb_cli_enqueue_change(vty, "./robustness-variable", NB_OP_DESTROY, NULL); - return nb_cli_apply_changes(vty, "./frr-igmp:igmp"); + return nb_cli_apply_changes(vty, FRR_GMP_INTERFACE_XPATH, + "frr-routing:ipv4"); } DEFUN (interface_ip_igmp_last_member_query_interval, @@ -8120,20 +7884,22 @@ DEFUN (interface_ip_igmp_last_member_query_interval, pim_enable_dnode = yang_dnode_getf(vty->candidate_config->dnode, - "%s/frr-pim:pim/pim-enable", VTY_CURR_XPATH); + FRR_PIM_ENABLE_XPATH, VTY_CURR_XPATH, + "frr-routing:ipv4"); if (!pim_enable_dnode) { - nb_cli_enqueue_change(vty, "./igmp-enable", NB_OP_MODIFY, + nb_cli_enqueue_change(vty, "./enable", NB_OP_MODIFY, "true"); } else { if (!yang_dnode_get_bool(pim_enable_dnode, ".")) - nb_cli_enqueue_change(vty, "./igmp-enable", + nb_cli_enqueue_change(vty, "./enable", NB_OP_MODIFY, "true"); } nb_cli_enqueue_change(vty, "./last-member-query-interval", NB_OP_MODIFY, argv[3]->arg); - return nb_cli_apply_changes(vty, "./frr-igmp:igmp"); + return nb_cli_apply_changes(vty, FRR_GMP_INTERFACE_XPATH, + "frr-routing:ipv4"); } DEFUN (interface_no_ip_igmp_last_member_query_interval, @@ -8148,7 +7914,8 @@ DEFUN (interface_no_ip_igmp_last_member_query_interval, nb_cli_enqueue_change(vty, "./last-member-query-interval", NB_OP_DESTROY, NULL); - return nb_cli_apply_changes(vty, "./frr-igmp:igmp"); + return nb_cli_apply_changes(vty, FRR_GMP_INTERFACE_XPATH, + "frr-routing:ipv4"); } DEFUN (interface_ip_pim_drprio, @@ -8161,10 +7928,7 @@ DEFUN (interface_ip_pim_drprio, { int idx_number = 3; - nb_cli_enqueue_change(vty, "./dr-priority", NB_OP_MODIFY, - argv[idx_number]->arg); - - return nb_cli_apply_changes(vty, "./frr-pim:pim"); + return pim_process_ip_pim_drprio_cmd(vty, argv[idx_number]->arg); } DEFUN (interface_no_ip_pim_drprio, @@ -8176,9 +7940,7 @@ DEFUN (interface_no_ip_pim_drprio, "Revert the Designated Router Priority to default\n" "Old Value of the Priority\n") { - nb_cli_enqueue_change(vty, "./dr-priority", NB_OP_DESTROY, NULL); - - return nb_cli_apply_changes(vty, "./frr-pim:pim"); + return pim_process_no_ip_pim_drprio_cmd(vty); } DEFPY_HIDDEN (interface_ip_igmp_query_generate, @@ -8190,8 +7952,10 @@ DEFPY_HIDDEN (interface_ip_igmp_query_generate, "IGMP version\n" "IGMP version number\n") { +#if PIM_IPV == 4 VTY_DECLVAR_CONTEXT(interface, ifp); - int igmp_version = 2; + int igmp_version; + struct pim_interface *pim_ifp = ifp->info; if (!ifp->info) { vty_out(vty, "IGMP/PIM is not enabled on the interface %s\n", @@ -8199,11 +7963,14 @@ DEFPY_HIDDEN (interface_ip_igmp_query_generate, return CMD_WARNING_CONFIG_FAILED; } + /* It takes the igmp version configured on the interface as default */ + igmp_version = pim_ifp->igmp_version; + if (argc > 3) igmp_version = atoi(argv[4]->arg); igmp_send_query_on_intf(ifp, igmp_version); - +#endif return CMD_SUCCESS; } @@ -8219,7 +7986,7 @@ DEFPY_HIDDEN (pim_test_sg_keepalive, { struct pim_upstream *up; struct pim_instance *pim; - struct prefix_sg sg; + pim_sgaddr sg; sg.src = source; sg.grp = group; @@ -8245,13 +8012,12 @@ DEFPY_HIDDEN (pim_test_sg_keepalive, up = pim_upstream_find(pim, &sg); if (!up) { - vty_out(vty, "%% Unable to find %s specified\n", - pim_str_sg_dump(&sg)); + vty_out(vty, "%% Unable to find %pSG specified\n", &sg); return CMD_WARNING; } - vty_out(vty, "Setting %s to current keep alive time: %d\n", - pim_str_sg_dump(&sg), pim->keep_alive_time); + vty_out(vty, "Setting %pSG to current keep alive time: %d\n", &sg, + pim->keep_alive_time); pim_upstream_keep_alive_timer_start(up, pim->keep_alive_time); return CMD_SUCCESS; @@ -8265,18 +8031,7 @@ DEFPY (interface_ip_pim_activeactive, PIM_STR "Mark interface as Active-Active for MLAG operations, Hidden because not finished yet\n") { - if (no) - nb_cli_enqueue_change(vty, "./active-active", NB_OP_MODIFY, - "false"); - else { - nb_cli_enqueue_change(vty, "./pim-enable", NB_OP_MODIFY, - "true"); - - nb_cli_enqueue_change(vty, "./active-active", NB_OP_MODIFY, - "true"); - } - - return nb_cli_apply_changes(vty, "./frr-pim:pim"); + return pim_process_ip_pim_activeactive_cmd(vty, no); } DEFUN_HIDDEN (interface_ip_pim_ssm, @@ -8288,9 +8043,7 @@ DEFUN_HIDDEN (interface_ip_pim_ssm, { int ret; - nb_cli_enqueue_change(vty, "./pim-enable", NB_OP_MODIFY, "true"); - - ret = nb_cli_apply_changes(vty, "./frr-pim:pim"); + ret = pim_process_ip_pim_cmd(vty); if (ret != NB_OK) return ret; @@ -8308,9 +8061,7 @@ DEFUN_HIDDEN (interface_ip_pim_sm, PIM_STR IFACE_PIM_SM_STR) { - nb_cli_enqueue_change(vty, "./pim-enable", NB_OP_MODIFY, "true"); - - return nb_cli_apply_changes(vty, "./frr-pim:pim"); + return pim_process_ip_pim_cmd(vty); } DEFUN (interface_ip_pim, @@ -8319,9 +8070,7 @@ DEFUN (interface_ip_pim, IP_STR PIM_STR) { - nb_cli_enqueue_change(vty, "./pim-enable", NB_OP_MODIFY, "true"); - - return nb_cli_apply_changes(vty, "./frr-pim:pim"); + return pim_process_ip_pim_cmd(vty); } DEFUN_HIDDEN (interface_no_ip_pim_ssm, @@ -8332,28 +8081,7 @@ DEFUN_HIDDEN (interface_no_ip_pim_ssm, PIM_STR IFACE_PIM_STR) { - const struct lyd_node *igmp_enable_dnode; - char igmp_if_xpath[XPATH_MAXLEN + 20]; - - snprintf(igmp_if_xpath, sizeof(igmp_if_xpath), - "%s/frr-igmp:igmp", VTY_CURR_XPATH); - igmp_enable_dnode = yang_dnode_getf(vty->candidate_config->dnode, - "%s/igmp-enable", igmp_if_xpath); - - if (!igmp_enable_dnode) { - nb_cli_enqueue_change(vty, igmp_if_xpath, NB_OP_DESTROY, NULL); - nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL); - } else { - if (!yang_dnode_get_bool(igmp_enable_dnode, ".")) { - nb_cli_enqueue_change(vty, igmp_if_xpath, NB_OP_DESTROY, - NULL); - nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL); - } else - nb_cli_enqueue_change(vty, "./pim-enable", NB_OP_MODIFY, - "false"); - } - - return nb_cli_apply_changes(vty, "./frr-pim:pim"); + return pim_process_no_ip_pim_cmd(vty); } DEFUN_HIDDEN (interface_no_ip_pim_sm, @@ -8364,28 +8092,7 @@ DEFUN_HIDDEN (interface_no_ip_pim_sm, PIM_STR IFACE_PIM_SM_STR) { - const struct lyd_node *igmp_enable_dnode; - char igmp_if_xpath[XPATH_MAXLEN + 20]; - - snprintf(igmp_if_xpath, sizeof(igmp_if_xpath), - "%s/frr-igmp:igmp", VTY_CURR_XPATH); - igmp_enable_dnode = yang_dnode_getf(vty->candidate_config->dnode, - "%s/igmp-enable", igmp_if_xpath); - - if (!igmp_enable_dnode) { - nb_cli_enqueue_change(vty, igmp_if_xpath, NB_OP_DESTROY, NULL); - nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL); - } else { - if (!yang_dnode_get_bool(igmp_enable_dnode, ".")) { - nb_cli_enqueue_change(vty, igmp_if_xpath, NB_OP_DESTROY, - NULL); - nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL); - } else - nb_cli_enqueue_change(vty, "./pim-enable", NB_OP_MODIFY, - "false"); - } - - return nb_cli_apply_changes(vty, "./frr-pim:pim"); + return pim_process_no_ip_pim_cmd(vty); } DEFUN (interface_no_ip_pim, @@ -8395,28 +8102,7 @@ DEFUN (interface_no_ip_pim, IP_STR PIM_STR) { - const struct lyd_node *igmp_enable_dnode; - char igmp_if_xpath[XPATH_MAXLEN + 20]; - - snprintf(igmp_if_xpath, sizeof(igmp_if_xpath), - "%s/frr-igmp:igmp", VTY_CURR_XPATH); - igmp_enable_dnode = yang_dnode_getf(vty->candidate_config->dnode, - "%s/igmp-enable", igmp_if_xpath); - - if (!igmp_enable_dnode) { - nb_cli_enqueue_change(vty, igmp_if_xpath, NB_OP_DESTROY, NULL); - nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL); - } else { - if (!yang_dnode_get_bool(igmp_enable_dnode, ".")) { - nb_cli_enqueue_change(vty, igmp_if_xpath, NB_OP_DESTROY, - NULL); - nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL); - } else - nb_cli_enqueue_change(vty, "./pim-enable", NB_OP_MODIFY, - "false"); - } - - return nb_cli_apply_changes(vty, "./frr-pim:pim"); + return pim_process_no_ip_pim_cmd(vty); } /* boundaries */ @@ -8429,13 +8115,7 @@ DEFUN(interface_ip_pim_boundary_oil, "Filter OIL by group using prefix list\n" "Prefix list to filter OIL with\n") { - nb_cli_enqueue_change(vty, "./multicast-boundary-oil", NB_OP_MODIFY, - argv[4]->arg); - - return nb_cli_apply_changes(vty, - "./frr-pim:pim/address-family[address-family='%s']", - "frr-routing:ipv4"); - + return pim_process_ip_pim_boundary_oil_cmd(vty, argv[4]->arg); } DEFUN(interface_no_ip_pim_boundary_oil, @@ -8448,12 +8128,7 @@ DEFUN(interface_no_ip_pim_boundary_oil, "Filter OIL by group using prefix list\n" "Prefix list to filter OIL with\n") { - nb_cli_enqueue_change(vty, "./multicast-boundary-oil", NB_OP_DESTROY, - NULL); - - return nb_cli_apply_changes(vty, - "./frr-pim:pim/address-family[address-family='%s']", - "frr-routing:ipv4"); + return pim_process_no_ip_pim_boundary_oil_cmd(vty); } DEFUN (interface_ip_mroute, @@ -8474,13 +8149,8 @@ DEFUN (interface_ip_mroute, else source_str = argv[idx_ipv4 + 1]->arg; - nb_cli_enqueue_change(vty, "./oif", NB_OP_MODIFY, - argv[idx_interface]->arg); - - return nb_cli_apply_changes(vty, - "./frr-pim:pim/address-family[address-family='%s']/mroute[source-addr='%s'][group-addr='%s']", - "frr-routing:ipv4", source_str, - argv[idx_ipv4]->arg); + return pim_process_ip_mroute_cmd(vty, argv[idx_interface]->arg, + argv[idx_ipv4]->arg, source_str); } DEFUN (interface_no_ip_mroute, @@ -8493,6 +8163,7 @@ DEFUN (interface_no_ip_mroute, "Group Address\n" "Source Address\n") { + int idx_interface = 3; int idx_ipv4 = 4; const char *source_str; @@ -8501,12 +8172,8 @@ DEFUN (interface_no_ip_mroute, else source_str = argv[idx_ipv4 + 1]->arg; - nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL); - - return nb_cli_apply_changes(vty, - "./frr-pim:pim/address-family[address-family='%s']/mroute[source-addr='%s'][group-addr='%s']", - "frr-routing:ipv4", source_str, - argv[idx_ipv4]->arg); + return pim_process_no_ip_mroute_cmd(vty, argv[idx_interface]->arg, + argv[idx_ipv4]->arg, source_str); } DEFUN (interface_ip_pim_hello, @@ -8520,28 +8187,14 @@ DEFUN (interface_ip_pim_hello, { int idx_time = 3; int idx_hold = 4; - const struct lyd_node *igmp_enable_dnode; - - igmp_enable_dnode = - yang_dnode_getf(vty->candidate_config->dnode, - "%s/frr-igmp:igmp/igmp-enable", VTY_CURR_XPATH); - if (!igmp_enable_dnode) { - nb_cli_enqueue_change(vty, "./pim-enable", NB_OP_MODIFY, - "true"); - } else { - if (!yang_dnode_get_bool(igmp_enable_dnode, ".")) - nb_cli_enqueue_change(vty, "./pim-enable", NB_OP_MODIFY, - "true"); - } - - nb_cli_enqueue_change(vty, "./hello-interval", NB_OP_MODIFY, - argv[idx_time]->arg); if (argc == idx_hold + 1) - nb_cli_enqueue_change(vty, "./hello-holdtime", NB_OP_MODIFY, - argv[idx_hold]->arg); + return pim_process_ip_pim_hello_cmd(vty, argv[idx_time]->arg, + argv[idx_hold]->arg); - return nb_cli_apply_changes(vty, "./frr-pim:pim"); + else + return pim_process_ip_pim_hello_cmd(vty, argv[idx_time]->arg, + NULL); } DEFUN (interface_no_ip_pim_hello, @@ -8554,10 +8207,7 @@ DEFUN (interface_no_ip_pim_hello, IGNORED_IN_NO_STR IGNORED_IN_NO_STR) { - nb_cli_enqueue_change(vty, "./hello-interval", NB_OP_DESTROY, NULL); - nb_cli_enqueue_change(vty, "./hello-holdtime", NB_OP_DESTROY, NULL); - - return nb_cli_apply_changes(vty, "./frr-pim:pim"); + return pim_process_no_ip_pim_hello_cmd(vty); } DEFUN (debug_igmp, @@ -8738,6 +8388,7 @@ DEFUN (debug_pim, PIM_DO_DEBUG_MSDP_EVENTS; PIM_DO_DEBUG_MSDP_PACKETS; PIM_DO_DEBUG_BSM; + PIM_DO_DEBUG_VXLAN; return CMD_SUCCESS; } @@ -8757,6 +8408,7 @@ DEFUN (no_debug_pim, PIM_DONT_DEBUG_PIM_PACKETDUMP_SEND; PIM_DONT_DEBUG_PIM_PACKETDUMP_RECV; PIM_DONT_DEBUG_BSM; + PIM_DONT_DEBUG_VXLAN; return CMD_SUCCESS; } @@ -8784,6 +8436,31 @@ DEFUN (no_debug_pim_nht, return CMD_SUCCESS; } +DEFUN (debug_pim_nht_det, + debug_pim_nht_det_cmd, + "debug pim nht detail", + DEBUG_STR + DEBUG_PIM_STR + "Nexthop Tracking\n" + "Detailed Information\n") +{ + PIM_DO_DEBUG_PIM_NHT_DETAIL; + return CMD_SUCCESS; +} + +DEFUN (no_debug_pim_nht_det, + no_debug_pim_nht_det_cmd, + "no debug pim nht detail", + NO_STR + DEBUG_STR + DEBUG_PIM_STR + "Nexthop Tracking\n" + "Detailed Information\n") +{ + PIM_DONT_DEBUG_PIM_NHT_DETAIL; + return CMD_SUCCESS; +} + DEFUN (debug_pim_nht_rp, debug_pim_nht_rp_cmd, "debug pim nht rp", @@ -9205,7 +8882,7 @@ DEFUN (interface_pim_use_source, nb_cli_enqueue_change(vty, "./use-source", NB_OP_MODIFY, argv[3]->arg); return nb_cli_apply_changes(vty, - "./frr-pim:pim/address-family[address-family='%s']", + FRR_PIM_INTERFACE_XPATH, "frr-routing:ipv4"); } @@ -9221,7 +8898,7 @@ DEFUN (interface_no_pim_use_source, nb_cli_enqueue_change(vty, "./use-source", NB_OP_MODIFY, "0.0.0.0"); return nb_cli_apply_changes(vty, - "./frr-pim:pim/address-family[address-family='%s']", + FRR_PIM_INTERFACE_XPATH, "frr-routing:ipv4"); } @@ -9238,7 +8915,8 @@ DEFPY (ip_pim_bfd, igmp_enable_dnode = yang_dnode_getf(vty->candidate_config->dnode, - "%s/frr-igmp:igmp/igmp-enable", VTY_CURR_XPATH); + FRR_GMP_ENABLE_XPATH, VTY_CURR_XPATH, + "frr-routing:ipv4"); if (!igmp_enable_dnode) nb_cli_enqueue_change(vty, "./pim-enable", NB_OP_MODIFY, "true"); @@ -9252,7 +8930,9 @@ DEFPY (ip_pim_bfd, if (prof) nb_cli_enqueue_change(vty, "./bfd/profile", NB_OP_MODIFY, prof); - return nb_cli_apply_changes(vty, "./frr-pim:pim"); + return nb_cli_apply_changes(vty, + FRR_PIM_INTERFACE_XPATH, + "frr-routing:ipv4"); } DEFPY(no_ip_pim_bfd_profile, no_ip_pim_bfd_profile_cmd, @@ -9266,7 +8946,9 @@ DEFPY(no_ip_pim_bfd_profile, no_ip_pim_bfd_profile_cmd, { nb_cli_enqueue_change(vty, "./bfd/profile", NB_OP_DESTROY, NULL); - return nb_cli_apply_changes(vty, "./frr-pim:pim"); + return nb_cli_apply_changes(vty, + FRR_PIM_INTERFACE_XPATH, + "frr-routing:ipv4"); } DEFUN (no_ip_pim_bfd, @@ -9279,7 +8961,9 @@ DEFUN (no_ip_pim_bfd, { nb_cli_enqueue_change(vty, "./bfd", NB_OP_DESTROY, NULL); - return nb_cli_apply_changes(vty, "./frr-pim:pim"); + return nb_cli_apply_changes(vty, + FRR_PIM_INTERFACE_XPATH, + "frr-routing:ipv4"); } DEFUN (ip_pim_bsm, @@ -9293,7 +8977,8 @@ DEFUN (ip_pim_bsm, igmp_enable_dnode = yang_dnode_getf(vty->candidate_config->dnode, - "%s/frr-igmp:igmp/igmp-enable", VTY_CURR_XPATH); + FRR_GMP_ENABLE_XPATH, VTY_CURR_XPATH, + "frr-routing:ipv4"); if (!igmp_enable_dnode) nb_cli_enqueue_change(vty, "./pim-enable", NB_OP_MODIFY, "true"); @@ -9305,7 +8990,8 @@ DEFUN (ip_pim_bsm, nb_cli_enqueue_change(vty, "./bsm", NB_OP_MODIFY, "true"); - return nb_cli_apply_changes(vty, "./frr-pim:pim"); + return nb_cli_apply_changes(vty, + FRR_PIM_INTERFACE_XPATH, "frr-routing:ipv4"); } DEFUN (no_ip_pim_bsm, @@ -9318,7 +9004,8 @@ DEFUN (no_ip_pim_bsm, { nb_cli_enqueue_change(vty, "./bsm", NB_OP_MODIFY, "false"); - return nb_cli_apply_changes(vty, "./frr-pim:pim"); + return nb_cli_apply_changes(vty, + FRR_PIM_INTERFACE_XPATH, "frr-routing:ipv4"); } DEFUN (ip_pim_ucast_bsm, @@ -9332,7 +9019,8 @@ DEFUN (ip_pim_ucast_bsm, igmp_enable_dnode = yang_dnode_getf(vty->candidate_config->dnode, - "%s/frr-igmp:igmp/igmp-enable", VTY_CURR_XPATH); + FRR_GMP_ENABLE_XPATH, VTY_CURR_XPATH, + "frr-routing:ipv4"); if (!igmp_enable_dnode) nb_cli_enqueue_change(vty, "./pim-enable", NB_OP_MODIFY, "true"); @@ -9344,7 +9032,9 @@ DEFUN (ip_pim_ucast_bsm, nb_cli_enqueue_change(vty, "./unicast-bsm", NB_OP_MODIFY, "true"); - return nb_cli_apply_changes(vty, "./frr-pim:pim"); + return nb_cli_apply_changes(vty, + FRR_PIM_INTERFACE_XPATH, "frr-routing:ipv4"); + } DEFUN (no_ip_pim_ucast_bsm, @@ -9357,7 +9047,8 @@ DEFUN (no_ip_pim_ucast_bsm, { nb_cli_enqueue_change(vty, "./unicast-bsm", NB_OP_MODIFY, "false"); - return nb_cli_apply_changes(vty, "./frr-pim:pim"); + return nb_cli_apply_changes(vty, + FRR_PIM_INTERFACE_XPATH, "frr-routing:ipv4"); } #if HAVE_BFDD > 0 @@ -9391,7 +9082,8 @@ DEFUN_HIDDEN ( igmp_enable_dnode = yang_dnode_getf(vty->candidate_config->dnode, - "%s/frr-igmp:igmp/igmp-enable", VTY_CURR_XPATH); + FRR_GMP_ENABLE_XPATH, VTY_CURR_XPATH, + "frr-routing:ipv4"); if (!igmp_enable_dnode) nb_cli_enqueue_change(vty, "./pim-enable", NB_OP_MODIFY, "true"); @@ -9409,7 +9101,8 @@ DEFUN_HIDDEN ( nb_cli_enqueue_change(vty, "./bfd/detect_mult", NB_OP_MODIFY, argv[idx_number]->arg); - return nb_cli_apply_changes(vty, "./frr-pim:pim"); + return nb_cli_apply_changes(vty, + FRR_PIM_INTERFACE_XPATH, "frr-routing:ipv4"); } #if HAVE_BFDD == 0 @@ -9442,7 +9135,7 @@ DEFPY(ip_msdp_peer, ip_msdp_peer_cmd, return CMD_WARNING_CONFIG_FAILED; snprintf(msdp_peer_source_xpath, sizeof(msdp_peer_source_xpath), - FRR_PIM_AF_XPATH, "frr-pim:pimd", "pim", vrfname, + FRR_PIM_VRF_XPATH, "frr-pim:pimd", "pim", vrfname, "frr-routing:ipv4"); snprintf(temp_xpath, sizeof(temp_xpath), "/msdp-peer[peer-ip='%s']/source-ip", peer_str); @@ -9452,7 +9145,8 @@ DEFPY(ip_msdp_peer, ip_msdp_peer_cmd, nb_cli_enqueue_change(vty, msdp_peer_source_xpath, NB_OP_MODIFY, source_str); - return nb_cli_apply_changes(vty, NULL); + return nb_cli_apply_changes(vty, + FRR_PIM_INTERFACE_XPATH, "frr-routing:ipv4"); } DEFPY(ip_msdp_timers, ip_msdp_timers_cmd, @@ -9534,7 +9228,7 @@ DEFUN (no_ip_msdp_peer, return CMD_WARNING_CONFIG_FAILED; snprintf(msdp_peer_xpath, sizeof(msdp_peer_xpath), - FRR_PIM_AF_XPATH, + FRR_PIM_VRF_XPATH, "frr-pim:pimd", "pim", vrfname, "frr-routing:ipv4"); snprintf(temp_xpath, sizeof(temp_xpath), "/msdp-peer[peer-ip='%s']", @@ -9566,7 +9260,7 @@ DEFPY(ip_msdp_mesh_group_member, /* Create mesh group. */ snprintf(xpath_value, sizeof(xpath_value), - FRR_PIM_AF_XPATH "/msdp-mesh-groups[name='%s']", + FRR_PIM_VRF_XPATH "/msdp-mesh-groups[name='%s']", "frr-pim:pimd", "pim", vrfname, "frr-routing:ipv4", gname); nb_cli_enqueue_change(vty, xpath_value, NB_OP_CREATE, NULL); @@ -9600,7 +9294,7 @@ DEFPY(no_ip_msdp_mesh_group_member, /* Get mesh group base XPath. */ snprintf(xpath_value, sizeof(xpath_value), - FRR_PIM_AF_XPATH "/msdp-mesh-groups[name='%s']", + FRR_PIM_VRF_XPATH "/msdp-mesh-groups[name='%s']", "frr-pim:pimd", "pim", vrfname, "frr-routing:ipv4", gname); if (!yang_dnode_exists(vty->candidate_config->dnode, xpath_value)) { @@ -9650,7 +9344,7 @@ DEFPY(ip_msdp_mesh_group_source, /* Create mesh group. */ snprintf(xpath_value, sizeof(xpath_value), - FRR_PIM_AF_XPATH "/msdp-mesh-groups[name='%s']", + FRR_PIM_VRF_XPATH "/msdp-mesh-groups[name='%s']", "frr-pim:pimd", "pim", vrfname, "frr-routing:ipv4", gname); nb_cli_enqueue_change(vty, xpath_value, NB_OP_CREATE, NULL); @@ -9681,7 +9375,7 @@ DEFPY(no_ip_msdp_mesh_group_source, /* Get mesh group base XPath. */ snprintf(xpath_value, sizeof(xpath_value), - FRR_PIM_AF_XPATH "/msdp-mesh-groups[name='%s']", + FRR_PIM_VRF_XPATH "/msdp-mesh-groups[name='%s']", "frr-pim:pimd", "pim", vrfname, "frr-routing:ipv4", gname); nb_cli_enqueue_change(vty, xpath_value, NB_OP_CREATE, NULL); @@ -9716,7 +9410,7 @@ DEFPY(no_ip_msdp_mesh_group, /* Get mesh group base XPath. */ snprintf(xpath_value, sizeof(xpath_value), - FRR_PIM_AF_XPATH "/msdp-mesh-groups[name='%s']", + FRR_PIM_VRF_XPATH "/msdp-mesh-groups[name='%s']", "frr-pim:pimd", "pim", vrfname, "frr-routing:ipv4", gname); if (!yang_dnode_exists(vty->candidate_config->dnode, xpath_value)) return CMD_SUCCESS; @@ -9814,12 +9508,8 @@ DEFUN (show_ip_msdp_mesh_group, SLIST_FOREACH (mg, &pim->msdp.mglist, mg_entry) ip_msdp_show_mesh_group(vty, mg, json); - if (uj) { - vty_out(vty, "%s\n", - json_object_to_json_string_ext( - json, JSON_C_TO_STRING_PRETTY)); - json_object_free(json); - } + if (uj) + vty_json(vty, json); return CMD_SUCCESS; } @@ -9855,12 +9545,9 @@ DEFUN (show_ip_msdp_mesh_group_vrf_all, ip_msdp_show_mesh_group(vty, mg, vrf_json); } - if (uj) { - vty_out(vty, "%s\n", - json_object_to_json_string_ext( - json, JSON_C_TO_STRING_PRETTY)); - json_object_free(json); - } + if (uj) + vty_json(vty, json); + return CMD_SUCCESS; } @@ -9912,11 +9599,8 @@ static void ip_msdp_show_peers(struct pim_instance *pim, struct vty *vty, } } - if (uj) { - vty_out(vty, "%s\n", json_object_to_json_string_ext( - json, JSON_C_TO_STRING_PRETTY)); - json_object_free(json); - } + if (uj) + vty_json(vty, json); } static void ip_msdp_show_peers_detail(struct pim_instance *pim, struct vty *vty, @@ -10020,11 +9704,8 @@ static void ip_msdp_show_peers_detail(struct pim_instance *pim, struct vty *vty, } } - if (uj) { - vty_out(vty, "%s\n", json_object_to_json_string_ext( - json, JSON_C_TO_STRING_PRETTY)); - json_object_free(json); - } + if (uj) + vty_json(vty, json); } DEFUN (show_ip_msdp_peer_detail, @@ -10105,8 +9786,6 @@ static void ip_msdp_show_sa(struct pim_instance *pim, struct vty *vty, bool uj) { struct listnode *sanode; struct pim_msdp_sa *sa; - char src_str[INET_ADDRSTRLEN]; - char grp_str[INET_ADDRSTRLEN]; char rp_str[INET_ADDRSTRLEN]; char timebuf[PIM_MSDP_UPTIME_STRLEN]; char spt_str[8]; @@ -10126,8 +9805,6 @@ static void ip_msdp_show_sa(struct pim_instance *pim, struct vty *vty, bool uj) for (ALL_LIST_ELEMENTS_RO(pim->msdp.sa_list, sanode, sa)) { now = pim_time_monotonic_sec(); pim_time_uptime(timebuf, sizeof(timebuf), now - sa->uptime); - pim_inet4_dump("<src?>", sa->sg.src, src_str, sizeof(src_str)); - pim_inet4_dump("<grp?>", sa->sg.grp, grp_str, sizeof(grp_str)); if (sa->flags & PIM_MSDP_SAF_PEER) { pim_inet4_dump("<rp?>", sa->rp, rp_str, sizeof(rp_str)); if (sa->up) { @@ -10145,6 +9822,14 @@ static void ip_msdp_show_sa(struct pim_instance *pim, struct vty *vty, bool uj) strlcpy(local_str, "no", sizeof(local_str)); } if (uj) { + char src_str[PIM_ADDRSTRLEN]; + char grp_str[PIM_ADDRSTRLEN]; + + snprintfrr(grp_str, sizeof(grp_str), "%pPAs", + &sa->sg.grp); + snprintfrr(src_str, sizeof(src_str), "%pPAs", + &sa->sg.src); + json_object_object_get_ex(json, grp_str, &json_group); if (!json_group) { @@ -10162,17 +9847,14 @@ static void ip_msdp_show_sa(struct pim_instance *pim, struct vty *vty, bool uj) json_object_string_add(json_row, "upTime", timebuf); json_object_object_add(json_group, src_str, json_row); } else { - vty_out(vty, "%-15s %15s %15s %5c %3c %8s\n", - src_str, grp_str, rp_str, local_str[0], + vty_out(vty, "%-15pPAs %15pPAs %15s %5c %3c %8s\n", + &sa->sg.src, &sa->sg.grp, rp_str, local_str[0], spt_str[0], timebuf); } } - if (uj) { - vty_out(vty, "%s\n", json_object_to_json_string_ext( - json, JSON_C_TO_STRING_PRETTY)); - json_object_free(json); - } + if (uj) + vty_json(vty, json); } static void ip_msdp_show_sa_entry_detail(struct pim_msdp_sa *sa, @@ -10246,8 +9928,6 @@ static void ip_msdp_show_sa_detail(struct pim_instance *pim, struct vty *vty, { struct listnode *sanode; struct pim_msdp_sa *sa; - char src_str[INET_ADDRSTRLEN]; - char grp_str[INET_ADDRSTRLEN]; json_object *json = NULL; if (uj) { @@ -10255,17 +9935,18 @@ static void ip_msdp_show_sa_detail(struct pim_instance *pim, struct vty *vty, } for (ALL_LIST_ELEMENTS_RO(pim->msdp.sa_list, sanode, sa)) { - pim_inet4_dump("<src?>", sa->sg.src, src_str, sizeof(src_str)); - pim_inet4_dump("<grp?>", sa->sg.grp, grp_str, sizeof(grp_str)); + char src_str[PIM_ADDRSTRLEN]; + char grp_str[PIM_ADDRSTRLEN]; + + snprintfrr(grp_str, sizeof(grp_str), "%pPAs", &sa->sg.grp); + snprintfrr(src_str, sizeof(src_str), "%pPAs", &sa->sg.src); + ip_msdp_show_sa_entry_detail(sa, src_str, grp_str, vty, uj, json); } - if (uj) { - vty_out(vty, "%s\n", json_object_to_json_string_ext( - json, JSON_C_TO_STRING_PRETTY)); - json_object_free(json); - } + if (uj) + vty_json(vty, json); } DEFUN (show_ip_msdp_sa_detail, @@ -10329,8 +10010,6 @@ static void ip_msdp_show_sa_addr(struct pim_instance *pim, struct vty *vty, { struct listnode *sanode; struct pim_msdp_sa *sa; - char src_str[INET_ADDRSTRLEN]; - char grp_str[INET_ADDRSTRLEN]; json_object *json = NULL; if (uj) { @@ -10338,19 +10017,20 @@ static void ip_msdp_show_sa_addr(struct pim_instance *pim, struct vty *vty, } for (ALL_LIST_ELEMENTS_RO(pim->msdp.sa_list, sanode, sa)) { - pim_inet4_dump("<src?>", sa->sg.src, src_str, sizeof(src_str)); - pim_inet4_dump("<grp?>", sa->sg.grp, grp_str, sizeof(grp_str)); + char src_str[PIM_ADDRSTRLEN]; + char grp_str[PIM_ADDRSTRLEN]; + + snprintfrr(grp_str, sizeof(grp_str), "%pPAs", &sa->sg.grp); + snprintfrr(src_str, sizeof(src_str), "%pPAs", &sa->sg.src); + if (!strcmp(addr, src_str) || !strcmp(addr, grp_str)) { ip_msdp_show_sa_entry_detail(sa, src_str, grp_str, vty, uj, json); } } - if (uj) { - vty_out(vty, "%s\n", json_object_to_json_string_ext( - json, JSON_C_TO_STRING_PRETTY)); - json_object_free(json); - } + if (uj) + vty_json(vty, json); } static void ip_msdp_show_sa_sg(struct pim_instance *pim, struct vty *vty, @@ -10358,8 +10038,6 @@ static void ip_msdp_show_sa_sg(struct pim_instance *pim, struct vty *vty, { struct listnode *sanode; struct pim_msdp_sa *sa; - char src_str[INET_ADDRSTRLEN]; - char grp_str[INET_ADDRSTRLEN]; json_object *json = NULL; if (uj) { @@ -10367,19 +10045,20 @@ static void ip_msdp_show_sa_sg(struct pim_instance *pim, struct vty *vty, } for (ALL_LIST_ELEMENTS_RO(pim->msdp.sa_list, sanode, sa)) { - pim_inet4_dump("<src?>", sa->sg.src, src_str, sizeof(src_str)); - pim_inet4_dump("<grp?>", sa->sg.grp, grp_str, sizeof(grp_str)); + char src_str[PIM_ADDRSTRLEN]; + char grp_str[PIM_ADDRSTRLEN]; + + snprintfrr(grp_str, sizeof(grp_str), "%pPAs", &sa->sg.grp); + snprintfrr(src_str, sizeof(src_str), "%pPAs", &sa->sg.src); + if (!strcmp(src, src_str) && !strcmp(grp, grp_str)) { ip_msdp_show_sa_entry_detail(sa, src_str, grp_str, vty, uj, json); } } - if (uj) { - vty_out(vty, "%s\n", json_object_to_json_string_ext( - json, JSON_C_TO_STRING_PRETTY)); - json_object_free(json); - } + if (uj) + vty_json(vty, json); } DEFUN (show_ip_msdp_sa_sg, @@ -10479,8 +10158,6 @@ static void pim_show_vxlan_sg_entry(struct pim_vxlan_sg *vxlan_sg, { struct vty *vty = cwd->vty; json_object *json = cwd->json; - char src_str[INET_ADDRSTRLEN]; - char grp_str[INET_ADDRSTRLEN]; json_object *json_row; bool installed = (vxlan_sg->up) ? true : false; const char *iif_name = vxlan_sg->iif?vxlan_sg->iif->name:"-"; @@ -10491,13 +10168,19 @@ static void pim_show_vxlan_sg_entry(struct pim_vxlan_sg *vxlan_sg, else oif_name = vxlan_sg->term_oif?vxlan_sg->term_oif->name:""; - if (cwd->addr_match && (vxlan_sg->sg.src.s_addr != cwd->addr.s_addr) && - (vxlan_sg->sg.grp.s_addr != cwd->addr.s_addr)) { + if (cwd->addr_match && pim_addr_cmp(vxlan_sg->sg.src, cwd->addr) && + pim_addr_cmp(vxlan_sg->sg.grp, cwd->addr)) { return; } - pim_inet4_dump("<src?>", vxlan_sg->sg.src, src_str, sizeof(src_str)); - pim_inet4_dump("<grp?>", vxlan_sg->sg.grp, grp_str, sizeof(grp_str)); if (json) { + char src_str[PIM_ADDRSTRLEN]; + char grp_str[PIM_ADDRSTRLEN]; + + snprintfrr(grp_str, sizeof(grp_str), "%pPAs", + &vxlan_sg->sg.grp); + snprintfrr(src_str, sizeof(src_str), "%pPAs", + &vxlan_sg->sg.src); + json_object_object_get_ex(json, grp_str, &cwd->json_group); if (!cwd->json_group) { @@ -10517,9 +10200,9 @@ static void pim_show_vxlan_sg_entry(struct pim_vxlan_sg *vxlan_sg, json_object_boolean_false_add(json_row, "installed"); json_object_object_add(cwd->json_group, src_str, json_row); } else { - vty_out(vty, "%-15s %-15s %-15s %-15s %-5s\n", - src_str, grp_str, iif_name, oif_name, - installed?"I":""); + vty_out(vty, "%-15pPAs %-15pPAs %-15s %-15s %-5s\n", + &vxlan_sg->sg.src, &vxlan_sg->sg.grp, iif_name, + oif_name, installed ? "I" : ""); } } @@ -10548,11 +10231,8 @@ static void pim_show_vxlan_sg(struct pim_instance *pim, cwd.json = json; hash_iterate(pim->vxlan.sg_hash, pim_show_vxlan_sg_hash_entry, &cwd); - if (uj) { - vty_out(vty, "%s\n", json_object_to_json_string_ext( - json, JSON_C_TO_STRING_PRETTY)); - json_object_free(json); - } + if (uj) + vty_json(vty, json); } static void pim_show_vxlan_sg_match_addr(struct pim_instance *pim, @@ -10584,11 +10264,8 @@ static void pim_show_vxlan_sg_match_addr(struct pim_instance *pim, cwd.addr_match = true; hash_iterate(pim->vxlan.sg_hash, pim_show_vxlan_sg_hash_entry, &cwd); - if (uj) { - vty_out(vty, "%s\n", json_object_to_json_string_ext( - json, JSON_C_TO_STRING_PRETTY)); - json_object_free(json); - } + if (uj) + vty_json(vty, json); } static void pim_show_vxlan_sg_one(struct pim_instance *pim, @@ -10596,7 +10273,7 @@ static void pim_show_vxlan_sg_one(struct pim_instance *pim, bool uj) { json_object *json = NULL; - struct prefix_sg sg; + pim_sgaddr sg; int result = 0; struct pim_vxlan_sg *vxlan_sg; const char *iif_name; @@ -10616,8 +10293,6 @@ static void pim_show_vxlan_sg_one(struct pim_instance *pim, return; } - sg.family = AF_INET; - sg.prefixlen = IPV4_MAX_BITLEN; if (uj) json = json_object_new_object(); @@ -10652,11 +10327,8 @@ static void pim_show_vxlan_sg_one(struct pim_instance *pim, } } - if (uj) { - vty_out(vty, "%s\n", json_object_to_json_string_ext( - json, JSON_C_TO_STRING_PRETTY)); - json_object_free(json); - } + if (uj) + vty_json(vty, json); } DEFUN (show_ip_pim_vxlan_sg, @@ -10717,11 +10389,8 @@ static void pim_show_vxlan_sg_work(struct pim_instance *pim, for (ALL_LIST_ELEMENTS_RO(pim_vxlan_p->work_list, node, vxlan_sg)) pim_show_vxlan_sg_entry(vxlan_sg, &cwd); - if (uj) { - vty_out(vty, "%s\n", json_object_to_json_string_ext( - json, JSON_C_TO_STRING_PRETTY)); - json_object_free(json); - } + if (uj) + vty_json(vty, json); } DEFUN_HIDDEN (show_ip_pim_vxlan_sg_work, @@ -10758,7 +10427,7 @@ DEFUN_HIDDEN (no_ip_pim_mlag, { char mlag_xpath[XPATH_MAXLEN]; - snprintf(mlag_xpath, sizeof(mlag_xpath), FRR_PIM_AF_XPATH, + snprintf(mlag_xpath, sizeof(mlag_xpath), FRR_PIM_VRF_XPATH, "frr-pim:pimd", "pim", "default", "frr-routing:ipv4"); strlcat(mlag_xpath, "/mlag", sizeof(mlag_xpath)); @@ -10791,7 +10460,7 @@ DEFUN_HIDDEN (ip_pim_mlag, char mlag_reg_address_xpath[XPATH_MAXLEN]; snprintf(mlag_peerlink_rif_xpath, sizeof(mlag_peerlink_rif_xpath), - FRR_PIM_AF_XPATH, + FRR_PIM_VRF_XPATH, "frr-pim:pimd", "pim", "default", "frr-routing:ipv4"); strlcat(mlag_peerlink_rif_xpath, "/mlag/peerlink-rif", sizeof(mlag_peerlink_rif_xpath)); @@ -10801,7 +10470,7 @@ DEFUN_HIDDEN (ip_pim_mlag, argv[idx]->arg); snprintf(mlag_my_role_xpath, sizeof(mlag_my_role_xpath), - FRR_PIM_AF_XPATH, + FRR_PIM_VRF_XPATH, "frr-pim:pimd", "pim", "default", "frr-routing:ipv4"); strlcat(mlag_my_role_xpath, "/mlag/my-role", sizeof(mlag_my_role_xpath)); @@ -10821,7 +10490,7 @@ DEFUN_HIDDEN (ip_pim_mlag, } snprintf(mlag_peer_state_xpath, sizeof(mlag_peer_state_xpath), - FRR_PIM_AF_XPATH, + FRR_PIM_VRF_XPATH, "frr-pim:pimd", "pim", "default", "frr-routing:ipv4"); strlcat(mlag_peer_state_xpath, "/mlag/peer-state", sizeof(mlag_peer_state_xpath)); @@ -10841,7 +10510,7 @@ DEFUN_HIDDEN (ip_pim_mlag, } snprintf(mlag_reg_address_xpath, sizeof(mlag_reg_address_xpath), - FRR_PIM_AF_XPATH, + FRR_PIM_VRF_XPATH, "frr-pim:pimd", "pim", "default", "frr-routing:ipv4"); strlcat(mlag_reg_address_xpath, "/mlag/reg-address", sizeof(mlag_reg_address_xpath)); @@ -11058,6 +10727,8 @@ void pim_cmd_init(void) install_element(ENABLE_NODE, &no_debug_pim_cmd); install_element(ENABLE_NODE, &debug_pim_nht_cmd); install_element(ENABLE_NODE, &no_debug_pim_nht_cmd); + install_element(ENABLE_NODE, &debug_pim_nht_det_cmd); + install_element(ENABLE_NODE, &no_debug_pim_nht_det_cmd); install_element(ENABLE_NODE, &debug_pim_nht_rp_cmd); install_element(ENABLE_NODE, &no_debug_pim_nht_rp_cmd); install_element(ENABLE_NODE, &debug_pim_events_cmd); @@ -11109,12 +10780,18 @@ void pim_cmd_init(void) install_element(CONFIG_NODE, &no_debug_pim_cmd); install_element(CONFIG_NODE, &debug_pim_nht_cmd); install_element(CONFIG_NODE, &no_debug_pim_nht_cmd); + install_element(CONFIG_NODE, &debug_pim_nht_det_cmd); + install_element(CONFIG_NODE, &no_debug_pim_nht_det_cmd); install_element(CONFIG_NODE, &debug_pim_nht_rp_cmd); install_element(CONFIG_NODE, &no_debug_pim_nht_rp_cmd); install_element(CONFIG_NODE, &debug_pim_events_cmd); install_element(CONFIG_NODE, &no_debug_pim_events_cmd); install_element(CONFIG_NODE, &debug_pim_packets_cmd); install_element(CONFIG_NODE, &no_debug_pim_packets_cmd); + install_element(CONFIG_NODE, &debug_pim_packetdump_send_cmd); + install_element(CONFIG_NODE, &no_debug_pim_packetdump_send_cmd); + install_element(CONFIG_NODE, &debug_pim_packetdump_recv_cmd); + install_element(CONFIG_NODE, &no_debug_pim_packetdump_recv_cmd); install_element(CONFIG_NODE, &debug_pim_trace_cmd); install_element(CONFIG_NODE, &no_debug_pim_trace_cmd); install_element(CONFIG_NODE, &debug_pim_trace_detail_cmd); |
