summaryrefslogtreecommitdiff
path: root/pimd/pim_cmd.c
diff options
context:
space:
mode:
Diffstat (limited to 'pimd/pim_cmd.c')
-rw-r--r--pimd/pim_cmd.c1905
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);