From 30bb8407cd2703c75baaf1c1270249a10dec0c1d Mon Sep 17 00:00:00 2001 From: Sandeep Puligilla Date: Sun, 23 Sep 2018 22:01:08 -0700 Subject: [PATCH] qcacld-3.0: Add VDEV state machine for STA disconnection Add support for VDEV state machine support for STA disconnection Change-Id: Iee7274fbc8ae985d034a29f920faa38aab68ccc7 CRs-Fixed: 2322539 --- .../core/inc/wlan_mlme_vdev_mgr_interface.h | 9 + .../core/src/wlan_mlme_vdev_mgr_interface.c | 128 +++++--------- .../src/pe/lim/lim_process_mlm_req_messages.c | 7 +- .../src/pe/lim/lim_process_mlm_rsp_messages.c | 16 ++ .../src/pe/lim/lim_process_sme_req_messages.c | 159 ++++++++++++++++-- core/mac/src/pe/lim/lim_send_messages.c | 4 +- core/mac/src/pe/lim/lim_types.h | 29 ++++ core/mac/src/pe/lim/lim_utils.c | 6 + core/mac/src/pe/lim/lim_utils.h | 22 +++ core/wma/inc/wma_api.h | 39 ++++- core/wma/inc/wma_internal.h | 10 ++ core/wma/src/wma_dev_if.c | 2 +- core/wma/src/wma_utils.c | 20 ++- 13 files changed, 336 insertions(+), 115 deletions(-) diff --git a/components/mlme/core/inc/wlan_mlme_vdev_mgr_interface.h b/components/mlme/core/inc/wlan_mlme_vdev_mgr_interface.h index cdc7ad4c6137..b86d1852d664 100644 --- a/components/mlme/core/inc/wlan_mlme_vdev_mgr_interface.h +++ b/components/mlme/core/inc/wlan_mlme_vdev_mgr_interface.h @@ -115,5 +115,14 @@ mlme_set_vdev_start_failed(struct wlan_objmgr_vdev *vdev, bool val); */ bool mlme_get_vdev_start_failed(struct wlan_objmgr_vdev *vdev); +/** + * mlme_is_vdev_in_beaconning_mode() - check if vdev is beaconing mode + * @vdev_opmode: vdev opmode + * + * To check if vdev is operating in beaconing mode or not. + * + * Return: true or false + */ +bool mlme_is_vdev_in_beaconning_mode(enum QDF_OPMODE vdev_opmode); #endif #endif diff --git a/components/mlme/core/src/wlan_mlme_vdev_mgr_interface.c b/components/mlme/core/src/wlan_mlme_vdev_mgr_interface.c index 236bb62b1776..c08655bcaa6b 100644 --- a/components/mlme/core/src/wlan_mlme_vdev_mgr_interface.c +++ b/components/mlme/core/src/wlan_mlme_vdev_mgr_interface.c @@ -22,19 +22,12 @@ #include "wlan_mlme_vdev_mgr_interface.h" #include "lim_utils.h" #include "wma_api.h" +#include "lim_types.h" static struct vdev_mlme_ops sta_mlme_ops; static struct vdev_mlme_ops ap_mlme_ops; -/** - * mlme_is_vdev_in_beaconning_mode() - check if vdev is beaconing mode - * @vdev_opmode: vdev opmode - * - * This function is called to register vdev manager operations - * - * Return: QDF_STATUS - */ -static inline bool mlme_is_vdev_in_beaconning_mode(enum QDF_OPMODE vdev_opmode) +bool mlme_is_vdev_in_beaconning_mode(enum QDF_OPMODE vdev_opmode) { switch (vdev_opmode) { case QDF_SAP_MODE: @@ -101,6 +94,22 @@ static QDF_STATUS sta_mlme_vdev_start_send(struct vdev_mlme_obj *vdev_mlme, event_data); } +/** + * sta_mlme_start_continue() - vdev start rsp calback + * @vdev_mlme: vdev mlme object + * @data_len: event data length + * @data: event data + * + * This function is called to handle the VDEV START/RESTART calback + * + * Return: QDF_STATUS + */ +static QDF_STATUS sta_mlme_start_continue(struct vdev_mlme_obj *vdev_mlme, + uint16_t data_len, void *data) +{ + return wma_sta_mlme_vdev_start_continue(vdev_mlme, data_len, data); +} + /** * sta_mlme_vdev_restart_send() - MLME vdev restart send * @vdev_mlme: vdev mlme object @@ -184,7 +193,8 @@ static QDF_STATUS sta_mlme_vdev_disconnect_bss(struct vdev_mlme_obj *vdev_mlme, uint16_t event_data_len, void *event_data) { - return QDF_STATUS_SUCCESS; + return lim_sta_mlme_vdev_disconnect_bss(vdev_mlme, event_data_len, + event_data); } /** @@ -198,14 +208,14 @@ static QDF_STATUS sta_mlme_vdev_disconnect_bss(struct vdev_mlme_obj *vdev_mlme, * Return: QDF_STATUS */ static QDF_STATUS sta_mlme_vdev_stop_send(struct vdev_mlme_obj *vdev_mlme, - uint16_t event_data_len, - void *event_data) + uint16_t data_len, + void *data) { - return QDF_STATUS_SUCCESS; + return lim_sta_mlme_vdev_stop_send(vdev_mlme, data_len, data); } /** - * sta_mlme_vdev_stop_continue() - MLME vdev stop send callback + * vdevmgr_mlme_stop_continue() - MLME vdev stop send callback * @vdev_mlme: vdev mlme object * @event_data_len: event data length * @event_data: event data @@ -215,48 +225,14 @@ static QDF_STATUS sta_mlme_vdev_stop_send(struct vdev_mlme_obj *vdev_mlme, * * Return: QDF_STATUS */ -static QDF_STATUS sta_mlme_vdev_stop_continue(struct vdev_mlme_obj *vdev_mlme, - uint16_t event_data_len, - void *event_data) +static QDF_STATUS vdevmgr_mlme_stop_continue(struct vdev_mlme_obj *vdev_mlme, + uint16_t data_len, + void *data) { - return QDF_STATUS_SUCCESS; + return wma_mlme_vdev_stop_continue(vdev_mlme, data_len, data); } /** - * sta_mlme_vdev_down_send() - MLME vdev down send callback - * @vdev_mlme: vdev mlme object - * @event_data_len: event data length - * @event_data: event data - * - * This function is to send the vdev down to firmware - * - * Return: QDF_STATUS - */ -static QDF_STATUS sta_mlme_vdev_down_send(struct vdev_mlme_obj *vdev_mlme, - uint16_t event_data_len, - void *event_data) -{ - return QDF_STATUS_SUCCESS; -} - -/** - * sta_vdev_notify_down_complete() - MLME vdev down complete callback - * @vdev_mlme: vdev mlme object - * @event_data_len: event data length - * @event_data: event data - * - * This function is called on moving vdev state to down. - * - * Return: QDF_STATUS - */ -static QDF_STATUS sta_vdev_notify_down_complete(struct vdev_mlme_obj *vdev_mlme, - uint16_t event_data_len, - void *event_data) -{ - return QDF_STATUS_SUCCESS; -} - - /** * ap_mlme_vdev_start_send () - send vdev start req * @vdev_mlme: vdev mlme object * @data_len: event data length @@ -273,7 +249,7 @@ static QDF_STATUS ap_mlme_vdev_start_send(struct vdev_mlme_obj *vdev_mlme, } /** - * mlme_start_continue () - vdev start rsp calback + * ap_start_continue () - vdev start rsp calback * @vdev_mlme: vdev mlme object * @data_len: event data length * @data: event data @@ -282,10 +258,10 @@ static QDF_STATUS ap_mlme_vdev_start_send(struct vdev_mlme_obj *vdev_mlme, * * Return: QDF_STATUS */ -static QDF_STATUS vdevmgr_mlme_start_continue(struct vdev_mlme_obj *vdev_mlme, - uint16_t data_len, void *data) +static QDF_STATUS ap_mlme_start_continue(struct vdev_mlme_obj *vdev_mlme, + uint16_t data_len, void *data) { - return wma_mlme_vdev_start_continue(vdev_mlme, data_len, data); + return wma_ap_mlme_vdev_start_continue(vdev_mlme, data_len, data); } /** @@ -378,22 +354,6 @@ static QDF_STATUS ap_mlme_vdev_stop_send(struct vdev_mlme_obj *vdev_mlme, return lim_ap_mlme_vdev_stop_send(vdev_mlme, data_len, data); } -/** - * ap_mlme_vdev_stop_continue() - callback to handle stop vdev resp - * @vdev_mlme: vdev mlme object - * @data_len: event data length - * @data: event data - * - * This function is called to handle stop vdev resp - * - * Return: QDF_STATUS - */ -static QDF_STATUS ap_mlme_vdev_stop_continue(struct vdev_mlme_obj *vdev_mlme, - uint16_t data_len, void *data) -{ - return wma_ap_mlme_vdev_stop_continue(vdev_mlme, data_len, data); -} - /** * ap_mlme_vdev_down_send() - callback to send vdev down req * @vdev_mlme: vdev mlme object @@ -404,13 +364,13 @@ static QDF_STATUS ap_mlme_vdev_stop_continue(struct vdev_mlme_obj *vdev_mlme, * * Return: QDF_STATUS */ -static QDF_STATUS ap_mlme_vdev_down_send(struct vdev_mlme_obj *vdev_mlme, - uint16_t data_len, void *data) +static QDF_STATUS vdevmgr_mlme_vdev_down_send(struct vdev_mlme_obj *vdev_mlme, + uint16_t data_len, void *data) { return wma_ap_mlme_vdev_down_send(vdev_mlme, data_len, data); } /** - * ap_vdev_notify_down_complete() - callback to indicate vdev down is completed + * vdevmgr_notify_down_complete() - callback to indicate vdev down is completed * @vdev_mlme: vdev mlme object * @data_len: event data length * @data: event data @@ -419,7 +379,7 @@ static QDF_STATUS ap_mlme_vdev_down_send(struct vdev_mlme_obj *vdev_mlme, * * Return: QDF_STATUS */ -static QDF_STATUS ap_vdev_notify_down_complete(struct vdev_mlme_obj *vdev_mlme, +static QDF_STATUS vdevmgr_notify_down_complete(struct vdev_mlme_obj *vdev_mlme, uint16_t data_len, void *data) { return wma_ap_mlme_vdev_notify_down_complete(vdev_mlme, data_len, data); @@ -672,15 +632,15 @@ static QDF_STATUS ap_vdev_dfs_cac_timer_stop(struct vdev_mlme_obj *vdev_mlme, static struct vdev_mlme_ops sta_mlme_ops = { .mlme_vdev_start_send = sta_mlme_vdev_start_send, .mlme_vdev_restart_send = sta_mlme_vdev_restart_send, - .mlme_vdev_start_continue = vdevmgr_mlme_start_continue, + .mlme_vdev_start_continue = sta_mlme_start_continue, .mlme_vdev_sta_conn_start = sta_mlme_vdev_start_connection, .mlme_vdev_up_send = sta_mlme_vdev_up_send, .mlme_vdev_notify_up_complete = sta_mlme_vdev_notify_up_complete, .mlme_vdev_disconnect_peers = sta_mlme_vdev_disconnect_bss, .mlme_vdev_stop_send = sta_mlme_vdev_stop_send, - .mlme_vdev_stop_continue = sta_mlme_vdev_stop_continue, - .mlme_vdev_down_send = sta_mlme_vdev_down_send, - .mlme_vdev_notify_down_complete = sta_vdev_notify_down_complete, + .mlme_vdev_stop_continue = vdevmgr_mlme_stop_continue, + .mlme_vdev_down_send = vdevmgr_mlme_vdev_down_send, + .mlme_vdev_notify_down_complete = vdevmgr_notify_down_complete, .mlme_vdev_legacy_hdl_create = mlme_legacy_hdl_create, .mlme_vdev_legacy_hdl_destroy = mlme_legacy_hdl_destroy, }; @@ -721,7 +681,7 @@ static struct vdev_mlme_ops ap_mlme_ops = { .mlme_vdev_start_send = ap_mlme_vdev_start_send, .mlme_vdev_restart_send = ap_mlme_vdev_restart_send, .mlme_vdev_stop_start_send = ap_mlme_vdev_stop_start_send, - .mlme_vdev_start_continue = vdevmgr_mlme_start_continue, + .mlme_vdev_start_continue = ap_mlme_start_continue, .mlme_vdev_start_req_failed = ap_mlme_vdev_start_req_failed, .mlme_vdev_up_send = ap_mlme_vdev_up_send, .mlme_vdev_notify_up_complete = ap_mlme_vdev_notify_up_complete, @@ -729,9 +689,9 @@ static struct vdev_mlme_ops ap_mlme_ops = { .mlme_vdev_disconnect_peers = ap_mlme_vdev_disconnect_peers, .mlme_vdev_dfs_cac_timer_stop = ap_vdev_dfs_cac_timer_stop, .mlme_vdev_stop_send = ap_mlme_vdev_stop_send, - .mlme_vdev_stop_continue = ap_mlme_vdev_stop_continue, - .mlme_vdev_down_send = ap_mlme_vdev_down_send, - .mlme_vdev_notify_down_complete = ap_vdev_notify_down_complete, + .mlme_vdev_stop_continue = vdevmgr_mlme_stop_continue, + .mlme_vdev_down_send = vdevmgr_mlme_vdev_down_send, + .mlme_vdev_notify_down_complete = vdevmgr_notify_down_complete, .mlme_vdev_legacy_hdl_create = mlme_legacy_hdl_create, .mlme_vdev_legacy_hdl_destroy = mlme_legacy_hdl_destroy, }; diff --git a/core/mac/src/pe/lim/lim_process_mlm_req_messages.c b/core/mac/src/pe/lim/lim_process_mlm_req_messages.c index 791e1e512dad..729384d4eb29 100644 --- a/core/mac/src/pe/lim/lim_process_mlm_req_messages.c +++ b/core/mac/src/pe/lim/lim_process_mlm_req_messages.c @@ -44,7 +44,6 @@ static void lim_process_mlm_auth_req(tpAniSirGlobal, uint32_t *); static void lim_process_mlm_assoc_req(tpAniSirGlobal, uint32_t *); static void lim_process_mlm_disassoc_req(tpAniSirGlobal, uint32_t *); -static void lim_process_mlm_deauth_req(tpAniSirGlobal, uint32_t *); static void lim_process_mlm_set_keys_req(tpAniSirGlobal, uint32_t *); /* MLM Timeout event handler templates */ @@ -128,9 +127,6 @@ void lim_process_mlm_req_messages(tpAniSirGlobal mac_ctx, case LIM_MLM_DISASSOC_REQ: lim_process_mlm_disassoc_req(mac_ctx, msg->bodyptr); break; - case LIM_MLM_DEAUTH_REQ: - lim_process_mlm_deauth_req(mac_ctx, msg->bodyptr); - break; case LIM_MLM_SETKEYS_REQ: lim_process_mlm_set_keys_req(mac_ctx, msg->bodyptr); break; @@ -1991,8 +1987,7 @@ void lim_process_deauth_ack_timeout(tpAniSirGlobal mac_ctx) * * @Return: None */ -static void -lim_process_mlm_deauth_req(tpAniSirGlobal mac_ctx, uint32_t *msg_buf) +void lim_process_mlm_deauth_req(tpAniSirGlobal mac_ctx, uint32_t *msg_buf) { tLimMlmDeauthReq *mlm_deauth_req; tpPESession session; diff --git a/core/mac/src/pe/lim/lim_process_mlm_rsp_messages.c b/core/mac/src/pe/lim/lim_process_mlm_rsp_messages.c index b1dbf4f3a823..601f63e10499 100644 --- a/core/mac/src/pe/lim/lim_process_mlm_rsp_messages.c +++ b/core/mac/src/pe/lim/lim_process_mlm_rsp_messages.c @@ -1895,6 +1895,9 @@ void lim_process_sta_mlm_del_sta_rsp(tpAniSirGlobal pMac, tSirResultCodes statusCode = eSIR_SME_SUCCESS; tpDeleteStaParams pDelStaParams = (tpDeleteStaParams) limMsgQ->bodyptr; tpDphHashNode pStaDs = NULL; +#ifdef CONFIG_VDEV_SM + QDF_STATUS status; +#endif if (NULL == pDelStaParams) { pe_err("Encountered NULL Pointer"); @@ -1938,9 +1941,22 @@ void lim_process_sta_mlm_del_sta_rsp(tpAniSirGlobal pMac, qdf_mem_free(pDelStaParams); limMsgQ->bodyptr = NULL; } +#ifdef CONFIG_VDEV_SM + status = + wlan_vdev_mlme_sm_deliver_evt(psessionEntry->vdev, + WLAN_VDEV_SM_EV_DISCONNECT_COMPLETE, + sizeof(*psessionEntry), + psessionEntry); + if (QDF_IS_STATUS_ERROR(status)) { + pe_err("failed to post WLAN_VDEV_SM_EV_DISCONNECT_COMPLETE for vdevid %d", + psessionEntry->smeSessionId); + } +#else /* Proceed to do DelBSS even if DelSta resulted in failure */ statusCode = (tSirResultCodes)lim_del_bss(pMac, pStaDs, 0, psessionEntry); +#endif + return; end: if (0 != limMsgQ->bodyptr) { diff --git a/core/mac/src/pe/lim/lim_process_sme_req_messages.c b/core/mac/src/pe/lim/lim_process_sme_req_messages.c index b3515e086970..2c80d777fe0f 100644 --- a/core/mac/src/pe/lim/lim_process_sme_req_messages.c +++ b/core/mac/src/pe/lim/lim_process_sme_req_messages.c @@ -49,10 +49,7 @@ #include "sir_mac_prot_def.h" #include "rrm_api.h" #include "nan_datapath.h" - #include "sap_api.h" - - #include #include "cds_regdomain.h" #include "lim_process_fils.h" @@ -2294,7 +2291,7 @@ sendDisassoc: \return none \sa ----------------------------------------------------------------- */ -static void __lim_process_sme_disassoc_cnf(tpAniSirGlobal pMac, uint32_t *pMsgBuf) +void __lim_process_sme_disassoc_cnf(tpAniSirGlobal pMac, uint32_t *pMsgBuf) { tSirSmeDisassocCnf smeDisassocCnf; uint16_t aid; @@ -2627,9 +2624,8 @@ static void __lim_process_sme_deauth_req(tpAniSirGlobal mac_ctx, /* Update PE session Id */ mlm_deauth_req->sessionId = session_id; + lim_process_mlm_deauth_req(mac_ctx, (uint32_t *)mlm_deauth_req); - lim_post_mlm_message(mac_ctx, LIM_MLM_DEAUTH_REQ, - (uint32_t *)mlm_deauth_req); return; send_deauth: @@ -2971,6 +2967,27 @@ void lim_delete_all_peers(tpPESession session) } +QDF_STATUS lim_sta_send_del_bss(tpPESession session) +{ + tpAniSirGlobal mac_ctx = session->mac_ctx; + QDF_STATUS status = QDF_STATUS_E_FAILURE; + tpDphHashNode sta_ds = NULL; + + sta_ds = dph_get_hash_entry(mac_ctx, DPH_STA_HASH_INDEX_PEER, + &session->dph.dphHashTable); + if (!sta_ds) { + pe_err("DPH Entry for STA is missing, failed to send delbss"); + goto end; + } + + status = lim_del_bss(mac_ctx, sta_ds, 0, session); + if (QDF_IS_STATUS_ERROR(status)) + pe_err("delBss failed for bss %d", session->bssIdx); + +end: + return status; +} + QDF_STATUS lim_send_vdev_stop(tpPESession session) { tpAniSirGlobal mac_ctx = session->mac_ctx; @@ -3024,7 +3041,6 @@ static void lim_delete_peers_and_send_vdev_stop(tpPESession session) } #endif - static void __lim_handle_sme_stop_bss_request(tpAniSirGlobal pMac, uint32_t *pMsgBuf) { @@ -4683,6 +4699,129 @@ static void lim_process_sme_update_access_policy_vendor_ie( pe_session_entry->access_policy = update_vendor_ie->access_policy; } +#ifdef CONFIG_VDEV_SM +QDF_STATUS lim_sta_mlme_vdev_disconnect_bss(struct vdev_mlme_obj *vdev_mlme, + uint16_t data_len, void *data) +{ + tpAniSirGlobal mac_ctx; + struct scheduler_msg *msg = (struct scheduler_msg *)data; + + mac_ctx = cds_get_context(QDF_MODULE_ID_PE); + if (!mac_ctx) { + pe_err("mac_ctx is NULL"); + if (data) + qdf_mem_free(data); + return QDF_STATUS_E_INVAL; + } + pe_debug("VDEV Manager disconnect bss callback type:(%d)", msg->type); + + switch (msg->type) { + case eWNI_SME_DEAUTH_REQ: + __lim_process_sme_deauth_req(mac_ctx, + (uint32_t *)msg->bodyptr); + break; + case eWNI_SME_DISASSOC_CNF: + case eWNI_SME_DEAUTH_CNF: + __lim_process_sme_disassoc_cnf(mac_ctx, + (uint32_t *)msg->bodyptr); + break; + case eWNI_SME_DISASSOC_REQ: + __lim_process_sme_disassoc_req(mac_ctx, + (uint32_t *)msg->bodyptr); + break; + default: + pe_debug("Wrong message type received %d", msg->type); + } + return QDF_STATUS_SUCCESS; +} +#endif + +static void lim_process_sme_disassoc_cnf(tpAniSirGlobal mac_ctx, + struct scheduler_msg *msg) +{ +#ifdef CONFIG_VDEV_SM + tSirSmeDisassocCnf sme_disassoc_cnf; + tpPESession session; + uint8_t session_id; + QDF_STATUS status; + + qdf_mem_copy(&sme_disassoc_cnf, msg->bodyptr, + sizeof(struct sSirSmeDisassocCnf)); + + session = pe_find_session_by_bssid(mac_ctx, + sme_disassoc_cnf.bssid.bytes, + &session_id); + + if (LIM_IS_STA_ROLE(session)) { + status = wlan_vdev_mlme_sm_deliver_evt(session->vdev, + WLAN_VDEV_SM_EV_DOWN, + sizeof(*msg), + msg); + } else { + __lim_process_sme_disassoc_cnf(mac_ctx, + (uint32_t *)msg->bodyptr); + } +#else + __lim_process_sme_disassoc_cnf(mac_ctx, (uint32_t *)msg->bodyptr); +#endif +} + +static void lim_process_sme_disassoc_req(tpAniSirGlobal mac_ctx, + struct scheduler_msg *msg) +{ +#ifdef CONFIG_VDEV_SM + tSirSmeDisassocReq disassoc_req; + tpPESession session; + uint8_t session_id; + QDF_STATUS status; + + qdf_mem_copy(&disassoc_req, msg->bodyptr, sizeof(tSirSmeDisassocReq)); + + session = pe_find_session_by_bssid(mac_ctx, + disassoc_req.bssid.bytes, + &session_id); + if (LIM_IS_STA_ROLE(session)) { + status = wlan_vdev_mlme_sm_deliver_evt(session->vdev, + WLAN_VDEV_SM_EV_DOWN, + sizeof(*msg), + msg); + } else { + __lim_process_sme_disassoc_req(mac_ctx, + (uint32_t *)msg->bodyptr); + } +#else + __lim_process_sme_disassoc_req(mac_ctx, (uint32_t *)msg->bodyptr); +#endif +} + +static void lim_process_sme_deauth_req(tpAniSirGlobal mac_ctx, + struct scheduler_msg *msg) +{ +#ifdef CONFIG_VDEV_SM + tSirSmeDeauthReq sme_deauth_req; + tpPESession session; + uint8_t session_id; + QDF_STATUS status; + + qdf_mem_copy(&sme_deauth_req, msg->bodyptr, sizeof(tSirSmeDeauthReq)); + + session = pe_find_session_by_bssid(mac_ctx, + sme_deauth_req.bssid.bytes, + &session_id); + if (LIM_IS_STA_ROLE(session)) { + status = wlan_vdev_mlme_sm_deliver_evt(session->vdev, + WLAN_VDEV_SM_EV_DOWN, + sizeof(*msg), + msg); + } else { + __lim_process_sme_deauth_req(mac_ctx, + (uint32_t *)msg->bodyptr); + } +#else + __lim_process_sme_deauth_req(mac_ctx, (uint32_t *)msg->bodyptr); +#endif +} + /** * lim_process_sme_req_messages() * @@ -4738,16 +4877,16 @@ bool lim_process_sme_req_messages(tpAniSirGlobal pMac, break; case eWNI_SME_DISASSOC_REQ: - __lim_process_sme_disassoc_req(pMac, pMsgBuf); + lim_process_sme_disassoc_req(pMac, pMsg); break; case eWNI_SME_DISASSOC_CNF: case eWNI_SME_DEAUTH_CNF: - __lim_process_sme_disassoc_cnf(pMac, pMsgBuf); + lim_process_sme_disassoc_cnf(pMac, pMsg); break; case eWNI_SME_DEAUTH_REQ: - __lim_process_sme_deauth_req(pMac, pMsgBuf); + lim_process_sme_deauth_req(pMac, pMsg); break; case eWNI_SME_SEND_DISASSOC_FRAME: diff --git a/core/mac/src/pe/lim/lim_send_messages.c b/core/mac/src/pe/lim/lim_send_messages.c index df60557e8ac9..44f274084f1e 100644 --- a/core/mac/src/pe/lim/lim_send_messages.c +++ b/core/mac/src/pe/lim/lim_send_messages.c @@ -258,9 +258,7 @@ QDF_STATUS lim_send_switch_chnl_params(tpAniSirGlobal pMac, return QDF_STATUS_E_FAILURE; } pSessionEntry->ch_switch_in_progress = true; -#ifdef CONFIG_VDEV_SM - mlme_set_chan_switch_in_progress(pSessionEntry->vdev, true); -#endif + return QDF_STATUS_SUCCESS; } diff --git a/core/mac/src/pe/lim/lim_types.h b/core/mac/src/pe/lim/lim_types.h index eaf4d48d1b7c..572a757f301c 100644 --- a/core/mac/src/pe/lim/lim_types.h +++ b/core/mac/src/pe/lim/lim_types.h @@ -1145,4 +1145,33 @@ void lim_process_mlm_start_req(tpAniSirGlobal mac_ctx, */ void lim_process_mlm_join_req(tpAniSirGlobal mac_ctx, tLimMlmJoinReq *mlm_join_req); + +/* + * lim_process_mlm_deauth_req() - This function is called to process + * MLM_DEAUTH_REQ message from SME + * + * @mac_ctx: Pointer to Global MAC structure + * @msg_buf: A pointer to the MLM message buffer + * + * This function is called to process MLM_DEAUTH_REQ message from SME + * + * @Return: None + */ +void lim_process_mlm_deauth_req(tpAniSirGlobal mac_ctx, uint32_t *msg_buf); + +#ifdef CONFIG_VDEV_SM +/** + * lim_sta_mlme_vdev_disconnect_bss() - Disconnect from BSS + * @vdev_mlme_obj: VDEV MLME comp object + * @data_len: data size + * @data: event data + * + * API invokes BSS disconnection + * + * Return: SUCCESS on successful completion of disconnection + * FAILURE, if it fails due to any + */ +QDF_STATUS lim_sta_mlme_vdev_disconnect_bss(struct vdev_mlme_obj *vdev_mlme, + uint16_t data_len, void *data); +#endif #endif /* __LIM_TYPES_H */ diff --git a/core/mac/src/pe/lim/lim_utils.c b/core/mac/src/pe/lim/lim_utils.c index 61c14b9f7e8d..560643a2bd90 100644 --- a/core/mac/src/pe/lim/lim_utils.c +++ b/core/mac/src/pe/lim/lim_utils.c @@ -8432,6 +8432,12 @@ QDF_STATUS lim_sta_mlme_vdev_start_send(struct vdev_mlme_obj *vdev_mlme, return QDF_STATUS_SUCCESS; } +QDF_STATUS lim_sta_mlme_vdev_stop_send(struct vdev_mlme_obj *vdev_mlme, + uint16_t data_len, void *data) +{ + return lim_sta_send_del_bss((tpPESession)data); +} + void lim_send_beacon(tpAniSirGlobal mac_ctx, tpPESession session) { if (wlan_vdev_mlme_get_state(session->vdev) == diff --git a/core/mac/src/pe/lim/lim_utils.h b/core/mac/src/pe/lim/lim_utils.h index 6a56ed643724..7bfe5530cc5c 100644 --- a/core/mac/src/pe/lim/lim_utils.h +++ b/core/mac/src/pe/lim/lim_utils.h @@ -1381,6 +1381,14 @@ void lim_delete_all_peers(tpPESession session); */ QDF_STATUS lim_send_vdev_stop(tpPESession session); +/** + * lim_send_vdev_stop() -send delete bss/stop vdev req for STA + * @session: session pointer + * + * Return QDF_STATUS + */ +QDF_STATUS lim_sta_send_del_bss(tpPESession session); + /** * lim_send_start_bss_confirm() -send start bss confirm req * @mac_ctx: pointer to global mac structure @@ -1497,6 +1505,20 @@ void lim_rx_invalid_peer_process(tpAniSirGlobal mac_ctx, void lim_send_beacon(tpAniSirGlobal mac_ctx, tpPESession session); #ifdef CONFIG_VDEV_SM +/** + * lim_sta_mlme_vdev_stop_send() - send VDEV stop + * @vdev_mlme_obj: VDEV MLME comp object + * @data_len: data size + * @data: event data + * + * API invokes vdev stop + * + * Return: SUCCESS on successful completion of vdev stop + * FAILURE, if it fails due to any + */ +QDF_STATUS lim_sta_mlme_vdev_stop_send(struct vdev_mlme_obj *vdev_mlme, + uint16_t data_len, void *data); + /** * lim_ap_mlme_vdev_start_send() - Invokes VDEV start operation * @vdev_mlme_obj: VDEV MLME comp object diff --git a/core/wma/inc/wma_api.h b/core/wma/inc/wma_api.h index dba3ed6d3744..44013dbc9f40 100644 --- a/core/wma/inc/wma_api.h +++ b/core/wma/inc/wma_api.h @@ -433,6 +433,20 @@ bool wma_get_hidden_ssid_restart_in_progress(struct wma_txrx_node *iface); #ifdef CONFIG_VDEV_SM +/** + * wma_sta_mlme_vdev_start_continue - VDEV start response handling + * @vdev_mlme_obj: VDEV MLME comp object + * @data_len: data size + * @data: event data + * + * API invokes VDEV start response actions + * + * Return: SUCCESS on successful completion of start response operation + * FAILURE, if it fails due to any + */ +QDF_STATUS wma_sta_mlme_vdev_start_continue(struct vdev_mlme_obj *vdev_mlme, + uint16_t data_len, void *data); + /** * wma_ap_mlme_vdev_start_continue - VDEV start response handling * @vdev_mlme_obj: VDEV MLME comp object @@ -444,7 +458,7 @@ bool wma_get_hidden_ssid_restart_in_progress(struct wma_txrx_node *iface); * Return: SUCCESS on successful completion of start response operation * FAILURE, if it fails due to any */ -QDF_STATUS wma_mlme_vdev_start_continue(struct vdev_mlme_obj *vdev_mlme, +QDF_STATUS wma_ap_mlme_vdev_start_continue(struct vdev_mlme_obj *vdev_mlme, uint16_t data_len, void *data); /** @@ -459,10 +473,10 @@ QDF_STATUS wma_mlme_vdev_start_continue(struct vdev_mlme_obj *vdev_mlme, * FAILURE, if it fails due to any */ QDF_STATUS wma_sta_vdev_up_send(struct vdev_mlme_obj *vdev_mlme, - uint16_t data_len, void *data); + uint16_t data_len, void *data); /** - * wma_ap_mlme_vdev_stop_continue - VDEV stop response handling + * wma_mlme_vdev_stop_continue - VDEV stop response handling * @vdev_mlme_obj: VDEV MLME comp object * @data_len: data size * @data: event data @@ -472,8 +486,8 @@ QDF_STATUS wma_sta_vdev_up_send(struct vdev_mlme_obj *vdev_mlme, * Return: SUCCESS on successful completion of stop response operation * FAILURE, if it fails due to any */ -QDF_STATUS wma_ap_mlme_vdev_stop_continue(struct vdev_mlme_obj *vdev_mlme, - uint16_t data_len, void *data); +QDF_STATUS wma_mlme_vdev_stop_continue(struct vdev_mlme_obj *vdev_mlme, + uint16_t data_len, void *data); /** * wma_ap_mlme_vdev_down_send - VDEV down operation @@ -520,6 +534,19 @@ QDF_STATUS wma_ap_mlme_vdev_stop_start_send(struct vdev_mlme_obj *vdev_mlme, enum vdev_cmd_type type, uint16_t data_len, void *data); -#endif +/** + * wma_sta_mlme_vdev_down_send - VDEV down operation + * @vdev_mlme_obj: VDEV MLME comp object + * @data_len: data size + * @data: event data + * + * API invokes VDEV down operation + * + * Return: SUCCESS on successful completion of VDEV down operation + * FAILURE, if it fails due to any + */ +QDF_STATUS wma_sta_mlme_vdev_down_send(struct vdev_mlme_obj *vdev_mlme, + uint16_t data_len, void *data); #endif +#endif diff --git a/core/wma/inc/wma_internal.h b/core/wma/inc/wma_internal.h index 96d1cf41b7ea..cee104dc0ca6 100644 --- a/core/wma/inc/wma_internal.h +++ b/core/wma/inc/wma_internal.h @@ -1489,4 +1489,14 @@ int wma_roam_scan_stats_event_handler(void *handle, uint8_t *event, */ void wma_send_vdev_down_bss(tp_wma_handle wma, struct wma_target_req *req); +/** + * wma_sta_send_vdev_down_bss() - send vdev down to firmware + * @wma: wma handle. + * @req: vdev request + * + * This function sends vdev down to firmware + * + * Return: none + */ +void wma_sta_send_vdev_down_bss(tp_wma_handle wma, struct wma_target_req *req); #endif diff --git a/core/wma/src/wma_dev_if.c b/core/wma/src/wma_dev_if.c index d5bea0f98194..93ef818b5e82 100644 --- a/core/wma/src/wma_dev_if.c +++ b/core/wma/src/wma_dev_if.c @@ -5173,7 +5173,7 @@ static void wma_add_sta_req_sta_mode(tp_wma_handle wma, tpAddStaParams params) param.vdev_id = params->smesessionId; param.assoc_id = params->assocId; #ifdef CONFIG_VDEV_SM - status = wlan_vdev_mlme_sm_deliver_evt(wma->interfaces[param.vdev_id].vdev, + status = wlan_vdev_mlme_sm_deliver_evt(iface->vdev, WLAN_VDEV_SM_EV_START_SUCCESS, sizeof(param), (void *)¶m); #else diff --git a/core/wma/src/wma_utils.c b/core/wma/src/wma_utils.c index 9bcad369fb39..343ac3e14b5c 100644 --- a/core/wma/src/wma_utils.c +++ b/core/wma/src/wma_utils.c @@ -4830,8 +4830,19 @@ static QDF_STATUS wma_vdev_send_start_resp(tp_wma_handle wma, return QDF_STATUS_SUCCESS; } -QDF_STATUS wma_mlme_vdev_start_continue(struct vdev_mlme_obj *vdev_mlme, - uint16_t data_len, void *data) +QDF_STATUS wma_sta_mlme_vdev_start_continue(struct vdev_mlme_obj *vdev_mlme, + uint16_t data_len, void *data) +{ + tp_wma_handle wma = cds_get_context(QDF_MODULE_ID_WMA); + + wma_send_msg_high_priority(wma, WMA_SWITCH_CHANNEL_RSP, + data, 0); + + return QDF_STATUS_SUCCESS; +} + +QDF_STATUS wma_ap_mlme_vdev_start_continue(struct vdev_mlme_obj *vdev_mlme, + uint16_t data_len, void *data) { tp_wma_handle wma = cds_get_context(QDF_MODULE_ID_WMA); QDF_STATUS status = QDF_STATUS_SUCCESS; @@ -4851,8 +4862,8 @@ QDF_STATUS wma_mlme_vdev_start_continue(struct vdev_mlme_obj *vdev_mlme, return status; } -QDF_STATUS wma_ap_mlme_vdev_stop_continue(struct vdev_mlme_obj *vdev_mlme, - uint16_t data_len, void *data) +QDF_STATUS wma_mlme_vdev_stop_continue(struct vdev_mlme_obj *vdev_mlme, + uint16_t data_len, void *data) { return __wma_vdev_stop_resp_handler( (wmi_vdev_stopped_event_fixed_param *)data); @@ -4895,7 +4906,6 @@ QDF_STATUS wma_ap_mlme_vdev_stop_start_send(struct vdev_mlme_obj *vdev_mlme, return wma_vdev_send_start_resp(wma, bss_params); } - #else bool wma_get_hidden_ssid_restart_in_progress(struct wma_txrx_node *iface) {