forked from Mirror/frr
pimd,pim6d: optimize multicast prefix generation
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>
This commit is contained in:
parent
f7720ab68f
commit
a507ca1163
|
@ -480,9 +480,7 @@ static void pim_instate_pend_list(struct bsgrp_node *bsgrp_node)
|
||||||
|
|
||||||
pend = bsm_rpinfos_first(bsgrp_node->partial_bsrp_list);
|
pend = bsm_rpinfos_first(bsgrp_node->partial_bsrp_list);
|
||||||
|
|
||||||
if (!pim_get_all_mcast_group(&group_all))
|
pim_get_all_mcast_group(&group_all);
|
||||||
return;
|
|
||||||
|
|
||||||
rp_all = pim_rp_find_match_group(pim, &group_all);
|
rp_all = pim_rp_find_match_group(pim, &group_all);
|
||||||
rn = route_node_lookup(pim->rp_table, &bsgrp_node->group);
|
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);
|
pim_delete_tracked_nexthop(pim, nht_p, NULL, rp_info);
|
||||||
|
|
||||||
if (!pim_get_all_mcast_group(&g_all))
|
pim_get_all_mcast_group(&g_all);
|
||||||
return;
|
|
||||||
|
|
||||||
rp_all = pim_rp_find_match_group(pim, &g_all);
|
rp_all = pim_rp_find_match_group(pim, &g_all);
|
||||||
|
|
||||||
if (rp_all == rp_info) {
|
if (rp_all == rp_info) {
|
||||||
|
|
|
@ -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")) {
|
else if (yang_dnode_get(args->dnode, "prefix-list")) {
|
||||||
plist = yang_dnode_get_string(args->dnode,
|
plist = yang_dnode_get_string(args->dnode,
|
||||||
"./prefix-list");
|
"./prefix-list");
|
||||||
if (!pim_get_all_mcast_group(&group)) {
|
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
result = pim_no_rp_cmd_worker(pim, rp_addr, group,
|
result = pim_no_rp_cmd_worker(pim, rp_addr, group,
|
||||||
plist, args->errmsg,
|
plist, args->errmsg,
|
||||||
args->errmsg_len);
|
args->errmsg_len);
|
||||||
|
@ -2923,11 +2917,7 @@ int routing_control_plane_protocols_control_plane_protocol_pim_address_family_rp
|
||||||
pim = vrf->info;
|
pim = vrf->info;
|
||||||
plist = yang_dnode_get_string(args->dnode, NULL);
|
plist = yang_dnode_get_string(args->dnode, NULL);
|
||||||
yang_dnode_get_pimaddr(&rp_addr, args->dnode, "../rp-address");
|
yang_dnode_get_pimaddr(&rp_addr, args->dnode, "../rp-address");
|
||||||
if (!pim_get_all_mcast_group(&group)) {
|
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;
|
|
||||||
}
|
|
||||||
return pim_rp_cmd_worker(pim, rp_addr, group, plist,
|
return pim_rp_cmd_worker(pim, rp_addr, group, plist,
|
||||||
args->errmsg, args->errmsg_len);
|
args->errmsg, args->errmsg_len);
|
||||||
}
|
}
|
||||||
|
@ -2954,11 +2944,7 @@ int routing_control_plane_protocols_control_plane_protocol_pim_address_family_rp
|
||||||
pim = vrf->info;
|
pim = vrf->info;
|
||||||
yang_dnode_get_pimaddr(&rp_addr, args->dnode, "../rp-address");
|
yang_dnode_get_pimaddr(&rp_addr, args->dnode, "../rp-address");
|
||||||
plist = yang_dnode_get_string(args->dnode, NULL);
|
plist = yang_dnode_get_string(args->dnode, NULL);
|
||||||
if (!pim_get_all_mcast_group(&group)) {
|
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;
|
|
||||||
}
|
|
||||||
return pim_no_rp_cmd_worker(pim, rp_addr, group, plist,
|
return pim_no_rp_cmd_worker(pim, rp_addr, group, plist,
|
||||||
args->errmsg, args->errmsg_len);
|
args->errmsg, args->errmsg_len);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -97,14 +97,7 @@ void pim_rp_init(struct pim_instance *pim)
|
||||||
|
|
||||||
rp_info = XCALLOC(MTYPE_PIM_RP, sizeof(*rp_info));
|
rp_info = XCALLOC(MTYPE_PIM_RP, sizeof(*rp_info));
|
||||||
|
|
||||||
if (!pim_get_all_mcast_group(&rp_info->group)) {
|
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;
|
|
||||||
}
|
|
||||||
rp_info->rp.rpf_addr = PIMADDR_ANY;
|
rp_info->rp.rpf_addr = PIMADDR_ANY;
|
||||||
|
|
||||||
listnode_add(pim->rp_list, rp_info);
|
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);
|
rp_info->plist = XSTRDUP(MTYPE_PIM_FILTER_NAME, plist);
|
||||||
} else {
|
} else {
|
||||||
|
pim_get_all_mcast_group(&group_all);
|
||||||
if (!pim_get_all_mcast_group(&group_all)) {
|
|
||||||
XFREE(MTYPE_PIM_RP, rp_info);
|
|
||||||
return PIM_GROUP_BAD_ADDRESS;
|
|
||||||
}
|
|
||||||
rp_all = pim_rp_find_match_group(pim, &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;
|
struct prefix group;
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
if (group_range == NULL)
|
if (group_range == NULL) {
|
||||||
result = pim_get_all_mcast_group(&group);
|
result = 0;
|
||||||
else
|
pim_get_all_mcast_group(&group);
|
||||||
|
} else
|
||||||
result = str2prefix(group_range, &group);
|
result = str2prefix(group_range, &group);
|
||||||
|
|
||||||
if (!result) {
|
if (!result) {
|
||||||
|
@ -789,9 +779,7 @@ int pim_rp_del(struct pim_instance *pim, pim_addr rp_addr, struct prefix group,
|
||||||
&nht_p);
|
&nht_p);
|
||||||
pim_delete_tracked_nexthop(pim, nht_p, NULL, rp_info);
|
pim_delete_tracked_nexthop(pim, nht_p, NULL, rp_info);
|
||||||
|
|
||||||
if (!pim_get_all_mcast_group(&g_all))
|
pim_get_all_mcast_group(&g_all);
|
||||||
return PIM_RP_BAD_ADDRESS;
|
|
||||||
|
|
||||||
rp_all = pim_rp_find_match_group(pim, &g_all);
|
rp_all = pim_rp_find_match_group(pim, &g_all);
|
||||||
|
|
||||||
if (rp_all == rp_info) {
|
if (rp_all == rp_info) {
|
||||||
|
|
|
@ -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 */
|
/* 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 PIM_IPV == 4
|
||||||
if (!str2prefix("224.0.0.0/4", prefix))
|
/* Precomputed version of: `str2prefix("224.0.0.0/4", prefix);` */
|
||||||
return 0;
|
prefix->family = AF_INET;
|
||||||
|
prefix->prefixlen = 4;
|
||||||
|
prefix->u.prefix4.s_addr = htonl(0xe0000000);
|
||||||
#else
|
#else
|
||||||
if (!str2prefix("FF00::0/8", prefix))
|
/* Precomputed version of: `str2prefix("FF00::0/8", prefix)` */
|
||||||
return 0;
|
prefix->family = AF_INET6;
|
||||||
|
prefix->prefixlen = 8;
|
||||||
|
prefix->u.prefix6.s6_addr[0] = 0xff;
|
||||||
#endif
|
#endif
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool pim_addr_is_multicast(pim_addr addr)
|
bool pim_addr_is_multicast(pim_addr addr)
|
||||||
|
|
|
@ -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,
|
enum filter_type pim_access_list_apply(struct access_list *access, const struct in_addr *source,
|
||||||
const struct in_addr *group);
|
const struct in_addr *group);
|
||||||
bool pim_is_group_filtered(struct pim_interface *pim_ifp, pim_addr *grp, pim_addr *src);
|
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);
|
bool pim_addr_is_multicast(pim_addr addr);
|
||||||
#endif /* PIM_UTIL_H */
|
#endif /* PIM_UTIL_H */
|
||||||
|
|
Loading…
Reference in a new issue