diff --git a/pimd/pim6_cmd.c b/pimd/pim6_cmd.c index 1dc03dc38d..e3130b1564 100644 --- a/pimd/pim6_cmd.c +++ b/pimd/pim6_cmd.c @@ -392,6 +392,62 @@ 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); +} + +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); @@ -427,4 +483,12 @@ 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); + 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); } 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/pim_bsm.c b/pimd/pim_bsm.c index c45823cb87..d2e299a007 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); @@ -284,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); @@ -324,10 +325,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, @@ -417,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); @@ -628,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_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_cmd.c b/pimd/pim_cmd.c index a7041e8a60..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"; + 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, +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; + 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, +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 34472173ed..442760fdfe 100644 --- a/pimd/pim_cmd_common.c +++ b/pimd/pim_cmd_common.c @@ -499,3 +499,158 @@ 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; + pim_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(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; + } + + 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_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); + + 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_PIM_AF_XPATH_VAL, 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); +} + +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 688a4f787b..b7e6b6ac80 100644 --- a/pimd/pim_cmd_common.h +++ b/pimd/pim_cmd_common.h @@ -35,6 +35,14 @@ 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_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); diff --git a/pimd/pim_nb_config.c b/pimd/pim_nb_config.c index 27cac0c1a7..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) \ @@ -256,21 +257,17 @@ 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; - 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; } @@ -295,16 +292,13 @@ 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]; 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); @@ -316,8 +310,8 @@ static int pim_no_rp_cmd_worker(struct pim_instance *pim, } 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; } @@ -2340,7 +2334,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,31 +2346,30 @@ 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")) { 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"); 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 +2389,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,12 +2399,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_ipv4p(&group, args->dnode, NULL); - apply_mask_ipv4((struct prefix_ipv4 *)&group); - - return pim_rp_cmd_worker(pim, rp_addr.ip._v4_addr, group, - NULL, args->errmsg, args->errmsg_len); + 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, group, NULL, + args->errmsg, args->errmsg_len); } return NB_OK; @@ -2423,7 +2415,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: @@ -2433,13 +2425,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_ipv4p(&group, args->dnode, NULL); - apply_mask_ipv4((struct prefix_ipv4 *)&group); + 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; @@ -2454,7 +2445,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) { @@ -2466,14 +2457,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"); - if (!str2prefix("224.0.0.0/4", &group)) { + yang_dnode_get_pimaddr(&rp_addr, args->dnode, "../rp-address"); + 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; } - 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; @@ -2485,7 +2476,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) { @@ -2496,16 +2487,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)) { + 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; } - 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; } diff --git a/pimd/pim_rp.c b/pimd/pim_rp.c index 06b2216072..25eabe6743 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); @@ -148,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; } } @@ -185,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; } @@ -238,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) @@ -412,11 +416,10 @@ 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; - char rp[INET_ADDRSTRLEN]; struct rp_info *rp_info; struct rp_info *rp_all; struct prefix group_all; @@ -428,25 +431,20 @@ 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; - 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 */ - 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; } @@ -464,14 +462,14 @@ 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, 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); @@ -481,7 +479,7 @@ int pim_rp_new(struct pim_instance *pim, struct in_addr rp_addr, struct prefix g 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; } @@ -500,11 +498,10 @@ 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) { - pim_rp_del_config(pim, rp, NULL, + 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); } } @@ -519,10 +516,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 ", @@ -564,8 +558,7 @@ int pim_rp_new(struct pim_instance *pim, struct in_addr rp_addr, struct prefix g /* * 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)) @@ -601,8 +594,7 @@ int pim_rp_new(struct pim_instance *pim, struct in_addr rp_addr, struct prefix g } 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); @@ -643,9 +635,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); @@ -657,32 +647,30 @@ 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) - result = str2prefix("224.0.0.0/4", &group); + result = pim_get_all_mcast_group(&group); 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, - 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; @@ -694,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 @@ -714,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 @@ -727,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); } @@ -752,15 +728,13 @@ 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); 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); @@ -851,7 +825,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; @@ -860,6 +834,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) { @@ -875,7 +850,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); @@ -883,12 +859,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); @@ -898,7 +875,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; @@ -923,7 +901,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); @@ -1053,7 +1031,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. @@ -1066,10 +1043,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) @@ -1088,9 +1062,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); @@ -1098,9 +1070,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", @@ -1131,53 +1101,35 @@ 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) { 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 +1138,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++; } diff --git a/pimd/pim_rp.h b/pimd/pim_rp.h index c223402ddd..29834f8e5e 100644 --- a/pimd/pim_rp.h +++ b/pimd/pim_rp.h @@ -47,15 +47,13 @@ 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_del_config(struct pim_instance *pim, const char *rp, - 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_change(struct pim_instance *pim, struct in_addr new_rp_addr, +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, 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, struct prefix_list *plist); 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, 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 */ 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 \