Browse Source

qcacld-3.0: Fix wrong bssid and freq after mlo roaming

For mlo AP, bssid in wmi_roam_synch_event_fixed_param of
WMI_ROAM_SYNCH_EVENT is AP MLD addr, when use it as link addr,
failed to register peer and set peer as connected, so all Tx
are not allowed including EAPOL.
Fix it by getting AP link addr and frequency of each link from
setup_links_param array of WMI_ROAM_SYNCH_EVENT.

Copy link info from roam sync event to connect response before notify
os_if roam complete, os_if will send link info from connect response
to wpa_supplicant, supplicant will use it to add MLO Link KDE(s) into
EAPOL-Key 2/4.

Change-Id: I87833784a4e0b9240725223069c55fb0db3bc88f
CRs-Fixed: 3277878
Jianmin Zhu 2 years ago
parent
commit
2a7d4c1cee

+ 44 - 3
components/umac/mlme/connection_mgr/core/src/wlan_cm_roam_fw_sync.c

@@ -411,6 +411,42 @@ cm_fils_update_erp_seq_num(struct wlan_objmgr_vdev *vdev,
 {}
 #endif
 
+#ifdef WLAN_FEATURE_11BE_MLO
+static QDF_STATUS
+cm_fill_bssid_freq_info(uint8_t vdev_id,
+			struct roam_offload_synch_ind *roam_synch_data,
+			struct cm_vdev_join_rsp *rsp)
+{
+	uint8_t i;
+	struct ml_setup_link_param *ml_link;
+
+	for (i = 0; i < roam_synch_data->num_setup_links; i++) {
+		ml_link = &roam_synch_data->ml_link[i];
+		if (vdev_id == ml_link->vdev_id) {
+			qdf_copy_macaddr(&rsp->connect_rsp.bssid,
+					 &ml_link->link_addr);
+			rsp->connect_rsp.freq = ml_link->channel.mhz;
+
+			return QDF_STATUS_SUCCESS;
+		}
+	}
+	mlme_err("Failed to get vdev %u mlo link info");
+
+	return QDF_STATUS_E_FAILURE;
+}
+#else
+static QDF_STATUS
+cm_fill_bssid_freq_info(uint8_t vdev_id,
+			struct roam_offload_synch_ind *roam_synch_data,
+			struct cm_vdev_join_rsp *rsp)
+{
+	qdf_copy_macaddr(&rsp->connect_rsp.bssid, &roam_synch_data->bssid);
+	rsp->connect_rsp.freq = roam_synch_data->chan_freq;
+
+	return QDF_STATUS_SUCCESS;
+}
+#endif
+
 static QDF_STATUS
 cm_fill_roam_info(struct wlan_objmgr_vdev *vdev,
 		  struct roam_offload_synch_ind *roam_synch_data,
@@ -423,7 +459,13 @@ cm_fill_roam_info(struct wlan_objmgr_vdev *vdev,
 	if (!rsp->connect_rsp.roaming_info)
 			return QDF_STATUS_E_NOMEM;
 	rsp->connect_rsp.vdev_id = wlan_vdev_get_id(vdev);
-	qdf_copy_macaddr(&rsp->connect_rsp.bssid, &roam_synch_data->bssid);
+	status = cm_fill_bssid_freq_info(wlan_vdev_get_id(vdev),
+					 roam_synch_data, rsp);
+	if (QDF_IS_STATUS_ERROR(status)) {
+		mlme_err(CM_PREFIX_FMT "Failed to get bssid and freq",
+			 CM_PREFIX_REF(rsp->connect_rsp.vdev_id, cm_id));
+		return QDF_STATUS_E_FAILURE;
+	}
 
 	if (!util_scan_is_null_ssid(&roam_synch_data->ssid))
 		wlan_vdev_mlme_set_ssid(vdev,
@@ -442,7 +484,6 @@ cm_fill_roam_info(struct wlan_objmgr_vdev *vdev,
 	rsp->connect_rsp.is_reassoc = true;
 	rsp->connect_rsp.connect_status = QDF_STATUS_SUCCESS;
 	rsp->connect_rsp.cm_id = cm_id;
-	rsp->connect_rsp.freq = roam_synch_data->chan_freq;
 	rsp->nss = roam_synch_data->nss;
 
 	if (roam_synch_data->ric_data_len) {
@@ -843,6 +884,7 @@ cm_fw_roam_sync_propagation(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
 	if (wlan_vdev_mlme_is_mlo_vdev(vdev))
 		policy_mgr_move_vdev_from_disabled_to_connection_tbl(psoc,
 								     vdev_id);
+	mlo_roam_copy_partner_info(connect_rsp, roam_synch_data);
 	mlme_cm_osif_connect_complete(vdev, connect_rsp);
 
 	/**
@@ -867,7 +909,6 @@ cm_fw_roam_sync_propagation(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
 		}
 		wlan_cm_tgt_send_roam_sync_complete_cmd(psoc, vdev_id);
 
-		mlo_roam_copy_partner_info(connect_rsp, roam_synch_data);
 		mlo_roam_update_connected_links(vdev, connect_rsp);
 		mlo_set_single_link_ml_roaming(psoc, vdev_id,
 					       roam_synch_data, false);

+ 11 - 0
components/umac/mlme/mlo_mgr/src/wlan_mlo_mgr_roam.c

@@ -416,11 +416,22 @@ mlo_roam_copy_partner_info(struct wlan_cm_connect_resp *connect_rsp,
 	for (i = 0; i < sync_ind->num_setup_links; i++) {
 		partner_info->partner_link_info[i].link_id =
 			sync_ind->ml_link[i].link_id;
+	       partner_info->partner_link_info[i].vdev_id =
+			sync_ind->ml_link[i].vdev_id;
+
 		qdf_copy_macaddr(
 			&partner_info->partner_link_info[i].link_addr,
 			&sync_ind->ml_link[i].link_addr);
+		partner_info->partner_link_info[i].chan_freq =
+				sync_ind->ml_link[i].channel.mhz;
+		mlo_debug("vdev_id %d link_id %d freq %d bssid" QDF_MAC_ADDR_FMT,
+			  sync_ind->ml_link[i].vdev_id,
+			  sync_ind->ml_link[i].link_id,
+			  sync_ind->ml_link[i].channel.mhz,
+			  QDF_MAC_ADDR_REF(sync_ind->ml_link[i].link_addr.bytes));
 	}
 	partner_info->num_partner_links = sync_ind->num_setup_links;
+	mlo_debug("num_setup_links %d", sync_ind->num_setup_links);
 }
 
 void