Browse Source

qcacld-3.0: Cleanup rrm measurement data based on the index

Currently when rrm measurement is completed for a particular
index, the rrm_cleanup() is called which clears the measurement
data for all the index. This can cause failure with multiple
measurement request where on completion of the first request,
second request data structure will also be made null.

Pass the measurement index to rrm_cleanup() and clear only
that index data.

Change-Id: Ib712c2da3ddfea374d60b250dd474b08093b24c7
CRs-Fixed: 2695836
Pragaspathi Thilagaraj 4 years ago
parent
commit
c7a796fd53
3 changed files with 28 additions and 39 deletions
  1. 9 1
      core/mac/src/pe/include/rrm_api.h
  2. 2 1
      core/mac/src/pe/lim/lim_api.c
  3. 17 37
      core/mac/src/pe/rrm/rrm_api.c

+ 9 - 1
core/mac/src/pe/include/rrm_api.h

@@ -35,7 +35,15 @@
 
 QDF_STATUS rrm_initialize(struct mac_context *mac);
 
-QDF_STATUS rrm_cleanup(struct mac_context *mac);
+/**
+ * rrm_cleanup  - cleanup RRM measurement related data for the measurement
+ * index
+ * @mac: Pointer to mac context
+ * @idx: Measurement index
+ *
+ * Return: None
+ */
+void rrm_cleanup(struct mac_context *mac, uint8_t idx);
 
 QDF_STATUS rrm_process_link_measurement_request(struct mac_context *mac,
 						uint8_t *pRxPacketInfo,

+ 2 - 1
core/mac/src/pe/lim/lim_api.c

@@ -512,7 +512,8 @@ void lim_cleanup(struct mac_context *mac)
 	/* Now, finally reset the deferred message queue pointers */
 	lim_reset_deferred_msg_q(mac);
 
-	rrm_cleanup(mac);
+	for (i = 0; i < MAX_MEASUREMENT_REQUEST; i++)
+		rrm_cleanup(mac, i);
 
 	lim_ft_cleanup_all_ft_sessions(mac);
 

+ 17 - 37
core/mac/src/pe/rrm/rrm_api.c

@@ -1098,7 +1098,7 @@ end:
 
 	if (beacon_xmit_ind->fMeasureDone) {
 		pe_debug("Measurement done.");
-		rrm_cleanup(mac_ctx);
+		rrm_cleanup(mac_ctx, beacon_xmit_ind->measurement_idx);
 	}
 
 	if (report)
@@ -1203,7 +1203,7 @@ QDF_STATUS rrm_process_beacon_req(struct mac_context *mac_ctx, tSirMacAddr peer,
 		curr_req = mac_ctx->rrm.rrmPEContext.pCurrentReq[index];
 		if (curr_req) {
 			qdf_mem_free(curr_req);
-			curr_req = NULL;
+			mac_ctx->rrm.rrmPEContext.pCurrentReq[index] = NULL;
 		}
 
 		curr_req = qdf_mem_malloc(sizeof(*curr_req));
@@ -1224,7 +1224,7 @@ QDF_STATUS rrm_process_beacon_req(struct mac_context *mac_ctx, tSirMacAddr peer,
 		if (eRRM_SUCCESS != rrm_status) {
 			rrm_process_beacon_request_failure(mac_ctx,
 				session_entry, peer, rrm_status, index);
-			rrm_cleanup(mac_ctx);
+			rrm_cleanup(mac_ctx, index);
 		}
 	}
 
@@ -1423,9 +1423,11 @@ tpRRMCaps rrm_get_capabilities(struct mac_context *mac, struct pe_session *pe_se
 QDF_STATUS rrm_initialize(struct mac_context *mac)
 {
 	tpRRMCaps pRRMCaps = &mac->rrm.rrmPEContext.rrmEnabledCaps;
+	uint8_t i;
+
+	for (i = 0; i < MAX_MEASUREMENT_REQUEST; i++)
+		mac->rrm.rrmPEContext.pCurrentReq[i] = NULL;
 
-	mac->rrm.rrmPEContext.pCurrentReq[0] = NULL;
-	mac->rrm.rrmPEContext.pCurrentReq[1] = NULL;
 	mac->rrm.rrmPEContext.txMgmtPower = 0;
 	mac->rrm.rrmPEContext.DialogToken = 0;
 
@@ -1448,42 +1450,20 @@ QDF_STATUS rrm_initialize(struct mac_context *mac)
 	return QDF_STATUS_SUCCESS;
 }
 
-/* -------------------------------------------------------------------- */
-/**
- * rrm_cleanup
- *
- * FUNCTION:
- * cleanup RRM module
- *
- * LOGIC:
- *
- * ASSUMPTIONS:
- *
- * NOTE:
- *
- * @param mode
- * @param rate
- * @return None
- */
-
-QDF_STATUS rrm_cleanup(struct mac_context *mac)
+void rrm_cleanup(struct mac_context *mac, uint8_t idx)
 {
-	uint8_t i;
+	tpRRMReq cur_rrm_req = NULL;
 
-	for (i = 0; i < MAX_MEASUREMENT_REQUEST; i++) {
-		if (mac->rrm.rrmPEContext.pCurrentReq[i]) {
-			if (mac->rrm.rrmPEContext.pCurrentReq[i]->request.
-			    Beacon.reqIes.pElementIds)
-				qdf_mem_free(mac->rrm.rrmPEContext.
-					     pCurrentReq[i]->request.Beacon.
-					     reqIes.pElementIds);
+	cur_rrm_req = mac->rrm.rrmPEContext.pCurrentReq[idx];
+	if (!cur_rrm_req)
+		return;
 
-			qdf_mem_free(mac->rrm.rrmPEContext.pCurrentReq[i]);
-		}
-		mac->rrm.rrmPEContext.pCurrentReq[i] = NULL;
-	}
+	qdf_mem_free(cur_rrm_req->request.Beacon.reqIes.pElementIds);
+	cur_rrm_req->request.Beacon.reqIes.pElementIds = NULL;
+	cur_rrm_req->request.Beacon.reqIes.num = 0;
 
-	return QDF_STATUS_SUCCESS;
+	qdf_mem_free(cur_rrm_req);
+	mac->rrm.rrmPEContext.pCurrentReq[idx] = NULL;
 }
 
 /**