From: Donald Sharp Date: Fri, 19 May 2017 19:34:40 +0000 (-0400) Subject: pimd: Make nexthop cache pim instance aware X-Git-Tag: frr-4.0-dev~468^2~120 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=d0a4f55d5d6c2f771c29d7a9f2dc2fd49671345d;p=mirror%2Ffrr.git pimd: Make nexthop cache pim instance aware Signed-off-by: Donald Sharp --- diff --git a/pimd/pim_iface.c b/pimd/pim_iface.c index 778fc74bf5..c08e4c842b 100644 --- a/pimd/pim_iface.c +++ b/pimd/pim_iface.c @@ -676,7 +676,7 @@ void pim_if_addr_add(struct connected *ifc) rpf.rpf_addr.family = AF_INET; rpf.rpf_addr.prefixlen = IPV4_MAX_BITLEN; rpf.rpf_addr.u.prefix4 = ifc->address->u.prefix4; - pnc = pim_nexthop_cache_find(&rpf); + pnc = pim_nexthop_cache_find(pim_ifp->pim, &rpf); if (pnc) pim_sendmsg_zebra_rnh(zclient, pnc, ZEBRA_NEXTHOP_REGISTER); diff --git a/pimd/pim_nht.c b/pimd/pim_nht.c index b852f8d1c5..2d3180f714 100644 --- a/pimd/pim_nht.c +++ b/pimd/pim_nht.c @@ -93,7 +93,8 @@ void pim_sendmsg_zebra_rnh(struct zclient *zclient, 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; @@ -102,12 +103,13 @@ struct pim_nexthop_cache *pim_nexthop_cache_find(struct pim_rpf *rpf) 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; @@ -122,7 +124,7 @@ struct pim_nexthop_cache *pim_nexthop_cache_add(struct pim_rpf *rpf_addr) 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; @@ -165,9 +167,9 @@ int pim_find_or_track_nexthop(struct prefix *addr, struct pim_upstream *up, 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); @@ -218,8 +220,8 @@ int pim_find_or_track_nexthop(struct prefix *addr, struct pim_upstream *up, 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; @@ -229,7 +231,7 @@ void pim_delete_tracked_nexthop(struct prefix *addr, struct pim_upstream *up, /* 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); @@ -250,7 +252,7 @@ void pim_delete_tracked_nexthop(struct prefix *addr, struct pim_upstream *up, 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); @@ -701,7 +703,7 @@ int pim_parse_nexthop_update(int command, struct zclient *zclient, 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]; diff --git a/pimd/pim_nht.h b/pimd/pim_nht.h index fb8d836235..d621f29cc2 100644 --- a/pimd/pim_nht.h +++ b/pimd/pim_nht.h @@ -51,10 +51,12 @@ int pim_parse_nexthop_update(int command, struct zclient *zclient, 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, diff --git a/pimd/pim_rp.c b/pimd/pim_rp.c index 36e5e4f6f0..2ce813f6d2 100644 --- a/pimd/pim_rp.c +++ b/pimd/pim_rp.c @@ -532,7 +532,7 @@ int pim_rp_del(const char *rp, const char *group_range, const char *plist) zlog_debug("%s: Deregister RP addr %s with Zebra ", __PRETTY_FUNCTION__, buf); } - pim_delete_tracked_nexthop(&nht_p, NULL, rp_info); + pim_delete_tracked_nexthop(pimg, &nht_p, NULL, rp_info); str2prefix("224.0.0.0/4", &g_all); rp_all = pim_rp_find_match_group(&g_all); diff --git a/pimd/pim_upstream.c b/pimd/pim_upstream.c index e77b026cbf..0391c3a7da 100644 --- a/pimd/pim_upstream.c +++ b/pimd/pim_upstream.c @@ -234,7 +234,7 @@ struct pim_upstream *pim_upstream_del(struct pim_upstream *up, const char *name) 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); @@ -671,10 +671,11 @@ pim_upstream_new(struct prefix_sg *sg, struct interface *incoming, int flags) "%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);