qcacld-3.0: Add support to send TDLS avail and no. connected peer
Add support to send whether currently TDLS is available or not. Vendor subcmd: QCA_NL80211_VENDOR_SUBCMD_TDLS_GET_STATUS Vendor attr: QCA_WLAN_VENDOR_ATTR_TDLS_GET_STATUS_AVAILABLE Also add support to get the TDLS number of active sessions using below vendor attr. Vendor subcmd: QCA_NL80211_VENDOR_SUBCMD_TDLS_GET_STATUS Vendor attr: QCA_WLAN_VENDOR_ATTR_TDLS_GET_STATUS_NUM_SESSIONS Change-Id: Ie9ad09de9593559c4d57599a9af58a95af99e60f CRs-Fixed: 3554429
This commit is contained in:

committed by
Rahul Choudhary

parent
35e5e0117e
commit
167488b437
@@ -30,6 +30,7 @@
|
|||||||
#include <wlan_mlme_api.h>
|
#include <wlan_mlme_api.h>
|
||||||
#include <wlan_mlme_main.h>
|
#include <wlan_mlme_main.h>
|
||||||
#include "wma_tgt_cfg.h"
|
#include "wma_tgt_cfg.h"
|
||||||
|
#include "wlan_mlme_vdev_mgr_interface.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ucfg_mlme_init() - initialize mlme_ctx context.
|
* ucfg_mlme_init() - initialize mlme_ctx context.
|
||||||
@@ -282,6 +283,19 @@ ucfg_mlme_peer_config_vlan(struct wlan_objmgr_vdev *vdev,
|
|||||||
return wlan_mlme_peer_config_vlan(vdev, macaddr);
|
return wlan_mlme_peer_config_vlan(vdev, macaddr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ucfg_mlme_get_tdls_prohibited() - get if TDLS prohibited is advertised by
|
||||||
|
* the connected AP.
|
||||||
|
* @vdev: vdev pointer
|
||||||
|
*
|
||||||
|
* Return: bool
|
||||||
|
*/
|
||||||
|
static inline
|
||||||
|
bool ucfg_mlme_get_tdls_prohibited(struct wlan_objmgr_vdev *vdev)
|
||||||
|
{
|
||||||
|
return mlme_get_tdls_prohibited(vdev);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef MULTI_CLIENT_LL_SUPPORT
|
#ifdef MULTI_CLIENT_LL_SUPPORT
|
||||||
/**
|
/**
|
||||||
* ucfg_mlme_get_wlm_multi_client_ll_caps() - Get multi client latency level
|
* ucfg_mlme_get_wlm_multi_client_ll_caps() - Get multi client latency level
|
||||||
|
@@ -274,6 +274,14 @@ cfg_tdls_set_scan_enable(struct wlan_objmgr_psoc *psoc,
|
|||||||
* This function gets tdls max peer count
|
* This function gets tdls max peer count
|
||||||
*/
|
*/
|
||||||
uint16_t cfg_tdls_get_max_peer_count(struct wlan_objmgr_psoc *psoc);
|
uint16_t cfg_tdls_get_max_peer_count(struct wlan_objmgr_psoc *psoc);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* cfg_tdls_get_connected_peer_count() - get tdls connected peer count
|
||||||
|
* @psoc: pointer to psoc object
|
||||||
|
*
|
||||||
|
* This function gets tdls connected peer count
|
||||||
|
*/
|
||||||
|
uint16_t cfg_tdls_get_connected_peer_count(struct wlan_objmgr_psoc *psoc);
|
||||||
#else
|
#else
|
||||||
static inline QDF_STATUS
|
static inline QDF_STATUS
|
||||||
cfg_tdls_get_support_enable(struct wlan_objmgr_psoc *psoc,
|
cfg_tdls_get_support_enable(struct wlan_objmgr_psoc *psoc,
|
||||||
@@ -450,5 +458,12 @@ cfg_tdls_get_max_peer_count(struct wlan_objmgr_psoc *psoc)
|
|||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline uint16_t
|
||||||
|
cfg_tdls_get_connected_peer_count(struct wlan_objmgr_psoc *psoc)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* FEATURE_WLAN_TDLS */
|
#endif /* FEATURE_WLAN_TDLS */
|
||||||
#endif /* _WLAN_TDLS_CFG_API_H_ */
|
#endif /* _WLAN_TDLS_CFG_API_H_ */
|
||||||
|
@@ -459,6 +459,16 @@ uint16_t ucfg_get_tdls_conn_peer_count(struct wlan_objmgr_vdev *vdev);
|
|||||||
struct wlan_objmgr_vdev *ucfg_get_tdls_vdev(struct wlan_objmgr_psoc *psoc,
|
struct wlan_objmgr_vdev *ucfg_get_tdls_vdev(struct wlan_objmgr_psoc *psoc,
|
||||||
wlan_objmgr_ref_dbgid dbg_id);
|
wlan_objmgr_ref_dbgid dbg_id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ucfg_tdls_check_is_tdls_allowed() - Ucfg api to check is tdls allowed or not
|
||||||
|
* @vdev: vdev object
|
||||||
|
*
|
||||||
|
* Function determines the whether TDLS allowed in the system
|
||||||
|
*
|
||||||
|
* Return: true or false
|
||||||
|
*/
|
||||||
|
bool ucfg_tdls_check_is_tdls_allowed(struct wlan_objmgr_vdev *vdev);
|
||||||
|
|
||||||
#else
|
#else
|
||||||
static inline
|
static inline
|
||||||
bool ucfg_tdls_link_vdev_is_matching(struct wlan_objmgr_vdev *vdev)
|
bool ucfg_tdls_link_vdev_is_matching(struct wlan_objmgr_vdev *vdev)
|
||||||
@@ -560,6 +570,12 @@ struct wlan_objmgr_vdev *ucfg_get_tdls_vdev(struct wlan_objmgr_psoc *psoc,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
bool ucfg_tdls_check_is_tdls_allowed(struct wlan_objmgr_vdev *vdev)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
static inline
|
static inline
|
||||||
void ucfg_tdls_update_fw_11ax_capability(struct wlan_objmgr_psoc *psoc,
|
void ucfg_tdls_update_fw_11ax_capability(struct wlan_objmgr_psoc *psoc,
|
||||||
bool is_fw_tdls_11ax_capable)
|
bool is_fw_tdls_11ax_capable)
|
||||||
|
@@ -413,3 +413,17 @@ cfg_tdls_get_max_peer_count(struct wlan_objmgr_psoc *psoc)
|
|||||||
|
|
||||||
return soc_obj->max_num_tdls_sta;
|
return soc_obj->max_num_tdls_sta;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint16_t
|
||||||
|
cfg_tdls_get_connected_peer_count(struct wlan_objmgr_psoc *psoc)
|
||||||
|
{
|
||||||
|
struct tdls_soc_priv_obj *soc_obj;
|
||||||
|
|
||||||
|
soc_obj = wlan_psoc_get_tdls_soc_obj(psoc);
|
||||||
|
if (!soc_obj) {
|
||||||
|
tdls_err("tdls soc null");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return soc_obj->connected_peer_count;
|
||||||
|
}
|
||||||
|
@@ -1287,3 +1287,8 @@ struct wlan_objmgr_vdev *ucfg_get_tdls_vdev(struct wlan_objmgr_psoc *psoc,
|
|||||||
{
|
{
|
||||||
return tdls_get_vdev(psoc, dbg_id);
|
return tdls_get_vdev(psoc, dbg_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ucfg_tdls_check_is_tdls_allowed(struct wlan_objmgr_vdev *vdev)
|
||||||
|
{
|
||||||
|
return tdls_check_is_tdls_allowed(vdev);
|
||||||
|
}
|
||||||
|
@@ -189,6 +189,70 @@ const struct nla_policy
|
|||||||
.type = NLA_S32},
|
.type = NLA_S32},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static bool wlan_hdd_is_tdls_allowed(struct hdd_context *hdd_ctx,
|
||||||
|
struct wlan_objmgr_vdev *vdev)
|
||||||
|
{
|
||||||
|
bool tdls_support;
|
||||||
|
|
||||||
|
if ((cfg_tdls_get_support_enable(hdd_ctx->psoc, &tdls_support) ==
|
||||||
|
QDF_STATUS_SUCCESS) && !tdls_support) {
|
||||||
|
hdd_debug("TDLS feature not Enabled or Not supported in FW");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!wlan_cm_is_vdev_connected(vdev)) {
|
||||||
|
hdd_debug("Failed due to Not associated");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (wlan_cm_roaming_in_progress(hdd_ctx->pdev,
|
||||||
|
wlan_vdev_get_id(vdev))) {
|
||||||
|
hdd_debug("Failed due to Roaming is in progress");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ucfg_tdls_check_is_tdls_allowed(vdev)) {
|
||||||
|
hdd_debug("TDLS is not allowed");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ucfg_mlme_get_tdls_prohibited(vdev)) {
|
||||||
|
hdd_debug("TDLS is prohobited by AP");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool wlan_hdd_get_tdls_allowed(struct hdd_context *hdd_ctx,
|
||||||
|
struct hdd_adapter *adapter)
|
||||||
|
{
|
||||||
|
struct wlan_hdd_link_info *link_info;
|
||||||
|
struct wlan_objmgr_vdev *vdev;
|
||||||
|
bool is_tdls_avail = false;
|
||||||
|
|
||||||
|
hdd_adapter_for_each_active_link_info(adapter, link_info) {
|
||||||
|
vdev = hdd_objmgr_get_vdev_by_user(link_info, WLAN_TDLS_NB_ID);
|
||||||
|
if (!vdev)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
is_tdls_avail = wlan_hdd_is_tdls_allowed(hdd_ctx, vdev);
|
||||||
|
|
||||||
|
/* Return is_tdls_avail for non-MLO case */
|
||||||
|
if (!wlan_vdev_mlme_is_mlo_vdev(vdev)) {
|
||||||
|
hdd_objmgr_put_vdev_by_user(vdev, WLAN_TDLS_NB_ID);
|
||||||
|
return is_tdls_avail;
|
||||||
|
}
|
||||||
|
|
||||||
|
hdd_objmgr_put_vdev_by_user(vdev, WLAN_TDLS_NB_ID);
|
||||||
|
|
||||||
|
if (is_tdls_avail)
|
||||||
|
return is_tdls_avail;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* __wlan_hdd_cfg80211_exttdls_get_status() - handle get status cfg80211 command
|
* __wlan_hdd_cfg80211_exttdls_get_status() - handle get status cfg80211 command
|
||||||
* @wiphy: wiphy
|
* @wiphy: wiphy
|
||||||
@@ -202,8 +266,74 @@ __wlan_hdd_cfg80211_exttdls_get_status(struct wiphy *wiphy,
|
|||||||
const void *data,
|
const void *data,
|
||||||
int data_len)
|
int data_len)
|
||||||
{
|
{
|
||||||
/* TODO */
|
struct net_device *dev = wdev->netdev;
|
||||||
return 0;
|
struct hdd_adapter *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
|
||||||
|
struct hdd_context *hdd_ctx = wiphy_priv(wiphy);
|
||||||
|
struct sk_buff *skb;
|
||||||
|
uint32_t connected_peer_count = 0;
|
||||||
|
int status;
|
||||||
|
bool is_tdls_avail = true;
|
||||||
|
int ret = 0;
|
||||||
|
int attr;
|
||||||
|
|
||||||
|
hdd_enter_dev(wdev->netdev);
|
||||||
|
if (QDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
|
||||||
|
hdd_err("Command not allowed in FTM mode");
|
||||||
|
return -EPERM;
|
||||||
|
}
|
||||||
|
|
||||||
|
status = wlan_hdd_validate_context(hdd_ctx);
|
||||||
|
if (status)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
skb = wlan_cfg80211_vendor_cmd_alloc_reply_skb(wiphy,
|
||||||
|
sizeof(u32) + sizeof(bool) +
|
||||||
|
NLMSG_HDRLEN);
|
||||||
|
|
||||||
|
if (!skb) {
|
||||||
|
hdd_err("wlan_cfg80211_vendor_cmd_alloc_reply_skb failed");
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (adapter->device_mode != QDF_STA_MODE &&
|
||||||
|
adapter->device_mode != QDF_P2P_CLIENT_MODE) {
|
||||||
|
hdd_debug("Failed to get TDLS info due to opmode:%d",
|
||||||
|
adapter->device_mode);
|
||||||
|
ret = -EOPNOTSUPP;
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
connected_peer_count = cfg_tdls_get_connected_peer_count(hdd_ctx->psoc);
|
||||||
|
is_tdls_avail = wlan_hdd_get_tdls_allowed(hdd_ctx, adapter);
|
||||||
|
|
||||||
|
if (connected_peer_count >=
|
||||||
|
cfg_tdls_get_max_peer_count(hdd_ctx->psoc)) {
|
||||||
|
hdd_debug("Failed due to max no. of connected peer:%d reached",
|
||||||
|
connected_peer_count);
|
||||||
|
is_tdls_avail = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
hdd_debug("Send TDLS_available: %d, no. of connected peer:%d to userspace",
|
||||||
|
is_tdls_avail, connected_peer_count);
|
||||||
|
|
||||||
|
attr = QCA_WLAN_VENDOR_ATTR_TDLS_GET_STATUS_NUM_SESSIONS;
|
||||||
|
if (nla_put_u32(skb, attr, connected_peer_count)) {
|
||||||
|
hdd_err("nla put fail");
|
||||||
|
ret = -EINVAL;
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
attr = QCA_WLAN_VENDOR_ATTR_TDLS_GET_STATUS_AVAILABLE;
|
||||||
|
if (is_tdls_avail && nla_put_flag(skb, attr)) {
|
||||||
|
hdd_err("nla put fail");
|
||||||
|
ret = -EINVAL;
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
return wlan_cfg80211_vendor_cmd_reply(skb);
|
||||||
|
fail:
|
||||||
|
wlan_cfg80211_vendor_free_skb(skb);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
Reference in New Issue
Block a user