mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-16 08:32:45 +00:00
pimd: Moving processing of "ip pim rp <grp>" cmd to a common api
1. Moving the processing of the command to a common api. 2. Changing the DEFUN to DEFPY. Signed-off-by: Mobashshera Rasool <mrasool@vmware.com>
This commit is contained in:
parent
f4d8394b01
commit
13ddf7cf74
109
pimd/pim_cmd.c
109
pimd/pim_cmd.c
@ -6997,63 +6997,18 @@ 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";
|
||||
const char *group_str = (gp_str) ? gp_str : "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);
|
||||
|
||||
return nb_cli_apply_changes(vty, NULL);
|
||||
return pim_process_rp_cmd(vty, rp_str, group_str);
|
||||
}
|
||||
|
||||
DEFUN (ip_pim_rp_prefix_list,
|
||||
@ -7086,9 +7041,9 @@ DEFUN (ip_pim_rp_prefix_list,
|
||||
return nb_cli_apply_changes(vty, NULL);
|
||||
}
|
||||
|
||||
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,57 +7051,9 @@ 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;
|
||||
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);
|
||||
|
||||
|
||||
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);
|
||||
|
||||
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,
|
||||
|
@ -499,3 +499,103 @@ int pim_process_no_ip_mroute_cmd(struct vty *vty, const char *interface,
|
||||
FRR_PIM_AF_XPATH_VAL, source_str,
|
||||
group_str);
|
||||
}
|
||||
|
||||
int pim_process_rp_cmd(struct vty *vty, const char *rp_str,
|
||||
const char *group_str)
|
||||
{
|
||||
const char *vrfname;
|
||||
char rp_group_xpath[XPATH_MAXLEN];
|
||||
int result = 0;
|
||||
struct prefix group;
|
||||
struct in_addr rp_addr;
|
||||
|
||||
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, rp_str, &rp_addr);
|
||||
if (result <= 0) {
|
||||
vty_out(vty, "%% Bad RP address specified: %s\n", rp_str);
|
||||
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",
|
||||
rp_str);
|
||||
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);
|
||||
}
|
||||
|
||||
int pim_process_no_rp_cmd(struct vty *vty, const char *rp_str,
|
||||
const char *group_str)
|
||||
{
|
||||
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",
|
||||
rp_str);
|
||||
|
||||
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);
|
||||
|
||||
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);
|
||||
}
|
||||
|
@ -35,6 +35,10 @@ int pim_process_rp_kat_cmd(struct vty *vty, const char *rpkat);
|
||||
int pim_process_no_rp_kat_cmd(struct vty *vty);
|
||||
int pim_process_register_suppress_cmd(struct vty *vty, const char *rst);
|
||||
int pim_process_no_register_suppress_cmd(struct vty *vty);
|
||||
int pim_process_rp_cmd(struct vty *vty, const char *rp_str,
|
||||
const char *group_str);
|
||||
int pim_process_no_rp_cmd(struct vty *vty, const char *rp_str,
|
||||
const char *group_str);
|
||||
|
||||
int pim_process_ip_pim_cmd(struct vty *vty);
|
||||
int pim_process_no_ip_pim_cmd(struct vty *vty);
|
||||
|
Loading…
Reference in New Issue
Block a user