diff --git a/os_if/linux/nan/src/os_if_nan.c b/os_if/linux/nan/src/os_if_nan.c index 03feae8efc6a..7820c83cd8c4 100644 --- a/os_if/linux/nan/src/os_if_nan.c +++ b/os_if/linux/nan/src/os_if_nan.c @@ -32,6 +32,7 @@ #include "wlan_objmgr_psoc_obj.h" #include "wlan_objmgr_pdev_obj.h" #include "wlan_objmgr_vdev_obj.h" +#include "wlan_utility.h" /* NLA policy */ static const struct nla_policy @@ -87,6 +88,14 @@ static int os_if_nan_process_ndi_create(struct wlan_objmgr_psoc *psoc, } iface_name = nla_data(tb[QCA_WLAN_VENDOR_ATTR_NDP_IFACE_STR]); + nan_vdev = wlan_util_get_vdev_by_ifname(psoc, iface_name, WLAN_NAN_ID); + if (nan_vdev) { + cfg80211_err("NAN data interface %s is already present", + iface_name); + wlan_objmgr_vdev_release_ref(nan_vdev, WLAN_NAN_ID); + return -EEXIST; + } + if (!tb[QCA_WLAN_VENDOR_ATTR_NDP_TRANSACTION_ID]) { cfg80211_err("transaction id is unavailable"); return -EINVAL; @@ -140,7 +149,7 @@ static int os_if_nan_process_ndi_delete(struct wlan_objmgr_psoc *psoc, return -EINVAL; } - nan_vdev = ucfg_nan_get_ndi_vdev(psoc, WLAN_NAN_ID); + nan_vdev = wlan_util_get_vdev_by_ifname(psoc, iface_name, WLAN_NAN_ID); if (!nan_vdev) { cfg80211_err("Nan datapath interface is not present"); return -EINVAL; @@ -151,9 +160,8 @@ static int os_if_nan_process_ndi_delete(struct wlan_objmgr_psoc *psoc, vdev_id = wlan_vdev_get_id(nan_vdev); num_peers = ucfg_nan_get_active_peers(nan_vdev); /* - * wlan_objmgr_get_vdev_by_opmode_from_psoc API will have incremented - * ref count - decrement here since vdev returned by that api is not - * used any more + * wlan_util_get_vdev_by_ifname increments ref count + * decrement here since vdev returned by that api is not used any more */ wlan_objmgr_vdev_release_ref(nan_vdev, WLAN_NAN_ID); @@ -270,12 +278,17 @@ static int os_if_nan_process_ndp_initiator_req(struct wlan_objmgr_psoc *psoc, } iface_name = nla_data(tb[QCA_WLAN_VENDOR_ATTR_NDP_IFACE_STR]); - nan_vdev = ucfg_nan_get_ndi_vdev(psoc, WLAN_NAN_ID); + nan_vdev = wlan_util_get_vdev_by_ifname(psoc, iface_name, WLAN_NAN_ID); if (!nan_vdev) { cfg80211_err("NAN data interface %s not available", iface_name); return -EINVAL; } + if (nan_vdev->vdev_mlme.vdev_opmode != QDF_NDI_MODE) { + cfg80211_err("Interface found is not NDI"); + return -EINVAL; + } + state = ucfg_nan_get_ndi_state(nan_vdev); if (state == NAN_DATA_NDI_DELETED_STATE || state == NAN_DATA_NDI_DELETING_STATE || @@ -399,12 +412,17 @@ static int os_if_nan_process_ndp_responder_req(struct wlan_objmgr_psoc *psoc, iface_name = nla_data(tb[QCA_WLAN_VENDOR_ATTR_NDP_IFACE_STR]); /* Check if there is already an existing NAN interface */ - nan_vdev = ucfg_nan_get_ndi_vdev(psoc, WLAN_NAN_ID); + nan_vdev = wlan_util_get_vdev_by_ifname(psoc, iface_name, WLAN_NAN_ID); if (!nan_vdev) { cfg80211_err("NAN data interface %s not available", iface_name); return -EINVAL; } + if (nan_vdev->vdev_mlme.vdev_opmode != QDF_NDI_MODE) { + cfg80211_err("Interface found is not NDI"); + return -EINVAL; + } + state = ucfg_nan_get_ndi_state(nan_vdev); if (state == NAN_DATA_NDI_DELETED_STATE || state == NAN_DATA_NDI_DELETING_STATE || @@ -524,7 +542,8 @@ static int os_if_nan_process_ndp_end_req(struct wlan_objmgr_psoc *psoc, cfg80211_debug("sending ndp_end_req to SME, transaction_id: %d", req.transaction_id); - nan_vdev = ucfg_nan_get_ndi_vdev(psoc, WLAN_NAN_ID); + nan_vdev = wlan_objmgr_get_vdev_by_opmode_from_psoc(psoc, QDF_NDI_MODE, + WLAN_NAN_ID); if (!nan_vdev) { cfg80211_err("NAN data interface is not available"); return -EINVAL; diff --git a/target_if/nan/src/target_if_nan.c b/target_if/nan/src/target_if_nan.c index 2797a3f5b956..4872e3cd496d 100644 --- a/target_if/nan/src/target_if_nan.c +++ b/target_if/nan/src/target_if_nan.c @@ -927,7 +927,8 @@ static int target_if_ndp_end_rsp_handler(ol_scn_t scn, uint8_t *data, WMI_NDP_END_RSP_EVENTID, fixed_params->transaction_id, fixed_params->rsp_status, fixed_params->reason_code); - vdev = ucfg_nan_get_ndi_vdev(psoc, WLAN_NAN_ID); + vdev = wlan_objmgr_get_vdev_by_opmode_from_psoc(psoc, QDF_NDI_MODE, + WLAN_NAN_ID); if (!vdev) { target_if_err("vdev is null"); return -EINVAL; @@ -993,7 +994,8 @@ static int target_if_ndp_end_ind_handler(ol_scn_t scn, uint8_t *data, return -EINVAL; } - vdev = ucfg_nan_get_ndi_vdev(psoc, WLAN_NAN_ID); + vdev = wlan_objmgr_get_vdev_by_opmode_from_psoc(psoc, QDF_NDI_MODE, + WLAN_NAN_ID); if (!vdev) { target_if_err("vdev is null"); return -EINVAL; diff --git a/umac/nan/core/src/nan_api.c b/umac/nan/core/src/nan_api.c index 23b0bae32189..fe251a975864 100644 --- a/umac/nan/core/src/nan_api.c +++ b/umac/nan/core/src/nan_api.c @@ -88,37 +88,21 @@ static QDF_STATUS nan_psoc_obj_destroyed_notification( static QDF_STATUS nan_vdev_obj_created_notification( struct wlan_objmgr_vdev *vdev, void *arg_list) { - struct wlan_objmgr_psoc *psoc; struct nan_vdev_priv_obj *nan_obj; - struct nan_psoc_priv_obj *nan_psoc_obj; QDF_STATUS status = QDF_STATUS_SUCCESS; + nan_debug("nan_vdev_create_notif called"); if (wlan_vdev_mlme_get_opmode(vdev) != QDF_NDI_MODE) { nan_debug("not a ndi vdev. do nothing"); return QDF_STATUS_SUCCESS; } - nan_debug("nan_vdev_create_notif called"); - - psoc = wlan_vdev_get_psoc(vdev); - if (!psoc) { - nan_err("psoc is null"); - return QDF_STATUS_E_NULL_VALUE; - } - - nan_psoc_obj = nan_get_psoc_priv_obj(psoc); - if (!nan_psoc_obj) { - nan_err("nan_psoc_obj is null"); - return QDF_STATUS_E_NULL_VALUE; - } - nan_obj = qdf_mem_malloc(sizeof(*nan_obj)); if (!nan_obj) { nan_err("malloc failed for nan prv obj"); return QDF_STATUS_E_NOMEM; } - nan_psoc_obj->vdev = vdev; qdf_spinlock_create(&nan_obj->lock); status = wlan_objmgr_vdev_component_obj_attach(vdev, WLAN_UMAC_COMP_NAN, (void *)nan_obj, @@ -140,28 +124,15 @@ nan_vdev_notif_failed: static QDF_STATUS nan_vdev_obj_destroyed_notification( struct wlan_objmgr_vdev *vdev, void *arg_list) { - struct wlan_objmgr_psoc *psoc; struct nan_vdev_priv_obj *nan_obj; - struct nan_psoc_priv_obj *nan_psoc_obj; QDF_STATUS status = QDF_STATUS_SUCCESS; + nan_debug("nan_vdev_delete_notif called"); if (wlan_vdev_mlme_get_opmode(vdev) != QDF_NDI_MODE) { nan_debug("not a ndi vdev. do nothing"); return QDF_STATUS_SUCCESS; } - nan_debug("nan_vdev_delete_notif called"); - psoc = wlan_vdev_get_psoc(vdev); - if (psoc) { - nan_psoc_obj = nan_get_psoc_priv_obj(psoc); - if (nan_psoc_obj) - nan_psoc_obj->vdev = NULL; - else - nan_err("nan_psoc_obj is null"); - } else { - nan_err("psoc is null"); - } - nan_obj = nan_get_vdev_priv_obj(vdev); if (!nan_obj) { nan_err("nan_obj is NULL"); diff --git a/umac/nan/core/src/nan_main_i.h b/umac/nan/core/src/nan_main_i.h index ca467ef91d16..7d2d770ce37c 100644 --- a/umac/nan/core/src/nan_main_i.h +++ b/umac/nan/core/src/nan_main_i.h @@ -59,12 +59,10 @@ struct scheduler_msg; * struct nan_psoc_priv_obj - nan private psoc obj * @lock: lock to be acquired before reading or writing to object * @cb_obj: struct contaning callback pointers - * @vdev: ndi vdev */ struct nan_psoc_priv_obj { qdf_spinlock_t lock; struct nan_callbacks cb_obj; - struct wlan_objmgr_vdev *vdev; }; /** diff --git a/umac/nan/dispatcher/inc/nan_ucfg_api.h b/umac/nan/dispatcher/inc/nan_ucfg_api.h index feb002f58bbf..7e9f16c0dcfb 100644 --- a/umac/nan/dispatcher/inc/nan_ucfg_api.h +++ b/umac/nan/dispatcher/inc/nan_ucfg_api.h @@ -173,16 +173,6 @@ uint32_t ucfg_nan_get_ndi_delete_rsp_status(struct wlan_objmgr_vdev *vdev); QDF_STATUS ucfg_nan_get_callbacks(struct wlan_objmgr_psoc *psoc, struct nan_callbacks *cb_obj); -/** - * ucfg_nan_get_ndi_vdev: ucfg API get ndi vdev from psoc - * @psoc: psoc obj pointer - * @dbg_id: component id that will be owner of reference - * - * Return: vdev object pointer on success, null otherwise - */ -struct wlan_objmgr_vdev *ucfg_nan_get_ndi_vdev(struct wlan_objmgr_psoc *psoc, - wlan_objmgr_ref_dbgid dbg_id); - /** * ucfg_nan_req_processor: ucfg API to be called from HDD/OS_IF to * process nan datapath initiator request from userspace diff --git a/umac/nan/dispatcher/src/nan_ucfg_api.c b/umac/nan/dispatcher/src/nan_ucfg_api.c index 2e839b3ea755..32d7e2f61643 100644 --- a/umac/nan/dispatcher/src/nan_ucfg_api.c +++ b/umac/nan/dispatcher/src/nan_ucfg_api.c @@ -302,26 +302,6 @@ inline QDF_STATUS ucfg_nan_get_callbacks(struct wlan_objmgr_psoc *psoc, return QDF_STATUS_SUCCESS; } -struct wlan_objmgr_vdev *ucfg_nan_get_ndi_vdev(struct wlan_objmgr_psoc *psoc, - wlan_objmgr_ref_dbgid dbg_id) -{ - QDF_STATUS status; - struct nan_psoc_priv_obj *psoc_obj = nan_get_psoc_priv_obj(psoc); - - if (!psoc_obj) { - nan_err("nan psoc priv object is NULL"); - return NULL; - } - - status = wlan_objmgr_vdev_try_get_ref(psoc_obj->vdev, dbg_id); - if (QDF_IS_STATUS_ERROR(status)) { - nan_err("could not get vdev ref. vdev may have been deleted"); - return NULL; - } - - return psoc_obj->vdev; -} - static struct nan_datapath_initiator_req *ucfg_nan_copy_intiator_req( struct wlan_objmgr_vdev *vdev, struct nan_datapath_initiator_req *in_req)