return;
}
-struct pim_nexthop_cache *pim_nexthop_cache_find(struct pim_rpf *rpf)
+struct pim_nexthop_cache *pim_nexthop_cache_find(struct pim_instance *pim,
+ struct pim_rpf *rpf)
{
struct pim_nexthop_cache *pnc = NULL;
struct pim_nexthop_cache lookup;
lookup.rpf.rpf_addr.prefixlen = rpf->rpf_addr.prefixlen;
lookup.rpf.rpf_addr.u.prefix4.s_addr = rpf->rpf_addr.u.prefix4.s_addr;
- pnc = hash_lookup(pimg->rpf_hash, &lookup);
+ pnc = hash_lookup(pim->rpf_hash, &lookup);
return pnc;
}
-struct pim_nexthop_cache *pim_nexthop_cache_add(struct pim_rpf *rpf_addr)
+struct pim_nexthop_cache *pim_nexthop_cache_add(struct pim_instance *pim,
+ struct pim_rpf *rpf_addr)
{
struct pim_nexthop_cache *pnc;
pnc->rpf.rpf_addr.u.prefix4.s_addr =
rpf_addr->rpf_addr.u.prefix4.s_addr;
- pnc = hash_get(pimg->rpf_hash, pnc, hash_alloc_intern);
+ pnc = hash_get(pim->rpf_hash, pnc, hash_alloc_intern);
pnc->rp_list = list_new();
pnc->rp_list->cmp = pim_rp_list_cmp;
rpf.rpf_addr.prefixlen = addr->prefixlen;
rpf.rpf_addr.u.prefix4 = addr->u.prefix4;
- pnc = pim_nexthop_cache_find(&rpf);
+ pnc = pim_nexthop_cache_find(pimg, &rpf);
if (!pnc) {
- pnc = pim_nexthop_cache_add(&rpf);
+ pnc = pim_nexthop_cache_add(pimg, &rpf);
if (pnc)
pim_sendmsg_zebra_rnh(zclient, pnc,
ZEBRA_NEXTHOP_REGISTER);
return 0;
}
-void pim_delete_tracked_nexthop(struct prefix *addr, struct pim_upstream *up,
- struct rp_info *rp)
+void pim_delete_tracked_nexthop(struct pim_instance *pim, struct prefix *addr,
+ struct pim_upstream *up, struct rp_info *rp)
{
struct pim_nexthop_cache *pnc = NULL;
struct pim_nexthop_cache lookup;
/* Remove from RPF hash if it is the last entry */
lookup.rpf.rpf_addr = *addr;
- pnc = hash_lookup(pimg->rpf_hash, &lookup);
+ pnc = hash_lookup(pim->rpf_hash, &lookup);
if (pnc) {
if (rp)
listnode_delete(pnc->rp_list, rp);
list_delete(pnc->rp_list);
list_delete(pnc->upstream_list);
- hash_release(pimg->rpf_hash, pnc);
+ hash_release(pim->rpf_hash, pnc);
if (pnc->nexthop)
nexthops_free(pnc->nexthop);
XFREE(MTYPE_PIM_NEXTHOP_CACHE, pnc);
rpf.rpf_addr.family = p.family;
rpf.rpf_addr.prefixlen = p.prefixlen;
rpf.rpf_addr.u.prefix4.s_addr = p.u.prefix4.s_addr;
- pnc = pim_nexthop_cache_find(&rpf);
+ pnc = pim_nexthop_cache_find(pimg, &rpf);
if (!pnc) {
if (PIM_DEBUG_TRACE) {
char buf[PREFIX2STR_BUFFER];
int pim_find_or_track_nexthop(struct prefix *addr, struct pim_upstream *up,
struct rp_info *rp,
struct pim_nexthop_cache *out_pnc);
-void pim_delete_tracked_nexthop(struct prefix *addr, struct pim_upstream *up,
- struct rp_info *rp);
-struct pim_nexthop_cache *pim_nexthop_cache_add(struct pim_rpf *rpf_addr);
-struct pim_nexthop_cache *pim_nexthop_cache_find(struct pim_rpf *rpf);
+void pim_delete_tracked_nexthop(struct pim_instance *pim, struct prefix *addr,
+ struct pim_upstream *up, struct rp_info *rp);
+struct pim_nexthop_cache *pim_nexthop_cache_add(struct pim_instance *pim,
+ struct pim_rpf *rpf_addr);
+struct pim_nexthop_cache *pim_nexthop_cache_find(struct pim_instance *pim,
+ struct pim_rpf *rpf);
uint32_t pim_compute_ecmp_hash(struct prefix *src, struct prefix *grp);
int pim_ecmp_nexthop_search(struct pim_nexthop_cache *pnc,
struct pim_nexthop *nexthop, struct prefix *src,
zlog_debug("%s: Deregister upstream %s addr %s with Zebra NHT",
__PRETTY_FUNCTION__, up->sg_str, buf);
}
- pim_delete_tracked_nexthop(&nht_p, up, NULL);
+ pim_delete_tracked_nexthop(pimg, &nht_p, up, NULL);
pim_upstream_free(up);
"%s: Attempting to create upstream(%s), Unable to RPF for source",
__PRETTY_FUNCTION__, up->sg_str);
+ pim_ifp = incoming->info;
nht_p.family = AF_INET;
nht_p.prefixlen = IPV4_MAX_BITLEN;
nht_p.u.prefix4 = up->upstream_addr;
- pim_delete_tracked_nexthop(&nht_p, up, NULL);
+ pim_delete_tracked_nexthop(pim_ifp->pim, &nht_p, up, NULL);
if (up->parent) {
listnode_delete(up->parent->sources, up);