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
diff --git a/os_if/linux/nan/src/os_if_nan.c b/os_if/linux/nan/src/os_if_nan.c
index f4d9220..92e4875 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 @@
 		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 @@
 	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 @@
 	}
 
 	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 @@
 
 	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 @@
 	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 2797a3f..4872e3c 100644
--- a/target_if/nan/src/target_if_nan.c
+++ b/target_if/nan/src/target_if_nan.c
@@ -927,7 +927,8 @@
 		 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 @@
 		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 23b0bae..fe251a9 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_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 @@
 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 ca467ef..7d2d770 100644
--- a/umac/nan/core/src/nan_main_i.h
+++ b/umac/nan/core/src/nan_main_i.h
@@ -59,12 +59,10 @@
  * 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 feb002f..7e9f16c 100644
--- a/umac/nan/dispatcher/inc/nan_ucfg_api.h
+++ b/umac/nan/dispatcher/inc/nan_ucfg_api.h
@@ -174,16 +174,6 @@
 				  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
  * @vdev: nan vdev pointer
diff --git a/umac/nan/dispatcher/src/nan_ucfg_api.c b/umac/nan/dispatcher/src/nan_ucfg_api.c
index 2e839b3..32d7e2f 100644
--- a/umac/nan/dispatcher/src/nan_ucfg_api.c
+++ b/umac/nan/dispatcher/src/nan_ucfg_api.c
@@ -302,26 +302,6 @@
 	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)