rp_info = XCALLOC(MTYPE_PIM_RP, sizeof(*rp_info));
- if (!rp_info) {
- zlog_err("Unable to alloc rp_info");
- route_table_finish(pim->rp_table);
- list_delete_and_null(&pim->rp_list);
- return;
- }
-
if (!str2prefix("224.0.0.0/4", &rp_info->group)) {
zlog_err("Unable to convert 224.0.0.0/4 to prefix");
list_delete_and_null(&pim->rp_list);
rn->info = rp_info;
if (PIM_DEBUG_TRACE)
- zlog_debug("Allocated: %p for rp_info: %p(224.0.0.0/4) Lock: %d",
- rn, rp_info, rn->lock);
+ zlog_debug(
+ "Allocated: %p for rp_info: %p(224.0.0.0/4) Lock: %d",
+ rn, rp_info, rn->lock);
}
void pim_rp_free(struct pim_instance *pim)
*/
static struct rp_info *pim_rp_find_exact(struct pim_instance *pim,
struct in_addr rp,
- struct prefix *group)
+ const struct prefix *group)
{
struct listnode *node;
struct rp_info *rp_info;
* Given a group, return the rp_info for that group
*/
static struct rp_info *pim_rp_find_match_group(struct pim_instance *pim,
- struct prefix *group)
+ const struct prefix *group)
{
struct listnode *node;
struct rp_info *best = NULL;
struct rp_info *rp_info;
struct prefix_list *plist;
- struct prefix *p, *bp;
+ const struct prefix *p, *bp;
struct route_node *rn;
bp = NULL;
if (rp_info->plist) {
plist = prefix_list_lookup(AFI_IP, rp_info->plist);
- if (prefix_list_apply_which_prefix(plist, &p, group) == PREFIX_DENY)
+ if (prefix_list_apply_which_prefix(plist, &p, group)
+ == PREFIX_DENY)
continue;
if (!best) {
rn = route_node_match(pim->rp_table, group);
if (!rn) {
- zlog_err("%s: BUG We should have found default group information\n",
- __PRETTY_FUNCTION__);
+ zlog_err(
+ "%s: BUG We should have found default group information\n",
+ __PRETTY_FUNCTION__);
return best;
}
char buf[PREFIX_STRLEN];
route_unlock_node(rn);
- zlog_debug("Lookedup: %p for rp_info: %p(%s) Lock: %d",
- rn, rp_info,
+ zlog_debug("Lookedup: %p for rp_info: %p(%s) Lock: %d", rn,
+ rp_info,
prefix2str(&rp_info->group, buf, sizeof(buf)),
rn->lock);
}
struct route_node *rn;
rp_info = XCALLOC(MTYPE_PIM_RP, sizeof(*rp_info));
- if (!rp_info)
- return PIM_MALLOC_FAIL;
if (group_range == NULL)
result = str2prefix("224.0.0.0/4", &rp_info->group);
&rp_all->group, 1))
return PIM_RP_NO_PATH;
} else {
- if (pim_nexthop_lookup(
+ if (!pim_ecmp_nexthop_lookup(
pim, &rp_all->rp.source_nexthop,
- rp_all->rp.rpf_addr.u.prefix4, 1)
- != 0)
+ &nht_p, &rp_all->group, 1))
return PIM_RP_NO_PATH;
}
pim_rp_check_interfaces(pim, rp_all);
listnode_add_sort(pim->rp_list, rp_info);
rn = route_node_get(pim->rp_table, &rp_info->group);
- if (!rn) {
- char buf[PREFIX_STRLEN];
- zlog_err("Failure to get route node for pim->rp_table: %s",
- prefix2str(&rp_info->group, buf, sizeof(buf)));
- return PIM_MALLOC_FAIL;
- }
rn->info = rp_info;
if (PIM_DEBUG_TRACE) {
char buf[PREFIX_STRLEN];
- zlog_debug("Allocated: %p for rp_info: %p(%s) Lock: %d",
- rn, rp_info,
+ zlog_debug("Allocated: %p for rp_info: %p(%s) Lock: %d", rn,
+ rp_info,
prefix2str(&rp_info->group, buf, sizeof(buf)),
rn->lock);
}
&nht_p, &rp_info->group, 1))
return PIM_RP_NO_PATH;
} else {
- if (pim_nexthop_lookup(pim, &rp_info->rp.source_nexthop,
- rp_info->rp.rpf_addr.u.prefix4, 1)
- != 0)
+ if (!pim_ecmp_nexthop_lookup(pim, &rp_info->rp.source_nexthop,
+ &nht_p, &rp_info->group, 1))
return PIM_RP_NO_PATH;
}
if (PIM_DEBUG_TRACE) {
char buf[PREFIX_STRLEN];
- zlog_debug("%s:Found for Freeing: %p for rp_info: %p(%s) Lock: %d",
- __PRETTY_FUNCTION__,
- rn, rp_info,
- prefix2str(&rp_info->group, buf, sizeof(buf)),
- rn->lock);
+ zlog_debug(
+ "%s:Found for Freeing: %p for rp_info: %p(%s) Lock: %d",
+ __PRETTY_FUNCTION__, rn, rp_info,
+ prefix2str(&rp_info->group, buf,
+ sizeof(buf)),
+ rn->lock);
}
rn->info = NULL;
route_unlock_node(rn);
"%s: NHT Local Nexthop not found for RP %s ",
__PRETTY_FUNCTION__, buf);
}
- if (!pim_nexthop_lookup(
- pim, &rp_info->rp.source_nexthop,
- rp_info->rp.rpf_addr.u.prefix4, 1))
+ if (!pim_ecmp_nexthop_lookup(pim,
+ &rp_info->rp.source_nexthop,
+ &nht_p, &rp_info->group, 1))
if (PIM_DEBUG_PIM_NHT_RP)
zlog_debug(
"Unable to lookup nexthop for rp specified");
"%s: Nexthop cache not found for RP %s grp %s register with Zebra",
__PRETTY_FUNCTION__, buf, buf1);
}
- pim_rpf_set_refresh_time();
- pim_nexthop_lookup(pim, &rp_info->rp.source_nexthop,
- rp_info->rp.rpf_addr.u.prefix4, 1);
+ pim_rpf_set_refresh_time(pim);
+ pim_ecmp_nexthop_lookup(pim,
+ &rp_info->rp.source_nexthop,
+ &nht_p, &rp_info->group, 1);
}
return (&rp_info->rp);
}
}
void pim_rp_show_information(struct pim_instance *pim, struct vty *vty,
- u_char uj)
+ uint8_t uj)
{
struct rp_info *rp_info;
struct rp_info *prev_rp_info = NULL;