qcacld-3.0: Add logic to support tdls on MLO

Since for MLD device, it can only choice one link for tdls,
add logic like this:
1\ As initiator, it needs to send discovery request on each
link, before send the frame, it needs to force active the link;
2\ As responder, it sends the discovery response the link id,
before send the frame, it needs to force active the link;
3\ For other tdls management and tdls operation, it needs to
find out which link(vdev) is used as tdls link first.

Change-Id: I64e27219eb6c6b3fef62e541423aa8e5d84b1560
CRs-Fixed: 3439568
This commit is contained in:
Paul Zhang
2023-04-03 13:58:22 +08:00
committed by Madan Koyyalamudi
parent 7d518a4ab9
commit 0752365a21
9 changed files with 429 additions and 55 deletions

View File

@@ -1176,20 +1176,24 @@ struct tdls_get_all_peers {
* @vdev: vdev object
* @chk_frame: This struct used to validate mgmt frame
* @session_id: session id
* @link_id: link id
* @vdev_id: vdev id
* @cmd_buf: cmd buffer
* @len: length of the frame
* @use_default_ac: access category
* @link_active: whether link active command send successfully
* @tdls_mgmt: tdls management
*/
struct tdls_action_frame_request {
struct wlan_objmgr_vdev *vdev;
struct tdls_validate_action_req chk_frame;
uint8_t session_id;
uint8_t link_id;
uint8_t vdev_id;
const uint8_t *cmd_buf;
uint8_t len;
bool use_default_ac;
bool link_active;
/* Variable length, do not add anything after this */
struct tdls_send_mgmt tdls_mgmt;
};

View File

@@ -181,6 +181,35 @@ void ucfg_tdls_update_fw_mlo_capability(struct wlan_objmgr_psoc *psoc,
}
#endif
/**
* ucfg_tdls_link_vdev_is_matching() - check whether vdev is matching link vdev
* @vdev: vdev object
*
* Return: bool
*/
bool ucfg_tdls_link_vdev_is_matching(struct wlan_objmgr_vdev *vdev);
/**
* ucfg_tdls_get_tdls_link_vdev() - get tdls link vdev
* @vdev: vdev object
* @dbg_id: debug id
*
* Return: vdev pointer
*/
struct wlan_objmgr_vdev *
ucfg_tdls_get_tdls_link_vdev(struct wlan_objmgr_vdev *vdev,
wlan_objmgr_ref_dbgid dbg_id);
/**
* ucfg_tdls_put_tdls_link_vdev() - put tdls link vdev
* @vdev: vdev odject
* @dbg_id: debug id
*
* Return: void
*/
void ucfg_tdls_put_tdls_link_vdev(struct wlan_objmgr_vdev *vdev,
wlan_objmgr_ref_dbgid dbg_id);
/**
* ucfg_tdls_psoc_enable() - TDLS module enable API
* @psoc: psoc object
@@ -429,6 +458,25 @@ struct wlan_objmgr_vdev *ucfg_get_tdls_vdev(struct wlan_objmgr_psoc *psoc,
wlan_objmgr_ref_dbgid dbg_id);
#else
static inline
bool ucfg_tdls_link_vdev_is_matching(struct wlan_objmgr_vdev *vdev)
{
return false;
}
static inline
struct wlan_objmgr_vdev *
ucfg_tdls_get_tdls_link_vdev(struct wlan_objmgr_vdev *vdev,
wlan_objmgr_ref_dbgid dbg_id)
{
return NULL;
}
static inline
void ucfg_tdls_put_tdls_link_vdev(struct wlan_objmgr_vdev *vdev,
wlan_objmgr_ref_dbgid dbg_id)
{
}
static inline
QDF_STATUS ucfg_tdls_init(void)

View File

@@ -34,6 +34,7 @@
#include "wlan_policy_mgr_api.h"
#include "wlan_scan_ucfg_api.h"
#include "cfg_tdls.h"
#include "wlan_mlo_mgr_sta.h"
#include "cfg_ucfg_api.h"
#include "wlan_tdls_api.h"
@@ -519,6 +520,49 @@ QDF_STATUS ucfg_tdls_update_config(struct wlan_objmgr_psoc *psoc,
return QDF_STATUS_SUCCESS;
}
bool ucfg_tdls_link_vdev_is_matching(struct wlan_objmgr_vdev *vdev)
{
struct wlan_objmgr_vdev *tdls_link_vdev;
tdls_link_vdev = tdls_mlo_get_tdls_link_vdev(vdev);
if (!tdls_link_vdev) {
wlan_vdev_mlme_feat_ext2_cap_set(vdev,
WLAN_VDEV_FEXT2_MLO_STA_TDLS);
return true;
}
if (tdls_link_vdev && tdls_link_vdev != vdev) {
tdls_debug("tdls vdev has been created on vdev %d",
wlan_vdev_get_id(tdls_link_vdev));
return false;
}
return true;
}
struct wlan_objmgr_vdev *
ucfg_tdls_get_tdls_link_vdev(struct wlan_objmgr_vdev *vdev,
wlan_objmgr_ref_dbgid dbg_id)
{
struct wlan_objmgr_vdev *link_vdev;
link_vdev = tdls_mlo_get_tdls_link_vdev(vdev);
if (!link_vdev)
return NULL;
if (wlan_objmgr_vdev_try_get_ref(link_vdev, dbg_id) !=
QDF_STATUS_SUCCESS)
return NULL;
return link_vdev;
}
void ucfg_tdls_put_tdls_link_vdev(struct wlan_objmgr_vdev *vdev,
wlan_objmgr_ref_dbgid dbg_id)
{
wlan_objmgr_vdev_release_ref(vdev, dbg_id);
}
QDF_STATUS ucfg_tdls_psoc_enable(struct wlan_objmgr_psoc *psoc)
{
QDF_STATUS status;