Browse Source

qcacld-3.0: Move objmgr create/delete from HDD->WMA

Currently the driver creates and deletes the objmgr peer
in HDD layer. According to the latest requirement, the CDP
peer create/delete needs the pointer of objmgr peer, which
thus has to created before CDP peer create, and deleted
after CDP peer delete, which is done in WMA layer.

Remove the objmgr peer create/delete from HDD, and move it
to the WMA layer.

Change-Id: I5bd62a83864e09a3728109e2deec2adf4bb899b5
CRs-Fixed: 2264892
gaurank kathpalia 6 năm trước cách đây
mục cha
commit
89d3c32488

+ 0 - 81
core/hdd/src/wlan_hdd_assoc.c

@@ -1383,13 +1383,6 @@ static void hdd_send_association_event(struct net_device *dev,
 		chan_info.reg_info_2 =
 			pCsrRoamInfo->chan_info.reg_info_2;
 
-		ret = hdd_objmgr_add_peer_object(adapter->hdd_vdev,
-						 adapter->device_mode,
-						 peerMacAddr.bytes,
-						 false);
-		if (ret)
-			hdd_err("Peer object "MAC_ADDRESS_STR" add fails!",
-					MAC_ADDR_ARRAY(peerMacAddr.bytes));
 		ret = hdd_objmgr_set_peer_mlme_state(adapter->hdd_vdev,
 						     WLAN_ASSOC_STATE);
 		if (ret)
@@ -1451,11 +1444,6 @@ static void hdd_send_association_event(struct net_device *dev,
 							adapter->session_id,
 							NULL,
 							adapter->device_mode);
-			ret = hdd_objmgr_remove_peer_object(adapter->hdd_vdev,
-							    peerMacAddr.bytes);
-			if (ret)
-				hdd_err("Peer obj "MAC_ADDRESS_STR" delete fails",
-					MAC_ADDR_ARRAY(peerMacAddr.bytes));
 		}
 
 		hdd_lpass_notify_disconnect(adapter);
@@ -1592,31 +1580,6 @@ static void hdd_clear_roam_profile_ie(struct hdd_adapter *adapter)
 	hdd_exit();
 }
 
-/**
- * hdd_wlan_get_ibss_mac_addr_from_staid() - Get IBSS MAC address
- * @adapter: Adapter upon which the IBSS client is active
- * @staIdx: Station index of the IBSS peer
- *
- * Return: a pointer to the MAC address of the IBSS peer if the peer is
- *	   found, otherwise %NULL.
- */
-static struct qdf_mac_addr *
-hdd_wlan_get_ibss_mac_addr_from_staid(struct hdd_adapter *adapter,
-				      uint8_t staIdx)
-{
-	uint8_t idx;
-	struct hdd_station_ctx *sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(adapter);
-
-	for (idx = 0; idx < MAX_PEERS; idx++) {
-		if (HDD_WLAN_INVALID_STA_ID !=
-				sta_ctx->conn_info.staId[idx] &&
-				staIdx == sta_ctx->conn_info.staId[idx]) {
-			return &sta_ctx->conn_info.peerMacAddress[idx];
-		}
-	}
-	return NULL;
-}
-
 /**
  * hdd_roam_deregister_sta() - deregister station
  * @adapter: pointer to adapter
@@ -1627,10 +1590,6 @@ hdd_wlan_get_ibss_mac_addr_from_staid(struct hdd_adapter *adapter,
 QDF_STATUS hdd_roam_deregister_sta(struct hdd_adapter *adapter, uint8_t staid)
 {
 	QDF_STATUS qdf_status;
-	struct hdd_station_ctx *sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(adapter);
-	int ret = 0;
-	struct qdf_mac_addr *peer_mac = NULL;
-	struct qdf_mac_addr broadcastMacAddr = QDF_MAC_ADDR_BCAST_INIT;
 
 	qdf_status = cdp_clear_peer(cds_get_context(QDF_MODULE_ID_SOC),
 			(struct cdp_pdev *)cds_get_context(QDF_MODULE_ID_TXRX),
@@ -1640,30 +1599,6 @@ QDF_STATUS hdd_roam_deregister_sta(struct hdd_adapter *adapter, uint8_t staid)
 			staid, qdf_status, qdf_status);
 	}
 
-	if (adapter->device_mode == QDF_STA_MODE) {
-		peer_mac = &sta_ctx->conn_info.bssId;
-	} else if (adapter->device_mode == QDF_IBSS_MODE ||
-		adapter->device_mode == QDF_NDI_MODE) {
-		if (sta_ctx->broadcast_staid == staid)
-			peer_mac = &broadcastMacAddr;
-		else
-			peer_mac =
-			  hdd_wlan_get_ibss_mac_addr_from_staid(adapter, staid);
-	}
-
-	if (!peer_mac) {
-		hdd_err("Coudnt find peer MAC for staid %d, delete fails",
-			staid);
-		return QDF_STATUS_E_FAILURE;
-	}
-
-	hdd_debug("peer_mac_addr: "MAC_ADDRESS_STR,
-		  MAC_ADDR_ARRAY(peer_mac->bytes));
-	ret = hdd_objmgr_remove_peer_object(adapter->hdd_vdev, peer_mac->bytes);
-	if (ret) {
-		hdd_err("Peer obj %pM delete fails", peer_mac);
-		return QDF_STATUS_E_FAILURE;
-	}
 	return qdf_status;
 }
 
@@ -3480,7 +3415,6 @@ static void hdd_roam_ibss_indication_handler(struct hdd_adapter *adapter,
 		struct hdd_station_ctx *hdd_sta_ctx =
 			WLAN_HDD_GET_STATION_CTX_PTR(adapter);
 		struct qdf_mac_addr broadcastMacAddr = QDF_MAC_ADDR_BCAST_INIT;
-		int ret;
 
 		if (NULL == roam_info) {
 			QDF_ASSERT(0);
@@ -3509,13 +3443,6 @@ static void hdd_roam_ibss_indication_handler(struct hdd_adapter *adapter,
 				      roam_info->staId,
 				      &broadcastMacAddr,
 				      roam_info->pBssDesc);
-		ret = hdd_objmgr_add_peer_object(adapter->hdd_vdev,
-						 QDF_IBSS_MODE,
-						 broadcastMacAddr.bytes,
-						 false);
-		if (ret)
-			hdd_err("Peer object "MAC_ADDRESS_STR" add fails!",
-				MAC_ADDR_ARRAY(roam_info->peerMac.bytes));
 
 		if (roam_info->pBssDesc) {
 			struct cfg80211_bss *bss;
@@ -3812,7 +3739,6 @@ roam_roam_connect_status_update_handler(struct hdd_adapter *adapter,
 {
 	struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
 	QDF_STATUS qdf_status;
-	int ret;
 
 	switch (roamResult) {
 	case eCSR_ROAM_RESULT_IBSS_NEW_PEER:
@@ -3855,13 +3781,6 @@ roam_roam_connect_status_update_handler(struct hdd_adapter *adapter,
 			hdd_err("Cannot register STA with TL for IBSS. qdf_status: %d [%08X]",
 				qdf_status, qdf_status);
 		}
-		ret = hdd_objmgr_add_peer_object(adapter->hdd_vdev,
-						 QDF_IBSS_MODE,
-						 roam_info->peerMac.bytes,
-						 false);
-		if (ret)
-			hdd_err("Peer object "MAC_ADDRESS_STR" add fails!",
-				MAC_ADDR_ARRAY(roam_info->peerMac.bytes));
 		sta_ctx->ibss_sta_generation++;
 		stainfo = qdf_mem_malloc(sizeof(*stainfo));
 		if (stainfo == NULL) {

+ 0 - 10
core/hdd/src/wlan_hdd_hostapd.c

@@ -2164,16 +2164,6 @@ QDF_STATUS hdd_hostapd_sap_event_cb(tpSap_Event pSapEvent,
 				adapter->device_mode);
 		}
 
-		ret = hdd_objmgr_add_peer_object(
-			adapter->hdd_vdev,
-			adapter->device_mode,
-			event->staMac.bytes,
-			(adapter->sta_info[event->staId].sta_type
-							== eSTA_TYPE_P2P_CLI));
-		if (ret)
-			hdd_err("Peer object "MAC_ADDRESS_STR" add fails!",
-					MAC_ADDR_ARRAY(event->staMac.bytes));
-
 		hdd_green_ap_add_sta(hdd_ctx);
 		break;
 

+ 0 - 2
core/hdd/src/wlan_hdd_main.c

@@ -5377,8 +5377,6 @@ QDF_STATUS hdd_reset_all_adapters(struct hdd_context *hdd_ctx)
 			qdf_copy_macaddr(&peerMacAddr,
 					 &sta_ctx->conn_info.bssId);
 
-			hdd_objmgr_remove_peer_object(adapter->hdd_vdev,
-						      peerMacAddr.bytes);
 		} else if (adapter->device_mode == QDF_P2P_GO_MODE) {
 			clear_bit(SOFTAP_BSS_STARTED, &adapter->event_flags);
 			for (sta_id = 0; sta_id < WLAN_MAX_STA_COUNT; sta_id++) {

+ 0 - 9
core/hdd/src/wlan_hdd_nan_datapath.c

@@ -645,11 +645,6 @@ void hdd_ndi_drv_ndi_create_rsp_handler(uint8_t vdev_id,
 	hdd_roam_register_sta(adapter, &roam_info,
 				sta_ctx->broadcast_staid,
 				&bc_mac_addr, &tmp_bss_descp);
-	if (hdd_objmgr_add_peer_object(adapter->hdd_vdev,
-				 QDF_NDI_MODE, bc_mac_addr.bytes, false))
-		hdd_err("Peer object "MAC_ADDRESS_STR" add fails!",
-			MAC_ADDR_ARRAY(bc_mac_addr.bytes));
-
 	hdd_ctx->sta_to_adapter[sta_ctx->broadcast_staid] = adapter;
 }
 
@@ -768,10 +763,6 @@ int hdd_ndp_new_peer_handler(uint8_t vdev_id, uint16_t sta_id,
 	/* this function is called for each new peer */
 	hdd_roam_register_sta(adapter, &roam_info, sta_id,
 				peer_mac_addr, &tmp_bss_descp);
-	if (hdd_objmgr_add_peer_object(adapter->hdd_vdev,
-			 QDF_NDI_MODE, peer_mac_addr->bytes, false))
-		hdd_err("Peer object "MAC_ADDRESS_STR" add fails!",
-			MAC_ADDR_ARRAY(peer_mac_addr->bytes));
 	hdd_ctx->sta_to_adapter[sta_id] = adapter;
 	/* perform following steps for first new peer ind */
 	if (fist_peer) {

+ 0 - 109
core/hdd/src/wlan_hdd_object_manager.c

@@ -224,7 +224,6 @@ int hdd_objmgr_create_and_store_vdev(struct wlan_objmgr_pdev *pdev,
 	QDF_STATUS status;
 	int errno;
 	struct wlan_objmgr_vdev *vdev;
-	struct wlan_objmgr_peer *peer;
 	struct vdev_osif_priv *osif_priv;
 	struct wlan_vdev_create_params vdev_params = {0};
 
@@ -266,23 +265,11 @@ int hdd_objmgr_create_and_store_vdev(struct wlan_objmgr_pdev *pdev,
 		goto vdev_destroy;
 	}
 
-	peer = wlan_objmgr_peer_obj_create(vdev, WLAN_PEER_SELF,
-					   vdev_params.macaddr);
-	if (!peer) {
-		hdd_err("Failed to create self peer for adapter mode %d",
-			adapter->device_mode);
-		errno = -ENOMEM;
-		goto vdev_put_ref;
-	}
-
 	adapter->hdd_vdev = vdev;
 	adapter->session_id = wlan_vdev_get_id(vdev);
 
 	return 0;
 
-vdev_put_ref:
-	wlan_objmgr_vdev_release_ref(vdev, WLAN_HDD_ID_OBJ_MGR);
-
 vdev_destroy:
 	wlan_objmgr_vdev_obj_delete(vdev);
 
@@ -297,7 +284,6 @@ int hdd_objmgr_release_and_destroy_vdev(struct hdd_adapter *adapter)
 	QDF_STATUS status;
 	struct wlan_objmgr_vdev *vdev = adapter->hdd_vdev;
 	struct vdev_osif_priv *osif_priv;
-	uint8_t *self_mac_addr;
 
 	adapter->hdd_vdev = NULL;
 	adapter->session_id = HDD_SESSION_ID_INVALID;
@@ -315,107 +301,12 @@ int hdd_objmgr_release_and_destroy_vdev(struct hdd_adapter *adapter)
 		qdf_mem_free(osif_priv);
 	}
 
-	self_mac_addr = wlan_vdev_mlme_get_macaddr(vdev);
-	if (hdd_objmgr_remove_peer_object(vdev, self_mac_addr))
-		hdd_err("Self peer delete failed");
-
 	status = wlan_objmgr_vdev_obj_delete(vdev);
 	wlan_objmgr_vdev_release_ref(vdev, WLAN_HDD_ID_OBJ_MGR);
 
 	return qdf_status_to_os_return(status);
 }
 
-int hdd_objmgr_add_peer_object(struct wlan_objmgr_vdev *vdev,
-			       enum QDF_OPMODE adapter_mode,
-			       uint8_t *mac_addr,
-			       bool is_p2p_type)
-{
-	enum wlan_peer_type peer_type;
-	struct wlan_objmgr_peer *peer;
-
-	if ((adapter_mode == QDF_STA_MODE) ||
-		(adapter_mode == QDF_P2P_CLIENT_MODE)) {
-		peer_type = WLAN_PEER_AP;
-	} else if ((adapter_mode == QDF_SAP_MODE) ||
-		(adapter_mode == QDF_P2P_GO_MODE)) {
-		if (is_p2p_type) {
-			peer_type = WLAN_PEER_P2P_CLI;
-		} else {
-			peer_type = WLAN_PEER_STA;
-		}
-	} else if (adapter_mode == QDF_IBSS_MODE) {
-		peer_type = WLAN_PEER_IBSS;
-	} else if (adapter_mode == QDF_NDI_MODE) {
-		peer_type = WLAN_PEER_NDP;
-	} else {
-		hdd_err("Unsupported device mode %d", adapter_mode);
-		return -EINVAL;
-	}
-
-	if (!vdev) {
-		hdd_err("vdev NULL");
-		QDF_ASSERT(0);
-		return -EFAULT;
-	}
-
-	peer = wlan_objmgr_peer_obj_create(vdev, peer_type, mac_addr);
-	if (!peer)
-		return -ENOMEM;
-
-	hdd_debug("Peer object "MAC_ADDRESS_STR" add success! Type: %d",
-		 MAC_ADDR_ARRAY(mac_addr), peer_type);
-
-	return 0;
-}
-
-int hdd_objmgr_remove_peer_object(struct wlan_objmgr_vdev *vdev,
-				  uint8_t *mac_addr)
-{
-	struct wlan_objmgr_psoc *psoc;
-	struct wlan_objmgr_pdev *pdev;
-	struct wlan_objmgr_peer *peer;
-	uint8_t pdev_id;
-
-	if (!vdev) {
-		hdd_err("vdev NULL");
-		QDF_ASSERT(0);
-		return -EINVAL;
-	}
-
-	psoc = wlan_vdev_get_psoc(vdev);
-	if (!psoc) {
-		hdd_err("Psoc NUll");
-		QDF_ASSERT(0);
-		return -EINVAL;
-	}
-
-	pdev = wlan_vdev_get_pdev(vdev);
-	if (!pdev) {
-		hdd_err("pdev NULL");
-		QDF_ASSERT(0);
-		return -EINVAL;
-	}
-
-	pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev);
-	peer = wlan_objmgr_get_peer(psoc, pdev_id, mac_addr,
-				    WLAN_HDD_ID_OBJ_MGR);
-	if (peer) {
-		wlan_objmgr_peer_obj_delete(peer);
-
-		/* Unref to decrement ref happened in find_peer */
-		wlan_objmgr_peer_release_ref(peer, WLAN_HDD_ID_OBJ_MGR);
-
-		hdd_info("Peer obj "MAC_ADDRESS_STR" deleted",
-				MAC_ADDR_ARRAY(mac_addr));
-		return 0;
-	}
-
-	hdd_err("Peer obj "MAC_ADDRESS_STR" not found",
-				MAC_ADDR_ARRAY(mac_addr));
-
-	return -EINVAL;
-}
-
 int hdd_objmgr_set_peer_mlme_auth_state(struct wlan_objmgr_vdev *vdev,
 					bool is_authenticated)
 {

+ 0 - 30
core/hdd/src/wlan_hdd_object_manager.h

@@ -132,36 +132,6 @@ int hdd_objmgr_create_and_store_vdev(struct wlan_objmgr_pdev *pdev,
  */
 int hdd_objmgr_release_and_destroy_vdev(struct hdd_adapter *adapter);
 
-/**
- * hdd_objmgr_add_peer_object() - Create and add the peer to the vdev
- * @vdev: vdev pointer
- * @adapter_mode: adapter mode
- * @mac_addr: Peer mac address
- * @is_p2p_type: TRUE if peer is p2p type
- *
- * This API creates and adds the peer object to the given @vdev. The peer type
- * (STA, AP, P2P or IBSS) is assigned based on adapter mode. For example, if
- * adapter mode is STA, peer is AP.
- *
- * Return: 0 for success, negative error code for failure
- */
-int hdd_objmgr_add_peer_object(struct wlan_objmgr_vdev *vdev,
-			       enum QDF_OPMODE adapter_mode,
-			       uint8_t *mac_addr,
-			       bool is_p2p_type);
-
-/**
- * hdd_objmgr_remove_peer_object() - Delete and remove the peer from vdev
- * @vdev: vdev pointer
- * @mac_addr: Peer Mac address
- *
- * This API finds the peer object from given @mac_addr and deletes the same.
- *
- * Return: 0 for success, negative error code for failure
- */
-int hdd_objmgr_remove_peer_object(struct wlan_objmgr_vdev *vdev,
-				  uint8_t *mac_addr);
-
 /**
  * hdd_objmgr_set_peer_mlme_auth_state() - set the peer mlme auth state
  * @vdev: vdev pointer

+ 0 - 8
core/hdd/src/wlan_hdd_softap_tx_rx.c

@@ -949,7 +949,6 @@ QDF_STATUS hdd_softap_deregister_sta(struct hdd_adapter *adapter,
 {
 	QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
 	struct hdd_context *hdd_ctx;
-	int ret;
 
 	if (NULL == adapter) {
 		hdd_err("NULL adapter");
@@ -974,13 +973,6 @@ QDF_STATUS hdd_softap_deregister_sta(struct hdd_adapter *adapter,
 			staId, qdf_status, qdf_status);
 	}
 
-	ret = hdd_objmgr_remove_peer_object(adapter->hdd_vdev,
-					    adapter->sta_info[staId].
-						sta_mac.bytes);
-	if (ret)
-		hdd_err("Peer obj %pM delete fails",
-			adapter->sta_info[staId].sta_mac.bytes);
-
 	if (adapter->sta_info[staId].in_use) {
 		if (ucfg_ipa_is_enabled()) {
 			if (ucfg_ipa_wlan_evt(hdd_ctx->hdd_pdev, adapter->dev,

+ 155 - 5
core/wma/src/wma_dev_if.c

@@ -1383,7 +1383,53 @@ QDF_STATUS wma_set_peer_param(void *wma_ctx, uint8_t *peer_addr,
 
 	return err;
 }
+/**
+ * wma_remove_objmgr_peer() - remove objmgr peer information from host driver
+ * @wma: wma handle
+ * @vdev_id: vdev id
+ * @peer: peer mac address
+ *
+ * Return: none
+ */
+
+static void wma_remove_objmgr_peer(tp_wma_handle wma, uint8_t vdev_id,
+					    uint8_t *peer_addr)
+{
+
+	struct wlan_objmgr_psoc *psoc = NULL;
+	struct wlan_objmgr_peer *obj_peer = NULL;
+	struct wlan_objmgr_vdev *obj_vdev = NULL;
+	struct wlan_objmgr_pdev *obj_pdev = NULL;
+	uint8_t pdev_id = 0;
+
+	psoc = wma->psoc;
+	if (!psoc) {
+		WMA_LOGE("%s:PSOC is NULL", __func__);
+		return;
+	}
+
+	obj_vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
+				    WLAN_LEGACY_WMA_ID);
+	if (!obj_vdev) {
+		WMA_LOGE("Obj vdev not found. Unable to remove peer");
+		return;
+	}
+	obj_pdev = wlan_vdev_get_pdev(obj_vdev);
+	pdev_id = wlan_objmgr_pdev_get_pdev_id(obj_pdev);
+	obj_peer = wlan_objmgr_get_peer(psoc, pdev_id, peer_addr,
+				    WLAN_LEGACY_WMA_ID);
+	if (obj_peer) {
+		wlan_objmgr_peer_obj_delete(obj_peer);
+		/* Unref to decrement ref happened in find_peer */
+		wlan_objmgr_peer_release_ref(obj_peer, WLAN_LEGACY_WMA_ID);
+		WMA_LOGD("Peer %pM deleted", peer_addr);
+	} else {
+		WMA_LOGE("Peer %pM not found", peer_addr);
+	}
+
+	wlan_objmgr_vdev_release_ref(obj_vdev, WLAN_LEGACY_WMA_ID);
 
+}
 /**
  * wma_remove_peer() - remove peer information from host driver and fw
  * @wma: wma handle
@@ -1401,6 +1447,7 @@ void wma_remove_peer(tp_wma_handle wma, uint8_t *bssid,
 #define PEER_ALL_TID_BITMASK 0xffffffff
 	uint32_t peer_tid_bitmap = PEER_ALL_TID_BITMASK;
 	uint8_t *peer_addr = bssid;
+	uint8_t peer_mac[QDF_MAC_ADDR_SIZE] = {0};
 	struct peer_flush_params param = {0};
 	uint8_t *peer_mac_addr;
 	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
@@ -1475,13 +1522,17 @@ void wma_remove_peer(tp_wma_handle wma, uint8_t *bssid,
 peer_detach:
 	vdev = cdp_get_vdev_from_vdev_id(soc, pdev, vdev_id);
 	WMA_LOGD("%s: vdev %pK is detaching %pK with peer_addr %pM vdevid %d peer_count %d",
-		 __func__, vdev, peer, peer_mac_addr, vdev_id,
-		 wma->interfaces[vdev_id].peer_count);
+		__func__, vdev, peer, peer_mac_addr, vdev_id,
+		wma->interfaces[vdev_id].peer_count);
+	/* Copy peer mac to find and delete objmgr peer */
+	qdf_mem_copy(peer_mac, peer_mac_addr, QDF_MAC_ADDR_SIZE);
 	if (roam_synch_in_progress)
 		cdp_peer_detach_force_delete(soc, peer);
 	else
 		cdp_peer_delete(soc, peer, bitmap);
 
+	wma_remove_objmgr_peer(wma, vdev_id, peer_mac);
+
 	wma->interfaces[vdev_id].peer_count--;
 #undef PEER_ALL_TID_BITMASK
 }
@@ -1523,6 +1574,99 @@ static bool wma_find_duplicate_peer_on_other_vdev(tp_wma_handle wma,
 	return false;
 }
 
+/**
+ * wma_get_peer_type() - Determine the type of peer(eg. STA/AP) and return it
+ * @wma: wma handle
+ * @vdev_id: vdev id
+ * @peer: peer mac address
+ *
+ * Return: Peer type
+ */
+
+static int wma_get_peer_type(tp_wma_handle wma, uint8_t vdev_id,
+				    uint8_t *peer_addr)
+
+{
+	uint32_t obj_peer_type = 0;
+
+	WMA_LOGD("vdev id %d vdev type %d vdev subtype %d peer addr %pM vdev addr %pM",
+		 vdev_id, wma->interfaces[vdev_id].type,
+		 wma->interfaces[vdev_id].sub_type, peer_addr,
+		 wma->interfaces[vdev_id].addr);
+
+	if (!qdf_mem_cmp(wma->interfaces[vdev_id].addr, peer_addr,
+					IEEE80211_ADDR_LEN)) {
+		obj_peer_type = WLAN_PEER_SELF;
+	} else if (wma->interfaces[vdev_id].type == WMI_VDEV_TYPE_STA) {
+		if (wma->interfaces[vdev_id].sub_type ==
+					WMI_UNIFIED_VDEV_SUBTYPE_P2P_CLIENT)
+			obj_peer_type = WLAN_PEER_P2P_GO;
+		else
+			obj_peer_type = WLAN_PEER_AP;
+	} else if (wma->interfaces[vdev_id].type == WMI_VDEV_TYPE_AP) {
+		if (wma->interfaces[vdev_id].sub_type ==
+				WMI_UNIFIED_VDEV_SUBTYPE_P2P_GO)
+			obj_peer_type = WLAN_PEER_P2P_CLI;
+		else
+			obj_peer_type = WLAN_PEER_STA;
+	} else if (wma->interfaces[vdev_id].type == WMI_VDEV_TYPE_IBSS) {
+		obj_peer_type = WLAN_PEER_IBSS;
+	} else if (wma->interfaces[vdev_id].type == WMI_VDEV_TYPE_NDI) {
+		obj_peer_type = WLAN_PEER_NDP;
+	} else {
+		WMA_LOGE("Couldnt find peertype for type %d and sub type %d",
+			 wma->interfaces[vdev_id].type,
+			 wma->interfaces[vdev_id].sub_type);
+	}
+
+	return obj_peer_type;
+
+}
+
+/**
+ * wma_create_objmgr_peer() - create objmgr peer information in host driver
+ * @wma: wma handle
+ * @vdev_id: vdev id
+ * @peer: peer mac address
+ *
+ * Return: objmgr peer pointer
+ */
+
+static struct wlan_objmgr_peer *wma_create_objmgr_peer(tp_wma_handle wma,
+					 uint8_t vdev_id, uint8_t *peer_addr)
+{
+	uint32_t obj_peer_type = 0;
+	struct wlan_objmgr_peer *obj_peer = NULL;
+	struct wlan_objmgr_vdev *obj_vdev = NULL;
+	struct wlan_objmgr_psoc *psoc = wma->psoc;
+
+	obj_peer_type = wma_get_peer_type(wma, vdev_id, peer_addr);
+	if (!obj_peer_type) {
+		WMA_LOGE("Invalid obj peer type. Unable to create peer %d",
+							obj_peer_type);
+		return NULL;
+	}
+
+	/* Create obj_mgr peer */
+	obj_vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
+						    WLAN_LEGACY_WMA_ID);
+
+	if (!obj_vdev) {
+		WMA_LOGE("Invalid obj vdev. Unable to create peer %d",
+							obj_peer_type);
+		return NULL;
+	}
+
+	obj_peer = wlan_objmgr_peer_obj_create(obj_vdev, obj_peer_type,
+						peer_addr);
+	wlan_objmgr_vdev_release_ref(obj_vdev, WLAN_LEGACY_WMA_ID);
+	if (obj_peer)
+		WMA_LOGD("Peer %pM added successfully! Type: %d", peer_addr,
+			 obj_peer_type);
+
+	return obj_peer;
+
+}
 /**
  * wma_create_peer() - send peer create command to fw
  * @wma: wma handle
@@ -1547,6 +1691,7 @@ QDF_STATUS wma_create_peer(tp_wma_handle wma, struct cdp_pdev *pdev,
 	void *dp_soc = cds_get_context(QDF_MODULE_ID_SOC);
 	struct wlan_objmgr_psoc *psoc = wma->psoc;
 	target_resource_config *wlan_res_cfg;
+	struct wlan_objmgr_peer *obj_peer = NULL;
 
 	if (!psoc) {
 		WMA_LOGE("%s: psoc is NULL", __func__);
@@ -1579,6 +1724,10 @@ QDF_STATUS wma_create_peer(tp_wma_handle wma, struct cdp_pdev *pdev,
 	   vdev_id, peer_addr))
 		goto err;
 
+	obj_peer = wma_create_objmgr_peer(wma, vdev_id, peer_addr);
+	if (!obj_peer)
+		goto err;
+
 	/* 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
@@ -1587,6 +1736,7 @@ QDF_STATUS wma_create_peer(tp_wma_handle wma, struct cdp_pdev *pdev,
 	peer = cdp_peer_create(dp_soc, vdev, peer_addr);
 	if (!peer) {
 		WMA_LOGE("%s : Unable to attach peer %pM", __func__, peer_addr);
+		wlan_objmgr_peer_obj_delete(obj_peer);
 		goto err;
 	}
 	WMA_LOGD("%s: vdev %pK is attaching peer:%pK peer_addr %pM to vdev_id %d, peer_count - %d",
@@ -1605,11 +1755,9 @@ QDF_STATUS wma_create_peer(tp_wma_handle wma, struct cdp_pdev *pdev,
 	if (wmi_unified_peer_create_send(wma->wmi_handle,
 					 &param) != QDF_STATUS_SUCCESS) {
 		WMA_LOGE("%s : Unable to create peer in Target", __func__);
-		WMA_LOGE("%s: vdev %pK is detaching peer:%pK peer_addr %pM to vdev_id %d, peer_count - %d",
-			 __func__, vdev, peer, peer_addr, vdev_id,
-			 wma->interfaces[vdev_id].peer_count);
 		cdp_peer_delete(dp_soc, peer,
 				1 << CDP_PEER_DO_NOT_START_UNMAP_TIMER);
+		wlan_objmgr_peer_obj_delete(obj_peer);
 		goto err;
 	} else {
 		qdf_atomic_inc(&wma->interfaces[vdev_id].fw_peer_count);
@@ -5526,6 +5674,8 @@ void wma_delete_bss_ho_fail(tp_wma_handle wma, tpDeleteBssParams params)
 			 __func__, txrx_vdev, peer, params->bssid,
 			 params->smesessionId, iface->peer_count);
 		cdp_peer_delete(soc, peer, 1 << CDP_PEER_DELETE_NO_SPECIAL);
+		wma_remove_objmgr_peer(wma, params->smesessionId,
+							params->bssid);
 	}
 	iface->peer_count--;
 	WMA_LOGI("%s: Removed peer %pK with peer_addr %pM vdevid %d peer_count %d",