Эх сурвалжийг харах

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 7 сар өмнө
parent
commit
256544b37b

+ 33 - 0
umac/mlme/connection_mgr/core/src/wlan_cm_bss_scoring.c

@@ -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);