qcacmn: Don't allow SLO candidate for specified AP

When MLO STA connects to a specified buggy MLO AP with PMKID in assoc
req, it consistently fails and then retries with a downgraded SLO
candidate, which eventually succeeds. However, the customer expects MLMR
connection.

To address this, when select this buggy AP, we avoid generating
downgraded SLO/11AX candidates, use full SAE auth instead of existed PMKSA,
and don't add PMKID in RSNIEof assoc req when connect.

Change-Id: I8e446544b2fdbae089840713bc8bc93c601f1863
CRs-Fixed: 3888074
这个提交包含在:
Jianmin Zhu
2024-08-05 16:21:41 +08:00
提交者 Ravindra Konda
父节点 ee88dcad93
当前提交 256544b37b

查看文件

@@ -32,6 +32,7 @@
#ifdef CONN_MGR_ADV_FEATURE
#include "wlan_mlme_api.h"
#include "wlan_wfa_tgt_if_tx_api.h"
#include "wlan_action_oui_main.h"
#endif
#include "wlan_cm_main_api.h"
#include "wlan_cm_public_struct.h"
@@ -3057,6 +3058,25 @@ cm_add_11_ax_candidate(struct wlan_objmgr_pdev *pdev,
{};
#endif
static bool cm_is_slo_candidate_allowed(struct wlan_objmgr_psoc *psoc,
struct scan_cache_entry *scan_entry)
{
struct action_oui_search_attr attr = {0};
attr.ie_data = util_scan_entry_ie_data(scan_entry);
attr.ie_length = util_scan_entry_ie_len(scan_entry);
if (wlan_action_oui_search(psoc, &attr,
ACTION_OUI_RESTRICT_MAX_MLO_LINKS)) {
mlme_debug("IoT AP " QDF_MAC_ADDR_FMT
" slo candidate not allowed",
QDF_MAC_ADDR_REF(scan_entry->bssid.bytes));
return false;
}
return true;
}
/**
* cm_mlo_generate_candidate_list() - generate candidate list
* @pdev: pdev object
@@ -3096,6 +3116,14 @@ static void cm_mlo_generate_candidate_list(struct wlan_objmgr_pdev *pdev,
uint32_t num_link = 0;
uint32_t i = 0;
uint32_t j = 0;
struct wlan_objmgr_psoc *psoc;
bool is_slo_candidate_allowed = true;
psoc = wlan_pdev_get_psoc(pdev);
if (!psoc) {
mlme_err("psoc NULL");
return;
}
if (qdf_list_peek_front(candidate_list, &cur_node) !=
QDF_STATUS_SUCCESS) {
@@ -3110,6 +3138,11 @@ static void cm_mlo_generate_candidate_list(struct wlan_objmgr_pdev *pdev,
node);
num_link = scan_entry->entry->ml_info.num_links;
is_slo_candidate_allowed =
cm_is_slo_candidate_allowed(psoc, scan_entry->entry);
if (!is_slo_candidate_allowed)
goto next;
for (i = 0; i < num_link; i++) {
tmp_scan_entry = util_scan_copy_cache_entry(
scan_entry->entry);