Explorar el Código

qcacld-3.0: Reduce stack frame size while setting roam scan chan list

Reduce stack frame size of sme_set_ese_roam_scan_channel_list()
by allocating dynamic memory to channel lists.

Change-Id: Ic4a8c6ff557dfaf7c282636b96a7b0a5e9e121ef
CRs-Fixed: 2856563
Dundi Raviteja hace 4 años
padre
commit
a5116d1543
Se han modificado 1 ficheros con 31 adiciones y 10 borrados
  1. 31 10
      core/sme/src/common/sme_api.c

+ 31 - 10
core/sme/src/common/sme_api.c

@@ -1796,8 +1796,9 @@ QDF_STATUS sme_set_ese_roam_scan_channel_list(mac_handle_t mac_handle,
 {
 	struct mac_context *mac = MAC_CONTEXT(mac_handle);
 	QDF_STATUS status = QDF_STATUS_SUCCESS;
-	uint8_t oldChannelList[CFG_VALID_CHANNEL_LIST_LEN * 5] = { 0 };
-	uint8_t newChannelList[CFG_VALID_CHANNEL_LIST_LEN * 5] = { 0 };
+	uint16_t channel_list_len = CFG_VALID_CHANNEL_LIST_LEN * 5;
+	uint8_t *old_ch_list;
+	uint8_t *new_ch_list;
 	uint8_t i = 0, j = 0;
 	enum band_info band = -1;
 	uint32_t band_bitmap;
@@ -1811,31 +1812,46 @@ QDF_STATUS sme_set_ese_roam_scan_channel_list(mac_handle_t mac_handle,
 		return QDF_STATUS_E_INVAL;
 	}
 
+	old_ch_list = qdf_mem_malloc(channel_list_len);
+	if (!old_ch_list) {
+		sme_err("memory alloc failed for channel list");
+		return QDF_STATUS_E_NOMEM;
+	}
+
+	new_ch_list = qdf_mem_malloc(channel_list_len);
+	if (!new_ch_list) {
+		sme_err("memory alloc failed for channel list");
+		qdf_mem_free(old_ch_list);
+		return QDF_STATUS_E_NOMEM;
+	}
+
 	status = sme_acquire_global_lock(&mac->sme);
 	if (!QDF_IS_STATUS_SUCCESS(status))
-		return status;
+		goto error;
 
 	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(mac->psoc, sessionId,
 						    WLAN_LEGACY_SME_ID);
 	if (!vdev) {
 		sme_err("vdev object is NULL");
 		sme_release_global_lock(&mac->sme);
-		return QDF_STATUS_E_FAILURE;
+		status = QDF_STATUS_E_FAILURE;
+		goto error;
 	}
 
 	rso_cfg = wlan_cm_get_rso_config(vdev);
 	if (!rso_cfg) {
 		sme_release_global_lock(&mac->sme);
 		wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
-		return QDF_STATUS_E_FAILURE;
+		status = QDF_STATUS_E_FAILURE;
+		goto error;
 	}
 
 	chan_lst = &rso_cfg->roam_scan_freq_lst;
 
 	if (chan_lst->freq_list) {
 		for (i = 0; i < chan_lst->num_chan; i++) {
-			j += snprintf(oldChannelList + j,
-				sizeof(oldChannelList) - j, "%d",
+			j += snprintf(old_ch_list + j,
+				channel_list_len - j, "%d",
 				chan_lst->freq_list[i]);
 		}
 	}
@@ -1848,13 +1864,13 @@ QDF_STATUS sme_set_ese_roam_scan_channel_list(mac_handle_t mac_handle,
 		if (chan_lst->freq_list) {
 			j = 0;
 			for (i = 0; i < chan_lst->num_chan; i++) {
-				j += snprintf(newChannelList + j,
-					sizeof(newChannelList) - j, "%d",
+				j += snprintf(new_ch_list + j,
+					channel_list_len - j, "%d",
 					chan_lst->freq_list[i]);
 			}
 		}
 		sme_debug("ESE roam scan chnl list successfully set to %s-old value is %s",
-			  newChannelList, oldChannelList);
+			  new_ch_list, old_ch_list);
 	}
 	wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
 
@@ -1863,6 +1879,11 @@ QDF_STATUS sme_set_ese_roam_scan_channel_list(mac_handle_t mac_handle,
 				    REASON_CHANNEL_LIST_CHANGED);
 
 	sme_release_global_lock(&mac->sme);
+
+error:
+	qdf_mem_free(new_ch_list);
+	qdf_mem_free(old_ch_list);
+
 	return status;
 }