summaryrefslogtreecommitdiff
path: root/pimd/pim_rp.c
diff options
context:
space:
mode:
Diffstat (limited to 'pimd/pim_rp.c')
-rw-r--r--pimd/pim_rp.c487
1 files changed, 208 insertions, 279 deletions
diff --git a/pimd/pim_rp.c b/pimd/pim_rp.c
index 0346a7067b..99727cf837 100644
--- a/pimd/pim_rp.c
+++ b/pimd/pim_rp.c
@@ -48,6 +48,8 @@
#include "pim_oil.h"
#include "pim_zebra.h"
#include "pim_bsm.h"
+#include "pim_util.h"
+#include "pim_ssm.h"
/* Cleanup pim->rpf_hash each node data */
void pim_rp_list_hash_clean(void *data)
@@ -76,26 +78,21 @@ int pim_rp_list_cmp(void *v1, void *v2)
{
struct rp_info *rp1 = (struct rp_info *)v1;
struct rp_info *rp2 = (struct rp_info *)v2;
+ int ret;
/*
* Sort by RP IP address
*/
- if (rp1->rp.rpf_addr.u.prefix4.s_addr
- < rp2->rp.rpf_addr.u.prefix4.s_addr)
- return -1;
-
- if (rp1->rp.rpf_addr.u.prefix4.s_addr
- > rp2->rp.rpf_addr.u.prefix4.s_addr)
- return 1;
+ ret = prefix_cmp(&rp1->rp.rpf_addr, &rp2->rp.rpf_addr);
+ if (ret)
+ return ret;
/*
* Sort by group IP address
*/
- if (rp1->group.u.prefix4.s_addr < rp2->group.u.prefix4.s_addr)
- return -1;
-
- if (rp1->group.u.prefix4.s_addr > rp2->group.u.prefix4.s_addr)
- return 1;
+ ret = prefix_cmp(&rp1->group, &rp2->group);
+ if (ret)
+ return ret;
return 0;
}
@@ -113,27 +110,24 @@ 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");
+ "Unable to convert all-multicast prefix");
list_delete(&pim->rp_list);
route_table_finish(pim->rp_table);
XFREE(MTYPE_PIM_RP, rp_info);
return;
}
- rp_info->group.family = AF_INET;
- rp_info->rp.rpf_addr.family = AF_INET;
- rp_info->rp.rpf_addr.prefixlen = IPV4_MAX_BITLEN;
- rp_info->rp.rpf_addr.u.prefix4.s_addr = INADDR_NONE;
+ pim_addr_to_prefix(&rp_info->rp.rpf_addr, PIMADDR_ANY);
listnode_add(pim->rp_list, rp_info);
rn = route_node_get(pim->rp_table, &rp_info->group);
rn->info = rp_info;
if (PIM_DEBUG_PIM_TRACE)
- zlog_debug(
- "Allocated: %p for rp_info: %p(224.0.0.0/4) Lock: %d",
- rn, rp_info, route_node_get_lock_count(rn));
+ zlog_debug("Allocated: %p for rp_info: %p(%pFX) Lock: %d", rn,
+ rp_info, &rp_info->group,
+ route_node_get_lock_count(rn));
}
void pim_rp_free(struct pim_instance *pim)
@@ -150,15 +144,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;
}
}
@@ -187,16 +183,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;
}
@@ -240,7 +237,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)
@@ -373,7 +370,7 @@ void pim_upstream_update(struct pim_instance *pim, struct pim_upstream *up)
up->sg.grp);
if (PIM_DEBUG_PIM_TRACE)
- zlog_debug("%s: pim upstream update for old upstream %pI4",
+ zlog_debug("%s: pim upstream update for old upstream %pPA",
__func__, &old_upstream_addr);
if (!pim_addr_cmp(old_upstream_addr, new_upstream_addr))
@@ -414,12 +411,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, 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)
{
int result = 0;
- char rp[INET_ADDRSTRLEN];
struct rp_info *rp_info;
struct rp_info *rp_all;
struct prefix group_all;
@@ -431,26 +426,20 @@ int pim_rp_new(struct pim_instance *pim, struct in_addr rp_addr,
struct pim_upstream *up;
bool upstream_updated = false;
- if (rp_addr.s_addr == INADDR_ANY ||
- rp_addr.s_addr == INADDR_NONE)
+ 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;
}
@@ -468,14 +457,14 @@ int pim_rp_new(struct pim_instance *pim, struct in_addr rp_addr,
*/
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);
@@ -485,7 +474,7 @@ int pim_rp_new(struct pim_instance *pim, struct in_addr rp_addr,
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;
}
@@ -504,29 +493,25 @@ int pim_rp_new(struct pim_instance *pim, struct in_addr rp_addr,
*/
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);
}
}
/*
- * Take over the 224.0.0.0/4 group if the rp is INADDR_NONE
+ * Take over the 224.0.0.0/4 group if the rp is INADDR_ANY
*/
- if (prefix_same(&rp_all->group, &rp_info->group)
- && pim_rpf_addr_is_inaddr_none(&rp_all->rp)) {
+ if (prefix_same(&rp_all->group, &rp_info->group) &&
+ pim_rpf_addr_is_inaddr_any(&rp_all->rp)) {
rp_all->rp.rpf_addr = rp_info->rp.rpf_addr;
rp_all->rp_src = rp_src_flag;
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 ",
@@ -568,8 +553,7 @@ int pim_rp_new(struct pim_instance *pim, struct in_addr rp_addr,
/*
* 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))
@@ -605,8 +589,7 @@ int pim_rp_new(struct pim_instance *pim, struct in_addr rp_addr,
}
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);
@@ -647,9 +630,7 @@ int pim_rp_new(struct pim_instance *pim, struct in_addr rp_addr,
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);
@@ -661,32 +642,30 @@ int pim_rp_new(struct pim_instance *pim, struct in_addr rp_addr,
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;
-
- result = inet_pton(AF_INET, rp, &rp_addr);
- if (result <= 0)
- return PIM_RP_BAD_ADDRESS;
+ if (!result) {
+ if (PIM_DEBUG_PIM_TRACE)
+ zlog_debug(
+ "%s: String to prefix failed for %pPAs group",
+ __func__, &rp_addr);
+ return;
+ }
- 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;
@@ -698,12 +677,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), "<rp?>");
-
if (plist)
rp_info = pim_rp_find_prefix_list(pim, rp_addr, plist);
else
@@ -718,8 +693,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
@@ -731,19 +706,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),
- "<bsrp?>");
-
+ 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);
}
@@ -756,15 +723,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);
@@ -789,8 +754,7 @@ int pim_rp_del(struct pim_instance *pim, struct in_addr rp_addr,
}
}
}
- rp_all->rp.rpf_addr.family = AF_INET;
- rp_all->rp.rpf_addr.u.prefix4.s_addr = INADDR_NONE;
+ pim_addr_to_prefix(&rp_all->rp.rpf_addr, PIMADDR_ANY);
rp_all->i_am_rp = 0;
return PIM_SUCCESS;
}
@@ -834,7 +798,7 @@ int pim_rp_del(struct pim_instance *pim, struct in_addr rp_addr,
trp_info = pim_rp_find_match_group(pim, &grp);
/* RP not found for the group grp */
- if (pim_rpf_addr_is_inaddr_none(&trp_info->rp)) {
+ if (pim_rpf_addr_is_inaddr_any(&trp_info->rp)) {
pim_upstream_rpf_clear(pim, up);
pim_rp_set_upstream_addr(
pim, &up->upstream_addr, up->sg.src,
@@ -856,7 +820,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;
@@ -865,6 +829,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) {
@@ -880,7 +845,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);
@@ -888,12 +854,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);
@@ -903,7 +870,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;
@@ -928,7 +896,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);
@@ -956,12 +924,10 @@ void pim_rp_setup(struct pim_instance *pim)
struct prefix nht_p;
for (ALL_LIST_ELEMENTS_RO(pim->rp_list, node, rp_info)) {
- if (rp_info->rp.rpf_addr.u.prefix4.s_addr == INADDR_NONE)
+ if (pim_rpf_addr_is_inaddr_any(&rp_info->rp))
continue;
- 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;
pim_find_or_track_nexthop(pim, &nht_p, NULL, rp_info, NULL);
if (!pim_ecmp_nexthop_lookup(pim, &rp_info->rp.source_nexthop,
@@ -987,7 +953,7 @@ void pim_rp_check_on_if_add(struct pim_interface *pim_ifp)
return;
for (ALL_LIST_ELEMENTS_RO(pim->rp_list, node, rp_info)) {
- if (pim_rpf_addr_is_inaddr_none(&rp_info->rp))
+ if (pim_rpf_addr_is_inaddr_any(&rp_info->rp))
continue;
/* if i_am_rp is already set nothing to be done (adding new
@@ -1029,7 +995,7 @@ void pim_i_am_rp_re_evaluate(struct pim_instance *pim)
return;
for (ALL_LIST_ELEMENTS_RO(pim->rp_list, node, rp_info)) {
- if (pim_rpf_addr_is_inaddr_none(&rp_info->rp))
+ if (pim_rpf_addr_is_inaddr_any(&rp_info->rp))
continue;
old_i_am_rp = rp_info->i_am_rp;
@@ -1058,7 +1024,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.
@@ -1071,10 +1036,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)
@@ -1093,9 +1055,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);
@@ -1103,9 +1063,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",
@@ -1136,86 +1094,65 @@ 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_none(&rp_info->rp))
- && (source.s_addr == INADDR_ANY))) {
+ if (!rp_info || ((pim_rpf_addr_is_inaddr_any(&rp_info->rp)) &&
+ (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_none(&rp_info->rp))
+ if (pim_rpf_addr_is_inaddr_any(&rp_info->rp))
continue;
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++;
}
return count;
}
-void pim_rp_show_information(struct pim_instance *pim, struct vty *vty, bool uj)
+void pim_rp_show_information(struct pim_instance *pim, struct prefix *range,
+ struct vty *vty, bool uj)
{
struct rp_info *rp_info;
struct rp_info *prev_rp_info = NULL;
struct listnode *node;
char source[7];
- char buf[PREFIX_STRLEN];
json_object *json = NULL;
json_object *json_rp_rows = NULL;
@@ -1225,112 +1162,105 @@ void pim_rp_show_information(struct pim_instance *pim, struct vty *vty, bool uj)
json = json_object_new_object();
else
vty_out(vty,
- "RP address group/prefix-list OIF I am RP Source\n");
+ "RP address group/prefix-list OIF I am RP Source Group-Type\n");
for (ALL_LIST_ELEMENTS_RO(pim->rp_list, node, rp_info)) {
- if (!pim_rpf_addr_is_inaddr_none(&rp_info->rp)) {
- char buf[48];
+ if (pim_rpf_addr_is_inaddr_any(&rp_info->rp))
+ continue;
- if (rp_info->rp_src == RP_SRC_STATIC)
- strlcpy(source, "Static", sizeof(source));
- else if (rp_info->rp_src == RP_SRC_BSR)
- strlcpy(source, "BSR", sizeof(source));
- else
- strlcpy(source, "None", sizeof(source));
- if (uj) {
- /*
- * If we have moved on to a new RP then add the
- * entry for the previous RP
- */
- if (prev_rp_info
- && prev_rp_info->rp.rpf_addr.u.prefix4
- .s_addr
- != rp_info->rp.rpf_addr.u.prefix4
- .s_addr) {
- json_object_object_add(
- json,
- inet_ntop(AF_INET,
- &prev_rp_info->rp
- .rpf_addr.u
- .prefix4,
- buf, sizeof(buf)),
- json_rp_rows);
- json_rp_rows = NULL;
- }
+#if PIM_IPV == 4
+ pim_addr group = rp_info->group.u.prefix4;
+#else
+ pim_addr group = rp_info->group.u.prefix6;
+#endif
+ const char *group_type =
+ pim_is_grp_ssm(pim, group) ? "SSM" : "ASM";
- if (!json_rp_rows)
- json_rp_rows = json_object_new_array();
-
- json_row = json_object_new_object();
- json_object_string_addf(
- json_row, "rpAddress", "%pI4",
- &rp_info->rp.rpf_addr.u.prefix4);
- if (rp_info->rp.source_nexthop.interface)
- json_object_string_add(
- json_row, "outboundInterface",
- rp_info->rp.source_nexthop
- .interface->name);
- else
- json_object_string_add(
- json_row, "outboundInterface",
- "Unknown");
- if (rp_info->i_am_rp)
- json_object_boolean_true_add(json_row,
- "iAmRP");
- else
- json_object_boolean_false_add(json_row,
- "iAmRP");
+ if (range && !prefix_same(&rp_info->group, range))
+ continue;
- if (rp_info->plist)
- json_object_string_add(json_row,
- "prefixList",
- rp_info->plist);
- else
- json_object_string_addf(
- json_row, "group", "%pFX",
- &rp_info->group);
- json_object_string_add(json_row, "source",
- source);
+ if (rp_info->rp_src == RP_SRC_STATIC)
+ strlcpy(source, "Static", sizeof(source));
+ else if (rp_info->rp_src == RP_SRC_BSR)
+ strlcpy(source, "BSR", sizeof(source));
+ else
+ strlcpy(source, "None", sizeof(source));
+ if (uj) {
+ /*
+ * If we have moved on to a new RP then add the
+ * entry for the previous RP
+ */
+ if (prev_rp_info &&
+ prefix_cmp(&prev_rp_info->rp.rpf_addr,
+ &rp_info->rp.rpf_addr)) {
+ json_object_object_addf(
+ json, json_rp_rows, "%pFXh",
+ &prev_rp_info->rp.rpf_addr);
+ json_rp_rows = NULL;
+ }
- json_object_array_add(json_rp_rows, json_row);
- } else {
- vty_out(vty, "%-15s ",
- inet_ntop(AF_INET,
- &rp_info->rp.rpf_addr.u
- .prefix4,
- buf, sizeof(buf)));
-
- if (rp_info->plist)
- vty_out(vty, "%-18s ", rp_info->plist);
- else
- vty_out(vty, "%-18pFX ",
- &rp_info->group);
+ if (!json_rp_rows)
+ json_rp_rows = json_object_new_array();
+
+ json_row = json_object_new_object();
+ json_object_string_addf(json_row, "rpAddress", "%pFXh",
+ &rp_info->rp.rpf_addr);
+ if (rp_info->rp.source_nexthop.interface)
+ json_object_string_add(
+ json_row, "outboundInterface",
+ rp_info->rp.source_nexthop
+ .interface->name);
+ else
+ json_object_string_add(json_row,
+ "outboundInterface",
+ "Unknown");
+ if (rp_info->i_am_rp)
+ json_object_boolean_true_add(json_row, "iAmRP");
+ else
+ json_object_boolean_false_add(json_row,
+ "iAmRP");
- if (rp_info->rp.source_nexthop.interface)
- vty_out(vty, "%-16s ",
- rp_info->rp.source_nexthop
- .interface->name);
- else
- vty_out(vty, "%-16s ", "(Unknown)");
+ if (rp_info->plist)
+ json_object_string_add(json_row, "prefixList",
+ rp_info->plist);
+ else
+ json_object_string_addf(json_row, "group",
+ "%pFX",
+ &rp_info->group);
+ json_object_string_add(json_row, "source", source);
+ json_object_string_add(json_row, "groupType",
+ group_type);
+
+ json_object_array_add(json_rp_rows, json_row);
+ } else {
+ vty_out(vty, "%-15pFXh ", &rp_info->rp.rpf_addr);
- if (rp_info->i_am_rp)
- vty_out(vty, "yes");
- else
- vty_out(vty, "no");
+ if (rp_info->plist)
+ vty_out(vty, "%-18s ", rp_info->plist);
+ else
+ vty_out(vty, "%-18pFX ", &rp_info->group);
- vty_out(vty, "%14s\n", source);
- }
- prev_rp_info = rp_info;
+ if (rp_info->rp.source_nexthop.interface)
+ vty_out(vty, "%-16s ",
+ rp_info->rp.source_nexthop
+ .interface->name);
+ else
+ vty_out(vty, "%-16s ", "(Unknown)");
+
+ if (rp_info->i_am_rp)
+ vty_out(vty, "yes");
+ else
+ vty_out(vty, "no");
+
+ vty_out(vty, "%14s", source);
+ vty_out(vty, "%6s\n", group_type);
}
+ prev_rp_info = rp_info;
}
if (uj) {
if (prev_rp_info && json_rp_rows)
- json_object_object_add(
- json,
- inet_ntop(AF_INET,
- &prev_rp_info->rp.rpf_addr.u.prefix4,
- buf, sizeof(buf)),
- json_rp_rows);
+ json_object_object_addf(json, json_rp_rows, "%pFXh",
+ &prev_rp_info->rp.rpf_addr);
vty_json(vty, json);
}
@@ -1345,20 +1275,23 @@ void pim_resolve_rp_nh(struct pim_instance *pim, struct pim_neighbor *nbr)
struct pim_nexthop_cache pnc;
for (ALL_LIST_ELEMENTS_RO(pim->rp_list, node, rp_info)) {
- if (rp_info->rp.rpf_addr.u.prefix4.s_addr == INADDR_NONE)
+ if (pim_rpf_addr_is_inaddr_any(&rp_info->rp))
continue;
- 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;
memset(&pnc, 0, sizeof(struct pim_nexthop_cache));
if (!pim_find_or_track_nexthop(pim, &nht_p, NULL, rp_info,
&pnc))
continue;
for (nh_node = pnc.nexthop; nh_node; nh_node = nh_node->next) {
- if (nh_node->gate.ipv4.s_addr != INADDR_ANY)
+#if PIM_IPV == 4
+ if (!pim_addr_is_any(nh_node->gate.ipv4))
+ continue;
+#else
+ if (!pim_addr_is_any(nh_node->gate.ipv6))
continue;
+#endif
struct interface *ifp1 = if_lookup_by_index(
nh_node->ifindex, pim->vrf->vrf_id);
@@ -1371,15 +1304,11 @@ void pim_resolve_rp_nh(struct pim_instance *pim, struct pim_neighbor *nbr)
#else
nh_node->gate.ipv6 = nbr->source_addr;
#endif
- if (PIM_DEBUG_PIM_NHT_RP) {
- char str[PREFIX_STRLEN];
- pim_addr_dump("<nht_addr?>", &nht_p, str,
- sizeof(str));
+ if (PIM_DEBUG_PIM_NHT_RP)
zlog_debug(
- "%s: addr %s new nexthop addr %pPAs interface %s",
- __func__, str, &nbr->source_addr,
+ "%s: addr %pFXh new nexthop addr %pPAs interface %s",
+ __func__, &nht_p, &nbr->source_addr,
ifp1->name);
- }
}
}
}