summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDonald Sharp <sharpd@cumulusnetworks.com>2017-05-19 15:34:40 -0400
committerDonald Sharp <sharpd@cumulusnetworks.com>2017-07-24 13:51:35 -0400
commitd0a4f55d5d6c2f771c29d7a9f2dc2fd49671345d (patch)
tree131b54d80a6369d44741a18d03fe8c02b8324d17
parentf509d94116a761ff38b2382ce806985d98f429d8 (diff)
pimd: Make nexthop cache pim instance aware
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
-rw-r--r--pimd/pim_iface.c2
-rw-r--r--pimd/pim_nht.c24
-rw-r--r--pimd/pim_nht.h10
-rw-r--r--pimd/pim_rp.c2
-rw-r--r--pimd/pim_upstream.c5
5 files changed, 24 insertions, 19 deletions
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);