]> git.puffer.fish Git - mirror/frr.git/commitdiff
pimd,pim6d: optimize multicast prefix generation 17642/head
authorRafael Zalamena <rzalamena@opensourcerouting.org>
Fri, 13 Dec 2024 01:44:29 +0000 (22:44 -0300)
committerRafael Zalamena <rzalamena@opensourcerouting.org>
Fri, 13 Dec 2024 11:28:42 +0000 (08:28 -0300)
Fix Coverity Scan CID 1602463: make it impossible for the function to fail.

Hardcode the multicast prefix generation instead of calling `str2prefix()`
which caused unnecessary memory allocations and returned error values.

Signed-off-by: Rafael Zalamena <rzalamena@opensourcerouting.org>
pimd/pim_bsm.c
pimd/pim_nb_config.c
pimd/pim_rp.c
pimd/pim_util.c
pimd/pim_util.h

index 75104141ae8e1d49dc3e3ca166f1ba58f9aca9f7..1efdebdee1b713d99aefea7aa31abbee977bc264 100644 (file)
@@ -480,9 +480,7 @@ static void pim_instate_pend_list(struct bsgrp_node *bsgrp_node)
 
        pend = bsm_rpinfos_first(bsgrp_node->partial_bsrp_list);
 
-       if (!pim_get_all_mcast_group(&group_all))
-               return;
-
+       pim_get_all_mcast_group(&group_all);
        rp_all = pim_rp_find_match_group(pim, &group_all);
        rn = route_node_lookup(pim->rp_table, &bsgrp_node->group);
 
@@ -729,9 +727,7 @@ void pim_bsm_clear(struct pim_instance *pim)
 
                pim_delete_tracked_nexthop(pim, nht_p, NULL, rp_info);
 
-               if (!pim_get_all_mcast_group(&g_all))
-                       return;
-
+               pim_get_all_mcast_group(&g_all);
                rp_all = pim_rp_find_match_group(pim, &g_all);
 
                if (rp_all == rp_info) {
index 30895e037773f1523888acde670e77efe7a0e8ae..cf9ae21cc06758fc565cf07f38606744d215d6aa 100644 (file)
@@ -2825,13 +2825,7 @@ int routing_control_plane_protocols_control_plane_protocol_pim_address_family_rp
                else if (yang_dnode_get(args->dnode, "prefix-list")) {
                        plist = yang_dnode_get_string(args->dnode,
                                        "./prefix-list");
-                       if (!pim_get_all_mcast_group(&group)) {
-                               flog_err(
-                                       EC_LIB_DEVELOPMENT,
-                                       "Unable to convert 224.0.0.0/4 to prefix");
-                               return NB_ERR_INCONSISTENCY;
-                       }
-
+                       pim_get_all_mcast_group(&group);
                        result = pim_no_rp_cmd_worker(pim, rp_addr, group,
                                                      plist, args->errmsg,
                                                      args->errmsg_len);
@@ -2923,11 +2917,7 @@ int routing_control_plane_protocols_control_plane_protocol_pim_address_family_rp
                pim = vrf->info;
                plist = yang_dnode_get_string(args->dnode, NULL);
                yang_dnode_get_pimaddr(&rp_addr, args->dnode, "../rp-address");
-               if (!pim_get_all_mcast_group(&group)) {
-                       flog_err(EC_LIB_DEVELOPMENT,
-                                "Unable to convert 224.0.0.0/4 to prefix");
-                       return NB_ERR_INCONSISTENCY;
-               }
+               pim_get_all_mcast_group(&group);
                return pim_rp_cmd_worker(pim, rp_addr, group, plist,
                                         args->errmsg, args->errmsg_len);
        }
@@ -2954,11 +2944,7 @@ int routing_control_plane_protocols_control_plane_protocol_pim_address_family_rp
                pim = vrf->info;
                yang_dnode_get_pimaddr(&rp_addr, args->dnode, "../rp-address");
                plist = yang_dnode_get_string(args->dnode, NULL);
-               if (!pim_get_all_mcast_group(&group)) {
-                       flog_err(EC_LIB_DEVELOPMENT,
-                                "Unable to convert 224.0.0.0/4 to prefix");
-                       return NB_ERR_INCONSISTENCY;
-               }
+               pim_get_all_mcast_group(&group);
                return pim_no_rp_cmd_worker(pim, rp_addr, group, plist,
                                            args->errmsg, args->errmsg_len);
                break;
index 6266f42591e36a0ffc8d0049ba242ad5f602215c..44cc00622668b70f7cf36234e75461d9925ec493 100644 (file)
@@ -97,14 +97,7 @@ void pim_rp_init(struct pim_instance *pim)
 
        rp_info = XCALLOC(MTYPE_PIM_RP, sizeof(*rp_info));
 
-       if (!pim_get_all_mcast_group(&rp_info->group)) {
-               flog_err(EC_LIB_DEVELOPMENT,
-                        "Unable to convert all-multicast prefix");
-               list_delete(&pim->rp_list);
-               route_table_finish(pim->rp_table);
-               XFREE(MTYPE_PIM_RP, rp_info);
-               return;
-       }
+       pim_get_all_mcast_group(&rp_info->group);
        rp_info->rp.rpf_addr = PIMADDR_ANY;
 
        listnode_add(pim->rp_list, rp_info);
@@ -524,11 +517,7 @@ int pim_rp_new(struct pim_instance *pim, pim_addr rp_addr, struct prefix group,
 
                rp_info->plist = XSTRDUP(MTYPE_PIM_FILTER_NAME, plist);
        } else {
-
-               if (!pim_get_all_mcast_group(&group_all)) {
-                       XFREE(MTYPE_PIM_RP, rp_info);
-                       return PIM_GROUP_BAD_ADDRESS;
-               }
+               pim_get_all_mcast_group(&group_all);
                rp_all = pim_rp_find_match_group(pim, &group_all);
 
                /*
@@ -708,9 +697,10 @@ void pim_rp_del_config(struct pim_instance *pim, pim_addr rp_addr,
        struct prefix group;
        int result;
 
-       if (group_range == NULL)
-               result = pim_get_all_mcast_group(&group);
-       else
+       if (group_range == NULL) {
+               result = 0;
+               pim_get_all_mcast_group(&group);
+       } else
                result = str2prefix(group_range, &group);
 
        if (!result) {
@@ -789,9 +779,7 @@ int pim_rp_del(struct pim_instance *pim, pim_addr rp_addr, struct prefix group,
                           &nht_p);
        pim_delete_tracked_nexthop(pim, nht_p, NULL, rp_info);
 
-       if (!pim_get_all_mcast_group(&g_all))
-               return PIM_RP_BAD_ADDRESS;
-
+       pim_get_all_mcast_group(&g_all);
        rp_all = pim_rp_find_match_group(pim, &g_all);
 
        if (rp_all == rp_info) {
index 40404714e7fbdaea85abfe7317f4022fb6e0aff5..0aea24058730ebec20675987ba26395c9430f36c 100644 (file)
@@ -213,16 +213,21 @@ bool pim_is_group_filtered(struct pim_interface *pim_ifp, pim_addr *grp, pim_add
 
 
 /* This function returns all multicast group */
-int pim_get_all_mcast_group(struct prefix *prefix)
+void pim_get_all_mcast_group(struct prefix *prefix)
 {
+       memset(prefix, 0, sizeof(*prefix));
+
 #if PIM_IPV == 4
-       if (!str2prefix("224.0.0.0/4", prefix))
-               return 0;
+       /* Precomputed version of: `str2prefix("224.0.0.0/4", prefix);` */
+       prefix->family = AF_INET;
+       prefix->prefixlen = 4;
+       prefix->u.prefix4.s_addr = htonl(0xe0000000);
 #else
-       if (!str2prefix("FF00::0/8", prefix))
-               return 0;
+       /* Precomputed version of: `str2prefix("FF00::0/8", prefix)` */
+       prefix->family = AF_INET6;
+       prefix->prefixlen = 8;
+       prefix->u.prefix6.s6_addr[0] = 0xff;
 #endif
-       return 1;
 }
 
 bool pim_addr_is_multicast(pim_addr addr)
index dda93110b80d125f183b1ac0936abb6613abe4ea..a3d944b82b9694ab5901e2c6370c46efc482a6f9 100644 (file)
@@ -26,6 +26,6 @@ int pim_is_group_224_4(struct in_addr group_addr);
 enum filter_type pim_access_list_apply(struct access_list *access, const struct in_addr *source,
                                       const struct in_addr *group);
 bool pim_is_group_filtered(struct pim_interface *pim_ifp, pim_addr *grp, pim_addr *src);
-int pim_get_all_mcast_group(struct prefix *prefix);
+void pim_get_all_mcast_group(struct prefix *prefix);
 bool pim_addr_is_multicast(pim_addr addr);
 #endif /* PIM_UTIL_H */