summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pimd/pim6_cmd.c28
-rw-r--r--pimd/pim_cmd.c18
-rw-r--r--pimd/pim_cmd_common.c39
-rw-r--r--pimd/pim_cmd_common.h4
4 files changed, 76 insertions, 13 deletions
diff --git a/pimd/pim6_cmd.c b/pimd/pim6_cmd.c
index 350574fe58..1dc03dc38d 100644
--- a/pimd/pim6_cmd.c
+++ b/pimd/pim6_cmd.c
@@ -366,6 +366,32 @@ DEFPY (interface_no_ipv6_pim_boundary_oil,
return pim_process_no_ip_pim_boundary_oil_cmd(vty);
}
+DEFPY (interface_ipv6_mroute,
+ interface_ipv6_mroute_cmd,
+ "ipv6 mroute INTERFACE X:X::X:X$group [X:X::X:X]$source",
+ IPV6_STR
+ "Add multicast route\n"
+ "Outgoing interface name\n"
+ "Group address\n"
+ "Source address\n")
+{
+ return pim_process_ip_mroute_cmd(vty, interface, group_str, source_str);
+}
+
+DEFPY (interface_no_ipv6_mroute,
+ interface_no_ipv6_mroute_cmd,
+ "no ipv6 mroute INTERFACE X:X::X:X$group [X:X::X:X]$source",
+ NO_STR
+ IPV6_STR
+ "Add multicast route\n"
+ "Outgoing interface name\n"
+ "Group Address\n"
+ "Source Address\n")
+{
+ return pim_process_no_ip_mroute_cmd(vty, interface, group_str,
+ source_str);
+}
+
void pim_cmd_init(void)
{
if_cmd_init(pim_interface_config_write);
@@ -399,4 +425,6 @@ void pim_cmd_init(void)
&interface_ipv6_pim_boundary_oil_cmd);
install_element(INTERFACE_NODE,
&interface_no_ipv6_pim_boundary_oil_cmd);
+ install_element(INTERFACE_NODE, &interface_ipv6_mroute_cmd);
+ install_element(INTERFACE_NODE, &interface_no_ipv6_mroute_cmd);
}
diff --git a/pimd/pim_cmd.c b/pimd/pim_cmd.c
index 622606e922..a7041e8a60 100644
--- a/pimd/pim_cmd.c
+++ b/pimd/pim_cmd.c
@@ -8180,13 +8180,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,
@@ -8199,6 +8194,7 @@ DEFUN (interface_no_ip_mroute,
"Group Address\n"
"Source Address\n")
{
+ int idx_interface = 3;
int idx_ipv4 = 4;
const char *source_str;
@@ -8207,12 +8203,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,
diff --git a/pimd/pim_cmd_common.c b/pimd/pim_cmd_common.c
index 22272fada8..34472173ed 100644
--- a/pimd/pim_cmd_common.c
+++ b/pimd/pim_cmd_common.c
@@ -30,6 +30,7 @@
#include "nexthop.h"
#include "vrf.h"
#include "ferr.h"
+#include "lib/srcdest_table.h"
#include "pimd.h"
#include "pim_vty.h"
@@ -460,3 +461,41 @@ int pim_process_no_ip_pim_boundary_oil_cmd(struct vty *vty)
return nb_cli_apply_changes(vty, FRR_PIM_INTERFACE_XPATH,
FRR_PIM_AF_XPATH_VAL);
}
+
+int pim_process_ip_mroute_cmd(struct vty *vty, const char *interface,
+ const char *group_str, const char *source_str)
+{
+ nb_cli_enqueue_change(vty, "./oif", NB_OP_MODIFY, interface);
+
+ if (!source_str) {
+ char buf[SRCDEST2STR_BUFFER];
+
+ inet_ntop(AF_INET6, &in6addr_any, buf, sizeof(buf));
+ return nb_cli_apply_changes(vty, FRR_PIM_MROUTE_XPATH,
+ FRR_PIM_AF_XPATH_VAL, buf,
+ group_str);
+ }
+
+ return nb_cli_apply_changes(vty, FRR_PIM_MROUTE_XPATH,
+ FRR_PIM_AF_XPATH_VAL, source_str,
+ group_str);
+}
+
+int pim_process_no_ip_mroute_cmd(struct vty *vty, const char *interface,
+ const char *group_str, const char *source_str)
+{
+ nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL);
+
+ if (!source_str) {
+ char buf[SRCDEST2STR_BUFFER];
+
+ inet_ntop(AF_INET6, &in6addr_any, buf, sizeof(buf));
+ return nb_cli_apply_changes(vty, FRR_PIM_MROUTE_XPATH,
+ FRR_PIM_AF_XPATH_VAL, buf,
+ group_str);
+ }
+
+ return nb_cli_apply_changes(vty, FRR_PIM_MROUTE_XPATH,
+ FRR_PIM_AF_XPATH_VAL, source_str,
+ group_str);
+}
diff --git a/pimd/pim_cmd_common.h b/pimd/pim_cmd_common.h
index 1513f49a1a..688a4f787b 100644
--- a/pimd/pim_cmd_common.h
+++ b/pimd/pim_cmd_common.h
@@ -46,5 +46,9 @@ int pim_process_no_ip_pim_hello_cmd(struct vty *vty);
int pim_process_ip_pim_activeactive_cmd(struct vty *vty, const char *no);
int pim_process_ip_pim_boundary_oil_cmd(struct vty *vty, const char *oil);
int pim_process_no_ip_pim_boundary_oil_cmd(struct vty *vty);
+int pim_process_ip_mroute_cmd(struct vty *vty, const char *interface,
+ const char *group_str, const char *source_str);
+int pim_process_no_ip_mroute_cmd(struct vty *vty, const char *interface,
+ const char *group_str, const char *src_str);
#endif /* PIM_CMD_COMMON_H */