qcacmn: Allow MLO peer create when ACS scan completes

Allow peer create and association only when full ACS
scan is complete for any link in an AP MLD.

Change-Id: I54d60f31c2521c87fb715b23fc3e0ea7e6100248
CRs-Fixed: 3232153
This commit is contained in:
Jhalak Naik
2022-07-05 11:50:58 +05:30
zatwierdzone przez Madan Koyyalamudi
rodzic 0e921647c0
commit 56fa1788e4
3 zmienionych plików z 41 dodań i 5 usunięć

Wyświetl plik

@@ -356,6 +356,9 @@ struct mlme_ext_ops {
struct qdf_mac_addr mld_addr,
struct wlan_objmgr_vdev *vdev);
#endif
QDF_STATUS (*mlme_ext_get_acs_inprogress)(
struct wlan_objmgr_vdev *vdev,
bool *is_acs_inprogress);
};
/**
@@ -747,6 +750,15 @@ QDF_STATUS mlme_cm_disconnect_complete_ind(struct wlan_objmgr_vdev *vdev,
*/
QDF_STATUS mlme_cm_vdev_down_req(struct wlan_objmgr_vdev *vdev);
/**
* mlme_ext_hdl_get_acs_in_progress() - Check if ACS is in progress
* @vdev: VDEV object
* @acs_in_progress: ACS in progress flag
*
* Return: QDF_STATUS
*/
QDF_STATUS mlme_ext_hdl_get_acs_in_progress(struct wlan_objmgr_vdev *vdev,
bool *acs_in_progress);
/**
* mlme_cm_osif_connect_complete() - Connect complete resp to osif
* @vdev: vdev pointer

Wyświetl plik

@@ -309,6 +309,18 @@ QDF_STATUS mlme_cm_connect_start_ind(struct wlan_objmgr_vdev *vdev,
return ret;
}
QDF_STATUS mlme_ext_hdl_get_acs_in_progress(struct wlan_objmgr_vdev *vdev,
bool *acs_in_progress)
{
QDF_STATUS ret = QDF_STATUS_SUCCESS;
if ((glbl_ops) && glbl_ops->mlme_ext_get_acs_inprogress)
ret = glbl_ops->mlme_ext_get_acs_inprogress(vdev,
acs_in_progress);
return ret;
}
QDF_STATUS mlme_cm_bss_select_ind(struct wlan_objmgr_vdev *vdev,
struct wlan_cm_vdev_connect_req *req)
{

Wyświetl plik

@@ -24,6 +24,7 @@
#include "include/wlan_vdev_mlme.h"
#include "../../core/src/vdev_mlme_sm.h"
#include <wlan_vdev_mlme_api.h>
#include <include/wlan_mlme_cmn.h>
#include <qdf_module.h>
struct vdev_mlme_obj *wlan_vdev_mlme_get_cmpt_obj(struct wlan_objmgr_vdev *vdev)
@@ -231,6 +232,8 @@ QDF_STATUS wlan_vdev_is_mlo_peer_create_allowed(struct wlan_objmgr_vdev *vdev)
{
enum wlan_vdev_state state;
enum wlan_vdev_state substate;
bool acs_in_progress;
QDF_STATUS ret;
if (!vdev) {
mlme_err("vdev is null");
@@ -239,11 +242,20 @@ QDF_STATUS wlan_vdev_is_mlo_peer_create_allowed(struct wlan_objmgr_vdev *vdev)
state = wlan_vdev_mlme_get_state(vdev);
substate = wlan_vdev_mlme_get_substate(vdev);
if ((state == WLAN_VDEV_S_UP) ||
((state == WLAN_VDEV_S_SUSPEND) &&
(substate == WLAN_VDEV_SS_SUSPEND_CSA_RESTART)) ||
(state == WLAN_VDEV_S_DFS_CAC_WAIT))
return QDF_STATUS_SUCCESS;
acs_in_progress = false;
ret = mlme_ext_hdl_get_acs_in_progress(vdev, &acs_in_progress);
if (ret != QDF_STATUS_SUCCESS) {
mlme_err("Unable to get ACS in progress status");
return QDF_STATUS_E_FAILURE;
}
if (!acs_in_progress)
if ((state == WLAN_VDEV_S_UP) ||
((state == WLAN_VDEV_S_SUSPEND) &&
(substate == WLAN_VDEV_SS_SUSPEND_CSA_RESTART)) ||
(state == WLAN_VDEV_S_DFS_CAC_WAIT))
return QDF_STATUS_SUCCESS;
return QDF_STATUS_E_FAILURE;
}