]> git.puffer.fish Git - mirror/frr.git/commitdiff
pimd: Remove pimg from pim_nht.c in totality
authorDonald Sharp <sharpd@cumulusnetworks.com>
Fri, 19 May 2017 20:00:00 +0000 (16:00 -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_cmd.c
pimd/pim_nht.c
pimd/pim_nht.h
pimd/pim_rp.c
pimd/pim_rpf.c
pimd/pim_zebra.c

index 66cda198a7bf9e4f23db23b84b38f983b579f494..1c5571a2e79c849181ad839433a8d07c27e83850 100644 (file)
@@ -3600,9 +3600,10 @@ DEFUN (show_ip_pim_nexthop_lookup,
        memset(&nexthop, 0, sizeof(nexthop));
 
        if (pim_find_or_track_nexthop(pimg, &nht_p, NULL, NULL, &pnc))
-               pim_ecmp_nexthop_search(&pnc, &nexthop, &nht_p, &grp, 0);
+               pim_ecmp_nexthop_search(pimg, &pnc, &nexthop, &nht_p, &grp, 0);
        else
-               pim_ecmp_nexthop_lookup(&nexthop, vif_source, &nht_p, &grp, 0);
+               pim_ecmp_nexthop_lookup(pimg, &nexthop, vif_source, &nht_p,
+                                       &grp, 0);
 
        pim_addr_dump("<grp?>", &grp, grp_str, sizeof(grp_str));
        pim_addr_dump("<nexthop?>", &nexthop.mrib_nexthop_addr,
index 7978ad671fa69dde6cce4bb006205d4f9b88f6d0..ccb48aae516da1c2ae54b877c6dbf3afa188313b 100644 (file)
@@ -261,7 +261,7 @@ void pim_delete_tracked_nexthop(struct pim_instance *pim, struct prefix *addr,
 }
 
 /* Update RP nexthop info based on Nexthop update received from Zebra.*/
-int pim_update_rp_nh(struct pim_nexthop_cache *pnc)
+int pim_update_rp_nh(struct pim_instance *pim, struct pim_nexthop_cache *pnc)
 {
        struct listnode *node = NULL;
        struct rp_info *rp_info = NULL;
@@ -273,9 +273,9 @@ int pim_update_rp_nh(struct pim_nexthop_cache *pnc)
                        continue;
 
                // Compute PIM RPF using cached nexthop
-               ret = pim_ecmp_nexthop_search(pnc, &rp_info->rp.source_nexthop,
-                                             &rp_info->rp.rpf_addr,
-                                             &rp_info->group, 1);
+               ret = pim_ecmp_nexthop_search(
+                       pim, pnc, &rp_info->rp.source_nexthop,
+                       &rp_info->rp.rpf_addr, &rp_info->group, 1);
 
                if (PIM_DEBUG_TRACE) {
                        char rp_str[PREFIX_STRLEN];
@@ -299,14 +299,14 @@ int pim_update_rp_nh(struct pim_nexthop_cache *pnc)
    unresolved state and due to event like pim neighbor
    UP event if it can be resolved.
 */
-void pim_resolve_upstream_nh(struct prefix *nht_p)
+void pim_resolve_upstream_nh(struct pim_instance *pim, struct prefix *nht_p)
 {
        struct nexthop *nh_node = NULL;
        struct pim_nexthop_cache pnc;
        struct pim_neighbor *nbr = NULL;
 
        memset(&pnc, 0, sizeof(struct pim_nexthop_cache));
-       if (!pim_find_or_track_nexthop(pimg, nht_p, NULL, NULL, &pnc))
+       if (!pim_find_or_track_nexthop(pim, nht_p, NULL, NULL, &pnc))
                return;
 
        for (nh_node = pnc.nexthop; nh_node; nh_node = nh_node->next) {
@@ -314,7 +314,7 @@ void pim_resolve_upstream_nh(struct prefix *nht_p)
                        continue;
 
                struct interface *ifp1 =
-                       if_lookup_by_index(nh_node->ifindex, pimg->vrf_id);
+                       if_lookup_by_index(nh_node->ifindex, pim->vrf_id);
                nbr = pim_neighbor_find_if(ifp1);
                if (!nbr)
                        continue;
@@ -443,7 +443,7 @@ static int pim_update_upstream_nh(struct pim_instance *pim,
                }
        } /* for (pnc->upstream_list) */
 
-       for (ALL_LIST_ELEMENTS_RO(vrf_iflist(pimg->vrf_id), ifnode, ifp))
+       for (ALL_LIST_ELEMENTS_RO(vrf_iflist(pim->vrf_id), ifnode, ifp))
                if (ifp->info) {
                        struct pim_interface *pim_ifp = ifp->info;
                        struct pim_iface_upstream_switch *us;
@@ -493,7 +493,8 @@ uint32_t pim_compute_ecmp_hash(struct prefix *src, struct prefix *grp)
        return hash_val;
 }
 
-int pim_ecmp_nexthop_search(struct pim_nexthop_cache *pnc,
+int pim_ecmp_nexthop_search(struct pim_instance *pim,
+                           struct pim_nexthop_cache *pnc,
                            struct pim_nexthop *nexthop, struct prefix *src,
                            struct prefix *grp, int neighbor_needed)
 {
@@ -574,7 +575,7 @@ int pim_ecmp_nexthop_search(struct pim_nexthop_cache *pnc,
        for (nh_node = pnc->nexthop; nh_node && (found == 0);
             nh_node = nh_node->next) {
                first_ifindex = nh_node->ifindex;
-               ifp = if_lookup_by_index(first_ifindex, pimg->vrf_id);
+               ifp = if_lookup_by_index(first_ifindex, pim->vrf_id);
                if (!ifp) {
                        if (PIM_DEBUG_ZEBRA) {
                                char addr_str[INET_ADDRSTRLEN];
@@ -706,7 +707,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(pimg, &rpf);
+               pnc = pim_nexthop_cache_find(pim, &rpf);
                if (!pnc) {
                        if (PIM_DEBUG_TRACE) {
                                char buf[PREFIX2STR_BUFFER];
@@ -754,7 +755,7 @@ int pim_parse_nexthop_update(int command, struct zclient *zclient,
                                stream_get(&nexthop->gate.ipv6, s, 16);
                                nexthop->ifindex = stream_getl(s);
                                ifp1 = if_lookup_by_index(nexthop->ifindex,
-                                                         pimg->vrf_id);
+                                                         pim->vrf_id);
                                nbr = pim_neighbor_find_if(ifp1);
                                /* Overwrite with Nbr address as NH addr */
                                if (nbr) {
@@ -801,8 +802,7 @@ int pim_parse_nexthop_update(int command, struct zclient *zclient,
                                        nexthop->type, distance, metric);
                        }
 
-                       ifp = if_lookup_by_index(nexthop->ifindex,
-                                                pimg->vrf_id);
+                       ifp = if_lookup_by_index(nexthop->ifindex, pim->vrf_id);
                        if (!ifp) {
                                if (PIM_DEBUG_ZEBRA) {
                                        char buf[NEXTHOP_STRLEN];
@@ -869,14 +869,15 @@ int pim_parse_nexthop_update(int command, struct zclient *zclient,
        pim_rpf_set_refresh_time();
 
        if (listcount(pnc->rp_list))
-               pim_update_rp_nh(pnc);
+               pim_update_rp_nh(pim, pnc);
        if (listcount(pnc->upstream_list))
                pim_update_upstream_nh(pim, pnc);
 
        return 0;
 }
 
-int pim_ecmp_nexthop_lookup(struct pim_nexthop *nexthop, struct in_addr addr,
+int pim_ecmp_nexthop_lookup(struct pim_instance *pim,
+                           struct pim_nexthop *nexthop, struct in_addr addr,
                            struct prefix *src, struct prefix *grp,
                            int neighbor_needed)
 {
@@ -922,7 +923,7 @@ int pim_ecmp_nexthop_lookup(struct pim_nexthop *nexthop, struct in_addr addr,
        while (!found && (i < num_ifindex)) {
                first_ifindex = nexthop_tab[i].ifindex;
 
-               ifp = if_lookup_by_index(first_ifindex, pimg->vrf_id);
+               ifp = if_lookup_by_index(first_ifindex, pim->vrf_id);
                if (!ifp) {
                        if (PIM_DEBUG_ZEBRA) {
                                char addr_str[INET_ADDRSTRLEN];
@@ -1016,7 +1017,8 @@ int pim_ecmp_nexthop_lookup(struct pim_nexthop *nexthop, struct in_addr addr,
                return 0;
 }
 
-int pim_ecmp_fib_lookup_if_vif_index(struct in_addr addr, struct prefix *src,
+int pim_ecmp_fib_lookup_if_vif_index(struct pim_instance *pim,
+                                    struct in_addr addr, struct prefix *src,
                                     struct prefix *grp)
 {
        struct pim_zlookup_nexthop nexthop_tab[MULTIPATH_NUM];
@@ -1058,7 +1060,7 @@ int pim_ecmp_fib_lookup_if_vif_index(struct in_addr addr, struct prefix *src,
                zlog_debug(
                        "%s %s: found nexthop ifindex=%d (interface %s) for address %s",
                        __FILE__, __PRETTY_FUNCTION__, first_ifindex,
-                       ifindex2ifname(first_ifindex, pimg->vrf_id), addr_str);
+                       ifindex2ifname(first_ifindex, pim->vrf_id), addr_str);
        }
 
        vif_index = pim_if_find_vifindex_by_ifindex(first_ifindex);
index 6ed57c9ecbfc88d5ccb7265a0f16e793b9859053..01cfa6ff0d392e7261f7e0214f9516620ec5a827 100644 (file)
@@ -58,16 +58,19 @@ struct pim_nexthop_cache *pim_nexthop_cache_add(struct pim_instance *pim,
 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,
+int pim_ecmp_nexthop_search(struct pim_instance *pim,
+                           struct pim_nexthop_cache *pnc,
                            struct pim_nexthop *nexthop, struct prefix *src,
                            struct prefix *grp, int neighbor_needed);
-int pim_ecmp_nexthop_lookup(struct pim_nexthop *nexthop, struct in_addr addr,
+int pim_ecmp_nexthop_lookup(struct pim_instance *pim,
+                           struct pim_nexthop *nexthop, struct in_addr addr,
                            struct prefix *src, struct prefix *grp,
                            int neighbor_needed);
 void pim_sendmsg_zebra_rnh(struct zclient *zclient, struct pim_instance *pim,
                           struct pim_nexthop_cache *pnc, int command);
-int pim_update_rp_nh(struct pim_nexthop_cache *pnc);
-void pim_resolve_upstream_nh(struct prefix *nht_p);
-int pim_ecmp_fib_lookup_if_vif_index(struct in_addr addr, struct prefix *src,
+int pim_update_rp_nh(struct pim_instance *pim, struct pim_nexthop_cache *pnc);
+void pim_resolve_upstream_nh(struct pim_instance *pim, struct prefix *nht_p);
+int pim_ecmp_fib_lookup_if_vif_index(struct pim_instance *pim,
+                                    struct in_addr addr, struct prefix *src,
                                     struct prefix *grp);
 #endif
index 5c7915dfcc3f619d6ebab938775a3d4c1a6dd2b5..e235f70521b70d03a9f4292e09d363af2ee241bb 100644 (file)
@@ -405,8 +405,9 @@ int pim_rp_new(const char *rp, const char *group_range, const char *plist)
                        if (pim_find_or_track_nexthop(pimg, &nht_p, NULL,
                                                      rp_all, &pnc)) {
                                if (!pim_ecmp_nexthop_search(
-                                           &pnc, &rp_all->rp.source_nexthop,
-                                           &nht_p, &rp_all->group, 1))
+                                           pimg, &pnc,
+                                           &rp_all->rp.source_nexthop, &nht_p,
+                                           &rp_all->group, 1))
                                        return PIM_RP_NO_PATH;
                        } else {
                                if (pim_nexthop_lookup(
@@ -472,7 +473,8 @@ int pim_rp_new(const char *rp, const char *group_range, const char *plist)
 
        memset(&pnc, 0, sizeof(struct pim_nexthop_cache));
        if (pim_find_or_track_nexthop(pimg, &nht_p, NULL, rp_info, &pnc)) {
-               if (!pim_ecmp_nexthop_search(&pnc, &rp_info->rp.source_nexthop,
+               if (!pim_ecmp_nexthop_search(pimg, &pnc,
+                                            &rp_info->rp.source_nexthop,
                                             &nht_p, &rp_info->group, 1))
                        return PIM_RP_NO_PATH;
        } else {
@@ -566,7 +568,7 @@ void pim_rp_setup(void)
                memset(&pnc, 0, sizeof(struct pim_nexthop_cache));
                if (pim_find_or_track_nexthop(pimg, &nht_p, NULL, rp_info,
                                              &pnc))
-                       pim_ecmp_nexthop_search(&pnc,
+                       pim_ecmp_nexthop_search(pimg, &pnc,
                                                &rp_info->rp.source_nexthop,
                                                &nht_p, &rp_info->group, 1);
                else {
@@ -731,7 +733,7 @@ struct pim_rpf *pim_rp_g(struct in_addr group)
                memset(&pnc, 0, sizeof(struct pim_nexthop_cache));
                if (pim_find_or_track_nexthop(pimg, &nht_p, NULL, rp_info,
                                              &pnc))
-                       pim_ecmp_nexthop_search(&pnc,
+                       pim_ecmp_nexthop_search(pimg, &pnc,
                                                &rp_info->rp.source_nexthop,
                                                &nht_p, &rp_info->group, 1);
                else {
index 0946028e27e78494eda766d565f93764164ceb4b..22741230d87e4e21f8aa3a3a854482a4ec9d59cb 100644 (file)
@@ -221,7 +221,8 @@ enum pim_rpf_result pim_rpf_update(struct pim_upstream *up, struct pim_rpf *old,
        if (pim_find_or_track_nexthop(pimg, &nht_p, up, NULL, &pnc)) {
                if (pnc.nexthop_num) {
                        if (!pim_ecmp_nexthop_search(
-                                   &pnc, &up->rpf.source_nexthop, &src, &grp,
+                                   pimg, &pnc, &up->rpf.source_nexthop, &src,
+                                   &grp,
                                    !PIM_UPSTREAM_FLAG_TEST_FHR(up->flags)
                                            && !PIM_UPSTREAM_FLAG_TEST_SRC_IGMP(
                                                       up->flags)))
@@ -229,10 +230,10 @@ enum pim_rpf_result pim_rpf_update(struct pim_upstream *up, struct pim_rpf *old,
                }
        } else {
                if (!pim_ecmp_nexthop_lookup(
-                           &rpf->source_nexthop, up->upstream_addr, &src, &grp,
-                           !PIM_UPSTREAM_FLAG_TEST_FHR(up->flags)
-                                   && !PIM_UPSTREAM_FLAG_TEST_SRC_IGMP(
-                                              up->flags)))
+                           pimg, &rpf->source_nexthop, up->upstream_addr, &src,
+                           &grp, !PIM_UPSTREAM_FLAG_TEST_FHR(up->flags)
+                                         && !PIM_UPSTREAM_FLAG_TEST_SRC_IGMP(
+                                                    up->flags)))
                        return PIM_RPF_FAILURE;
        }
 
index a2ba0e8a23c1d114c30d748e89f6a7faa0d44e44..c0c591f4ac799613844b08e2fa19e78f171fb0ad 100644 (file)
@@ -364,7 +364,7 @@ static void scan_upstream_rpf_cache()
                nht_p.family = AF_INET;
                nht_p.prefixlen = IPV4_MAX_BITLEN;
                nht_p.u.prefix4.s_addr = up->upstream_addr.s_addr;
-               pim_resolve_upstream_nh(&nht_p);
+               pim_resolve_upstream_nh(pimg, &nht_p);
 
                old.source_nexthop.interface = up->rpf.source_nexthop.interface;
                old.source_nexthop.nbr = up->rpf.source_nexthop.nbr;
@@ -484,7 +484,7 @@ void pim_scan_individual_oil(struct channel_oil *c_oil, int in_vif_index)
                                __PRETTY_FUNCTION__, source_str, group_str);
                }
                input_iface_vif_index = pim_ecmp_fib_lookup_if_vif_index(
-                       vif_source, &src, &grp);
+                       c_oil->pim, vif_source, &src, &grp);
        }
 
        if (input_iface_vif_index < 1) {
@@ -879,8 +879,9 @@ void igmp_source_forward_start(struct igmp_source *source)
                                        memcpy(&nexthop,
                                               &up->rpf.source_nexthop,
                                               sizeof(struct pim_nexthop));
-                               pim_ecmp_nexthop_search(&out_pnc, &nexthop,
-                                                       &src, &grp, 0);
+                               pim_ecmp_nexthop_search(pimg, &out_pnc,
+                                                       &nexthop, &src, &grp,
+                                                       0);
                                if (nexthop.interface)
                                        input_iface_vif_index =
                                                pim_if_find_vifindex_by_ifindex(
@@ -903,8 +904,8 @@ void igmp_source_forward_start(struct igmp_source *source)
                        }
                } else
                        input_iface_vif_index =
-                               pim_ecmp_fib_lookup_if_vif_index(vif_source,
-                                                                &src, &grp);
+                               pim_ecmp_fib_lookup_if_vif_index(
+                                       pimg, vif_source, &src, &grp);
 
                if (PIM_DEBUG_ZEBRA) {
                        char buf2[INET_ADDRSTRLEN];
@@ -1116,8 +1117,9 @@ void pim_forward_start(struct pim_ifchannel *ch)
                                grp.u.prefix4 = up->sg.grp;
                                // Compute PIM RPF using Cached nexthop
                                if (pim_ecmp_nexthop_search(
-                                           &out_pnc, &up->rpf.source_nexthop,
-                                           &src, &grp, 0))
+                                           pimg, &out_pnc,
+                                           &up->rpf.source_nexthop, &src, &grp,
+                                           0))
                                        input_iface_vif_index =
                                                pim_if_find_vifindex_by_ifindex(
                                                        up->rpf.source_nexthop
@@ -1148,7 +1150,7 @@ void pim_forward_start(struct pim_ifchannel *ch)
                } else
                        input_iface_vif_index =
                                pim_ecmp_fib_lookup_if_vif_index(
-                                       up->upstream_addr, &src, &grp);
+                                       pimg, up->upstream_addr, &src, &grp);
 
                if (input_iface_vif_index < 1) {
                        if (PIM_DEBUG_PIM_TRACE) {