Ver código fonte

qcacld-3.0: Reject partner link based on security check

For multi link connection there might be the case where
rsnxe of the AP is not present on the link vdev.
This causes the link vdev alone to downgrade to 11ax
mode and assoc vdev is in 11be dot11 mode.
So for vdev with ML peer, the dot11mode is 11ax,
which causes abnormal firmware behavior.

Reject the partner link that doesn’t pass the security
check and validate the next available partner link.
if none of the partner link passes the security check,
proceed connection with single link.

Change-Id: I07239f06e2fa166cb472e1f24d66b44929d58cbf
CRs-Fixed: 3583522
Aravind Kishore Sukla 1 ano atrás
pai
commit
30cac76709

+ 3 - 1
components/umac/mlme/connection_mgr/core/src/wlan_cm_vdev_api.h

@@ -756,13 +756,15 @@ cm_send_rso_stop(struct wlan_objmgr_vdev *vdev)
 #ifdef WLAN_FEATURE_11BE_MLO
 /**
  * cm_get_ml_partner_info() - Fill ML partner info from scan entry
+ * @pdev: PDEV object
  * @scan_entry: Scan entry
  * @partner_info: Partner info to be filled
  *
  * Return: QDF_STATUS
  */
 QDF_STATUS
-cm_get_ml_partner_info(struct scan_cache_entry *scan_entry,
+cm_get_ml_partner_info(struct wlan_objmgr_pdev *pdev,
+		       struct scan_cache_entry *scan_entry,
 		       struct mlo_partner_info *partner_info);
 #endif
 #endif /* __WLAN_CM_VDEV_API_H__ */

+ 28 - 4
components/umac/mlme/connection_mgr/core/src/wlan_cm_vdev_connect.c

@@ -1125,12 +1125,16 @@ QDF_STATUS cm_flush_join_req(struct scheduler_msg *msg)
 
 #ifdef WLAN_FEATURE_11BE_MLO
 QDF_STATUS
-cm_get_ml_partner_info(struct scan_cache_entry *scan_entry,
+cm_get_ml_partner_info(struct wlan_objmgr_pdev *pdev,
+		       struct scan_cache_entry *scan_entry,
 		       struct mlo_partner_info *partner_info)
 {
 	uint8_t i, j = 0;
 	uint8_t mlo_support_link_num;
 	struct wlan_objmgr_psoc *psoc;
+	struct scan_cache_entry *part_scan_entry = NULL;
+	bool is_security_allowed;
+	struct qdf_mac_addr *link_mac;
 
 	/* If ML IE is not present then return failure*/
 	if (!scan_entry->ie_list.multi_link_bv)
@@ -1140,9 +1144,9 @@ cm_get_ml_partner_info(struct scan_cache_entry *scan_entry,
 	if (!scan_entry->ml_info.num_links)
 		return QDF_STATUS_SUCCESS;
 
-	psoc = wlan_objmgr_get_psoc_by_id(0, WLAN_MLME_CM_ID);
+	psoc = wlan_pdev_get_psoc(pdev);
 	if (!psoc) {
-		mlme_debug("psoc is NULL");
+		mlme_err("psoc is NULL");
 		return QDF_STATUS_E_INVAL;
 	}
 
@@ -1167,6 +1171,27 @@ cm_get_ml_partner_info(struct scan_cache_entry *scan_entry,
 			break;
 
 		if (scan_entry->ml_info.link_info[i].is_valid_link) {
+			link_mac = &scan_entry->ml_info.link_info[i].link_addr;
+			part_scan_entry = wlan_scan_get_scan_entry_by_mac_freq(
+					pdev,
+					link_mac,
+					scan_entry->ml_info.link_info[i].freq);
+			if (!part_scan_entry) {
+				scm_debug("scan entry not found for link addr: "
+					  QDF_MAC_ADDR_FMT,
+					  QDF_MAC_ADDR_REF(link_mac->bytes));
+				continue;
+			}
+
+			is_security_allowed =
+				wlan_cm_is_eht_allowed_for_current_security(
+							part_scan_entry);
+			util_scan_free_cache_entry(part_scan_entry);
+			if (!is_security_allowed) {
+				mlme_debug("current security is not valid for partner link");
+				continue;
+			}
+
 			partner_info->partner_link_info[j].link_addr =
 				scan_entry->ml_info.link_info[i].link_addr;
 			partner_info->partner_link_info[j].link_id =
@@ -1182,7 +1207,6 @@ cm_get_ml_partner_info(struct scan_cache_entry *scan_entry,
 
 	partner_info->num_partner_links = j;
 	mlme_debug("sta and ap integrate link num: %d", j);
-	wlan_objmgr_psoc_release_ref(psoc, WLAN_MLME_CM_ID);
 
 	return QDF_STATUS_SUCCESS;
 }

+ 12 - 27
core/mac/src/pe/lim/lim_api.c

@@ -3963,18 +3963,11 @@ lim_check_scan_db_for_join_req_partner_info(struct pe_session *session_entry,
 		return QDF_STATUS_E_NULL_VALUE;
 	}
 
-	cache_entry = qdf_mem_malloc(sizeof(struct scan_cache_entry));
-
-	if (!cache_entry)
-		return QDF_STATUS_E_FAILURE;
-
 	partner_link = qdf_mem_malloc(sizeof(struct partner_link_info) *
 			(MLD_MAX_LINKS - 1));
 
-	if (!partner_link) {
-		status = QDF_STATUS_E_FAILURE;
-		goto free_cache_entry;
-	}
+	if (!partner_link)
+		return QDF_STATUS_E_FAILURE;
 
 	qdf_mem_copy(&qdf_bssid,
 		     &(lim_join_req->bssDescription.bssId),
@@ -3982,12 +3975,11 @@ lim_check_scan_db_for_join_req_partner_info(struct pe_session *session_entry,
 
 	join_req_freq = lim_join_req->bssDescription.chan_freq;
 
-	status = wlan_scan_get_scan_entry_by_mac_freq(pdev,
-						      &qdf_bssid,
-						      join_req_freq,
-						      cache_entry);
+	cache_entry = wlan_scan_get_scan_entry_by_mac_freq(pdev,
+							   &qdf_bssid,
+							   join_req_freq);
 
-	if (!QDF_IS_STATUS_SUCCESS(status)) {
+	if (!cache_entry) {
 		pe_err("failed to get partner link info by mac addr");
 		status = QDF_STATUS_E_FAILURE;
 		goto free_mem;
@@ -3996,6 +3988,8 @@ lim_check_scan_db_for_join_req_partner_info(struct pe_session *session_entry,
 	qdf_mem_copy(partner_link, cache_entry->ml_info.link_info,
 		     sizeof(struct partner_link_info) * (MLD_MAX_LINKS - 1));
 
+	util_scan_free_cache_entry(cache_entry);
+
 	partner_info = &lim_join_req->partner_info;
 
 	status = lim_compare_scan_entry_partner_info_with_join_req(
@@ -4009,8 +4003,6 @@ lim_check_scan_db_for_join_req_partner_info(struct pe_session *session_entry,
 
 free_mem:
 	qdf_mem_free(partner_link);
-free_cache_entry:
-	qdf_mem_free(cache_entry);
 	return status;
 }
 
@@ -4030,29 +4022,22 @@ QDF_STATUS lim_update_mlo_mgr_info(struct mac_context *mac_ctx,
 		return QDF_STATUS_E_NULL_VALUE;
 	}
 
-	cache_entry = qdf_mem_malloc(sizeof(struct scan_cache_entry));
+	cache_entry = wlan_scan_get_scan_entry_by_mac_freq(pdev, link_addr,
+							   freq);
 	if (!cache_entry)
 		return QDF_STATUS_E_FAILURE;
 
-	status = wlan_scan_get_scan_entry_by_mac_freq(pdev, link_addr, freq,
-						      cache_entry);
-
-	if (!QDF_IS_STATUS_SUCCESS(status)) {
-		status = QDF_STATUS_E_FAILURE;
-		goto free_cache_entry;
-	}
-
 	channel.ch_freq = cache_entry->channel.chan_freq;
 	channel.ch_ieee = wlan_reg_freq_to_chan(pdev, channel.ch_freq);
 	channel.ch_phymode = cache_entry->phy_mode;
 	channel.ch_cfreq1 = cache_entry->channel.cfreq0;
 	channel.ch_cfreq2 = cache_entry->channel.cfreq1;
 
+	util_scan_free_cache_entry(cache_entry);
+
 	mlo_mgr_update_ap_channel_info(vdev, link_id, (uint8_t *)link_addr,
 				       channel);
 
-free_cache_entry:
-	qdf_mem_free(cache_entry);
 	return status;
 }
 #else

+ 4 - 4
core/mac/src/pe/lim/lim_process_sme_req_messages.c

@@ -2107,13 +2107,13 @@ lim_get_bss_11be_mode_allowed(struct mac_context *mac_ctx,
 	if (!ie_struct->eht_cap.present)
 		return false;
 
-	scan_entry = scm_scan_get_entry_by_bssid(mac_ctx->pdev,
-						 (struct qdf_mac_addr *)
-						 bss_desc->bssId);
+	scan_entry = wlan_scan_get_entry_by_bssid(mac_ctx->pdev,
+						  (struct qdf_mac_addr *)
+						  bss_desc->bssId);
 
 	if (scan_entry) {
 		is_eht_allowed =
-			cm_is_eht_allowed_for_current_security(scan_entry);
+			wlan_cm_is_eht_allowed_for_current_security(scan_entry);
 		util_scan_free_cache_entry(scan_entry);
 		if (!is_eht_allowed)
 			return false;