From 2171e391a828280f9b7f6098ab0350084c9f1c3f Mon Sep 17 00:00:00 2001 From: Naveen Rawat Date: Fri, 30 Jun 2017 10:48:48 -0700 Subject: [PATCH 1/2] qcacmn: Enable support for multiple NAN Data Interfaces Enable support for multiple nan data interfaces. The usespace may need to create multiple NDIs depending on whether it requires IP isolation or not. Change-Id: I4391f2efdc6bdede52a73915531d39dd7798c39d CRs-Fixed: 2072501 --- os_if/linux/nan/src/os_if_nan.c | 24 +++++++++++++------ target_if/nan/src/target_if_nan.c | 6 +++-- umac/nan/core/src/nan_api.c | 33 ++------------------------ umac/nan/core/src/nan_main_i.h | 2 -- umac/nan/dispatcher/inc/nan_ucfg_api.h | 10 -------- umac/nan/dispatcher/src/nan_ucfg_api.c | 20 ---------------- 6 files changed, 23 insertions(+), 72 deletions(-) diff --git a/os_if/linux/nan/src/os_if_nan.c b/os_if/linux/nan/src/os_if_nan.c index f4d92204f794..92e4875998a2 100644 --- a/os_if/linux/nan/src/os_if_nan.c +++ b/os_if/linux/nan/src/os_if_nan.c @@ -140,7 +140,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 +151,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); @@ -272,12 +271,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 || @@ -401,12 +405,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 || @@ -526,7 +535,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) From b948a1f9ad427d21ad77fee3d0c6fe6e1407dce3 Mon Sep 17 00:00:00 2001 From: Naveen Rawat Date: Mon, 3 Jul 2017 14:52:07 -0700 Subject: [PATCH 2/2] qcacmn: Check NAN iface with same name before creating another one There were some corner cases reported in which NDIs are getting created with same name. Providing fix for the same. Change-Id: I84ea80580faa44809e257d3b17645808637b5d51 CRs-Fixed: 2072509 --- os_if/linux/nan/src/os_if_nan.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/os_if/linux/nan/src/os_if_nan.c b/os_if/linux/nan/src/os_if_nan.c index 92e4875998a2..d65a1c6bc0a9 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;