qcacld-3.0: Define NAN peer objects for storing NDP Peer info

Host presently stores NAN Peer specific info, such as number
of active NDP sessions, in an array inside vdev private object.
The array uses Peer index from HDD connection info. Instead,
use object manager to define peer private objects to store
this information.

Define NAN peer objects for storing NDP Peer info

Change-Id: I43d9339d06acc0eff61cafb337ccb084c372c7e1
CRs-Fixed: 2405507
This commit is contained in:
Nachiket Kukade 2019-02-19 20:01:49 +05:30 committed by nshrivas
parent c060ac40d5
commit d5b7ebcc37
11 changed files with 257 additions and 154 deletions

View File

@ -705,7 +705,6 @@ struct nan_datapath_sch_update_event {
* @drv_ndi_create_rsp_handler: HDD callback for handling NDI interface creation
* @drv_ndi_delete_rsp_handler: HDD callback for handling NDI interface deletion
* @new_peer_ind: HDD callback for handling new NDP peer
* @get_peer_idx: HDD callback for getting NDP peer index
* @add_ndi_peer: LIM callback for adding NDP peer
* @peer_departed_ind: HDD callback for handling departing of NDP peer
* @ndp_delete_peers: LIM callback for deleting NDP peer
@ -726,7 +725,6 @@ struct nan_callbacks {
(uint8_t, struct nan_datapath_inf_create_rsp *);
void (*drv_ndi_delete_rsp_handler)(uint8_t);
int (*new_peer_ind)(uint8_t, uint16_t, struct qdf_mac_addr *, bool);
int (*get_peer_idx)(uint8_t, struct qdf_mac_addr *);
QDF_STATUS (*add_ndi_peer)(uint32_t, struct qdf_mac_addr);
void (*peer_departed_ind)(uint8_t, uint16_t, struct qdf_mac_addr *,
bool);

View File

@ -64,6 +64,26 @@ QDF_STATUS nan_psoc_enable(struct wlan_objmgr_psoc *psoc);
*/
QDF_STATUS nan_psoc_disable(struct wlan_objmgr_psoc *psoc);
/**
* nan_get_peer_priv_obj: get NAN priv object from peer object
* @peer: pointer to peer object
*
* Return: pointer to NAN peer private object
*/
static inline
struct nan_peer_priv_obj *nan_get_peer_priv_obj(struct wlan_objmgr_peer *peer)
{
struct nan_peer_priv_obj *obj;
if (!peer) {
nan_err("peer is null");
return NULL;
}
obj = wlan_objmgr_peer_get_comp_private_obj(peer, WLAN_UMAC_COMP_NAN);
return obj;
}
/**
* nan_get_vdev_priv_obj: get NAN priv object from vdev object
* @vdev: pointer to vdev object

View File

@ -249,6 +249,81 @@ static QDF_STATUS nan_vdev_obj_destroyed_notification(
return status;
}
/**
* nan_peer_obj_created_notification() - Handler for peer object creation
* notification event
* @peer: Pointer to the PEER Object
* @arg_list: Pointer to private argument - NULL
*
* This function gets called from object manager when peer is being
* created.
*
* Return: QDF_STATUS
*/
static QDF_STATUS nan_peer_obj_created_notification(
struct wlan_objmgr_peer *peer, void *arg_list)
{
struct nan_peer_priv_obj *nan_peer_obj;
QDF_STATUS status = QDF_STATUS_SUCCESS;
nan_peer_obj = qdf_mem_malloc(sizeof(*nan_peer_obj));
if (!nan_peer_obj) {
nan_err("malloc failed for nan prv obj");
return QDF_STATUS_E_NOMEM;
}
qdf_spinlock_create(&nan_peer_obj->lock);
status = wlan_objmgr_peer_component_obj_attach(peer, WLAN_UMAC_COMP_NAN,
(void *)nan_peer_obj,
QDF_STATUS_SUCCESS);
if (QDF_IS_STATUS_ERROR(status)) {
nan_alert("obj attach with peer failed");
goto nan_peer_notif_failed;
}
return QDF_STATUS_SUCCESS;
nan_peer_notif_failed:
qdf_spinlock_destroy(&nan_peer_obj->lock);
qdf_mem_free(nan_peer_obj);
return status;
}
/**
* nan_peer_obj_destroyed_notification() - Handler for peer object deletion
* notification event
* @peer: Pointer to the PEER Object
* @arg_list: Pointer to private argument - NULL
*
* This function gets called from object manager when peer is being destroyed.
*
* Return: QDF_STATUS
*/
static QDF_STATUS nan_peer_obj_destroyed_notification(
struct wlan_objmgr_peer *peer, void *arg_list)
{
struct nan_peer_priv_obj *nan_peer_obj;
QDF_STATUS status = QDF_STATUS_SUCCESS;
nan_peer_obj = nan_get_peer_priv_obj(peer);
if (!nan_peer_obj) {
nan_err("nan_peer_obj is NULL");
return QDF_STATUS_E_FAULT;
}
status = wlan_objmgr_peer_component_obj_detach(peer, WLAN_UMAC_COMP_NAN,
nan_peer_obj);
if (QDF_IS_STATUS_ERROR(status))
nan_err("nan_peer_obj detach failed");
nan_debug("nan_peer_obj deleted with status %d", status);
qdf_spinlock_destroy(&nan_peer_obj->lock);
qdf_mem_free(nan_peer_obj);
return status;
}
QDF_STATUS nan_init(void)
{
QDF_STATUS status;
@ -270,8 +345,7 @@ QDF_STATUS nan_init(void)
NULL);
if (QDF_IS_STATUS_ERROR(status)) {
nan_err("wlan_objmgr_register_psoc_destroy_handler failed");
nan_deinit();
return status;
goto err_psoc_destroy_reg;
}
/* register vdev create handler functions. */
@ -281,8 +355,7 @@ QDF_STATUS nan_init(void)
NULL);
if (QDF_IS_STATUS_ERROR(status)) {
nan_err("wlan_objmgr_register_psoc_create_handler failed");
nan_deinit();
return status;
goto err_vdev_create_reg;
}
/* register vdev delete handler functions. */
@ -292,11 +365,50 @@ QDF_STATUS nan_init(void)
NULL);
if (QDF_IS_STATUS_ERROR(status)) {
nan_err("wlan_objmgr_register_psoc_destroy_handler failed");
nan_deinit();
return status;
goto err_vdev_destroy_reg;
}
return QDF_STATUS_SUCCESS;
/* register peer create handler functions. */
status = wlan_objmgr_register_peer_create_handler(
WLAN_UMAC_COMP_NAN,
nan_peer_obj_created_notification,
NULL);
if (QDF_IS_STATUS_ERROR(status)) {
nan_err("wlan_objmgr_register_peer_create_handler failed");
goto err_peer_create_reg;
}
/* register peer delete handler functions. */
status = wlan_objmgr_register_peer_destroy_handler(
WLAN_UMAC_COMP_NAN,
nan_peer_obj_destroyed_notification,
NULL);
if (QDF_IS_STATUS_ERROR(status))
nan_err("wlan_objmgr_register_peer_destroy_handler failed");
else
return QDF_STATUS_SUCCESS;
wlan_objmgr_unregister_peer_create_handler(WLAN_UMAC_COMP_NAN,
nan_peer_obj_created_notification,
NULL);
err_peer_create_reg:
wlan_objmgr_unregister_vdev_destroy_handler(WLAN_UMAC_COMP_NAN,
nan_vdev_obj_destroyed_notification,
NULL);
err_vdev_destroy_reg:
wlan_objmgr_unregister_vdev_create_handler(WLAN_UMAC_COMP_NAN,
nan_vdev_obj_created_notification,
NULL);
err_vdev_create_reg:
wlan_objmgr_unregister_psoc_destroy_handler(WLAN_UMAC_COMP_NAN,
nan_psoc_obj_destroyed_notification,
NULL);
err_psoc_destroy_reg:
wlan_objmgr_unregister_psoc_create_handler(WLAN_UMAC_COMP_NAN,
nan_psoc_obj_created_notification,
NULL);
return status;
}
QDF_STATUS nan_deinit(void)
@ -343,6 +455,26 @@ QDF_STATUS nan_deinit(void)
ret = status;
}
/* de-register peer create handler functions. */
status = wlan_objmgr_unregister_peer_create_handler(
WLAN_UMAC_COMP_NAN,
nan_peer_obj_created_notification,
NULL);
if (QDF_IS_STATUS_ERROR(status)) {
nan_err("wlan_objmgr_unregister_peer_create_handler failed");
ret = status;
}
/* de-register peer delete handler functions. */
status = wlan_objmgr_unregister_peer_destroy_handler(
WLAN_UMAC_COMP_NAN,
nan_peer_obj_destroyed_notification,
NULL);
if (QDF_IS_STATUS_ERROR(status)) {
nan_err("wlan_objmgr_deregister_peer_destroy_handler failed");
ret = status;
}
return ret;
}

View File

@ -292,6 +292,79 @@ QDF_STATUS nan_scheduled_msg_handler(struct scheduler_msg *msg)
return QDF_STATUS_SUCCESS;
}
static QDF_STATUS nan_increment_ndp_sessions(struct wlan_objmgr_psoc *psoc,
struct qdf_mac_addr *peer_ndi_mac)
{
struct wlan_objmgr_peer *peer;
struct nan_peer_priv_obj *peer_nan_obj;
peer = wlan_objmgr_get_peer_by_mac(psoc,
peer_ndi_mac->bytes,
WLAN_NAN_ID);
if (!peer) {
nan_err("peer object is null");
return QDF_STATUS_E_NULL_VALUE;
}
peer_nan_obj = nan_get_peer_priv_obj(peer);
if (!peer_nan_obj) {
nan_err("peer_nan_obj is null");
wlan_objmgr_peer_release_ref(peer, WLAN_NAN_ID);
return QDF_STATUS_E_NULL_VALUE;
}
qdf_spin_lock_bh(&peer_nan_obj->lock);
if (peer_nan_obj->active_ndp_sessions == MAX_NDP_INSTANCES_PER_PEER) {
qdf_spin_unlock_bh(&peer_nan_obj->lock);
nan_err("Already reached Max limit(%d) for NDP's per peer!",
MAX_NDP_INSTANCES_PER_PEER);
wlan_objmgr_peer_release_ref(peer, WLAN_NAN_ID);
return QDF_STATUS_E_FAILURE;
}
peer_nan_obj->active_ndp_sessions++;
qdf_spin_unlock_bh(&peer_nan_obj->lock);
wlan_objmgr_peer_release_ref(peer, WLAN_NAN_ID);
return QDF_STATUS_SUCCESS;
}
static QDF_STATUS nan_decrement_ndp_sessions(struct wlan_objmgr_psoc *psoc,
struct qdf_mac_addr *peer_ndi_mac)
{
struct wlan_objmgr_peer *peer;
struct nan_peer_priv_obj *peer_nan_obj;
peer = wlan_objmgr_get_peer_by_mac(psoc,
peer_ndi_mac->bytes,
WLAN_NAN_ID);
if (!peer) {
nan_err("peer object is null");
return QDF_STATUS_E_NULL_VALUE;
}
peer_nan_obj = nan_get_peer_priv_obj(peer);
if (!peer_nan_obj) {
nan_err("peer_nan_obj is null");
wlan_objmgr_peer_release_ref(peer, WLAN_NAN_ID);
return QDF_STATUS_E_NULL_VALUE;
}
qdf_spin_lock_bh(&peer_nan_obj->lock);
if (!peer_nan_obj->active_ndp_sessions) {
qdf_spin_unlock_bh(&peer_nan_obj->lock);
nan_err("Active NDP sessions already zero!");
wlan_objmgr_peer_release_ref(peer, WLAN_NAN_ID);
return QDF_STATUS_E_FAILURE;
}
peer_nan_obj->active_ndp_sessions--;
qdf_spin_unlock_bh(&peer_nan_obj->lock);
wlan_objmgr_peer_release_ref(peer, WLAN_NAN_ID);
return QDF_STATUS_SUCCESS;
}
static QDF_STATUS nan_handle_confirm(
struct nan_datapath_confirm_event *confirm)
{
@ -324,6 +397,11 @@ static QDF_STATUS nan_handle_confirm(
psoc_nan_obj->cb_obj.delete_peers_by_addr(vdev_id,
confirm->peer_ndi_mac_addr);
}
/* Increment NDP sessions for the Peer */
if (confirm->rsp_code == NAN_DATAPATH_RESPONSE_ACCEPT)
nan_increment_ndp_sessions(psoc, &confirm->peer_ndi_mac_addr);
psoc_nan_obj->cb_obj.os_if_ndp_event_handler(psoc, confirm->vdev,
NDP_CONFIRM, confirm);
@ -466,6 +544,7 @@ static QDF_STATUS nan_handle_ndp_end_rsp(
static QDF_STATUS nan_handle_end_ind(
struct nan_datapath_end_indication_event *ind)
{
uint32_t i;
struct wlan_objmgr_psoc *psoc;
struct nan_psoc_priv_obj *psoc_nan_obj;
@ -481,6 +560,11 @@ static QDF_STATUS nan_handle_end_ind(
return QDF_STATUS_E_NULL_VALUE;
}
/* Decrement NDP sessions for all Peers in the event */
for (i = 0; i < ind->num_ndp_ids; i++)
nan_decrement_ndp_sessions(psoc,
&ind->ndp_map[i].peer_ndi_mac_addr);
psoc_nan_obj->cb_obj.ndp_delete_peers(ind->ndp_map, ind->num_ndp_ids);
psoc_nan_obj->cb_obj.os_if_ndp_event_handler(psoc, ind->vdev,
NDP_END_IND, ind);

View File

@ -58,9 +58,8 @@ struct scheduler_msg;
#define nan_nofl_debug(params...) \
QDF_TRACE_DEBUG_NO_FL(QDF_MODULE_ID_NAN, params)
#ifndef MAX_PEERS
#define MAX_PEERS 32
#endif
/* Maximum number of NDP instances supported on each NAN Peer */
#define MAX_NDP_INSTANCES_PER_PEER 1
/**
* enum nan_disc_state - NAN Discovery states
@ -121,7 +120,6 @@ struct nan_psoc_priv_obj {
* struct nan_vdev_priv_obj - nan private vdev obj
* @lock: lock to be acquired before reading or writing to object
* @state: Current state of NDP
* @active_ndp_sessions: active ndp sessions per adapter
* @active_ndp_peers: number of active ndp peers
* @ndp_create_transaction_id: transaction id for create req
* @ndp_delete_transaction_id: transaction id for delete req
@ -131,8 +129,6 @@ struct nan_psoc_priv_obj {
struct nan_vdev_priv_obj {
qdf_spinlock_t lock;
enum nan_datapath_state state;
/* idx in following array should follow conn_info.peerMacAddress */
uint32_t active_ndp_sessions[MAX_PEERS];
uint32_t active_ndp_peers;
uint16_t ndp_create_transaction_id;
uint16_t ndp_delete_transaction_id;
@ -140,6 +136,16 @@ struct nan_vdev_priv_obj {
uint32_t ndi_delete_rsp_status;
};
/**
* struct nan_peer_priv_obj - nan private peer obj
* @lock: lock to be acquired before reading or writing to object
* @active_ndp_sessions: number of active ndp sessions for this peer
*/
struct nan_peer_priv_obj {
qdf_spinlock_t lock;
uint32_t active_ndp_sessions;
};
/**
* nan_release_cmd: frees resources for NAN command.
* @in_req: pointer to msg buffer to be freed

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2017-2018 The Linux Foundation. All rights reserved.
* Copyright (c) 2017-2019 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
@ -63,24 +63,6 @@ QDF_STATUS ucfg_nan_set_active_peers(struct wlan_objmgr_vdev *vdev,
*/
uint32_t ucfg_nan_get_active_peers(struct wlan_objmgr_vdev *vdev);
/**
* ucfg_nan_set_active_ndp_sessions: set active ndp sessions
* @vdev: pointer to vdev object
*
* Return: status of operation
*/
QDF_STATUS ucfg_nan_set_active_ndp_sessions(struct wlan_objmgr_vdev *vdev,
uint32_t val, uint8_t idx);
/**
* ucfg_nan_get_active_ndp_sessions: get active ndp sessions from vdev obj
* @vdev: pointer to vdev object
*
* Return: pointer to NAN psoc private object
*/
uint32_t ucfg_nan_get_active_ndp_sessions(struct wlan_objmgr_vdev *vdev,
uint8_t idx);
/**
* ucfg_nan_set_ndp_create_transaction_id: set ndp create transaction id
* @vdev: pointer to vdev object

View File

@ -100,54 +100,6 @@ inline uint32_t ucfg_nan_get_active_peers(struct wlan_objmgr_vdev *vdev)
return val;
}
inline QDF_STATUS ucfg_nan_set_active_ndp_sessions(
struct wlan_objmgr_vdev *vdev, uint32_t val, uint8_t idx)
{
struct nan_vdev_priv_obj *priv_obj = nan_get_vdev_priv_obj(vdev);
if (!priv_obj) {
nan_err("priv_obj is null");
return QDF_STATUS_E_NULL_VALUE;
}
if (idx >= MAX_PEERS) {
nan_err("peer_idx(%d), MAX(%d)",
idx, MAX_PEERS);
return QDF_STATUS_E_NULL_VALUE;
}
qdf_spin_lock_bh(&priv_obj->lock);
priv_obj->active_ndp_sessions[idx] = val;
qdf_spin_unlock_bh(&priv_obj->lock);
return QDF_STATUS_SUCCESS;
}
inline uint32_t ucfg_nan_get_active_ndp_sessions(struct wlan_objmgr_vdev *vdev,
uint8_t idx)
{
uint32_t val;
struct nan_vdev_priv_obj *priv_obj = nan_get_vdev_priv_obj(vdev);
if (!priv_obj) {
nan_err("priv_obj is null");
return 0;
}
if (idx >= MAX_PEERS) {
nan_err("peer_idx(%d), MAX(%d)",
idx, MAX_PEERS);
return 0;
}
qdf_spin_lock_bh(&priv_obj->lock);
val = priv_obj->active_ndp_sessions[idx];
qdf_spin_unlock_bh(&priv_obj->lock);
return val;
}
inline QDF_STATUS ucfg_nan_set_ndp_create_transaction_id(
struct wlan_objmgr_vdev *vdev, uint16_t val)
{
@ -428,7 +380,6 @@ int ucfg_nan_register_hdd_callbacks(struct wlan_objmgr_psoc *psoc,
psoc_obj->cb_obj.drv_ndi_delete_rsp_handler =
cb_obj->drv_ndi_delete_rsp_handler;
psoc_obj->cb_obj.get_peer_idx = cb_obj->get_peer_idx;
psoc_obj->cb_obj.new_peer_ind = cb_obj->new_peer_ind;
psoc_obj->cb_obj.peer_departed_ind = cb_obj->peer_departed_ind;
psoc_obj->cb_obj.os_if_ndp_event_handler =

View File

@ -2693,7 +2693,6 @@ static void hdd_nan_register_callbacks(struct hdd_context *hdd_ctx)
cb_obj.drv_ndi_delete_rsp_handler = hdd_ndi_drv_ndi_delete_rsp_handler;
cb_obj.new_peer_ind = hdd_ndp_new_peer_handler;
cb_obj.get_peer_idx = hdd_ndp_get_peer_idx;
cb_obj.peer_departed_ind = hdd_ndp_peer_departed_handler;
os_if_nan_register_hdd_callbacks(hdd_ctx->psoc, &cb_obj);

View File

@ -764,15 +764,6 @@ void hdd_ndp_session_end_handler(struct hdd_adapter *adapter)
os_if_nan_ndi_session_end(adapter->vdev);
}
int hdd_ndp_get_peer_idx(uint8_t vdev_id, struct qdf_mac_addr *addr)
{
struct hdd_context *hdd_ctx = cds_get_context(QDF_MODULE_ID_HDD);
struct hdd_adapter *adapter = hdd_get_adapter_by_vdev(hdd_ctx, vdev_id);
struct hdd_station_ctx *sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(adapter);
return hdd_get_peer_idx(sta_ctx, addr);
}
/**
* hdd_ndp_new_peer_handler() - NDP new peer indication handler
* @adapter: pointer to adapter context

View File

@ -92,7 +92,6 @@ void hdd_ndi_close(uint8_t vdev_id);
void hdd_ndi_drv_ndi_create_rsp_handler(uint8_t vdev_id,
struct nan_datapath_inf_create_rsp *ndi_rsp);
void hdd_ndi_drv_ndi_delete_rsp_handler(uint8_t vdev_id);
int hdd_ndp_get_peer_idx(uint8_t vdev_id, struct qdf_mac_addr *addr);
int hdd_ndp_new_peer_handler(uint8_t vdev_id, uint16_t sta_id,
struct qdf_mac_addr *peer_mac_addr, bool fist_peer);
void hdd_ndp_peer_departed_handler(uint8_t vdev_id, uint16_t sta_id,

View File

@ -1450,15 +1450,12 @@ static void
os_if_ndp_confirm_ind_handler(struct wlan_objmgr_vdev *vdev,
struct nan_datapath_confirm_event *ndp_confirm)
{
int idx = 0;
uint8_t *ifname;
uint32_t data_len;
QDF_STATUS status;
qdf_size_t ifname_len;
struct nan_callbacks cb_obj;
struct sk_buff *vendor_event;
struct wlan_objmgr_pdev *pdev = wlan_vdev_get_pdev(vdev);
struct wlan_objmgr_psoc *psoc = wlan_vdev_get_psoc(vdev);
struct pdev_osif_priv *os_priv = wlan_pdev_get_ospriv(pdev);
if (!ndp_confirm) {
@ -1466,27 +1463,6 @@ os_if_ndp_confirm_ind_handler(struct wlan_objmgr_vdev *vdev,
return;
}
status = ucfg_nan_get_callbacks(psoc, &cb_obj);
if (QDF_IS_STATUS_ERROR(status)) {
cfg80211_err("couldn't get callbacks");
return;
}
/* ndp_confirm is called each time user generated ndp req succeeds */
idx = cb_obj.get_peer_idx(wlan_vdev_get_id(vdev),
&ndp_confirm->peer_ndi_mac_addr);
if (idx < 0)
cfg80211_err("can't find addr: %pM in vdev_id: %d, peer table.",
&ndp_confirm->peer_ndi_mac_addr,
wlan_vdev_get_id(vdev));
else if (ndp_confirm->rsp_code == NAN_DATAPATH_RESPONSE_ACCEPT) {
uint32_t active_sessions =
ucfg_nan_get_active_ndp_sessions(vdev, idx);
ucfg_nan_set_active_ndp_sessions(vdev, active_sessions + 1,
idx);
}
ifname = wlan_util_vdev_get_if_name(vdev);
if (!ifname) {
cfg80211_err("ifname is null");
@ -1695,22 +1671,12 @@ static inline uint32_t osif_ndp_get_ndp_end_ind_len(
static void os_if_ndp_end_ind_handler(struct wlan_objmgr_vdev *vdev,
struct nan_datapath_end_indication_event *end_ind)
{
QDF_STATUS status;
uint32_t data_len, i;
struct nan_callbacks cb_obj;
uint32_t *ndp_instance_array;
struct sk_buff *vendor_event;
struct wlan_objmgr_vdev *vdev_itr;
struct wlan_objmgr_psoc *psoc = wlan_vdev_get_psoc(vdev);
struct wlan_objmgr_pdev *pdev = wlan_vdev_get_pdev(vdev);
struct pdev_osif_priv *os_priv = wlan_pdev_get_ospriv(pdev);
status = ucfg_nan_get_callbacks(psoc, &cb_obj);
if (QDF_IS_STATUS_ERROR(status)) {
cfg80211_err("failed to get callbacks");
return;
}
if (!end_ind) {
cfg80211_err("Invalid ndp end indication");
return;
@ -1722,33 +1688,8 @@ static void os_if_ndp_end_ind_handler(struct wlan_objmgr_vdev *vdev,
cfg80211_err("Failed to allocate ndp_instance_array");
return;
}
for (i = 0; i < end_ind->num_ndp_ids; i++) {
int idx = 0;
for (i = 0; i < end_ind->num_ndp_ids; i++)
ndp_instance_array[i] = end_ind->ndp_map[i].ndp_instance_id;
vdev_itr = wlan_objmgr_get_vdev_by_id_from_psoc(psoc,
end_ind->ndp_map[i].vdev_id, WLAN_NAN_ID);
if (vdev_itr == NULL) {
cfg80211_err("vdev not found for vdev_id: %d",
end_ind->ndp_map[i].vdev_id);
continue;
}
idx = cb_obj.get_peer_idx(wlan_vdev_get_id(vdev_itr),
&end_ind->ndp_map[i].peer_ndi_mac_addr);
if (idx < 0) {
cfg80211_err("can't find addr: %pM in sta_ctx.",
&end_ind->ndp_map[i].peer_ndi_mac_addr);
wlan_objmgr_vdev_release_ref(vdev_itr, WLAN_NAN_ID);
continue;
}
/* save the value of active sessions on each peer */
ucfg_nan_set_active_ndp_sessions(vdev_itr,
end_ind->ndp_map[i].num_active_ndp_sessions,
idx);
wlan_objmgr_vdev_release_ref(vdev_itr, WLAN_NAN_ID);
}
data_len = osif_ndp_get_ndp_end_ind_len(end_ind);
vendor_event = cfg80211_vendor_event_alloc(os_priv->wiphy, NULL,