qcacld-3.0: BIGTK feature support
BIGTK feature support Change-Id: Ide9b0db436e43152a4180a460f21a7340b443756 CRs-Fixed: 2648269
This commit is contained in:
parent
dca63a6617
commit
ec1bd31ce7
@ -139,6 +139,7 @@ struct wlan_mlme_roam {
|
||||
* @disconnect_info: Disconnection information
|
||||
* @vdev_stop_type: vdev stop type request
|
||||
* @roam_off_state: Roam offload state
|
||||
* @bigtk_vdev_support: BIGTK feature support for this vdev (SAP)
|
||||
*/
|
||||
struct mlme_legacy_priv {
|
||||
bool chan_switch_in_progress;
|
||||
@ -155,6 +156,7 @@ struct mlme_legacy_priv {
|
||||
struct wlan_disconnect_info disconnect_info;
|
||||
uint32_t vdev_stop_type;
|
||||
struct wlan_mlme_roam mlme_roam;
|
||||
bool bigtk_vdev_support;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -111,6 +111,10 @@ mlme_set_vdev_start_failed(struct wlan_objmgr_vdev *vdev, bool val);
|
||||
*/
|
||||
bool mlme_is_connection_fail(struct wlan_objmgr_vdev *vdev);
|
||||
|
||||
QDF_STATUS mlme_set_bigtk_support(struct wlan_objmgr_vdev *vdev, bool val);
|
||||
|
||||
bool mlme_get_bigtk_support(struct wlan_objmgr_vdev *vdev);
|
||||
|
||||
/**
|
||||
* mlme_set_connection_fail() - set connection failure flag
|
||||
* @vdev: vdev pointer
|
||||
|
@ -628,6 +628,34 @@ bool ap_mlme_is_hidden_ssid_restart_in_progress(struct wlan_objmgr_vdev *vdev)
|
||||
return mlme_priv->hidden_ssid_restart_in_progress;
|
||||
}
|
||||
|
||||
QDF_STATUS mlme_set_bigtk_support(struct wlan_objmgr_vdev *vdev, bool val)
|
||||
{
|
||||
struct mlme_legacy_priv *mlme_priv;
|
||||
|
||||
mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
|
||||
if (!mlme_priv) {
|
||||
mlme_legacy_err("vdev legacy private object is NULL");
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
}
|
||||
|
||||
mlme_priv->bigtk_vdev_support = val;
|
||||
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
bool mlme_get_bigtk_support(struct wlan_objmgr_vdev *vdev)
|
||||
{
|
||||
struct mlme_legacy_priv *mlme_priv;
|
||||
|
||||
mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
|
||||
if (!mlme_priv) {
|
||||
mlme_legacy_err("vdev legacy private object is NULL");
|
||||
return false;
|
||||
}
|
||||
|
||||
return mlme_priv->bigtk_vdev_support;
|
||||
}
|
||||
|
||||
QDF_STATUS mlme_set_connection_fail(struct wlan_objmgr_vdev *vdev, bool val)
|
||||
{
|
||||
struct mlme_legacy_priv *mlme_priv;
|
||||
|
@ -794,6 +794,16 @@ QDF_STATUS wlan_mlme_set_sap_11ac_override(struct wlan_objmgr_psoc *psoc,
|
||||
QDF_STATUS wlan_mlme_get_oce_sta_enabled_info(struct wlan_objmgr_psoc *psoc,
|
||||
bool *value);
|
||||
|
||||
/**
|
||||
* wlan_mlme_get_bigtk_support() - Get the BIGTK support
|
||||
* @psoc: pointer to psoc object
|
||||
* @value: pointer to the value which will be filled for the caller
|
||||
*
|
||||
* Return: QDF Status
|
||||
*/
|
||||
QDF_STATUS wlan_mlme_get_bigtk_support(struct wlan_objmgr_psoc *psoc,
|
||||
bool *value);
|
||||
|
||||
/**
|
||||
* wlan_mlme_get_oce_sap_enabled_info() - Get the OCE feature enable
|
||||
* info for SAP
|
||||
|
@ -951,12 +951,14 @@ struct wlan_mlme_chain_cfg {
|
||||
/**
|
||||
* struct mlme_tgt_caps - mlme related capability coming from target (FW)
|
||||
* @data_stall_recovery_fw_support: does target supports data stall recovery.
|
||||
* @bigtk_support: does the target support bigtk capability or not.
|
||||
*
|
||||
* Add all the mlme-tgt related capablities here, and the public API would fill
|
||||
* the related capability in the required mlme cfg structure.
|
||||
*/
|
||||
struct mlme_tgt_caps {
|
||||
bool data_stall_recovery_fw_support;
|
||||
bool bigtk_support;
|
||||
};
|
||||
|
||||
/**
|
||||
@ -1134,6 +1136,7 @@ struct wlan_mlme_chainmask {
|
||||
* @enable_ring_buffer: Decide to enable/disable ring buffer for bug report
|
||||
* @enable_peer_unmap_conf_support: Indicate whether to send conf for peer unmap
|
||||
* @dfs_chan_ageout_time: Set DFS Channel ageout time
|
||||
* @bigtk_support: Whether BIGTK is supported or not
|
||||
*/
|
||||
struct wlan_mlme_generic {
|
||||
enum band_info band_capability;
|
||||
@ -1170,6 +1173,7 @@ struct wlan_mlme_generic {
|
||||
bool enable_ring_buffer;
|
||||
bool enable_peer_unmap_conf_support;
|
||||
uint8_t dfs_chan_ageout_time;
|
||||
bool bigtk_support;
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -1835,6 +1835,23 @@ QDF_STATUS ucfg_mlme_get_oce_sta_enabled_info(struct wlan_objmgr_psoc *psoc,
|
||||
return wlan_mlme_get_oce_sta_enabled_info(psoc, value);
|
||||
}
|
||||
|
||||
/**
|
||||
* ucfg_mlme_get_bigtk_support() - Get whether bigtk is supported or not.
|
||||
*
|
||||
* @psoc: pointer to psoc object
|
||||
* @value: pointer to the value which will be filled for the caller
|
||||
*
|
||||
* Inline UCFG API to be used by HDD/OSIF callers to get the BIGTK support
|
||||
*
|
||||
* Return: QDF_STATUS_SUCCESS or QDF_STATUS_FAILURE
|
||||
*/
|
||||
static inline
|
||||
QDF_STATUS ucfg_mlme_get_bigtk_support(struct wlan_objmgr_psoc *psoc,
|
||||
bool *value)
|
||||
{
|
||||
return wlan_mlme_get_bigtk_support(psoc, value);
|
||||
}
|
||||
|
||||
/**
|
||||
* ucfg_mlme_get_oce_sap_enabled_info() - Get OCE feature enable/disable
|
||||
* info for SAP
|
||||
|
@ -455,6 +455,8 @@ wlan_mlme_update_cfg_with_tgt_caps(struct wlan_objmgr_psoc *psoc,
|
||||
|
||||
mlme_obj->cfg.gen.data_stall_recovery_fw_support =
|
||||
tgt_caps->data_stall_recovery_fw_support;
|
||||
|
||||
mlme_obj->cfg.gen.bigtk_support = tgt_caps->bigtk_support;
|
||||
}
|
||||
|
||||
#ifdef WLAN_FEATURE_11AX
|
||||
@ -2021,6 +2023,19 @@ QDF_STATUS wlan_mlme_set_go_11ac_override(struct wlan_objmgr_psoc *psoc,
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
QDF_STATUS wlan_mlme_get_bigtk_support(struct wlan_objmgr_psoc *psoc,
|
||||
bool *value)
|
||||
{
|
||||
struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
|
||||
|
||||
if (!mlme_obj)
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
|
||||
*value = mlme_obj->cfg.gen.bigtk_support;
|
||||
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
QDF_STATUS wlan_mlme_get_oce_sta_enabled_info(struct wlan_objmgr_psoc *psoc,
|
||||
bool *value)
|
||||
{
|
||||
|
@ -14550,6 +14550,17 @@ static void wlan_hdd_cfg80211_set_wiphy_scan_flags(struct wiphy *wiphy)
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(CFG80211_BIGTK_CONFIGURATION_SUPPORT)
|
||||
static void wlan_hdd_cfg80211_set_bigtk_flags(struct wiphy *wiphy)
|
||||
{
|
||||
wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_BEACON_PROTECTION);
|
||||
}
|
||||
#else
|
||||
static void wlan_hdd_cfg80211_set_bigtk_flags(struct wiphy *wiphy)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(CFG80211_SCAN_OCE_CAPABILITY_SUPPORT) || \
|
||||
(LINUX_VERSION_CODE >= KERNEL_VERSION(4, 15, 0))
|
||||
static void wlan_hdd_cfg80211_set_wiphy_oce_scan_flags(struct wiphy *wiphy)
|
||||
@ -15206,6 +15217,7 @@ void wlan_hdd_update_wiphy(struct hdd_context *hdd_ctx)
|
||||
QDF_STATUS status;
|
||||
struct wiphy *wiphy = hdd_ctx->wiphy;
|
||||
uint8_t allow_mcc_go_diff_bi = 0, enable_mcc = 0;
|
||||
bool is_bigtk_supported;
|
||||
|
||||
if (!wiphy) {
|
||||
hdd_err("Invalid wiphy");
|
||||
@ -15230,6 +15242,13 @@ void wlan_hdd_update_wiphy(struct hdd_context *hdd_ctx)
|
||||
if (QDF_IS_STATUS_SUCCESS(status) && dfs_master_capable)
|
||||
wlan_hdd_cfg80211_set_dfs_offload_feature(wiphy);
|
||||
|
||||
|
||||
status = ucfg_mlme_get_bigtk_support(hdd_ctx->psoc,
|
||||
&is_bigtk_supported);
|
||||
|
||||
if (QDF_IS_STATUS_SUCCESS(status) && is_bigtk_supported)
|
||||
wlan_hdd_cfg80211_set_bigtk_flags(wiphy);
|
||||
|
||||
status = ucfg_mlme_get_oce_sta_enabled_info(hdd_ctx->psoc,
|
||||
&is_oce_sta_enabled);
|
||||
if (QDF_IS_STATUS_ERROR(status))
|
||||
@ -16747,6 +16766,35 @@ static int wlan_hdd_cfg80211_set_default_key(struct wiphy *wiphy,
|
||||
return errno;
|
||||
}
|
||||
|
||||
#if defined (CFG80211_BIGTK_CONFIGURATION_SUPPORT)
|
||||
static int _wlan_hdd_cfg80211_set_default_beacon_key(struct wiphy *wiphy,
|
||||
struct net_device *ndev,
|
||||
u8 key_index)
|
||||
{
|
||||
hdd_enter();
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int wlan_hdd_cfg80211_set_default_beacon_key(struct wiphy *wiphy,
|
||||
struct net_device *ndev,
|
||||
u8 key_index)
|
||||
{
|
||||
int errno;
|
||||
struct osif_vdev_sync *vdev_sync;
|
||||
|
||||
errno = osif_vdev_sync_op_start(ndev, &vdev_sync);
|
||||
if (errno)
|
||||
return errno;
|
||||
|
||||
errno = _wlan_hdd_cfg80211_set_default_beacon_key(wiphy, ndev,
|
||||
key_index);
|
||||
|
||||
osif_vdev_sync_op_stop(vdev_sync);
|
||||
|
||||
return errno;
|
||||
}
|
||||
#endif
|
||||
|
||||
void wlan_hdd_cfg80211_unlink_bss(struct hdd_adapter *adapter,
|
||||
tSirMacAddr bssid, uint8_t *ssid,
|
||||
uint8_t ssid_len)
|
||||
@ -23306,6 +23354,9 @@ static struct cfg80211_ops wlan_hdd_cfg80211_ops = {
|
||||
.mgmt_tx = wlan_hdd_mgmt_tx,
|
||||
.mgmt_tx_cancel_wait = wlan_hdd_cfg80211_mgmt_tx_cancel_wait,
|
||||
.set_default_mgmt_key = wlan_hdd_set_default_mgmt_key,
|
||||
#if defined (CFG80211_BIGTK_CONFIGURATION_SUPPORT)
|
||||
.set_default_beacon_key = wlan_hdd_cfg80211_set_default_beacon_key,
|
||||
#endif
|
||||
.set_txq_params = wlan_hdd_set_txq_params,
|
||||
.dump_station = wlan_hdd_cfg80211_dump_station,
|
||||
.get_station = wlan_hdd_cfg80211_get_station,
|
||||
|
@ -5070,6 +5070,7 @@ int wlan_hdd_cfg80211_start_bss(struct hdd_adapter *adapter,
|
||||
bool go_force_11n_for_11ac = 0;
|
||||
bool bval = false;
|
||||
bool enable_dfs_scan = true;
|
||||
struct s_ext_cap *p_ext_cap;
|
||||
|
||||
hdd_enter();
|
||||
|
||||
@ -5206,6 +5207,29 @@ int wlan_hdd_cfg80211_start_bss(struct hdd_adapter *adapter,
|
||||
|
||||
if (adapter->device_mode == QDF_SAP_MODE ||
|
||||
adapter->device_mode == QDF_P2P_GO_MODE) {
|
||||
ie = wlan_get_ie_ptr_from_eid(DOT11F_EID_EXTCAP,
|
||||
beacon->tail,
|
||||
beacon->tail_len);
|
||||
if (ie && (ie[0] != DOT11F_EID_EXTCAP ||
|
||||
ie[1] > DOT11F_IE_EXTCAP_MAX_LEN)) {
|
||||
hdd_err("Invalid IEs eid: %d elem_len: %d", ie[0],
|
||||
ie[1]);
|
||||
ret = -EINVAL;
|
||||
goto error;
|
||||
}
|
||||
if (ie) {
|
||||
bool target_bigtk_support = false;
|
||||
|
||||
p_ext_cap = (struct s_ext_cap *)(&ie[2]);
|
||||
hdd_err("beacon protection %d",
|
||||
p_ext_cap->beacon_protection_enable);
|
||||
ucfg_mlme_get_bigtk_support(hdd_ctx->psoc,
|
||||
&target_bigtk_support);
|
||||
if (target_bigtk_support &&
|
||||
p_ext_cap->beacon_protection_enable)
|
||||
mlme_set_bigtk_support(adapter->vdev, true);
|
||||
}
|
||||
|
||||
ie = wlan_get_ie_ptr_from_eid(WLAN_EID_COUNTRY,
|
||||
beacon->tail, beacon->tail_len);
|
||||
if ((adapter->device_mode == QDF_SAP_MODE) && ie) {
|
||||
|
@ -5002,6 +5002,7 @@ int hdd_vdev_create(struct hdd_adapter *adapter)
|
||||
struct wlan_objmgr_vdev *vdev;
|
||||
struct vdev_osif_priv *osif_priv;
|
||||
struct wlan_vdev_create_params vdev_params = {0};
|
||||
bool target_bigtk_support = false;
|
||||
|
||||
hdd_nofl_debug("creating new vdev");
|
||||
|
||||
@ -5082,6 +5083,9 @@ int hdd_vdev_create(struct hdd_adapter *adapter)
|
||||
if (!vdev)
|
||||
goto hdd_vdev_destroy_procedure;
|
||||
wlan_vdev_set_max_peer_count(vdev, HDD_MAX_VDEV_PEER_COUNT);
|
||||
ucfg_mlme_get_bigtk_support(hdd_ctx->psoc, &target_bigtk_support);
|
||||
if (target_bigtk_support)
|
||||
mlme_set_bigtk_support(adapter->vdev, true);
|
||||
hdd_objmgr_put_vdev(vdev);
|
||||
}
|
||||
|
||||
|
@ -584,6 +584,9 @@ struct s_ext_cap {
|
||||
uint8_t reserved7:2;
|
||||
uint8_t twt_requestor_support:1;
|
||||
uint8_t twt_responder_support:1;
|
||||
uint8_t reserved8: 1;
|
||||
uint8_t reserved9: 4;
|
||||
uint8_t beacon_protection_enable: 1;
|
||||
};
|
||||
|
||||
void swap_bit_field16(uint16_t in, uint16_t *out);
|
||||
|
@ -1218,6 +1218,8 @@ populate_dot11f_ext_cap(struct mac_context *mac,
|
||||
if (pe_session && pe_session->is_mbssid_enabled)
|
||||
p_ext_cap->multi_bssid = 1;
|
||||
|
||||
p_ext_cap->beacon_protection_enable = pe_session ?
|
||||
mlme_get_bigtk_support(pe_session->vdev) : false;
|
||||
/* Need to calculate the num_bytes based on bits set */
|
||||
if (pDot11f->present)
|
||||
pDot11f->num_bytes = lim_compute_ext_cap_ie_length(pDot11f);
|
||||
|
@ -602,8 +602,8 @@ typedef enum {
|
||||
|
||||
} eCsrWEPStaticKeyID;
|
||||
|
||||
/* Two extra key indicies are used for the IGTK (which is used by BIP) */
|
||||
#define CSR_MAX_NUM_KEY (eCSR_SECURITY_WEP_STATIC_KEY_ID_MAX + 2 + 1)
|
||||
/* Two extra key indicies are used for the IGTK, two for BIGTK */
|
||||
#define CSR_MAX_NUM_KEY (eCSR_SECURITY_WEP_STATIC_KEY_ID_MAX + 2 + 1 + 2)
|
||||
|
||||
typedef enum {
|
||||
/*
|
||||
|
@ -5361,6 +5361,11 @@ static void wma_update_mlme_related_tgt_caps(struct wlan_objmgr_psoc *psoc,
|
||||
wmi_service_enabled(wmi_handle,
|
||||
wmi_service_data_stall_recovery_support);
|
||||
|
||||
mlme_tgt_cfg.bigtk_support =
|
||||
wmi_service_enabled(wmi_handle, wmi_beacon_protection_support);
|
||||
|
||||
wma_debug("beacon protection support %d", mlme_tgt_cfg.bigtk_support);
|
||||
|
||||
/* Call this at last only after filling all the tgt caps */
|
||||
wlan_mlme_update_cfg_with_tgt_caps(psoc, &mlme_tgt_cfg);
|
||||
}
|
||||
|
@ -2154,6 +2154,8 @@ static QDF_STATUS wma_unified_bcn_tmpl_send(tp_wma_handle wma,
|
||||
params.tmpl_len = tmpl_len;
|
||||
params.frm = frm;
|
||||
params.tmpl_len_aligned = tmpl_len_aligned;
|
||||
params.enable_bigtk =
|
||||
mlme_get_bigtk_support(wma->interfaces[vdev_id].vdev);
|
||||
if (bcn_info->csa_count_offset &&
|
||||
(bcn_info->csa_count_offset > bytes_to_strip))
|
||||
params.csa_switch_count_offset =
|
||||
|
Loading…
Reference in New Issue
Block a user