From 4251e4ac67b1e81318775a4ed255465962be1f39 Mon Sep 17 00:00:00 2001 From: Srinivas Pitla Date: Tue, 18 Jul 2023 16:39:06 -0700 Subject: [PATCH] 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 --- .../obj_mgr/inc/wlan_objmgr_vdev_obj.h | 18 +++++++++ umac/mlo_mgr/inc/wlan_mlo_mgr_main.h | 36 ++++++++++++++++++ umac/mlo_mgr/src/wlan_mlo_mgr_main.c | 37 +++++++++++++++++++ 3 files changed, 91 insertions(+) diff --git a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_vdev_obj.h b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_vdev_obj.h index 288efac36c..8e125b71d5 100644 --- a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_vdev_obj.h +++ b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_vdev_obj.h @@ -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 diff --git a/umac/mlo_mgr/inc/wlan_mlo_mgr_main.h b/umac/mlo_mgr/inc/wlan_mlo_mgr_main.h index 9b6d4cf889..462e9590d1 100644 --- a/umac/mlo_mgr/inc/wlan_mlo_mgr_main.h +++ b/umac/mlo_mgr/inc/wlan_mlo_mgr_main.h @@ -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 diff --git a/umac/mlo_mgr/src/wlan_mlo_mgr_main.c b/umac/mlo_mgr/src/wlan_mlo_mgr_main.c index 7dd5e3a754..4ad8265f52 100644 --- a/umac/mlo_mgr/src/wlan_mlo_mgr_main.c +++ b/umac/mlo_mgr/src/wlan_mlo_mgr_main.c @@ -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; +}