diff options
| author | Agrawal Ashish <ashishka@codeaurora.org> | 2016-05-25 12:04:47 +0530 |
|---|---|---|
| committer | Vishwajith Upendra <vishwaji@codeaurora.org> | 2016-06-06 18:45:10 -0700 |
| commit | c9ddbabf76cddae3fe23a12e8c2920eecf2b8c18 (patch) | |
| tree | 70e7a1d49673038832a36f7ed424d220413321fd | |
| parent | 5b733215c919e991f7dab4018bcb0b0ce3eca854 (diff) | |
qcacld-3.0: Implement vendor command to restart SAP on some channel
qcacld-2.0 to qcacld-3.0 propagation
Add support for vendor command which will do restart of the SAP
on desirable channel.
QCA_NL80211_VENDOR_SUBCMD_SET_SAP_CONFIG is used to send
driver to restart SAP device on some other channel.
Upon receiving this command, driver will do __hdd_hostapd_stop
and will disable all queues.
After that WLANSAP_StartBss start SAP on user config channel.
Change-Id: I34d4e4f758ca7e010ae198af31d9fc3777973b22
CRs-Fixed: 1000593
| -rw-r--r-- | core/hdd/inc/wlan_hdd_main.h | 9 | ||||
| -rw-r--r-- | core/hdd/src/wlan_hdd_cfg80211.c | 122 | ||||
| -rw-r--r-- | core/hdd/src/wlan_hdd_cfg80211.h | 18 |
3 files changed, 149 insertions, 0 deletions
diff --git a/core/hdd/inc/wlan_hdd_main.h b/core/hdd/inc/wlan_hdd_main.h index 4c6bfd380a9e..07fdc4eb7dd5 100644 --- a/core/hdd/inc/wlan_hdd_main.h +++ b/core/hdd/inc/wlan_hdd_main.h @@ -1670,6 +1670,15 @@ static inline void hdd_set_tso_flags(hdd_context_t *hdd_ctx, struct net_device *wlan_dev){} #endif /* FEATURE_TSO */ +#if defined(FEATURE_WLAN_MCC_TO_SCC_SWITCH) || \ + defined(FEATURE_WLAN_STA_AP_MODE_DFS_DISABLE) +void wlan_hdd_restart_sap(hdd_adapter_t *ap_adapter); +#else +static inline void wlan_hdd_restart_sap(hdd_adapter_t *ap_adapter) +{ +} +#endif + #ifdef WLAN_FEATURE_ROAM_OFFLOAD static inline bool roaming_offload_enabled(hdd_context_t *hdd_ctx) { diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c index 363f370d6890..55b8ad8e55ca 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/core/hdd/src/wlan_hdd_cfg80211.c @@ -5359,6 +5359,119 @@ void hdd_init_bpf_completion(void) init_completion(&bpf_context.completion); } +static const struct nla_policy +wlan_hdd_sap_config_policy[QCA_WLAN_VENDOR_ATTR_SAP_CONFIG_MAX + 1] = { + [QCA_WLAN_VENDOR_ATTR_SAP_CONFIG_CHANNEL] = {.type = NLA_U8 }, +}; + +/** + * __wlan_hdd_cfg80211_sap_configuration_set() - ask driver to restart SAP if + * SAP is on unsafe channel. + * @wiphy: wiphy structure pointer + * @wdev: Wireless device structure pointer + * @data: Pointer to the data received + * @data_len: Length of @data + * + * __wlan_hdd_cfg80211_sap_configuration_set function set SAP params to + * driver. + * QCA_WLAN_VENDOR_ATTR_SAP_CONFIG_CHAN will set sap config channel and + * will initiate restart of sap. + * + * Return: 0 on success; errno on failure + */ +static int +__wlan_hdd_cfg80211_sap_configuration_set(struct wiphy *wiphy, + struct wireless_dev *wdev, + const void *data, int data_len) +{ + struct net_device *ndev = wdev->netdev; + hdd_adapter_t *hostapd_adapter = WLAN_HDD_GET_PRIV_PTR(ndev); + hdd_context_t *hdd_ctx = wiphy_priv(wiphy); + struct nlattr *tb[QCA_WLAN_VENDOR_ATTR_SAP_CONFIG_MAX + 1]; + uint8_t config_channel = 0; + hdd_ap_ctx_t *ap_ctx; + int ret; + + ENTER(); + + if (QDF_GLOBAL_FTM_MODE == hdd_get_conparam()) { + hddLog(LOGE, FL("Command not allowed in FTM mode")); + return -EINVAL; + } + + ret = wlan_hdd_validate_context(hdd_ctx); + if (0 != ret) + return -EINVAL; + + if (nla_parse(tb, QCA_WLAN_VENDOR_ATTR_SAP_CONFIG_MAX, + data, data_len, + wlan_hdd_sap_config_policy)) { + hddLog(LOGE, FL("invalid attr")); + return -EINVAL; + } + + if (tb[QCA_WLAN_VENDOR_ATTR_SAP_CONFIG_CHANNEL]) { + if (!test_bit(SOFTAP_BSS_STARTED, + &hostapd_adapter->event_flags)) { + hdd_err("SAP is not started yet. Restart sap will be invalid"); + return -EINVAL; + } + + config_channel = + nla_get_u8(tb[QCA_WLAN_VENDOR_ATTR_SAP_CONFIG_CHANNEL]); + + if (!((IS_24G_CH(config_channel)) || + (IS_5G_CH(config_channel)))) { + hdd_err("Channel %d is not valid to restart SAP", + config_channel); + return -ENOTSUPP; + } + + ap_ctx = WLAN_HDD_GET_AP_CTX_PTR(hostapd_adapter); + ap_ctx->sapConfig.channel = config_channel; + ap_ctx->sapConfig.ch_params.ch_width = + ap_ctx->sapConfig.ch_width_orig; + + sme_set_ch_params(hdd_ctx->hHal, + ap_ctx->sapConfig.SapHw_mode, + ap_ctx->sapConfig.channel, + ap_ctx->sapConfig.sec_ch, + &ap_ctx->sapConfig.ch_params); + + cds_restart_sap(hostapd_adapter); + } + + return 0; +} + +/** + * wlan_hdd_cfg80211_sap_configuration_set() - sap configuration vendor command + * @wiphy: wiphy structure pointer + * @wdev: Wireless device structure pointer + * @data: Pointer to the data received + * @data_len: Length of @data + * + * __wlan_hdd_cfg80211_sap_configuration_set function set SAP params to + * driver. + * QCA_WLAN_VENDOR_ATTR_SAP_CONFIG_CHAN will set sap config channel and + * will initiate restart of sap. + * + * Return: 0 on success; errno on failure + */ +static int wlan_hdd_cfg80211_sap_configuration_set(struct wiphy *wiphy, + struct wireless_dev *wdev, + const void *data, int data_len) +{ + int ret; + + cds_ssr_protect(__func__); + ret = __wlan_hdd_cfg80211_sap_configuration_set(wiphy, + wdev, data, data_len); + cds_ssr_unprotect(__func__); + + return ret; +} + #undef BPF_INVALID #undef BPF_SET_RESET #undef BPF_VERSION @@ -5845,6 +5958,15 @@ const struct wiphy_vendor_command hdd_wiphy_vendor_commands[] = { WIPHY_VENDOR_CMD_NEED_RUNNING, .doit = wlan_hdd_cfg80211_bpf_offload }, + { + .info.vendor_id = QCA_NL80211_VENDOR_ID, + .info.subcmd = QCA_NL80211_VENDOR_SUBCMD_SET_SAP_CONFIG, + .flags = WIPHY_VENDOR_CMD_NEED_WDEV | + WIPHY_VENDOR_CMD_NEED_NETDEV | + WIPHY_VENDOR_CMD_NEED_RUNNING, + .doit = wlan_hdd_cfg80211_sap_configuration_set + }, + }; /** diff --git a/core/hdd/src/wlan_hdd_cfg80211.h b/core/hdd/src/wlan_hdd_cfg80211.h index 36b3d360a578..c91fa417f92c 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.h +++ b/core/hdd/src/wlan_hdd_cfg80211.h @@ -258,6 +258,7 @@ typedef enum { * @QCA_NL80211_VENDOR_SUBCMD_GW_PARAM_CONFIG: set gateway parameters * @QCA_NL80211_VENDOR_SUBCMD_SET_TXPOWER_SCALE: set tx power by percentage * @QCA_NL80211_VENDOR_SUBCMD_SET_TXPOWER_SCALE_DECR_DB: reduce tx power by DB + * @QCA_NL80211_VENDOR_SUBCMD_SET_SAP_CONFIG: SAP configuration * @QCA_NL80211_VENDOR_SUBCMD_TSF: TSF operations command * @QCA_NL80211_VENDOR_SUBCMD_WISA: WISA mode configuration */ @@ -379,6 +380,7 @@ enum qca_nl80211_vendor_subcmds { QCA_NL80211_VENDOR_SUBCMD_SET_TXPOWER_SCALE = 109, /* Tx power scaling in db subcommands */ QCA_NL80211_VENDOR_SUBCMD_SET_TXPOWER_SCALE_DECR_DB = 115, + QCA_NL80211_VENDOR_SUBCMD_SET_SAP_CONFIG = 118, QCA_NL80211_VENDOR_SUBCMD_TSF = 119, QCA_NL80211_VENDOR_SUBCMD_WISA = 120, }; @@ -2357,6 +2359,22 @@ enum qca_vendor_attr_txpower_scale_decr_db { QCA_WLAN_VENDOR_ATTR_TXPOWER_SCALE_DECR_DB_AFTER_LAST - 1 }; +/** + * enum qca_wlan_vendor_attr_sap_config - config params for sap configuration + * @QCA_WLAN_VENDOR_ATTR_SAP_CONFIG_INVALID: invalid + * @QCA_WLAN_VENDOR_ATTR_SAP_CONFIG_CHANNEL: Channel on which SAP should start + * @QCA_WLAN_VENDOR_ATTR_SAP_CONFIG_AFTER_LAST: after last + * @QCA_WLAN_VENDOR_ATTR_SAP_CONFIG_MAX: max attribute + */ +enum qca_wlan_vendor_attr_sap_config { + QCA_WLAN_VENDOR_ATTR_SAP_CONFIG_INVALID = 0, + QCA_WLAN_VENDOR_ATTR_SAP_CONFIG_CHANNEL, + /* keep last */ + QCA_WLAN_VENDOR_ATTR_SAP_CONFIG_AFTER_LAST, + QCA_WLAN_VENDOR_ATTR_SAP_CONFIG_MAX = + QCA_WLAN_VENDOR_ATTR_SAP_CONFIG_AFTER_LAST - 1, +}; + struct cfg80211_bss *wlan_hdd_cfg80211_update_bss_db(hdd_adapter_t *pAdapter, tCsrRoamInfo *pRoamInfo); |
