diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c index 07087544e9da..fe355cea4c58 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/core/hdd/src/wlan_hdd_cfg80211.c @@ -6902,6 +6902,10 @@ wlan_hdd_wifi_test_config_policy[ .type = NLA_NESTED}, [QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_HE_TWT_REQ_SUPPORT] = { .type = NLA_U8}, + [QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_PMF_PROTECTION] = { + .type = NLA_U8}, + [QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_DISASSOC_TX] = { + .type = NLA_FLAG}, }; /** @@ -9304,6 +9308,8 @@ __wlan_hdd_cfg80211_set_wifi_test_config(struct wiphy *wiphy, uint8_t value = 0; uint8_t wmm_mode = 0; uint32_t cmd_id; + struct hdd_station_ctx *hdd_sta_ctx = + WLAN_HDD_GET_STATION_CTX_PTR(adapter); hdd_enter_dev(dev); @@ -9901,8 +9907,6 @@ __wlan_hdd_cfg80211_set_wifi_test_config(struct wiphy *wiphy, if (tb[QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_TWT_TERMINATE]) { struct wmi_twt_del_dialog_param params = {0}; - struct hdd_station_ctx *hdd_sta_ctx = - WLAN_HDD_GET_STATION_CTX_PTR(adapter); if ((adapter->device_mode != QDF_STA_MODE && adapter->device_mode != QDF_P2P_CLIENT_MODE) || @@ -9934,6 +9938,21 @@ __wlan_hdd_cfg80211_set_wifi_test_config(struct wiphy *wiphy, cfg_val); } + cmd_id = QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_PMF_PROTECTION; + if (tb[cmd_id]) { + cfg_val = nla_get_u8(tb[cmd_id]); + hdd_debug("pmf cfg: val %d", cfg_val); + sme_set_pmf_wep_cfg(hdd_ctx->mac_handle, cfg_val); + } + + cmd_id = QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_DISASSOC_TX; + if (tb[cmd_id]) { + hdd_info("Send disassoc mgmt frame"); + sme_send_disassoc_req_frame(hdd_ctx->mac_handle, + adapter->vdev_id, + hdd_sta_ctx->conn_info.bssid.bytes, + 1, false); + } if (update_sme_cfg) sme_update_config(mac_handle, sme_config); diff --git a/core/mac/inc/ani_global.h b/core/mac/inc/ani_global.h index 3eba10178efd..412788523027 100644 --- a/core/mac/inc/ani_global.h +++ b/core/mac/inc/ani_global.h @@ -104,6 +104,10 @@ static inline mac_handle_t MAC_HANDLE(struct mac_context *mac) #define HIGH_SEQ_NUM_OFFSET 4 #define DEF_HE_AUTO_SGI_LTF 0x0F07 +#define PMF_WEP_DISABLE 2 +#define PMF_INCORRECT_KEY 1 +#define PMF_CORRECT_KEY 0 + /** * enum log_event_type - Type of event initiating bug report * @WLAN_LOG_TYPE_NON_FATAL: Non fatal event @@ -797,6 +801,7 @@ struct mac_context { bool he_om_ctrl_cfg_tx_nsts_set; uint8_t he_om_ctrl_cfg_tx_nsts; bool he_om_ctrl_ul_mu_data_dis; + uint8_t is_usr_cfg_pmf_wep; #ifdef WLAN_FEATURE_11AX tDot11fIEhe_cap he_cap_2g; tDot11fIEhe_cap he_cap_5g; diff --git a/core/mac/src/pe/lim/lim_send_management_frames.c b/core/mac/src/pe/lim/lim_send_management_frames.c index ab8897f7599b..742ccd42a6cc 100644 --- a/core/mac/src/pe/lim/lim_send_management_frames.c +++ b/core/mac/src/pe/lim/lim_send_management_frames.c @@ -3354,7 +3354,13 @@ lim_send_disassoc_mgmt_frame(struct mac_context *mac, /* Prepare the BSSID */ sir_copy_mac_addr(pMacHdr->bssId, pe_session->bssId); - lim_set_protected_bit(mac, pe_session, peer, pMacHdr); + if (mac->is_usr_cfg_pmf_wep != PMF_WEP_DISABLE) + lim_set_protected_bit(mac, pe_session, peer, pMacHdr); + else + pe_debug("Skip WEP bit setting per usr cfg"); + + if (mac->is_usr_cfg_pmf_wep == PMF_INCORRECT_KEY) + txFlag |= HAL_USE_INCORRECT_KEY_PMF; nStatus = dot11f_pack_disassociation(mac, &frm, pFrame + sizeof(tSirMacMgmtHdr), diff --git a/core/mac/src/pe/lim/lim_types.h b/core/mac/src/pe/lim/lim_types.h index 416d76e0f21e..4725a39841a6 100644 --- a/core/mac/src/pe/lim/lim_types.h +++ b/core/mac/src/pe/lim/lim_types.h @@ -113,6 +113,9 @@ #define HAL_USE_BD_RATE2_FOR_MANAGEMENT_FRAME 0x40 /* Bit 6 will be used to control BD rate for Management frames */ #define HAL_USE_PEER_STA_REQUESTED_MASK 0x80 /* bit 7 will be used to control frames for p2p interface */ #define HAL_USE_PMF 0x20 +#define HAL_USE_INCORRECT_KEY_PMF 0x10 + +#define MGMT_TX_USE_INCORRECT_KEY BIT(0) #define LIM_DOS_PROTECTION_TIME 1000 //1000ms #define LIM_MIN_RSSI 0 /* 0dbm */ diff --git a/core/sme/inc/sme_api.h b/core/sme/inc/sme_api.h index 0206d476a4c9..a8c643df7870 100644 --- a/core/sme/inc/sme_api.h +++ b/core/sme/inc/sme_api.h @@ -3584,6 +3584,15 @@ bool sme_validate_channel_list(mac_handle_t mac_handle, */ void sme_set_amsdu(mac_handle_t mac_handle, bool enable); +/** + * sme_set_pmf_wep_cfg() - set user cfg for PMF setting + * @mac_handle: Opaque handle to the global MAC context + * @pmf_wep_cfg: PMF configuration + * + * Return: None + */ +void sme_set_pmf_wep_cfg(mac_handle_t mac_handle, uint8_t pmf_wep_cfg); + #ifdef WLAN_FEATURE_11AX void sme_set_he_testbed_def(mac_handle_t mac_handle, uint8_t vdev_id); void sme_reset_he_caps(mac_handle_t mac_handle, uint8_t vdev_id); diff --git a/core/sme/src/common/sme_api.c b/core/sme/src/common/sme_api.c index 99564f8de56a..d3732c22e4a7 100644 --- a/core/sme/src/common/sme_api.c +++ b/core/sme/src/common/sme_api.c @@ -15147,6 +15147,13 @@ bool sme_validate_channel_list(mac_handle_t mac_handle, return true; } +void sme_set_pmf_wep_cfg(mac_handle_t mac_handle, uint8_t pmf_wep) +{ + struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle); + + mac_ctx->is_usr_cfg_pmf_wep = pmf_wep; +} + void sme_set_amsdu(mac_handle_t mac_handle, bool enable) { struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle); @@ -15257,6 +15264,7 @@ void sme_reset_he_caps(mac_handle_t mac_handle, uint8_t vdev_id) if (QDF_IS_STATUS_ERROR(status)) sme_err("Failed to set enable bcast probe resp in FW, %d", status); + mac_ctx->is_usr_cfg_pmf_wep = PMF_CORRECT_KEY; } #endif diff --git a/core/wma/src/wma_data.c b/core/wma/src/wma_data.c index 0f46e5448870..9df9d4fbaeee 100644 --- a/core/wma/src/wma_data.c +++ b/core/wma/src/wma_data.c @@ -2606,6 +2606,8 @@ QDF_STATUS wma_tx_packet(void *wma_context, void *tx_frame, uint16_t frmLen, mgmt_param.qdf_ctx = cds_get_context(QDF_MODULE_ID_QDF_DEVICE); mgmt_param.use_6mbps = use_6mbps; mgmt_param.tx_type = tx_frm_index; + if (tx_flag & HAL_USE_INCORRECT_KEY_PMF) + mgmt_param.tx_flags |= MGMT_TX_USE_INCORRECT_KEY; /* * Update the tx_params TLV only for rates