From 13ddf7cf74781713ccaad80e32f0e8f953d8c446 Mon Sep 17 00:00:00 2001 From: Mobashshera Rasool Date: Sun, 6 Mar 2022 22:02:10 -0800 Subject: [PATCH 01/21] pimd: Moving processing of "ip pim rp " 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 --- pimd/pim_cmd.c | 109 ++++-------------------------------------- pimd/pim_cmd_common.c | 100 ++++++++++++++++++++++++++++++++++++++ pimd/pim_cmd_common.h | 4 ++ 3 files changed, 112 insertions(+), 101 deletions(-) diff --git a/pimd/pim_cmd.c b/pimd/pim_cmd.c index a7041e8a60..a3bfcdc73a 100644 --- a/pimd/pim_cmd.c +++ b/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, diff --git a/pimd/pim_cmd_common.c b/pimd/pim_cmd_common.c index 34472173ed..82aaf4b3d9 100644 --- a/pimd/pim_cmd_common.c +++ b/pimd/pim_cmd_common.c @@ -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); +} diff --git a/pimd/pim_cmd_common.h b/pimd/pim_cmd_common.h index 688a4f787b..0112393cf7 100644 --- a/pimd/pim_cmd_common.h +++ b/pimd/pim_cmd_common.h @@ -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); From a96942ca3e4d0e63da89e17401b10cf65f0fcb42 Mon Sep 17 00:00:00 2001 From: Mobashshera Rasool Date: Sun, 6 Mar 2022 22:46:10 -0800 Subject: [PATCH 02/21] pim6d: Modify apis pim_process_rp_cmd for common processing Modify the apis pim_process_rp_cmd and pim_process_no_rp_cmd to accomodate ipv4 as well as ipv6. Signed-off-by: Mobashshera Rasool --- pimd/pim_cmd_common.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/pimd/pim_cmd_common.c b/pimd/pim_cmd_common.c index 82aaf4b3d9..3a3416ebbf 100644 --- a/pimd/pim_cmd_common.c +++ b/pimd/pim_cmd_common.c @@ -507,7 +507,7 @@ int pim_process_rp_cmd(struct vty *vty, const char *rp_str, char rp_group_xpath[XPATH_MAXLEN]; int result = 0; struct prefix group; - struct in_addr rp_addr; + pim_addr rp_addr; result = str2prefix(group_str, &group); if (result) { @@ -527,7 +527,7 @@ int pim_process_rp_cmd(struct vty *vty, const char *rp_str, return CMD_WARNING_CONFIG_FAILED; } - result = inet_pton(AF_INET, rp_str, &rp_addr); + result = inet_pton(PIM_AF, rp_str, &rp_addr); if (result <= 0) { vty_out(vty, "%% Bad RP address specified: %s\n", rp_str); return CMD_WARNING_CONFIG_FAILED; @@ -538,9 +538,8 @@ int pim_process_rp_cmd(struct vty *vty, const char *rp_str, 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); + FRR_PIM_STATIC_RP_XPATH, "frr-pim:pimd", "pim", vrfname, + FRR_PIM_AF_XPATH_VAL, 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); @@ -563,8 +562,7 @@ int pim_process_no_rp_cmd(struct vty *vty, const char *rp_str, 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); + "frr-pim:pimd", "pim", vrfname, FRR_PIM_AF_XPATH_VAL, rp_str); printed = snprintf(group_list_xpath, sizeof(group_list_xpath), "%s/group-list", rp_xpath); From f39f349719fabd797797f29766443434c332385f Mon Sep 17 00:00:00 2001 From: Mobashshera Rasool Date: Sun, 6 Mar 2022 23:18:47 -0800 Subject: [PATCH 03/21] pimd: Modify "ip pim rp <> prefix-list <>" command 1. Moving the processing of the above command to an api. 2. Change DEFUN to DEPFY 3. Make the api common for pimv4 and pimv6 processing. Signed-off-by: Mobashshera Rasool --- pimd/pim_cmd.c | 68 +++++-------------------------------------- pimd/pim_cmd_common.c | 57 ++++++++++++++++++++++++++++++++++++ pimd/pim_cmd_common.h | 4 +++ 3 files changed, 69 insertions(+), 60 deletions(-) diff --git a/pimd/pim_cmd.c b/pimd/pim_cmd.c index a3bfcdc73a..3b3d06e791 100644 --- a/pimd/pim_cmd.c +++ b/pimd/pim_cmd.c @@ -7011,34 +7011,17 @@ DEFPY (ip_pim_rp, 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); } DEFPY (no_ip_pim_rp, @@ -7056,53 +7039,18 @@ DEFPY (no_ip_pim_rp, 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, diff --git a/pimd/pim_cmd_common.c b/pimd/pim_cmd_common.c index 3a3416ebbf..442760fdfe 100644 --- a/pimd/pim_cmd_common.c +++ b/pimd/pim_cmd_common.c @@ -597,3 +597,60 @@ int pim_process_no_rp_cmd(struct vty *vty, const char *rp_str, return nb_cli_apply_changes(vty, NULL); } + +int pim_process_rp_plist_cmd(struct vty *vty, const char *rp_str, + const char *prefix_list) +{ + 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_PIM_AF_XPATH_VAL, rp_str); + strlcat(rp_plist_xpath, "/prefix-list", sizeof(rp_plist_xpath)); + + nb_cli_enqueue_change(vty, rp_plist_xpath, NB_OP_MODIFY, prefix_list); + + return nb_cli_apply_changes(vty, NULL); +} + +int pim_process_no_rp_plist_cmd(struct vty *vty, const char *rp_str, + const char *prefix_list) +{ + 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_PIM_AF_XPATH_VAL, rp_str); + + snprintf(plist_xpath, sizeof(plist_xpath), FRR_PIM_STATIC_RP_XPATH, + "frr-pim:pimd", "pim", vrfname, FRR_PIM_AF_XPATH_VAL, rp_str); + 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(prefix_list, 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); +} diff --git a/pimd/pim_cmd_common.h b/pimd/pim_cmd_common.h index 0112393cf7..b7e6b6ac80 100644 --- a/pimd/pim_cmd_common.h +++ b/pimd/pim_cmd_common.h @@ -39,6 +39,10 @@ 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_rp_plist_cmd(struct vty *vty, const char *rp_str, + const char *prefix_list); +int pim_process_no_rp_plist_cmd(struct vty *vty, const char *rp_str, + const char *prefix_list); int pim_process_ip_pim_cmd(struct vty *vty); int pim_process_no_ip_pim_cmd(struct vty *vty); From 34b403cf8b12c9c1ccc303b1e49037474dee5187 Mon Sep 17 00:00:00 2001 From: Mobashshera Rasool Date: Tue, 25 Jan 2022 02:49:10 -0800 Subject: [PATCH 04/21] pim6d: Add static RP CLI for PIMv6 Added the CLI to configure static RP configuration. [no] ipv6 pim rp [] Signed-off-by: Mobashshera Rasool --- pimd/pim6_cmd.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/pimd/pim6_cmd.c b/pimd/pim6_cmd.c index 1dc03dc38d..4458e4c25b 100644 --- a/pimd/pim6_cmd.c +++ b/pimd/pim6_cmd.c @@ -392,6 +392,35 @@ DEFPY (interface_no_ipv6_mroute, source_str); } +DEFPY (ipv6_pim_rp, + ipv6_pim_rp_cmd, + "ipv6 pim rp X:X::X:X$rp [X:X::X:X/M]$gp", + IPV6_STR + PIM_STR + "Rendezvous Point\n" + "ipv6 address of RP\n" + "Group Address range to cover\n") +{ + const char *group_str = (gp_str) ? gp_str : "FF00::0/8"; + + return pim_process_rp_cmd(vty, rp_str, group_str); +} + +DEFPY (no_ipv6_pim_rp, + no_ipv6_pim_rp_cmd, + "no ipv6 pim rp X:X::X:X$rp [X:X::X:X/M]$gp", + NO_STR + IPV6_STR + PIM_STR + "Rendezvous Point\n" + "ipv6 address of RP\n" + "Group Address range to cover\n") +{ + const char *group_str = (gp_str) ? gp_str : "FF00::0/8"; + + return pim_process_no_rp_cmd(vty, rp_str, group_str); +} + void pim_cmd_init(void) { if_cmd_init(pim_interface_config_write); @@ -427,4 +456,8 @@ void pim_cmd_init(void) &interface_no_ipv6_pim_boundary_oil_cmd); install_element(INTERFACE_NODE, &interface_ipv6_mroute_cmd); install_element(INTERFACE_NODE, &interface_no_ipv6_mroute_cmd); + install_element(CONFIG_NODE, &ipv6_pim_rp_cmd); + install_element(VRF_NODE, &ipv6_pim_rp_cmd); + install_element(CONFIG_NODE, &no_ipv6_pim_rp_cmd); + install_element(VRF_NODE, &no_ipv6_pim_rp_cmd); } From 8663adc490cc3eaf7d6614aaf1c5e28823e62d8e Mon Sep 17 00:00:00 2001 From: Mobashshera Rasool Date: Sun, 6 Mar 2022 23:26:53 -0800 Subject: [PATCH 05/21] pim6d: Adding "ipv6 pim rp <> prefix-list <>" cli to pimv6 Signed-off-by: Mobashshera Rasool --- pimd/pim6_cmd.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/pimd/pim6_cmd.c b/pimd/pim6_cmd.c index 4458e4c25b..e3130b1564 100644 --- a/pimd/pim6_cmd.c +++ b/pimd/pim6_cmd.c @@ -421,6 +421,33 @@ DEFPY (no_ipv6_pim_rp, return pim_process_no_rp_cmd(vty, rp_str, group_str); } +DEFPY (ipv6_pim_rp_prefix_list, + ipv6_pim_rp_prefix_list_cmd, + "ipv6 pim rp X:X::X:X$rp prefix-list WORD$plist", + IPV6_STR + PIM_STR + "Rendezvous Point\n" + "ipv6 address of RP\n" + "group prefix-list filter\n" + "Name of a prefix-list\n") +{ + return pim_process_rp_plist_cmd(vty, rp_str, plist); +} + +DEFPY (no_ipv6_pim_rp_prefix_list, + no_ipv6_pim_rp_prefix_list_cmd, + "no ipv6 pim rp X:X::X:X$rp prefix-list WORD$plist", + NO_STR + IPV6_STR + PIM_STR + "Rendezvous Point\n" + "ipv6 address of RP\n" + "group prefix-list filter\n" + "Name of a prefix-list\n") +{ + return pim_process_no_rp_plist_cmd(vty, rp_str, plist); +} + void pim_cmd_init(void) { if_cmd_init(pim_interface_config_write); @@ -460,4 +487,8 @@ void pim_cmd_init(void) install_element(VRF_NODE, &ipv6_pim_rp_cmd); install_element(CONFIG_NODE, &no_ipv6_pim_rp_cmd); install_element(VRF_NODE, &no_ipv6_pim_rp_cmd); + install_element(CONFIG_NODE, &ipv6_pim_rp_prefix_list_cmd); + 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); } From 0c3182a08db7b4f2d171f8bf67c7815c36379a13 Mon Sep 17 00:00:00 2001 From: Mobashshera Rasool Date: Sun, 6 Mar 2022 23:34:19 -0800 Subject: [PATCH 06/21] pim6d: Adding the rp clis to show-running Modify the pim_rp_config_write api for pimv4/pimv6. Signed-off-by: Mobashshera Rasool --- pimd/pim_rp.c | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/pimd/pim_rp.c b/pimd/pim_rp.c index 06b2216072..87e83ededf 100644 --- a/pimd/pim_rp.c +++ b/pimd/pim_rp.c @@ -1176,8 +1176,8 @@ int pim_rp_config_write(struct pim_instance *pim, struct vty *vty, { struct listnode *node; struct rp_info *rp_info; - char rp_buffer[32]; int count = 0; + pim_addr rp_addr; for (ALL_LIST_ELEMENTS_RO(pim->rp_list, node, rp_info)) { if (pim_rpf_addr_is_inaddr_any(&rp_info->rp)) @@ -1186,18 +1186,15 @@ int pim_rp_config_write(struct pim_instance *pim, struct vty *vty, if (rp_info->rp_src == RP_SRC_BSR) continue; + rp_addr = pim_addr_from_prefix(&rp_info->rp.rpf_addr); if (rp_info->plist) - vty_out(vty, "%sip pim rp %s prefix-list %s\n", spaces, - inet_ntop(AF_INET, - &rp_info->rp.rpf_addr.u.prefix4, - rp_buffer, 32), - rp_info->plist); + vty_out(vty, + "%s" PIM_AF_NAME + " pim rp %pPA prefix-list %s\n", + spaces, &rp_addr, rp_info->plist); else - vty_out(vty, "%sip pim rp %s %pFX\n", spaces, - inet_ntop(AF_INET, - &rp_info->rp.rpf_addr.u.prefix4, - rp_buffer, 32), - &rp_info->group); + vty_out(vty, "%s" PIM_AF_NAME " pim rp %pPA %pFX\n", + spaces, &rp_addr, &rp_info->group); count++; } From e1a7c58ce2072aaa40e127539e6eb90518620e22 Mon Sep 17 00:00:00 2001 From: Mobashshera Rasool Date: Tue, 25 Jan 2022 03:19:22 -0800 Subject: [PATCH 07/21] pim6d: Add northbound changes for static rp Parsing the inputs for static RP configuration. Signed-off-by: Mobashshera Rasool --- pimd/pim_nb_config.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/pimd/pim_nb_config.c b/pimd/pim_nb_config.c index 27cac0c1a7..d1611b6fe5 100644 --- a/pimd/pim_nb_config.c +++ b/pimd/pim_nb_config.c @@ -2407,9 +2407,8 @@ int routing_control_plane_protocols_control_plane_protocol_pim_address_family_rp vrf = nb_running_get_entry(args->dnode, NULL, true); pim = vrf->info; yang_dnode_get_ip(&rp_addr, args->dnode, "../rp-address"); - yang_dnode_get_ipv4p(&group, args->dnode, NULL); - apply_mask_ipv4((struct prefix_ipv4 *)&group); - + yang_dnode_get_prefix(&group, args->dnode, NULL); + apply_mask(&group); return pim_rp_cmd_worker(pim, rp_addr.ip._v4_addr, group, NULL, args->errmsg, args->errmsg_len); } @@ -2434,8 +2433,8 @@ int routing_control_plane_protocols_control_plane_protocol_pim_address_family_rp vrf = nb_running_get_entry(args->dnode, NULL, true); pim = vrf->info; yang_dnode_get_ip(&rp_addr, args->dnode, "../rp-address"); - yang_dnode_get_ipv4p(&group, args->dnode, NULL); - apply_mask_ipv4((struct prefix_ipv4 *)&group); + yang_dnode_get_prefix(&group, args->dnode, NULL); + apply_mask(&group); return pim_no_rp_cmd_worker(pim, rp_addr.ip._v4_addr, group, NULL, args->errmsg, From 4fc1f59ea748d57f4e1a32d974aaad1a3b6bdd0b Mon Sep 17 00:00:00 2001 From: Mobashshera Rasool Date: Mon, 28 Feb 2022 11:12:03 -0800 Subject: [PATCH 08/21] pim6d: Stub BSM related APIs for compilation Have stubbed few of the BSM related APIs to keep PIMv6 compiling. Signed-off-by: Mobashshera Rasool --- pimd/pim6_stubs.c | 22 ++++++++++++++++++++++ pimd/subdir.am | 2 +- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/pimd/pim6_stubs.c b/pimd/pim6_stubs.c index 9f68b7be3d..dab46b2892 100644 --- a/pimd/pim6_stubs.c +++ b/pimd/pim6_stubs.c @@ -133,3 +133,25 @@ void pim_reg_del_on_couldreg_fail(struct interface *ifp) { } +bool pim_bsm_new_nbr_fwd(struct pim_neighbor *neigh, struct interface *ifp) +{ + return false; +} + +void pim_bsm_proc_free(struct pim_instance *pim) +{ +} + +void pim_bsm_proc_init(struct pim_instance *pim) +{ +} + +struct bsgrp_node *pim_bsm_get_bsgrp_node(struct bsm_scope *scope, + struct prefix *grp) +{ + return NULL; +} + +void pim_bsm_write_config(struct vty *vty, struct interface *ifp) +{ +} diff --git a/pimd/subdir.am b/pimd/subdir.am index 0fe40912b1..0fb5de7e09 100644 --- a/pimd/subdir.am +++ b/pimd/subdir.am @@ -21,7 +21,6 @@ pim_common = \ pimd/pim_assert.c \ pimd/pim_bfd.c \ pimd/pim_br.c \ - pimd/pim_bsm.c \ pimd/pim_cmd_common.c \ pimd/pim_errors.c \ pimd/pim_hello.c \ @@ -59,6 +58,7 @@ pim_common = \ pimd_pimd_SOURCES = \ $(pim_common) \ + pimd/pim_bsm.c \ pimd/pim_cmd.c \ pimd/pim_igmp.c \ pimd/pim_igmp_mtrace.c \ From 99384c6e4d46be59835286f5b0459eb08f3931ab Mon Sep 17 00:00:00 2001 From: Mobashshera Rasool Date: Wed, 2 Feb 2022 07:36:47 -0800 Subject: [PATCH 09/21] pim6d: Return type and parameter changes for api pim_rp_del_config 1. Return value of this function pim_rp_del_config is nowhere used. So made it as a void function. 2. Paramater const char *rp is first converted to string from prefix in the caller and then back to prefix in this api pim_rp_del_config. Fixed it by directly passing the address instead of string. Signed-off-by: Mobashshera Rasool --- pimd/pim_rp.c | 30 +++++++++++++----------------- pimd/pim_rp.h | 4 ++-- 2 files changed, 15 insertions(+), 19 deletions(-) diff --git a/pimd/pim_rp.c b/pimd/pim_rp.c index 87e83ededf..6752b9fa01 100644 --- a/pimd/pim_rp.c +++ b/pimd/pim_rp.c @@ -416,7 +416,6 @@ int pim_rp_new(struct pim_instance *pim, struct in_addr rp_addr, struct prefix g const char *plist, enum rp_source rp_src_flag) { int result = 0; - char rp[INET_ADDRSTRLEN]; struct rp_info *rp_info; struct rp_info *rp_all; struct prefix group_all; @@ -439,8 +438,6 @@ int pim_rp_new(struct pim_instance *pim, struct in_addr rp_addr, struct prefix g prefix_copy(&rp_info->group, &group); rp_info->rp_src = rp_src_flag; - inet_ntop(AF_INET, &rp_info->rp.rpf_addr.u.prefix4, rp, sizeof(rp)); - if (plist) { /* * Return if the prefix-list is already configured for this RP @@ -467,11 +464,11 @@ int pim_rp_new(struct pim_instance *pim, struct in_addr rp_addr, struct prefix g if (rp_info->rp.rpf_addr.u.prefix4.s_addr == tmp_rp_info->rp.rpf_addr.u.prefix4.s_addr) { if (tmp_rp_info->plist) - pim_rp_del_config(pim, rp, NULL, + pim_rp_del_config(pim, rp_addr, NULL, tmp_rp_info->plist); else pim_rp_del_config( - pim, rp, + pim, rp_addr, prefix2str(&tmp_rp_info->group, buffer, BUFSIZ), NULL); @@ -504,7 +501,7 @@ int pim_rp_new(struct pim_instance *pim, struct in_addr rp_addr, struct prefix g && rp_info->rp.rpf_addr.u.prefix4.s_addr == tmp_rp_info->rp.rpf_addr.u.prefix4 .s_addr) { - pim_rp_del_config(pim, rp, NULL, + pim_rp_del_config(pim, rp_addr, NULL, tmp_rp_info->plist); } } @@ -657,11 +654,10 @@ int pim_rp_new(struct pim_instance *pim, struct in_addr rp_addr, struct prefix g return PIM_SUCCESS; } -int pim_rp_del_config(struct pim_instance *pim, const char *rp, - const char *group_range, const char *plist) +void pim_rp_del_config(struct pim_instance *pim, pim_addr rp_addr, + const char *group_range, const char *plist) { struct prefix group; - struct in_addr rp_addr; int result; if (group_range == NULL) @@ -669,15 +665,15 @@ int pim_rp_del_config(struct pim_instance *pim, const char *rp, else result = str2prefix(group_range, &group); - if (!result) - return PIM_GROUP_BAD_ADDRESS; + if (!result) { + if (PIM_DEBUG_PIM_TRACE) + zlog_debug( + "%s: String to prefix failed for %pPAs group", + __func__, &rp_addr); + return; + } - result = inet_pton(AF_INET, rp, &rp_addr); - if (result <= 0) - return PIM_RP_BAD_ADDRESS; - - result = pim_rp_del(pim, rp_addr, group, plist, RP_SRC_STATIC); - return result; + pim_rp_del(pim, rp_addr, group, plist, RP_SRC_STATIC); } int pim_rp_del(struct pim_instance *pim, struct in_addr rp_addr, diff --git a/pimd/pim_rp.h b/pimd/pim_rp.h index c223402ddd..98a3ae3780 100644 --- a/pimd/pim_rp.h +++ b/pimd/pim_rp.h @@ -50,8 +50,8 @@ void pim_rp_list_hash_clean(void *data); int pim_rp_new(struct pim_instance *pim, struct in_addr rp_addr, struct prefix group, const char *plist, enum rp_source rp_src_flag); -int pim_rp_del_config(struct pim_instance *pim, const char *rp, - const char *group, const char *plist); +void pim_rp_del_config(struct pim_instance *pim, pim_addr rp_addr, + const char *group, const char *plist); int pim_rp_del(struct pim_instance *pim, struct in_addr rp_addr, struct prefix group, const char *plist, enum rp_source rp_src_flag); From 6ed1cea1dca63693b06d7b4a0c9a95820d9d2efc Mon Sep 17 00:00:00 2001 From: Mobashshera Rasool Date: Wed, 2 Feb 2022 07:00:50 -0800 Subject: [PATCH 10/21] pim6d: Modify pim_rp_new for pimv6 Modify the api pim_rp_new to accomodate pimv6 changes. Signed-off-by: Mobashshera Rasool --- pimd/pim_bsm.h | 2 +- pimd/pim_rp.c | 28 ++++++++++------------------ pimd/pim_rp.h | 5 ++--- 3 files changed, 13 insertions(+), 22 deletions(-) diff --git a/pimd/pim_bsm.h b/pimd/pim_bsm.h index a536b50688..fceabef9e6 100644 --- a/pimd/pim_bsm.h +++ b/pimd/pim_bsm.h @@ -115,7 +115,7 @@ struct bsm_rpinfo { uint32_t elapse_time; /* upd at expiry of elected RP node */ uint16_t rp_prio; /* RP priority */ uint16_t rp_holdtime; /* RP holdtime - g2rp timer value */ - struct in_addr rp_address; /* RP Address */ + pim_addr rp_address; /* RP Address */ struct bsgrp_node *bsgrp_node; /* Back ptr to bsgrp_node */ struct thread *g2rp_timer; /* Run only for elected RP node */ }; diff --git a/pimd/pim_rp.c b/pimd/pim_rp.c index 6752b9fa01..88e824225b 100644 --- a/pimd/pim_rp.c +++ b/pimd/pim_rp.c @@ -412,7 +412,7 @@ void pim_upstream_update(struct pim_instance *pim, struct pim_upstream *up) } -int pim_rp_new(struct pim_instance *pim, struct in_addr rp_addr, struct prefix group, +int pim_rp_new(struct pim_instance *pim, pim_addr rp_addr, struct prefix group, const char *plist, enum rp_source rp_src_flag) { int result = 0; @@ -427,14 +427,12 @@ int pim_rp_new(struct pim_instance *pim, struct in_addr rp_addr, struct prefix g struct pim_upstream *up; bool upstream_updated = false; - if (rp_addr.s_addr == INADDR_ANY) + if (pim_addr_is_any(rp_addr)) return PIM_RP_BAD_ADDRESS; rp_info = XCALLOC(MTYPE_PIM_RP, sizeof(*rp_info)); - rp_info->rp.rpf_addr.family = AF_INET; - rp_info->rp.rpf_addr.prefixlen = IPV4_MAX_BITLEN; - rp_info->rp.rpf_addr.u.prefix4 = rp_addr; + pim_addr_to_prefix(&rp_info->rp.rpf_addr, rp_addr); prefix_copy(&rp_info->group, &group); rp_info->rp_src = rp_src_flag; @@ -461,8 +459,8 @@ int pim_rp_new(struct pim_instance *pim, struct in_addr rp_addr, struct prefix g */ for (ALL_LIST_ELEMENTS(pim->rp_list, node, nnode, tmp_rp_info)) { - if (rp_info->rp.rpf_addr.u.prefix4.s_addr - == tmp_rp_info->rp.rpf_addr.u.prefix4.s_addr) { + if (prefix_same(&rp_info->rp.rpf_addr, + &tmp_rp_info->rp.rpf_addr)) { if (tmp_rp_info->plist) pim_rp_del_config(pim, rp_addr, NULL, tmp_rp_info->plist); @@ -497,10 +495,9 @@ int pim_rp_new(struct pim_instance *pim, struct in_addr rp_addr, struct prefix g */ for (ALL_LIST_ELEMENTS(pim->rp_list, node, nnode, tmp_rp_info)) { - if (tmp_rp_info->plist - && rp_info->rp.rpf_addr.u.prefix4.s_addr - == tmp_rp_info->rp.rpf_addr.u.prefix4 - .s_addr) { + if (tmp_rp_info->plist && + prefix_same(&rp_info->rp.rpf_addr, + &tmp_rp_info->rp.rpf_addr)) { pim_rp_del_config(pim, rp_addr, NULL, tmp_rp_info->plist); } @@ -516,10 +513,7 @@ int pim_rp_new(struct pim_instance *pim, struct in_addr rp_addr, struct prefix g XFREE(MTYPE_PIM_RP, rp_info); /* Register addr with Zebra NHT */ - nht_p.family = AF_INET; - nht_p.prefixlen = IPV4_MAX_BITLEN; - nht_p.u.prefix4 = - rp_all->rp.rpf_addr.u.prefix4; // RP address + nht_p = rp_all->rp.rpf_addr; if (PIM_DEBUG_PIM_NHT_RP) zlog_debug( "%s: NHT Register rp_all addr %pFX grp %pFX ", @@ -640,9 +634,7 @@ int pim_rp_new(struct pim_instance *pim, struct in_addr rp_addr, struct prefix g pim_rp_refresh_group_to_rp_mapping(pim); /* Register addr with Zebra NHT */ - nht_p.family = AF_INET; - nht_p.prefixlen = IPV4_MAX_BITLEN; - nht_p.u.prefix4 = rp_info->rp.rpf_addr.u.prefix4; + nht_p = rp_info->rp.rpf_addr; if (PIM_DEBUG_PIM_NHT_RP) zlog_debug("%s: NHT Register RP addr %pFX grp %pFX with Zebra ", __func__, &nht_p, &rp_info->group); diff --git a/pimd/pim_rp.h b/pimd/pim_rp.h index 98a3ae3780..a63295209f 100644 --- a/pimd/pim_rp.h +++ b/pimd/pim_rp.h @@ -47,9 +47,8 @@ void pim_rp_free(struct pim_instance *pim); void pim_rp_list_hash_clean(void *data); -int pim_rp_new(struct pim_instance *pim, struct in_addr rp_addr, - struct prefix group, const char *plist, - enum rp_source rp_src_flag); +int pim_rp_new(struct pim_instance *pim, pim_addr rp_addr, struct prefix group, + const char *plist, enum rp_source rp_src_flag); void pim_rp_del_config(struct pim_instance *pim, pim_addr rp_addr, const char *group, const char *plist); int pim_rp_del(struct pim_instance *pim, struct in_addr rp_addr, From 119fcc3defb2337c80917280641f602a9499a9ee Mon Sep 17 00:00:00 2001 From: Mobashshera Rasool Date: Thu, 3 Feb 2022 01:38:54 -0800 Subject: [PATCH 11/21] pim6d: Modify pim_*_cmd_worker api passing pim_addr parameter Pass pim_addr as parameter for rp address to accomodate ipv6. Modifying pim_rp_cmd_worker and pim_no_rp_cmd_worker function parameters from in_addr to pim_addr. Changes in the caller functions are done as well to make it work for IPv6. Signed-off-by: Mobashshera Rasool --- pimd/pim_nb_config.c | 69 ++++++++++++++++++++------------------------ 1 file changed, 32 insertions(+), 37 deletions(-) diff --git a/pimd/pim_nb_config.c b/pimd/pim_nb_config.c index d1611b6fe5..c10f7daf5b 100644 --- a/pimd/pim_nb_config.c +++ b/pimd/pim_nb_config.c @@ -256,10 +256,9 @@ static int pim_ssm_cmd_worker(struct pim_instance *pim, const char *plist, return ret; } -static int pim_rp_cmd_worker(struct pim_instance *pim, - struct in_addr rp_addr, - struct prefix group, const char *plist, - char *errmsg, size_t errmsg_len) +static int pim_rp_cmd_worker(struct pim_instance *pim, pim_addr rp_addr, + struct prefix group, const char *plist, + char *errmsg, size_t errmsg_len) { char rp_str[INET_ADDRSTRLEN]; int result; @@ -295,9 +294,8 @@ static int pim_rp_cmd_worker(struct pim_instance *pim, return NB_OK; } -static int pim_no_rp_cmd_worker(struct pim_instance *pim, - struct in_addr rp_addr, struct prefix group, - const char *plist, +static int pim_no_rp_cmd_worker(struct pim_instance *pim, pim_addr rp_addr, + struct prefix group, const char *plist, char *errmsg, size_t errmsg_len) { char rp_str[INET_ADDRSTRLEN]; @@ -2340,7 +2338,7 @@ int routing_control_plane_protocols_control_plane_protocol_pim_address_family_rp struct vrf *vrf; struct pim_instance *pim; struct prefix group; - struct ipaddr rp_addr; + pim_addr rp_addr; const char *plist; int result = 0; @@ -2352,15 +2350,15 @@ int routing_control_plane_protocols_control_plane_protocol_pim_address_family_rp case NB_EV_APPLY: vrf = nb_running_get_entry(args->dnode, NULL, true); pim = vrf->info; - yang_dnode_get_ip(&rp_addr, args->dnode, "./rp-address"); + yang_dnode_get_pimaddr(&rp_addr, args->dnode, "./rp-address"); if (yang_dnode_get(args->dnode, "./group-list")) { - yang_dnode_get_ipv4p(&group, args->dnode, - "./group-list"); - apply_mask_ipv4((struct prefix_ipv4 *)&group); - result = pim_no_rp_cmd_worker(pim, rp_addr.ip._v4_addr, - group, NULL, args->errmsg, - args->errmsg_len); + yang_dnode_get_prefix(&group, args->dnode, + "./group-list"); + apply_mask(&group); + result = pim_no_rp_cmd_worker(pim, rp_addr, group, NULL, + args->errmsg, + args->errmsg_len); } else if (yang_dnode_get(args->dnode, "./prefix-list")) { @@ -2373,10 +2371,9 @@ int routing_control_plane_protocols_control_plane_protocol_pim_address_family_rp return NB_ERR_INCONSISTENCY; } - result = pim_no_rp_cmd_worker(pim, rp_addr.ip._v4_addr, - group, plist, - args->errmsg, - args->errmsg_len); + result = pim_no_rp_cmd_worker(pim, rp_addr, group, + plist, args->errmsg, + args->errmsg_len); } if (result) @@ -2396,7 +2393,7 @@ int routing_control_plane_protocols_control_plane_protocol_pim_address_family_rp struct vrf *vrf; struct pim_instance *pim; struct prefix group; - struct ipaddr rp_addr; + pim_addr rp_addr; switch (args->event) { case NB_EV_VALIDATE: @@ -2406,11 +2403,11 @@ int routing_control_plane_protocols_control_plane_protocol_pim_address_family_rp case NB_EV_APPLY: vrf = nb_running_get_entry(args->dnode, NULL, true); pim = vrf->info; - yang_dnode_get_ip(&rp_addr, args->dnode, "../rp-address"); + yang_dnode_get_pimaddr(&rp_addr, args->dnode, "../rp-address"); yang_dnode_get_prefix(&group, args->dnode, NULL); apply_mask(&group); - return pim_rp_cmd_worker(pim, rp_addr.ip._v4_addr, group, - NULL, args->errmsg, args->errmsg_len); + return pim_rp_cmd_worker(pim, rp_addr, group, NULL, + args->errmsg, args->errmsg_len); } return NB_OK; @@ -2422,7 +2419,7 @@ int routing_control_plane_protocols_control_plane_protocol_pim_address_family_rp struct vrf *vrf; struct pim_instance *pim; struct prefix group; - struct ipaddr rp_addr; + pim_addr rp_addr; switch (args->event) { case NB_EV_VALIDATE: @@ -2432,13 +2429,12 @@ int routing_control_plane_protocols_control_plane_protocol_pim_address_family_rp case NB_EV_APPLY: vrf = nb_running_get_entry(args->dnode, NULL, true); pim = vrf->info; - yang_dnode_get_ip(&rp_addr, args->dnode, "../rp-address"); + yang_dnode_get_pimaddr(&rp_addr, args->dnode, "../rp-address"); yang_dnode_get_prefix(&group, args->dnode, NULL); apply_mask(&group); - return pim_no_rp_cmd_worker(pim, rp_addr.ip._v4_addr, group, - NULL, args->errmsg, - args->errmsg_len); + return pim_no_rp_cmd_worker(pim, rp_addr, group, NULL, + args->errmsg, args->errmsg_len); } return NB_OK; @@ -2453,7 +2449,7 @@ int routing_control_plane_protocols_control_plane_protocol_pim_address_family_rp struct vrf *vrf; struct pim_instance *pim; struct prefix group; - struct ipaddr rp_addr; + pim_addr rp_addr; const char *plist; switch (args->event) { @@ -2465,14 +2461,14 @@ int routing_control_plane_protocols_control_plane_protocol_pim_address_family_rp vrf = nb_running_get_entry(args->dnode, NULL, true); pim = vrf->info; plist = yang_dnode_get_string(args->dnode, NULL); - yang_dnode_get_ip(&rp_addr, args->dnode, "../rp-address"); + yang_dnode_get_pimaddr(&rp_addr, args->dnode, "../rp-address"); if (!str2prefix("224.0.0.0/4", &group)) { flog_err(EC_LIB_DEVELOPMENT, "Unable to convert 224.0.0.0/4 to prefix"); return NB_ERR_INCONSISTENCY; } - return pim_rp_cmd_worker(pim, rp_addr.ip._v4_addr, group, - plist, args->errmsg, args->errmsg_len); + return pim_rp_cmd_worker(pim, rp_addr, group, plist, + args->errmsg, args->errmsg_len); } return NB_OK; @@ -2484,7 +2480,7 @@ int routing_control_plane_protocols_control_plane_protocol_pim_address_family_rp struct vrf *vrf; struct pim_instance *pim; struct prefix group; - struct ipaddr rp_addr; + pim_addr rp_addr; const char *plist; switch (args->event) { @@ -2495,16 +2491,15 @@ int routing_control_plane_protocols_control_plane_protocol_pim_address_family_rp case NB_EV_APPLY: vrf = nb_running_get_entry(args->dnode, NULL, true); pim = vrf->info; - yang_dnode_get_ip(&rp_addr, args->dnode, "../rp-address"); + yang_dnode_get_pimaddr(&rp_addr, args->dnode, "../rp-address"); plist = yang_dnode_get_string(args->dnode, NULL); if (!str2prefix("224.0.0.0/4", &group)) { flog_err(EC_LIB_DEVELOPMENT, "Unable to convert 224.0.0.0/4 to prefix"); return NB_ERR_INCONSISTENCY; } - return pim_no_rp_cmd_worker(pim, rp_addr.ip._v4_addr, group, - plist, args->errmsg, - args->errmsg_len); + return pim_no_rp_cmd_worker(pim, rp_addr, group, plist, + args->errmsg, args->errmsg_len); break; } From cafbb61955c8d422461bbf5f952d5a8dae5edcc3 Mon Sep 17 00:00:00 2001 From: Mobashshera Rasool Date: Wed, 16 Feb 2022 00:04:13 -0800 Subject: [PATCH 12/21] pim6d: Convert %s to %pPA for RP Addresses Signed-off-by: Mobashshera Rasool --- pimd/pim_nb_config.c | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/pimd/pim_nb_config.c b/pimd/pim_nb_config.c index c10f7daf5b..629490408d 100644 --- a/pimd/pim_nb_config.c +++ b/pimd/pim_nb_config.c @@ -260,16 +260,13 @@ static int pim_rp_cmd_worker(struct pim_instance *pim, pim_addr rp_addr, struct prefix group, const char *plist, char *errmsg, size_t errmsg_len) { - char rp_str[INET_ADDRSTRLEN]; int result; - inet_ntop(AF_INET, &rp_addr, rp_str, sizeof(rp_str)); - result = pim_rp_new(pim, rp_addr, group, plist, RP_SRC_STATIC); if (result == PIM_RP_NO_PATH) { - snprintf(errmsg, errmsg_len, - "No Path to RP address specified: %s", rp_str); + snprintfrr(errmsg, errmsg_len, + "No Path to RP address specified: %pPA", &rp_addr); return NB_ERR_INCONSISTENCY; } @@ -298,11 +295,9 @@ static int pim_no_rp_cmd_worker(struct pim_instance *pim, pim_addr rp_addr, struct prefix group, const char *plist, char *errmsg, size_t errmsg_len) { - char rp_str[INET_ADDRSTRLEN]; char group_str[PREFIX2STR_BUFFER]; int result; - inet_ntop(AF_INET, &rp_addr, rp_str, sizeof(rp_str)); prefix2str(&group, group_str, sizeof(group_str)); result = pim_rp_del(pim, rp_addr, group, plist, RP_SRC_STATIC); @@ -314,8 +309,8 @@ static int pim_no_rp_cmd_worker(struct pim_instance *pim, pim_addr rp_addr, } if (result == PIM_RP_BAD_ADDRESS) { - snprintf(errmsg, errmsg_len, - "Bad RP address specified: %s", rp_str); + snprintfrr(errmsg, errmsg_len, "Bad RP address specified: %pPA", + &rp_addr); return NB_ERR_INCONSISTENCY; } From 49b7b2c4a83bd2d7f2a122d46df9d717943e0e05 Mon Sep 17 00:00:00 2001 From: Mobashshera Rasool Date: Thu, 3 Feb 2022 03:31:54 -0800 Subject: [PATCH 13/21] pim6d: Modify pim_rp_change api for pimv6 Signed-off-by: Mobashshera Rasool --- pimd/pim_bsm.c | 3 +-- pimd/pim_rp.c | 23 +++++++++++++---------- pimd/pim_rp.h | 2 +- 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/pimd/pim_bsm.c b/pimd/pim_bsm.c index c45823cb87..61e51c0170 100644 --- a/pimd/pim_bsm.c +++ b/pimd/pim_bsm.c @@ -324,10 +324,9 @@ static void pim_on_g2rp_timer(struct thread *t) if (rp_info->rp_src != RP_SRC_STATIC) { /* If new rp available, change it else delete the existing */ if (bsrp) { - bsrp_addr = bsrp->rp_address; pim_g2rp_timer_start( bsrp, (bsrp->rp_holdtime - bsrp->elapse_time)); - pim_rp_change(pim, bsrp_addr, bsgrp_node->group, + pim_rp_change(pim, bsrp->rp_address, bsgrp_node->group, RP_SRC_BSR); } else { pim_rp_del(pim, bsrp_addr, bsgrp_node->group, NULL, diff --git a/pimd/pim_rp.c b/pimd/pim_rp.c index 88e824225b..7368723e8a 100644 --- a/pimd/pim_rp.c +++ b/pimd/pim_rp.c @@ -592,8 +592,7 @@ int pim_rp_new(struct pim_instance *pim, pim_addr rp_addr, struct prefix group, } result = pim_rp_change( - pim, - rp_info->rp.rpf_addr.u.prefix4, + pim, rp_addr, tmp_rp_info->group, rp_src_flag); XFREE(MTYPE_PIM_RP, rp_info); @@ -839,7 +838,7 @@ int pim_rp_del(struct pim_instance *pim, struct in_addr rp_addr, return PIM_SUCCESS; } -int pim_rp_change(struct pim_instance *pim, struct in_addr new_rp_addr, +int pim_rp_change(struct pim_instance *pim, pim_addr new_rp_addr, struct prefix group, enum rp_source rp_src_flag) { struct prefix nht_p; @@ -848,6 +847,7 @@ int pim_rp_change(struct pim_instance *pim, struct in_addr new_rp_addr, struct rp_info *rp_info = NULL; struct pim_upstream *up; bool upstream_updated = false; + pim_addr old_rp_addr; rn = route_node_lookup(pim->rp_table, &group); if (!rn) { @@ -863,7 +863,8 @@ int pim_rp_change(struct pim_instance *pim, struct in_addr new_rp_addr, return result; } - if (rp_info->rp.rpf_addr.u.prefix4.s_addr == new_rp_addr.s_addr) { + old_rp_addr = pim_addr_from_prefix(&rp_info->rp.rpf_addr); + if (!pim_addr_cmp(new_rp_addr, old_rp_addr)) { if (rp_info->rp_src != rp_src_flag) { rp_info->rp_src = rp_src_flag; route_unlock_node(rn); @@ -871,12 +872,13 @@ int pim_rp_change(struct pim_instance *pim, struct in_addr new_rp_addr, } } - nht_p.family = AF_INET; - nht_p.prefixlen = IPV4_MAX_BITLEN; + nht_p.family = PIM_AF; + nht_p.prefixlen = PIM_MAX_BITLEN; /* Deregister old RP addr with Zebra NHT */ - if (rp_info->rp.rpf_addr.u.prefix4.s_addr != INADDR_ANY) { - nht_p.u.prefix4 = rp_info->rp.rpf_addr.u.prefix4; + + if (!pim_addr_is_any(old_rp_addr)) { + nht_p = rp_info->rp.rpf_addr; if (PIM_DEBUG_PIM_NHT_RP) zlog_debug("%s: Deregister RP addr %pFX with Zebra ", __func__, &nht_p); @@ -886,7 +888,8 @@ int pim_rp_change(struct pim_instance *pim, struct in_addr new_rp_addr, pim_rp_nexthop_del(rp_info); listnode_delete(pim->rp_list, rp_info); /* Update the new RP address*/ - rp_info->rp.rpf_addr.u.prefix4 = new_rp_addr; + + pim_addr_to_prefix(&rp_info->rp.rpf_addr, new_rp_addr); rp_info->rp_src = rp_src_flag; rp_info->i_am_rp = 0; @@ -911,7 +914,7 @@ int pim_rp_change(struct pim_instance *pim, struct in_addr new_rp_addr, pim_zebra_update_all_interfaces(pim); /* Register new RP addr with Zebra NHT */ - nht_p.u.prefix4 = rp_info->rp.rpf_addr.u.prefix4; + nht_p = rp_info->rp.rpf_addr; if (PIM_DEBUG_PIM_NHT_RP) zlog_debug("%s: NHT Register RP addr %pFX grp %pFX with Zebra ", __func__, &nht_p, &rp_info->group); diff --git a/pimd/pim_rp.h b/pimd/pim_rp.h index a63295209f..bc12273a2a 100644 --- a/pimd/pim_rp.h +++ b/pimd/pim_rp.h @@ -54,7 +54,7 @@ void pim_rp_del_config(struct pim_instance *pim, pim_addr rp_addr, int pim_rp_del(struct pim_instance *pim, struct in_addr rp_addr, struct prefix group, const char *plist, enum rp_source rp_src_flag); -int pim_rp_change(struct pim_instance *pim, struct in_addr new_rp_addr, +int pim_rp_change(struct pim_instance *pim, pim_addr new_rp_addr, struct prefix group, enum rp_source rp_src_flag); void pim_rp_prefix_list_update(struct pim_instance *pim, struct prefix_list *plist); From c6ced47492ab55d04bc237727fd90fbffa3ed438 Mon Sep 17 00:00:00 2001 From: Mobashshera Rasool Date: Thu, 17 Feb 2022 03:56:20 -0800 Subject: [PATCH 14/21] pim6d: Add pim_get_all_mcast_group api Added this api to fill all multicast group address based on IP version. For PIMv4 its 224.0.0.0/4, for PIMv6 its FF00::0/8. Changed the code where its being used currently. Signed-off-by: Mobashshera Rasool --- pimd/pim_bsm.c | 5 +++-- pimd/pim_nb_config.c | 7 ++++--- pimd/pim_rp.c | 9 +++++---- pimd/pim_util.c | 14 ++++++++++++++ pimd/pim_util.h | 1 + 5 files changed, 27 insertions(+), 9 deletions(-) diff --git a/pimd/pim_bsm.c b/pimd/pim_bsm.c index 61e51c0170..21cbe09c4e 100644 --- a/pimd/pim_bsm.c +++ b/pimd/pim_bsm.c @@ -36,6 +36,7 @@ #include "pim_bsm.h" #include "pim_time.h" #include "pim_zebra.h" +#include "pim_util.h" /* Functions forward declaration */ static void pim_bs_timer_start(struct bsm_scope *scope, int bs_timeout); @@ -416,7 +417,7 @@ static void pim_instate_pend_list(struct bsgrp_node *bsgrp_node) pend = bsm_rpinfos_first(bsgrp_node->partial_bsrp_list); - if (!str2prefix("224.0.0.0/4", &group_all)) + if (!pim_get_all_mcast_group(&group_all)) return; rp_all = pim_rp_find_match_group(pim, &group_all); @@ -627,7 +628,7 @@ void pim_bsm_clear(struct pim_instance *pim) pim_delete_tracked_nexthop(pim, &nht_p, NULL, rp_info); - if (!str2prefix("224.0.0.0/4", &g_all)) + if (!pim_get_all_mcast_group(&g_all)) return; rp_all = pim_rp_find_match_group(pim, &g_all); diff --git a/pimd/pim_nb_config.c b/pimd/pim_nb_config.c index 629490408d..21f57e2d11 100644 --- a/pimd/pim_nb_config.c +++ b/pimd/pim_nb_config.c @@ -34,6 +34,7 @@ #include "pim_util.h" #include "log.h" #include "lib_errors.h" +#include "pim_util.h" #if PIM_IPV == 6 #define pim6_msdp_err(funcname, argtype) \ @@ -2359,7 +2360,7 @@ int routing_control_plane_protocols_control_plane_protocol_pim_address_family_rp else if (yang_dnode_get(args->dnode, "./prefix-list")) { plist = yang_dnode_get_string(args->dnode, "./prefix-list"); - if (!str2prefix("224.0.0.0/4", &group)) { + if (!pim_get_all_mcast_group(&group)) { flog_err( EC_LIB_DEVELOPMENT, "Unable to convert 224.0.0.0/4 to prefix"); @@ -2457,7 +2458,7 @@ int routing_control_plane_protocols_control_plane_protocol_pim_address_family_rp pim = vrf->info; plist = yang_dnode_get_string(args->dnode, NULL); yang_dnode_get_pimaddr(&rp_addr, args->dnode, "../rp-address"); - if (!str2prefix("224.0.0.0/4", &group)) { + if (!pim_get_all_mcast_group(&group)) { flog_err(EC_LIB_DEVELOPMENT, "Unable to convert 224.0.0.0/4 to prefix"); return NB_ERR_INCONSISTENCY; @@ -2488,7 +2489,7 @@ int routing_control_plane_protocols_control_plane_protocol_pim_address_family_rp pim = vrf->info; yang_dnode_get_pimaddr(&rp_addr, args->dnode, "../rp-address"); plist = yang_dnode_get_string(args->dnode, NULL); - if (!str2prefix("224.0.0.0/4", &group)) { + if (!pim_get_all_mcast_group(&group)) { flog_err(EC_LIB_DEVELOPMENT, "Unable to convert 224.0.0.0/4 to prefix"); return NB_ERR_INCONSISTENCY; diff --git a/pimd/pim_rp.c b/pimd/pim_rp.c index 7368723e8a..251e82fc7b 100644 --- a/pimd/pim_rp.c +++ b/pimd/pim_rp.c @@ -48,6 +48,7 @@ #include "pim_oil.h" #include "pim_zebra.h" #include "pim_bsm.h" +#include "pim_util.h" /* Cleanup pim->rpf_hash each node data */ void pim_rp_list_hash_clean(void *data) @@ -113,7 +114,7 @@ void pim_rp_init(struct pim_instance *pim) rp_info = XCALLOC(MTYPE_PIM_RP, sizeof(*rp_info)); - if (!str2prefix("224.0.0.0/4", &rp_info->group)) { + if (!pim_get_all_mcast_group(&rp_info->group)) { flog_err(EC_LIB_DEVELOPMENT, "Unable to convert 224.0.0.0/4 to prefix"); list_delete(&pim->rp_list); @@ -476,7 +477,7 @@ int pim_rp_new(struct pim_instance *pim, pim_addr rp_addr, struct prefix group, rp_info->plist = XSTRDUP(MTYPE_PIM_FILTER_NAME, plist); } else { - if (!str2prefix("224.0.0.0/4", &group_all)) { + if (!pim_get_all_mcast_group(&group_all)) { XFREE(MTYPE_PIM_RP, rp_info); return PIM_GROUP_BAD_ADDRESS; } @@ -652,7 +653,7 @@ void pim_rp_del_config(struct pim_instance *pim, pim_addr rp_addr, int result; if (group_range == NULL) - result = str2prefix("224.0.0.0/4", &group); + result = pim_get_all_mcast_group(&group); else result = str2prefix(group_range, &group); @@ -747,7 +748,7 @@ int pim_rp_del(struct pim_instance *pim, struct in_addr rp_addr, &nht_p); pim_delete_tracked_nexthop(pim, &nht_p, NULL, rp_info); - if (!str2prefix("224.0.0.0/4", &g_all)) + if (!pim_get_all_mcast_group(&g_all)) return PIM_RP_BAD_ADDRESS; rp_all = pim_rp_find_match_group(pim, &g_all); diff --git a/pimd/pim_util.c b/pimd/pim_util.c index 8232d7205b..4b67dbf1b1 100644 --- a/pimd/pim_util.c +++ b/pimd/pim_util.c @@ -152,3 +152,17 @@ bool pim_is_group_filtered(struct pim_interface *pim_ifp, pim_addr *grp) pl = prefix_list_lookup(PIM_AFI, pim_ifp->boundary_oil_plist); return pl ? prefix_list_apply(pl, &grp_pfx) == PREFIX_DENY : false; } + + +/* This function returns all multicast group */ +int pim_get_all_mcast_group(struct prefix *prefix) +{ +#if PIM_IPV == 4 + if (!str2prefix("224.0.0.0/4", prefix)) + return 0; +#else + if (!str2prefix("FF00::0/8", prefix)) + return 0; +#endif + return 1; +} diff --git a/pimd/pim_util.h b/pimd/pim_util.h index b9c227996e..a4362bef90 100644 --- a/pimd/pim_util.h +++ b/pimd/pim_util.h @@ -36,4 +36,5 @@ void pim_pkt_dump(const char *label, const uint8_t *buf, int size); int pim_is_group_224_0_0_0_24(struct in_addr group_addr); int pim_is_group_224_4(struct in_addr group_addr); bool pim_is_group_filtered(struct pim_interface *pim_ifp, pim_addr *grp); +int pim_get_all_mcast_group(struct prefix *prefix); #endif /* PIM_UTIL_H */ From b1e132ac61f3404dfc6db4f5ee395aa859a571f7 Mon Sep 17 00:00:00 2001 From: Mobashshera Rasool Date: Thu, 17 Feb 2022 10:54:47 -0800 Subject: [PATCH 15/21] pim6d: Modify pim_rp_set_upstream_addr for PIMv4/PIMv6 Modify pim_rp_set_upstream_addr for supporting PIMv4 and PIMv6. Removed the stub api for PIMv6. Signed-off-by: Mobashshera Rasool --- pimd/pim_rp.c | 48 ++++++++++++++++++++++-------------------------- 1 file changed, 22 insertions(+), 26 deletions(-) diff --git a/pimd/pim_rp.c b/pimd/pim_rp.c index 251e82fc7b..be2f7ccdd8 100644 --- a/pimd/pim_rp.c +++ b/pimd/pim_rp.c @@ -1108,6 +1108,20 @@ struct pim_rpf *pim_rp_g(struct pim_instance *pim, pim_addr group) return NULL; } +#else +CPP_NOTICE("functions stubbed out for IPv6"); + +int pim_rp_i_am_rp(struct pim_instance *pim, pim_addr group) +{ + return 0; +} + +struct pim_rpf *pim_rp_g(struct pim_instance *pim, pim_addr group) +{ + return NULL; +} +#endif + /* * Set the upstream IP address we want to talk to based upon * the rp configured and the source address @@ -1123,45 +1137,27 @@ int pim_rp_set_upstream_addr(struct pim_instance *pim, pim_addr *up, struct prefix g; memset(&g, 0, sizeof(g)); - g.family = AF_INET; - g.prefixlen = IPV4_MAX_BITLEN; - g.u.prefix4 = group; + + pim_addr_to_prefix(&g, group); rp_info = pim_rp_find_match_group(pim, &g); if (!rp_info || ((pim_rpf_addr_is_inaddr_any(&rp_info->rp)) && - (source.s_addr == INADDR_ANY))) { + (pim_addr_is_any(source)))) { if (PIM_DEBUG_PIM_NHT_RP) zlog_debug("%s: Received a (*,G) with no RP configured", __func__); - up->s_addr = INADDR_ANY; + *up = PIMADDR_ANY; return 0; } - *up = (source.s_addr == INADDR_ANY) ? rp_info->rp.rpf_addr.u.prefix4 - : source; + if (pim_addr_is_any(source)) + *up = pim_addr_from_prefix(&rp_info->rp.rpf_addr); + else + *up = source; return 1; } -#else -CPP_NOTICE("functions stubbed out for IPv6"); - -int pim_rp_i_am_rp(struct pim_instance *pim, pim_addr group) -{ - return 0; -} - -struct pim_rpf *pim_rp_g(struct pim_instance *pim, pim_addr group) -{ - return NULL; -} - -int pim_rp_set_upstream_addr(struct pim_instance *pim, pim_addr *up, - pim_addr source, pim_addr group) -{ - return 0; -} -#endif int pim_rp_config_write(struct pim_instance *pim, struct vty *vty, const char *spaces) From 131ded0891132bd0705809c96bfed6added818ef Mon Sep 17 00:00:00 2001 From: Mobashshera Rasool Date: Mon, 21 Feb 2022 03:21:48 -0800 Subject: [PATCH 16/21] pim6d: Modify pim_rp_i_am_rp for PIMv4/PIMv6 Remove pim_rp_i_am_rp from stub for PIMv6. Modify pim_rp_i_am_rp for both the daemons. Signed-off-by: Mobashshera Rasool --- pimd/pim_rp.c | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/pimd/pim_rp.c b/pimd/pim_rp.c index be2f7ccdd8..e8c5c4ddb3 100644 --- a/pimd/pim_rp.c +++ b/pimd/pim_rp.c @@ -1045,7 +1045,6 @@ void pim_i_am_rp_re_evaluate(struct pim_instance *pim) } } -#if PIM_IPV == 4 /* * I_am_RP(G) is true if the group-to-RP mapping indicates that * this router is the RP for the group. @@ -1058,10 +1057,7 @@ int pim_rp_i_am_rp(struct pim_instance *pim, pim_addr group) struct rp_info *rp_info; memset(&g, 0, sizeof(g)); - g.family = AF_INET; - g.prefixlen = IPV4_MAX_BITLEN; - g.u.prefix4 = group; - + pim_addr_to_prefix(&g, group); rp_info = pim_rp_find_match_group(pim, &g); if (rp_info) @@ -1069,6 +1065,7 @@ int pim_rp_i_am_rp(struct pim_instance *pim, pim_addr group) return 0; } +#if PIM_IPV == 4 /* * RP(G) * @@ -1111,11 +1108,6 @@ struct pim_rpf *pim_rp_g(struct pim_instance *pim, pim_addr group) #else CPP_NOTICE("functions stubbed out for IPv6"); -int pim_rp_i_am_rp(struct pim_instance *pim, pim_addr group) -{ - return 0; -} - struct pim_rpf *pim_rp_g(struct pim_instance *pim, pim_addr group) { return NULL; From 8eb5ad6c4aa61defb16fdd841c7807e8d7a9e9d5 Mon Sep 17 00:00:00 2001 From: Mobashshera Rasool Date: Mon, 21 Feb 2022 03:27:35 -0800 Subject: [PATCH 17/21] pim6d: Modify pim_rp_g for PIMv4/PIMv6 Modify pim_rp_g to support PIMv6. Remove it from stub. Signed-off-by: Mobashshera Rasool --- pimd/pim_rp.c | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/pimd/pim_rp.c b/pimd/pim_rp.c index e8c5c4ddb3..b3ba40f3fe 100644 --- a/pimd/pim_rp.c +++ b/pimd/pim_rp.c @@ -1065,7 +1065,6 @@ int pim_rp_i_am_rp(struct pim_instance *pim, pim_addr group) return 0; } -#if PIM_IPV == 4 /* * RP(G) * @@ -1077,9 +1076,7 @@ struct pim_rpf *pim_rp_g(struct pim_instance *pim, pim_addr group) struct rp_info *rp_info; memset(&g, 0, sizeof(g)); - g.family = AF_INET; - g.prefixlen = IPV4_MAX_BITLEN; - g.u.prefix4 = group; + pim_addr_to_prefix(&g, group); rp_info = pim_rp_find_match_group(pim, &g); @@ -1087,9 +1084,7 @@ struct pim_rpf *pim_rp_g(struct pim_instance *pim, pim_addr group) struct prefix nht_p; /* Register addr with Zebra NHT */ - nht_p.family = AF_INET; - nht_p.prefixlen = IPV4_MAX_BITLEN; - nht_p.u.prefix4 = rp_info->rp.rpf_addr.u.prefix4; + nht_p = rp_info->rp.rpf_addr; if (PIM_DEBUG_PIM_NHT_RP) zlog_debug( "%s: NHT Register RP addr %pFX grp %pFX with Zebra", @@ -1105,15 +1100,6 @@ struct pim_rpf *pim_rp_g(struct pim_instance *pim, pim_addr group) return NULL; } -#else -CPP_NOTICE("functions stubbed out for IPv6"); - -struct pim_rpf *pim_rp_g(struct pim_instance *pim, pim_addr group) -{ - return NULL; -} -#endif - /* * Set the upstream IP address we want to talk to based upon * the rp configured and the source address From 1db07606fff031e22275fe121a6289bf9be50a94 Mon Sep 17 00:00:00 2001 From: Mobashshera Rasool Date: Mon, 21 Feb 2022 05:23:15 -0800 Subject: [PATCH 18/21] pim6d: Modify pim_rp_find_prefix_list for PIMv6 Signed-off-by: Mobashshera Rasool --- pimd/pim_rp.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/pimd/pim_rp.c b/pimd/pim_rp.c index b3ba40f3fe..43021ef888 100644 --- a/pimd/pim_rp.c +++ b/pimd/pim_rp.c @@ -149,15 +149,17 @@ void pim_rp_free(struct pim_instance *pim) * Given an RP's prefix-list, return the RP's rp_info for that prefix-list */ static struct rp_info *pim_rp_find_prefix_list(struct pim_instance *pim, - struct in_addr rp, - const char *plist) + pim_addr rp, const char *plist) { struct listnode *node; struct rp_info *rp_info; + struct prefix rp_prefix; + + pim_addr_to_prefix(&rp_prefix, rp); for (ALL_LIST_ELEMENTS_RO(pim->rp_list, node, rp_info)) { - if (rp.s_addr == rp_info->rp.rpf_addr.u.prefix4.s_addr - && rp_info->plist && strcmp(rp_info->plist, plist) == 0) { + if (prefix_same(&rp_prefix, &rp_info->rp.rpf_addr) && + rp_info->plist && strcmp(rp_info->plist, plist) == 0) { return rp_info; } } @@ -441,8 +443,7 @@ int pim_rp_new(struct pim_instance *pim, pim_addr rp_addr, struct prefix group, /* * Return if the prefix-list is already configured for this RP */ - if (pim_rp_find_prefix_list(pim, rp_info->rp.rpf_addr.u.prefix4, - plist)) { + if (pim_rp_find_prefix_list(pim, rp_addr, plist)) { XFREE(MTYPE_PIM_RP, rp_info); return PIM_SUCCESS; } From 9dca52b924bc4a6ec302db30d35ef9d0393ebca9 Mon Sep 17 00:00:00 2001 From: Mobashshera Rasool Date: Mon, 21 Feb 2022 05:44:04 -0800 Subject: [PATCH 19/21] pim6d: Modify pim_rp_del for PIMv4/PIMv6 Signed-off-by: Mobashshera Rasool --- pimd/pim_bsm.c | 2 +- pimd/pim_rp.c | 33 +++++++++------------------------ pimd/pim_rp.h | 5 ++--- 3 files changed, 12 insertions(+), 28 deletions(-) diff --git a/pimd/pim_bsm.c b/pimd/pim_bsm.c index 21cbe09c4e..d2e299a007 100644 --- a/pimd/pim_bsm.c +++ b/pimd/pim_bsm.c @@ -285,7 +285,7 @@ static void pim_on_g2rp_timer(struct thread *t) struct rp_info *rp_info; struct route_node *rn; uint16_t elapse; - struct in_addr bsrp_addr; + pim_addr bsrp_addr; bsrp = THREAD_ARG(t); THREAD_OFF(bsrp->g2rp_timer); diff --git a/pimd/pim_rp.c b/pimd/pim_rp.c index 43021ef888..379ad5c40d 100644 --- a/pimd/pim_rp.c +++ b/pimd/pim_rp.c @@ -669,9 +669,8 @@ void pim_rp_del_config(struct pim_instance *pim, pim_addr rp_addr, pim_rp_del(pim, rp_addr, group, plist, RP_SRC_STATIC); } -int pim_rp_del(struct pim_instance *pim, struct in_addr rp_addr, - struct prefix group, const char *plist, - enum rp_source rp_src_flag) +int pim_rp_del(struct pim_instance *pim, pim_addr rp_addr, struct prefix group, + const char *plist, enum rp_source rp_src_flag) { struct prefix g_all; struct rp_info *rp_info; @@ -683,12 +682,8 @@ int pim_rp_del(struct pim_instance *pim, struct in_addr rp_addr, struct pim_upstream *up; struct bsgrp_node *bsgrp = NULL; struct bsm_rpinfo *bsrp = NULL; - char rp_str[INET_ADDRSTRLEN]; bool upstream_updated = false; - if (!inet_ntop(AF_INET, &rp_addr, rp_str, sizeof(rp_str))) - snprintf(rp_str, sizeof(rp_str), ""); - if (plist) rp_info = pim_rp_find_prefix_list(pim, rp_addr, plist); else @@ -703,8 +698,8 @@ int pim_rp_del(struct pim_instance *pim, struct in_addr rp_addr, } if (PIM_DEBUG_PIM_TRACE) - zlog_debug("%s: Delete RP %s for the group %pFX", __func__, - rp_str, &group); + zlog_debug("%s: Delete RP %pPA for the group %pFX", __func__, + &rp_addr, &group); /* While static RP is getting deleted, we need to check if dynamic RP * present for the same group in BSM RP table, then install the dynamic @@ -716,19 +711,11 @@ int pim_rp_del(struct pim_instance *pim, struct in_addr rp_addr, if (bsgrp) { bsrp = bsm_rpinfos_first(bsgrp->bsrp_list); if (bsrp) { - if (PIM_DEBUG_PIM_TRACE) { - char bsrp_str[INET_ADDRSTRLEN]; - - if (!inet_ntop(AF_INET, bsrp, bsrp_str, - sizeof(bsrp_str))) - snprintf(bsrp_str, - sizeof(bsrp_str), - ""); - + if (PIM_DEBUG_PIM_TRACE) zlog_debug( - "%s: BSM RP %s found for the group %pFX", - __func__, bsrp_str, &group); - } + "%s: BSM RP %pPA found for the group %pFX", + __func__, &bsrp->rp_address, + &group); return pim_rp_change(pim, bsrp->rp_address, group, RP_SRC_BSR); } @@ -741,9 +728,7 @@ int pim_rp_del(struct pim_instance *pim, struct in_addr rp_addr, } /* Deregister addr with Zebra NHT */ - nht_p.family = AF_INET; - nht_p.prefixlen = IPV4_MAX_BITLEN; - nht_p.u.prefix4 = rp_info->rp.rpf_addr.u.prefix4; + nht_p = rp_info->rp.rpf_addr; if (PIM_DEBUG_PIM_NHT_RP) zlog_debug("%s: Deregister RP addr %pFX with Zebra ", __func__, &nht_p); diff --git a/pimd/pim_rp.h b/pimd/pim_rp.h index bc12273a2a..29834f8e5e 100644 --- a/pimd/pim_rp.h +++ b/pimd/pim_rp.h @@ -51,9 +51,8 @@ int pim_rp_new(struct pim_instance *pim, pim_addr rp_addr, struct prefix group, const char *plist, enum rp_source rp_src_flag); void pim_rp_del_config(struct pim_instance *pim, pim_addr rp_addr, const char *group, const char *plist); -int pim_rp_del(struct pim_instance *pim, struct in_addr rp_addr, - struct prefix group, const char *plist, - enum rp_source rp_src_flag); +int pim_rp_del(struct pim_instance *pim, pim_addr rp_addr, struct prefix group, + const char *plist, enum rp_source rp_src_flag); int pim_rp_change(struct pim_instance *pim, pim_addr new_rp_addr, struct prefix group, enum rp_source rp_src_flag); void pim_rp_prefix_list_update(struct pim_instance *pim, From fd5540ead6074a31a91a26441922806488d45280 Mon Sep 17 00:00:00 2001 From: Mobashshera Rasool Date: Mon, 21 Feb 2022 05:47:08 -0800 Subject: [PATCH 20/21] pim6d: Modify pim_rp_find_exact and pim_rp_find_match_group Modify the apis to accomodate IPv4 and IPv6 addreses for RP. Signed-off-by: Mobashshera Rasool --- pimd/pim_rp.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/pimd/pim_rp.c b/pimd/pim_rp.c index 379ad5c40d..25eabe6743 100644 --- a/pimd/pim_rp.c +++ b/pimd/pim_rp.c @@ -188,16 +188,17 @@ static int pim_rp_prefix_list_used(struct pim_instance *pim, const char *plist) * Given an RP's address, return the RP's rp_info that is an exact match for * 'group' */ -static struct rp_info *pim_rp_find_exact(struct pim_instance *pim, - struct in_addr rp, +static struct rp_info *pim_rp_find_exact(struct pim_instance *pim, pim_addr rp, const struct prefix *group) { struct listnode *node; struct rp_info *rp_info; + struct prefix rp_prefix; + pim_addr_to_prefix(&rp_prefix, rp); for (ALL_LIST_ELEMENTS_RO(pim->rp_list, node, rp_info)) { - if (rp.s_addr == rp_info->rp.rpf_addr.u.prefix4.s_addr - && prefix_same(&rp_info->group, group)) + if (prefix_same(&rp_prefix, &rp_info->rp.rpf_addr) && + prefix_same(&rp_info->group, group)) return rp_info; } @@ -241,7 +242,7 @@ struct rp_info *pim_rp_find_match_group(struct pim_instance *pim, bp = NULL; for (ALL_LIST_ELEMENTS_RO(pim->rp_list, node, rp_info)) { if (rp_info->plist) { - plist = prefix_list_lookup(AFI_IP, rp_info->plist); + plist = prefix_list_lookup(PIM_AFI, rp_info->plist); if (prefix_list_apply_ext(plist, &entry, group, true) == PREFIX_DENY || !entry) @@ -557,8 +558,7 @@ int pim_rp_new(struct pim_instance *pim, pim_addr rp_addr, struct prefix group, /* * Return if the group is already configured for this RP */ - tmp_rp_info = pim_rp_find_exact( - pim, rp_info->rp.rpf_addr.u.prefix4, &rp_info->group); + tmp_rp_info = pim_rp_find_exact(pim, rp_addr, &rp_info->group); if (tmp_rp_info) { if ((tmp_rp_info->rp_src != rp_src_flag) && (rp_src_flag == RP_SRC_STATIC)) From ded5024af4ffc6b8653085708d3539334aa850c8 Mon Sep 17 00:00:00 2001 From: Mobashshera Rasool Date: Mon, 21 Feb 2022 10:20:05 -0800 Subject: [PATCH 21/21] pim6d: Modify apis in pim_rpf.c for PIMv4/PIMv6 Signed-off-by: Mobashshera Rasool --- pimd/pim_rpf.c | 50 +++++++++++++++++--------------------------------- 1 file changed, 17 insertions(+), 33 deletions(-) diff --git a/pimd/pim_rpf.c b/pimd/pim_rpf.c index a99f5536b7..cee542aa13 100644 --- a/pimd/pim_rpf.c +++ b/pimd/pim_rpf.c @@ -71,17 +71,15 @@ bool pim_nexthop_lookup(struct pim_instance *pim, struct pim_nexthop *nexthop, return false; #endif - if (!pim_addr_cmp(nexthop->last_lookup, addr) - && (nexthop->last_lookup_time > pim->last_route_change_time)) { - if (PIM_DEBUG_PIM_NHT) { - char nexthop_str[PREFIX_STRLEN]; - pim_addr_dump("", &nexthop->mrib_nexthop_addr, - nexthop_str, sizeof(nexthop_str)); + if ((!pim_addr_cmp(nexthop->last_lookup, addr)) && + (nexthop->last_lookup_time > pim->last_route_change_time)) { + if (PIM_DEBUG_PIM_NHT) zlog_debug( - "%s: Using last lookup for %pPAs at %lld, %" PRId64" addr %s", + "%s: Using last lookup for %pPAs at %lld, %" PRId64 + " addr %pFX", __func__, &addr, nexthop->last_lookup_time, - pim->last_route_change_time, nexthop_str); - } + pim->last_route_change_time, + &nexthop->mrib_nexthop_addr); pim->nexthop_lookups_avoided++; return true; } else { @@ -140,18 +138,13 @@ bool pim_nexthop_lookup(struct pim_instance *pim, struct pim_nexthop *nexthop, } if (found) { - if (PIM_DEBUG_ZEBRA) { - char nexthop_str[PREFIX_STRLEN]; - pim_addr_dump("", - &nexthop_tab[i].nexthop_addr, nexthop_str, - sizeof(nexthop_str)); + if (PIM_DEBUG_ZEBRA) zlog_debug( - "%s %s: found nexthop %s for address %pPAs: interface %s ifindex=%d metric=%d pref=%d", - __FILE__, __func__, nexthop_str, &addr, - ifp->name, first_ifindex, - nexthop_tab[i].route_metric, + "%s %s: found nexthop %pFX for address %pPAs: interface %s ifindex=%d metric=%d pref=%d", + __FILE__, __func__, + &nexthop_tab[i].nexthop_addr, &addr, ifp->name, + first_ifindex, nexthop_tab[i].route_metric, nexthop_tab[i].protocol_distance); - } /* update nexthop data */ nexthop->interface = ifp; nexthop->mrib_nexthop_addr = nexthop_tab[i].nexthop_addr; @@ -215,7 +208,6 @@ enum pim_rpf_result pim_rpf_update(struct pim_instance *pim, bool neigh_needed = true; uint32_t saved_mrib_route_metric; pim_addr rpf_addr; - pim_addr saved_rpf_addr; if (PIM_UPSTREAM_FLAG_TEST_STATIC_IIF(up->flags)) return PIM_RPF_OK; @@ -264,19 +256,14 @@ enum pim_rpf_result pim_rpf_update(struct pim_instance *pim, /* detect change in pim_nexthop */ if (nexthop_mismatch(&rpf->source_nexthop, &saved.source_nexthop)) { - if (PIM_DEBUG_ZEBRA) { - char nhaddr_str[PREFIX_STRLEN]; - pim_addr_dump("", - &rpf->source_nexthop.mrib_nexthop_addr, - nhaddr_str, sizeof(nhaddr_str)); - zlog_debug("%s(%s): (S,G)=%s source nexthop now is: interface=%s address=%s pref=%d metric=%d", + if (PIM_DEBUG_ZEBRA) + zlog_debug("%s(%s): (S,G)=%s source nexthop now is: interface=%s address=%pFX pref=%d metric=%d", __func__, caller, up->sg_str, rpf->source_nexthop.interface ? rpf->source_nexthop.interface->name : "", - nhaddr_str, + &rpf->source_nexthop.mrib_nexthop_addr, rpf->source_nexthop.mrib_metric_preference, rpf->source_nexthop.mrib_route_metric); - } pim_upstream_update_join_desired(pim, up); pim_upstream_update_could_assert(up); @@ -300,10 +287,7 @@ enum pim_rpf_result pim_rpf_update(struct pim_instance *pim, } /* detect change in RPF'(S,G) */ - - saved_rpf_addr = pim_addr_from_prefix(&saved.rpf_addr); - - if (pim_addr_cmp(saved_rpf_addr, rpf_addr) || + if (!prefix_same(&saved.rpf_addr, &rpf->rpf_addr) || saved.source_nexthop.interface != rpf->source_nexthop.interface) { pim_rpf_cost_change(pim, up, saved_mrib_route_metric); return PIM_RPF_CHANGED; @@ -418,7 +402,7 @@ unsigned int pim_rpf_hash_key(const void *arg) { const struct pim_nexthop_cache *r = arg; -#if PIM_IPV == 4 || !defined(PIM_V6_TEMP_BREAK) +#if PIM_IPV == 4 return jhash_1word(r->rpf.rpf_addr.u.prefix4.s_addr, 0); #else return jhash2(r->rpf.rpf_addr.u.prefix6.s6_addr32,