pimd: replace inaddr_none with PIMADDR_ANY

We can use PIMADDR_ANY instead of INADDR_NONE to initalize rp->rpf_addr
when there is no rp configured for group_all.

Signed-off-by: sarita patra <saritap@vmware.com>
This commit is contained in:
sarita patra 2022-02-25 05:17:08 -08:00
parent 2404cc8971
commit cc144e8b6b
6 changed files with 26 additions and 46 deletions

View File

@ -433,8 +433,8 @@ static void pim_instate_pend_list(struct bsgrp_node *bsgrp_node)
* install the rp from head(if exists) of partial list. List is * install the rp from head(if exists) of partial list. List is
* is sorted such that head is the elected RP for the group. * is sorted such that head is the elected RP for the group.
*/ */
if (!rn || (prefix_same(&rp_all->group, &bsgrp_node->group) if (!rn || (prefix_same(&rp_all->group, &bsgrp_node->group) &&
&& pim_rpf_addr_is_inaddr_none(&rp_all->rp))) { pim_rpf_addr_is_inaddr_any(&rp_all->rp))) {
if (PIM_DEBUG_BSM) if (PIM_DEBUG_BSM)
zlog_debug("%s: Route node doesn't exist", __func__); zlog_debug("%s: Route node doesn't exist", __func__);
if (pend) if (pend)
@ -637,8 +637,7 @@ void pim_bsm_clear(struct pim_instance *pim)
rp_all = pim_rp_find_match_group(pim, &g_all); rp_all = pim_rp_find_match_group(pim, &g_all);
if (rp_all == rp_info) { if (rp_all == rp_info) {
rp_all->rp.rpf_addr.family = AF_INET; pim_addr_to_prefix(&rp_all->rp.rpf_addr, PIMADDR_ANY);
rp_all->rp.rpf_addr.u.prefix4.s_addr = INADDR_NONE;
rp_all->i_am_rp = 0; rp_all->i_am_rp = 0;
} else { } else {
/* Delete the rp_info from rp-list */ /* Delete the rp_info from rp-list */
@ -671,7 +670,7 @@ void pim_bsm_clear(struct pim_instance *pim)
trp_info = pim_rp_find_match_group(pim, &grp); trp_info = pim_rp_find_match_group(pim, &grp);
/* RP not found for the group 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_upstream_rpf_clear(pim, up);
pim_rp_set_upstream_addr(pim, &up->upstream_addr, pim_rp_set_upstream_addr(pim, &up->upstream_addr,
up->sg.src, up->sg.grp); up->sg.src, up->sg.grp);

View File

@ -162,7 +162,7 @@ static int pim_mroute_msg_nocache(int fd, struct interface *ifp,
* the Interface type is SSM we don't need to * the Interface type is SSM we don't need to
* do anything here * do anything here
*/ */
if (!rpg || pim_rpf_addr_is_inaddr_none(rpg)) { if (!rpg || pim_rpf_addr_is_inaddr_any(rpg)) {
if (PIM_DEBUG_MROUTE_DETAIL) if (PIM_DEBUG_MROUTE_DETAIL)
zlog_debug( zlog_debug(
"%s: Interface is not configured correctly to handle incoming packet: Could be !pim_ifp, !SM, !RP", "%s: Interface is not configured correctly to handle incoming packet: Could be !pim_ifp, !SM, !RP",
@ -299,8 +299,8 @@ static int pim_mroute_msg_wholepkt(int fd, struct interface *ifp,
rpg = pim_ifp ? RP(pim_ifp->pim, sg.grp) : NULL; rpg = pim_ifp ? RP(pim_ifp->pim, sg.grp) : NULL;
if ((pim_rpf_addr_is_inaddr_none(rpg)) || (!pim_ifp) if ((pim_rpf_addr_is_inaddr_any(rpg)) || (!pim_ifp) ||
|| (!(PIM_I_am_DR(pim_ifp)))) { (!(PIM_I_am_DR(pim_ifp)))) {
if (PIM_DEBUG_MROUTE) { if (PIM_DEBUG_MROUTE) {
zlog_debug("%s: Failed Check send packet", __func__); zlog_debug("%s: Failed Check send packet", __func__);
} }

View File

@ -426,7 +426,7 @@ static void pim_update_rp_nh(struct pim_instance *pim,
/*Traverse RP list and update each RP Nexthop info */ /*Traverse RP list and update each RP Nexthop info */
for (ALL_LIST_ELEMENTS_RO(pnc->rp_list, node, rp_info)) { for (ALL_LIST_ELEMENTS_RO(pnc->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; continue;
// Compute PIM RPF using cached nexthop // Compute PIM RPF using cached nexthop

View File

@ -122,9 +122,7 @@ void pim_rp_init(struct pim_instance *pim)
return; return;
} }
rp_info->group.family = AF_INET; rp_info->group.family = AF_INET;
rp_info->rp.rpf_addr.family = AF_INET; pim_addr_to_prefix(&rp_info->rp.rpf_addr, PIMADDR_ANY);
rp_info->rp.rpf_addr.prefixlen = IPV4_MAX_BITLEN;
rp_info->rp.rpf_addr.u.prefix4.s_addr = INADDR_NONE;
listnode_add(pim->rp_list, rp_info); listnode_add(pim->rp_list, rp_info);
@ -414,9 +412,8 @@ 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, int pim_rp_new(struct pim_instance *pim, struct in_addr rp_addr, struct prefix group,
struct prefix group, const char *plist, const char *plist, enum rp_source rp_src_flag)
enum rp_source rp_src_flag)
{ {
int result = 0; int result = 0;
char rp[INET_ADDRSTRLEN]; char rp[INET_ADDRSTRLEN];
@ -431,8 +428,7 @@ int pim_rp_new(struct pim_instance *pim, struct in_addr rp_addr,
struct pim_upstream *up; struct pim_upstream *up;
bool upstream_updated = false; bool upstream_updated = false;
if (rp_addr.s_addr == INADDR_ANY || if (rp_addr.s_addr == INADDR_ANY)
rp_addr.s_addr == INADDR_NONE)
return PIM_RP_BAD_ADDRESS; return PIM_RP_BAD_ADDRESS;
rp_info = XCALLOC(MTYPE_PIM_RP, sizeof(*rp_info)); rp_info = XCALLOC(MTYPE_PIM_RP, sizeof(*rp_info));
@ -516,8 +512,8 @@ int pim_rp_new(struct pim_instance *pim, struct in_addr rp_addr,
/* /*
* 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_NONE
*/ */
if (prefix_same(&rp_all->group, &rp_info->group) if (prefix_same(&rp_all->group, &rp_info->group) &&
&& pim_rpf_addr_is_inaddr_none(&rp_all->rp)) { pim_rpf_addr_is_inaddr_any(&rp_all->rp)) {
rp_all->rp.rpf_addr = rp_info->rp.rpf_addr; rp_all->rp.rpf_addr = rp_info->rp.rpf_addr;
rp_all->rp_src = rp_src_flag; rp_all->rp_src = rp_src_flag;
XFREE(MTYPE_PIM_RP, rp_info); XFREE(MTYPE_PIM_RP, rp_info);
@ -789,8 +785,7 @@ int pim_rp_del(struct pim_instance *pim, struct in_addr rp_addr,
} }
} }
} }
rp_all->rp.rpf_addr.family = AF_INET; pim_addr_to_prefix(&rp_all->rp.rpf_addr, PIMADDR_ANY);
rp_all->rp.rpf_addr.u.prefix4.s_addr = INADDR_NONE;
rp_all->i_am_rp = 0; rp_all->i_am_rp = 0;
return PIM_SUCCESS; return PIM_SUCCESS;
} }
@ -834,7 +829,7 @@ int pim_rp_del(struct pim_instance *pim, struct in_addr rp_addr,
trp_info = pim_rp_find_match_group(pim, &grp); trp_info = pim_rp_find_match_group(pim, &grp);
/* RP not found for the group 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_upstream_rpf_clear(pim, up);
pim_rp_set_upstream_addr( pim_rp_set_upstream_addr(
pim, &up->upstream_addr, up->sg.src, pim, &up->upstream_addr, up->sg.src,
@ -956,7 +951,7 @@ void pim_rp_setup(struct pim_instance *pim)
struct prefix nht_p; struct prefix nht_p;
for (ALL_LIST_ELEMENTS_RO(pim->rp_list, node, rp_info)) { 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; continue;
nht_p.family = AF_INET; nht_p.family = AF_INET;
@ -987,7 +982,7 @@ void pim_rp_check_on_if_add(struct pim_interface *pim_ifp)
return; return;
for (ALL_LIST_ELEMENTS_RO(pim->rp_list, node, rp_info)) { 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; continue;
/* if i_am_rp is already set nothing to be done (adding new /* if i_am_rp is already set nothing to be done (adding new
@ -1029,7 +1024,7 @@ void pim_i_am_rp_re_evaluate(struct pim_instance *pim)
return; return;
for (ALL_LIST_ELEMENTS_RO(pim->rp_list, node, rp_info)) { 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; continue;
old_i_am_rp = rp_info->i_am_rp; old_i_am_rp = rp_info->i_am_rp;
@ -1142,8 +1137,8 @@ int pim_rp_set_upstream_addr(struct pim_instance *pim, pim_addr *up,
rp_info = pim_rp_find_match_group(pim, &g); rp_info = pim_rp_find_match_group(pim, &g);
if (!rp_info || ((pim_rpf_addr_is_inaddr_none(&rp_info->rp)) if (!rp_info || ((pim_rpf_addr_is_inaddr_any(&rp_info->rp)) &&
&& (source.s_addr == INADDR_ANY))) { (source.s_addr == INADDR_ANY))) {
if (PIM_DEBUG_PIM_NHT_RP) if (PIM_DEBUG_PIM_NHT_RP)
zlog_debug("%s: Received a (*,G) with no RP configured", zlog_debug("%s: Received a (*,G) with no RP configured",
__func__); __func__);
@ -1185,7 +1180,7 @@ int pim_rp_config_write(struct pim_instance *pim, struct vty *vty,
int count = 0; int count = 0;
for (ALL_LIST_ELEMENTS_RO(pim->rp_list, node, rp_info)) { 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; continue;
if (rp_info->rp_src == RP_SRC_BSR) if (rp_info->rp_src == RP_SRC_BSR)
@ -1227,7 +1222,7 @@ void pim_rp_show_information(struct pim_instance *pim, struct vty *vty, bool uj)
vty_out(vty, vty_out(vty,
"RP address group/prefix-list OIF I am RP Source\n"); "RP address group/prefix-list OIF I am RP Source\n");
for (ALL_LIST_ELEMENTS_RO(pim->rp_list, node, rp_info)) { 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)) {
char buf[48]; char buf[48];
if (rp_info->rp_src == RP_SRC_STATIC) if (rp_info->rp_src == RP_SRC_STATIC)
@ -1345,7 +1340,7 @@ void pim_resolve_rp_nh(struct pim_instance *pim, struct pim_neighbor *nbr)
struct pim_nexthop_cache pnc; struct pim_nexthop_cache pnc;
for (ALL_LIST_ELEMENTS_RO(pim->rp_list, node, rp_info)) { 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; continue;
nht_p.family = AF_INET; nht_p.family = AF_INET;

View File

@ -51,7 +51,7 @@ void pim_rpf_set_refresh_time(struct pim_instance *pim)
} }
bool pim_nexthop_lookup(struct pim_instance *pim, struct pim_nexthop *nexthop, bool pim_nexthop_lookup(struct pim_instance *pim, struct pim_nexthop *nexthop,
struct in_addr addr, int neighbor_needed) pim_addr addr, int neighbor_needed)
{ {
struct pim_zlookup_nexthop nexthop_tab[MULTIPATH_NUM]; struct pim_zlookup_nexthop nexthop_tab[MULTIPATH_NUM];
struct pim_neighbor *nbr = NULL; struct pim_neighbor *nbr = NULL;
@ -66,7 +66,7 @@ bool pim_nexthop_lookup(struct pim_instance *pim, struct pim_nexthop *nexthop,
* 255.255.255.255 address, since * 255.255.255.255 address, since
* it will never work * it will never work
*/ */
if (addr.s_addr == INADDR_NONE) if (pim_addr_is_any(addr))
return false; return false;
if ((nexthop->last_lookup.s_addr == addr.s_addr) if ((nexthop->last_lookup.s_addr == addr.s_addr)
@ -405,19 +405,6 @@ static struct in_addr pim_rpf_find_rpf_addr(struct pim_upstream *up)
return rpf_addr; return rpf_addr;
} }
int pim_rpf_addr_is_inaddr_none(struct pim_rpf *rpf)
{
switch (rpf->rpf_addr.family) {
case AF_INET:
return rpf->rpf_addr.u.prefix4.s_addr == INADDR_NONE;
case AF_INET6:
zlog_warn("%s: v6 Unimplmeneted", __func__);
return 1;
default:
return 0;
}
}
int pim_rpf_addr_is_inaddr_any(struct pim_rpf *rpf) int pim_rpf_addr_is_inaddr_any(struct pim_rpf *rpf)
{ {
switch (rpf->rpf_addr.family) { switch (rpf->rpf_addr.family) {

View File

@ -64,7 +64,6 @@ enum pim_rpf_result pim_rpf_update(struct pim_instance *pim,
struct pim_rpf *old, const char *caller); struct pim_rpf *old, const char *caller);
void pim_upstream_rpf_clear(struct pim_instance *pim, void pim_upstream_rpf_clear(struct pim_instance *pim,
struct pim_upstream *up); struct pim_upstream *up);
int pim_rpf_addr_is_inaddr_none(struct pim_rpf *rpf);
int pim_rpf_addr_is_inaddr_any(struct pim_rpf *rpf); int pim_rpf_addr_is_inaddr_any(struct pim_rpf *rpf);
int pim_rpf_is_same(struct pim_rpf *rpf1, struct pim_rpf *rpf2); int pim_rpf_is_same(struct pim_rpf *rpf1, struct pim_rpf *rpf2);