Quellcode durchsuchen

qcacld-3.0: Fix the issue in processing the del_tspec req

SME qos expects the RIC data and RIC data length to process the
add_ts response after roaming and updates the qos state to QOS_ON
after the successful processing. RIC data is included in re-assoc
response frame and updated in pe session.

Since the RIC data info is not given to SME qos in roam sync event
processing, qos state is not updated, hence the del_tspec command
is buffered and not processed. Send the RIC data info to SME qos
in roam sync processing so that the SME qos state is updated properly
and processes any buffered commands.

Change-Id: I7551b0bab4f11fe2d68c014cf89834ba199ad5ff
CRs-Fixed: 1010374
Kiran Kumar Lokere vor 9 Jahren
Ursprung
Commit
ba3b431b29

+ 26 - 0
core/mac/src/pe/lim/lim_api.c

@@ -1878,6 +1878,7 @@ QDF_STATUS pe_roam_synch_callback(tpAniSirGlobal mac_ctx,
 	tpAddBssParams add_bss_params;
 	uint8_t local_nss;
 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
+	uint16_t join_rsp_len;
 
 	if (!roam_sync_ind_ptr) {
 		lim_log(mac_ctx, LOGE, FL("LFR3:roam_sync_ind_ptr is NULL"));
@@ -1987,6 +1988,31 @@ QDF_STATUS pe_roam_synch_callback(tpAniSirGlobal mac_ctx,
 	curr_sta_ds->nss = local_nss;
 	ft_session_ptr->limMlmState = eLIM_MLM_LINK_ESTABLISHED_STATE;
 	lim_init_tdls_data(mac_ctx, ft_session_ptr);
+	join_rsp_len = ft_session_ptr->RICDataLen + sizeof(tSirSmeJoinRsp) -
+			sizeof(uint8_t);
+	roam_sync_ind_ptr->join_rsp = qdf_mem_malloc(join_rsp_len);
+	if (NULL == roam_sync_ind_ptr->join_rsp) {
+		lim_log(mac_ctx, LOGE, FL("LFR3:mem alloc failed"));
+		ft_session_ptr->bRoamSynchInProgress = false;
+		if (mac_ctx->roam.pReassocResp)
+			qdf_mem_free(mac_ctx->roam.pReassocResp);
+		mac_ctx->roam.pReassocResp = NULL;
+		return QDF_STATUS_E_NOMEM;
+	}
+	qdf_mem_zero(roam_sync_ind_ptr->join_rsp, join_rsp_len);
+
+	lim_log(mac_ctx, LOG1, FL("Session RicLength = %d"),
+			ft_session_ptr->RICDataLen);
+	if (ft_session_ptr->ricData != NULL) {
+		roam_sync_ind_ptr->join_rsp->parsedRicRspLen =
+			ft_session_ptr->RICDataLen;
+		qdf_mem_copy(roam_sync_ind_ptr->join_rsp->frames,
+				ft_session_ptr->ricData,
+				roam_sync_ind_ptr->join_rsp->parsedRicRspLen);
+		qdf_mem_free(ft_session_ptr->ricData);
+		ft_session_ptr->ricData = NULL;
+		ft_session_ptr->RICDataLen = 0;
+	}
 	roam_sync_ind_ptr->join_rsp->vht_channel_width =
 		ft_session_ptr->ch_width;
 	roam_sync_ind_ptr->join_rsp->staId = curr_sta_ds->staIndex;

+ 14 - 0
core/sme/src/csr/csr_api_roam.c

@@ -18723,6 +18723,7 @@ void csr_roam_synch_callback(tpAniSirGlobal mac_ctx,
 	struct qdf_mac_addr bcast_mac = QDF_MAC_ADDR_BROADCAST_INITIALIZER;
 	tpAddBssParams add_bss_params;
 	QDF_STATUS status = QDF_STATUS_SUCCESS;
+	uint16_t len;
 #ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
 	tSirSmeHTProfile *src_profile = NULL;
 	tCsrRoamHTProfile *dst_profile = NULL;
@@ -18883,6 +18884,19 @@ void csr_roam_synch_callback(tpAniSirGlobal mac_ctx,
 			FL("LFR3:Clear Connected info"));
 	csr_roam_free_connected_info(mac_ctx,
 			&session->connectedInfo);
+	len = roam_synch_data->join_rsp->parsedRicRspLen;
+	QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
+			FL("LFR3: RIC length - %d"), len);
+	if (len) {
+		session->connectedInfo.pbFrames =
+			qdf_mem_malloc(len);
+		if (session->connectedInfo.pbFrames != NULL) {
+			qdf_mem_copy(session->connectedInfo.pbFrames,
+				roam_synch_data->join_rsp->frames, len);
+			session->connectedInfo.nRICRspLength =
+				roam_synch_data->join_rsp->parsedRicRspLen;
+		}
+	}
 	conn_profile->vht_channel_width =
 		roam_synch_data->join_rsp->vht_channel_width;
 	add_bss_params = (tpAddBssParams)roam_synch_data->add_bss_params;

+ 5 - 5
core/sme/src/csr/csr_neighbor_roam.c

@@ -1397,8 +1397,8 @@ static void csr_neighbor_roam_info_ctx_init(
 		ngbr_roam_info->is11rAssoc = true;
 	} else
 		ngbr_roam_info->is11rAssoc = false;
-	NEIGHBOR_ROAM_DEBUG(pMac, LOG2, FL("11rAssoc is = %d"),
-		ngbr_roam_info->is11rAssoc);
+	QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO_HIGH,
+			FL("11rAssoc is = %d"), ngbr_roam_info->is11rAssoc);
 
 #ifdef FEATURE_WLAN_ESE
 	/* Based on the auth scheme tell if we are 11r */
@@ -1408,9 +1408,9 @@ static void csr_neighbor_roam_info_ctx_init(
 		ngbr_roam_info->isESEAssoc = true;
 	} else
 		ngbr_roam_info->isESEAssoc = false;
-	NEIGHBOR_ROAM_DEBUG(pMac, LOG2,
-		FL("isESEAssoc is = %d ft = %d"),
-		ngbr_roam_info->isESEAssoc, init_ft_flag);
+	QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO_HIGH,
+			FL("isESEAssoc is = %d ft = %d"),
+			ngbr_roam_info->isESEAssoc, init_ft_flag);
 #endif
 	/* If "Legacy Fast Roaming" is enabled */
 	if (csr_roam_is_fast_roam_enabled(pMac, session_id))

+ 6 - 1
core/sme/src/qos/sme_qos.c

@@ -4632,7 +4632,12 @@ QDF_STATUS sme_qos_process_reassoc_success_ev(tpAniSirGlobal mac_ctx,
 			if (csr_roam_session &&
 			    csr_roam_session->connectedInfo.nRICRspLength) {
 				status = sme_qos_process_ft_reassoc_rsp_ev(
-						mac_ctx, sessionid, event_info);
+						mac_ctx, sessionid,
+						event_info);
+			} else {
+				QDF_TRACE(QDF_MODULE_ID_SME,
+					QDF_TRACE_LEVEL_ERROR, FL(
+					"session or RIC data is not present"));
 			}
 		}
 #ifdef FEATURE_WLAN_ESE

+ 1 - 4
core/wma/src/wma_scan_roam.c

@@ -2078,15 +2078,12 @@ int wma_roam_synch_event_handler(void *handle, uint8_t *event,
 		goto cleanup_label;
 	}
 	bss_desc_ptr = qdf_mem_malloc(sizeof(tSirBssDescription) + ie_len);
-	roam_synch_ind_ptr->join_rsp = qdf_mem_malloc(sizeof(tSirSmeJoinRsp));
-	if ((NULL == roam_synch_ind_ptr->join_rsp) || (NULL == bss_desc_ptr)) {
+	if (NULL == bss_desc_ptr) {
 		WMA_LOGE("LFR3: mem alloc failed!");
 		QDF_ASSERT(bss_desc_ptr != NULL);
-		QDF_ASSERT(roam_synch_ind_ptr->join_rsp != NULL);
 		status =  -ENOMEM;
 		goto cleanup_label;
 	}
-	qdf_mem_zero(roam_synch_ind_ptr->join_rsp, sizeof(tSirSmeJoinRsp));
 	qdf_mem_zero(bss_desc_ptr, sizeof(tSirBssDescription) + ie_len);
 	wma->pe_roam_synch_cb((tpAniSirGlobal)wma->mac_context,
 			roam_synch_ind_ptr, bss_desc_ptr);