Browse Source

qcacmn: Add new obj manager API

Add API to return node in logically deleted state

Change-Id: I7a922c9378533c1aff59aa89af039946a8ddbdd7
CRs-Fixed: 2007625
Soumya Bhat 8 years ago
parent
commit
c430e1081f

+ 16 - 0
umac/cmn_services/obj_mgr/inc/wlan_objmgr_psoc_obj.h

@@ -422,6 +422,22 @@ struct wlan_objmgr_peer *wlan_objmgr_get_peer(
 			struct wlan_objmgr_psoc *psoc, uint8_t *macaddr,
 			wlan_objmgr_ref_dbgid dbg_id);
 
+/**
+ * wlan_objmgr_get_peer_logically_deleted() - find peer
+ * from psoc's peer list
+ * @psoc: PSOC object
+ * @macaddr: MAC address
+ * @dbg_id: id of the caller
+ *
+ * API to find peer object pointer of logically deleted peer
+ *
+ * Return: peer pointer
+ *         NULL on FAILURE
+ */
+struct wlan_objmgr_peer *wlan_objmgr_get_peer_logically_deleted(
+			struct wlan_objmgr_psoc *psoc, uint8_t *macaddr,
+			wlan_objmgr_ref_dbgid dbg_id);
+
 /**
  * wlan_objmgr_get_peer_no_state() - find peer from psoc's peer list
  * @psoc: PSOC object

+ 70 - 0
umac/cmn_services/obj_mgr/src/wlan_objmgr_psoc_obj.c

@@ -936,6 +936,47 @@ static QDF_STATUS wlan_peer_bssid_match(struct wlan_objmgr_peer *peer,
 		return QDF_STATUS_E_FAILURE;
 }
 
+/**
+ * wlan_obj_psoc_peerlist_get_peer_logically_deleted() - get peer
+ * from psoc peer list
+ * @psoc: PSOC object
+ * @macaddr: MAC address
+ *
+ * API to finds peer object pointer of logically deleted peer
+ *
+ * Return: peer pointer
+ *         NULL on FAILURE
+ */
+static struct wlan_objmgr_peer *
+			wlan_obj_psoc_peerlist_get_peer_logically_deleted(
+				qdf_list_t *obj_list, uint8_t *macaddr,
+				wlan_objmgr_ref_dbgid dbg_id)
+{
+	struct wlan_objmgr_peer *peer;
+	struct wlan_objmgr_peer *peer_temp;
+
+	/* Iterate through hash list to get the peer */
+	peer = wlan_psoc_peer_list_peek_head(obj_list);
+	while (peer != NULL) {
+		wlan_objmgr_peer_get_ref(peer, dbg_id);
+		/* For peer, macaddr is key */
+		if (WLAN_ADDR_EQ(wlan_peer_get_macaddr(peer), macaddr)
+			== QDF_STATUS_SUCCESS) {
+			if (peer->obj_state == WLAN_OBJ_STATE_LOGICALLY_DELETED)
+				/* Return peer in logically deleted state */
+				return peer;
+
+		}
+		/* Move to next peer */
+		peer_temp = peer;
+		peer = wlan_peer_get_next_peer_of_psoc(obj_list, peer_temp);
+		wlan_objmgr_peer_release_ref(peer_temp, dbg_id);
+	}
+
+	/* Not found, return NULL */
+	return NULL;
+}
+
 /**
  * wlan_obj_psoc_peerlist_get_peer() - get peer from psoc peer list
  * @psoc: PSOC object
@@ -1163,6 +1204,35 @@ QDF_STATUS wlan_objmgr_psoc_peer_detach(struct wlan_objmgr_psoc *psoc,
 	return QDF_STATUS_SUCCESS;
 }
 
+struct wlan_objmgr_peer *wlan_objmgr_get_peer_logically_deleted(
+			struct wlan_objmgr_psoc *psoc, uint8_t *macaddr,
+			wlan_objmgr_ref_dbgid dbg_id)
+{
+	struct wlan_objmgr_psoc_objmgr *objmgr;
+	uint8_t hash_index;
+	struct wlan_objmgr_peer *peer = NULL;
+	struct wlan_peer_list *peer_list;
+
+	/* psoc lock should be taken before peer list lock */
+	wlan_psoc_obj_lock(psoc);
+	objmgr = &psoc->soc_objmgr;
+	/* List is empty, return NULL */
+	if (objmgr->wlan_peer_count == 0) {
+		wlan_psoc_obj_unlock(psoc);
+		return NULL;
+	}
+	/* reduce the search window, with hash key */
+	hash_index = WLAN_PEER_HASH(macaddr);
+	peer_list = &objmgr->peer_list;
+	qdf_spin_lock_bh(&peer_list->peer_list_lock);
+	/* Iterate through peer list, get peer */
+	peer = wlan_obj_psoc_peerlist_get_peer_logically_deleted(
+		&peer_list->peer_hash[hash_index], macaddr, dbg_id);
+	qdf_spin_unlock_bh(&peer_list->peer_list_lock);
+	wlan_psoc_obj_unlock(psoc);
+
+	return peer;
+}
 struct wlan_objmgr_peer *wlan_objmgr_get_peer(
 			struct wlan_objmgr_psoc *psoc, uint8_t *macaddr,
 			wlan_objmgr_ref_dbgid dbg_id)