Browse Source

qcacld-3.0: Use objmgr peer to check if peer already exist

Use obj manager peer to check if peer already exist, instead
of cdp API.

Change-Id: I87edd33f09b2b7927f99b87acf4202b2a7ac0236
CRs-Fixed: 2627494
gaurank kathpalia 5 years ago
parent
commit
c9f0a7e533

+ 2 - 2
core/mac/src/pe/lim/lim_process_mlm_host_roam.c

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016-2019 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2016-2020 The Linux Foundation. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -613,7 +613,7 @@ void lim_process_mlm_ft_reassoc_req(struct mac_context *mac,
 	else
 		val = mac->mlme_cfg->sap_cfg.listen_interval;
 
-	status = wma_add_bss_peer_sta(session->self_mac_addr, session->bssId,
+	status = wma_add_bss_peer_sta(session->vdev_id, session->bssId,
 				      false);
 
 	if (QDF_IS_STATUS_ERROR(status)) {

+ 1 - 1
core/mac/src/pe/lim/lim_process_mlm_req_messages.c

@@ -384,7 +384,7 @@ lim_process_mlm_post_join_suspend_link(struct mac_context *mac_ctx,
 	mac_ctx->lim.lim_timers.gLimJoinFailureTimer.sessionId =
 		session->peSessionId;
 
-	status = wma_add_bss_peer_sta(session->self_mac_addr, session->bssId,
+	status = wma_add_bss_peer_sta(session->vdev_id, session->bssId,
 				      false);
 	lim_post_join_set_link_state_callback(mac_ctx, session, status);
 

+ 2 - 2
core/wma/inc/wma.h

@@ -2457,13 +2457,13 @@ int wma_motion_det_base_line_host_event_handler(void *handle, u_int8_t *event,
 
 /**
  * wma_add_bss_peer_sta() - creat bss peer when sta connect
- * @self_mac: self mac address
+ * @vdev_id: vdev id
  * @bssid: AP bssid
  * @roam_sync: if roam sync is in progress
  *
  * Return: 0 on success, else error on failure
  */
-QDF_STATUS wma_add_bss_peer_sta(uint8_t *self_mac, uint8_t *bssid,
+QDF_STATUS wma_add_bss_peer_sta(uint8_t vdev_id, uint8_t *bssid,
 				bool roam_sync);
 
 /**

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

@@ -1688,6 +1688,27 @@ 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
@@ -1708,6 +1729,13 @@ static struct wlan_objmgr_peer *wma_create_objmgr_peer(tp_wma_handle wma,
 	struct wlan_objmgr_vdev *obj_vdev = NULL;
 	struct wlan_objmgr_psoc *psoc = wma->psoc;
 
+	/*
+	 * 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))
+		return NULL;
+
 	obj_peer_type = wma_get_obj_mgr_peer_type(wma, vdev_id, peer_addr,
 						  wma_peer_type);
 	if (!obj_peer_type) {
@@ -1733,6 +1761,7 @@ static struct wlan_objmgr_peer *wma_create_objmgr_peer(tp_wma_handle wma,
 	return obj_peer;
 
 }
+
 /**
  * wma_create_peer() - send peer create command to fw
  * @wma: wma handle
@@ -1785,14 +1814,6 @@ QDF_STATUS wma_create_peer(tp_wma_handle wma,
 		goto err;
 	}
 
-	/*
-	 * Check if peer with same MAC exist on other Vdev, If so avoid
-	 * adding this peer, as it will cause FW to crash.
-	 */
-	if (cdp_find_peer_exist_on_other_vdev(dp_soc, vdev_id, peer_addr,
-					      wma->max_bssid))
-		goto err;
-
 	obj_peer = wma_create_objmgr_peer(wma, vdev_id, peer_addr, peer_type);
 	if (!obj_peer)
 		goto err;
@@ -5063,10 +5084,9 @@ QDF_STATUS wma_set_wlm_latency_level(void *wma_ptr,
 	return ret;
 }
 
-QDF_STATUS wma_add_bss_peer_sta(uint8_t *self_mac, uint8_t *bssid,
+QDF_STATUS wma_add_bss_peer_sta(uint8_t vdev_id, uint8_t *bssid,
 				bool roam_synch)
 {
-	uint8_t vdev_id;
 	tp_wma_handle wma;
 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
 
@@ -5075,10 +5095,7 @@ QDF_STATUS wma_add_bss_peer_sta(uint8_t *self_mac, uint8_t *bssid,
 		WMA_LOGE("Invalid wma");
 		goto err;
 	}
-	if (wma_find_vdev_id_by_addr(wma, self_mac, &vdev_id)) {
-		WMA_LOGE("vdev not found for addr: %pM", self_mac);
-		goto err;
-	}
+
 	status = wma_create_peer(wma, bssid, WMI_PEER_TYPE_DEFAULT,
 				 vdev_id, roam_synch);
 err:

+ 1 - 2
core/wma/src/wma_scan_roam.c

@@ -2722,8 +2722,7 @@ wma_roam_update_vdev(tp_wma_handle wma,
 
 	wma_delete_sta(wma, del_sta_params);
 	wma_delete_bss(wma, vdev_id);
-	wma_add_bss_peer_sta(roam_synch_ind_ptr->self_mac.bytes,
-			     roam_synch_ind_ptr->bssid.bytes, true);
+	wma_add_bss_peer_sta(vdev_id, roam_synch_ind_ptr->bssid.bytes, true);
 	/* Update new peer's uc cipher */
 	wma_update_roamed_peer_unicast_cipher(wma, uc_cipher, cipher_cap,
 					      roam_synch_ind_ptr->bssid.bytes);