summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pimd/pim6_cmd.c247
-rw-r--r--pimd/pim_cmd.c260
-rw-r--r--pimd/pim_cmd_common.c298
-rw-r--r--pimd/pim_cmd_common.h17
4 files changed, 341 insertions, 481 deletions
diff --git a/pimd/pim6_cmd.c b/pimd/pim6_cmd.c
index 77844988ea..5adeb51c19 100644
--- a/pimd/pim6_cmd.c
+++ b/pimd/pim6_cmd.c
@@ -1235,17 +1235,7 @@ DEFPY (show_ipv6_pim_channel,
"PIM downstream channel info\n"
JSON_STR)
{
- struct vrf *v;
- bool uj = !!json;
-
- v = vrf_lookup_by_name(vrf ? vrf : VRF_DEFAULT_NAME);
-
- if (!v)
- return CMD_WARNING;
-
- pim_show_channel(v->info, vty, uj);
-
- return CMD_SUCCESS;
+ return pim_show_channel_cmd_helper(vrf, vty, !!json);
}
DEFPY (show_ipv6_pim_interface,
@@ -1260,28 +1250,8 @@ DEFPY (show_ipv6_pim_interface,
"interface name\n"
JSON_STR)
{
- struct vrf *v;
- bool uj = !!json;
- json_object *json_parent = NULL;
-
- v = vrf_lookup_by_name(vrf ? vrf : VRF_DEFAULT_NAME);
-
- if (!v)
- return CMD_WARNING;
-
- if (uj)
- json_parent = json_object_new_object();
-
- if (interface)
- pim_show_interfaces_single(v->info, vty, interface, false,
- json_parent);
- else
- pim_show_interfaces(v->info, vty, false, json_parent);
-
- if (uj)
- vty_json(vty, json_parent);
-
- return CMD_SUCCESS;
+ return pim_show_interface_cmd_helper(vrf, vty, !!json, false,
+ interface);
}
DEFPY (show_ipv6_pim_interface_vrf_all,
@@ -1296,33 +1266,8 @@ DEFPY (show_ipv6_pim_interface_vrf_all,
"interface name\n"
JSON_STR)
{
- bool uj = !!json;
- struct vrf *v;
- json_object *json_parent = NULL;
- json_object *json_vrf = NULL;
-
- if (uj)
- json_parent = json_object_new_object();
-
- RB_FOREACH (v, vrf_name_head, &vrfs_by_name) {
- if (!uj)
- vty_out(vty, "VRF: %s\n", v->name);
- else
- json_vrf = json_object_new_object();
-
- if (interface)
- pim_show_interfaces_single(v->info, vty, interface,
- false, json_vrf);
- else
- pim_show_interfaces(v->info, vty, false, json_vrf);
-
- if (uj)
- json_object_object_add(json_parent, v->name, json_vrf);
- }
- if (uj)
- vty_json(vty, json_parent);
-
- return CMD_SUCCESS;
+ return pim_show_interface_vrf_all_cmd_helper(vty, !!json, false,
+ interface);
}
DEFPY (show_ipv6_pim_join,
@@ -1337,41 +1282,7 @@ DEFPY (show_ipv6_pim_join,
"The Group\n"
JSON_STR)
{
- pim_sgaddr sg = {};
- struct vrf *v;
- struct pim_instance *pim;
- json_object *json_parent = NULL;
-
- v = vrf_lookup_by_name(vrf ? vrf : VRF_DEFAULT_NAME);
-
- if (!v) {
- vty_out(vty, "%% Vrf specified: %s does not exist\n", vrf);
- return CMD_WARNING;
- }
- pim = pim_get_pim_instance(v->vrf_id);
-
- if (!pim) {
- vty_out(vty, "%% Unable to find pim instance\n");
- return CMD_WARNING;
- }
-
- if (!pim_addr_is_any(s_or_g)) {
- if (!pim_addr_is_any(g)) {
- sg.src = s_or_g;
- sg.grp = g;
- } else
- sg.grp = s_or_g;
- }
-
- if (json)
- json_parent = json_object_new_object();
-
- pim_show_join(pim, vty, &sg, json_parent);
-
- if (json)
- vty_json(vty, json_parent);
-
- return CMD_SUCCESS;
+ return pim_show_join_cmd_helper(vrf, vty, s_or_g, g, json);
}
DEFPY (show_ipv6_pim_join_vrf_all,
@@ -1384,29 +1295,7 @@ DEFPY (show_ipv6_pim_join_vrf_all,
"PIM interface join information\n"
JSON_STR)
{
- pim_sgaddr sg = {0};
- struct vrf *vrf_struct;
- json_object *json_parent = NULL;
- json_object *json_vrf = NULL;
-
- if (json)
- json_parent = json_object_new_object();
-
- RB_FOREACH (vrf_struct, vrf_name_head, &vrfs_by_name) {
- if (!json_parent)
- vty_out(vty, "VRF: %s\n", vrf_struct->name);
- else
- json_vrf = json_object_new_object();
- pim_show_join(vrf_struct->info, vty, &sg, json_vrf);
-
- if (json)
- json_object_object_add(json_parent, vrf_struct->name,
- json_vrf);
- }
- if (json)
- vty_json(vty, json_parent);
-
- return CMD_WARNING;
+ return pim_show_join_vrf_all_cmd_helper(vty, json);
}
DEFPY (show_ipv6_pim_jp_agg,
@@ -1418,25 +1307,7 @@ DEFPY (show_ipv6_pim_jp_agg,
VRF_CMD_HELP_STR
"join prune aggregation list\n")
{
- struct vrf *v;
- struct pim_instance *pim;
-
- v = vrf_lookup_by_name(vrf ? vrf : VRF_DEFAULT_NAME);
-
- if (!v) {
- vty_out(vty, "%% Vrf specified: %s does not exist\n", vrf);
- return CMD_WARNING;
- }
- pim = pim_get_pim_instance(v->vrf_id);
-
- if (!pim) {
- vty_out(vty, "%% Unable to find pim instance\n");
- return CMD_WARNING;
- }
-
- pim_show_jp_agg_list(pim, vty);
-
- return CMD_SUCCESS;
+ return pim_show_jp_agg_list_cmd_helper(vrf, vty);
}
DEFPY (show_ipv6_pim_local_membership,
@@ -1449,17 +1320,7 @@ DEFPY (show_ipv6_pim_local_membership,
"PIM interface local-membership\n"
JSON_STR)
{
- struct vrf *v;
- bool uj = !!json;
-
- v = vrf_lookup_by_name(vrf ? vrf : VRF_DEFAULT_NAME);
-
- if (!v)
- return CMD_WARNING;
-
- pim_show_membership(v->info, vty, uj);
-
- return CMD_SUCCESS;
+ return pim_show_membership_cmd_helper(vrf, vty, !!json);
}
DEFPY (show_ipv6_pim_neighbor,
@@ -1474,26 +1335,7 @@ DEFPY (show_ipv6_pim_neighbor,
"Name of interface or neighbor\n"
JSON_STR)
{
- struct vrf *v;
- json_object *json_parent = NULL;
-
- v = vrf_lookup_by_name(vrf ? vrf : VRF_DEFAULT_NAME);
-
- if (!v)
- return CMD_WARNING;
-
- if (json)
- json_parent = json_object_new_object();
-
- if (interface)
- pim_show_neighbors_single(v->info, vty, interface, json_parent);
- else
- pim_show_neighbors(v->info, vty, json_parent);
-
- if (json)
- vty_json(vty, json_parent);
-
- return CMD_SUCCESS;
+ return pim_show_neighbors_cmd_helper(vrf, vty, json, interface);
}
DEFPY (show_ipv6_pim_neighbor_vrf_all,
@@ -1508,31 +1350,7 @@ DEFPY (show_ipv6_pim_neighbor_vrf_all,
"Name of interface or neighbor\n"
JSON_STR)
{
- struct vrf *v;
- json_object *json_parent = NULL;
- json_object *json_vrf = NULL;
-
- if (json)
- json_parent = json_object_new_object();
- RB_FOREACH (v, vrf_name_head, &vrfs_by_name) {
- if (!json)
- vty_out(vty, "VRF: %s\n", v->name);
- else
- json_vrf = json_object_new_object();
-
- if (interface)
- pim_show_neighbors_single(v->info, vty, interface,
- json_vrf);
- else
- pim_show_neighbors(v->info, vty, json_vrf);
-
- if (json)
- json_object_object_add(json_parent, v->name, json_vrf);
- }
- if (json)
- vty_json(vty, json_parent);
-
- return CMD_SUCCESS;
+ return pim_show_neighbors_vrf_all_cmd_helper(vty, json, interface);
}
DEFPY (show_ipv6_pim_nexthop,
@@ -1544,16 +1362,7 @@ DEFPY (show_ipv6_pim_nexthop,
VRF_CMD_HELP_STR
"PIM cached nexthop rpf information\n")
{
- struct vrf *v;
-
- v = vrf_lookup_by_name(vrf ? vrf : VRF_DEFAULT_NAME);
-
- if (!v)
- return CMD_WARNING;
-
- pim_show_nexthop(v->info, vty);
-
- return CMD_SUCCESS;
+ return pim_show_nexthop_cmd_helper(vrf, vty);
}
DEFPY (show_ipv6_pim_nexthop_lookup,
@@ -1567,37 +1376,7 @@ DEFPY (show_ipv6_pim_nexthop_lookup,
"Source/RP address\n"
"Multicast Group address\n")
{
- struct prefix nht_p;
- int result = 0;
- pim_addr vif_source;
- struct prefix grp;
- struct pim_nexthop nexthop;
- struct vrf *v;
-
- v = vrf_lookup_by_name(vrf ? vrf : VRF_DEFAULT_NAME);
-
- if (!v)
- return CMD_WARNING;
-
- if (!pim_rp_set_upstream_addr(v->info, &vif_source, source, group))
- return CMD_SUCCESS;
-
- pim_addr_to_prefix(&nht_p, vif_source);
- pim_addr_to_prefix(&grp, group);
- memset(&nexthop, 0, sizeof(nexthop));
-
- result = pim_ecmp_nexthop_lookup(v->info, &nexthop, &nht_p, &grp, 0);
-
- if (!result) {
- vty_out(vty,
- "Nexthop Lookup failed, no usable routes returned.\n");
- return CMD_SUCCESS;
- }
-
- vty_out(vty, "Group %s --- Nexthop %pPAs Interface %s\n", group_str,
- &nexthop.mrib_nexthop_addr, nexthop.interface->name);
-
- return CMD_SUCCESS;
+ return pim_show_nexthop_lookup_cmd_helper(vrf, vty, source, group);
}
DEFPY (show_ipv6_multicast,
diff --git a/pimd/pim_cmd.c b/pimd/pim_cmd.c
index 07c4444937..9766a38c15 100644
--- a/pimd/pim_cmd.c
+++ b/pimd/pim_cmd.c
@@ -2422,29 +2422,8 @@ DEFPY (show_ip_pim_interface,
"interface name\n"
JSON_STR)
{
- struct vrf *v;
- bool uj = !!json;
- bool is_mlag = !!mlag;
- json_object *json_parent = NULL;
-
- v = vrf_lookup_by_name(vrf ? vrf : VRF_DEFAULT_NAME);
-
- if (!v)
- return CMD_WARNING;
-
- if (uj)
- json_parent = json_object_new_object();
-
- if (interface)
- pim_show_interfaces_single(v->info, vty, interface, is_mlag,
- json_parent);
- else
- pim_show_interfaces(v->info, vty, is_mlag, json_parent);
-
- if (uj)
- vty_json(vty, json_parent);
-
- return CMD_SUCCESS;
+ return pim_show_interface_cmd_helper(vrf, vty, !!json, !!mlag,
+ interface);
}
DEFPY (show_ip_pim_interface_vrf_all,
@@ -2460,34 +2439,8 @@ DEFPY (show_ip_pim_interface_vrf_all,
"interface name\n"
JSON_STR)
{
- bool uj = !!json;
- bool is_mlag = !!mlag;
- struct vrf *v;
- json_object *json_parent = NULL;
- json_object *json_vrf = NULL;
-
- if (uj)
- json_parent = json_object_new_object();
-
- RB_FOREACH (v, vrf_name_head, &vrfs_by_name) {
- if (!uj)
- vty_out(vty, "VRF: %s\n", v->name);
- else
- json_vrf = json_object_new_object();
-
- if (interface)
- pim_show_interfaces_single(v->info, vty, interface,
- is_mlag, json_vrf);
- else
- pim_show_interfaces(v->info, vty, is_mlag, json_vrf);
-
- if (uj)
- json_object_object_add(json_parent, v->name, json_vrf);
- }
- if (uj)
- vty_json(vty, json_parent);
-
- return CMD_SUCCESS;
+ return pim_show_interface_vrf_all_cmd_helper(vty, !!json, !!mlag,
+ interface);
}
DEFPY (show_ip_pim_join,
@@ -2502,41 +2455,7 @@ DEFPY (show_ip_pim_join,
"The Group\n"
JSON_STR)
{
- pim_sgaddr sg = {0};
- struct vrf *v;
- struct pim_instance *pim;
- json_object *json_parent = NULL;
-
- v = vrf_lookup_by_name(vrf ? vrf : VRF_DEFAULT_NAME);
-
- if (!v) {
- vty_out(vty, "%% Vrf specified: %s does not exist\n", vrf);
- return CMD_WARNING;
- }
- pim = pim_get_pim_instance(v->vrf_id);
-
- if (!pim) {
- vty_out(vty, "%% Unable to find pim instance\n");
- return CMD_WARNING;
- }
-
- if (s_or_g.s_addr != INADDR_ANY) {
- if (g.s_addr != INADDR_ANY) {
- sg.src = s_or_g;
- sg.grp = g;
- } else
- sg.grp = s_or_g;
- }
-
- if (json)
- json_parent = json_object_new_object();
-
- pim_show_join(pim, vty, &sg, json_parent);
-
- if (json)
- vty_json(vty, json_parent);
-
- return CMD_SUCCESS;
+ return pim_show_join_cmd_helper(vrf, vty, s_or_g, g, json);
}
DEFPY (show_ip_pim_join_vrf_all,
@@ -2549,28 +2468,7 @@ DEFPY (show_ip_pim_join_vrf_all,
"PIM interface join information\n"
JSON_STR)
{
- pim_sgaddr sg = {0};
- struct vrf *vrf_struct;
- json_object *json_parent = NULL;
- json_object *json_vrf = NULL;
-
- if (json)
- json_parent = json_object_new_object();
- RB_FOREACH (vrf_struct, vrf_name_head, &vrfs_by_name) {
- if (!json)
- vty_out(vty, "VRF: %s\n", vrf_struct->name);
- else
- json_vrf = json_object_new_object();
- pim_show_join(vrf_struct->info, vty, &sg, json_vrf);
-
- if (json)
- json_object_object_add(json_parent, vrf_struct->name,
- json_vrf);
- }
- if (json)
- vty_json(vty, json_parent);
-
- return CMD_WARNING;
+ return pim_show_join_vrf_all_cmd_helper(vty, json);
}
DEFPY (show_ip_pim_jp_agg,
@@ -2582,25 +2480,7 @@ DEFPY (show_ip_pim_jp_agg,
VRF_CMD_HELP_STR
"join prune aggregation list\n")
{
- struct vrf *v;
- struct pim_instance *pim;
-
- v = vrf_lookup_by_name(vrf ? vrf : VRF_DEFAULT_NAME);
-
- if (!v) {
- vty_out(vty, "%% Vrf specified: %s does not exist\n", vrf);
- return CMD_WARNING;
- }
- pim = pim_get_pim_instance(v->vrf_id);
-
- if (!pim) {
- vty_out(vty, "%% Unable to find pim instance\n");
- return CMD_WARNING;
- }
-
- pim_show_jp_agg_list(pim, vty);
-
- return CMD_SUCCESS;
+ return pim_show_jp_agg_list_cmd_helper(vrf, vty);
}
DEFPY (show_ip_pim_local_membership,
@@ -2613,17 +2493,7 @@ DEFPY (show_ip_pim_local_membership,
"PIM interface local-membership\n"
JSON_STR)
{
- struct vrf *v;
- bool uj = !!json;
-
- v = vrf_lookup_by_name(vrf ? vrf : VRF_DEFAULT_NAME);
-
- if (!v)
- return CMD_WARNING;
-
- pim_show_membership(v->info, vty, uj);
-
- return CMD_SUCCESS;
+ return pim_show_membership_cmd_helper(vrf, vty, !!json);
}
static void pim_show_mlag_up_entry_detail(struct vrf *vrf,
@@ -2905,26 +2775,7 @@ DEFPY (show_ip_pim_neighbor,
"Name of interface or neighbor\n"
JSON_STR)
{
- struct vrf *v;
- json_object *json_parent = NULL;
-
- v = vrf_lookup_by_name(vrf ? vrf : VRF_DEFAULT_NAME);
-
- if (!v)
- return CMD_WARNING;
-
- if (json)
- json_parent = json_object_new_object();
-
- if (interface)
- pim_show_neighbors_single(v->info, vty, interface, json_parent);
- else
- pim_show_neighbors(v->info, vty, json_parent);
-
- if (json)
- vty_json(vty, json_parent);
-
- return CMD_SUCCESS;
+ return pim_show_neighbors_cmd_helper(vrf, vty, json, interface);
}
DEFPY (show_ip_pim_neighbor_vrf_all,
@@ -2939,31 +2790,7 @@ DEFPY (show_ip_pim_neighbor_vrf_all,
"Name of interface or neighbor\n"
JSON_STR)
{
- struct vrf *v;
- json_object *json_parent = NULL;
- json_object *json_vrf = NULL;
-
- if (json)
- json_parent = json_object_new_object();
- RB_FOREACH (v, vrf_name_head, &vrfs_by_name) {
- if (!json)
- vty_out(vty, "VRF: %s\n", v->name);
- else
- json_vrf = json_object_new_object();
-
- if (interface)
- pim_show_neighbors_single(v->info, vty, interface,
- json_vrf);
- else
- pim_show_neighbors(v->info, vty, json_vrf);
-
- if (json)
- json_object_object_add(json_parent, v->name, json_vrf);
- }
- if (json)
- vty_json(vty, json_parent);
-
- return CMD_SUCCESS;
+ return pim_show_neighbors_vrf_all_cmd_helper(vty, json, interface);
}
DEFPY (show_ip_pim_secondary,
@@ -3163,17 +2990,7 @@ DEFPY (show_ip_pim_channel,
"PIM downstream channel info\n"
JSON_STR)
{
- struct vrf *v;
- bool uj = !!json;
-
- v = vrf_lookup_by_name(vrf ? vrf : VRF_DEFAULT_NAME);
-
- if (!v)
- return CMD_WARNING;
-
- pim_show_channel(v->info, vty, uj);
-
- return CMD_SUCCESS;
+ return pim_show_channel_cmd_helper(vrf, vty, !!json);
}
DEFPY (show_ip_pim_upstream_join_desired,
@@ -3407,16 +3224,7 @@ DEFPY (show_ip_pim_nexthop,
VRF_CMD_HELP_STR
"PIM cached nexthop rpf information\n")
{
- struct vrf *v;
-
- v = vrf_lookup_by_name(vrf ? vrf : VRF_DEFAULT_NAME);
-
- if (!v)
- return CMD_WARNING;
-
- pim_show_nexthop(v->info, vty);
-
- return CMD_SUCCESS;
+ return pim_show_nexthop_cmd_helper(vrf, vty);
}
DEFPY (show_ip_pim_nexthop_lookup,
@@ -3430,49 +3238,7 @@ DEFPY (show_ip_pim_nexthop_lookup,
"Source/RP address\n"
"Multicast Group address\n")
{
- struct prefix nht_p;
- int result = 0;
- pim_addr vif_source;
- struct prefix grp;
- struct pim_nexthop nexthop;
- struct vrf *v;
-
- v = vrf_lookup_by_name(vrf ? vrf : VRF_DEFAULT_NAME);
-
- if (!v)
- return CMD_WARNING;
-
- if (pim_is_group_224_4(source)) {
- vty_out(vty,
- "Invalid argument. Expected Valid Source Address.\n");
- return CMD_WARNING;
- }
-
- if (!pim_is_group_224_4(group)) {
- vty_out(vty,
- "Invalid argument. Expected Valid Multicast Group Address.\n");
- return CMD_WARNING;
- }
-
- if (!pim_rp_set_upstream_addr(v->info, &vif_source, source, group))
- return CMD_SUCCESS;
-
- pim_addr_to_prefix(&nht_p, vif_source);
- pim_addr_to_prefix(&grp, group);
- memset(&nexthop, 0, sizeof(nexthop));
-
- result = pim_ecmp_nexthop_lookup(v->info, &nexthop, &nht_p, &grp, 0);
-
- if (!result) {
- vty_out(vty,
- "Nexthop Lookup failed, no usable routes returned.\n");
- return CMD_SUCCESS;
- }
-
- vty_out(vty, "Group %s --- Nexthop %pPAs Interface %s \n", group_str,
- &nexthop.mrib_nexthop_addr, nexthop.interface->name);
-
- return CMD_SUCCESS;
+ return pim_show_nexthop_lookup_cmd_helper(vrf, vty, source, group);
}
DEFUN (show_ip_pim_interface_traffic,
diff --git a/pimd/pim_cmd_common.c b/pimd/pim_cmd_common.c
index 668853e988..8e93597118 100644
--- a/pimd/pim_cmd_common.c
+++ b/pimd/pim_cmd_common.c
@@ -55,6 +55,7 @@
#include "pim_static.h"
#include "pim_addr.h"
#include "pim_static.h"
+#include "pim_util.h"
/**
* Get current node VRF name.
@@ -1664,6 +1665,73 @@ static void pim_show_join_helper(struct vty *vty, struct pim_interface *pim_ifp,
}
}
+int pim_show_join_cmd_helper(const char *vrf, struct vty *vty, pim_addr s_or_g,
+ pim_addr g, const char *json)
+{
+ pim_sgaddr sg = {};
+ struct vrf *v;
+ struct pim_instance *pim;
+ json_object *json_parent = NULL;
+
+ v = vrf_lookup_by_name(vrf ? vrf : VRF_DEFAULT_NAME);
+
+ if (!v) {
+ vty_out(vty, "%% Vrf specified: %s does not exist\n", vrf);
+ return CMD_WARNING;
+ }
+ pim = pim_get_pim_instance(v->vrf_id);
+
+ if (!pim) {
+ vty_out(vty, "%% Unable to find pim instance\n");
+ return CMD_WARNING;
+ }
+
+ if (!pim_addr_is_any(s_or_g)) {
+ if (!pim_addr_is_any(g)) {
+ sg.src = s_or_g;
+ sg.grp = g;
+ } else
+ sg.grp = s_or_g;
+ }
+
+ if (json)
+ json_parent = json_object_new_object();
+
+ pim_show_join(pim, vty, &sg, json_parent);
+
+ if (json)
+ vty_json(vty, json_parent);
+
+ return CMD_SUCCESS;
+}
+
+int pim_show_join_vrf_all_cmd_helper(struct vty *vty, const char *json)
+{
+ pim_sgaddr sg = {0};
+ struct vrf *vrf_struct;
+ json_object *json_parent = NULL;
+ json_object *json_vrf = NULL;
+
+ if (json)
+ json_parent = json_object_new_object();
+
+ RB_FOREACH (vrf_struct, vrf_name_head, &vrfs_by_name) {
+ if (!json_parent)
+ vty_out(vty, "VRF: %s\n", vrf_struct->name);
+ else
+ json_vrf = json_object_new_object();
+ pim_show_join(vrf_struct->info, vty, &sg, json_vrf);
+
+ if (json)
+ json_object_object_add(json_parent, vrf_struct->name,
+ json_vrf);
+ }
+ if (json)
+ vty_json(vty, json_parent);
+
+ return CMD_WARNING;
+}
+
void pim_show_join(struct pim_instance *pim, struct vty *vty, pim_sgaddr *sg,
json_object *json)
{
@@ -1701,6 +1769,29 @@ static void pim_show_jp_agg_helper(struct vty *vty, struct interface *ifp,
is_join ? "J" : "P");
}
+int pim_show_jp_agg_list_cmd_helper(const char *vrf, struct vty *vty)
+{
+ struct vrf *v;
+ struct pim_instance *pim;
+
+ v = vrf_lookup_by_name(vrf ? vrf : VRF_DEFAULT_NAME);
+
+ if (!v) {
+ vty_out(vty, "%% Vrf specified: %s does not exist\n", vrf);
+ return CMD_WARNING;
+ }
+ pim = pim_get_pim_instance(v->vrf_id);
+
+ if (!pim) {
+ vty_out(vty, "%% Unable to find pim instance\n");
+ return CMD_WARNING;
+ }
+
+ pim_show_jp_agg_list(pim, vty);
+
+ return CMD_SUCCESS;
+}
+
void pim_show_jp_agg_list(struct pim_instance *pim, struct vty *vty)
{
struct interface *ifp;
@@ -1735,6 +1826,20 @@ void pim_show_jp_agg_list(struct pim_instance *pim, struct vty *vty)
}
}
+int pim_show_membership_cmd_helper(const char *vrf, struct vty *vty, bool uj)
+{
+ struct vrf *v;
+
+ v = vrf_lookup_by_name(vrf ? vrf : VRF_DEFAULT_NAME);
+
+ if (!v)
+ return CMD_WARNING;
+
+ pim_show_membership(v->info, vty, uj);
+
+ return CMD_SUCCESS;
+}
+
static void pim_show_membership_helper(struct vty *vty,
struct pim_interface *pim_ifp,
struct pim_ifchannel *ch,
@@ -1945,6 +2050,77 @@ void pim_show_channel(struct pim_instance *pim, struct vty *vty, bool uj)
vty_json(vty, json);
}
+int pim_show_channel_cmd_helper(const char *vrf, struct vty *vty, bool uj)
+{
+ struct vrf *v;
+
+ v = vrf_lookup_by_name(vrf ? vrf : VRF_DEFAULT_NAME);
+
+ if (!v)
+ return CMD_WARNING;
+
+ pim_show_channel(v->info, vty, uj);
+
+ return CMD_SUCCESS;
+}
+
+int pim_show_interface_cmd_helper(const char *vrf, struct vty *vty, bool uj,
+ bool mlag, const char *interface)
+{
+ struct vrf *v;
+ json_object *json_parent = NULL;
+
+ v = vrf_lookup_by_name(vrf ? vrf : VRF_DEFAULT_NAME);
+
+ if (!v)
+ return CMD_WARNING;
+
+ if (uj)
+ json_parent = json_object_new_object();
+
+ if (interface)
+ pim_show_interfaces_single(v->info, vty, interface, mlag,
+ json_parent);
+ else
+ pim_show_interfaces(v->info, vty, mlag, json_parent);
+
+ if (uj)
+ vty_json(vty, json_parent);
+
+ return CMD_SUCCESS;
+}
+
+int pim_show_interface_vrf_all_cmd_helper(struct vty *vty, bool uj, bool mlag,
+ const char *interface)
+{
+ struct vrf *v;
+ json_object *json_parent = NULL;
+ json_object *json_vrf = NULL;
+
+ if (uj)
+ json_parent = json_object_new_object();
+
+ RB_FOREACH (v, vrf_name_head, &vrfs_by_name) {
+ if (!uj)
+ vty_out(vty, "VRF: %s\n", v->name);
+ else
+ json_vrf = json_object_new_object();
+
+ if (interface)
+ pim_show_interfaces_single(v->info, vty, interface,
+ mlag, json_vrf);
+ else
+ pim_show_interfaces(v->info, vty, mlag, json_vrf);
+
+ if (uj)
+ json_object_object_add(json_parent, v->name, json_vrf);
+ }
+ if (uj)
+ vty_json(vty, json_parent);
+
+ return CMD_SUCCESS;
+}
+
void pim_show_interfaces(struct pim_instance *pim, struct vty *vty, bool mlag,
json_object *json)
{
@@ -2489,6 +2665,73 @@ static int pim_print_pnc_cache_walkcb(struct hash_bucket *bucket, void *arg)
return CMD_SUCCESS;
}
+int pim_show_nexthop_lookup_cmd_helper(const char *vrf, struct vty *vty,
+ pim_addr source, pim_addr group)
+{
+ struct prefix nht_p;
+ int result = 0;
+ pim_addr vif_source;
+ struct prefix grp;
+ struct pim_nexthop nexthop;
+ struct vrf *v;
+ char grp_str[PREFIX_STRLEN];
+
+ v = vrf_lookup_by_name(vrf ? vrf : VRF_DEFAULT_NAME);
+
+ if (!v)
+ return CMD_WARNING;
+
+#if PIM_IPV == 4
+ if (pim_is_group_224_4(source)) {
+ vty_out(vty,
+ "Invalid argument. Expected Valid Source Address.\n");
+ return CMD_WARNING;
+ }
+
+ if (!pim_is_group_224_4(group)) {
+ vty_out(vty,
+ "Invalid argument. Expected Valid Multicast Group Address.\n");
+ return CMD_WARNING;
+ }
+#endif
+
+ if (!pim_rp_set_upstream_addr(v->info, &vif_source, source, group))
+ return CMD_SUCCESS;
+
+ pim_addr_to_prefix(&nht_p, vif_source);
+ pim_addr_to_prefix(&grp, group);
+ memset(&nexthop, 0, sizeof(nexthop));
+
+ result = pim_ecmp_nexthop_lookup(v->info, &nexthop, &nht_p, &grp, 0);
+
+ if (!result) {
+ vty_out(vty,
+ "Nexthop Lookup failed, no usable routes returned.\n");
+ return CMD_SUCCESS;
+ }
+
+ pim_addr_dump("<grp?>", &grp, grp_str, sizeof(grp_str));
+
+ vty_out(vty, "Group %s --- Nexthop %pPAs Interface %s\n", grp_str,
+ &nexthop.mrib_nexthop_addr, nexthop.interface->name);
+
+ return CMD_SUCCESS;
+}
+
+int pim_show_nexthop_cmd_helper(const char *vrf, struct vty *vty)
+{
+ struct vrf *v;
+
+ v = vrf_lookup_by_name(vrf ? vrf : VRF_DEFAULT_NAME);
+
+ if (!v)
+ return CMD_WARNING;
+
+ pim_show_nexthop(v->info, vty);
+
+ return CMD_SUCCESS;
+}
+
void pim_show_nexthop(struct pim_instance *pim, struct vty *vty)
{
struct pnc_cache_walk_data cwd;
@@ -2503,6 +2746,61 @@ void pim_show_nexthop(struct pim_instance *pim, struct vty *vty)
hash_walk(pim->rpf_hash, pim_print_pnc_cache_walkcb, &cwd);
}
+int pim_show_neighbors_cmd_helper(const char *vrf, struct vty *vty,
+ const char *json, const char *interface)
+{
+ struct vrf *v;
+ json_object *json_parent = NULL;
+
+ v = vrf_lookup_by_name(vrf ? vrf : VRF_DEFAULT_NAME);
+
+ if (!v)
+ return CMD_WARNING;
+
+ if (json)
+ json_parent = json_object_new_object();
+
+ if (interface)
+ pim_show_neighbors_single(v->info, vty, interface, json_parent);
+ else
+ pim_show_neighbors(v->info, vty, json_parent);
+
+ if (json)
+ vty_json(vty, json_parent);
+
+ return CMD_SUCCESS;
+}
+
+int pim_show_neighbors_vrf_all_cmd_helper(struct vty *vty, const char *json,
+ const char *interface)
+{
+ struct vrf *v;
+ json_object *json_parent = NULL;
+ json_object *json_vrf = NULL;
+
+ if (json)
+ json_parent = json_object_new_object();
+ RB_FOREACH (v, vrf_name_head, &vrfs_by_name) {
+ if (!json)
+ vty_out(vty, "VRF: %s\n", v->name);
+ else
+ json_vrf = json_object_new_object();
+
+ if (interface)
+ pim_show_neighbors_single(v->info, vty, interface,
+ json_vrf);
+ else
+ pim_show_neighbors(v->info, vty, json_vrf);
+
+ if (json)
+ json_object_object_add(json_parent, v->name, json_vrf);
+ }
+ if (json)
+ vty_json(vty, json_parent);
+
+ return CMD_SUCCESS;
+}
+
void pim_show_neighbors_single(struct pim_instance *pim, struct vty *vty,
const char *neighbor, json_object *json)
{
diff --git a/pimd/pim_cmd_common.h b/pimd/pim_cmd_common.h
index 9644f84e0c..e3d1a68652 100644
--- a/pimd/pim_cmd_common.h
+++ b/pimd/pim_cmd_common.h
@@ -83,11 +83,21 @@ bool pim_sgaddr_match(pim_sgaddr item, pim_sgaddr match);
void json_object_pim_ifp_add(struct json_object *json, struct interface *ifp);
void pim_print_ifp_flags(struct vty *vty, struct interface *ifp);
void json_object_pim_upstream_add(json_object *json, struct pim_upstream *up);
+int pim_show_join_cmd_helper(const char *vrf, struct vty *vty, pim_addr s_or_g,
+ pim_addr g, const char *json);
+int pim_show_join_vrf_all_cmd_helper(struct vty *vty, const char *json);
void pim_show_join(struct pim_instance *pim, struct vty *vty, pim_sgaddr *sg,
json_object *json);
+int pim_show_jp_agg_list_cmd_helper(const char *vrf, struct vty *vty);
void pim_show_jp_agg_list(struct pim_instance *pim, struct vty *vty);
+int pim_show_membership_cmd_helper(const char *vrf, struct vty *vty, bool uj);
void pim_show_membership(struct pim_instance *pim, struct vty *vty, bool uj);
void pim_show_channel(struct pim_instance *pim, struct vty *vty, bool uj);
+int pim_show_channel_cmd_helper(const char *vrf, struct vty *vty, bool uj);
+int pim_show_interface_cmd_helper(const char *vrf, struct vty *vty, bool uj,
+ bool mlag, const char *interface);
+int pim_show_interface_vrf_all_cmd_helper(struct vty *vty, bool uj, bool mlag,
+ const char *interface);
void pim_show_interfaces(struct pim_instance *pim, struct vty *vty, bool mlag,
json_object *json);
void pim_show_interfaces_single(struct pim_instance *pim, struct vty *vty,
@@ -95,7 +105,14 @@ void pim_show_interfaces_single(struct pim_instance *pim, struct vty *vty,
json_object *json);
void ip_pim_ssm_show_group_range(struct pim_instance *pim, struct vty *vty,
bool uj);
+int pim_show_nexthop_lookup_cmd_helper(const char *vrf, struct vty *vty,
+ pim_addr source, pim_addr group);
+int pim_show_nexthop_cmd_helper(const char *vrf, struct vty *vty);
void pim_show_nexthop(struct pim_instance *pim, struct vty *vty);
+int pim_show_neighbors_cmd_helper(const char *vrf, struct vty *vty,
+ const char *json, const char *interface);
+int pim_show_neighbors_vrf_all_cmd_helper(struct vty *vty, const char *json,
+ const char *interface);
void pim_show_neighbors_single(struct pim_instance *pim, struct vty *vty,
const char *neighbor, json_object *json);
void pim_show_neighbors(struct pim_instance *pim, struct vty *vty,