summaryrefslogtreecommitdiff
path: root/pimd/pim6_cmd.c
diff options
context:
space:
mode:
Diffstat (limited to 'pimd/pim6_cmd.c')
-rw-r--r--pimd/pim6_cmd.c1409
1 files changed, 1330 insertions, 79 deletions
diff --git a/pimd/pim6_cmd.c b/pimd/pim6_cmd.c
index 7b3e04fdc0..bc1d478af0 100644
--- a/pimd/pim6_cmd.c
+++ b/pimd/pim6_cmd.c
@@ -33,11 +33,14 @@
#include "pimd.h"
#include "pim6_cmd.h"
+#include "pim_cmd_common.h"
#include "pim_vty.h"
#include "lib/northbound_cli.h"
#include "pim_errors.h"
#include "pim_nb.h"
-#include "pim_cmd_common.h"
+#include "pim_addr.h"
+#include "pim_nht.h"
+
#ifndef VTYSH_EXTRACT_PL
#include "pimd/pim6_cmd_clippy.c"
@@ -167,7 +170,7 @@ DEFPY (ipv6_pim_rp_keep_alive,
"ipv6 pim rp keep-alive-timer (1-65535)$kat",
IPV6_STR
PIM_STR
- "Rendevous Point\n"
+ "Rendezvous Point\n"
"Keep alive Timer\n"
"Seconds\n")
{
@@ -180,7 +183,7 @@ DEFPY (no_ipv6_pim_rp_keep_alive,
NO_STR
IPV6_STR
PIM_STR
- "Rendevous Point\n"
+ "Rendezvous Point\n"
"Keep alive Timer\n"
IGNORED_IN_NO_STR)
{
@@ -448,6 +451,33 @@ DEFPY (no_ipv6_pim_rp_prefix_list,
return pim_process_no_rp_plist_cmd(vty, rp_str, plist);
}
+
+DEFPY (ipv6_ssmpingd,
+ ipv6_ssmpingd_cmd,
+ "ipv6 ssmpingd [X:X::X:X]$source",
+ IPV6_STR
+ CONF_SSMPINGD_STR
+ "Source address\n")
+{
+ const char *src_str = (source_str) ? source_str : "::";
+
+ return pim_process_ssmpingd_cmd(vty, NB_OP_CREATE, src_str);
+}
+
+
+DEFPY (no_ipv6_ssmpingd,
+ no_ipv6_ssmpingd_cmd,
+ "no ipv6 ssmpingd [X:X::X:X]$source",
+ NO_STR
+ IPV6_STR
+ CONF_SSMPINGD_STR
+ "Source address\n")
+{
+ const char *src_str = (source_str) ? source_str : "::";
+
+ return pim_process_ssmpingd_cmd(vty, NB_OP_DESTROY, src_str);
+}
+
DEFPY (interface_ipv6_mld_join,
interface_ipv6_mld_join_cmd,
"ipv6 mld join X:X::X:X$group [X:X::X:X$source]",
@@ -505,121 +535,1296 @@ DEFPY (interface_no_ipv6_mld_join,
DEFPY (interface_ipv6_mld,
interface_ipv6_mld_cmd,
- "ipv6 mld",
+ "[no] ipv6 mld",
+ NO_STR
IPV6_STR
IFACE_MLD_STR)
{
- nb_cli_enqueue_change(vty, "./enable", NB_OP_MODIFY, "true");
+ const char *value = no ? "false" : "true";
+ nb_cli_enqueue_change(vty, "./enable", NB_OP_MODIFY, value);
return nb_cli_apply_changes(vty, FRR_GMP_INTERFACE_XPATH,
"frr-routing:ipv6");
}
-DEFPY (interface_no_ipv6_mld,
- interface_no_ipv6_mld_cmd,
- "no ipv6 mld",
+DEFPY (interface_ipv6_mld_version,
+ interface_ipv6_mld_version_cmd,
+ "[no] ipv6 mld version ![(1-2)$version]",
NO_STR
IPV6_STR
- IFACE_MLD_STR)
+ IFACE_MLD_STR
+ "MLD version\n"
+ "MLD version number\n")
{
- const struct lyd_node *pim_enable_dnode;
- char pim_if_xpath[XPATH_MAXLEN + 64];
-
- snprintf(pim_if_xpath, sizeof(pim_if_xpath),
- "%s/frr-pim:pim/address-family[address-family='%s']",
- VTY_CURR_XPATH, "frr-routing:ipv6");
-
- pim_enable_dnode = yang_dnode_getf(vty->candidate_config->dnode,
- FRR_PIM_ENABLE_XPATH, VTY_CURR_XPATH,
- "frr-routing:ipv6");
- 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);
- } else {
- if (!yang_dnode_get_bool(pim_enable_dnode, ".")) {
- nb_cli_enqueue_change(vty, pim_if_xpath, NB_OP_DESTROY,
- NULL);
- nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL);
- } else
- nb_cli_enqueue_change(vty, "./enable", NB_OP_MODIFY,
- "false");
- }
+ if (no)
+ nb_cli_enqueue_change(vty, "./mld-version", NB_OP_DESTROY,
+ NULL);
+ else
+ nb_cli_enqueue_change(vty, "./mld-version", NB_OP_MODIFY,
+ version_str);
return nb_cli_apply_changes(vty, FRR_GMP_INTERFACE_XPATH,
"frr-routing:ipv6");
}
-DEFPY (interface_ipv6_mld_version,
- interface_ipv6_mld_version_cmd,
- "ipv6 mld version (1-2)$version",
+DEFPY (interface_ipv6_mld_query_interval,
+ interface_ipv6_mld_query_interval_cmd,
+ "[no] ipv6 mld query-interval ![(1-65535)$q_interval]",
+ NO_STR
IPV6_STR
IFACE_MLD_STR
- "MLD version\n"
- "MLD version number\n")
+ IFACE_MLD_QUERY_INTERVAL_STR
+ "Query interval in seconds\n")
{
- nb_cli_enqueue_change(vty, "./enable", NB_OP_MODIFY, "true");
- nb_cli_enqueue_change(vty, "./mld-version", NB_OP_MODIFY, version_str);
+ if (no)
+ nb_cli_enqueue_change(vty, "./query-interval", NB_OP_DESTROY,
+ NULL);
+ else
+ nb_cli_enqueue_change(vty, "./query-interval", NB_OP_MODIFY,
+ q_interval_str);
return nb_cli_apply_changes(vty, FRR_GMP_INTERFACE_XPATH,
"frr-routing:ipv6");
}
-DEFPY (interface_no_ipv6_mld_version,
- interface_no_ipv6_mld_version_cmd,
- "no ipv6 mld version [(1-2)]",
+DEFPY (ipv6_mld_group_watermark,
+ ipv6_mld_group_watermark_cmd,
+ "ipv6 mld watermark-warn (1-65535)$limit",
+ IPV6_STR
+ MLD_STR
+ "Configure group limit for watermark warning\n"
+ "Group count to generate watermark warning\n")
+{
+ PIM_DECLVAR_CONTEXT_VRF(vrf, pim);
+
+ /* TBD Depends on MLD data structure changes */
+ (void)pim;
+
+ return CMD_SUCCESS;
+}
+
+DEFPY (no_ipv6_mld_group_watermark,
+ no_ipv6_mld_group_watermark_cmd,
+ "no ipv6 mld watermark-warn [(1-65535)$limit]",
+ NO_STR
+ IPV6_STR
+ MLD_STR
+ "Unconfigure group limit for watermark warning\n"
+ IGNORED_IN_NO_STR)
+{
+ PIM_DECLVAR_CONTEXT_VRF(vrf, pim);
+
+ /* TBD Depends on MLD data structure changes */
+ (void)pim;
+
+ return CMD_SUCCESS;
+}
+
+DEFPY (interface_ipv6_mld_query_max_response_time,
+ interface_ipv6_mld_query_max_response_time_cmd,
+ "[no] ipv6 mld query-max-response-time ![(1-65535)$qmrt]",
NO_STR
IPV6_STR
IFACE_MLD_STR
- "MLD version\n"
- "MLD version number\n")
+ IFACE_MLD_QUERY_MAX_RESPONSE_TIME_STR
+ "Query response value in milliseconds\n")
{
- nb_cli_enqueue_change(vty, "./mld-version", NB_OP_DESTROY, NULL);
+ if (no)
+ return gm_process_no_query_max_response_time_cmd(vty);
+ return gm_process_query_max_response_time_cmd(vty, qmrt_str);
+}
- return nb_cli_apply_changes(vty, FRR_GMP_INTERFACE_XPATH,
- "frr-routing:ipv6");
+DEFPY (interface_ipv6_mld_robustness,
+ interface_ipv6_mld_robustness_cmd,
+ "[no] ipv6 mld robustness ![(1-7)]",
+ NO_STR
+ IPV6_STR
+ IFACE_MLD_STR
+ "MLD Robustness variable\n"
+ "MLD Robustness variable\n")
+{
+ if (no)
+ return gm_process_no_last_member_query_count_cmd(vty);
+ return gm_process_last_member_query_count_cmd(vty, robustness_str);
}
-DEFPY (interface_ipv6_mld_query_interval,
- interface_ipv6_mld_query_interval_cmd,
- "ipv6 mld query-interval (1-65535)$q_interval",
+DEFPY (interface_ipv6_mld_last_member_query_interval,
+ interface_ipv6_mld_last_member_query_interval_cmd,
+ "[no] ipv6 mld last-member-query-interval ![(1-65535)$lmqi]",
+ NO_STR
IPV6_STR
IFACE_MLD_STR
- IFACE_MLD_QUERY_INTERVAL_STR
- "Query interval in seconds\n")
+ IFACE_MLD_LAST_MEMBER_QUERY_INTERVAL_STR
+ "Last member query interval in milliseconds\n")
{
- const struct lyd_node *pim_enable_dnode;
+ if (no)
+ return gm_process_no_last_member_query_interval_cmd(vty);
+ return gm_process_last_member_query_interval_cmd(vty, lmqi_str);
+}
- pim_enable_dnode = yang_dnode_getf(vty->candidate_config->dnode,
- FRR_PIM_ENABLE_XPATH, VTY_CURR_XPATH,
- "frr-routing:ipv6");
- if (!pim_enable_dnode) {
- nb_cli_enqueue_change(vty, "./enable", NB_OP_MODIFY, "true");
- } else {
- if (!yang_dnode_get_bool(pim_enable_dnode, "."))
- nb_cli_enqueue_change(vty, "./enable", NB_OP_MODIFY,
- "true");
+DEFPY (show_ipv6_pim_rp,
+ show_ipv6_pim_rp_cmd,
+ "show ipv6 pim [vrf NAME] rp-info [X:X::X:X/M$group] [json$json]",
+ SHOW_STR
+ IPV6_STR
+ PIM_STR
+ VRF_CMD_HELP_STR
+ "PIM RP information\n"
+ "Multicast Group range\n"
+ JSON_STR)
+{
+ struct pim_instance *pim;
+ struct vrf *v;
+ json_object *json_parent = NULL;
+ struct prefix *range = NULL;
+
+ v = vrf_lookup_by_name(vrf ? vrf : VRF_DEFAULT_NAME);
+
+ if (!v)
+ return CMD_WARNING;
+
+ pim = pim_get_pim_instance(v->vrf_id);
+
+ if (!pim) {
+ vty_out(vty, "%% Unable to find pim instance\n");
+ return CMD_WARNING;
}
- nb_cli_enqueue_change(vty, "./query-interval", NB_OP_MODIFY,
- q_interval_str);
+ if (group_str) {
+ range = prefix_new();
+ prefix_copy(range, group);
+ apply_mask(range);
+ }
- return nb_cli_apply_changes(vty, FRR_GMP_INTERFACE_XPATH,
- "frr-routing:ipv6");
+ if (json)
+ json_parent = json_object_new_object();
+
+ pim_rp_show_information(pim, range, vty, json_parent);
+
+ if (json)
+ vty_json(vty, json_parent);
+
+ prefix_free(&range);
+
+ return CMD_SUCCESS;
}
-DEFPY (interface_no_ipv6_mld_query_interval,
- interface_no_ipv6_mld_query_interval_cmd,
- "no ipv6 mld query-interval [(1-65535)]",
- NO_STR
- IPV6_STR
- IFACE_MLD_STR
- IFACE_MLD_QUERY_INTERVAL_STR
- IGNORED_IN_NO_STR)
+DEFPY (show_ipv6_pim_rp_vrf_all,
+ show_ipv6_pim_rp_vrf_all_cmd,
+ "show ipv6 pim vrf all rp-info [X:X::X:X/M$group] [json$json]",
+ SHOW_STR
+ IPV6_STR
+ PIM_STR
+ VRF_CMD_HELP_STR
+ "PIM RP information\n"
+ "Multicast Group range\n"
+ JSON_STR)
{
- nb_cli_enqueue_change(vty, "./query-interval", NB_OP_DESTROY, NULL);
+ struct vrf *vrf;
+ json_object *json_parent = NULL;
+ json_object *json_vrf = NULL;
+ struct prefix *range = NULL;
+
+ if (group_str) {
+ range = prefix_new();
+ prefix_copy(range, group);
+ apply_mask(range);
+ }
- return nb_cli_apply_changes(vty, FRR_GMP_INTERFACE_XPATH,
- "frr-routing:ipv6");
+ if (json)
+ json_parent = json_object_new_object();
+
+ RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) {
+ if (!json)
+ vty_out(vty, "VRF: %s\n", vrf->name);
+ else
+ json_vrf = json_object_new_object();
+ pim_rp_show_information(vrf->info, range, vty, json_vrf);
+ if (json)
+ json_object_object_add(json_parent, vrf->name,
+ json_vrf);
+ }
+ if (json)
+ vty_json(vty, json_parent);
+
+ prefix_free(&range);
+
+ return CMD_SUCCESS;
+}
+
+DEFPY (show_ipv6_pim_rpf,
+ show_ipv6_pim_rpf_cmd,
+ "show ipv6 pim [vrf NAME] rpf [json$json]",
+ SHOW_STR
+ IPV6_STR
+ PIM_STR
+ VRF_CMD_HELP_STR
+ "PIM cached source rpf information\n"
+ JSON_STR)
+{
+ struct pim_instance *pim;
+ struct vrf *v;
+ json_object *json_parent = NULL;
+
+ v = vrf_lookup_by_name(vrf ? vrf : VRF_DEFAULT_NAME);
+
+ if (!v)
+ return CMD_WARNING;
+
+ pim = pim_get_pim_instance(v->vrf_id);
+
+ if (!pim) {
+ vty_out(vty, "%% Unable to find pim instance\n");
+ return CMD_WARNING;
+ }
+
+ if (json)
+ json_parent = json_object_new_object();
+
+ pim_show_rpf(pim, vty, json_parent);
+
+ if (json)
+ vty_json(vty, json_parent);
+
+ return CMD_SUCCESS;
+}
+
+DEFPY (show_ipv6_pim_rpf_vrf_all,
+ show_ipv6_pim_rpf_vrf_all_cmd,
+ "show ipv6 pim vrf all rpf [json$json]",
+ SHOW_STR
+ IPV6_STR
+ PIM_STR
+ VRF_CMD_HELP_STR
+ "PIM cached source rpf information\n"
+ JSON_STR)
+{
+ struct vrf *vrf;
+ json_object *json_parent = NULL;
+ json_object *json_vrf = NULL;
+
+ if (json)
+ json_parent = json_object_new_object();
+
+ RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) {
+ if (!json)
+ vty_out(vty, "VRF: %s\n", vrf->name);
+ else
+ json_vrf = json_object_new_object();
+ pim_show_rpf(vrf->info, vty, json_vrf);
+ if (json)
+ json_object_object_add(json_parent, vrf->name,
+ json_vrf);
+ }
+ if (json)
+ vty_json(vty, json_parent);
+
+ return CMD_SUCCESS;
+}
+
+DEFPY (show_ipv6_pim_secondary,
+ show_ipv6_pim_secondary_cmd,
+ "show ipv6 pim [vrf NAME] secondary",
+ SHOW_STR
+ IPV6_STR
+ PIM_STR
+ VRF_CMD_HELP_STR
+ "PIM neighbor addresses\n")
+{
+ struct pim_instance *pim;
+ struct vrf *v;
+
+ v = vrf_lookup_by_name(vrf ? vrf : VRF_DEFAULT_NAME);
+
+ if (!v)
+ return CMD_WARNING;
+
+ pim = pim_get_pim_instance(v->vrf_id);
+
+ if (!pim) {
+ vty_out(vty, "%% Unable to find pim instance\n");
+ return CMD_WARNING;
+ }
+
+ pim_show_neighbors_secondary(pim, vty);
+
+ return CMD_SUCCESS;
+}
+
+DEFPY (show_ipv6_pim_statistics,
+ show_ipv6_pim_statistics_cmd,
+ "show ipv6 pim [vrf NAME] statistics [interface WORD$word] [json$json]",
+ SHOW_STR
+ IPV6_STR
+ PIM_STR
+ VRF_CMD_HELP_STR
+ "PIM statistics\n"
+ INTERFACE_STR
+ "PIM interface\n"
+ JSON_STR)
+{
+ struct pim_instance *pim;
+ struct vrf *v;
+ bool uj = !!json;
+
+ v = vrf_lookup_by_name(vrf ? vrf : VRF_DEFAULT_NAME);
+
+ if (!v)
+ return CMD_WARNING;
+
+ pim = pim_get_pim_instance(v->vrf_id);
+
+ if (!pim) {
+ vty_out(vty, "%% Unable to find pim instance\n");
+ return CMD_WARNING;
+ }
+
+ if (word)
+ pim_show_statistics(pim, vty, word, uj);
+ else
+ pim_show_statistics(pim, vty, NULL, uj);
+
+ return CMD_SUCCESS;
+}
+
+DEFPY (show_ipv6_pim_upstream,
+ show_ipv6_pim_upstream_cmd,
+ "show ipv6 pim [vrf NAME] upstream [X:X::X:X$s_or_g [X:X::X:X$g]] [json$json]",
+ SHOW_STR
+ IPV6_STR
+ PIM_STR
+ VRF_CMD_HELP_STR
+ "PIM upstream information\n"
+ "The Source or Group\n"
+ "The Group\n"
+ JSON_STR)
+{
+ pim_sgaddr sg = {0};
+ struct vrf *v;
+ bool uj = !!json;
+ 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 (uj)
+ json_parent = json_object_new_object();
+
+ 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;
+ }
+
+ pim_show_upstream(pim, vty, &sg, json_parent);
+
+ if (uj)
+ vty_json(vty, json_parent);
+
+ return CMD_SUCCESS;
+}
+
+DEFPY (show_ipv6_pim_upstream_vrf_all,
+ show_ipv6_pim_upstream_vrf_all_cmd,
+ "show ipv6 pim vrf all upstream [json$json]",
+ SHOW_STR
+ IPV6_STR
+ PIM_STR
+ VRF_CMD_HELP_STR
+ "PIM upstream information\n"
+ JSON_STR)
+{
+ pim_sgaddr sg = {0};
+ struct vrf *vrf;
+ json_object *json_parent = NULL;
+ json_object *json_vrf = NULL;
+
+ if (json)
+ json_parent = json_object_new_object();
+
+ RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) {
+ if (!json)
+ vty_out(vty, "VRF: %s\n", vrf->name);
+ else
+ json_vrf = json_object_new_object();
+ pim_show_upstream(vrf->info, vty, &sg, json_vrf);
+ if (json)
+ json_object_object_add(json_parent, vrf->name,
+ json_vrf);
+ }
+
+ if (json)
+ vty_json(vty, json_parent);
+
+ return CMD_SUCCESS;
+}
+
+DEFPY (show_ipv6_pim_upstream_join_desired,
+ show_ipv6_pim_upstream_join_desired_cmd,
+ "show ipv6 pim [vrf NAME] upstream-join-desired [json$json]",
+ SHOW_STR
+ IPV6_STR
+ PIM_STR
+ VRF_CMD_HELP_STR
+ "PIM upstream join-desired\n"
+ JSON_STR)
+{
+ struct pim_instance *pim;
+ struct vrf *v;
+ bool uj = !!json;
+
+ v = vrf_lookup_by_name(vrf ? vrf : VRF_DEFAULT_NAME);
+
+ if (!v)
+ return CMD_WARNING;
+
+ pim = pim_get_pim_instance(v->vrf_id);
+
+ if (!pim) {
+ vty_out(vty, "%% Unable to find pim instance\n");
+ return CMD_WARNING;
+ }
+
+ pim_show_join_desired(pim, vty, uj);
+
+ return CMD_SUCCESS;
+}
+
+DEFPY (show_ipv6_pim_upstream_rpf,
+ show_ipv6_pim_upstream_rpf_cmd,
+ "show ipv6 pim [vrf NAME] upstream-rpf [json$json]",
+ SHOW_STR
+ IPV6_STR
+ PIM_STR
+ VRF_CMD_HELP_STR
+ "PIM upstream source rpf\n"
+ JSON_STR)
+{
+ struct pim_instance *pim;
+ struct vrf *v;
+ bool uj = !!json;
+
+ v = vrf_lookup_by_name(vrf ? vrf : VRF_DEFAULT_NAME);
+
+ if (!v)
+ return CMD_WARNING;
+
+ pim = pim_get_pim_instance(v->vrf_id);
+
+ if (!pim) {
+ vty_out(vty, "%% Unable to find pim instance\n");
+ return CMD_WARNING;
+ }
+
+ pim_show_upstream_rpf(pim, vty, uj);
+
+ return CMD_SUCCESS;
+}
+
+DEFPY (show_ipv6_pim_state,
+ show_ipv6_pim_state_cmd,
+ "show ipv6 pim [vrf NAME] state [X:X::X:X$s_or_g [X:X::X:X$g]] [json$json]",
+ SHOW_STR
+ IPV6_STR
+ PIM_STR
+ VRF_CMD_HELP_STR
+ "PIM state information\n"
+ "Unicast or Multicast address\n"
+ "Multicast address\n"
+ JSON_STR)
+{
+ struct pim_instance *pim;
+ struct vrf *v;
+ json_object *json_parent = NULL;
+
+ v = vrf_lookup_by_name(vrf ? vrf : VRF_DEFAULT_NAME);
+
+ if (!v)
+ return CMD_WARNING;
+
+ pim = pim_get_pim_instance(v->vrf_id);
+
+ if (!pim) {
+ vty_out(vty, "%% Unable to find pim instance\n");
+ return CMD_WARNING;
+ }
+
+ if (json)
+ json_parent = json_object_new_object();
+
+ pim_show_state(pim, vty, s_or_g_str, g_str, json_parent);
+
+ if (json)
+ vty_json(vty, json_parent);
+
+ return CMD_SUCCESS;
+}
+
+DEFPY (show_ipv6_pim_state_vrf_all,
+ show_ipv6_pim_state_vrf_all_cmd,
+ "show ipv6 pim vrf all state [X:X::X:X$s_or_g [X:X::X:X$g]] [json$json]",
+ SHOW_STR
+ IPV6_STR
+ PIM_STR
+ VRF_CMD_HELP_STR
+ "PIM state information\n"
+ "Unicast or Multicast address\n"
+ "Multicast address\n"
+ JSON_STR)
+{
+ struct vrf *vrf;
+ json_object *json_parent = NULL;
+ json_object *json_vrf = NULL;
+
+ if (json)
+ json_parent = json_object_new_object();
+
+ RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) {
+ if (!json)
+ vty_out(vty, "VRF: %s\n", vrf->name);
+ else
+ json_vrf = json_object_new_object();
+ pim_show_state(vrf->info, vty, s_or_g_str, g_str, json_vrf);
+ if (json)
+ json_object_object_add(json_parent, vrf->name,
+ json_vrf);
+ }
+ if (json)
+ vty_json(vty, json_parent);
+
+ return CMD_SUCCESS;
+}
+
+DEFPY (show_ipv6_pim_channel,
+ show_ipv6_pim_channel_cmd,
+ "show ipv6 pim [vrf NAME] channel [json$json]",
+ SHOW_STR
+ IPV6_STR
+ PIM_STR
+ VRF_CMD_HELP_STR
+ "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;
+}
+
+DEFPY (show_ipv6_pim_interface,
+ show_ipv6_pim_interface_cmd,
+ "show ipv6 pim [vrf NAME] interface [detail|WORD]$interface [json$json]",
+ SHOW_STR
+ IPV6_STR
+ PIM_STR
+ VRF_CMD_HELP_STR
+ "PIM interface information\n"
+ "Detailed output\n"
+ "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;
+}
+
+DEFPY (show_ipv6_pim_interface_vrf_all,
+ show_ipv6_pim_interface_vrf_all_cmd,
+ "show ipv6 pim vrf all interface [detail|WORD]$interface [json$json]",
+ SHOW_STR
+ IPV6_STR
+ PIM_STR
+ VRF_CMD_HELP_STR
+ "PIM interface information\n"
+ "Detailed output\n"
+ "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;
+}
+
+DEFPY (show_ipv6_pim_join,
+ show_ipv6_pim_join_cmd,
+ "show ipv6 pim [vrf NAME] join [X:X::X:X$s_or_g [X:X::X:X$g]] [json$json]",
+ SHOW_STR
+ IPV6_STR
+ PIM_STR
+ VRF_CMD_HELP_STR
+ "PIM interface join information\n"
+ "The Source or Group\n"
+ "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;
+}
+
+DEFPY (show_ipv6_pim_join_vrf_all,
+ show_ipv6_pim_join_vrf_all_cmd,
+ "show ipv6 pim vrf all join [json$json]",
+ SHOW_STR
+ IPV6_STR
+ PIM_STR
+ VRF_CMD_HELP_STR
+ "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;
+}
+
+DEFPY (show_ipv6_pim_jp_agg,
+ show_ipv6_pim_jp_agg_cmd,
+ "show ipv6 pim [vrf NAME] jp-agg",
+ SHOW_STR
+ IPV6_STR
+ PIM_STR
+ 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;
+}
+
+DEFPY (show_ipv6_pim_local_membership,
+ show_ipv6_pim_local_membership_cmd,
+ "show ipv6 pim [vrf NAME] local-membership [json$json]",
+ SHOW_STR
+ IPV6_STR
+ PIM_STR
+ VRF_CMD_HELP_STR
+ "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;
+}
+
+DEFPY (show_ipv6_pim_neighbor,
+ show_ipv6_pim_neighbor_cmd,
+ "show ipv6 pim [vrf NAME] neighbor [detail|WORD]$interface [json$json]",
+ SHOW_STR
+ IPV6_STR
+ PIM_STR
+ VRF_CMD_HELP_STR
+ "PIM neighbor information\n"
+ "Detailed output\n"
+ "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;
+}
+
+DEFPY (show_ipv6_pim_neighbor_vrf_all,
+ show_ipv6_pim_neighbor_vrf_all_cmd,
+ "show ipv6 pim vrf all neighbor [detail|WORD]$interface [json$json]",
+ SHOW_STR
+ IPV6_STR
+ PIM_STR
+ VRF_CMD_HELP_STR
+ "PIM neighbor information\n"
+ "Detailed output\n"
+ "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;
+}
+
+DEFPY (show_ipv6_pim_nexthop,
+ show_ipv6_pim_nexthop_cmd,
+ "show ipv6 pim [vrf NAME] nexthop",
+ SHOW_STR
+ IPV6_STR
+ PIM_STR
+ 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;
+}
+
+DEFPY (show_ipv6_pim_nexthop_lookup,
+ show_ipv6_pim_nexthop_lookup_cmd,
+ "show ipv6 pim [vrf NAME] nexthop-lookup X:X::X:X$source X:X::X:X$group",
+ SHOW_STR
+ IPV6_STR
+ PIM_STR
+ VRF_CMD_HELP_STR
+ "PIM cached nexthop rpf lookup\n"
+ "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;
+}
+
+DEFPY (show_ipv6_multicast,
+ show_ipv6_multicast_cmd,
+ "show ipv6 multicast [vrf NAME]",
+ SHOW_STR
+ IPV6_STR
+ "Multicast global information\n"
+ VRF_CMD_HELP_STR)
+{
+ struct vrf *v;
+ struct pim_instance *pim;
+
+ v = vrf_lookup_by_name(vrf ? vrf : VRF_DEFAULT_NAME);
+
+ if (!v)
+ return CMD_WARNING;
+
+ pim = pim_get_pim_instance(v->vrf_id);
+
+ if (!pim) {
+ vty_out(vty, "%% Unable to find pim instance\n");
+ return CMD_WARNING;
+ }
+
+ pim_cmd_show_ip_multicast_helper(pim, vty);
+
+ return CMD_SUCCESS;
+}
+
+DEFPY (show_ipv6_multicast_vrf_all,
+ show_ipv6_multicast_vrf_all_cmd,
+ "show ipv6 multicast vrf all",
+ SHOW_STR
+ IPV6_STR
+ "Multicast global information\n"
+ VRF_CMD_HELP_STR)
+{
+ struct vrf *vrf;
+
+ RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) {
+ vty_out(vty, "VRF: %s\n", vrf->name);
+ pim_cmd_show_ip_multicast_helper(vrf->info, vty);
+ }
+
+ return CMD_SUCCESS;
+}
+
+DEFPY (show_ipv6_multicast_count,
+ show_ipv6_multicast_count_cmd,
+ "show ipv6 multicast count [vrf NAME] [json$json]",
+ SHOW_STR
+ IPV6_STR
+ "Multicast global information\n"
+ "Data packet count\n"
+ VRF_CMD_HELP_STR
+ JSON_STR)
+{
+ struct pim_instance *pim;
+ struct vrf *v;
+ json_object *json_parent = NULL;
+
+ v = vrf_lookup_by_name(vrf ? vrf : VRF_DEFAULT_NAME);
+
+ if (!v)
+ return CMD_WARNING;
+
+ pim = pim_get_pim_instance(v->vrf_id);
+
+ if (!pim) {
+ vty_out(vty, "%% Unable to find pim instance\n");
+ return CMD_WARNING;
+ }
+
+ if (json)
+ json_parent = json_object_new_object();
+
+ show_multicast_interfaces(pim, vty, json_parent);
+
+ if (json)
+ vty_json(vty, json_parent);
+
+ return CMD_SUCCESS;
+}
+
+DEFPY (show_ipv6_multicast_count_vrf_all,
+ show_ipv6_multicast_count_vrf_all_cmd,
+ "show ipv6 multicast count vrf all [json$json]",
+ SHOW_STR
+ IPV6_STR
+ "Multicast global information\n"
+ "Data packet count\n"
+ VRF_CMD_HELP_STR
+ JSON_STR)
+{
+ struct vrf *vrf;
+ json_object *json_parent = NULL;
+ json_object *json_vrf = NULL;
+
+ if (json)
+ json_parent = json_object_new_object();
+
+ RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) {
+ if (!json)
+ vty_out(vty, "VRF: %s\n", vrf->name);
+ else
+ json_vrf = json_object_new_object();
+
+ show_multicast_interfaces(vrf->info, vty, json_vrf);
+ if (json)
+ json_object_object_add(json_parent, vrf->name,
+ json_vrf);
+ }
+ if (json)
+ vty_json(vty, json_parent);
+
+ return CMD_SUCCESS;
+}
+
+DEFPY (show_ipv6_mroute,
+ show_ipv6_mroute_cmd,
+ "show ipv6 mroute [vrf NAME] [X:X::X:X$s_or_g [X:X::X:X$g]] [fill$fill] [json$json]",
+ SHOW_STR
+ IPV6_STR
+ MROUTE_STR
+ VRF_CMD_HELP_STR
+ "The Source or Group\n"
+ "The Group\n"
+ "Fill in Assumed data\n"
+ JSON_STR)
+{
+ pim_sgaddr sg = {0};
+ struct pim_instance *pim;
+ struct vrf *v;
+ json_object *json_parent = NULL;
+
+ v = vrf_lookup_by_name(vrf ? vrf : VRF_DEFAULT_NAME);
+
+ if (!v)
+ return CMD_WARNING;
+
+ pim = pim_get_pim_instance(v->vrf_id);
+
+ if (!pim) {
+ vty_out(vty, "%% Unable to find pim instance\n");
+ return CMD_WARNING;
+ }
+
+ if (json)
+ json_parent = json_object_new_object();
+
+ 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;
+ }
+
+ show_mroute(pim, vty, &sg, !!fill, json_parent);
+
+ if (json)
+ vty_json(vty, json_parent);
+
+ return CMD_SUCCESS;
+}
+
+DEFPY (show_ipv6_mroute_vrf_all,
+ show_ipv6_mroute_vrf_all_cmd,
+ "show ipv6 mroute vrf all [fill$fill] [json$json]",
+ SHOW_STR
+ IPV6_STR
+ MROUTE_STR
+ VRF_CMD_HELP_STR
+ "Fill in Assumed data\n"
+ JSON_STR)
+{
+ pim_sgaddr sg = {0};
+ struct vrf *vrf;
+ json_object *json_parent = NULL;
+ json_object *json_vrf = NULL;
+
+ if (json)
+ json_parent = json_object_new_object();
+
+ RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) {
+ if (!json)
+ vty_out(vty, "VRF: %s\n", vrf->name);
+ else
+ json_vrf = json_object_new_object();
+ show_mroute(vrf->info, vty, &sg, !!fill, json_vrf);
+ if (json)
+ json_object_object_add(json_parent, vrf->name,
+ json_vrf);
+ }
+ if (json)
+ vty_json(vty, json_parent);
+
+ return CMD_SUCCESS;
+}
+
+DEFPY (show_ipv6_mroute_count,
+ show_ipv6_mroute_count_cmd,
+ "show ipv6 mroute [vrf NAME] count [json$json]",
+ SHOW_STR
+ IPV6_STR
+ MROUTE_STR
+ VRF_CMD_HELP_STR
+ "Route and packet count data\n"
+ JSON_STR)
+{
+ struct pim_instance *pim;
+ struct vrf *v;
+ json_object *json_parent = NULL;
+
+ v = vrf_lookup_by_name(vrf ? vrf : VRF_DEFAULT_NAME);
+
+ if (!v)
+ return CMD_WARNING;
+
+ pim = pim_get_pim_instance(v->vrf_id);
+
+ if (!pim) {
+ vty_out(vty, "%% Unable to find pim instance\n");
+ return CMD_WARNING;
+ }
+
+ if (json)
+ json_parent = json_object_new_object();
+
+ show_mroute_count(pim, vty, json_parent);
+
+ if (json)
+ vty_json(vty, json_parent);
+
+ return CMD_SUCCESS;
+}
+
+DEFPY (show_ipv6_mroute_count_vrf_all,
+ show_ipv6_mroute_count_vrf_all_cmd,
+ "show ipv6 mroute vrf all count [json$json]",
+ SHOW_STR
+ IPV6_STR
+ MROUTE_STR
+ VRF_CMD_HELP_STR
+ "Route and packet count data\n"
+ JSON_STR)
+{
+ struct vrf *vrf;
+ json_object *json_parent = NULL;
+ json_object *json_vrf = NULL;
+
+ if (json)
+ json_parent = json_object_new_object();
+
+ RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) {
+ if (!json)
+ vty_out(vty, "VRF: %s\n", vrf->name);
+ else
+ json_vrf = json_object_new_object();
+ show_mroute_count(vrf->info, vty, json_vrf);
+
+ if (json)
+ json_object_object_add(json_parent, vrf->name,
+ json_vrf);
+ }
+
+ if (json)
+ vty_json(vty, json_parent);
+
+ return CMD_SUCCESS;
+}
+
+DEFPY (show_ipv6_mroute_summary,
+ show_ipv6_mroute_summary_cmd,
+ "show ipv6 mroute [vrf NAME] summary [json$json]",
+ SHOW_STR
+ IPV6_STR
+ MROUTE_STR
+ VRF_CMD_HELP_STR
+ "Summary of all mroutes\n"
+ JSON_STR)
+{
+ struct pim_instance *pim;
+ struct vrf *v;
+ json_object *json_parent = NULL;
+
+ v = vrf_lookup_by_name(vrf ? vrf : VRF_DEFAULT_NAME);
+
+ if (!v)
+ return CMD_WARNING;
+
+ pim = pim_get_pim_instance(v->vrf_id);
+
+ if (!pim) {
+ vty_out(vty, "%% Unable to find pim instance\n");
+ return CMD_WARNING;
+ }
+
+ if (json)
+ json_parent = json_object_new_object();
+
+ show_mroute_summary(pim, vty, json_parent);
+
+ if (json)
+ vty_json(vty, json_parent);
+
+ return CMD_SUCCESS;
+}
+
+DEFPY (show_ipv6_mroute_summary_vrf_all,
+ show_ipv6_mroute_summary_vrf_all_cmd,
+ "show ipv6 mroute vrf all summary [json$json]",
+ SHOW_STR
+ IPV6_STR
+ MROUTE_STR
+ VRF_CMD_HELP_STR
+ "Summary of all mroutes\n"
+ JSON_STR)
+{
+ struct vrf *vrf;
+ json_object *json_parent = NULL;
+ json_object *json_vrf = NULL;
+
+ if (json)
+ json_parent = json_object_new_object();
+
+ RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) {
+ if (!json)
+ vty_out(vty, "VRF: %s\n", vrf->name);
+ else
+ json_vrf = json_object_new_object();
+
+ show_mroute_summary(vrf->info, vty, json_vrf);
+
+ if (json)
+ json_object_object_add(json_parent, vrf->name,
+ json_vrf);
+ }
+
+ if (json)
+ vty_json(vty, json_parent);
+
+ return CMD_SUCCESS;
}
void pim_cmd_init(void)
@@ -665,13 +1870,59 @@ void pim_cmd_init(void)
install_element(VRF_NODE, &ipv6_pim_rp_prefix_list_cmd);
install_element(CONFIG_NODE, &no_ipv6_pim_rp_prefix_list_cmd);
install_element(VRF_NODE, &no_ipv6_pim_rp_prefix_list_cmd);
+ install_element(CONFIG_NODE, &ipv6_ssmpingd_cmd);
+ install_element(VRF_NODE, &ipv6_ssmpingd_cmd);
+ install_element(CONFIG_NODE, &no_ipv6_ssmpingd_cmd);
+ install_element(VRF_NODE, &no_ipv6_ssmpingd_cmd);
+
install_element(INTERFACE_NODE, &interface_ipv6_mld_cmd);
- install_element(INTERFACE_NODE, &interface_no_ipv6_mld_cmd);
install_element(INTERFACE_NODE, &interface_ipv6_mld_join_cmd);
install_element(INTERFACE_NODE, &interface_no_ipv6_mld_join_cmd);
install_element(INTERFACE_NODE, &interface_ipv6_mld_version_cmd);
- install_element(INTERFACE_NODE, &interface_no_ipv6_mld_version_cmd);
install_element(INTERFACE_NODE, &interface_ipv6_mld_query_interval_cmd);
+ install_element(CONFIG_NODE, &ipv6_mld_group_watermark_cmd);
+ install_element(VRF_NODE, &ipv6_mld_group_watermark_cmd);
+ install_element(CONFIG_NODE, &no_ipv6_mld_group_watermark_cmd);
+ install_element(VRF_NODE, &no_ipv6_mld_group_watermark_cmd);
+
+ install_element(INTERFACE_NODE,
+ &interface_ipv6_mld_query_max_response_time_cmd);
+ install_element(INTERFACE_NODE,
+ &interface_ipv6_mld_robustness_cmd);
install_element(INTERFACE_NODE,
- &interface_no_ipv6_mld_query_interval_cmd);
+ &interface_ipv6_mld_last_member_query_interval_cmd);
+
+ install_element(VIEW_NODE, &show_ipv6_pim_rp_cmd);
+ install_element(VIEW_NODE, &show_ipv6_pim_rp_vrf_all_cmd);
+ install_element(VIEW_NODE, &show_ipv6_pim_rpf_cmd);
+ install_element(VIEW_NODE, &show_ipv6_pim_rpf_vrf_all_cmd);
+ install_element(VIEW_NODE, &show_ipv6_pim_secondary_cmd);
+ install_element(VIEW_NODE, &show_ipv6_pim_statistics_cmd);
+ install_element(VIEW_NODE, &show_ipv6_pim_upstream_cmd);
+ install_element(VIEW_NODE, &show_ipv6_pim_upstream_vrf_all_cmd);
+ install_element(VIEW_NODE, &show_ipv6_pim_upstream_join_desired_cmd);
+ install_element(VIEW_NODE, &show_ipv6_pim_upstream_rpf_cmd);
+ install_element(VIEW_NODE, &show_ipv6_pim_state_cmd);
+ install_element(VIEW_NODE, &show_ipv6_pim_state_vrf_all_cmd);
+ install_element(VIEW_NODE, &show_ipv6_pim_channel_cmd);
+ install_element(VIEW_NODE, &show_ipv6_pim_interface_cmd);
+ install_element(VIEW_NODE, &show_ipv6_pim_interface_vrf_all_cmd);
+ install_element(VIEW_NODE, &show_ipv6_pim_join_cmd);
+ install_element(VIEW_NODE, &show_ipv6_pim_join_vrf_all_cmd);
+ install_element(VIEW_NODE, &show_ipv6_pim_jp_agg_cmd);
+ install_element(VIEW_NODE, &show_ipv6_pim_local_membership_cmd);
+ install_element(VIEW_NODE, &show_ipv6_pim_neighbor_cmd);
+ install_element(VIEW_NODE, &show_ipv6_pim_neighbor_vrf_all_cmd);
+ install_element(VIEW_NODE, &show_ipv6_pim_nexthop_cmd);
+ install_element(VIEW_NODE, &show_ipv6_pim_nexthop_lookup_cmd);
+ install_element(VIEW_NODE, &show_ipv6_multicast_cmd);
+ install_element(VIEW_NODE, &show_ipv6_multicast_vrf_all_cmd);
+ install_element(VIEW_NODE, &show_ipv6_multicast_count_cmd);
+ install_element(VIEW_NODE, &show_ipv6_multicast_count_vrf_all_cmd);
+ install_element(VIEW_NODE, &show_ipv6_mroute_cmd);
+ install_element(VIEW_NODE, &show_ipv6_mroute_vrf_all_cmd);
+ install_element(VIEW_NODE, &show_ipv6_mroute_count_cmd);
+ install_element(VIEW_NODE, &show_ipv6_mroute_count_vrf_all_cmd);
+ install_element(VIEW_NODE, &show_ipv6_mroute_summary_cmd);
+ install_element(VIEW_NODE, &show_ipv6_mroute_summary_vrf_all_cmd);
}