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

qcacld-3.0: Fix race condition in peer attach and map

Fix a race condition where the HTT peer map event is received before
the peer object is allocated in the data path.

CRs-Fixed: 1089662
Change-Id: I3931e6dbae3ec3a68d446c245432549fa635a97e
Dhanashri Atre преди 8 години
родител
ревизия
272fd23190
променени са 2 файла, в които са добавени 24 реда и са изтрити 33 реда
  1. 4 2
      core/dp/txrx/ol_txrx.c
  2. 20 31
      core/wma/src/wma_dev_if.c

+ 4 - 2
core/dp/txrx/ol_txrx.c

@@ -5133,8 +5133,10 @@ static struct cdp_cmn_ops ol_ops_cmn = {
 	.txrx_pdev_attach_target = ol_txrx_pdev_attach_target,
 	.txrx_pdev_post_attach = ol_txrx_pdev_post_attach,
 	.txrx_pdev_detach = ol_txrx_pdev_detach,
-	.txrx_peer_attach = ol_txrx_peer_attach,
-	.txrx_peer_detach = ol_txrx_peer_detach,
+	.txrx_peer_create = ol_txrx_peer_attach,
+	.txrx_peer_setup = NULL,
+	.txrx_peer_teardown = NULL,
+	.txrx_peer_delete = ol_txrx_peer_detach,
 	.txrx_vdev_register = ol_txrx_vdev_register,
 	.txrx_soc_detach = ol_txrx_soc_detach,
 	.txrx_get_vdev_mac_addr = ol_txrx_get_vdev_mac_addr,

+ 20 - 31
core/wma/src/wma_dev_if.c

@@ -77,32 +77,6 @@
 #include "wma_nan_datapath.h"
 #include "wlan_tgt_def_config.h"
 
-#ifdef QCA_WIFI_QCA8074
-#define PEER_ATTACH_WIFI3(peer, soc, vdev, peer_addr)    \
-do {                                                       \
-	peer = cdp_peer_attach(soc, vdev, peer_addr);      \
-	if (!peer) {                                       \
-		WMA_LOGE("%s : Unable to attach peer %pM", \
-			__func__, peer_addr);              \
-		goto err;                                  \
-	}                                                  \
-} while (0)
-/* Do Nothing */
-#define PEER_ATTACH_LEGACY(peer, soc, vdev, peer_addr) {}
-#else
-/* Do Nothing */
-#define PEER_ATTACH_WIFI3(peer, soc, vdev, peer_addr) {}
-#define PEER_ATTACH_LEGACY(peer, soc, vdev, peer_addr)     \
-do {                                                       \
-	peer = cdp_peer_attach(soc, vdev, peer_addr);      \
-	if (!peer) {                                       \
-		WMA_LOGE("%s : Unable to attach peer %pM", \
-			__func__, peer_addr);              \
-		goto err;                                  \
-	}                                                  \
-} while (0)
-#endif /* CONFIG_LITHIUM */
-
 /**
  * wma_find_vdev_by_addr() - find vdev_id from mac address
  * @wma: wma handle
@@ -1111,7 +1085,7 @@ void wma_remove_peer(tp_wma_handle wma, uint8_t *bssid,
 		if (roam_synch_in_progress)
 			cdp_peer_detach_force_delete(soc, peer);
 		else
-			cdp_peer_detach(soc, peer);
+			cdp_peer_delete(soc, peer);
 	}
 	peer_mac_addr = cdp_peer_get_peer_mac_addr(soc, peer);
 	if (peer_mac_addr == NULL) {
@@ -1174,7 +1148,17 @@ QDF_STATUS wma_create_peer(tp_wma_handle wma, void *pdev, void *vdev,
 		goto err;
 	}
 
-	PEER_ATTACH_LEGACY(peer, soc, vdev, peer_addr);
+	/* The peer object should be created before sending the WMI peer
+	 * create command to firmware. This is to prevent a race condition
+	 * where the HTT peer map event is received before the peer object
+	 * is created in the data path
+	 */
+	peer = cdp_peer_create(soc, vdev, peer_addr);
+	if (!peer) {
+		WMA_LOGE("%s : Unable to attach peer %pM", __func__, peer_addr);
+		goto err;
+	}
+
 	if (roam_synch_in_progress) {
 		WMA_LOGE("%s: LFR3: Created peer %p with peer_addr %pM vdev_id %d,"
 			 "peer_count - %d",
@@ -1188,14 +1172,19 @@ QDF_STATUS wma_create_peer(tp_wma_handle wma, void *pdev, void *vdev,
 	if (wmi_unified_peer_create_send(wma->wmi_handle,
 					 &param) != QDF_STATUS_SUCCESS) {
 		WMA_LOGP("%s : Unable to create peer in Target", __func__);
-		cdp_peer_detach(soc, peer);
+		cdp_peer_delete(soc, peer);
 		goto err;
 	}
+
 	WMA_LOGE("%s: Created peer %p with peer_addr %pM vdev_id %d, peer_count - %d",
 		  __func__, peer, peer_addr, vdev_id,
 		  wma->interfaces[vdev_id].peer_count);
 
-	PEER_ATTACH_WIFI3(peer, soc, vdev, peer_addr);
+	cdp_peer_setup(soc, vdev, peer);
+
+	WMA_LOGE("%s: Initialized peer with peer_addr %pM vdev_id %d",
+		__func__, peer_addr, vdev_id);
+
 	mac_addr_raw = cdp_get_vdev_mac_addr(soc, vdev);
 	if (mac_addr_raw == NULL) {
 		WMA_LOGE("%s: peer mac addr is NULL", __func__);
@@ -4384,7 +4373,7 @@ void wma_delete_bss_ho_fail(tp_wma_handle wma, tpDeleteBssParams params)
 	}
 
 	if (peer)
-		cdp_peer_detach(soc, peer);
+		cdp_peer_delete(soc, peer);
 	iface->peer_count--;
 	WMA_LOGE("%s: Removed peer %p with peer_addr %pM vdevid %d peer_count %d",
 		 __func__, peer, params->bssid,  params->smesessionId,