qcacld-3.0: Consider connected AP for roaming candidate

If reassoc MAC from user space is broadcast MAC as:
"wpa_cli DRIVER FASTREASSOC ff:ff:ff:ff:ff:ff 0",
user space invoked roaming candidate selection will be based on firmware
score algorithm, current connection will be kept if current AP has highest
score. It is requirement from customer which can avoid ping-pong roaming.

Change-Id: I8de3e2a26a6f346c900157aa823205f849d233f7
CRs-Fixed: 3106276
This commit is contained in:
Jianmin Zhu
2022-01-13 18:35:45 +08:00
committed by Madan Koyyalamudi
parent 03832d28a5
commit cd9d714bbb
4 changed files with 39 additions and 7 deletions

View File

@@ -1039,9 +1039,17 @@ QDF_STATUS cm_fw_roam_invoke_fail(struct wlan_objmgr_psoc *psoc,
if (QDF_IS_STATUS_ERROR(status))
cm_remove_cmd(cm_ctx, &cm_id);
if (source == CM_ROAMING_HOST ||
source == CM_ROAMING_NUD_FAILURE)
/*
* If reassoc MAC from user space is broadcast MAC as:
* "wpa_cli DRIVER FASTREASSOC ff:ff:ff:ff:ff:ff 0",
* user space invoked roaming candidate selection will base on firmware
* score algorithm, current connection will be kept if current AP has
* highest score. It is requirement from customer which can avoid
* ping-pong roaming.
*/
if (qdf_is_macaddr_broadcast(&roam_req->req.bssid))
mlme_debug("Keep current connection");
else if (source == CM_ROAMING_HOST || source == CM_ROAMING_NUD_FAILURE)
status = mlo_disconnect(vdev, CM_ROAM_DISCONNECT,
REASON_USER_TRIGGERED_ROAM_FAILURE,
NULL);

View File

@@ -5074,8 +5074,7 @@ QDF_STATUS cm_start_roam_invoke(struct wlan_objmgr_psoc *psoc,
if (source == CM_ROAMING_FW)
goto send_evt;
if (qdf_is_macaddr_zero(bssid) ||
cm_req->roam_req.req.source == CM_ROAMING_NUD_FAILURE) {
if (qdf_is_macaddr_zero(bssid)) {
if (!wlan_mlme_is_data_stall_recovery_fw_supported(psoc)) {
mlme_debug("FW does not support data stall recovery, aborting roam invoke");
qdf_mem_free(cm_req);
@@ -5086,6 +5085,12 @@ QDF_STATUS cm_start_roam_invoke(struct wlan_objmgr_psoc *psoc,
goto send_evt;
}
if (qdf_is_macaddr_broadcast(bssid)) {
qdf_copy_macaddr(&cm_req->roam_req.req.bssid, bssid);
mlme_debug("Roam only if better candidate found else stick to current AP");
goto send_evt;
}
wlan_vdev_get_bss_peer_mac(vdev, &connected_bssid);
if (qdf_is_macaddr_equal(bssid, &connected_bssid)) {
mlme_debug("Reassoc BSSID is same as currently associated AP");
@@ -5399,6 +5404,11 @@ cm_send_roam_invoke_req(struct cnx_mgr *cm_ctx, struct cm_req *req)
goto send_cmd;
}
if (qdf_is_macaddr_broadcast(&roam_req->req.bssid)) {
qdf_copy_macaddr(&roam_invoke_req->target_bssid,
&roam_req->req.bssid);
goto send_cmd;
}
if (qdf_is_macaddr_equal(&roam_req->req.bssid, &connected_bssid))
roam_invoke_req->is_same_bssid = true;

View File

@@ -1028,6 +1028,14 @@ static QDF_STATUS send_roam_invoke_cmd_tlv(wmi_unified_t wmi_handle,
cmd->flags |=
(1 << WMI_ROAM_INVOKE_FLAG_FULL_SCAN_IF_NO_CANDIDATE);
cmd->reason = ROAM_INVOKE_REASON_NUD_FAILURE;
} else if (qdf_is_macaddr_broadcast(&roaminvoke->target_bssid)) {
cmd->num_chan = 0;
cmd->num_bssid = 0;
cmd->roam_scan_mode = WMI_ROAM_INVOKE_SCAN_MODE_CACHE_MAP;
cmd->flags |=
(1 << WMI_ROAM_INVOKE_FLAG_FULL_SCAN_IF_NO_CANDIDATE) |
(1 << WMI_ROAM_INVOKE_FLAG_SELECT_CANDIDATE_CONSIDER_SCORE);
cmd->reason = ROAM_INVOKE_REASON_USER_SPACE;
} else {
cmd->reason = ROAM_INVOKE_REASON_USER_SPACE;
}