]> git.proxmox.com Git - mirror_frr.git/blobdiff - pimd/pim_rp.c
Merge pull request #2731 from chiragshah6/mdev
[mirror_frr.git] / pimd / pim_rp.c
index d961aa4c4970cc86cde35c4395be620f3fc2a69f..c1623ec15e7ebd6779e3d409786418e07dff96cd 100644 (file)
@@ -115,13 +115,6 @@ void pim_rp_init(struct pim_instance *pim)
 
        rp_info = XCALLOC(MTYPE_PIM_RP, sizeof(*rp_info));
 
-       if (!rp_info) {
-               zlog_err("Unable to alloc rp_info");
-               route_table_finish(pim->rp_table);
-               list_delete_and_null(&pim->rp_list);
-               return;
-       }
-
        if (!str2prefix("224.0.0.0/4", &rp_info->group)) {
                zlog_err("Unable to convert 224.0.0.0/4 to prefix");
                list_delete_and_null(&pim->rp_list);
@@ -147,8 +140,9 @@ void pim_rp_init(struct pim_instance *pim)
 
        rn->info = rp_info;
        if (PIM_DEBUG_TRACE)
-               zlog_debug("Allocated: %p for rp_info: %p(224.0.0.0/4) Lock: %d",
-                          rn, rp_info, rn->lock);
+               zlog_debug(
+                       "Allocated: %p for rp_info: %p(224.0.0.0/4) Lock: %d",
+                       rn, rp_info, rn->lock);
 }
 
 void pim_rp_free(struct pim_instance *pim)
@@ -200,7 +194,7 @@ static int pim_rp_prefix_list_used(struct pim_instance *pim, const char *plist)
  */
 static struct rp_info *pim_rp_find_exact(struct pim_instance *pim,
                                         struct in_addr rp,
-                                        struct prefix *group)
+                                        const struct prefix *group)
 {
        struct listnode *node;
        struct rp_info *rp_info;
@@ -218,13 +212,13 @@ static struct rp_info *pim_rp_find_exact(struct pim_instance *pim,
  * Given a group, return the rp_info for that group
  */
 static struct rp_info *pim_rp_find_match_group(struct pim_instance *pim,
-                                              struct prefix *group)
+                                              const struct prefix *group)
 {
        struct listnode *node;
        struct rp_info *best = NULL;
        struct rp_info *rp_info;
        struct prefix_list *plist;
-       struct prefix *p, *bp;
+       const struct prefix *p, *bp;
        struct route_node *rn;
 
        bp = NULL;
@@ -232,7 +226,8 @@ static struct rp_info *pim_rp_find_match_group(struct pim_instance *pim,
                if (rp_info->plist) {
                        plist = prefix_list_lookup(AFI_IP, rp_info->plist);
 
-                       if (prefix_list_apply_which_prefix(plist, &p, group) == PREFIX_DENY)
+                       if (prefix_list_apply_which_prefix(plist, &p, group)
+                           == PREFIX_DENY)
                                continue;
 
                        if (!best) {
@@ -250,8 +245,9 @@ static struct rp_info *pim_rp_find_match_group(struct pim_instance *pim,
 
        rn = route_node_match(pim->rp_table, group);
        if (!rn) {
-               zlog_err("%s: BUG We should have found default group information\n",
-                        __PRETTY_FUNCTION__);
+               zlog_err(
+                       "%s: BUG We should have found default group information\n",
+                       __PRETTY_FUNCTION__);
                return best;
        }
 
@@ -260,8 +256,8 @@ static struct rp_info *pim_rp_find_match_group(struct pim_instance *pim,
                char buf[PREFIX_STRLEN];
 
                route_unlock_node(rn);
-               zlog_debug("Lookedup: %p for rp_info: %p(%s) Lock: %d",
-                          rn, rp_info,
+               zlog_debug("Lookedup: %p for rp_info: %p(%s) Lock: %d", rn,
+                          rp_info,
                           prefix2str(&rp_info->group, buf, sizeof(buf)),
                           rn->lock);
        }
@@ -362,8 +358,6 @@ int pim_rp_new(struct pim_instance *pim, const char *rp,
        struct route_node *rn;
 
        rp_info = XCALLOC(MTYPE_PIM_RP, sizeof(*rp_info));
-       if (!rp_info)
-               return PIM_MALLOC_FAIL;
 
        if (group_range == NULL)
                result = str2prefix("224.0.0.0/4", &rp_info->group);
@@ -483,10 +477,9 @@ int pim_rp_new(struct pim_instance *pim, const char *rp,
                                            &rp_all->group, 1))
                                        return PIM_RP_NO_PATH;
                        } else {
-                               if (pim_nexthop_lookup(
+                               if (!pim_ecmp_nexthop_lookup(
                                            pim, &rp_all->rp.source_nexthop,
-                                           rp_all->rp.rpf_addr.u.prefix4, 1)
-                                   != 0)
+                                           &nht_p, &rp_all->group, 1))
                                        return PIM_RP_NO_PATH;
                        }
                        pim_rp_check_interfaces(pim, rp_all);
@@ -531,19 +524,13 @@ int pim_rp_new(struct pim_instance *pim, const char *rp,
 
        listnode_add_sort(pim->rp_list, rp_info);
        rn = route_node_get(pim->rp_table, &rp_info->group);
-       if (!rn) {
-               char buf[PREFIX_STRLEN];
-               zlog_err("Failure to get route node for pim->rp_table: %s",
-                        prefix2str(&rp_info->group, buf, sizeof(buf)));
-               return PIM_MALLOC_FAIL;
-       }
        rn->info = rp_info;
 
        if (PIM_DEBUG_TRACE) {
                char buf[PREFIX_STRLEN];
 
-               zlog_debug("Allocated: %p for rp_info: %p(%s) Lock: %d",
-                          rn, rp_info,
+               zlog_debug("Allocated: %p for rp_info: %p(%s) Lock: %d", rn,
+                          rp_info,
                           prefix2str(&rp_info->group, buf, sizeof(buf)),
                           rn->lock);
        }
@@ -568,9 +555,8 @@ 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(pim, &rp_info->rp.source_nexthop,
-                                      rp_info->rp.rpf_addr.u.prefix4, 1)
-                   != 0)
+               if (!pim_ecmp_nexthop_lookup(pim, &rp_info->rp.source_nexthop,
+                                            &nht_p, &rp_info->group, 1))
                        return PIM_RP_NO_PATH;
        }
 
@@ -653,11 +639,12 @@ int pim_rp_del(struct pim_instance *pim, const char *rp,
                        if (PIM_DEBUG_TRACE) {
                                char buf[PREFIX_STRLEN];
 
-                               zlog_debug("%s:Found for Freeing: %p for rp_info: %p(%s) Lock: %d",
-                                          __PRETTY_FUNCTION__,
-                                          rn, rp_info,
-                                          prefix2str(&rp_info->group, buf, sizeof(buf)),
-                                          rn->lock);
+                               zlog_debug(
+                                       "%s:Found for Freeing: %p for rp_info: %p(%s) Lock: %d",
+                                       __PRETTY_FUNCTION__, rn, rp_info,
+                                       prefix2str(&rp_info->group, buf,
+                                                  sizeof(buf)),
+                                       rn->lock);
                        }
                        rn->info = NULL;
                        route_unlock_node(rn);
@@ -698,9 +685,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(
-                                   pim, &rp_info->rp.source_nexthop,
-                                   rp_info->rp.rpf_addr.u.prefix4, 1))
+                       if (!pim_ecmp_nexthop_lookup(pim,
+                                                    &rp_info->rp.source_nexthop,
+                                                     &nht_p, &rp_info->group, 1))
                                if (PIM_DEBUG_PIM_NHT_RP)
                                        zlog_debug(
                                                "Unable to lookup nexthop for rp specified");
@@ -864,9 +851,10 @@ struct pim_rpf *pim_rp_g(struct pim_instance *pim, struct in_addr group)
                                        "%s: Nexthop cache not found for RP %s grp %s register with Zebra",
                                        __PRETTY_FUNCTION__, buf, buf1);
                        }
-                       pim_rpf_set_refresh_time();
-                       pim_nexthop_lookup(pim, &rp_info->rp.source_nexthop,
-                                          rp_info->rp.rpf_addr.u.prefix4, 1);
+                       pim_rpf_set_refresh_time(pim);
+                       pim_ecmp_nexthop_lookup(pim,
+                                               &rp_info->rp.source_nexthop,
+                                               &nht_p, &rp_info->group, 1);
                }
                return (&rp_info->rp);
        }
@@ -972,7 +960,7 @@ int pim_rp_check_is_my_ip_address(struct pim_instance *pim,
 }
 
 void pim_rp_show_information(struct pim_instance *pim, struct vty *vty,
-                            u_char uj)
+                            uint8_t uj)
 {
        struct rp_info *rp_info;
        struct rp_info *prev_rp_info = NULL;