From 8345f3d0ec13ef98cfee6c7e8602d76315fb8f60 Mon Sep 17 00:00:00 2001 From: Sandeep Puligilla Date: Mon, 22 Oct 2018 15:43:48 -0700 Subject: [PATCH] qcacld-3.0: Allocate scan filter memory from dynamic memory pool csr_scan_get_result API defined 'struct scan_filter' of size 800bytes on stack and larger size memory blocks on stack is not preferred because the stack size is limited. Modified the memory allocation to dyanmic for scan filter. Change-Id: I40cb0d97e0451d50aca3e9485327a4ce709e6020 CRs-Fixed: 2332496 --- core/sme/src/csr/csr_api_scan.c | 47 ++++++++++++++++++++++++--------- 1 file changed, 35 insertions(+), 12 deletions(-) diff --git a/core/sme/src/csr/csr_api_scan.c b/core/sme/src/csr/csr_api_scan.c index 0eddcff44860..96516a0c9e8c 100644 --- a/core/sme/src/csr/csr_api_scan.c +++ b/core/sme/src/csr/csr_api_scan.c @@ -2950,7 +2950,7 @@ QDF_STATUS csr_scan_get_result(tpAniSirGlobal mac_ctx, QDF_STATUS status; struct scan_result_list *ret_list = NULL; qdf_list_t *list = NULL; - struct scan_filter filter = {0}; + struct scan_filter *filter = NULL; struct wlan_objmgr_pdev *pdev = NULL; if (results) @@ -2958,14 +2958,19 @@ QDF_STATUS csr_scan_get_result(tpAniSirGlobal mac_ctx, pdev = wlan_objmgr_get_pdev_by_id(mac_ctx->psoc, 0, WLAN_LEGACY_MAC_ID); - if (!pdev) { sme_err("pdev is NULL"); return QDF_STATUS_E_INVAL; } if (pFilter) { - status = csr_prepare_scan_filter(mac_ctx, pFilter, &filter); + filter = qdf_mem_malloc(sizeof(*filter)); + if (!filter) { + status = QDF_STATUS_E_NOMEM; + goto error; + } + + status = csr_prepare_scan_filter(mac_ctx, pFilter, filter); if (QDF_IS_STATUS_ERROR(status)) { sme_err("Prepare filter failed"); goto error; @@ -2973,7 +2978,7 @@ QDF_STATUS csr_scan_get_result(tpAniSirGlobal mac_ctx, } list = ucfg_scan_get_result(pdev, - pFilter ? &filter : NULL); + pFilter ? filter : NULL); if (list) sme_debug("num_entries %d", qdf_list_size(list)); @@ -3012,6 +3017,8 @@ QDF_STATUS csr_scan_get_result(tpAniSirGlobal mac_ctx, } error: + if (filter) + qdf_mem_free(filter); if (list) ucfg_scan_purge_results(list); if (pdev) @@ -3114,23 +3121,39 @@ QDF_STATUS csr_scan_flush_result(tpAniSirGlobal mac_ctx) QDF_STATUS csr_scan_flush_selective_result(tpAniSirGlobal mac_ctx, bool flush_p2p) { - struct scan_filter filter = {0}; + struct scan_filter *filter; + QDF_STATUS status; - filter.p2p_results = flush_p2p; - return csr_flush_scan_results(mac_ctx, &filter); + filter = qdf_mem_malloc(sizeof(*filter)); + if (!filter) { + status = QDF_STATUS_E_NOMEM; + goto end; + } + filter->p2p_results = flush_p2p; + status = csr_flush_scan_results(mac_ctx, filter); + if (filter) + qdf_mem_free(filter); +end: + return status; } static inline void csr_flush_bssid(tpAniSirGlobal mac_ctx, uint8_t *bssid) { - struct scan_filter filter = {0}; + struct scan_filter *filter; - filter.num_of_bssid = 1; - qdf_mem_copy(filter.bssid_list[0].bytes, - bssid, QDF_MAC_ADDR_SIZE); + filter = qdf_mem_malloc(sizeof(*filter)); + if (!filter) + return; - csr_flush_scan_results(mac_ctx, &filter); + filter->num_of_bssid = 1; + qdf_mem_copy(filter->bssid_list[0].bytes, + bssid, QDF_MAC_ADDR_SIZE); + + csr_flush_scan_results(mac_ctx, filter); sme_debug("Removed BSS entry:%pM", bssid); + if (filter) + qdf_mem_free(filter); } void csr_scan_flush_bss_entry(tpAniSirGlobal mac_ctx,