Ver Fonte

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
Naveen Rawat há 7 anos atrás
pai
commit
2171e391a8

+ 17 - 7
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;

+ 4 - 2
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;

+ 2 - 31
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");

+ 0 - 2
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;
 };
 
 /**

+ 0 - 10
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

+ 0 - 20
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)