qcacld-3.0: Cleanup link VDEV SM on roam HO failure
In case of legacy to multi-link MLO roaming, if roam sync event handling fails, then the pe_session is deleted for the link VDEV and the cleanup happens only for the assoc vdev. Since, the link vdev doesn't have proper session/vdev params, the cleanup fails in link VDEV. This leaves the link vdev in UP state, even after disconnection. Therefore, subsequent attempts to connect to an MLO-AP would fail since the partner link is never cleaned up and is in invalid state(UP). To fix this, propagate the HO-failure error through state machine and move the VDEV SM from UP->DOWN directly. Change-Id: I6480a1821ab4c8cf9af6cd96af0f7889307c3b18 CRs-Fixed: 3362995
This commit is contained in:

committed by
Madan Koyyalamudi

parent
6a8edba122
commit
c76288d024
@@ -78,7 +78,7 @@ QDF_STATUS cm_fw_roam_sync_req(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
|
||||
event_data_len, event);
|
||||
|
||||
if (QDF_IS_STATUS_ERROR(status)) {
|
||||
mlme_err("EV ROAM SYNC REQ not handled");
|
||||
mlme_err("Roam sync was not handled");
|
||||
cm_fw_roam_abort_req(psoc, vdev_id);
|
||||
cm_roam_stop_req(psoc, vdev_id, REASON_ROAM_SYNCH_FAILED,
|
||||
NULL, false);
|
||||
|
@@ -3294,7 +3294,7 @@ cm_roam_stop_req(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
|
||||
|
||||
if (wlan_vdev_mlme_get_is_mlo_link(psoc, vdev_id)) {
|
||||
mlme_debug("MLO ROAM: skip RSO cmd for link vdev %d", vdev_id);
|
||||
return QDF_STATUS_SUCCESS;
|
||||
goto rel_vdev_ref;
|
||||
}
|
||||
|
||||
rso_cfg = wlan_cm_get_rso_config(vdev);
|
||||
|
@@ -318,8 +318,9 @@ void mlo_roam_connect_complete(struct wlan_objmgr_psoc *psoc,
|
||||
*
|
||||
* Return: qdf status
|
||||
*/
|
||||
void mlo_cm_roam_sync_cb(struct wlan_objmgr_vdev *vdev,
|
||||
void *event, uint32_t event_data_len);
|
||||
QDF_STATUS
|
||||
mlo_cm_roam_sync_cb(struct wlan_objmgr_vdev *vdev,
|
||||
void *event, uint32_t event_data_len);
|
||||
#endif /* WLAN_FEATURE_11BE_MLO_ADV_FEATURE */
|
||||
|
||||
/**
|
||||
@@ -397,13 +398,15 @@ mlo_roam_get_link_id(uint8_t vdev_id,
|
||||
}
|
||||
|
||||
#ifdef WLAN_FEATURE_11BE_MLO_ADV_FEATURE
|
||||
void mlo_cm_roam_sync_cb(struct wlan_objmgr_vdev *vdev,
|
||||
void *event, uint32_t event_data_len);
|
||||
QDF_STATUS mlo_cm_roam_sync_cb(struct wlan_objmgr_vdev *vdev,
|
||||
void *event, uint32_t event_data_len);
|
||||
#else
|
||||
static inline void
|
||||
static inline QDF_STATUS
|
||||
mlo_cm_roam_sync_cb(struct wlan_objmgr_vdev *vdev,
|
||||
void *event, uint32_t event_data_len)
|
||||
{}
|
||||
{
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
#endif
|
||||
|
||||
static inline bool
|
||||
|
@@ -274,8 +274,8 @@ QDF_STATUS mlo_fw_roam_sync_req(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
|
||||
}
|
||||
|
||||
#ifdef WLAN_FEATURE_11BE_MLO_ADV_FEATURE
|
||||
void mlo_cm_roam_sync_cb(struct wlan_objmgr_vdev *vdev,
|
||||
void *event, uint32_t event_data_len)
|
||||
QDF_STATUS mlo_cm_roam_sync_cb(struct wlan_objmgr_vdev *vdev,
|
||||
void *event, uint32_t event_data_len)
|
||||
{
|
||||
QDF_STATUS status;
|
||||
struct roam_offload_synch_ind *sync_ind;
|
||||
@@ -303,7 +303,7 @@ void mlo_cm_roam_sync_cb(struct wlan_objmgr_vdev *vdev,
|
||||
* link vdev will be initialized after set key is complete.
|
||||
*/
|
||||
if (sync_ind->auth_status == ROAM_AUTH_STATUS_CONNECTED)
|
||||
return;
|
||||
return QDF_STATUS_SUCCESS;
|
||||
|
||||
for (i = 0; i < sync_ind->num_setup_links; i++) {
|
||||
if (vdev_id == sync_ind->ml_link[i].vdev_id)
|
||||
@@ -315,7 +315,7 @@ void mlo_cm_roam_sync_cb(struct wlan_objmgr_vdev *vdev,
|
||||
|
||||
if (!link_vdev) {
|
||||
mlo_err("Link vdev is null");
|
||||
return;
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
}
|
||||
|
||||
if (mlo_check_connect_req_bmap(link_vdev)) {
|
||||
@@ -330,12 +330,14 @@ void mlo_cm_roam_sync_cb(struct wlan_objmgr_vdev *vdev,
|
||||
sync_ind->ml_link[i].vdev_id);
|
||||
wlan_objmgr_vdev_release_ref(link_vdev,
|
||||
WLAN_MLME_SB_ID);
|
||||
return;
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
}
|
||||
}
|
||||
wlan_objmgr_vdev_release_ref(link_vdev,
|
||||
WLAN_MLME_SB_ID);
|
||||
}
|
||||
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
Reference in New Issue
Block a user