diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c index 8b1b448776f9..d15273e6e92e 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/core/hdd/src/wlan_hdd_cfg80211.c @@ -15641,7 +15641,11 @@ static int wlan_hdd_cfg80211_connect_start(struct hdd_adapter *adapter, qdf_mem_copy((void *)(roam_profile->SSIDs.SSIDList->SSID.ssId), ssid, ssid_len); - roam_profile->do_not_roam = !adapter->fast_roaming_allowed; + roam_profile->supplicant_disabled_roaming = + !adapter->fast_roaming_allowed; + roam_profile->roaming_allowed_on_iface = + adapter->fast_roaming_allowed; + /* cleanup bssid hint */ qdf_mem_zero(roam_profile->bssid_hint.bytes, QDF_MAC_ADDR_SIZE); @@ -15650,7 +15654,7 @@ static int wlan_hdd_cfg80211_connect_start(struct hdd_adapter *adapter, if (bssid) { roam_profile->BSSIDs.numOfBSSIDs = 1; - roam_profile->do_not_roam = true; + roam_profile->supplicant_disabled_roaming = true; qdf_mem_copy((void *)(roam_profile->BSSIDs.bssid), bssid, QDF_MAC_ADDR_SIZE); /* diff --git a/core/sme/inc/csr_api.h b/core/sme/inc/csr_api.h index a5044feaeec7..0e56a302ab5f 100644 --- a/core/sme/inc/csr_api.h +++ b/core/sme/inc/csr_api.h @@ -999,9 +999,10 @@ typedef struct tagCsrRoamProfile { tSirMacRateSet extended_rates; struct qdf_mac_addr bssid_hint; bool force_24ghz_in_ht20; - bool do_not_roam; uint32_t cac_duration_ms; uint32_t dfs_regdomain; + bool supplicant_disabled_roaming; + bool roaming_allowed_on_iface; #ifdef WLAN_FEATURE_FILS_SK bool fils_connection; uint8_t *hlp_ie; diff --git a/core/sme/src/common/sme_api.c b/core/sme/src/common/sme_api.c index 4a527e75a0ea..afc368b66a1c 100644 --- a/core/sme/src/common/sme_api.c +++ b/core/sme/src/common/sme_api.c @@ -7460,18 +7460,21 @@ QDF_STATUS sme_config_fast_roaming(tHalHandle hal, uint8_t session_id, struct csr_roam_session *session = CSR_GET_SESSION(mac_ctx, session_id); QDF_STATUS status; - /* do_not_roam flag is set in wlan_hdd_cfg80211_connect_start - * when supplicant initiate connect request with BSSID. - * This flag reset when supplicant sends vendor command to enable - * roaming after association. + /* + * supplicant_disabled_roaming flag is set to true in + * wlan_hdd_cfg80211_connect_start when supplicant initiate connect + * request with BSSID. This flag is reset when supplicant sends + * vendor command to enable roaming after association. * * This request from wpa_supplicant will be skipped in this function - * if roaming is disabled using driver command or INI and do_not_roam - * flag remains set. So make sure to set do_not_roam flag as per - * wpa_supplicant even if roam request from wpa_supplicant ignored. + * if roaming is disabled using driver command or INI and + * supplicant_disabled_roaming flag remains set. So make sure to set + * supplicant_disabled_roaming flag as per wpa_supplicant even if roam + * request from wpa_supplicant ignored. */ if (session && session->pCurRoamProfile) - session->pCurRoamProfile->do_not_roam = !is_fast_roam_enabled; + session->pCurRoamProfile->supplicant_disabled_roaming = + !is_fast_roam_enabled; if (!mac_ctx->roam.configParam.isFastRoamIniFeatureEnabled) { sme_debug("Fast roam is disabled through ini"); @@ -7539,11 +7542,20 @@ QDF_STATUS sme_stop_roaming(tHalHandle hal, uint8_t session_id, uint8_t reason) tSirRoamOffloadScanReq *req; tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal); tpCsrNeighborRoamControlInfo roam_info; + struct csr_roam_session *session; if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) { sme_err("incorrect session/vdev ID"); return QDF_STATUS_E_INVAL; } + + session = CSR_GET_SESSION(mac_ctx, session_id); + if (session->pCurRoamProfile && + !session->pCurRoamProfile->roaming_allowed_on_iface) { + sme_debug("Roaming was never started on session %d", + session_id); + return QDF_STATUS_SUCCESS; + } roam_info = &mac_ctx->roam.neighborRoamInfo[session_id]; req = qdf_mem_malloc(sizeof(*req)); if (!req) { diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c index 98304ef0d2de..f7c9b52cc32f 100644 --- a/core/sme/src/csr/csr_api_roam.c +++ b/core/sme/src/csr/csr_api_roam.c @@ -7936,7 +7936,10 @@ QDF_STATUS csr_roam_copy_profile(tpAniSirGlobal pMac, pDstProfile->wps_state = pSrcProfile->wps_state; pDstProfile->ieee80211d = pSrcProfile->ieee80211d; pDstProfile->sap_dot11mc = pSrcProfile->sap_dot11mc; - pDstProfile->do_not_roam = pSrcProfile->do_not_roam; + pDstProfile->supplicant_disabled_roaming = + pSrcProfile->supplicant_disabled_roaming; + pDstProfile->roaming_allowed_on_iface = + pSrcProfile->roaming_allowed_on_iface; qdf_mem_copy(&pDstProfile->Keys, &pSrcProfile->Keys, sizeof(pDstProfile->Keys)); #ifdef WLAN_FEATURE_11W @@ -18664,10 +18667,16 @@ csr_roam_offload_scan(tpAniSirGlobal mac_ctx, uint8_t session_id, return QDF_STATUS_E_FAILURE; } + if ((session->pCurRoamProfile && + session->pCurRoamProfile->roaming_allowed_on_iface == false)) { + sme_debug("Roaming disabled on iface, session: %d", session_id); + return QDF_STATUS_E_FAILURE; + } + if ((ROAM_SCAN_OFFLOAD_START == command && - REASON_CTX_INIT != reason) && - (session->pCurRoamProfile && - session->pCurRoamProfile->do_not_roam)) { + REASON_CTX_INIT != reason) && + (session->pCurRoamProfile && + session->pCurRoamProfile->supplicant_disabled_roaming)) { sme_debug("Supplicant disabled driver roaming"); return QDF_STATUS_E_FAILURE; } diff --git a/core/sme/src/csr/csr_neighbor_roam.c b/core/sme/src/csr/csr_neighbor_roam.c index 13d5b2b324c9..eb3534d7170c 100644 --- a/core/sme/src/csr/csr_neighbor_roam.c +++ b/core/sme/src/csr/csr_neighbor_roam.c @@ -961,7 +961,7 @@ static void csr_neighbor_roam_info_ctx_init( tpCsrNeighborRoamControlInfo ngbr_roam_info = &pMac->roam.neighborRoamInfo[session_id]; struct csr_roam_session *session = &pMac->roam.roamSession[session_id]; - + struct tagCsrRoamProfile *roam_profile = session->pCurRoamProfile; int init_ft_flag = false; /* @@ -1059,10 +1059,9 @@ static void csr_neighbor_roam_info_ctx_init( ROAM_SCAN_OFFLOAD_START, REASON_CTX_INIT); - if (session->pCurRoamProfile && - session->pCurRoamProfile->do_not_roam) { + if (roam_profile && + roam_profile->supplicant_disabled_roaming) { sme_debug("Supplicant disabled driver roaming"); - csr_roam_offload_scan(pMac, session_id, ROAM_SCAN_OFFLOAD_STOP, REASON_SUPPLICANT_DISABLED_ROAMING);