diff --git a/core/hdd/inc/wlan_hdd_cfg.h b/core/hdd/inc/wlan_hdd_cfg.h
index 2eb196234e4d..2dfb75b6b196 100644
--- a/core/hdd/inc/wlan_hdd_cfg.h
+++ b/core/hdd/inc/wlan_hdd_cfg.h
@@ -10996,7 +10996,10 @@ enum hdd_wext_control {
* @Max: 1
* @Default: 1
*
- * This ini is used to enable/disable broadcast probe response
+ * This ini is used to enable/disable broadcast probe response.
+ * This is set only if g_is_fils_enabled is set to 1
+ * If this is disabled then OCE ini oce_sta_enable will also be
+ * disabled and OCE IE will not be sent in frames.
*
* Related: None
*
@@ -13232,7 +13235,6 @@ enum hdd_external_acs_freq_band {
#define CFG_MBO_CAND_RSSI_BTC_THRESHOLD_MIN (-120)
#define CFG_MBO_CAND_RSSI_BTC_THRESHOLD_MAX (0)
-
/*
*
* g_enable_packet_filter_bitmap - Enable Packet filters before going into
@@ -13316,6 +13318,166 @@ enum hdd_external_acs_freq_band {
#define CFG_REDUCED_BEACON_INTERVAL_MAX (100)
#define CFG_REDUCED_BEACON_INTERVAL_DEFAULT (0)
+/*
+ * oce_enable_rssi_assoc_reject - Enable/disable rssi based assoc rejection
+ * @Min: 0
+ * @Max: 1
+ * @Default: 1
+ *
+ * This ini is used to enable/disable rssi based assoc rejection. If this is
+ * disabled then OCE ini oce_sta_enable will also be disabled and OCE IE will
+ * not be sent in frames.
+ *
+ * Related: None
+ *
+ * Supported Feature: OCE
+ *
+ * Usage: External
+ *
+ *
+ */
+#define CFG_OCE_ENABLE_RSSI_BASED_ASSOC_REJECT_NAME \
+ "oce_enable_rssi_assoc_reject"
+#define CFG_OCE_ENABLE_RSSI_BASED_ASSOC_REJECT_MIN (0)
+#define CFG_OCE_ENABLE_RSSI_BASED_ASSOC_REJECT_MAX (1)
+#define CFG_OCE_ENABLE_RSSI_BASED_ASSOC_REJECT_DEFAULT (1)
+
+/*
+ *
+ * oce_enable_probe_req_rate - Set probe request rate
+ * @Min: 0
+ * @Max: 1
+ * @Default: 0
+ *
+ * This ini is used to set probe request rate to 5.5Mbps as per OCE requirement
+ * in 2.4G band
+ *
+ * Related: None
+ *
+ * Supported Feature: OCE
+ *
+ * Usage: External
+ *
+ *
+ */
+#define CFG_OCE_PROBE_REQ_RATE_NAME "oce_enable_probe_req_rate"
+#define CFG_OCE_PROBE_REQ_RATE_MIN (0)
+#define CFG_OCE_PROBE_REQ_RATE_MAX (1)
+#define CFG_OCE_PROBE_REQ_RATE_DEFAULT (0)
+
+/*
+ *
+ * oce_enable_probe_resp_rate - Set probe response rate
+ * @Min: 0
+ * @Max: 1
+ * @Default: 0
+ *
+ * This ini is used to set probe response rate to 5.5Mbps as per OCE requirement
+ * in 2.4G band
+ *
+ * Related: None
+ *
+ * Supported Feature: OCE
+ *
+ * Usage: External
+ *
+ *
+ */
+#define CFG_OCE_PROBE_RSP_RATE_NAME "oce_enable_probe_resp_rate"
+#define CFG_OCE_PROBE_RSP_RATE_MIN (0)
+#define CFG_OCE_PROBE_RSP_RATE_MAX (1)
+#define CFG_OCE_PROBE_RSP_RATE_DEFAULT (0)
+
+/*
+ *
+ * oce_enable_beacon_rate - Set beacon rate
+ * @Min: 0
+ * @Max: 1
+ * @Default: 0
+ *
+ * This ini is used to set beacon rate to 5.5Mbps as per OCE requirement in
+ * 2.4G band
+ *
+ * Related: None
+ *
+ * Supported Feature: OCE
+ *
+ * Usage: External
+ *
+ *
+ */
+#define CFG_OCE_BEACON_RATE_NAME "oce_enable_beacon_rate"
+#define CFG_OCE_BEACON_RATE_MIN (0)
+#define CFG_OCE_BEACON_RATE_MAX (1)
+#define CFG_OCE_BEACON_RATE_DEFAULT (0)
+
+/*
+ *
+ * oce_enable_probe_req_deferral - Enable/disable probe request deferral
+ * @Min: 0
+ * @Max: 1
+ * @Default: 0
+ *
+ * This ini is used to enable/disable probe request deferral as per OCE spec
+ *
+ * Related: None
+ *
+ * Supported Feature: OCE
+ *
+ * Usage: External
+ *
+ *
+ */
+#define CFG_ENABLE_PROBE_REQ_DEFERRAL_NAME "oce_enable_probe_req_deferral"
+#define CFG_ENABLE_PROBE_REQ_DEFERRAL_MIN (0)
+#define CFG_ENABLE_PROBE_REQ_DEFERRAL_MAX (1)
+#define CFG_ENABLE_PROBE_REQ_DEFERRAL_DEFAULT (0)
+
+/*
+ *
+ * oce_enable_fils_discovery_sap - Enable/disable fils discovery in sap mode
+ * @Min: 0
+ * @Max: 1
+ * @Default: 0
+ *
+ * This ini is used to enable/disable fils discovery in sap mode
+ *
+ * Related: None
+ *
+ * Supported Feature: FILS
+ *
+ * Usage: External
+ *
+ *
+ */
+#define CFG_ENABLE_FILS_DISCOVERY_SAP_NAME "oce_enable_fils_discovery_sap"
+#define CFG_ENABLE_FILS_DISCOVERY_SAP_MIN (0)
+#define CFG_ENABLE_FILS_DISCOVERY_SAP_MAX (1)
+#define CFG_ENABLE_FILS_DISCOVERY_SAP_DEFAULT (0)
+
+/*
+ *
+ * enable_esp_for_roam - Enable/disable esp feature
+ * @Min: 0
+ * @Max: 1
+ * @Default: 0
+ *
+ * This ini is used to enable/disable ESP(Estimated service parameters) IE
+ * parsing and decides whether firmware will include this in its scoring algo.
+ *
+ * Related: None
+ *
+ * Supported Feature: STA
+ *
+ * Usage: External
+ *
+ *
+ */
+#define CFG_ENABLE_ESP_FEATURE_NAME "enable_esp_for_roam"
+#define CFG_ENABLE_ESP_FEATURE_MIN (0)
+#define CFG_ENABLE_ESP_FEATURE_MAX (1)
+#define CFG_ENABLE_ESP_FEATURE_DEFAULT (0)
+
/*
* Type declarations
*/
@@ -14182,6 +14344,13 @@ struct hdd_config {
uint8_t enable_phy_reg_retention;
uint8_t dfs_beacon_tx_enhanced;
uint16_t reduced_beacon_interval;
+ bool rssi_assoc_reject_enabled;
+ bool oce_probe_req_rate_enabled;
+ bool oce_probe_resp_rate_enabled;
+ bool oce_beacon_rate_enabled;
+ bool probe_req_deferral_enabled;
+ bool fils_discovery_sap_enabled;
+ bool esp_for_roam_enabled;
};
#define VAR_OFFSET(_Struct, _Var) (offsetof(_Struct, _Var))
diff --git a/core/hdd/src/wlan_hdd_cfg.c b/core/hdd/src/wlan_hdd_cfg.c
index 4eb061b30991..12552690c414 100644
--- a/core/hdd/src/wlan_hdd_cfg.c
+++ b/core/hdd/src/wlan_hdd_cfg.c
@@ -5229,6 +5229,57 @@ struct reg_table_entry g_registry_table[] = {
CFG_REDUCED_BEACON_INTERVAL_DEFAULT,
CFG_REDUCED_BEACON_INTERVAL_MIN,
CFG_REDUCED_BEACON_INTERVAL_MAX),
+
+ REG_VARIABLE(CFG_OCE_ENABLE_RSSI_BASED_ASSOC_REJECT_NAME,
+ WLAN_PARAM_Integer, struct hdd_config,
+ rssi_assoc_reject_enabled,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_OCE_ENABLE_RSSI_BASED_ASSOC_REJECT_DEFAULT,
+ CFG_OCE_ENABLE_RSSI_BASED_ASSOC_REJECT_MIN,
+ CFG_OCE_ENABLE_RSSI_BASED_ASSOC_REJECT_MAX),
+
+ REG_VARIABLE(CFG_OCE_PROBE_REQ_RATE_NAME, WLAN_PARAM_Integer,
+ struct hdd_config, oce_probe_req_rate_enabled,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_OCE_PROBE_REQ_RATE_DEFAULT,
+ CFG_OCE_PROBE_REQ_RATE_MIN,
+ CFG_OCE_PROBE_REQ_RATE_MAX),
+
+ REG_VARIABLE(CFG_OCE_PROBE_RSP_RATE_NAME, WLAN_PARAM_Integer,
+ struct hdd_config, oce_probe_resp_rate_enabled,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_OCE_PROBE_RSP_RATE_DEFAULT,
+ CFG_OCE_PROBE_RSP_RATE_MIN,
+ CFG_OCE_PROBE_RSP_RATE_MAX),
+
+ REG_VARIABLE(CFG_OCE_BEACON_RATE_NAME, WLAN_PARAM_Integer,
+ struct hdd_config, oce_beacon_rate_enabled,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_OCE_BEACON_RATE_DEFAULT,
+ CFG_OCE_BEACON_RATE_MIN,
+ CFG_OCE_BEACON_RATE_MAX),
+
+ REG_VARIABLE(CFG_ENABLE_PROBE_REQ_DEFERRAL_NAME, WLAN_PARAM_Integer,
+ struct hdd_config, probe_req_deferral_enabled,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_ENABLE_PROBE_REQ_DEFERRAL_DEFAULT,
+ CFG_ENABLE_PROBE_REQ_DEFERRAL_MIN,
+ CFG_ENABLE_PROBE_REQ_DEFERRAL_MAX),
+
+ REG_VARIABLE(CFG_ENABLE_FILS_DISCOVERY_SAP_NAME, WLAN_PARAM_Integer,
+ struct hdd_config, fils_discovery_sap_enabled,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_ENABLE_FILS_DISCOVERY_SAP_DEFAULT,
+ CFG_ENABLE_FILS_DISCOVERY_SAP_MIN,
+ CFG_ENABLE_FILS_DISCOVERY_SAP_MAX),
+
+ REG_VARIABLE(CFG_ENABLE_ESP_FEATURE_NAME, WLAN_PARAM_Integer,
+ struct hdd_config, esp_for_roam_enabled,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_ENABLE_ESP_FEATURE_DEFAULT,
+ CFG_ENABLE_ESP_FEATURE_MIN,
+ CFG_ENABLE_ESP_FEATURE_MAX),
+
};
@@ -8432,7 +8483,7 @@ QDF_STATUS hdd_set_sme_config(struct hdd_context *hdd_ctx)
{
QDF_STATUS status = QDF_STATUS_SUCCESS;
tSmeConfigParams *smeConfig;
- uint8_t rrm_capab_len;
+ uint8_t rrm_capab_len, val;
struct hdd_config *pConfig = hdd_ctx->config;
@@ -8828,6 +8879,21 @@ QDF_STATUS hdd_set_sme_config(struct hdd_context *hdd_ctx)
hdd_ctx->config->num_11b_tx_chains;
smeConfig->csrConfig.num_11ag_tx_chains =
hdd_ctx->config->num_11ag_tx_chains;
+ val = (pConfig->oce_probe_req_rate_enabled *
+ WMI_VDEV_OCE_PROBE_REQUEST_RATE_FEATURE_BITMAP) +
+ (pConfig->oce_probe_resp_rate_enabled *
+ WMI_VDEV_OCE_PROBE_RESPONSE_RATE_FEATURE_BITMAP) +
+ (pConfig->oce_beacon_rate_enabled *
+ WMI_VDEV_OCE_BEACON_RATE_FEATURE_BITMAP) +
+ (pConfig->probe_req_deferral_enabled *
+ WMI_VDEV_OCE_PROBE_REQUEST_DEFERRAL_FEATURE_BITMAP) +
+ (pConfig->fils_discovery_sap_enabled *
+ WMI_VDEV_OCE_FILS_DISCOVERY_FRAME_FEATURE_BITMAP) +
+ (pConfig->esp_for_roam_enabled *
+ WMI_VDEV_OCE_ESP_FEATURE_BITMAP) +
+ (pConfig->rssi_assoc_reject_enabled *
+ WMI_VDEV_OCE_REASSOC_REJECT_FEATURE_BITMAP);
+ smeConfig->csrConfig.oce_feature_bitmap = val;
hdd_update_bss_score_params(hdd_ctx->config,
&smeConfig->csrConfig.bss_score_params);
diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c
index 6f120a2c425f..273a11e0dcf7 100644
--- a/core/hdd/src/wlan_hdd_main.c
+++ b/core/hdd/src/wlan_hdd_main.c
@@ -7631,6 +7631,14 @@ static void hdd_override_ini_config(struct hdd_context *hdd_ctx)
if (!hdd_ipa_is_present(hdd_ctx))
hdd_ctx->config->IpaConfig = 0;
+
+ if (!hdd_ctx->config->rssi_assoc_reject_enabled ||
+ !hdd_ctx->config->enable_bcast_probe_rsp) {
+ hdd_debug("OCE disabled, rssi_assoc_reject_enabled: %d enable_bcast_probe_rsp: %d",
+ hdd_ctx->config->rssi_assoc_reject_enabled,
+ hdd_ctx->config->enable_bcast_probe_rsp);
+ hdd_ctx->config->oce_sta_enabled = 0;
+ }
}
/**
diff --git a/core/sme/inc/csr_api.h b/core/sme/inc/csr_api.h
index 37c886e84bb0..b9736204bea9 100644
--- a/core/sme/inc/csr_api.h
+++ b/core/sme/inc/csr_api.h
@@ -1354,6 +1354,7 @@ typedef struct tagCsrConfigParam {
uint32_t rssi_channel_penalization;
uint32_t num_disallowed_aps;
struct sir_score_config bss_score_params;
+ uint8_t oce_feature_bitmap;
} tCsrConfigParam;
/* Tush */
diff --git a/core/sme/inc/csr_internal.h b/core/sme/inc/csr_internal.h
index 9c6c2613f4bf..041115b2c80e 100644
--- a/core/sme/inc/csr_internal.h
+++ b/core/sme/inc/csr_internal.h
@@ -631,6 +631,7 @@ struct csr_config {
uint32_t rssi_channel_penalization;
uint32_t num_disallowed_aps;
struct sir_score_config bss_score_params;
+ uint8_t oce_feature_bitmap;
};
struct csr_channel_powerinfo {
diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c
index 4594400a3f95..fa217bd966b9 100644
--- a/core/sme/src/csr/csr_api_roam.c
+++ b/core/sme/src/csr/csr_api_roam.c
@@ -2938,6 +2938,8 @@ QDF_STATUS csr_change_default_config_param(tpAniSirGlobal pMac,
pParam->rssi_channel_penalization;
pMac->roam.configParam.num_disallowed_aps =
pParam->num_disallowed_aps;
+ pMac->roam.configParam.oce_feature_bitmap =
+ pParam->oce_feature_bitmap;
qdf_mem_copy(&pMac->roam.configParam.bss_score_params,
&pParam->bss_score_params,
@@ -3197,6 +3199,8 @@ QDF_STATUS csr_get_config_param(tpAniSirGlobal pMac, tCsrConfigParam *pParam)
pMac->roam.configParam.rssi_channel_penalization;
pParam->num_disallowed_aps =
pMac->roam.configParam.num_disallowed_aps;
+ pParam->oce_feature_bitmap =
+ pMac->roam.configParam.oce_feature_bitmap;
qdf_mem_copy(&pParam->csr_mawc_config,
&pMac->roam.configParam.csr_mawc_config,
sizeof(pParam->csr_mawc_config));
@@ -16270,6 +16274,8 @@ QDF_STATUS csr_issue_add_sta_for_session_req(tpAniSirGlobal pMac,
pMac->roam.configParam.fils_max_chan_guard_time;
add_sta_self_req->pkt_err_disconn_th =
pMac->roam.configParam.pkt_err_disconn_th;
+ add_sta_self_req->oce_feature_bitmap =
+ pMac->roam.configParam.oce_feature_bitmap;
msg.type = WMA_ADD_STA_SELF_REQ;
msg.reserved = 0;
msg.bodyptr = add_sta_self_req;
diff --git a/core/wma/inc/wma_if.h b/core/wma/inc/wma_if.h
index 4a83d0cf3e84..1dce2732c836 100644
--- a/core/wma/inc/wma_if.h
+++ b/core/wma/inc/wma_if.h
@@ -1192,6 +1192,7 @@ struct add_sta_self_params {
bool enable_bcast_probe_rsp;
uint8_t fils_max_chan_guard_time;
uint16_t pkt_err_disconn_th;
+ uint8_t oce_feature_bitmap;
};
/**
diff --git a/core/wma/src/wma_dev_if.c b/core/wma/src/wma_dev_if.c
index 34eb5791e2be..e55045dd5daa 100644
--- a/core/wma/src/wma_dev_if.c
+++ b/core/wma/src/wma_dev_if.c
@@ -2220,6 +2220,17 @@ struct cdp_vdev *wma_vdev_attach(tp_wma_handle wma_handle,
WMA_LOGE("Failed to set WMI_VDEV_PARAM_REPEAT_PROBE_TIME");
}
+ if ((self_sta_req->type == WMI_VDEV_TYPE_STA ||
+ self_sta_req->type == WMI_VDEV_TYPE_AP) &&
+ self_sta_req->sub_type == 0) {
+ ret = wma_vdev_set_param(wma_handle->wmi_handle,
+ self_sta_req->session_id,
+ WMI_VDEV_PARAM_ENABLE_DISABLE_OCE_FEATURES,
+ self_sta_req->oce_feature_bitmap);
+ if (QDF_IS_STATUS_ERROR(ret))
+ WMA_LOGE("Failed to set WMI_VDEV_PARAM_ENABLE_DISABLE_OCE_FEATURES");
+ }
+
/* Initialize BMISS parameters */
if ((self_sta_req->type == WMI_VDEV_TYPE_STA) &&
(self_sta_req->sub_type == 0))