Преглед на файлове

qcacld-3.0: Create STA self peer with MLD mac address

For station case, create self peer with MLD MAC address.

Change-Id: I53b545763f15df5650e8b4b3dc7ea6ffddc88228
CRs-Fixed: 2994409
Bapiraju Alla преди 3 години
родител
ревизия
aaff44964d
променени са 2 файла, в които са добавени 26 реда и са изтрити 4 реда
  1. 7 3
      core/sme/src/common/sme_api.c
  2. 19 1
      core/wma/src/wma_dev_if.c

+ 7 - 3
core/sme/src/common/sme_api.c

@@ -4692,7 +4692,7 @@ QDF_STATUS sme_vdev_delete(mac_handle_t mac_handle,
 {
 	QDF_STATUS status;
 	struct mac_context *mac = MAC_CONTEXT(mac_handle);
-	uint8_t vdev_id = wlan_vdev_get_id(vdev);
+	uint8_t *self_peer_macaddr, vdev_id = wlan_vdev_get_id(vdev);
 	struct scheduler_msg self_peer_delete_msg = {0};
 	struct del_vdev_params *del_self_peer;
 
@@ -4732,10 +4732,14 @@ QDF_STATUS sme_vdev_delete(mac_handle_t mac_handle,
 	if (!del_self_peer)
 		return QDF_STATUS_E_NOMEM;
 
+	self_peer_macaddr = wlan_vdev_mlme_get_mldaddr(vdev);
+	if (qdf_is_macaddr_zero((struct qdf_mac_addr *)self_peer_macaddr))
+		self_peer_macaddr = wlan_vdev_mlme_get_macaddr(vdev);
+
 	del_self_peer->vdev = vdev;
 	del_self_peer->vdev_id = wlan_vdev_get_id(vdev);
-	qdf_mem_copy(del_self_peer->self_mac_addr,
-		     wlan_vdev_mlme_get_macaddr(vdev), sizeof(tSirMacAddr));
+	qdf_mem_copy(del_self_peer->self_mac_addr, self_peer_macaddr,
+		     sizeof(tSirMacAddr));
 
 	self_peer_delete_msg.bodyptr = del_self_peer;
 	self_peer_delete_msg.callback = mlme_vdev_self_peer_delete;

+ 19 - 1
core/wma/src/wma_dev_if.c

@@ -2559,6 +2559,7 @@ QDF_STATUS wma_vdev_self_peer_create(struct vdev_mlme_obj *vdev_mlme)
 	QDF_STATUS status = QDF_STATUS_SUCCESS;
 	struct wlan_objmgr_vdev *vdev = vdev_mlme->vdev;
 	tp_wma_handle wma_handle;
+	uint8_t peer_vdev_id, *self_peer_macaddr;
 
 	wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
 	if (!wma_handle)
@@ -2574,9 +2575,26 @@ QDF_STATUS wma_vdev_self_peer_create(struct vdev_mlme_obj *vdev_mlme)
 		if (QDF_IS_STATUS_ERROR(status))
 			wma_err("Failed to create peer %d", status);
 	} else if (vdev_mlme->mgmt.generic.type == WMI_VDEV_TYPE_STA) {
+		if (!qdf_is_macaddr_zero(
+				(struct qdf_mac_addr *)vdev->vdev_mlme.mldaddr))
+			self_peer_macaddr = vdev->vdev_mlme.mldaddr;
+		else
+			self_peer_macaddr = vdev->vdev_mlme.macaddr;
+
+		/**
+		 * Self peer is used for the frames exchanged before
+		 * association. For ML STA, Self peer create will be triggered
+		 * for both the VDEVs, but one self peer is enough. So in case
+		 * of ML, use MLD address for the self peer and ignore self peer
+		 * creation for the partner link vdev.
+		 */
+		if (wma_objmgr_peer_exist(wma_handle, self_peer_macaddr,
+					  &peer_vdev_id))
+			return QDF_STATUS_SUCCESS;
+
 		obj_peer = wma_create_objmgr_peer(wma_handle,
 						  wlan_vdev_get_id(vdev),
-						  vdev->vdev_mlme.macaddr,
+						  self_peer_macaddr,
 						  WMI_PEER_TYPE_DEFAULT);
 		if (!obj_peer) {
 			wma_err("Failed to create obj mgr peer for self");