qcacmn: Add wlan utility API to retrieve vdev from interface name

Add wlan utility API to retrieve vdev object from interface name. This
can be used by NAN vendor commands where user space provides interface
name.

Change-Id: I003ab9602c5bd5afd046f588b58677514581a742
CRs-Fixed: 2070770
diff --git a/umac/cmn_services/utils/inc/wlan_utility.h b/umac/cmn_services/utils/inc/wlan_utility.h
index ab6559a..c604ee5 100644
--- a/umac/cmn_services/utils/inc/wlan_utility.h
+++ b/umac/cmn_services/utils/inc/wlan_utility.h
@@ -29,6 +29,16 @@
 #include <wlan_objmgr_vdev_obj.h>
 
 /**
+ * struct wlan_find_vdev_filter - find vdev filter object. this can be extended
+ * @ifname:           interface name of vdev
+ * @found_vdev:       found vdev object matching one or more of above params
+ */
+struct wlan_find_vdev_filter {
+	char *ifname;
+	struct wlan_objmgr_vdev *found_vdev;
+};
+
+/**
  * wlan_chan_to_freq() - converts channel to frequency
  * @chan: channel number
  *
@@ -89,4 +99,21 @@
 uint32_t wlan_get_pdev_id_from_vdev_id(struct wlan_objmgr_psoc *psoc,
 				 uint8_t vdev_id,
 				 wlan_objmgr_ref_dbgid dbg_id);
+
+/**
+ * wlan_util_get_vdev_by_ifname() - function to return vdev object from psoc
+ * matching given interface name
+ * @psoc    : psoc object
+ * @ifname  : interface name
+ * @ref_id  : object manager ref id
+ *
+ * This function returns vdev object from psoc by interface name. If found this
+ * will also take reference with given ref_id
+ *
+ * Return : vdev object if found, NULL otherwise
+ */
+struct wlan_objmgr_vdev *wlan_util_get_vdev_by_ifname(
+				struct wlan_objmgr_psoc *psoc, char *ifname,
+				wlan_objmgr_ref_dbgid ref_id);
+
 #endif /* _WLAN_UTILITY_H_ */
diff --git a/umac/cmn_services/utils/src/wlan_utility.c b/umac/cmn_services/utils/src/wlan_utility.c
index a7e4bcf..a2a17f7 100644
--- a/umac/cmn_services/utils/src/wlan_utility.c
+++ b/umac/cmn_services/utils/src/wlan_utility.c
@@ -22,6 +22,8 @@
 
 #include "wlan_utility.h"
 #include <wlan_cmn.h>
+#include "wlan_osif_priv.h"
+#include <net/cfg80211.h>
 
 uint32_t wlan_chan_to_freq(uint8_t chan)
 {
@@ -126,3 +128,38 @@
 	return pdev_id;
 }
 EXPORT_SYMBOL(wlan_get_pdev_id_from_vdev_id);
+
+static void wlan_util_get_vdev_by_ifname_cb(struct wlan_objmgr_psoc *psoc,
+					    void *obj, void *arg)
+{
+	struct wlan_objmgr_vdev *vdev = obj;
+	struct wlan_find_vdev_filter *filter = arg;
+
+	if (filter->found_vdev)
+		return;
+
+	wlan_vdev_obj_lock(vdev);
+	if (!qdf_str_cmp(vdev->vdev_nif.osdev->wdev->netdev->name,
+			 filter->ifname)) {
+		filter->found_vdev = vdev;
+	}
+	wlan_vdev_obj_unlock(vdev);
+}
+
+struct wlan_objmgr_vdev *wlan_util_get_vdev_by_ifname(
+				struct wlan_objmgr_psoc *psoc, char *ifname,
+				wlan_objmgr_ref_dbgid ref_id)
+{
+	struct wlan_find_vdev_filter filter = {0};
+
+	filter.ifname = ifname;
+	wlan_objmgr_iterate_obj_list(psoc, WLAN_VDEV_OP,
+				     wlan_util_get_vdev_by_ifname_cb,
+				     &filter, 0, ref_id);
+
+	if (filter.found_vdev)
+		wlan_objmgr_vdev_get_ref(filter.found_vdev, ref_id);
+
+	return filter.found_vdev;
+}
+EXPORT_SYMBOL(wlan_util_get_vdev_by_ifname);