mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-11 23:24:22 -04:00
Merge "qcacmn: Check NAN iface with same name before creating another one"
This commit is contained in:
commit
dcc4bb25d8
6 changed files with 32 additions and 72 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Reference in a new issue