]> git.puffer.fish Git - mirror/frr.git/commitdiff
pimd: Convert pim_rp.c to use 'struct pim_instance *'
authorDonald Sharp <sharpd@cumulusnetworks.com>
Sat, 20 May 2017 17:43:58 +0000 (13:43 -0400)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Mon, 24 Jul 2017 17:51:36 +0000 (13:51 -0400)
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
14 files changed:
pimd/pim_cmd.c
pimd/pim_instance.c
pimd/pim_instance.h
pimd/pim_mroute.c
pimd/pim_msdp.c
pimd/pim_register.c
pimd/pim_rp.c
pimd/pim_rp.h
pimd/pim_rpf.c
pimd/pim_rpf.h
pimd/pim_upstream.c
pimd/pim_vty.c
pimd/pim_zebra.c
pimd/pimd.c

index cb72dbd45f749a975efcf03fdd95654363c97873..d497f99672ba40b704fa9d861c6542d5b9369b3e 100644 (file)
@@ -3506,7 +3506,7 @@ DEFUN (show_ip_pim_rp,
        "JavaScript Object Notation\n")
 {
        u_char uj = use_json(argc, argv);
-       pim_rp_show_information(vty, uj);
+       pim_rp_show_information(pimg, vty, uj);
 
        return CMD_SUCCESS;
 }
@@ -3588,7 +3588,7 @@ DEFUN (show_ip_pim_nexthop_lookup,
                return CMD_WARNING;
        }
 
-       if (!pim_rp_set_upstream_addr(&vif_source, src_addr, grp_addr))
+       if (!pim_rp_set_upstream_addr(pimg, &vif_source, src_addr, grp_addr))
                return CMD_SUCCESS;
 
        memset(&pnc, 0, sizeof(struct pim_nexthop_cache));
@@ -4210,7 +4210,7 @@ DEFUN (show_ip_rib,
                return CMD_WARNING;
        }
 
-       if (pim_nexthop_lookup(&nexthop, addr, 0)) {
+       if (pim_nexthop_lookup(pimg, &nexthop, addr, 0)) {
                vty_out(vty,
                        "Failure querying RIB nexthop for unicast address %s\n",
                        addr_str);
index c2ca20d8187efa5a35c5ac0722b5aa060dd3fd56..398cf85fcbc05b38e8095d303320f06e95105857 100644 (file)
@@ -48,6 +48,8 @@ static void pim_instance_terminate(struct pim_instance *pim)
        if (pim->static_routes)
                list_free(pim->static_routes);
 
+       pim_rp_free(pim);
+
        pim_upstream_terminate(pim);
 
        XFREE(MTYPE_PIM_PIM_INSTANCE, pimg);
@@ -95,7 +97,10 @@ static struct pim_instance *pim_instance_init(struct vrf *vrf)
 
        pim_mroute_socket_enable(pim);
 
+       pim_rp_init(pim);
+
        pim_upstream_init(pim);
+
        return pim;
 }
 
index 79a0de79bc9abe24ea34d85acd8dd211bc423906..5df76952ac2f87883b689781dda69a7ab5b6246b 100644 (file)
@@ -61,6 +61,8 @@ struct pim_instance {
        struct list *upstream_list;
        struct hash *upstream_hash;
        struct timer_wheel *upstream_sg_wheel;
+
+       struct list *rp_list;
 };
 
 void pim_vrf_init(void);
index c77f312c98dbbeec275aa39bb81e1a58070b8dde..8b9269518c69b7f57dfd6e5fd3ae37c682a2bb8d 100644 (file)
@@ -462,8 +462,8 @@ static int pim_mroute_msg_wrvifwhole(int fd, struct interface *ifp,
                 */
                if (!PIM_UPSTREAM_FLAG_TEST_FHR(up->flags)) {
                        // No if channel, but upstream we are at the RP.
-                       if (pim_nexthop_lookup(&source, up->upstream_register,
-                                              0)
+                       if (pim_nexthop_lookup(pim_ifp->pim, &source,
+                                              up->upstream_register, 0)
                            == 0)
                                pim_register_stop_send(source.interface, &sg,
                                                       pim_ifp->primary_address,
@@ -477,8 +477,8 @@ static int pim_mroute_msg_wrvifwhole(int fd, struct interface *ifp,
                                               __PRETTY_FUNCTION__);
                        pim_upstream_set_sptbit(up, ifp);
                } else {
-                       if (I_am_RP(up->sg.grp)) {
-                               if (pim_nexthop_lookup(&source,
+                       if (I_am_RP(pim_ifp->pim, up->sg.grp)) {
+                               if (pim_nexthop_lookup(pim_ifp->pim, &source,
                                                       up->upstream_register, 0)
                                    == 0)
                                        pim_register_stop_send(
index 3f8ab37491d03c99a79084272fa5be2326c05395..8e118ae3af3c186712ee146ac80061cdbdbb316c 100644 (file)
@@ -138,7 +138,7 @@ static bool pim_msdp_sa_upstream_add_ok(struct pim_msdp_sa *sa,
                return false;
        }
        /* check if we are RP */
-       if (!I_am_RP(sa->sg.grp)) {
+       if (!I_am_RP(pimg, sa->sg.grp)) {
                return false;
        }
 
@@ -447,7 +447,7 @@ static bool pim_msdp_sa_local_add_ok(struct pim_upstream *up)
                return false;
        }
 
-       if (!I_am_RP(up->sg.grp)) {
+       if (!I_am_RP(pimg, up->sg.grp)) {
                /* we are not RP for the group */
                return false;
        }
index ce81db954bad3af5b2d061dccd1cde8a9bf282e8..bc7c5e3e0fe655b596e9bc6ab86d383c18a7decc 100644 (file)
@@ -320,7 +320,7 @@ int pim_register_recv(struct interface *ifp, struct in_addr dest_addr,
        sg.src = ip_hdr->ip_src;
        sg.grp = ip_hdr->ip_dst;
 
-       i_am_rp = I_am_RP(sg.grp);
+       i_am_rp = I_am_RP(pim_ifp->pim, sg.grp);
 
        if (PIM_DEBUG_PIM_REG) {
                char src_str[INET_ADDRSTRLEN];
index 0b154fb55226a17357860029512239571c60c9cc..969b28f7fb7443ce537ade031c02c2e1ef09611e 100644 (file)
@@ -45,9 +45,6 @@
 #include "pim_nht.h"
 
 
-static struct list *qpim_rp_list = NULL;
-static struct rp_info *tail = NULL;
-
 /* Cleanup pim->rpf_hash each node data */
 void pim_rp_list_hash_clean(void *data)
 {
@@ -93,13 +90,13 @@ int pim_rp_list_cmp(void *v1, void *v2)
        return 0;
 }
 
-void pim_rp_init(void)
+void pim_rp_init(struct pim_instance *pim)
 {
        struct rp_info *rp_info;
 
-       qpim_rp_list = list_new();
-       qpim_rp_list->del = (void (*)(void *))pim_rp_info_free;
-       qpim_rp_list->cmp = pim_rp_list_cmp;
+       pim->rp_list = list_new();
+       pim->rp_list->del = (void (*)(void *))pim_rp_info_free;
+       pim->rp_list->cmp = pim_rp_list_cmp;
 
        rp_info = XCALLOC(MTYPE_PIM_RP, sizeof(*rp_info));
 
@@ -114,28 +111,28 @@ void pim_rp_init(void)
        rp_info->rp.rpf_addr.family = AF_INET;
        rp_info->rp.rpf_addr.prefixlen = IPV4_MAX_PREFIXLEN;
        rp_info->rp.rpf_addr.u.prefix4.s_addr = INADDR_NONE;
-       tail = rp_info;
 
-       listnode_add(qpim_rp_list, rp_info);
+       listnode_add(pim->rp_list, rp_info);
 }
 
-void pim_rp_free(void)
+void pim_rp_free(struct pim_instance *pim)
 {
-       if (qpim_rp_list)
-               list_delete(qpim_rp_list);
-       qpim_rp_list = NULL;
+       if (pim->rp_list)
+               list_delete(pim->rp_list);
+       pim->rp_list = NULL;
 }
 
 /*
  * Given an RP's prefix-list, return the RP's rp_info for that prefix-list
  */
-static struct rp_info *pim_rp_find_prefix_list(struct in_addr rp,
+static struct rp_info *pim_rp_find_prefix_list(struct pim_instance *pim,
+                                              struct in_addr rp,
                                               const char *plist)
 {
        struct listnode *node;
        struct rp_info *rp_info;
 
-       for (ALL_LIST_ELEMENTS_RO(qpim_rp_list, node, rp_info)) {
+       for (ALL_LIST_ELEMENTS_RO(pim->rp_list, node, rp_info)) {
                if (rp.s_addr == rp_info->rp.rpf_addr.u.prefix4.s_addr
                    && rp_info->plist && strcmp(rp_info->plist, plist) == 0) {
                        return rp_info;
@@ -148,12 +145,12 @@ static struct rp_info *pim_rp_find_prefix_list(struct in_addr rp,
 /*
  * Return true if plist is used by any rp_info
  */
-static int pim_rp_prefix_list_used(const char *plist)
+static int pim_rp_prefix_list_used(struct pim_instance *pim, const char *plist)
 {
        struct listnode *node;
        struct rp_info *rp_info;
 
-       for (ALL_LIST_ELEMENTS_RO(qpim_rp_list, node, rp_info)) {
+       for (ALL_LIST_ELEMENTS_RO(pim->rp_list, node, rp_info)) {
                if (rp_info->plist && strcmp(rp_info->plist, plist) == 0) {
                        return 1;
                }
@@ -166,13 +163,14 @@ static int pim_rp_prefix_list_used(const char *plist)
  * Given an RP's address, return the RP's rp_info that is an exact match for
  * 'group'
  */
-static struct rp_info *pim_rp_find_exact(struct in_addr rp,
+static struct rp_info *pim_rp_find_exact(struct pim_instance *pim,
+                                        struct in_addr rp,
                                         struct prefix *group)
 {
        struct listnode *node;
        struct rp_info *rp_info;
 
-       for (ALL_LIST_ELEMENTS_RO(qpim_rp_list, node, rp_info)) {
+       for (ALL_LIST_ELEMENTS_RO(pim->rp_list, node, rp_info)) {
                if (rp.s_addr == rp_info->rp.rpf_addr.u.prefix4.s_addr
                    && prefix_same(&rp_info->group, group))
                        return rp_info;
@@ -184,13 +182,14 @@ static struct rp_info *pim_rp_find_exact(struct in_addr rp,
 /*
  * Given a group, return the rp_info for that group
  */
-static struct rp_info *pim_rp_find_match_group(struct prefix *group)
+static struct rp_info *pim_rp_find_match_group(struct pim_instance *pim,
+                                              struct prefix *group)
 {
        struct listnode *node;
        struct rp_info *rp_info;
        struct prefix_list *plist;
 
-       for (ALL_LIST_ELEMENTS_RO(qpim_rp_list, node, rp_info)) {
+       for (ALL_LIST_ELEMENTS_RO(pim->rp_list, node, rp_info)) {
                if (rp_info->plist) {
                        plist = prefix_list_lookup(AFI_IP, rp_info->plist);
 
@@ -218,13 +217,14 @@ static void pim_rp_refresh_group_to_rp_mapping()
        pim_msdp_i_am_rp_changed();
 }
 
-void pim_rp_prefix_list_update(struct prefix_list *plist)
+void pim_rp_prefix_list_update(struct pim_instance *pim,
+                              struct prefix_list *plist)
 {
        struct listnode *node;
        struct rp_info *rp_info;
        int refresh_needed = 0;
 
-       for (ALL_LIST_ELEMENTS_RO(qpim_rp_list, node, rp_info)) {
+       for (ALL_LIST_ELEMENTS_RO(pim->rp_list, node, rp_info)) {
                if (rp_info->plist
                    && strcmp(rp_info->plist, prefix_list_name(plist)) == 0) {
                        refresh_needed = 1;
@@ -319,7 +319,7 @@ int pim_rp_new(struct pim_instance *pim, const char *rp,
                /*
                 * Return if the prefix-list is already configured for this RP
                 */
-               if (pim_rp_find_prefix_list(rp_info->rp.rpf_addr.u.prefix4,
+               if (pim_rp_find_prefix_list(pim, rp_info->rp.rpf_addr.u.prefix4,
                                            plist)) {
                        XFREE(MTYPE_PIM_RP, rp_info);
                        return PIM_SUCCESS;
@@ -328,7 +328,7 @@ int pim_rp_new(struct pim_instance *pim, const char *rp,
                /*
                 * Barf if the prefix-list is already configured for an RP
                 */
-               if (pim_rp_prefix_list_used(plist)) {
+               if (pim_rp_prefix_list_used(pim, plist)) {
                        XFREE(MTYPE_PIM_RP, rp_info);
                        return PIM_RP_PFXLIST_IN_USE;
                }
@@ -336,7 +336,7 @@ int pim_rp_new(struct pim_instance *pim, const char *rp,
                /*
                 * Free any existing rp_info entries for this RP
                 */
-               for (ALL_LIST_ELEMENTS(qpim_rp_list, node, nnode,
+               for (ALL_LIST_ELEMENTS(pim->rp_list, node, nnode,
                                       tmp_rp_info)) {
                        if (rp_info->rp.rpf_addr.u.prefix4.s_addr
                            == tmp_rp_info->rp.rpf_addr.u.prefix4.s_addr) {
@@ -358,7 +358,7 @@ int pim_rp_new(struct pim_instance *pim, const char *rp,
                        XFREE(MTYPE_PIM_RP, rp_info);
                        return PIM_GROUP_BAD_ADDRESS;
                }
-               rp_all = pim_rp_find_match_group(&group_all);
+               rp_all = pim_rp_find_match_group(pim, &group_all);
 
                /*
                 * Barf if group is a non-multicast subnet
@@ -371,7 +371,7 @@ int pim_rp_new(struct pim_instance *pim, const char *rp,
                /*
                 * Remove any prefix-list rp_info entries for this RP
                 */
-               for (ALL_LIST_ELEMENTS(qpim_rp_list, node, nnode,
+               for (ALL_LIST_ELEMENTS(pim->rp_list, node, nnode,
                                       tmp_rp_info)) {
                        if (tmp_rp_info->plist
                            && rp_info->rp.rpf_addr.u.prefix4.s_addr
@@ -413,7 +413,7 @@ int pim_rp_new(struct pim_instance *pim, const char *rp,
                                        return PIM_RP_NO_PATH;
                        } else {
                                if (pim_nexthop_lookup(
-                                           &rp_all->rp.source_nexthop,
+                                           pim, &rp_all->rp.source_nexthop,
                                            rp_all->rp.rpf_addr.u.prefix4, 1)
                                    != 0)
                                        return PIM_RP_NO_PATH;
@@ -426,7 +426,7 @@ int pim_rp_new(struct pim_instance *pim, const char *rp,
                /*
                 * Return if the group is already configured for this RP
                 */
-               if (pim_rp_find_exact(rp_info->rp.rpf_addr.u.prefix4,
+               if (pim_rp_find_exact(pim, rp_info->rp.rpf_addr.u.prefix4,
                                      &rp_info->group)) {
                        XFREE(MTYPE_PIM_RP, rp_info);
                        return PIM_SUCCESS;
@@ -435,7 +435,7 @@ int pim_rp_new(struct pim_instance *pim, const char *rp,
                /*
                 * Barf if this group is already covered by some other RP
                 */
-               tmp_rp_info = pim_rp_find_match_group(&rp_info->group);
+               tmp_rp_info = pim_rp_find_match_group(pim, &rp_info->group);
 
                if (tmp_rp_info) {
                        if (tmp_rp_info->plist) {
@@ -458,7 +458,7 @@ int pim_rp_new(struct pim_instance *pim, const char *rp,
                }
        }
 
-       listnode_add_sort(qpim_rp_list, rp_info);
+       listnode_add_sort(pim->rp_list, rp_info);
 
        /* Register addr with Zebra NHT */
        nht_p.family = AF_INET;
@@ -480,7 +480,7 @@ int pim_rp_new(struct pim_instance *pim, const char *rp,
                                             &nht_p, &rp_info->group, 1))
                        return PIM_RP_NO_PATH;
        } else {
-               if (pim_nexthop_lookup(&rp_info->rp.source_nexthop,
+               if (pim_nexthop_lookup(pim, &rp_info->rp.source_nexthop,
                                       rp_info->rp.rpf_addr.u.prefix4, 1)
                    != 0)
                        return PIM_RP_NO_PATH;
@@ -515,9 +515,9 @@ int pim_rp_del(struct pim_instance *pim, const char *rp,
                return PIM_RP_BAD_ADDRESS;
 
        if (plist)
-               rp_info = pim_rp_find_prefix_list(rp_addr, plist);
+               rp_info = pim_rp_find_prefix_list(pim, rp_addr, plist);
        else
-               rp_info = pim_rp_find_exact(rp_addr, &group);
+               rp_info = pim_rp_find_exact(pim, rp_addr, &group);
 
        if (!rp_info)
                return PIM_RP_NOT_FOUND;
@@ -540,7 +540,7 @@ int pim_rp_del(struct pim_instance *pim, const char *rp,
        pim_delete_tracked_nexthop(pim, &nht_p, NULL, rp_info);
 
        str2prefix("224.0.0.0/4", &g_all);
-       rp_all = pim_rp_find_match_group(&g_all);
+       rp_all = pim_rp_find_match_group(pim, &g_all);
 
        if (rp_all == rp_info) {
                rp_all->rp.rpf_addr.family = AF_INET;
@@ -549,7 +549,7 @@ int pim_rp_del(struct pim_instance *pim, const char *rp,
                return PIM_SUCCESS;
        }
 
-       listnode_delete(qpim_rp_list, rp_info);
+       listnode_delete(pim->rp_list, rp_info);
        pim_rp_refresh_group_to_rp_mapping();
        return PIM_SUCCESS;
 }
@@ -561,7 +561,7 @@ void pim_rp_setup(struct pim_instance *pim)
        struct prefix nht_p;
        struct pim_nexthop_cache pnc;
 
-       for (ALL_LIST_ELEMENTS_RO(qpim_rp_list, node, rp_info)) {
+       for (ALL_LIST_ELEMENTS_RO(pim->rp_list, node, rp_info)) {
                if (rp_info->rp.rpf_addr.u.prefix4.s_addr == INADDR_NONE)
                        continue;
 
@@ -581,10 +581,9 @@ void pim_rp_setup(struct pim_instance *pim)
                                        "%s: NHT Local Nexthop not found for RP %s ",
                                        __PRETTY_FUNCTION__, buf);
                        }
-                       if (pim_nexthop_lookup(&rp_info->rp.source_nexthop,
-                                              rp_info->rp.rpf_addr.u.prefix4,
-                                              1)
-                           != 0)
+                       if (!pim_nexthop_lookup(
+                                   pim, &rp_info->rp.source_nexthop,
+                                   rp_info->rp.rpf_addr.u.prefix4, 1))
                                if (PIM_DEBUG_PIM_TRACE)
                                        zlog_debug(
                                                "Unable to lookup nexthop for rp specified");
@@ -601,11 +600,12 @@ void pim_rp_check_on_if_add(struct pim_interface *pim_ifp)
        struct listnode *node;
        struct rp_info *rp_info;
        bool i_am_rp_changed = false;
+       struct pim_instance *pim = pim_ifp->pim;
 
-       if (qpim_rp_list == NULL)
+       if (pim->rp_list == NULL)
                return;
 
-       for (ALL_LIST_ELEMENTS_RO(qpim_rp_list, node, rp_info)) {
+       for (ALL_LIST_ELEMENTS_RO(pim->rp_list, node, rp_info)) {
                if (pim_rpf_addr_is_inaddr_none(&rp_info->rp))
                        continue;
 
@@ -643,10 +643,10 @@ void pim_i_am_rp_re_evaluate(struct pim_instance *pim)
        bool i_am_rp_changed = false;
        int old_i_am_rp;
 
-       if (qpim_rp_list == NULL)
+       if (pim->rp_list == NULL)
                return;
 
-       for (ALL_LIST_ELEMENTS_RO(qpim_rp_list, node, rp_info)) {
+       for (ALL_LIST_ELEMENTS_RO(pim->rp_list, node, rp_info)) {
                if (pim_rpf_addr_is_inaddr_none(&rp_info->rp))
                        continue;
 
@@ -681,7 +681,7 @@ void pim_i_am_rp_re_evaluate(struct pim_instance *pim)
  *
  * Since we only have static RP, all groups are part of this RP
  */
-int pim_rp_i_am_rp(struct in_addr group)
+int pim_rp_i_am_rp(struct pim_instance *pim, struct in_addr group)
 {
        struct prefix g;
        struct rp_info *rp_info;
@@ -691,7 +691,7 @@ int pim_rp_i_am_rp(struct in_addr group)
        g.prefixlen = 32;
        g.u.prefix4 = group;
 
-       rp_info = pim_rp_find_match_group(&g);
+       rp_info = pim_rp_find_match_group(pim, &g);
 
        if (rp_info)
                return rp_info->i_am_rp;
@@ -714,7 +714,7 @@ struct pim_rpf *pim_rp_g(struct pim_instance *pim, struct in_addr group)
        g.prefixlen = 32;
        g.u.prefix4 = group;
 
-       rp_info = pim_rp_find_match_group(&g);
+       rp_info = pim_rp_find_match_group(pim, &g);
 
        if (rp_info) {
                struct prefix nht_p;
@@ -748,7 +748,7 @@ struct pim_rpf *pim_rp_g(struct pim_instance *pim, struct in_addr group)
                                        __PRETTY_FUNCTION__, buf, buf1);
                        }
                        pim_rpf_set_refresh_time();
-                       pim_nexthop_lookup(&rp_info->rp.source_nexthop,
+                       pim_nexthop_lookup(pim, &rp_info->rp.source_nexthop,
                                           rp_info->rp.rpf_addr.u.prefix4, 1);
                }
                return (&rp_info->rp);
@@ -766,8 +766,8 @@ struct pim_rpf *pim_rp_g(struct pim_instance *pim, struct in_addr group)
  * then return failure.
  *
  */
-int pim_rp_set_upstream_addr(struct in_addr *up, struct in_addr source,
-                            struct in_addr group)
+int pim_rp_set_upstream_addr(struct pim_instance *pim, struct in_addr *up,
+                            struct in_addr source, struct in_addr group)
 {
        struct rp_info *rp_info;
        struct prefix g;
@@ -777,7 +777,7 @@ int pim_rp_set_upstream_addr(struct in_addr *up, struct in_addr source,
        g.prefixlen = 32;
        g.u.prefix4 = group;
 
-       rp_info = pim_rp_find_match_group(&g);
+       rp_info = pim_rp_find_match_group(pim, &g);
 
        if ((pim_rpf_addr_is_inaddr_none(&rp_info->rp))
            && (source.s_addr == INADDR_ANY)) {
@@ -793,7 +793,7 @@ int pim_rp_set_upstream_addr(struct in_addr *up, struct in_addr source,
        return 1;
 }
 
-int pim_rp_config_write(struct vty *vty)
+int pim_rp_config_write(struct pim_instance *pim, struct vty *vty)
 {
        struct listnode *node;
        struct rp_info *rp_info;
@@ -801,7 +801,7 @@ int pim_rp_config_write(struct vty *vty)
        char group_buffer[32];
        int count = 0;
 
-       for (ALL_LIST_ELEMENTS_RO(qpim_rp_list, node, rp_info)) {
+       for (ALL_LIST_ELEMENTS_RO(pim->rp_list, node, rp_info)) {
                if (pim_rpf_addr_is_inaddr_none(&rp_info->rp))
                        continue;
 
@@ -835,14 +835,14 @@ int pim_rp_check_is_my_ip_address(struct pim_instance *pim,
        g.prefixlen = 32;
        g.u.prefix4 = group;
 
-       rp_info = pim_rp_find_match_group(&g);
+       rp_info = pim_rp_find_match_group(pim, &g);
        /*
         * See if we can short-cut some?
         * This might not make sense if we ever leave a static RP
         * type of configuration.
         * Note - Premature optimization might bite our patooeys' here.
         */
-       if (I_am_RP(group)) {
+       if (I_am_RP(pim, group)) {
                if (dest_addr.s_addr == rp_info->rp.rpf_addr.u.prefix4.s_addr)
                        return 1;
        }
@@ -853,7 +853,8 @@ int pim_rp_check_is_my_ip_address(struct pim_instance *pim,
        return 0;
 }
 
-void pim_rp_show_information(struct vty *vty, u_char uj)
+void pim_rp_show_information(struct pim_instance *pim, struct vty *vty,
+                            u_char uj)
 {
        struct rp_info *rp_info;
        struct rp_info *prev_rp_info = NULL;
@@ -869,7 +870,7 @@ void pim_rp_show_information(struct vty *vty, u_char uj)
                vty_out(vty,
                        "RP address       group/prefix-list   OIF         I am RP\n");
 
-       for (ALL_LIST_ELEMENTS_RO(qpim_rp_list, node, rp_info)) {
+       for (ALL_LIST_ELEMENTS_RO(pim->rp_list, node, rp_info)) {
                if (!pim_rpf_addr_is_inaddr_none(&rp_info->rp)) {
                        char buf[48];
 
@@ -968,7 +969,7 @@ void pim_resolve_rp_nh(struct pim_instance *pim)
        struct pim_nexthop_cache pnc;
        struct pim_neighbor *nbr = NULL;
 
-       for (ALL_LIST_ELEMENTS_RO(qpim_rp_list, node, rp_info)) {
+       for (ALL_LIST_ELEMENTS_RO(pim->rp_list, node, rp_info)) {
                if (rp_info->rp.rpf_addr.u.prefix4.s_addr == INADDR_NONE)
                        continue;
 
index 10346a3c3aae48952210139061b2e433f2b23f3f..40062c3d5078757769e81ff52a5db8a74b31b941 100644 (file)
@@ -34,21 +34,23 @@ struct rp_info {
        char *plist;
 };
 
-void pim_rp_init(void);
-void pim_rp_free(void);
+void pim_rp_init(struct pim_instance *pim);
+void pim_rp_free(struct pim_instance *pim);
+
 void pim_rp_list_hash_clean(void *data);
 
 int pim_rp_new(struct pim_instance *pim, const char *rp, const char *group,
               const char *plist);
 int pim_rp_del(struct pim_instance *pim, const char *rp, const char *group,
               const char *plist);
-void pim_rp_prefix_list_update(struct prefix_list *plist);
+void pim_rp_prefix_list_update(struct pim_instance *pim,
+                              struct prefix_list *plist);
 
-int pim_rp_config_write(struct vty *vty);
+int pim_rp_config_write(struct pim_instance *pim, struct vty *vty);
 
 void pim_rp_setup(struct pim_instance *pim);
 
-int pim_rp_i_am_rp(struct in_addr group);
+int pim_rp_i_am_rp(struct pim_instance *pim, struct in_addr group);
 void pim_rp_check_on_if_add(struct pim_interface *pim_ifp);
 void pim_i_am_rp_re_evaluate(struct pim_instance *pim);
 
@@ -56,15 +58,16 @@ int pim_rp_check_is_my_ip_address(struct pim_instance *pim,
                                  struct in_addr group,
                                  struct in_addr dest_addr);
 
-int pim_rp_set_upstream_addr(struct in_addr *up, struct in_addr source,
-                            struct in_addr group);
+int pim_rp_set_upstream_addr(struct pim_instance *pim, struct in_addr *up,
+                            struct in_addr source, struct in_addr group);
 
 struct pim_rpf *pim_rp_g(struct pim_instance *pim, struct in_addr group);
 
-#define I_am_RP(G)  pim_rp_i_am_rp ((G))
+#define I_am_RP(P, G)  pim_rp_i_am_rp ((P), (G))
 #define RP(P, G)       pim_rp_g ((P), (G))
 
-void pim_rp_show_information(struct vty *vty, u_char uj);
+void pim_rp_show_information(struct pim_instance *pim, struct vty *vty,
+                            u_char uj);
 void pim_resolve_rp_nh(struct pim_instance *pim);
 int pim_rp_list_cmp(void *v1, void *v2);
 #endif
index dfdf3b950c08c8760e83d9faa44135b0ef44afa4..c5b9f7524484b6b124fdc0ff4e7298c80904ab6f 100644 (file)
@@ -49,8 +49,8 @@ void pim_rpf_set_refresh_time(void)
                           __PRETTY_FUNCTION__, last_route_change_time);
 }
 
-int pim_nexthop_lookup(struct pim_nexthop *nexthop, struct in_addr addr,
-                      int neighbor_needed)
+int pim_nexthop_lookup(struct pim_instance *pim, struct pim_nexthop *nexthop,
+                      struct in_addr addr, int neighbor_needed)
 {
        struct pim_zlookup_nexthop nexthop_tab[MULTIPATH_NUM];
        struct pim_neighbor *nbr = NULL;
index 3a688a483ec5fef8550f7c5a7714304990b379e1..9f7ae86795f4f335c7e03b6aac7a757d523e9f13 100644 (file)
@@ -61,8 +61,8 @@ extern long long nexthop_lookups_avoided;
 unsigned int pim_rpf_hash_key(void *arg);
 int pim_rpf_equal(const void *arg1, const void *arg2);
 
-int pim_nexthop_lookup(struct pim_nexthop *nexthop, struct in_addr addr,
-                      int neighbor_needed);
+int pim_nexthop_lookup(struct pim_instance *pim, struct pim_nexthop *nexthop,
+                      struct in_addr addr, int neighbor_needed);
 enum pim_rpf_result pim_rpf_update(struct pim_upstream *up, struct pim_rpf *old,
                                   uint8_t is_new);
 
index bedfe0e9322a5fc2a5c6a1e3843446c9406c0131..96f49ec53fc8a900827d781bf842029c538f4bc2 100644 (file)
@@ -561,7 +561,7 @@ void pim_upstream_switch(struct pim_upstream *up,
                   RP.
                   If I am RP for G then send S,G prune to its IIF. */
                if (pim_upstream_is_sg_rpt(up) && up->parent
-                   && !I_am_RP(up->sg.grp)) {
+                   && !I_am_RP(up->channel_oil->pim, up->sg.grp)) {
                        if (PIM_DEBUG_PIM_TRACE_DETAIL)
                                zlog_debug(
                                        "%s: *,G IIF %s S,G IIF %s ",
@@ -619,7 +619,8 @@ pim_upstream_new(struct prefix_sg *sg, struct interface *incoming, int flags)
        up->sg = *sg;
        pim_str_sg_set(sg, up->sg_str);
        up = hash_get(pim->upstream_hash, up, hash_alloc_intern);
-       if (!pim_rp_set_upstream_addr(&up->upstream_addr, sg->src, sg->grp)) {
+       if (!pim_rp_set_upstream_addr(pim, &up->upstream_addr, sg->src,
+                                     sg->grp)) {
                if (PIM_DEBUG_TRACE)
                        zlog_debug("%s: Received a (*,G) with no RP configured",
                                   __PRETTY_FUNCTION__);
@@ -1083,7 +1084,7 @@ static int pim_upstream_keep_alive_timer(struct thread *t)
 
        up = THREAD_ARG(t);
 
-       if (I_am_RP(up->sg.grp)) {
+       if (I_am_RP(pimg, up->sg.grp)) {
                pim_br_clear_pmbr(&up->sg);
                /*
                 * We need to do more here :)
@@ -1176,7 +1177,7 @@ void pim_upstream_msdp_reg_timer_start(struct pim_upstream *up)
  */
 int pim_upstream_switch_to_spt_desired(struct prefix_sg *sg)
 {
-       if (I_am_RP(sg->grp))
+       if (I_am_RP(pimg, sg->grp))
                return 1;
 
        return 0;
@@ -1345,14 +1346,14 @@ static int pim_upstream_register_stop_timer(struct thread *t)
 
                if (((up->channel_oil->cc.lastused / 100)
                     > PIM_KEEPALIVE_PERIOD)
-                   && (I_am_RP(up->sg.grp))) {
+                   && (I_am_RP(pim_ifp->pim, up->sg.grp))) {
                        if (PIM_DEBUG_TRACE)
                                zlog_debug(
                                        "%s: Stop sending the register, because I am the RP and we haven't seen a packet in a while",
                                        __PRETTY_FUNCTION__);
                        return 0;
                }
-               rpg = RP(pimg, up->sg.grp);
+               rpg = RP(pim_ifp->pim, up->sg.grp);
                memset(&ip_hdr, 0, sizeof(struct ip));
                ip_hdr.ip_p = PIM_IP_PROTO_PIM;
                ip_hdr.ip_hl = 5;
@@ -1576,7 +1577,7 @@ static bool pim_upstream_kat_start_ok(struct pim_upstream *up)
                 * MUST be
                 * removed to handle spt turn-arounds correctly in a 3-tier clos
                 */
-               if (I_am_RP(up->sg.grp))
+               if (I_am_RP(pimg, up->sg.grp))
                        return true;
        }
 
index ad9432c0d81988fefe8fa883a89bbaf563a045c8..bcbceb75b978924aea9c302b3f32a71640eedb3e 100644 (file)
@@ -154,7 +154,7 @@ int pim_global_config_write(struct vty *vty)
                ++writes;
        }
 
-       writes += pim_rp_config_write(vty);
+       writes += pim_rp_config_write(pimg, vty);
 
        if (qpim_register_suppress_time
            != PIM_REGISTER_SUPPRESSION_TIME_DEFAULT) {
index 11ec9eb3500c99cf02a0b0fd2de24c301ec17334..f911293219a9aa62676c291c3715fdb81b7657e1 100644 (file)
@@ -487,7 +487,8 @@ void pim_scan_individual_oil(struct channel_oil *c_oil, int in_vif_index)
        int input_iface_vif_index;
        int old_vif_index;
 
-       if (!pim_rp_set_upstream_addr(&vif_source, c_oil->oil.mfcc_origin,
+       if (!pim_rp_set_upstream_addr(c_oil->pim, &vif_source,
+                                     c_oil->oil.mfcc_origin,
                                      c_oil->oil.mfcc_mcastgrp))
                return;
 
@@ -884,8 +885,8 @@ void igmp_source_forward_start(struct igmp_source *source)
                struct pim_nexthop nexthop;
                struct pim_upstream *up = NULL;
 
-               if (!pim_rp_set_upstream_addr(&vif_source, source->source_addr,
-                                             sg.grp))
+               if (!pim_rp_set_upstream_addr(pimg, &vif_source,
+                                             source->source_addr, sg.grp))
                        return;
 
                /* Register addr with Zebra NHT */
index 91cf17d747657c1b6bffb346484e20e939fe777a..58adff85d8c7fb685aecc98d1f53a0bd8ddb5adc 100644 (file)
@@ -73,9 +73,19 @@ int32_t qpim_register_probe_time = PIM_REGISTER_PROBE_TIME_DEFAULT;
 
 void pim_prefix_list_update(struct prefix_list *plist)
 {
-       pim_rp_prefix_list_update(plist);
-       pim_ssm_prefix_list_update(plist);
-       pim_upstream_spt_prefix_list_update(pimg, plist);
+       struct pim_instance *pim;
+       struct vrf *vrf;
+
+       RB_FOREACH(vrf, vrf_name_head, &vrfs_by_name)
+       {
+               pim = vrf->info;
+               if (!pim)
+                       continue;
+
+               pim_rp_prefix_list_update(pim, plist);
+               pim_ssm_prefix_list_update(plist);
+               pim_upstream_spt_prefix_list_update(pim, plist);
+       }
 }
 
 static void pim_free()
@@ -85,7 +95,6 @@ static void pim_free()
        pim_oil_terminate();
 
        pim_if_terminate();
-       pim_rp_free();
 
        pim_route_map_terminate();
 
@@ -98,8 +107,6 @@ void pim_init()
 {
        qpim_rp_keep_alive_time = PIM_RP_KEEPALIVE_PERIOD;
 
-       pim_rp_init();
-
        if (!inet_aton(PIM_ALL_PIM_ROUTERS, &qpim_all_pim_routers_addr)) {
                zlog_err(
                        "%s %s: could not solve %s to group address: errno=%d: %s",