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
This commit is contained in:
parent
57808d9d69
commit
1f3f99fd1f
3
Kbuild
3
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
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -2385,6 +2385,42 @@
|
||||
#define LFR_SUBNET_DETECTION_ALL
|
||||
#endif
|
||||
|
||||
#ifdef WLAN_ADAPTIVE_11R
|
||||
/*
|
||||
* <ini>
|
||||
* 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
|
||||
*
|
||||
* </ini>
|
||||
*/
|
||||
#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
|
||||
|
||||
/*
|
||||
* <ini>
|
||||
* 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
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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),)
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
|
@ -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");
|
||||
|
@ -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));
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user