qcacmn: Add API to fetch logically deleted peer list of a vdev

Add API to fetch the logically deleted peer list for a given vdev
and also add change to move peer delete request and response
related stats from pdev to vdev layer

Change-Id: Ibaac286a1e6ca86988b223055c15a6b9ba6cf4b9
CRs-Fixed: 2448111
这个提交包含在:
Santosh Anbu
2019-05-06 23:47:08 +05:30
提交者 nshrivas
父节点 57effefdba
当前提交 261451a46c
修改 2 个文件,包含 123 行新增0 行删除

查看文件

@@ -483,6 +483,25 @@ QDF_STATUS wlan_objmgr_iterate_peerobj_list(
wlan_objmgr_vdev_op_handler handler,
void *arg, wlan_objmgr_ref_dbgid dbg_id);
/**
* wlan_objmgr_vdev_get_log_del_peer_list() - vdev logically deleted peer list
* @vdev: vdev object
* @dbg_id: id of the caller
*
* API to be used for populating the list of logically deleted peers from the
* vdev's peer list
*
* The caller of this function should free the memory allocated for the
* peerlist and the peer member in the list
* Also the peer ref release is handled by the caller
*
* Return: list of peer pointers
* NULL on FAILURE
*/
qdf_list_t *wlan_objmgr_vdev_get_log_del_peer_list(
struct wlan_objmgr_vdev *vdev,
wlan_objmgr_ref_dbgid dbg_id);
/**
* wlan_objmgr_trigger_vdev_comp_priv_object_creation() - vdev
* comp object creation

查看文件

@@ -523,6 +523,110 @@ QDF_STATUS wlan_objmgr_iterate_peerobj_list(
return QDF_STATUS_SUCCESS;
}
/**
* wlan_obj_vdev_populate_logically_del_peerlist() - get peer
* from vdev peer list
* @obj_list: peer object list
* @vdev_obj: vdev object mgr substructure
* @dbg_id: id of the caller
*
* API to finds peer object pointer by vdev from peer hash list for a node
* which is in logically deleted state
*
* Caller to free the list allocated in this function
*
* Return: list of peer pointers
* NULL on FAILURE
*/
static qdf_list_t *wlan_obj_vdev_populate_logically_del_peerlist(
qdf_list_t *obj_list,
struct wlan_objmgr_vdev_objmgr *vdev_obj,
wlan_objmgr_ref_dbgid dbg_id)
{
struct wlan_objmgr_peer *peer;
struct wlan_objmgr_peer *peer_next;
struct wlan_logically_del_peer *peer_list;
qdf_list_t *logical_del_peerlist;
bool lock_released = false;
logical_del_peerlist = qdf_mem_malloc(sizeof(*logical_del_peerlist));
if (!logical_del_peerlist)
return NULL;
qdf_list_create(logical_del_peerlist, vdev_obj->max_peer_count);
peer = wlan_vdev_peer_list_peek_head(obj_list);
while (peer) {
wlan_peer_obj_lock(peer);
peer_next = wlan_peer_get_next_peer_of_vdev(obj_list, peer);
if (peer->obj_state == WLAN_OBJ_STATE_LOGICALLY_DELETED &&
qdf_atomic_read(&peer->peer_objmgr.ref_cnt)) {
wlan_objmgr_peer_get_ref(peer, dbg_id);
wlan_peer_obj_unlock(peer);
lock_released = true;
peer_list = qdf_mem_malloc(sizeof(*peer_list));
if (!peer_list) {
wlan_objmgr_peer_release_ref(peer, dbg_id);
WLAN_OBJMGR_BUG(0);
break;
}
peer_list->peer = peer;
qdf_list_insert_front(logical_del_peerlist,
&peer_list->list);
}
if (!lock_released)
wlan_peer_obj_unlock(peer);
peer = peer_next;
lock_released = false;
}
/* Not found, return NULL */
if (qdf_list_empty(logical_del_peerlist)) {
qdf_mem_free(logical_del_peerlist);
return NULL;
}
return logical_del_peerlist;
}
qdf_list_t *wlan_objmgr_vdev_get_log_del_peer_list(
struct wlan_objmgr_vdev *vdev,
wlan_objmgr_ref_dbgid dbg_id)
{
qdf_list_t *peer_list;
qdf_list_t *log_del_peer_list = NULL;
if (vdev->obj_state != WLAN_OBJ_STATE_CREATED) {
obj_mgr_err("Invalid state vdev:%d state:%d",
wlan_vdev_get_id(vdev), vdev->obj_state);
return NULL;
}
wlan_vdev_obj_lock(vdev);
if (vdev->vdev_objmgr.wlan_peer_count == 0) {
wlan_vdev_obj_unlock(vdev);
return NULL;
}
wlan_objmgr_vdev_get_ref(vdev, dbg_id);
peer_list = &vdev->vdev_objmgr.wlan_peer_list;
if (peer_list) {
log_del_peer_list =
wlan_obj_vdev_populate_logically_del_peerlist(
peer_list, &vdev->vdev_objmgr,
dbg_id);
}
wlan_objmgr_vdev_release_ref(vdev, dbg_id);
wlan_vdev_obj_unlock(vdev);
return log_del_peer_list;
}
QDF_STATUS wlan_objmgr_trigger_vdev_comp_priv_object_creation(
struct wlan_objmgr_vdev *vdev,
enum wlan_umac_comp_id id)