From 63ee25c0ba1c49c14276b05b8de553a6be4ab9d6 Mon Sep 17 00:00:00 2001 From: sarita patra Date: Mon, 28 Feb 2022 18:30:14 -0800 Subject: [PATCH] pim6d: Adding ipv6 mroute INTERFACE X:X::X:X [X:X::X:X]" cli This cli is used to add multicast route on interface Signed-off-by: sarita patra --- pimd/pim6_cmd.c | 28 ++++++++++++++++++++++++++++ pimd/pim_cmd.c | 18 +++++------------- pimd/pim_cmd_common.c | 39 +++++++++++++++++++++++++++++++++++++++ pimd/pim_cmd_common.h | 4 ++++ 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 */ -- 2.39.5