summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/hdd/src/wlan_hdd_cfg80211.c98
-rw-r--r--core/hdd/src/wlan_hdd_cfg80211.h7
-rw-r--r--core/sme/inc/sme_api.h4
-rw-r--r--core/sme/src/common/sme_api.c35
4 files changed, 143 insertions, 1 deletions
diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c
index bf1b6890e96a..06581e96d453 100644
--- a/core/hdd/src/wlan_hdd_cfg80211.c
+++ b/core/hdd/src/wlan_hdd_cfg80211.c
@@ -7230,6 +7230,96 @@ static int wlan_hdd_cfg80211_setband(struct wiphy *wiphy,
return ret;
}
+static const struct
+nla_policy qca_wlan_vendor_attr[QCA_WLAN_VENDOR_ATTR_MAX+1] = {
+ [QCA_WLAN_VENDOR_ATTR_ROAMING_POLICY] = {.type = NLA_U32},
+ [QCA_WLAN_VENDOR_ATTR_MAC_ADDR] = {.type = NLA_BINARY,
+ .len = QDF_MAC_ADDR_SIZE},
+};
+
+/**
+ * __wlan_hdd_cfg80211_set_fast_roaming() - enable/disable roaming
+ * @wiphy: Pointer to wireless phy
+ * @wdev: Pointer to wireless device
+ * @data: Pointer to data
+ * @data_len: Length of @data
+ *
+ * This function is used to enable/disable roaming using vendor commands
+ *
+ * Return: 0 on success, negative errno on failure
+ */
+static int __wlan_hdd_cfg80211_set_fast_roaming(struct wiphy *wiphy,
+ struct wireless_dev *wdev,
+ const void *data, int data_len)
+{
+ hdd_context_t *hdd_ctx = wiphy_priv(wiphy);
+ struct net_device *dev = wdev->netdev;
+ hdd_adapter_t *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
+ struct nlattr *tb[QCA_WLAN_VENDOR_ATTR_MAX + 1];
+ uint32_t is_fast_roam_enabled;
+ int ret;
+
+ ENTER_DEV(dev);
+
+ ret = wlan_hdd_validate_context(hdd_ctx);
+ if (0 != ret)
+ return ret;
+
+ if (QDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
+ hdd_err("Command not allowed in FTM mode");
+ return -EINVAL;
+ }
+
+ ret = nla_parse(tb, QCA_WLAN_VENDOR_ATTR_MAX, data, data_len,
+ qca_wlan_vendor_attr);
+ if (ret) {
+ hdd_err("Invalid ATTR");
+ return -EINVAL;
+ }
+
+ /* Parse and fetch Enable flag */
+ if (!tb[QCA_WLAN_VENDOR_ATTR_ROAMING_POLICY]) {
+ hdd_err("attr enable failed");
+ return -EINVAL;
+ }
+
+ is_fast_roam_enabled = nla_get_u32(
+ tb[QCA_WLAN_VENDOR_ATTR_ROAMING_POLICY]);
+ hdd_notice("isFastRoamEnabled %d", is_fast_roam_enabled);
+
+ /* Update roaming */
+ ret = sme_config_fast_roaming(hdd_ctx->hHal, adapter->sessionId,
+ is_fast_roam_enabled);
+ if (ret)
+ hdd_err("sme_config_fast_roaming failed");
+ EXIT();
+ return ret;
+}
+
+/**
+ * wlan_hdd_cfg80211_set_fast_roaming() - enable/disable roaming
+ * @wiphy: Pointer to wireless phy
+ * @wdev: Pointer to wireless device
+ * @data: Pointer to data
+ * @data_len: Length of @data
+ *
+ * Wrapper function of __wlan_hdd_cfg80211_set_fast_roaming()
+ *
+ * Return: 0 on success, negative errno on failure
+ */
+static int wlan_hdd_cfg80211_set_fast_roaming(struct wiphy *wiphy,
+ struct wireless_dev *wdev,
+ const void *data, int data_len)
+{
+ int ret;
+
+ cds_ssr_protect(__func__);
+ ret = __wlan_hdd_cfg80211_set_fast_roaming(wiphy, wdev, data, data_len);
+ cds_ssr_unprotect(__func__);
+
+ return ret;
+}
+
const struct wiphy_vendor_command hdd_wiphy_vendor_commands[] = {
{
.info.vendor_id = QCA_NL80211_VENDOR_ID,
@@ -7785,6 +7875,14 @@ const struct wiphy_vendor_command hdd_wiphy_vendor_commands[] = {
WIPHY_VENDOR_CMD_NEED_NETDEV |
WIPHY_VENDOR_CMD_NEED_RUNNING,
.doit = wlan_hdd_cfg80211_setband
+ },
+ {
+ .info.vendor_id = QCA_NL80211_VENDOR_ID,
+ .info.subcmd = QCA_NL80211_VENDOR_SUBCMD_ROAMING,
+ .flags = WIPHY_VENDOR_CMD_NEED_WDEV |
+ WIPHY_VENDOR_CMD_NEED_NETDEV |
+ WIPHY_VENDOR_CMD_NEED_RUNNING,
+ .doit = wlan_hdd_cfg80211_set_fast_roaming
}
};
diff --git a/core/hdd/src/wlan_hdd_cfg80211.h b/core/hdd/src/wlan_hdd_cfg80211.h
index 5438f21eb65d..8910c89ff5e5 100644
--- a/core/hdd/src/wlan_hdd_cfg80211.h
+++ b/core/hdd/src/wlan_hdd_cfg80211.h
@@ -167,8 +167,9 @@ typedef enum {
*
* @QCA_NL80211_VENDOR_SUBCMD_UNSPEC: Unspecified
* @QCA_NL80211_VENDOR_SUBCMD_TEST: Test
+ * Sub commands 2 to 8 are not used
+ * @QCA_NL80211_VENDOR_SUBCMD_ROAMING: Roaming
* @QCA_NL80211_VENDOR_SUBCMD_AVOID_FREQUENCY: Avoid frequency.
- * Sub commands 2 to 9 are not used
* @QCA_NL80211_VENDOR_SUBCMD_DFS_CAPABILITY: DFS capability
* @QCA_NL80211_VENDOR_SUBCMD_NAN: Nan
* @QCA_NL80211_VENDOR_SUBCMD_STATS_EXT: Ext stats
@@ -293,6 +294,7 @@ typedef enum {
enum qca_nl80211_vendor_subcmds {
QCA_NL80211_VENDOR_SUBCMD_UNSPEC = 0,
QCA_NL80211_VENDOR_SUBCMD_TEST = 1,
+ QCA_NL80211_VENDOR_SUBCMD_ROAMING = 9,
QCA_NL80211_VENDOR_SUBCMD_AVOID_FREQUENCY = 10,
QCA_NL80211_VENDOR_SUBCMD_DFS_CAPABILITY = 11,
QCA_NL80211_VENDOR_SUBCMD_NAN = 12,
@@ -838,6 +840,8 @@ enum qca_wlan_vendor_attr_get_tdls_capabilities {
* @QCA_WLAN_VENDOR_ATTR_STATS_EXT: Ext stats attribute which is used by
* QCA_NL80211_VENDOR_SUBCMD_STATS_EXT
* @QCA_WLAN_VENDOR_ATTR_IFINDEX: After IFINDEX
+ * @QCA_WLAN_VENDOR_ATTR_ROAMING_POLICY: Roaming policy which is used by
+ * QCA_NL80211_VENDOR_SUBCMD_ROAMING
* @QCA_WLAN_VENDOR_ATTR_MAC_ADDR: MAC Address attribute which is used by
* QCA_NL80211_VENDOR_SUBCMD_LINK_PROPERTIES
* @QCA_WLAN_VENDOR_ATTR_FEATURE_FLAGS: Supported Features
@@ -852,6 +856,7 @@ enum qca_wlan_vendor_attr {
QCA_WLAN_VENDOR_ATTR_NAN = 2,
QCA_WLAN_VENDOR_ATTR_STATS_EXT = 3,
QCA_WLAN_VENDOR_ATTR_IFINDEX = 4,
+ QCA_WLAN_VENDOR_ATTR_ROAMING_POLICY = 5,
QCA_WLAN_VENDOR_ATTR_MAC_ADDR = 6,
QCA_WLAN_VENDOR_ATTR_FEATURE_FLAGS = 7,
QCA_WLAN_VENDOR_ATTR_CONCURRENCY_CAPA = 9,
diff --git a/core/sme/inc/sme_api.h b/core/sme/inc/sme_api.h
index 76666d901d8e..7b915abd7f8e 100644
--- a/core/sme/inc/sme_api.h
+++ b/core/sme/inc/sme_api.h
@@ -583,6 +583,10 @@ QDF_STATUS sme_update_is_fast_roam_ini_feature_enabled(tHalHandle hHal,
uint8_t sessionId,
const bool
isFastRoamIniFeatureEnabled);
+
+QDF_STATUS sme_config_fast_roaming(tHalHandle hal, uint8_t session_id,
+ const bool is_fast_roam_enabled);
+
QDF_STATUS sme_update_is_mawc_ini_feature_enabled(tHalHandle hHal,
const bool MAWCEnabled);
QDF_STATUS sme_stop_roaming(tHalHandle hHal, uint8_t sessionId, uint8_t reason);
diff --git a/core/sme/src/common/sme_api.c b/core/sme/src/common/sme_api.c
index de1a97e981ba..122e5839597b 100644
--- a/core/sme/src/common/sme_api.c
+++ b/core/sme/src/common/sme_api.c
@@ -8921,6 +8921,41 @@ QDF_STATUS sme_update_is_fast_roam_ini_feature_enabled
return QDF_STATUS_SUCCESS;
}
+/**
+ * sme_config_fast_roaming() - enable/disable LFR support at runtime
+ * @hal - The handle returned by macOpen.
+ * @session_id - Session Identifier
+ * @is_fast_roam_enabled - flag to enable/disable roaming
+ *
+ * When Supplicant issues enabled/disable fast roaming on the basis
+ * of the Bssid modification in network block (e.g. AutoJoin mode N/W block)
+ *
+ * Return: QDF_STATUS
+ */
+
+QDF_STATUS sme_config_fast_roaming(tHalHandle hal, uint8_t session_id,
+ const bool is_fast_roam_enabled)
+{
+ tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
+ QDF_STATUS status;
+
+ if (!mac_ctx->roam.configParam.isFastRoamIniFeatureEnabled) {
+ sms_log(mac_ctx, LOGE, FL("Fast roam is disabled through ini"));
+ if (!is_fast_roam_enabled)
+ return QDF_STATUS_SUCCESS;
+ return QDF_STATUS_E_FAILURE;
+ }
+ status = csr_neighbor_roam_update_fast_roaming_enabled(mac_ctx,
+ session_id, is_fast_roam_enabled);
+ if (!QDF_IS_STATUS_SUCCESS(status)) {
+ sms_log(mac_ctx, LOGE,
+ FL("csr_neighbor_roam_update_fast_roaming_enabled failed"));
+ return QDF_STATUS_E_FAILURE;
+ }
+
+ return QDF_STATUS_SUCCESS;
+}
+
/*--------------------------------------------------------------------------
\brief sme_update_is_mawc_ini_feature_enabled() -
Enable/disable LFR MAWC support at runtime