]> git.puffer.fish Git - mirror/frr.git/commitdiff
pimd: Make nexthop cache pim instance aware
authorDonald Sharp <sharpd@cumulusnetworks.com>
Fri, 19 May 2017 19:34:40 +0000 (15:34 -0400)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Mon, 24 Jul 2017 17:51:35 +0000 (13:51 -0400)
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
pimd/pim_iface.c
pimd/pim_nht.c
pimd/pim_nht.h
pimd/pim_rp.c
pimd/pim_upstream.c

index 778fc74bf53546579543e5c5de556755459118c7..c08e4c842bc46bc2239a7b11b133994f912561d9 100644 (file)
@@ -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);
index b852f8d1c526a6a172debed35e87a487849c0106..2d3180f7145869d6d0d114ac62c173dbc51d86d6 100644 (file)
@@ -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];
index fb8d83623577508463175713f714f2807d115877..d621f29cc234b4df26fcecc0b580dee87a9dee3c 100644 (file)
@@ -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,
index 36e5e4f6f0953ef7d54688cd9e4471b5d9e2cfc0..2ce813f6d2e1d88163615c7ff829e064a1bbe9b3 100644 (file)
@@ -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);
index e77b026cbfa376754ccbd2943da44fb3943d5a58..0391c3a7daaf784e439d0cdde11eca6535acc135 100644 (file)
@@ -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);