From 753c26db74f8f3484b49902e8d37da2dce110fbc Mon Sep 17 00:00:00 2001 From: Vevek Venkatesan Date: Mon, 7 Jun 2021 15:57:08 +0530 Subject: [PATCH] qcacld-3.0: defer sending STA_CONNECT to IPA after key install Unlike wpa2, in wpa3 roaming scenario, roaming is not fully offloaded to FW, EAPOL handshake and key install are done from host, in current design during assoc completion handler, it sends STA_CONNECT event to IPA and IPA gets hung waiting for buffer replenish from FW and FW is waiting for current thread to return, this causes deadlock, so defer sending STA_CONNECT event to IPA after EAPOL handshake and key install for all the secure connections, hence IPA HW is ready to process the STA_CONNECT event, in this case. Change-Id: I19961cdd303ccef13621c7a20867ba852342a526 CRs-Fixed: 2958313 --- core/hdd/src/wlan_hdd_assoc.c | 12 +++++ core/hdd/src/wlan_hdd_cm_connect.c | 85 ++++++++++++++++++------------ 2 files changed, 63 insertions(+), 34 deletions(-) diff --git a/core/hdd/src/wlan_hdd_assoc.c b/core/hdd/src/wlan_hdd_assoc.c index 05577b7427..2a5c1e7857 100644 --- a/core/hdd/src/wlan_hdd_assoc.c +++ b/core/hdd/src/wlan_hdd_assoc.c @@ -2439,6 +2439,18 @@ static int hdd_change_sta_state_authenticated(struct hdd_adapter *adapter, WLAN_HDD_GET_STATION_CTX_PTR(adapter); mac_addr = hddstactx->conn_info.bssid.bytes; + + if (ucfg_ipa_is_enabled() && !hddstactx->conn_info.is_authenticated && + adapter->device_mode == QDF_STA_MODE && + hddstactx->conn_info.auth_type != eCSR_AUTH_TYPE_NONE && + hddstactx->conn_info.auth_type != eCSR_AUTH_TYPE_OPEN_SYSTEM && + hddstactx->conn_info.auth_type != eCSR_AUTH_TYPE_SHARED_KEY) + ucfg_ipa_wlan_evt(adapter->hdd_ctx->pdev, adapter->dev, + adapter->device_mode, adapter->vdev_id, + WLAN_IPA_STA_CONNECT, mac_addr, + WLAN_REG_IS_24GHZ_CH_FREQ( + hddstactx->conn_info.chan_freq)); + hdd_cm_set_peer_authenticate(adapter, &hddstactx->conn_info.bssid, false); diff --git a/core/hdd/src/wlan_hdd_cm_connect.c b/core/hdd/src/wlan_hdd_cm_connect.c index 0c5c648239..9c6729b1be 100644 --- a/core/hdd/src/wlan_hdd_cm_connect.c +++ b/core/hdd/src/wlan_hdd_cm_connect.c @@ -816,6 +816,39 @@ static void hdd_cm_save_connect_info(struct hdd_adapter *adapter, hdd_cm_save_bss_info(adapter, rsp); } +#ifdef WLAN_FEATURE_FILS_SK +static bool hdd_cm_is_fils_connection(struct wlan_cm_connect_resp *rsp) +{ + return rsp->is_fils_connection; +} +#else +static inline +bool hdd_cm_is_fils_connection(struct wlan_cm_connect_resp *rsp) +{ + return false; +} +#endif + +#ifdef WLAN_FEATURE_ROAM_OFFLOAD +static bool hdd_cm_is_roam_auth_required(struct hdd_station_ctx *sta_ctx, + struct wlan_cm_connect_resp *rsp) +{ + if (!rsp->roaming_info) + return false; + + if (rsp->roaming_info->auth_status == ROAM_AUTH_STATUS_AUTHENTICATED) + return false; + + return true; +} +#else +static bool hdd_cm_is_roam_auth_required(struct hdd_station_ctx *sta_ctx, + struct wlan_cm_connect_resp *rsp) +{ + return true; +} +#endif + static void hdd_cm_connect_success_pre_user_update(struct wlan_objmgr_vdev *vdev, struct wlan_cm_connect_resp *rsp) @@ -828,6 +861,8 @@ hdd_cm_connect_success_pre_user_update(struct wlan_objmgr_vdev *vdev, uint32_t ie_len; uint8_t *ie_field; mac_handle_t mac_handle; + bool is_auth_required = true; + bool is_roam_offload = false; bool is_roam = rsp->is_reassoc; ol_txrx_soc_handle soc = cds_get_context(QDF_MODULE_ID_SOC); uint32_t phymode; @@ -941,7 +976,22 @@ hdd_cm_connect_success_pre_user_update(struct wlan_objmgr_vdev *vdev, adapter->is_link_up_service_needed = false; } - if (ucfg_ipa_is_enabled()) + if (!rsp->is_wps_connection && + (sta_ctx->conn_info.auth_type == eCSR_AUTH_TYPE_NONE || + sta_ctx->conn_info.auth_type == eCSR_AUTH_TYPE_OPEN_SYSTEM || + sta_ctx->conn_info.auth_type == eCSR_AUTH_TYPE_SHARED_KEY || + hdd_cm_is_fils_connection(rsp))) + is_auth_required = false; + + if (is_roam) + /* If roaming is set check if FW roaming/LFR3 */ + ucfg_mlme_get_roaming_offload(hdd_ctx->psoc, &is_roam_offload); + + if (is_roam_offload) + /* for LFR 3 get authenticated info from resp */ + is_auth_required = hdd_cm_is_roam_auth_required(sta_ctx, rsp); + + if (ucfg_ipa_is_enabled() && !is_auth_required) ucfg_ipa_wlan_evt(hdd_ctx->pdev, adapter->dev, adapter->device_mode, adapter->vdev_id, @@ -965,39 +1015,6 @@ hdd_cm_connect_success_pre_user_update(struct wlan_objmgr_vdev *vdev, /* hdd_objmgr_set_peer_mlme_auth_state */ } -#ifdef WLAN_FEATURE_FILS_SK -static bool hdd_cm_is_fils_connection(struct wlan_cm_connect_resp *rsp) -{ - return rsp->is_fils_connection; -} -#else -static inline -bool hdd_cm_is_fils_connection(struct wlan_cm_connect_resp *rsp) -{ - return false; -} -#endif - -#ifdef WLAN_FEATURE_ROAM_OFFLOAD -static bool hdd_cm_is_roam_auth_required(struct hdd_station_ctx *sta_ctx, - struct wlan_cm_connect_resp *rsp) -{ - if (!rsp->roaming_info) - return false; - - if (rsp->roaming_info->auth_status == ROAM_AUTH_STATUS_AUTHENTICATED) - return false; - - return true; -} -#else -static bool hdd_cm_is_roam_auth_required(struct hdd_station_ctx *sta_ctx, - struct wlan_cm_connect_resp *rsp) -{ - return true; -} -#endif - static void hdd_cm_connect_success_post_user_update(struct wlan_objmgr_vdev *vdev, struct wlan_cm_connect_resp *rsp)