diff --git a/components/mlme/dispatcher/inc/wlan_mlme_api.h b/components/mlme/dispatcher/inc/wlan_mlme_api.h index 0e9cad88ee..51cdf0c02f 100644 --- a/components/mlme/dispatcher/inc/wlan_mlme_api.h +++ b/components/mlme/dispatcher/inc/wlan_mlme_api.h @@ -2421,4 +2421,45 @@ wlan_mlme_get_status_ring_buffer(struct wlan_objmgr_psoc *psoc, * Return: true if peer unmap confirmation support is enabled, else false */ bool wlan_mlme_get_peer_unmap_conf(struct wlan_objmgr_psoc *psoc); + +#ifdef WLAN_FEATURE_ROAM_OFFLOAD +/** + * wlan_mlme_get_roam_reason_vsie_status() - Indicate if roam reason + * vsie is enabled or disabled + * @psoc: pointer to psoc object + * @roam_reason_vsie_enabled: pointer to hold value of roam reason + * vsie + * + * Return: QDF_STATUS + */ +QDF_STATUS +wlan_mlme_get_roam_reason_vsie_status(struct wlan_objmgr_psoc *psoc, + uint8_t *roam_reason_vsie_enabled); + +/** + * wlan_mlme_set_roam_reason_vsie_status() - Update roam reason vsie status + * @psoc: pointer to psoc object + * @roam_reason_vsie_enabled: value of roam reason vsie + * + * Return: QDF_STATUS + */ +QDF_STATUS +wlan_mlme_set_roam_reason_vsie_status(struct wlan_objmgr_psoc *psoc, + uint8_t roam_reason_vsie_enabled); +#else +static inline QDF_STATUS +wlan_mlme_get_roam_reason_vsie_status(struct wlan_objmgr_psoc *psoc, + uint8_t *roam_reason_vsie_enable) +{ + return QDF_STATUS_E_FAILURE; +} + +static inline QDF_STATUS +wlan_mlme_set_roam_reason_vsie_status(struct wlan_objmgr_psoc *psoc, + uint8_t roam_reason_vsie_enable) +{ + return QDF_STATUS_E_FAILURE; +} +#endif + #endif /* _WLAN_MLME_API_H_ */ diff --git a/components/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h b/components/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h index 322a4bf7b4..5342a6daac 100644 --- a/components/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h +++ b/components/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h @@ -4034,4 +4034,39 @@ ucfg_mlme_get_discon_reason_n_from_ap(struct wlan_objmgr_psoc *psoc, { mlme_get_discon_reason_n_from_ap(psoc, vdev_id, from_ap, reason_code); } + +#ifdef WLAN_FEATURE_ROAM_OFFLOAD +/** + * ucfg_mlme_get_roam_reason_vsie_status() - Get roam reason vsie is + * enabled or disabled + * @psoc: pointer to psoc object + * @roam_reason_vsie_enabled: pointer to hold value of roam reason vsie + * + * Return: Success if able to get bcn rpt err vsie value, else failure + */ +static inline QDF_STATUS +ucfg_mlme_get_roam_reason_vsie_status(struct wlan_objmgr_psoc *psoc, + uint8_t *roam_reason_vsie_enabled) +{ + return wlan_mlme_get_roam_reason_vsie_status(psoc, + roam_reason_vsie_enabled); +} + +/** + * ucfg_mlme_set_roam_reason_vsie_status() - Update roam reason vsie status + * value with user configured value + * @psoc: pointer to psoc object + * @roam_reason_vsie_enabled: value of roam reason vsie status + * + * Return: Success if able to get bcn rpt err vsie value, else failure + */ +static inline QDF_STATUS +ucfg_mlme_set_roam_reason_vsie_status(struct wlan_objmgr_psoc *psoc, + uint8_t roam_reason_vsie_enabled) +{ + return wlan_mlme_set_roam_reason_vsie_status(psoc, + roam_reason_vsie_enabled); +} + +#endif #endif /* _WLAN_MLME_UCFG_API_H_ */ diff --git a/components/mlme/dispatcher/src/wlan_mlme_api.c b/components/mlme/dispatcher/src/wlan_mlme_api.c index b6d55194ae..dcc84954a4 100644 --- a/components/mlme/dispatcher/src/wlan_mlme_api.c +++ b/components/mlme/dispatcher/src/wlan_mlme_api.c @@ -3821,3 +3821,36 @@ bool wlan_mlme_get_peer_unmap_conf(struct wlan_objmgr_psoc *psoc) return mlme_obj->cfg.gen.enable_peer_unmap_conf_support; } + +#ifdef WLAN_FEATURE_ROAM_OFFLOAD +QDF_STATUS +wlan_mlme_get_roam_reason_vsie_status(struct wlan_objmgr_psoc *psoc, + uint8_t *roam_reason_vsie_enable) +{ + struct wlan_mlme_psoc_ext_obj *mlme_obj; + + mlme_obj = mlme_get_psoc_ext_obj(psoc); + if (!mlme_obj) { + *roam_reason_vsie_enable = + cfg_default(CFG_ENABLE_ROAM_REASON_VSIE); + return QDF_STATUS_E_FAILURE; + } + + *roam_reason_vsie_enable = mlme_obj->cfg.lfr.enable_roam_reason_vsie; + return QDF_STATUS_SUCCESS; +} + +QDF_STATUS +wlan_mlme_set_roam_reason_vsie_status(struct wlan_objmgr_psoc *psoc, + uint8_t roam_reason_vsie_enable) +{ + struct wlan_mlme_psoc_ext_obj *mlme_obj; + + mlme_obj = mlme_get_psoc_ext_obj(psoc); + if (!mlme_obj) + return QDF_STATUS_E_FAILURE; + + mlme_obj->cfg.lfr.enable_roam_reason_vsie = roam_reason_vsie_enable; + return QDF_STATUS_SUCCESS; +} +#endif diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c index 80bf2eb1c3..03c7be8237 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/core/hdd/src/wlan_hdd_cfg80211.c @@ -6545,6 +6545,7 @@ wlan_hdd_wifi_config_policy[QCA_WLAN_VENDOR_ATTR_CONFIG_MAX + 1] = { [QCA_WLAN_VENDOR_ATTR_DISCONNECT_IES] = { .type = NLA_BINARY, .len = SIR_MAC_MAX_ADD_IE_LENGTH + 2}, + [QCA_WLAN_VENDOR_ATTR_CONFIG_ROAM_REASON] = {.type = NLA_U8 }, }; @@ -6877,6 +6878,61 @@ static int wlan_hdd_cfg80211_wifi_set_rx_blocksize(struct hdd_adapter *adapter, return ret_val; } +/** + * hdd_set_roam_reason_vsie_status() - enable/disable inclusion of + * roam reason vsie in Reassoc + * + * @adapter: hdd adapter + * @attr: nla attr sent by supplicant + * + * Return: 0 on success, negative errno on failure + */ +#ifdef WLAN_FEATURE_ROAM_OFFLOAD +static int hdd_set_roam_reason_vsie_status(struct hdd_adapter *adapter, + const struct nlattr *attr) +{ + uint8_t roam_reason_vsie_enabled; + int errno; + QDF_STATUS status = QDF_STATUS_SUCCESS; + struct hdd_context *hdd_ctx = NULL; + + hdd_ctx = WLAN_HDD_GET_CTX(adapter); + if (!hdd_ctx) { + hdd_err("hdd_ctx failure"); + return -EINVAL; + } + + roam_reason_vsie_enabled = nla_get_u8(attr); + if (roam_reason_vsie_enabled > 1) + roam_reason_vsie_enabled = 1; + + status = + ucfg_mlme_set_roam_reason_vsie_status(hdd_ctx->psoc, + roam_reason_vsie_enabled); + if (QDF_IS_STATUS_ERROR(status)) { + hdd_err("set roam reason vsie failed"); + return -EINVAL; + } + + errno = sme_cli_set_command + (adapter->vdev_id, + WMI_VDEV_PARAM_ENABLE_DISABLE_ROAM_REASON_VSIE, + roam_reason_vsie_enabled, VDEV_CMD); + if (errno) { + hdd_err("Failed to set beacon report error vsie"); + status = QDF_STATUS_E_FAILURE; + } + + return qdf_status_to_os_return(status); +} +#else +static int hdd_set_roam_reason_vsie_status(struct hdd_adapter *adapter, + const struct nlattr *attr) +{ + return -ENOTSUPP; +} +#endif + static int hdd_config_access_policy(struct hdd_adapter *adapter, struct nlattr *tb[]) { @@ -7812,6 +7868,8 @@ static const struct independent_setters independent_setters[] = { {QCA_WLAN_VENDOR_ATTR_CONFIG_ELNA_BYPASS, hdd_set_elna_bypass}, #endif + {QCA_WLAN_VENDOR_ATTR_CONFIG_ROAM_REASON, + hdd_set_roam_reason_vsie_status}, }; #ifdef WLAN_FEATURE_ELNA @@ -7842,6 +7900,50 @@ static int hdd_get_elna_bypass(struct hdd_adapter *adapter, } #endif +/** + * hdd_get_roam_reason_vsie_status() - Get roam_reason_vsie + * @adapter: Pointer to HDD adapter + * @skb: sk buffer to hold nl80211 attributes + * @attr: Pointer to struct nlattr + * + * Return: 0 on success; error number otherwise + */ +#ifdef WLAN_FEATURE_ROAM_OFFLOAD +static int hdd_get_roam_reason_vsie_status(struct hdd_adapter *adapter, + struct sk_buff *skb, + const struct nlattr *attr) +{ + uint8_t roam_reason_vsie_enabled; + struct hdd_context *hdd_ctx = NULL; + QDF_STATUS status; + + hdd_ctx = WLAN_HDD_GET_CTX(adapter); + + status = ucfg_mlme_get_roam_reason_vsie_status + (hdd_ctx->psoc, + &roam_reason_vsie_enabled); + if (QDF_IS_STATUS_ERROR(status)) { + hdd_err("get roam reason vsie failed"); + return -EINVAL; + } + hdd_debug("is roam_reason_vsie_enabled %d", roam_reason_vsie_enabled); + if (nla_put_u8(skb, QCA_WLAN_VENDOR_ATTR_CONFIG_ROAM_REASON, + roam_reason_vsie_enabled)) { + hdd_err("nla_put failure"); + return -EINVAL; + } + + return 0; +} +#else +static int hdd_get_roam_reason_vsie_status(struct hdd_adapter *adapter, + struct sk_buff *skb, + const struct nlattr *attr) +{ + return -EINVAL; +} +#endif + /** * typedef config_getter_fn - get configuration handler * @adapter: The adapter being configured @@ -7874,6 +7976,9 @@ static const struct config_getters config_getters[] = { sizeof(uint8_t), hdd_get_elna_bypass}, #endif + {QCA_WLAN_VENDOR_ATTR_CONFIG_ROAM_REASON, + sizeof(uint8_t), + hdd_get_roam_reason_vsie_status}, }; /** diff --git a/core/wma/src/wma_scan_roam.c b/core/wma/src/wma_scan_roam.c index f1cfeaed08..6bb5960bb3 100644 --- a/core/wma/src/wma_scan_roam.c +++ b/core/wma/src/wma_scan_roam.c @@ -1780,6 +1780,35 @@ wma_send_idle_roam_params(tp_wma_handle wma_handle, {} #endif +/* wma_set_vdev_roam_reason_vsie: set vdev param + *WMI_VDEV_PARAM_ENABLE_DISABLE_ROAM_REASON_VSIE + * + *@wma: wma handler + *@vdev_id: vdev id + *@is_roam_reason_vsie_enabled: enable_roam_reason_vsie ini value + * + * Return: Void + */ +#ifdef WLAN_FEATURE_ROAM_OFFLOAD +static void wma_set_vdev_roam_reason_vsie(tp_wma_handle wma, uint8_t vdev_id, + bool is_roam_reason_vsie_enabled) +{ + int ret; + + ret = wma_vdev_set_param(wma->wmi_handle, vdev_id, + WMI_VDEV_PARAM_ENABLE_DISABLE_ROAM_REASON_VSIE, + is_roam_reason_vsie_enabled); + if (ret) + WMA_LOGE("Failed to set vdev param %d", + WMI_VDEV_PARAM_ENABLE_DISABLE_ROAM_REASON_VSIE); +} +#else +static void wma_set_vdev_roam_reason_vsie(tp_wma_handle wma, uint8_t vdev_id, + bool is_roam_reason_vsie_enabled) +{ +} +#endif + /** * wma_process_roaming_config() - process roam request * @wma_handle: wma handle @@ -1796,6 +1825,7 @@ QDF_STATUS wma_process_roaming_config(tp_wma_handle wma_handle, wmi_start_scan_cmd_fixed_param scan_params; struct mac_context *mac = cds_get_context(QDF_MODULE_ID_PE); uint32_t mode = 0; + uint8_t enable_roam_reason_vsie = 0; struct wma_txrx_node *intr = NULL; struct wmi_bss_load_config *bss_load_cfg; @@ -1838,6 +1868,11 @@ QDF_STATUS wma_process_roaming_config(tp_wma_handle wma_handle, if (qdf_status != QDF_STATUS_SUCCESS) break; + wlan_mlme_get_roam_reason_vsie_status(wma_handle->psoc, + &enable_roam_reason_vsie); + wma_set_vdev_roam_reason_vsie(wma_handle, roam_req->sessionId, + enable_roam_reason_vsie); + /* Opportunistic scan runs on a timer, value set by * EmptyRefreshScanPeriod. Age out the entries after 3 such * cycles.