summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHanumanth Reddy Pothula <c_hpothu@codeaurora.org>2016-09-08 15:21:54 +0530
committerqcabuildsw <qcabuildsw@localhost>2016-11-29 16:07:03 -0800
commite2b5ff296cee9b58de2f43c914425723e225e1a7 (patch)
tree70e9dce883134f818046e3d59fb2bf27fb64f976
parent04c70c7904aba4add750c9256e2147b713d4c504 (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.h17
-rw-r--r--core/mac/inc/wni_api.h1
-rw-r--r--core/mac/src/pe/lim/lim_assoc_utils.c8
-rw-r--r--core/mac/src/pe/lim/lim_send_sme_rsp_messages.c63
-rw-r--r--core/sap/src/sap_api_link_cntl.c18
-rw-r--r--core/sme/src/csr/csr_api_roam.c90
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;