qcacld-3.0: Add support to inject disassoc frames

Add support to inject disassoc frames with user configured pmf
options.

Change-Id: I40df805f8d6ef62dab48477c26cb9b0fc6b17929
CRs-Fixed: 2665042
This commit is contained in:
Kiran Kumar Lokere 2020-04-15 19:29:21 -07:00 committed by snandini
parent 1b4b46f32f
commit 222d174cdd
7 changed files with 55 additions and 3 deletions

View File

@ -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);

View File

@ -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;

View File

@ -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);
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),

View File

@ -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 */

View File

@ -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);

View File

@ -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

View File

@ -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