diff --git a/components/mlme/dispatcher/inc/cfg_mlme_generic.h b/components/mlme/dispatcher/inc/cfg_mlme_generic.h index 8fb38abd29..3ea3eb9143 100644 --- a/components/mlme/dispatcher/inc/cfg_mlme_generic.h +++ b/components/mlme/dispatcher/inc/cfg_mlme_generic.h @@ -651,11 +651,16 @@ enum wlan_wds_mode { * * disable_4way_hs_offload - Enable/Disable 4 way handshake offload to firmware * @Min: 0 - * @Max: 1 - * @Default: 0 + * @Max: 0x2 + * @Default: 0x2 * - * 0 4-way HS to be handled in firmware - * 1 4-way HS to be handled in supplicant + * 0x0 - 4-way HS to be handled in firmware for the AKMs except for SAE and + * OWE roaming the 4way HS is handled in supplicant by default + * 0x1 - 4-way HS to be handled in supplicant + * 0x2 - 4-way HS to be handled in firmware for the AKMs including the SAE + * Roam except for OWE roaming the 4way HS is handled in supplicant + * + * Based on the requirement the Max value can be increased per AKM. * * Related: None * @@ -665,9 +670,13 @@ enum wlan_wds_mode { * * */ -#define CFG_DISABLE_4WAY_HS_OFFLOAD CFG_INI_BOOL("disable_4way_hs_offload", \ - 0, \ - "Enable/disable 4 way handshake offload to firmware") +#define CFG_DISABLE_4WAY_HS_OFFLOAD CFG_INI_UINT( \ + "disable_4way_hs_offload", \ + 0, \ + 0x2, \ + 0x2, \ + CFG_VALUE_OR_DEFAULT, \ + "Enable/disable 4 way handshake offload to firmware") /* * diff --git a/components/mlme/dispatcher/inc/wlan_mlme_api.h b/components/mlme/dispatcher/inc/wlan_mlme_api.h index dda406dd92..41e5b03644 100644 --- a/components/mlme/dispatcher/inc/wlan_mlme_api.h +++ b/components/mlme/dispatcher/inc/wlan_mlme_api.h @@ -2423,7 +2423,7 @@ wlan_mlme_get_self_gen_frm_pwr(struct wlan_objmgr_psoc *psoc, * Return: QDF Status */ QDF_STATUS -wlan_mlme_get_4way_hs_offload(struct wlan_objmgr_psoc *psoc, bool *value); +wlan_mlme_get_4way_hs_offload(struct wlan_objmgr_psoc *psoc, uint32_t *value); /** * wlan_mlme_get_bmiss_skip_full_scan_value() - To get value of diff --git a/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h b/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h index a49ccd47de..100e3acc20 100644 --- a/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h +++ b/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h @@ -1366,7 +1366,7 @@ struct wlan_mlme_generic { bool enable_beacon_reception_stats; bool enable_remove_time_stamp_sync_cmd; bool data_stall_recovery_fw_support; - bool disable_4way_hs_offload; + uint32_t disable_4way_hs_offload; bool as_enabled; uint8_t mgmt_retry_max; bool bmiss_skip_full_scan; diff --git a/components/mlme/dispatcher/src/wlan_mlme_api.c b/components/mlme/dispatcher/src/wlan_mlme_api.c index cb3db4a8bf..33218530fb 100644 --- a/components/mlme/dispatcher/src/wlan_mlme_api.c +++ b/components/mlme/dispatcher/src/wlan_mlme_api.c @@ -3773,7 +3773,7 @@ wlan_mlme_get_self_gen_frm_pwr(struct wlan_objmgr_psoc *psoc, } QDF_STATUS -wlan_mlme_get_4way_hs_offload(struct wlan_objmgr_psoc *psoc, bool *value) +wlan_mlme_get_4way_hs_offload(struct wlan_objmgr_psoc *psoc, uint32_t *value) { struct wlan_mlme_psoc_ext_obj *mlme_obj; diff --git a/components/target_if/connection_mgr/src/target_if_cm_roam_offload.c b/components/target_if/connection_mgr/src/target_if_cm_roam_offload.c index 3f99e9dd13..1ce434d6a5 100644 --- a/components/target_if/connection_mgr/src/target_if_cm_roam_offload.c +++ b/components/target_if/connection_mgr/src/target_if_cm_roam_offload.c @@ -799,6 +799,10 @@ target_if_get_wmi_roam_offload_flag(uint32_t flag) if (flag & WLAN_ROAM_BMISS_FINAL_SCAN_TYPE) roam_offload_flag |= WMI_ROAM_BMISS_FINAL_SCAN_TYPE_FLAG; + if (flag & WLAN_ROAM_SKIP_SAE_ROAM_4WAY_HANDSHAKE) + roam_offload_flag |= + WMI_VDEV_PARAM_SKIP_SAE_ROAM_4WAY_HANDSHAKE; + return roam_offload_flag; } diff --git a/components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_public_struct.h b/components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_public_struct.h index 8687abe702..df29cc0683 100644 --- a/components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_public_struct.h +++ b/components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_public_struct.h @@ -511,15 +511,20 @@ enum roam_cfg_param { * miss event at firmware * @WLAN_ROAM_SKIP_EAPOL_4WAY_HANDSHAKE: Disable 4 Way-HS offload to firmware * Setting this flag will make the eapol packets reach to host every time - * and can cause frequent APPS wake-ups. + * and can cause frequent APPS wake-ups. And clearing this flag will make + * eapol offload to firmware except for SAE and OWE roam. * @WLAN_ROAM_BMISS_FINAL_SCAN_TYPE: Set this flag to skip full scan on final * bmiss and use the channel map to do the partial scan alone + * @WLAN_ROAM_SKIP_SAE_ROAM_4WAY_HANDSHAKE: Disable 4 Way-HS offload to firmware + * Setting this flag will make the eapol packets reach to host and clearing this + * flag will make eapol offload to firmware including for SAE roam. */ enum roam_offload_init_flags { WLAN_ROAM_FW_OFFLOAD_ENABLE = BIT(1), WLAN_ROAM_BMISS_FINAL_SCAN_ENABLE = BIT(2), WLAN_ROAM_SKIP_EAPOL_4WAY_HANDSHAKE = BIT(3), - WLAN_ROAM_BMISS_FINAL_SCAN_TYPE = BIT(4) + WLAN_ROAM_BMISS_FINAL_SCAN_TYPE = BIT(4), + WLAN_ROAM_SKIP_SAE_ROAM_4WAY_HANDSHAKE = BIT(5) }; /** diff --git a/components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_tgt_if_tx_api.h b/components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_tgt_if_tx_api.h index 831b41e31c..0bbf40aca1 100644 --- a/components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_tgt_if_tx_api.h +++ b/components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_tgt_if_tx_api.h @@ -46,6 +46,9 @@ wlan_cm_roam_send_set_vdev_pcl(struct wlan_objmgr_psoc *psoc, #endif /* WLAN_FEATURE_ROAM_OFFLOAD */ #if defined(WLAN_FEATURE_HOST_ROAM) || defined(WLAN_FEATURE_ROAM_OFFLOAD) + +#define CFG_DISABLE_4WAY_HS_OFFLOAD_DEFAULT BIT(0) + /** * wlan_cm_tgt_send_roam_offload_init() - Send WMI_VDEV_PARAM_ROAM_FW_OFFLOAD * to init/deinit roaming module at firmware diff --git a/components/umac/mlme/connection_mgr/dispatcher/src/wlan_cm_tgt_if_tx_api.c b/components/umac/mlme/connection_mgr/dispatcher/src/wlan_cm_tgt_if_tx_api.c index d9d2e6ab26..84b41bb859 100644 --- a/components/umac/mlme/connection_mgr/dispatcher/src/wlan_cm_tgt_if_tx_api.c +++ b/components/umac/mlme/connection_mgr/dispatcher/src/wlan_cm_tgt_if_tx_api.c @@ -164,7 +164,8 @@ QDF_STATUS wlan_cm_tgt_send_roam_offload_init(struct wlan_objmgr_psoc *psoc, struct wlan_cm_roam_tx_ops *roam_tx_ops; struct wlan_objmgr_vdev *vdev; struct wlan_roam_offload_init_params init_msg = {0}; - bool disable_4way_hs_offload, bmiss_skip_full_scan; + uint32_t disable_4way_hs_offload; + bool bmiss_skip_full_scan; vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id, WLAN_MLME_NB_ID); @@ -190,9 +191,14 @@ QDF_STATUS wlan_cm_tgt_send_roam_offload_init(struct wlan_objmgr_psoc *psoc, WLAN_ROAM_BMISS_FINAL_SCAN_ENABLE; wlan_mlme_get_4way_hs_offload(psoc, &disable_4way_hs_offload); - if (disable_4way_hs_offload) + if (!disable_4way_hs_offload) init_msg.roam_offload_flag |= - WLAN_ROAM_SKIP_EAPOL_4WAY_HANDSHAKE; + WLAN_ROAM_SKIP_SAE_ROAM_4WAY_HANDSHAKE; + if (disable_4way_hs_offload & + CFG_DISABLE_4WAY_HS_OFFLOAD_DEFAULT) + init_msg.roam_offload_flag |= + (WLAN_ROAM_SKIP_EAPOL_4WAY_HANDSHAKE | + WLAN_ROAM_SKIP_SAE_ROAM_4WAY_HANDSHAKE); wlan_mlme_get_bmiss_skip_full_scan_value(psoc, &bmiss_skip_full_scan); diff --git a/core/wma/src/wma_main.c b/core/wma/src/wma_main.c index 4e29cb26be..300bae128e 100644 --- a/core/wma/src/wma_main.c +++ b/core/wma/src/wma_main.c @@ -6920,6 +6920,12 @@ int wma_rx_service_ready_ext_event(void *handle, uint8_t *event, else wlan_res_cfg->pktcapture_support = false; + if (wmi_service_enabled(wmi_handle, + wmi_service_sae_eapol_offload_support)) + wlan_res_cfg->sae_eapol_offload = true; + else + wlan_res_cfg->sae_eapol_offload = false; + wma_debug("num_vdevs: %u", wlan_res_cfg->num_vdevs); wma_init_dbr_params(wma_handle);