qcacld-3.0: Allow/Disallow NDP creation in different concurrencies
Currently in case of STA+NDI+NDI concurrency, the below scenario can occur, 1) If NDI(NDP) + NDI(NDP) exists and sta tries to connect, then all NDPs on 1st NDI is tear down. 2) If STA+NDI(NDPs) exist and then another NDI tries to establish the NDP, then it is allowed in the current driver. Fix is to reject the 2nd NDI(NDP) if STA+NDI(NDPs) concurrency already exist. Change-Id: Iadf6c9e10b9cdd59ca7beaace578a52b5e5dbb0f CRs-Fixed: 2568552
This commit is contained in:

committed by
nshrivas

parent
8413026991
commit
4a32ec5220
@@ -347,6 +347,19 @@ QDF_STATUS ucfg_ndi_remove_entry_from_policy_mgr(struct wlan_objmgr_vdev *vdev);
|
||||
* Return: True if NAN discovery enable/disable is in progress, false otherwise
|
||||
*/
|
||||
bool ucfg_nan_is_enable_disable_in_progress(struct wlan_objmgr_psoc *psoc);
|
||||
|
||||
/**
|
||||
* ucfg_nan_is_sta_ndp_concurrency_allowed() - Indicates if NDP is allowed
|
||||
* @psoc: pointer to psoc object
|
||||
* @vdev: pointer to vdev object
|
||||
*
|
||||
* If STA+NDI(NDPs) exist and another NDI tries to establish
|
||||
* NDP, then reject the second NDI(NDP).
|
||||
*
|
||||
* Return: true if allowed, false otherwise
|
||||
*/
|
||||
bool ucfg_nan_is_sta_ndp_concurrency_allowed(struct wlan_objmgr_psoc *psoc,
|
||||
struct wlan_objmgr_vdev *vdev);
|
||||
#else /* WLAN_FEATURE_NAN */
|
||||
|
||||
static inline
|
||||
@@ -392,5 +405,11 @@ bool ucfg_nan_is_enable_disable_in_progress(struct wlan_objmgr_psoc *psoc)
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline
|
||||
bool ucfg_nan_is_sta_ndp_concurrency_allowed(struct wlan_objmgr_psoc *psoc,
|
||||
struct wlan_objmgr_vdev *vdev)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
#endif /* WLAN_FEATURE_NAN */
|
||||
#endif /* _NAN_UCFG_API_H_ */
|
||||
|
@@ -966,3 +966,69 @@ bool ucfg_nan_is_enable_disable_in_progress(struct wlan_objmgr_psoc *psoc)
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
#ifdef NDP_SAP_CONCURRENCY_ENABLE
|
||||
/**
|
||||
* is_sap_ndp_concurrency_allowed() - Is SAP+NDP allowed
|
||||
*
|
||||
* Return: True if the NDP_SAP_CONCURRENCY_ENABLE feature define
|
||||
* is enabled, false otherwise.
|
||||
*/
|
||||
static inline bool is_sap_ndp_concurrency_allowed(void)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
#else
|
||||
static inline bool is_sap_ndp_concurrency_allowed(void)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
bool ucfg_nan_is_sta_ndp_concurrency_allowed(struct wlan_objmgr_psoc *psoc,
|
||||
struct wlan_objmgr_vdev *vdev)
|
||||
{
|
||||
uint8_t vdev_id_list[MAX_NUMBER_OF_CONC_CONNECTIONS];
|
||||
uint32_t freq_list[MAX_NUMBER_OF_CONC_CONNECTIONS];
|
||||
uint32_t ndi_cnt, sta_cnt, id;
|
||||
|
||||
sta_cnt = policy_mgr_mode_specific_connection_count(psoc,
|
||||
PM_STA_MODE, NULL);
|
||||
/* Allow if STA is not in connected state */
|
||||
if (!sta_cnt)
|
||||
return true;
|
||||
|
||||
/* Reject if STA+STA is present */
|
||||
if (sta_cnt > 1) {
|
||||
nan_err("STA+STA+NDP concurrency is not allowed");
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* SAP+NDP concurrency is already validated in hdd_is_ndp_allowed().
|
||||
* If SAP+NDP concurrency is enabled, return true from here to avoid
|
||||
* failure.
|
||||
*/
|
||||
if (is_sap_ndp_concurrency_allowed())
|
||||
return true;
|
||||
|
||||
ndi_cnt = policy_mgr_get_mode_specific_conn_info(psoc,
|
||||
freq_list,
|
||||
vdev_id_list,
|
||||
PM_NDI_MODE);
|
||||
|
||||
/* Allow if no other NDP peers are present on the NDIs */
|
||||
if (!ndi_cnt)
|
||||
return true;
|
||||
|
||||
/*
|
||||
* Allow NDP creation if the current NDP request is on
|
||||
* the NDI which already has an NDP by checking the vdev id of
|
||||
* the NDIs
|
||||
*/
|
||||
for (id = 0; id < ndi_cnt; id++)
|
||||
if (wlan_vdev_get_id(vdev) == vdev_id_list[id])
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
Reference in New Issue
Block a user