qcacmn: Add/Remove VDEV from MLD

This change adds APIs
1) remove VDEV from MLD
2) add VDEV to MLD

CRs-Fixed: 3579048
Change-Id: I5a81d7a50b0c3865c3ab914a3e10906e3010cb91
This commit is contained in:
Srinivas Pitla
2023-07-18 16:39:06 -07:00
committed by Rahul Choudhary
parent c92389fe5f
commit 4251e4ac67
3 changed files with 91 additions and 0 deletions

View File

@@ -245,6 +245,8 @@
* from non-DFS channel
*/
#define WLAN_VDEV_OP_MLME_LEGACY_PEER_DISCON_TRIG 0x02000000
/* for mlo reconfig link removal functionality */
#define WLAN_VDEV_OP_MLO_REMOVE_LINK_VDEV 0x04000000
/* CAPABILITY: IBSS available */
#define WLAN_VDEV_C_IBSS 0x00000001
@@ -895,6 +897,22 @@ static inline void wlan_vdev_mlme_set_mldaddr(struct wlan_objmgr_vdev *vdev,
WLAN_ADDR_COPY(vdev->vdev_mlme.mldaddr, mldaddr);
}
/**
* wlan_vdev_mlme_reset_mldaddr() - clear vdev mldaddr
* @vdev: VDEV object
*
* API to clear MLD addr in vdev object
*
* Caller need to acquire lock with wlan_vdev_obj_lock()
*
* Return: void
*/
static inline void wlan_vdev_mlme_reset_mldaddr(struct wlan_objmgr_vdev *vdev)
{
/* This API is invoked with lock acquired, do not add log prints */
qdf_zero_macaddr((struct qdf_mac_addr *)vdev->vdev_mlme.mldaddr);
}
/**
* wlan_vdev_mlme_get_linkaddr() - get vdev linkaddr
* @vdev: VDEV object

View File

@@ -978,6 +978,28 @@ void wlan_mlo_update_action_frame_from_user(struct wlan_objmgr_vdev *vdev,
void wlan_mlo_update_action_frame_to_user(struct wlan_objmgr_vdev *vdev,
uint8_t *frame,
uint32_t frame_len);
/**
* wlan_mlo_mgr_mld_vdev_attach() - Attach VDEV to MLD
* @vdev: VDEV object
* @mld_addr: MLD address of MLD, where this VDEV should be attached
*
* API to set MLD MAC address and Attaches VDEV to existing MLD.
*
* Return: QDF_STATUS
*/
QDF_STATUS wlan_mlo_mgr_mld_vdev_attach(struct wlan_objmgr_vdev *vdev,
struct qdf_mac_addr *mld_addr);
/**
* wlan_mlo_mgr_mld_vdev_detach() - Detach VDEV from MLD
* @vdev: VDEV object
*
* API to reset MLD MAC address and Detaches VDEV from its MLD.
*
* Return: QDF_STATUS
*/
QDF_STATUS wlan_mlo_mgr_mld_vdev_detach(struct wlan_objmgr_vdev *vdev);
#else
static inline QDF_STATUS wlan_mlo_mgr_init(void)
{
@@ -1022,5 +1044,19 @@ uint8_t wlan_mlo_get_sta_mld_ctx_count(void)
{
return 0;
}
static inline
QDF_STATUS wlan_mlo_mgr_mld_vdev_attach(struct wlan_objmgr_vdev *vdev,
struct qdf_mac_addr *mld_addr)
{
return QDF_STATUS_SUCCESS;
}
static inline
QDF_STATUS wlan_mlo_mgr_mld_vdev_detach(struct wlan_objmgr_vdev *vdev)
{
return QDF_STATUS_SUCCESS;
}
#endif
#endif

View File

@@ -1167,3 +1167,40 @@ QDF_STATUS wlan_mlo_mgr_update_mld_addr(struct qdf_mac_addr *old_mac,
return QDF_STATUS_SUCCESS;
}
QDF_STATUS wlan_mlo_mgr_mld_vdev_attach(struct wlan_objmgr_vdev *vdev,
struct qdf_mac_addr *mld_addr)
{
QDF_STATUS status = QDF_STATUS_SUCCESS;
wlan_vdev_obj_lock(vdev);
wlan_vdev_mlme_set_mldaddr(vdev, (uint8_t *)&mld_addr->bytes[0]);
wlan_vdev_obj_unlock(vdev);
status = mlo_dev_ctx_init(vdev);
return status;
}
QDF_STATUS wlan_mlo_mgr_mld_vdev_detach(struct wlan_objmgr_vdev *vdev)
{
struct wlan_mlo_dev_context *ml_dev;
QDF_STATUS status = QDF_STATUS_SUCCESS;
ml_dev = vdev->mlo_dev_ctx;
/*
* Atleast one VAP should be part of MLD for dynamic link vap
* addition and deletion, so rejecting VDEV detach
*/
if (ml_dev->wlan_vdev_count <= 1)
return QDF_STATUS_E_FAILURE;
status = mlo_dev_ctx_deinit(vdev);
wlan_vdev_obj_lock(vdev);
wlan_vdev_mlme_reset_mldaddr(vdev);
wlan_vdev_mlme_op_flags_clear(vdev, WLAN_VDEV_OP_MLO_REMOVE_LINK_VDEV);
wlan_vdev_obj_unlock(vdev);
return status;
}