From 1f3f99fd1f0e0e5040ecd445b11b7d12cc1942ea Mon Sep 17 00:00:00 2001 From: Pragaspathi Thilagaraj Date: Wed, 24 Apr 2019 23:48:47 +0530 Subject: [PATCH] qcacld-3.0: Add support for adaptive 11r Adaptive 11r feature that enables the AP to support FT-AKM without configuring the FT-AKM in the network. The AP will advertise non-FT akm with a vendor specific IE having Adaptive 11r bit set to 1 in the IE data. The AP also advertises the MDE in beacon/probe response. The STA should check the adaptive 11r capability if the AP advertises MDE in beacon/probe and adaptive 11r capability in vendor specific IE. If adaptive 11r capability is found, STA should advertise the FT equivalent of the non-FT AKM. Introdue a compile time flag WLAN_ADAPTIVE_11R_ENABLED to enable/disable adaptive 11r support. If the AP is adaptive 11r capable, set the is_adaptive_11r_ap flag in bss descrtiptor. This flag will be sent in join request and populated to pe_session. Also mark the CSR session as adaptive 11r session based on this flag. Add changes to check for the adaptive 11r service capability advertised by firmware. If the host driver connects to adaptive 11r AP, enable RSO only if the firmware advertises adaptive 11r capability, else RSO should be disabled. If the connection is adaptive 11r connection and if the adaptive 11r ini is enabled, set the adaptive_11r flag in wmi_roam_11r_offload_tlv_param sent over the wmi command WMI_ROAM_SCAN_MODE to the firmware. This will enable firmware to filter the adaptive 11r AP from roam scan results. Change-Id: If27a2393e3f4bb68942f5ebcec0135f57627f16b CRs-Fixed: 2437988 --- Kbuild | 3 + components/mlme/core/src/wlan_mlme_main.c | 25 +++++++ components/mlme/dispatcher/inc/cfg_mlme_lfr.h | 37 ++++++++++ .../dispatcher/inc/wlan_mlme_public_struct.h | 7 ++ .../mlme/dispatcher/inc/wlan_mlme_ucfg_api.h | 21 ++++++ .../mlme/dispatcher/src/wlan_mlme_ucfg_api.c | 17 +++++ configs/default_defconfig | 3 + core/mac/inc/sir_api.h | 3 + core/sme/inc/csr_internal.h | 1 + core/sme/src/csr/csr_api_roam.c | 74 +++++++++++++++++++ core/sme/src/csr/csr_api_scan.c | 29 ++++++++ core/wma/src/wma_main.c | 28 +++++++ core/wma/src/wma_scan_roam.c | 1 + 13 files changed, 249 insertions(+) diff --git a/Kbuild b/Kbuild index 48d74057f962..aea1c37772f0 100644 --- a/Kbuild +++ b/Kbuild @@ -2527,6 +2527,9 @@ cppflags-$(CONFIG_ENABLE_SMMU_S1_TRANSLATION) += -DENABLE_SMMU_S1_TRANSLATION #Flag to enable/disable MTRACE feature cppflags-$(CONFIG_ENABLE_MTRACE_LOG) += -DENABLE_MTRACE_LOG +#Flag to enable/disable Adaptive 11r feature +cppflags-$(CONFIG_ADAPTIVE_11R) += -DWLAN_ADAPTIVE_11R + #Flag to enable NUD tracking cppflags-$(CONFIG_WLAN_NUD_TRACKING) += -DWLAN_NUD_TRACKING diff --git a/components/mlme/core/src/wlan_mlme_main.c b/components/mlme/core/src/wlan_mlme_main.c index baed8b88571f..61a64f5e6a21 100644 --- a/components/mlme/core/src/wlan_mlme_main.c +++ b/components/mlme/core/src/wlan_mlme_main.c @@ -1513,6 +1513,30 @@ static void mlme_init_stats_cfg(struct wlan_objmgr_psoc *psoc, cfg_get(psoc, CFG_REPORT_MAX_LINK_SPEED); } +#ifdef WLAN_ADAPTIVE_11R +/** + * mlme_init_adaptive_11r_cfg() - initialize enable_adaptive_11r + * flag + * @psoc: Pointer to PSOC + * @lfr: pointer to mlme lfr config + * + * Return: None + */ +static void +mlme_init_adaptive_11r_cfg(struct wlan_objmgr_psoc *psoc, + struct wlan_mlme_lfr_cfg *lfr) +{ + lfr->enable_adaptive_11r = cfg_get(psoc, CFG_ADAPTIVE_11R); +} + +#else +static inline void +mlme_init_adaptive_11r_cfg(struct wlan_objmgr_psoc *psoc, + struct wlan_mlme_lfr_cfg *lfr) +{ +} +#endif + #ifdef WLAN_FEATURE_ROAM_OFFLOAD static void mlme_init_roam_offload_cfg(struct wlan_objmgr_psoc *psoc, struct wlan_mlme_lfr_cfg *lfr) @@ -1752,6 +1776,7 @@ static void mlme_init_lfr_cfg(struct wlan_objmgr_psoc *psoc, mlme_init_roam_offload_cfg(psoc, lfr); mlme_init_ese_cfg(psoc, lfr); mlme_init_bss_load_trigger_params(psoc, &lfr->bss_load_trig); + mlme_init_adaptive_11r_cfg(psoc, lfr); mlme_init_subnet_detection(psoc, lfr); } diff --git a/components/mlme/dispatcher/inc/cfg_mlme_lfr.h b/components/mlme/dispatcher/inc/cfg_mlme_lfr.h index f20db59ff370..98ae5a5faa3e 100644 --- a/components/mlme/dispatcher/inc/cfg_mlme_lfr.h +++ b/components/mlme/dispatcher/inc/cfg_mlme_lfr.h @@ -2385,6 +2385,42 @@ #define LFR_SUBNET_DETECTION_ALL #endif +#ifdef WLAN_ADAPTIVE_11R +/* + * + * adaptive_11r - Enable/disable adaptive 11r feature. + * @Min: 0 + * @Max: 1 + * @Default: 0 + * + * Adaptive 11r feature enables the AP to support FT-AKM without + * configuring the FT-AKM in the network. The AP will advertise non-FT akm + * with a vendor specific IE having Adaptive 11r bit set to 1 in the IE data. + * The AP also advertises the MDE in beacon/probe response. + * + * STA should check the adaptive 11r capability if the AP advertises MDE in + * beacon/probe and adaptive 11r capability in vendor specific IE. If adaptive + * 11r capability is found, STA can advertise the FT equivalent of the non-FT + * AKM and connect with 11r protocol. + * + * Related: None. + * + * Supported Feature: Fast BSS Transition + * + * Usage: External + * + * + */ +#define CFG_ADAPTIVE_11R CFG_INI_BOOL( \ + "enable_adaptive_11r", \ + false, \ + "Enable/disable adaptive 11r support") + +#define ADAPTIVE_11R_ALL CFG(CFG_ADAPTIVE_11R) +#else +#define ADAPTIVE_11R_ALL +#endif + /* * * roaming_scan_policy - To config roaming scan policy @@ -2589,6 +2625,7 @@ CFG(CFG_POST_INACTIVITY_ROAM_SCAN_PERIOD) \ CFG(CFG_BSS_LOAD_TRIG_5G_RSSI_THRES) \ CFG(CFG_BSS_LOAD_TRIG_2G_RSSI_THRES) \ + ADAPTIVE_11R_ALL \ ROAM_OFFLOAD_ALL \ LFR_ESE_ALL \ LFR_SUBNET_DETECTION_ALL diff --git a/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h b/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h index 802f73eb9c87..0f3f929b7c06 100644 --- a/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h +++ b/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h @@ -1352,6 +1352,9 @@ struct bss_load_trigger { * @roam_scan_hi_rssi_ub: Upper bound after which 5GHz scan * @roam_prefer_5ghz: Prefer roaming to 5GHz Bss * @roam_intra_band: Prefer roaming within Band + * @enable_adaptive_11r Flag to check if adaptive 11r ini is enabled + * @tgt_adaptive_11r_cap: Flag to check if target supports adaptive + * 11r * @roam_scan_home_away_time: The home away time to firmware * @roam_scan_n_probes: The number of probes to be sent for firmware roaming * @delay_before_vdev_stop:Wait time for tx complete before vdev stop @@ -1450,6 +1453,10 @@ struct wlan_mlme_lfr_cfg { uint32_t roam_scan_hi_rssi_ub; bool roam_prefer_5ghz; bool roam_intra_band; +#ifdef WLAN_ADAPTIVE_11R + bool enable_adaptive_11r; + bool tgt_adaptive_11r_cap; +#endif uint16_t roam_scan_home_away_time; uint32_t roam_scan_n_probes; uint8_t delay_before_vdev_stop; diff --git a/components/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h b/components/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h index 8dc5bf104be9..fa62cfb5e7a9 100644 --- a/components/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h +++ b/components/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h @@ -1156,6 +1156,27 @@ QDF_STATUS ucfg_mlme_is_roam_scan_offload_enabled(struct wlan_objmgr_psoc *psoc, bool *val); +#ifdef WLAN_ADAPTIVE_11R +/** + * ucfg_mlme_set_tgt_adaptive_11r_cap() - Set adaptive 11r target service + * capability + * @psoc: pointer to psoc object + * @val: Target capability of adaptive 11r + * + * Return: QDF Status + */ +QDF_STATUS +ucfg_mlme_set_tgt_adaptive_11r_cap(struct wlan_objmgr_psoc *psoc, + bool val); +#else +static inline QDF_STATUS +ucfg_mlme_set_tgt_adaptive_11r_cap(struct wlan_objmgr_psoc *psoc, + bool val) +{ + return QDF_STATUS_SUCCESS; +} +#endif + /** * ucfg_mlme_set_roam_scan_offload_enabled() - Set roam scan offload enable * @psoc: pointer to psoc object diff --git a/components/mlme/dispatcher/src/wlan_mlme_ucfg_api.c b/components/mlme/dispatcher/src/wlan_mlme_ucfg_api.c index 3e33d846f9b6..aee44af97697 100644 --- a/components/mlme/dispatcher/src/wlan_mlme_ucfg_api.c +++ b/components/mlme/dispatcher/src/wlan_mlme_ucfg_api.c @@ -849,6 +849,23 @@ ucfg_mlme_set_fast_transition_enabled(struct wlan_objmgr_psoc *psoc, return QDF_STATUS_SUCCESS; } +#ifdef WLAN_ADAPTIVE_11R +QDF_STATUS +ucfg_mlme_set_tgt_adaptive_11r_cap(struct wlan_objmgr_psoc *psoc, + bool val) +{ + struct wlan_mlme_psoc_obj *mlme_obj; + + mlme_obj = mlme_get_psoc_obj(psoc); + if (!mlme_obj) + return QDF_STATUS_E_INVAL; + + mlme_obj->cfg.lfr.tgt_adaptive_11r_cap = val; + + return QDF_STATUS_SUCCESS; +} +#endif + QDF_STATUS ucfg_mlme_is_roam_scan_offload_enabled(struct wlan_objmgr_psoc *psoc, bool *val) diff --git a/configs/default_defconfig b/configs/default_defconfig index 56efc5dc4b15..e13ecb1c76e7 100644 --- a/configs/default_defconfig +++ b/configs/default_defconfig @@ -159,6 +159,9 @@ CONFIG_QCOM_VOWIFI_11R := y #Flag to enable disable ACTION OUI feature CONFIG_WLAN_FEATURE_ACTION_OUI := y +#Flag to enable Adaptive 11r feature +CONFIG_ADAPTIVE_11R := y + #Flag to enable FILS Feature (11ai) CONFIG_WLAN_FEATURE_FILS := y ifneq ($(CONFIG_QCA_CLD_WLAN),) diff --git a/core/mac/inc/sir_api.h b/core/mac/inc/sir_api.h index 67c2741f1af5..83c3c2b76825 100644 --- a/core/mac/inc/sir_api.h +++ b/core/mac/inc/sir_api.h @@ -671,6 +671,7 @@ struct bss_description { struct fils_ind_elements fils_info_element; #endif uint32_t assoc_disallowed; + uint32_t adaptive_11r_ap; /* Please keep the structure 4 bytes aligned above the ieFields */ uint32_t ieFields[1]; }; @@ -912,6 +913,7 @@ struct join_req { #endif bool is11Rconnection; + bool is_adaptive_11r_connection; #ifdef FEATURE_WLAN_ESE bool isESEFeatureIniEnabled; bool isESEconnection; @@ -2249,6 +2251,7 @@ struct roam_offload_scan_req { uint32_t R0KH_ID_Length; uint8_t RoamKeyMgmtOffloadEnabled; struct pmkid_mode_bits pmkid_modes; + bool is_adaptive_11r_connection; /* Idle/Disconnect roam parameters */ struct wmi_idle_roam_params idle_roam_params; diff --git a/core/sme/inc/csr_internal.h b/core/sme/inc/csr_internal.h index c670de74d29c..8ac6c4699622 100644 --- a/core/sme/inc/csr_internal.h +++ b/core/sme/inc/csr_internal.h @@ -689,6 +689,7 @@ struct csr_roam_session { bool is_fils_connection; uint16_t fils_seq_num; bool discon_in_progress; + bool is_adaptive_11r_connection; struct csr_disconnect_stats disconnect_stats; }; diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c index d3273ba17987..efa2fc414dda 100644 --- a/core/sme/src/csr/csr_api_roam.c +++ b/core/sme/src/csr/csr_api_roam.c @@ -15208,6 +15208,27 @@ csr_update_he_caps_mcs(struct wlan_mlme_cfg *mlme_cfg, } #endif +#ifdef WLAN_ADAPTIVE_11R +/** + * csr_get_adaptive_11r_enabled() - Function to check if adaptive 11r + * ini is enabled or disabled + * @mac: pointer to mac context + * + * Return: true if adaptive 11r is enabled + */ +static bool +csr_get_adaptive_11r_enabled(struct mac_context *mac) +{ + return mac->mlme_cfg->lfr.enable_adaptive_11r; +} +#else +static inline bool +csr_get_adaptive_11r_enabled(struct mac_context *mac) +{ + return false; +} +#endif + /** * The communication between HDD and LIM is thru mailbox (MB). * Both sides will access the data structure "struct join_req". @@ -15525,6 +15546,16 @@ QDF_STATUS csr_send_join_req_msg(struct mac_context *mac, uint32_t sessionId, csr_join_req->operationalRateSet.numRates = 0; csr_join_req->extendedRateSet.numRates = 0; } + + if (pBssDescription->adaptive_11r_ap) + pSession->is_adaptive_11r_connection = + csr_get_adaptive_11r_enabled(mac); + else + pSession->is_adaptive_11r_connection = false; + + csr_join_req->is_adaptive_11r_connection = + pSession->is_adaptive_11r_connection; + /* rsnIE */ if (csr_is_profile_wpa(pProfile)) { /* Insert the Wpa IE into the join request */ @@ -17897,6 +17928,25 @@ void csr_update_roam_scan_ese_params(struct roam_offload_scan_req *req_buf, } #endif +#ifdef WLAN_ADAPTIVE_11R +static void +csr_update_roam_req_adaptive_11r(struct csr_roam_session *session, + struct mac_context *mac_ctx, + struct roam_offload_scan_req *req_buf) +{ + req_buf->is_adaptive_11r_connection = + session->is_adaptive_11r_connection; +} +#else +static void +csr_update_roam_req_adaptive_11r(struct csr_roam_session *session, + struct mac_context *mac_ctx, + struct roam_offload_scan_req *req_buf) +{ + req_buf->is_adaptive_11r_connection = false; +} +#endif + /** * csr_update_roam_scan_offload_request() - updates req msg with roam offload * parameters @@ -17942,6 +17992,7 @@ csr_update_roam_scan_offload_request(struct mac_context *mac_ctx, mac_ctx->mlme_cfg->lfr.roam_trigger_reason_bitmask; req_buf->roam_force_rssi_trigger = mac_ctx->mlme_cfg->lfr.roam_force_rssi_trigger; + csr_update_roam_req_adaptive_11r(session, mac_ctx, req_buf); /* fill bss load triggered roam related configs */ req_buf->bss_load_trig_enabled = @@ -19460,6 +19511,24 @@ uint8_t csr_get_roam_enabled_sta_sessionid(struct mac_context *mac_ctx) return WLAN_UMAC_VDEV_ID_MAX; } +#ifdef WLAN_ADAPTIVE_11R +static bool +csr_is_adaptive_11r_roam_supported(struct mac_context *mac_ctx, + struct csr_roam_session *session) +{ + return session->is_adaptive_11r_connection && + mac_ctx->mlme_cfg->lfr.tgt_adaptive_11r_cap; +} +#else +static bool +csr_is_adaptive_11r_roam_supported(struct mac_context *mac_ctx, + struct csr_roam_session *session) + +{ + return true; +} +#endif + /** * csr_roam_offload_scan() - populates roam offload scan request and sends to * WMA @@ -19559,6 +19628,11 @@ csr_roam_offload_scan(struct mac_context *mac_ctx, uint8_t session_id, return QDF_STATUS_SUCCESS; } + if (!csr_is_adaptive_11r_roam_supported(mac_ctx, session)) { + sme_info("Adaptive 11r Roaming not suppprted by fw"); + return QDF_STATUS_SUCCESS; + } + /* Roaming is not supported currently for OWE akm */ if (roam_profile_akm == eCSR_AUTH_TYPE_OWE) { sme_info("OWE Roaming not suppprted by fw"); diff --git a/core/sme/src/csr/csr_api_scan.c b/core/sme/src/csr/csr_api_scan.c index ac7d589cfb78..31eb8df56414 100644 --- a/core/sme/src/csr/csr_api_scan.c +++ b/core/sme/src/csr/csr_api_scan.c @@ -2354,6 +2354,31 @@ static enum wlan_phymode csr_convert_dotllmod_phymode(eCsrPhyMode dotllmode) return con_phy_mode; } +#ifdef WLAN_ADAPTIVE_11R +/** + * csr_update_adaptive_11r_scan_filter - Copy adaptive 11r ini to scan + * module + * @mac_ctx: Pointer to mac_context + * @scan_filter: Scan filter to be sent to scan module + * + * Return: None + */ +static void +csr_update_adaptive_11r_scan_filter(struct mac_context *mac_ctx, + struct scan_filter *filter) +{ + filter->enable_adaptive_11r = + mac_ctx->mlme_cfg->lfr.enable_adaptive_11r; +} +#else +static inline void +csr_update_adaptive_11r_scan_filter(struct mac_context *mac_ctx, + struct scan_filter *filter) +{ + filter->enable_adaptive_11r = false; +} +#endif + static QDF_STATUS csr_prepare_scan_filter(struct mac_context *mac_ctx, tCsrScanResultFilter *pFilter, struct scan_filter *filter) @@ -2463,6 +2488,9 @@ static QDF_STATUS csr_prepare_scan_filter(struct mac_context *mac_ctx, filter->bss_scoring_required = true; else filter->bss_scoring_required = false; + + csr_update_adaptive_11r_scan_filter(mac_ctx, filter); + if (!pFilter->BSSIDs.numOfBSSIDs) { if (policy_mgr_map_concurrency_mode( &pFilter->csrPersona, &new_mode)) { @@ -2652,6 +2680,7 @@ static QDF_STATUS csr_fill_bss_from_scan_entry(struct mac_context *mac_ctx, bss_desc->tsf_delta = scan_entry->tsf_delta; bss_desc->assoc_disallowed = csr_is_assoc_disallowed(mac_ctx, scan_entry); + bss_desc->adaptive_11r_ap = scan_entry->adaptive_11r_ap; qdf_mem_copy(&bss_desc->mbssid_info, &scan_entry->mbssid_info, sizeof(struct scan_mbssid_info)); diff --git a/core/wma/src/wma_main.c b/core/wma/src/wma_main.c index 43503a2b04f4..806b3464c588 100644 --- a/core/wma/src/wma_main.c +++ b/core/wma/src/wma_main.c @@ -5818,9 +5818,37 @@ static void wma_set_pmo_caps(struct wlan_objmgr_psoc *psoc) WMA_LOGE("Failed to set PMO capabilities; status:%d", status); } +/** + * wma_set_mlme_caps() - Populate the MLME related target capabilities to the + * mlme component + * @psoc: Pointer to psoc object + * + * Return: None + */ +static void wma_set_mlme_caps(struct wlan_objmgr_psoc *psoc) +{ + tp_wma_handle wma; + bool tgt_cap; + QDF_STATUS status; + + wma = cds_get_context(QDF_MODULE_ID_WMA); + if (!wma) { + WMA_LOGE("%s: wma handler is null", __func__); + return; + } + + tgt_cap = wmi_service_enabled(wma->wmi_handle, + wmi_service_adaptive_11r_support); + + status = ucfg_mlme_set_tgt_adaptive_11r_cap(psoc, tgt_cap); + if (QDF_IS_STATUS_ERROR(status)) + WMA_LOGE("Failed to set adaptive 11r cap"); +} + static void wma_set_component_caps(struct wlan_objmgr_psoc *psoc) { wma_set_pmo_caps(psoc); + wma_set_mlme_caps(psoc); } #if defined(WLAN_FEATURE_GTK_OFFLOAD) && defined(WLAN_POWER_MANAGEMENT_OFFLOAD) diff --git a/core/wma/src/wma_scan_roam.c b/core/wma/src/wma_scan_roam.c index 85da84bffd47..9f17abd2a39c 100644 --- a/core/wma/src/wma_scan_roam.c +++ b/core/wma/src/wma_scan_roam.c @@ -320,6 +320,7 @@ static void wma_roam_scan_offload_set_params( params->fw_okc = roam_req->pmkid_modes.fw_okc; params->fw_pmksa_cache = roam_req->pmkid_modes.fw_pmksa_cache; params->rct_validity_timer = roam_req->rct_validity_timer; + params->is_adaptive_11r = roam_req->is_adaptive_11r_connection; WMA_LOGD(FL("qos_caps: %d, qos_enabled: %d, ho_delay_for_rx: %d, roam_scan_mode: %d"), params->roam_offload_params.qos_caps, params->roam_offload_params.qos_enabled,