Selaa lähdekoodia

qcacld-3.0: Check for objmgr peer entry in wma_remove_peer

Currently, NDP peer entry is cached in dph table when an NDP
indication is received. Existence of this entry in the table
is used to know if the NDP session is still valid and peer cleanup
happens based on that. It removes the entry from dph table once the
cleanup is done in WMA_DELETE_STA_RSP handler. Below are the two
cases to initiate cleanup on an NDP,
1. When NDP_END indication is received from firmware
2. When NDP confirm is received with a failure from firmware

There can be a scenario where these two events happen back to
back for the same peer. An event might attempt to remove peer with
wma_remove_peer while the other event has already removed and just
before deleting the entry from dph table.
So check for the existence of peer entry in objmgr in
wma_remove_peer before proceeding for the peer removal. Try to
remove peer only if it's present.

Change-Id: I473a4608939f1ad919d93e065b7deaa9ff2da5a7
CRs-Fixed: 2653662
Srinivas Dasari 5 vuotta sitten
vanhempi
sitoutus
2fb2579b4a
1 muutettua tiedostoa jossa 27 lisäystä ja 26 poistoa
  1. 27 26
      core/wma/src/wma_dev_if.c

+ 27 - 26
core/wma/src/wma_dev_if.c

@@ -1538,6 +1538,24 @@ QDF_STATUS wma_peer_unmap_conf_cb(uint8_t vdev_id,
 	return qdf_status;
 }
 
+static bool wma_objmgr_peer_exist(tp_wma_handle wma, uint8_t vdev_id,
+				  uint8_t *peer_addr, uint8_t *peer_vdev_id)
+{
+	struct wlan_objmgr_peer *peer;
+
+	peer = wlan_objmgr_get_peer_by_mac(wma->psoc, peer_addr,
+					   WLAN_LEGACY_WMA_ID);
+	if (!peer)
+		return false;
+
+	if (peer_vdev_id)
+		*peer_vdev_id = wlan_vdev_get_id(wlan_peer_get_vdev(peer));
+
+	wlan_objmgr_peer_release_ref(peer, WLAN_LEGACY_WMA_ID);
+
+	return true;
+}
+
 /**
  * wma_remove_peer() - remove peer information from host driver and fw
  * @wma: wma handle
@@ -1574,12 +1592,12 @@ QDF_STATUS wma_remove_peer(tp_wma_handle wma, uint8_t *mac_addr,
 		return QDF_STATUS_E_INVAL;
 	}
 
-	if (!cdp_find_peer_exist(soc, OL_TXRX_PDEV_ID, peer_addr)) {
-		WMA_LOGE("%s: PEER is NULL for peer_addr %pM", __func__, peer_addr);
-		QDF_BUG(0);
+	if (!wma_objmgr_peer_exist(wma, vdev_id, peer_addr, NULL)) {
+		wma_err("peer doesn't exist peer_addr %pM vdevid %d peer_count %d",
+			 peer_addr, vdev_id,
+			 wma->interfaces[vdev_id].peer_count);
 		return QDF_STATUS_E_INVAL;
 	}
-
 	peer_unmap_conf_support_enabled =
 				cdp_cfg_get_peer_unmap_conf_support(soc);
 
@@ -1699,27 +1717,6 @@ static int wma_get_obj_mgr_peer_type(tp_wma_handle wma, uint8_t vdev_id,
 
 }
 
-static bool wma_objmgr_peer_exist(tp_wma_handle wma, uint8_t vdev_id,
-				  uint8_t *peer_addr)
-{
-	struct wlan_objmgr_peer *peer;
-	uint8_t peer_vdev_id;
-
-	peer = wlan_objmgr_get_peer_by_mac(wma->psoc, peer_addr,
-					   WLAN_LEGACY_WMA_ID);
-	if (!peer)
-		return false;
-
-	peer_vdev_id = wlan_vdev_get_id(wlan_peer_get_vdev(peer));
-
-	wlan_objmgr_peer_release_ref(peer, WLAN_LEGACY_WMA_ID);
-
-	wma_info("Peer %pM already exist on vdev %d can't add it on vdev %d",
-		 peer_addr, peer_vdev_id, vdev_id);
-
-	return true;
-}
-
 /**
  * wma_create_objmgr_peer() - create objmgr peer information in host driver
  * @wma: wma handle
@@ -1739,13 +1736,17 @@ static struct wlan_objmgr_peer *wma_create_objmgr_peer(tp_wma_handle wma,
 	struct wlan_objmgr_peer *obj_peer = NULL;
 	struct wlan_objmgr_vdev *obj_vdev = NULL;
 	struct wlan_objmgr_psoc *psoc = wma->psoc;
+	uint8_t peer_vdev_id;
 
 	/*
 	 * Check if peer with same MAC exist on any Vdev, If so avoid
 	 * adding this peer.
 	 */
-	if (wma_objmgr_peer_exist(wma, vdev_id, peer_addr))
+	if (wma_objmgr_peer_exist(wma, vdev_id, peer_addr, &peer_vdev_id)) {
+		wma_info("Peer %pM already exist on vdev %d, current vdev %d",
+			  peer_addr, peer_vdev_id, vdev_id);
 		return NULL;
+	}
 
 	obj_peer_type = wma_get_obj_mgr_peer_type(wma, vdev_id, peer_addr,
 						  wma_peer_type);