Ver código fonte

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
Naveen Rawat 7 anos atrás
pai
commit
9da3f01914

+ 27 - 0
umac/cmn_services/utils/inc/wlan_utility.h

@@ -28,6 +28,16 @@
 #include <wlan_objmgr_pdev_obj.h>
 #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 @@ bool wlan_is_emulation_platform(uint32_t phy_version);
 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_ */

+ 37 - 0
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 @@ uint32_t wlan_get_pdev_id_from_vdev_id(struct wlan_objmgr_psoc *psoc,
 	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);