From dfd360e0fa25f28b66dee0f3b80111d0dbab7386 Mon Sep 17 00:00:00 2001 From: Jeff Johnson Date: Fri, 10 Mar 2017 16:23:07 -0800 Subject: [PATCH] qcacld-3.0: Redesign wma_get_stats_rsp_buf() buffer length logic Currently wma_get_stats_rsp_buf() uses a loop to determine which mask bits are set, and based upon the loop iteration count it determines the size of the associated buffer. This calculation is fragile, however, in that it tightly couples the loop iteration count and eCsrRoamStatsClassTypes enumeration values. Since code under development will be removing some of the eCsrRoamStatsClassTypes enumerations, update this logic to remove the tight coupling. Change-Id: Ia6cda4c8181c44d25a9da27acffe6bd10ca3b4ed CRs-Fixed: 2020056 --- core/wma/src/wma_utils.c | 54 ++++++++++++++++------------------------ 1 file changed, 21 insertions(+), 33 deletions(-) diff --git a/core/wma/src/wma_utils.c b/core/wma/src/wma_utils.c index d5897266319c..74533a680de1 100644 --- a/core/wma/src/wma_utils.c +++ b/core/wma/src/wma_utils.c @@ -2255,51 +2255,39 @@ static tAniGetPEStatsRsp *wma_get_stats_rsp_buf (tAniGetPEStatsReq *get_stats_param) { tAniGetPEStatsRsp *stats_rsp_params; - uint32_t len, temp_mask, counter = 0; + uint32_t len, temp_mask; len = sizeof(tAniGetPEStatsRsp); temp_mask = get_stats_param->statsMask; - while (temp_mask) { - if (temp_mask & 1) { - switch (counter) { - case eCsrSummaryStats: - len += sizeof(tCsrSummaryStatsInfo); - break; - case eCsrGlobalClassAStats: - len += sizeof(tCsrGlobalClassAStatsInfo); - break; - case eCsrGlobalClassBStats: - len += sizeof(tCsrGlobalClassBStatsInfo); - break; - case eCsrGlobalClassCStats: - len += sizeof(tCsrGlobalClassCStatsInfo); - break; - case eCsrGlobalClassDStats: - len += sizeof(tCsrGlobalClassDStatsInfo); - break; - case eCsrPerStaStats: - len += sizeof(tCsrPerStaStatsInfo); - break; - case csr_per_chain_rssi_stats: - len += - sizeof(struct csr_per_chain_rssi_stats_info); - break; - } - } + if (temp_mask & (1 << eCsrSummaryStats)) + len += sizeof(tCsrSummaryStatsInfo); - counter++; - temp_mask >>= 1; - } + if (temp_mask & (1 << eCsrGlobalClassAStats)) + len += sizeof(tCsrGlobalClassAStatsInfo); - stats_rsp_params = (tAniGetPEStatsRsp *) qdf_mem_malloc(len); + if (temp_mask & (1 << eCsrGlobalClassBStats)) + len += sizeof(tCsrGlobalClassBStatsInfo); + + if (temp_mask & (1 << eCsrGlobalClassCStats)) + len += sizeof(tCsrGlobalClassCStatsInfo); + + if (temp_mask & (1 << eCsrGlobalClassDStats)) + len += sizeof(tCsrGlobalClassDStatsInfo); + + if (temp_mask & (1 << eCsrPerStaStats)) + len += sizeof(tCsrPerStaStatsInfo); + + if (temp_mask & (1 << csr_per_chain_rssi_stats)) + len += sizeof(struct csr_per_chain_rssi_stats_info); + + stats_rsp_params = qdf_mem_malloc(len); if (!stats_rsp_params) { WMA_LOGE("memory allocation failed for tAniGetPEStatsRsp"); QDF_ASSERT(0); return NULL; } - qdf_mem_zero(stats_rsp_params, len); stats_rsp_params->staId = get_stats_param->staId; stats_rsp_params->statsMask = get_stats_param->statsMask; stats_rsp_params->msgType = WMA_GET_STATISTICS_RSP;