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 f58e39709801..9e87327e0ce7 100644 --- a/components/mlme/core/inc/wlan_mlme_vdev_mgr_interface.h +++ b/components/mlme/core/inc/wlan_mlme_vdev_mgr_interface.h @@ -26,6 +26,18 @@ #include #include "include/wlan_vdev_mlme.h" +/** + * enum vdev_assoc_type - VDEV associate/reassociate type + * @VDEV_ASSOC: associate + * @VDEV_REASSOC: reassociate + * @VDEV_FT_REASSOC: fast reassociate + */ +enum vdev_assoc_type { + VDEV_ASSOC, + VDEV_REASSOC, + VDEV_FT_REASSOC +}; + /** * struct mlme_legacy_priv - VDEV MLME legacy priv object * @chan_switch_in_progress: flag to indicate that channel switch is in progress @@ -33,12 +45,14 @@ * in progress * @vdev_start_failed: flag to indicate that vdev start failed. * @connection_fail: flag to indicate connection failed + * @assoc_type: vdev associate/reassociate type */ struct mlme_legacy_priv { bool chan_switch_in_progress; bool hidden_ssid_restart_in_progress; bool vdev_start_failed; bool connection_fail; + enum vdev_assoc_type assoc_type; }; /** @@ -144,5 +158,24 @@ bool mlme_get_vdev_start_failed(struct wlan_objmgr_vdev *vdev); * Return: true or false */ bool mlme_is_vdev_in_beaconning_mode(enum QDF_OPMODE vdev_opmode); + +/** + * mlme_set_assoc_type() - set associate type + * @vdev: vdev pointer + * @assoc_type: type to be set + * + * Return: QDF_STATUS + */ +QDF_STATUS mlme_set_assoc_type(struct wlan_objmgr_vdev *vdev, + enum vdev_assoc_type assoc_type); + +/** + * mlme_get_assoc_type() - get associate type + * @vdev: vdev pointer + * + * Return: associate type + */ +enum vdev_assoc_type mlme_get_assoc_type(struct wlan_objmgr_vdev *vdev); + #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 4b78d0674756..8a3f869be054 100644 --- a/components/mlme/core/src/wlan_mlme_vdev_mgr_interface.c +++ b/components/mlme/core/src/wlan_mlme_vdev_mgr_interface.c @@ -541,6 +541,41 @@ bool mlme_is_connection_fail(struct wlan_objmgr_vdev *vdev) return mlme_priv->connection_fail; } +QDF_STATUS mlme_set_assoc_type(struct wlan_objmgr_vdev *vdev, + enum vdev_assoc_type assoc_type) +{ + struct vdev_mlme_obj *vdev_mlme; + struct mlme_legacy_priv *mlme_priv; + + vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); + if (!vdev_mlme) { + mlme_err("vdev component object is NULL"); + return QDF_STATUS_E_FAILURE; + } + + mlme_priv = (struct mlme_legacy_priv *)vdev_mlme->legacy_vdev_ptr; + + mlme_priv->assoc_type = assoc_type; + + return QDF_STATUS_SUCCESS; +} + +enum vdev_assoc_type mlme_get_assoc_type(struct wlan_objmgr_vdev *vdev) +{ + struct vdev_mlme_obj *vdev_mlme; + struct mlme_legacy_priv *mlme_priv; + + vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); + if (!vdev_mlme) { + mlme_err("vdev component object is NULL"); + return false; + } + + mlme_priv = (struct mlme_legacy_priv *)vdev_mlme->legacy_vdev_ptr; + + return mlme_priv->assoc_type; +} + QDF_STATUS mlme_set_vdev_start_failed(struct wlan_objmgr_vdev *vdev, bool val) { diff --git a/core/mac/src/pe/include/lim_ft.h b/core/mac/src/pe/include/lim_ft.h index 25abe4e34bd1..0082f0f62fe4 100644 --- a/core/mac/src/pe/include/lim_ft.h +++ b/core/mac/src/pe/include/lim_ft.h @@ -41,8 +41,8 @@ void lim_ft_cleanup_pre_auth_info(tpAniSirGlobal pMac, int lim_process_ft_pre_auth_req(tpAniSirGlobal pMac, struct scheduler_msg *pMsg); void lim_process_ft_preauth_rsp_timeout(tpAniSirGlobal pMac); -void lim_process_mlm_ft_reassoc_req(tpAniSirGlobal pMac, uint32_t *pMsgBuf, - tpPESession psessionEntry); +void lim_process_mlm_ft_reassoc_req(tpAniSirGlobal pMac, + tpPESession psessionEntry); void lim_perform_ft_pre_auth(tpAniSirGlobal pMac, QDF_STATUS status, uint32_t *data, tpPESession psessionEntry); void lim_post_ft_pre_auth_rsp(tpAniSirGlobal pMac, QDF_STATUS status, @@ -56,7 +56,8 @@ QDF_STATUS lim_ft_setup_auth_session(tpAniSirGlobal pMac, void lim_process_mlm_reassoc_cnf(tpAniSirGlobal mac_ctx, uint32_t *msg); void lim_process_sta_mlm_add_bss_rsp_ft(tpAniSirGlobal pMac, struct scheduler_msg *limMsgQ, tpPESession psessionEntry); -void lim_process_mlm_reassoc_req(tpAniSirGlobal mac_ctx, uint32_t *msg); +void lim_process_mlm_reassoc_req(tpAniSirGlobal mac_ctx, + tLimMlmReassocReq *reassoc_req); void lim_preauth_scan_event_handler(tpAniSirGlobal mac_ctx, enum sir_scan_event_type event, uint8_t session_id, @@ -70,7 +71,7 @@ static inline void lim_ft_cleanup_pre_auth_info(tpAniSirGlobal pMac, static inline void lim_process_ft_preauth_rsp_timeout(tpAniSirGlobal pMac) {} static inline void lim_process_mlm_ft_reassoc_req(tpAniSirGlobal pMac, - uint32_t *pMsgBuf, tpPESession psessionEntry) + tpPESession psessionEntry) {} static inline void lim_handle_ft_pre_auth_rsp(tpAniSirGlobal pMac, QDF_STATUS status, uint8_t *auth_rsp, @@ -83,7 +84,7 @@ static inline void lim_process_sta_mlm_add_bss_rsp_ft(tpAniSirGlobal pMac, struct scheduler_msg *limMsgQ, tpPESession psessionEntry) {} static inline void lim_process_mlm_reassoc_req(tpAniSirGlobal mac_ctx, - uint32_t *msg) + tLimMlmReassocReq *reassoc_req) {} static inline void lim_preauth_scan_event_handler(tpAniSirGlobal mac_ctx, enum sir_scan_event_type event, diff --git a/core/mac/src/pe/lim/lim_process_mlm_host_roam.c b/core/mac/src/pe/lim/lim_process_mlm_host_roam.c index c8dbad2ca2d9..17c49c327f81 100644 --- a/core/mac/src/pe/lim/lim_process_mlm_host_roam.c +++ b/core/mac/src/pe/lim/lim_process_mlm_host_roam.c @@ -56,20 +56,14 @@ static void lim_handle_sme_reaasoc_result(tpAniSirGlobal, tSirResultCodes, * * Return: None */ -void lim_process_mlm_reassoc_req(tpAniSirGlobal mac_ctx, uint32_t *msg) +void lim_process_mlm_reassoc_req(tpAniSirGlobal mac_ctx, + tLimMlmReassocReq *reassoc_req) { uint8_t channel, sec_ch_offset; struct tLimPreAuthNode *auth_node; - tLimMlmReassocReq *reassoc_req; tLimMlmReassocCnf reassoc_cnf; tpPESession session; - if (msg == NULL) { - pe_err("Buffer is Pointing to NULL"); - return; - } - - reassoc_req = (tLimMlmReassocReq *) msg; session = pe_find_session_by_session_id(mac_ctx, reassoc_req->sessionId); if (NULL == session) { @@ -572,18 +566,15 @@ end: /** * lim_process_mlm_ft_reassoc_req() - Handle the Reassoc request * @pMac: Global MAC context - * @pMsgBuf: Buffer which holds the data * @psessionEntry: PE Session * * This function handles the Reassoc Req from SME * * Return: None */ -void lim_process_mlm_ft_reassoc_req(tpAniSirGlobal pMac, uint32_t *pMsgBuf, +void lim_process_mlm_ft_reassoc_req(tpAniSirGlobal pMac, tpPESession psessionEntry) { - uint8_t smeSessionId = 0; - uint16_t transactionId = 0; uint8_t chanNum = 0; tLimMlmReassocReq *pMlmReassocReq; uint16_t caps; @@ -593,10 +584,6 @@ void lim_process_mlm_ft_reassoc_req(tpAniSirGlobal pMac, uint32_t *pMsgBuf, uint32_t teleBcnEn = 0; chanNum = psessionEntry->currentOperChannel; - lim_get_session_info(pMac, (uint8_t *) pMsgBuf, &smeSessionId, - &transactionId); - psessionEntry->smeSessionId = smeSessionId; - psessionEntry->transactionId = transactionId; #ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM /* FEATURE_WLAN_DIAG_SUPPORT */ lim_diag_event_report(pMac, WLAN_PE_DIAG_REASSOCIATING, 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 f0f08038582a..d2650bd8f46a 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 @@ -1177,7 +1177,7 @@ static inline void lim_update_sae_config(tpPESession session, #endif /** - * lim_send_join_req() - send vdev start request + * lim_send_join_req() - send vdev start request for assoc *@session: pe session *@mlm_join_req: join req * @@ -1188,6 +1188,7 @@ static inline void lim_update_sae_config(tpPESession session, static QDF_STATUS lim_send_join_req(tpPESession session, tLimMlmJoinReq *mlm_join_req) { + mlme_set_assoc_type(session->vdev, VDEV_ASSOC); return wlan_vdev_mlme_sm_deliver_evt(session->vdev, WLAN_VDEV_SM_EV_START, sizeof(*mlm_join_req), @@ -1203,6 +1204,59 @@ static QDF_STATUS lim_send_join_req(tpPESession session, } #endif +/** + * lim_send_reassoc_req() - send vdev start request for reassoc + *@session: pe session + *@mlm_join_req: join req + * + * Return: QDF_STATUS + */ + +#ifdef CONFIG_VDEV_SM +static QDF_STATUS lim_send_reassoc_req(tpPESession session, + tLimMlmReassocReq *reassoc_req) +{ + mlme_set_assoc_type(session->vdev, VDEV_REASSOC); + return wlan_vdev_mlme_sm_deliver_evt(session->vdev, + WLAN_VDEV_SM_EV_START, + sizeof(*reassoc_req), + reassoc_req); +} +#else +static QDF_STATUS lim_send_reassoc_req(tpPESession session, + tLimMlmReassocReq *reassoc_req) +{ + lim_process_mlm_reassoc_req(session->mac_ctx, reassoc_req); + + return QDF_STATUS_SUCCESS; +} +#endif + +/** + * lim_send_ft_reassoc_req() - send vdev start request for ft_reassoc + *@session: pe session + *@mlm_join_req: join req + * + * Return: QDF_STATUS + */ + +#ifdef CONFIG_VDEV_SM +static QDF_STATUS lim_send_ft_reassoc_req(tpPESession session) +{ + mlme_set_assoc_type(session->vdev, VDEV_FT_REASSOC); + return wlan_vdev_mlme_sm_deliver_evt(session->vdev, + WLAN_VDEV_SM_EV_START, + sizeof(*session), + session); +} +#else +static QDF_STATUS lim_send_ft_reassoc_req(tpPESession session) +{ + lim_process_mlm_ft_reassoc_req(session->mac_ctx, session); + + return QDF_STATUS_SUCCESS; +} +#endif /** * __lim_process_sme_join_req() - process SME_JOIN_REQ message @@ -1772,6 +1826,8 @@ static void __lim_process_sme_reassoc_req(tpAniSirGlobal mac_ctx, ret_code = eSIR_SME_INVALID_PARAMETERS; goto end; } + lim_get_session_info(mac_ctx, (uint8_t *)msg_buf, + &sme_session_id, &transaction_id); session_entry = pe_find_session_by_bssid(mac_ctx, reassoc_req->bssDescription.bssId, @@ -1781,8 +1837,6 @@ static void __lim_process_sme_reassoc_req(tpAniSirGlobal mac_ctx, lim_print_mac_addr(mac_ctx, reassoc_req->bssDescription.bssId, LOGE); ret_code = eSIR_SME_INVALID_PARAMETERS; - lim_get_session_info(mac_ctx, (uint8_t *)msg_buf, - &sme_session_id, &transaction_id); session_entry = pe_find_session_by_sme_session_id(mac_ctx, sme_session_id); @@ -1865,8 +1919,9 @@ static void __lim_process_sme_reassoc_req(tpAniSirGlobal mac_ctx, goto end; } - lim_process_mlm_ft_reassoc_req(mac_ctx, msg_buf, - session_entry); + session_entry->smeSessionId = sme_session_id; + session_entry->transactionId = transaction_id; + lim_send_ft_reassoc_req(session_entry); return; } /* @@ -1975,8 +2030,8 @@ static void __lim_process_sme_reassoc_req(tpAniSirGlobal mac_ctx, session_entry->peSessionId, session_entry->limSmeState)); - lim_post_mlm_message(mac_ctx, - LIM_MLM_REASSOC_REQ, (uint32_t *)mlm_reassoc_req); + lim_send_reassoc_req(session_entry, mlm_reassoc_req); + return; end: if (reassoc_req) { diff --git a/core/mac/src/pe/lim/lim_utils.c b/core/mac/src/pe/lim/lim_utils.c index a1ad6590c80a..ccaad9b6bc83 100644 --- a/core/mac/src/pe/lim/lim_utils.c +++ b/core/mac/src/pe/lim/lim_utils.c @@ -63,6 +63,7 @@ #endif #include "cfg_mlme_obss_ht40.h" #include "cfg_ucfg_api.h" +#include "lim_ft.h" #define ASCII_SPACE_CHARACTER 0x20 @@ -8392,6 +8393,7 @@ QDF_STATUS lim_sta_mlme_vdev_start_send(struct vdev_mlme_obj *vdev_mlme, uint16_t data_len, void *data) { tpAniSirGlobal mac_ctx; + enum vdev_assoc_type assoc_type; mac_ctx = cds_get_context(QDF_MODULE_ID_PE); if (!mac_ctx) { @@ -8401,8 +8403,20 @@ QDF_STATUS lim_sta_mlme_vdev_start_send(struct vdev_mlme_obj *vdev_mlme, return QDF_STATUS_E_INVAL; } - lim_process_mlm_join_req(mac_ctx, (tLimMlmJoinReq *)data); - + assoc_type = mlme_get_assoc_type(vdev_mlme->vdev); + switch (assoc_type) { + case VDEV_ASSOC: + lim_process_mlm_join_req(mac_ctx, (tLimMlmJoinReq *)data); + break; + case VDEV_REASSOC: + lim_process_mlm_reassoc_req(mac_ctx, (tLimMlmReassocReq *)data); + break; + case VDEV_FT_REASSOC: + lim_process_mlm_ft_reassoc_req(mac_ctx, (tPESession *)data); + break; + default: + pe_err("assoc_type %d is invalid", assoc_type); + } return QDF_STATUS_SUCCESS; } diff --git a/core/wma/src/wma_utils.c b/core/wma/src/wma_utils.c index 2a4a285579be..6494e2abefdf 100644 --- a/core/wma/src/wma_utils.c +++ b/core/wma/src/wma_utils.c @@ -4807,9 +4807,22 @@ 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); + enum vdev_assoc_type assoc_type; - wma_send_msg_high_priority(wma, WMA_SWITCH_CHANNEL_RSP, - data, 0); + assoc_type = mlme_get_assoc_type(vdev_mlme->vdev); + switch (assoc_type) { + case VDEV_ASSOC: + case VDEV_REASSOC: + wma_send_msg_high_priority(wma, WMA_SWITCH_CHANNEL_RSP, + data, 0); + break; + case VDEV_FT_REASSOC: + wma_send_msg_high_priority(wma, WMA_ADD_BSS_RSP, + data, 0); + break; + default: + WMA_LOGE(FL("assoc_type %d is invalid"), assoc_type); + } return QDF_STATUS_SUCCESS; }