]> 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 5c7561f586432227a3a81e78b3cdf06ac535f97b..c1623ec15e7ebd6779e3d409786418e07dff96cd 100644 (file)
@@ -51,8 +51,7 @@ void pim_rp_list_hash_clean(void *data)
 {
        struct pim_nexthop_cache *pnc = (struct pim_nexthop_cache *)data;
 
-       list_delete(pnc->rp_list);
-       pnc->rp_list = NULL;
+       list_delete_and_null(&pnc->rp_list);
 
        hash_clean(pnc->upstream_hash, NULL);
        hash_free(pnc->upstream_hash);
@@ -110,22 +109,15 @@ void pim_rp_init(struct pim_instance *pim)
        pim->rp_table = route_table_init();
        if (!pim->rp_table) {
                zlog_err("Unable to alloc rp_table");
-               list_delete(pim->rp_list);
+               list_delete_and_null(&pim->rp_list);
                return;
        }
 
        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(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(pim->rp_list);
+               list_delete_and_null(&pim->rp_list);
                route_table_finish(pim->rp_table);
                XFREE(MTYPE_PIM_RP, rp_info);
                return;
@@ -140,7 +132,7 @@ void pim_rp_init(struct pim_instance *pim)
        rn = route_node_get(pim->rp_table, &rp_info->group);
        if (!rn) {
                zlog_err("Failure to get route node for pim->rp_table");
-               list_delete(pim->rp_list);
+               list_delete_and_null(&pim->rp_list);
                route_table_finish(pim->rp_table);
                XFREE(MTYPE_PIM_RP, rp_info);
                return;
@@ -148,15 +140,15 @@ 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)
 {
        if (pim->rp_list)
-               list_delete(pim->rp_list);
-       pim->rp_list = NULL;
+               list_delete_and_null(&pim->rp_list);
 }
 
 /*
@@ -202,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;
@@ -220,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;
@@ -234,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) {
@@ -252,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;
        }
 
@@ -262,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);
        }
@@ -334,11 +328,10 @@ static int pim_rp_check_interface_addrs(struct rp_info *rp_info,
 static void pim_rp_check_interfaces(struct pim_instance *pim,
                                    struct rp_info *rp_info)
 {
-       struct listnode *node;
        struct interface *ifp;
 
        rp_info->i_am_rp = 0;
-       for (ALL_LIST_ELEMENTS_RO(vrf_iflist(pim->vrf_id), node, ifp)) {
+       FOR_ALL_INTERFACES (pim->vrf, ifp) {
                struct pim_interface *pim_ifp = ifp->info;
 
                if (!pim_ifp)
@@ -365,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);
@@ -486,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);
@@ -534,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);
        }
@@ -571,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;
        }
 
@@ -656,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);
@@ -701,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");
@@ -867,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);
        }
@@ -975,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;