Răsfoiți Sursa

qcacld-3.0: Send disconnect indication to upperlayer after clean up in PE

qcacld-2.0 to qcacld-3.0 propagation.

Supplicant may send PNO command as disconnection was already informed
to supplicant while disconnection might still be in progress in PE
layer(DEL_STA/DEL_BSS).
Fix to send disconnect indication to upper layers after complete
cleanup.

Change-Id: I976044186eb8e79f709bda618b38815827a3e0c5
CRs-Fixed: 951162
Hanumantha Reddy Pothula 8 ani în urmă
părinte
comite
3e5d6aae27

+ 17 - 0
core/mac/inc/sir_api.h

@@ -1552,6 +1552,23 @@ typedef struct sSirSmeDisassocCnf {
 } tSirSmeDisassocCnf, *tpSirSmeDisassocCnf,
 	tSirSmeDeauthCnf, *tpSirSmeDeauthCnf;
 
+/**
+ * struct sir_sme_discon_done_ind  - disconnect done indiaction
+ * @message_type: msg type
+ * @length: length of msg
+ * @session_id: session id of the indication
+ * @reason_code: reason for disconnect indication
+ * @peer_mac: peer mac
+ */
+struct sir_sme_discon_done_ind {
+	uint16_t           message_type;
+	uint16_t           length;
+	uint8_t            session_id;
+	tSirResultCodes    reason_code;
+	tSirMacAddr        peer_mac;
+};
+
+
 /* / Definition for Deauthetication request */
 typedef struct sSirSmeDeauthReq {
 	uint16_t messageType;   /* eWNI_SME_DEAUTH_REQ */

+ 1 - 0
core/mac/inc/wni_api.h

@@ -70,6 +70,7 @@ enum eWniMsgTypes {
 	eWNI_SME_DEAUTH_REQ,
 	eWNI_SME_DEAUTH_RSP,
 	eWNI_SME_DEAUTH_IND,
+	eWNI_SME_DISCONNECT_DONE_IND,
 	eWNI_SME_WM_STATUS_CHANGE_NTF,
 	eWNI_SME_IBSS_NEW_PEER_IND,
 	eWNI_SME_IBSS_PEER_DEPARTED_IND,

+ 0 - 8
core/mac/src/pe/lim/lim_assoc_utils.c

@@ -682,14 +682,6 @@ lim_send_del_sta_cnf(tpAniSirGlobal pMac, struct qdf_mac_addr sta_dsaddr,
 		}
 
 		psessionEntry->limAID = 0;
-
-	} else if (
-		(mlmStaContext.cleanupTrigger ==
-			eLIM_LINK_MONITORING_DISASSOC) ||
-		(mlmStaContext.cleanupTrigger ==
-			eLIM_LINK_MONITORING_DEAUTH)) {
-		/* only for non-STA cases PE/SME is serialized */
-		return;
 	}
 
 	if ((mlmStaContext.cleanupTrigger ==

+ 54 - 9
core/mac/src/pe/lim/lim_send_sme_rsp_messages.c

@@ -849,6 +849,7 @@ lim_send_sme_disassoc_ntf(tpAniSirGlobal pMac,
 	tpPESession session = NULL;
 	uint16_t i, assoc_id;
 	tpDphHashNode sta_ds = NULL;
+	struct sir_sme_discon_done_ind *sir_sme_dis_ind;
 
 	lim_log(pMac, LOG1, FL("Disassoc Ntf with trigger : %d reasonCode: %d"),
 		disassocTrigger, reasonCode);
@@ -889,12 +890,6 @@ lim_send_sme_disassoc_ntf(tpAniSirGlobal pMac,
 		failure = true;
 		break;
 
-	case eLIM_PEER_ENTITY_DISASSOC:
-		if (reasonCode != eSIR_SME_STA_NOT_ASSOCIATED) {
-			failure = true;
-			goto error;
-		}
-
 	case eLIM_HOST_DISASSOC:
 		/**
 		 * Disassociation response due to
@@ -941,6 +936,32 @@ lim_send_sme_disassoc_ntf(tpAniSirGlobal pMac,
 		pMsg = (uint32_t *) pSirSmeDisassocRsp;
 		break;
 
+	case eLIM_PEER_ENTITY_DISASSOC:
+	case eLIM_LINK_MONITORING_DISASSOC:
+		sir_sme_dis_ind =
+			qdf_mem_malloc(sizeof(*sir_sme_dis_ind));
+		if (!sir_sme_dis_ind) {
+			lim_log(pMac, LOGE,
+				FL("call to AllocateMemory failed for disconnect indication"));
+			return;
+		}
+
+		lim_log(pMac, LOG1,
+			FL("send  eWNI_SME_DISCONNECT_DONE_IND with retCode: %d"),
+				reasonCode);
+
+		sir_sme_dis_ind->message_type =
+			eWNI_SME_DISCONNECT_DONE_IND;
+		sir_sme_dis_ind->length =
+			sizeof(*sir_sme_dis_ind);
+		qdf_mem_copy(sir_sme_dis_ind->peer_mac, peerMacAddr,
+			     sizeof(tSirMacAddr));
+		sir_sme_dis_ind->session_id   = smesessionId;
+		sir_sme_dis_ind->reason_code  = reasonCode;
+		pMsg = (uint32_t *)sir_sme_dis_ind;
+
+		break;
+
 	default:
 		/**
 		 * Disassociation indication due to Disassociation
@@ -1340,12 +1361,10 @@ lim_send_sme_deauth_ntf(tpAniSirGlobal pMac, tSirMacAddr peerMacAddr,
 	tpPESession psessionEntry;
 	uint8_t sessionId;
 	uint32_t *pMsg;
+	struct sir_sme_discon_done_ind *sir_sme_dis_ind;
 
 	psessionEntry = pe_find_session_by_bssid(pMac, peerMacAddr, &sessionId);
 	switch (deauthTrigger) {
-	case eLIM_PEER_ENTITY_DEAUTH:
-		return;
-
 	case eLIM_HOST_DEAUTH:
 		/**
 		 * Deauthentication response to host triggered
@@ -1380,6 +1399,32 @@ lim_send_sme_deauth_ntf(tpAniSirGlobal pMac, tSirMacAddr peerMacAddr,
 
 		break;
 
+	case eLIM_PEER_ENTITY_DEAUTH:
+	case eLIM_LINK_MONITORING_DEAUTH:
+		sir_sme_dis_ind =
+			qdf_mem_malloc(sizeof(*sir_sme_dis_ind));
+		if (!sir_sme_dis_ind) {
+			lim_log(pMac, LOGE,
+				FL("call to AllocateMemory failed for disconnect indication"));
+			return;
+		}
+
+		lim_log(pMac, LOG1,
+		       FL("send  eWNI_SME_DISCONNECT_DONE_IND withretCode: %d"),
+				reasonCode);
+
+		sir_sme_dis_ind->message_type =
+			eWNI_SME_DISCONNECT_DONE_IND;
+		sir_sme_dis_ind->length =
+			sizeof(*sir_sme_dis_ind);
+		sir_sme_dis_ind->session_id = smesessionId;
+		sir_sme_dis_ind->reason_code = reasonCode;
+		qdf_mem_copy(sir_sme_dis_ind->peer_mac, peerMacAddr,
+			 ETH_ALEN);
+		pMsg = (uint32_t *)sir_sme_dis_ind;
+
+		break;
+
 	default:
 		/**
 		 * Deauthentication indication due to Deauthentication

+ 2 - 16
core/sap/src/sap_api_link_cntl.c

@@ -1065,9 +1065,10 @@ wlansap_roam_callback(void *ctx, tCsrRoamInfo *csr_roam_info, uint32_t roamId,
 		if (!QDF_IS_STATUS_SUCCESS(qdf_status))
 			qdf_ret_status = QDF_STATUS_E_FAILURE;
 		break;
+	case eCSR_ROAM_RESULT_DEAUTH_IND:
 	case eCSR_ROAM_RESULT_DISASSOC_IND:
 		QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
-			  FL("CSR roam_result = eCSR_ROAM_RESULT_DISASSOC_IND (%d)"),
+			  FL("CSR roam_result = eCSR_ROAM_RESULT_DEAUTH/DISASSOC_IND (%d)"),
 			  roam_result);
 		/* Fill in the event structure */
 		qdf_status = sap_signal_hdd_event(sap_ctx, csr_roam_info,
@@ -1076,21 +1077,6 @@ wlansap_roam_callback(void *ctx, tCsrRoamInfo *csr_roam_info, uint32_t roamId,
 		if (!QDF_IS_STATUS_SUCCESS(qdf_status))
 			qdf_ret_status = QDF_STATUS_E_FAILURE;
 		break;
-	case eCSR_ROAM_RESULT_DEAUTH_IND:
-		QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
-			  FL("CSR roam_result = eCSR_ROAM_RESULT_DEAUTH_IND (%d)"),
-			  roam_result);
-		/*
-		 * Fill in the event structure
-		 * we use the same event inorder to inform HDD to disassociate
-		 * the station
-		 */
-		qdf_status = sap_signal_hdd_event(sap_ctx, csr_roam_info,
-					eSAP_STA_DISASSOC_EVENT,
-					(void *) eSAP_STATUS_SUCCESS);
-		if (!QDF_IS_STATUS_SUCCESS(qdf_status))
-			qdf_ret_status = QDF_STATUS_E_FAILURE;
-		break;
 	case eCSR_ROAM_RESULT_MIC_ERROR_GROUP:
 		QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
 			  FL("CSR roam_result = eCSR_ROAM_RESULT_MIC_ERROR_GROUP (%d)"),

+ 45 - 45
core/sme/src/csr/csr_api_roam.c

@@ -10459,10 +10459,8 @@ csr_roam_chk_lnk_disassoc_ind(tpAniSirGlobal mac_ctx, tSirSmeRsp *msg_ptr)
 	tCsrRoamSession *session;
 	uint32_t sessionId = CSR_SESSION_ID_INVALID;
 	QDF_STATUS status;
-	tCsrRoamInfo *roam_info_ptr = NULL;
 	tSirSmeDisassocInd *pDisassocInd;
 	tSmeCmd *cmd;
-	tCsrRoamInfo roam_info;
 
 	cmd = qdf_mem_malloc(sizeof(*cmd));
 	if (NULL == cmd) {
@@ -10530,19 +10528,6 @@ csr_roam_chk_lnk_disassoc_ind(tpAniSirGlobal mac_ctx, tSirSmeRsp *msg_ptr)
 	csr_roam_issue_wm_status_change(mac_ctx, sessionId,
 					eCsrDisassociated, msg_ptr);
 	if (CSR_IS_INFRA_AP(&session->connectedProfile)) {
-		roam_info_ptr = &roam_info;
-		roam_info_ptr->statusCode = pDisassocInd->statusCode;
-		roam_info_ptr->reasonCode = pDisassocInd->reasonCode;
-		roam_info_ptr->u.pConnectedProfile = &session->connectedProfile;
-		roam_info_ptr->staId = (uint8_t) pDisassocInd->staId;
-		qdf_copy_macaddr(&roam_info_ptr->peerMac,
-				 &pDisassocInd->peer_macaddr);
-		qdf_copy_macaddr(&roam_info_ptr->bssid,
-				 &pDisassocInd->bssid);
-		status = csr_roam_call_callback(mac_ctx, sessionId,
-						roam_info_ptr, 0,
-						eCSR_ROAM_INFRA_IND,
-						eCSR_ROAM_RESULT_DISASSOC_IND);
 		/*
 		 * STA/P2P client got  disassociated so remove any pending
 		 * deauth commands in sme pending list
@@ -10559,13 +10544,54 @@ csr_roam_chk_lnk_disassoc_ind(tpAniSirGlobal mac_ctx, tSirSmeRsp *msg_ptr)
 	qdf_mem_free(cmd);
 }
 
+/**
+ * csr_roam_send_disconnect_done_indication() - Send disconnect ind to HDD.
+ *
+ * @mac_ctx: mac global context
+ * @msg_ptr: incoming message
+ *
+ * This function gives final disconnect event to HDD after all cleanup in
+ * lower layers is done.
+ *
+ * Return: None
+ */
+static void
+csr_roam_send_disconnect_done_indication(tpAniSirGlobal mac_ctx, tSirSmeRsp
+				     *msg_ptr)
+{
+	struct sir_sme_discon_done_ind *discon_ind =
+				(struct sir_sme_discon_done_ind *)(msg_ptr);
+	tCsrRoamInfo roam_info;
+	tCsrRoamSession *session;
+
+	sms_log(mac_ctx, LOG1, FL("eWNI_SME_DISCONNECT_DONE_IND RC:%d"),
+		discon_ind->reason_code);
+
+	if (CSR_IS_SESSION_VALID(mac_ctx, discon_ind->session_id)) {
+		roam_info.reasonCode = discon_ind->reason_code;
+		roam_info.statusCode = eSIR_SME_STA_NOT_ASSOCIATED;
+		qdf_mem_copy(roam_info.peerMac.bytes, discon_ind->peer_mac,
+			     ETH_ALEN);
+		csr_roam_call_callback(mac_ctx, discon_ind->session_id,
+				       &roam_info, 0, eCSR_ROAM_LOSTLINK,
+				       eCSR_ROAM_RESULT_DISASSOC_IND);
+		session = CSR_GET_SESSION(mac_ctx, discon_ind->session_id);
+		if (session &&
+		   !CSR_IS_INFRA_AP(&session->connectedProfile))
+			csr_roam_state_change(mac_ctx, eCSR_ROAMING_STATE_IDLE,
+				discon_ind->session_id);
+
+	} else
+		sms_log(mac_ctx, LOGE, FL("Inactive session %d"),
+			discon_ind->session_id);
+}
+
 static void
 csr_roam_chk_lnk_deauth_ind(tpAniSirGlobal mac_ctx, tSirSmeRsp *msg_ptr)
 {
 	tCsrRoamSession *session;
 	uint32_t sessionId = CSR_SESSION_ID_INVALID;
 	QDF_STATUS status;
-	tCsrRoamInfo *roam_info_ptr = NULL;
 	tSirSmeDeauthInd *pDeauthInd;
 	tCsrRoamInfo roam_info;
 
@@ -10612,21 +10638,6 @@ csr_roam_chk_lnk_deauth_ind(tpAniSirGlobal mac_ctx, tSirSmeRsp *msg_ptr)
 	csr_roam_issue_wm_status_change(mac_ctx, sessionId,
 					eCsrDeauthenticated,
 					msg_ptr);
-	if (CSR_IS_INFRA_AP(&session->connectedProfile)) {
-		roam_info_ptr = &roam_info;
-		roam_info_ptr->statusCode = pDeauthInd->statusCode;
-		roam_info_ptr->reasonCode = pDeauthInd->reasonCode;
-		roam_info_ptr->u.pConnectedProfile = &session->connectedProfile;
-		roam_info_ptr->staId = (uint8_t) pDeauthInd->staId;
-		qdf_copy_macaddr(&roam_info_ptr->peerMac,
-				 &pDeauthInd->peer_macaddr);
-		qdf_copy_macaddr(&roam_info_ptr->bssid,
-				 &pDeauthInd->bssid);
-		status = csr_roam_call_callback(mac_ctx, sessionId,
-						roam_info_ptr, 0,
-						eCSR_ROAM_INFRA_IND,
-						eCSR_ROAM_RESULT_DEAUTH_IND);
-	}
 }
 
 static void
@@ -11353,6 +11364,9 @@ void csr_roam_check_for_link_status_change(tpAniSirGlobal pMac, tSirSmeRsp *pSir
 	case eWNI_SME_DISASSOC_IND:
 		csr_roam_chk_lnk_disassoc_ind(pMac, pSirMsg);
 		break;
+	case eWNI_SME_DISCONNECT_DONE_IND:
+		csr_roam_send_disconnect_done_indication(pMac, pSirMsg);
+		break;
 	case eWNI_SME_DEAUTH_IND:
 		csr_roam_chk_lnk_deauth_ind(pMac, pSirMsg);
 		break;
@@ -11792,9 +11806,6 @@ QDF_STATUS csr_roam_lost_link(tpAniSirGlobal pMac, uint32_t sessionId,
 	if (!CSR_IS_INFRA_AP(&pSession->connectedProfile)) {
 		csr_roam_call_callback(pMac, sessionId, NULL, 0,
 				       eCSR_ROAM_LOSTLINK_DETECTED, result);
-		/*Move the state to Idle after disconnection */
-		csr_roam_state_change(pMac, eCSR_ROAMING_STATE_IDLE, sessionId);
-
 	}
 
 	if (eWNI_SME_DISASSOC_IND == type) {
@@ -11839,17 +11850,6 @@ QDF_STATUS csr_roam_lost_link(tpAniSirGlobal pMac, uint32_t sessionId,
 				(eWNI_SME_DEAUTH_IND == type) ?
 				eCsrLostlinkRoamingDeauth :
 				eCsrLostlinkRoamingDisassoc);
-
-		/* Tell HDD about the lost link */
-		if (!CSR_IS_INFRA_AP(&pSession->connectedProfile)) {
-			/* Don't call csr_roam_call_callback for GO/SoftAp case as this indication
-			 * was already given as part of eWNI_SME_DISASSOC_IND msg handling in
-			 * csr_roam_check_for_link_status_change API.
-			 */
-			csr_roam_call_callback(pMac, sessionId, &roamInfo, 0,
-					       eCSR_ROAM_LOSTLINK, result);
-		}
-
 	}
 
 	return status;