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.c395
1 files changed, 38 insertions, 357 deletions
diff --git a/pimd/pim_cmd.c b/pimd/pim_cmd.c
index 76f90cdba7..3b3d06e791 100644
--- a/pimd/pim_cmd.c
+++ b/pimd/pim_cmd.c
@@ -6997,98 +6997,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;
- }
+ 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_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);
-
- 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"
@@ -7096,106 +7034,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];
- char group_xpath[XPATH_MAXLEN];
- char rp_xpath[XPATH_MAXLEN];
- int printed;
- const char *vrfname;
- const struct lyd_node *group_dnode;
-
- 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);
-
-
- printed = snprintf(group_list_xpath, sizeof(group_list_xpath),
- "%s/group-list", rp_xpath);
-
- if (printed >= (int)(sizeof(group_list_xpath))) {
- vty_out(vty, "Xpath too long (%d > %u)", printed + 1,
- XPATH_MAXLEN);
- return CMD_WARNING_CONFIG_FAILED;
- }
-
- printed = snprintf(group_xpath, sizeof(group_xpath), "%s[.='%s']",
- group_list_xpath, group_str);
-
- if (printed >= (int)(sizeof(group_xpath))) {
- vty_out(vty, "Xpath too long (%d > %u)", printed + 1,
- XPATH_MAXLEN);
- return CMD_WARNING_CONFIG_FAILED;
- }
-
- 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);
+ const char *group_str = (gp_str) ? gp_str : "224.0.0.0/4";
- 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,
@@ -7959,11 +7814,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_INTERFACE_XPATH,
- "frr-routing:ipv4");
+ return pim_process_ip_pim_drprio_cmd(vty, argv[idx_number]->arg);
}
DEFUN (interface_no_ip_pim_drprio,
@@ -7975,10 +7826,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_INTERFACE_XPATH,
- "frr-routing:ipv4");
+ return pim_process_no_ip_pim_drprio_cmd(vty);
}
DEFPY_HIDDEN (interface_ip_igmp_query_generate,
@@ -8069,20 +7917,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_INTERFACE_XPATH,
- "frr-routing:ipv4");
+ return pim_process_ip_pim_activeactive_cmd(vty, no);
}
DEFUN_HIDDEN (interface_ip_pim_ssm,
@@ -8094,11 +7929,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_INTERFACE_XPATH,
- "frr-routing:ipv4");
+ ret = pim_process_ip_pim_cmd(vty);
if (ret != NB_OK)
return ret;
@@ -8116,11 +7947,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_INTERFACE_XPATH,
- "frr-routing:ipv4");
+ return pim_process_ip_pim_cmd(vty);
}
DEFUN (interface_ip_pim,
@@ -8129,12 +7956,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_INTERFACE_XPATH,
- "frr-routing:ipv4");
-
+ return pim_process_ip_pim_cmd(vty);
}
DEFUN_HIDDEN (interface_no_ip_pim_ssm,
@@ -8145,39 +7967,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];
-
- int printed =
- snprintf(igmp_if_xpath, sizeof(igmp_if_xpath),
- "%s/frr-gmp:gmp/address-family[address-family='%s']",
- VTY_CURR_XPATH, "frr-routing:ipv4");
-
- if (printed >= (int)(sizeof(igmp_if_xpath))) {
- vty_out(vty, "Xpath too long (%d > %u)", printed + 1,
- XPATH_MAXLEN);
- return CMD_WARNING_CONFIG_FAILED;
- }
-
- igmp_enable_dnode = yang_dnode_getf(vty->candidate_config->dnode,
- FRR_GMP_ENABLE_XPATH,
- VTY_CURR_XPATH,
- "frr-routing:ipv4");
- 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_INTERFACE_XPATH,
- "frr-routing:ipv4");
+ return pim_process_no_ip_pim_cmd(vty);
}
DEFUN_HIDDEN (interface_no_ip_pim_sm,
@@ -8188,41 +7978,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];
-
- int printed =
- snprintf(igmp_if_xpath, sizeof(igmp_if_xpath),
- "%s/frr-gmp:gmp/address-family[address-family='%s']",
- VTY_CURR_XPATH, "frr-routing:ipv4");
-
- if (printed >= (int)(sizeof(igmp_if_xpath))) {
- vty_out(vty, "Xpath too long (%d > %u)", printed + 1,
- XPATH_MAXLEN);
- return CMD_WARNING_CONFIG_FAILED;
- }
-
- igmp_enable_dnode =
- yang_dnode_getf(vty->candidate_config->dnode,
- FRR_GMP_ENABLE_XPATH, VTY_CURR_XPATH,
- "frr-routing:ipv4");
-
- 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_INTERFACE_XPATH,
- "frr-routing:ipv4");
+ return pim_process_no_ip_pim_cmd(vty);
}
DEFUN (interface_no_ip_pim,
@@ -8232,41 +7988,7 @@ DEFUN (interface_no_ip_pim,
IP_STR
PIM_STR)
{
- const struct lyd_node *igmp_enable_dnode;
- char igmp_if_xpath[XPATH_MAXLEN];
-
- int printed =
- snprintf(igmp_if_xpath, sizeof(igmp_if_xpath),
- "%s/frr-gmp:gmp/address-family[address-family='%s']",
- VTY_CURR_XPATH, "frr-routing:ipv4");
-
- if (printed >= (int)(sizeof(igmp_if_xpath))) {
- vty_out(vty, "Xpath too long (%d > %u)", printed + 1,
- XPATH_MAXLEN);
- return CMD_WARNING_CONFIG_FAILED;
- }
-
- igmp_enable_dnode =
- yang_dnode_getf(vty->candidate_config->dnode,
- FRR_GMP_ENABLE_XPATH, VTY_CURR_XPATH,
- "frr-routing:ipv4");
-
- 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_INTERFACE_XPATH,
- "frr-routing:ipv4");
+ return pim_process_no_ip_pim_cmd(vty);
}
/* boundaries */
@@ -8279,13 +8001,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_INTERFACE_XPATH,
- "frr-routing:ipv4");
-
+ return pim_process_ip_pim_boundary_oil_cmd(vty, argv[4]->arg);
}
DEFUN(interface_no_ip_pim_boundary_oil,
@@ -8298,12 +8014,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_INTERFACE_XPATH,
- "frr-routing:ipv4");
+ return pim_process_no_ip_pim_boundary_oil_cmd(vty);
}
DEFUN (interface_ip_mroute,
@@ -8324,13 +8035,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_MROUTE_XPATH,
- "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,
@@ -8343,6 +8049,7 @@ DEFUN (interface_no_ip_mroute,
"Group Address\n"
"Source Address\n")
{
+ int idx_interface = 3;
int idx_ipv4 = 4;
const char *source_str;
@@ -8351,12 +8058,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_MROUTE_XPATH,
- "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,
@@ -8370,31 +8073,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,
- 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");
- } 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_INTERFACE_XPATH,
- "frr-routing:ipv4");
+ else
+ return pim_process_ip_pim_hello_cmd(vty, argv[idx_time]->arg,
+ NULL);
}
DEFUN (interface_no_ip_pim_hello,
@@ -8407,12 +8093,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_INTERFACE_XPATH,
- "frr-routing:ipv4");
+ return pim_process_no_ip_pim_hello_cmd(vty);
}
DEFUN (debug_igmp,