From 5d1f85ccb85b17a84397e8f1e649a3b044c88ed6 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 --- src/os_if_nan.c | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/src/os_if_nan.c b/src/os_if_nan.c index f4d92204f794..92e4875998a2 100644 --- a/src/os_if_nan.c +++ b/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; From fabadbbf6a00c32b36fee6768bab60be9107696b 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 --- src/os_if_nan.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/os_if_nan.c b/src/os_if_nan.c index 92e4875998a2..d65a1c6bc0a9 100644 --- a/src/os_if_nan.c +++ b/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;