qcacmn: Selective peer discon during non-DFS to DFS

Disconnect only non ML peers in CSA from non-DFS channel to DFS channel,
while keeping all MLO peers connected.

Change-Id: I7e8347cf4692b16b84ffbce4b102dd2f23bb70f0
CRs-Fixed: 3394219
This commit is contained in:
Krunalsinh Padhar
2023-01-23 04:30:53 -08:00
committed by Madan Koyyalamudi
parent 62c9261e5f
commit 6d5fea01f7
7 changed files with 112 additions and 21 deletions

View File

@@ -237,6 +237,11 @@
/* MLO link removal is in progress on this VDEV */
#define WLAN_VDEV_OP_MLO_LINK_REMOVAL_IN_PROGRESS 0x01000000
/* flag to indicate disconnect only legacy peers due to moving to DFS channel
* from non-DFS channel
*/
#define WLAN_VDEV_OP_MLME_LEGACY_PEER_DISCON_TRIG 0x02000000
/* CAPABILITY: IBSS available */
#define WLAN_VDEV_C_IBSS 0x00000001
/* CAPABILITY: HOSTAP avail */
@@ -379,18 +384,19 @@ struct wlan_objmgr_vdev_nif {
/**
* struct wlan_objmgr_vdev_objmgr - vdev object manager sub structure
* @vdev_id: VDEV id
* @print_cnt: Count to throttle Logical delete prints
* @self_peer: Self PEER
* @bss_peer: BSS PEER
* @wlan_peer_list: PEER list
* @wlan_pdev: PDEV pointer
* @wlan_peer_count: Peer count
* @max_peer_count: Max Peer count
* @c_flags: creation specific flags
* @ref_cnt: Ref count
* @ref_id_dbg: Array to track Ref count
* @trace: Trace ref and deref
* @vdev_id: VDEV id
* @print_cnt: Count to throttle Logical delete prints
* @self_peer: Self PEER
* @bss_peer: BSS PEER
* @wlan_peer_list: PEER list
* @wlan_pdev: PDEV pointer
* @wlan_peer_count: Peer count
* @wlan_ml_peer_count: Multilink Peer count
* @max_peer_count: Max Peer count
* @c_flags: creation specific flags
* @ref_cnt: Ref count
* @ref_id_dbg: Array to track Ref count
* @trace: Trace ref and deref
*/
struct wlan_objmgr_vdev_objmgr {
uint8_t vdev_id;
@@ -400,6 +406,9 @@ struct wlan_objmgr_vdev_objmgr {
qdf_list_t wlan_peer_list;
struct wlan_objmgr_pdev *wlan_pdev;
uint16_t wlan_peer_count;
#ifdef WLAN_FEATURE_11BE_MLO
uint16_t wlan_ml_peer_count;
#endif
uint16_t max_peer_count;
uint32_t c_flags;
qdf_atomic_t ref_cnt;
@@ -1565,6 +1574,29 @@ static inline uint16_t wlan_vdev_get_peer_count(struct wlan_objmgr_vdev *vdev)
return vdev->vdev_objmgr.wlan_peer_count;
}
#ifdef WLAN_FEATURE_11BE_MLO
/**
* wlan_vdev_get_legacy_peer_count() - get vdev peer count
* @vdev: VDEV object
*
* API to get legacy peer count from VDEV
*
* Return: peer_count - vdev's peer count
*/
static inline uint16_t wlan_vdev_get_legacy_peer_count(
struct wlan_objmgr_vdev *vdev)
{
return vdev->vdev_objmgr.wlan_peer_count -
vdev->vdev_objmgr.wlan_ml_peer_count;
}
#else
static inline uint16_t wlan_vdev_get_legacy_peer_count(
struct wlan_objmgr_vdev *vdev)
{
return vdev->vdev_objmgr.wlan_peer_count;
}
#endif
/**
* wlan_vdev_mlme_is_ap() - Check whether @vdev is an AP or not
* @vdev: VDEV object
@@ -2098,4 +2130,42 @@ QDF_STATUS wlan_vdev_get_bss_peer_mld_mac(struct wlan_objmgr_vdev *vdev,
struct qdf_mac_addr *mld_mac);
#endif
/**
* wlan_objmgr_vdev_set_ml_peer_count() - set ml_peer_count value
* @vdev: vdev object pointer
* @ml_peer_count: ml peer count to be set
*
* Return: void
*/
#ifdef WLAN_FEATURE_11BE_MLO
static inline void
wlan_objmgr_vdev_set_ml_peer_count(struct wlan_objmgr_vdev *vdev,
uint16_t ml_peer_count)
{
vdev->vdev_objmgr.wlan_ml_peer_count = ml_peer_count;
}
#else
static inline void
wlan_objmgr_vdev_set_ml_peer_count(struct wlan_objmgr_vdev *vdev,
uint16_t ml_peer_count)
{
}
#endif
/**
* wlan_mlo_peer_delete_is_not_allowed()
* @vdev: VDEV object
*
* API to check if WLAN_VDEV_OP_MLME_LEGACY_PEER_DISCON_TRIG is set therefore
* whether mlo peer delete should be allowed or not
*
* Return: True if MLO peer delete is not allowed, otherwise false.
*/
static inline bool wlan_mlo_peer_delete_is_not_allowed(
struct wlan_objmgr_vdev *vdev)
{
return wlan_vdev_mlme_op_flags_get(vdev,
WLAN_VDEV_OP_MLME_LEGACY_PEER_DISCON_TRIG);
}
#endif /* _WLAN_OBJMGR_VDEV_OBJ_H_*/

View File

@@ -225,6 +225,7 @@ struct wlan_objmgr_vdev *wlan_objmgr_vdev_obj_create(
/* peer count to 0 */
vdev->vdev_objmgr.wlan_peer_count = 0;
wlan_objmgr_vdev_set_ml_peer_count(vdev, 0);
qdf_atomic_init(&vdev->vdev_objmgr.ref_cnt);
vdev->vdev_objmgr.print_cnt = 0;
wlan_objmgr_vdev_get_ref(vdev, WLAN_OBJMGR_ID);