diff options
| author | Hanumanth Reddy Pothula <c_hpothu@codeaurora.org> | 2016-09-08 15:21:54 +0530 |
|---|---|---|
| committer | qcabuildsw <qcabuildsw@localhost> | 2016-11-29 16:07:03 -0800 |
| commit | e2b5ff296cee9b58de2f43c914425723e225e1a7 (patch) | |
| tree | 70e9dce883134f818046e3d59fb2bf27fb64f976 | |
| parent | 04c70c7904aba4add750c9256e2147b713d4c504 (diff) | |
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
| -rw-r--r-- | core/mac/inc/sir_api.h | 17 | ||||
| -rw-r--r-- | core/mac/inc/wni_api.h | 1 | ||||
| -rw-r--r-- | core/mac/src/pe/lim/lim_assoc_utils.c | 8 | ||||
| -rw-r--r-- | core/mac/src/pe/lim/lim_send_sme_rsp_messages.c | 63 | ||||
| -rw-r--r-- | core/sap/src/sap_api_link_cntl.c | 18 | ||||
| -rw-r--r-- | core/sme/src/csr/csr_api_roam.c | 90 |
6 files changed, 119 insertions, 78 deletions
diff --git a/core/mac/inc/sir_api.h b/core/mac/inc/sir_api.h index a4252d70b828..ba90feaec7f9 100644 --- a/core/mac/inc/sir_api.h +++ b/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 */ diff --git a/core/mac/inc/wni_api.h b/core/mac/inc/wni_api.h index a9104e4a29be..969327c3900f 100644 --- a/core/mac/inc/wni_api.h +++ b/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, diff --git a/core/mac/src/pe/lim/lim_assoc_utils.c b/core/mac/src/pe/lim/lim_assoc_utils.c index f7bf5fc279ce..19f84ecc26bb 100644 --- a/core/mac/src/pe/lim/lim_assoc_utils.c +++ b/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 == diff --git a/core/mac/src/pe/lim/lim_send_sme_rsp_messages.c b/core/mac/src/pe/lim/lim_send_sme_rsp_messages.c index b1f5a45b8fdc..40993dc1f0e4 100644 --- a/core/mac/src/pe/lim/lim_send_sme_rsp_messages.c +++ b/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 diff --git a/core/sap/src/sap_api_link_cntl.c b/core/sap/src/sap_api_link_cntl.c index 6bf5679ff13b..773c8a8407ce 100644 --- a/core/sap/src/sap_api_link_cntl.c +++ b/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)"), diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c index deea0524dd4e..48bcc6bf6b87 100644 --- a/core/sme/src/csr/csr_api_roam.c +++ b/core/sme/src/csr/csr_api_roam.c @@ -10354,10 +10354,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) { @@ -10425,19 +10423,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 @@ -10454,13 +10439,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; @@ -10507,21 +10533,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 @@ -11248,6 +11259,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; @@ -11687,9 +11701,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) { @@ -11734,17 +11745,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; |
