diff --git a/components/nan/dispatcher/inc/nan_ucfg_api.h b/components/nan/dispatcher/inc/nan_ucfg_api.h index 1b91311060..c0a0a77857 100644 --- a/components/nan/dispatcher/inc/nan_ucfg_api.h +++ b/components/nan/dispatcher/inc/nan_ucfg_api.h @@ -320,6 +320,15 @@ int ucfg_nan_register_wma_callbacks(struct wlan_objmgr_psoc *psoc, QDF_STATUS ucfg_nan_check_and_disable_unsupported_ndi(struct wlan_objmgr_psoc *psoc); +/** + * ucfg_ndi_remove_entry_from_policy_mgr() - API to remove NDI entry from + * policy manager. + * @vdev: vdev pointer for NDI interface + * + * Return: QDF_STATUS + */ +QDF_STATUS ucfg_ndi_remove_entry_from_policy_mgr(struct wlan_objmgr_vdev *vdev); + #else /* WLAN_FEATURE_NAN */ static inline diff --git a/components/nan/dispatcher/src/nan_ucfg_api.c b/components/nan/dispatcher/src/nan_ucfg_api.c index ca09ce393e..06d5ccae49 100644 --- a/components/nan/dispatcher/src/nan_ucfg_api.c +++ b/components/nan/dispatcher/src/nan_ucfg_api.c @@ -833,3 +833,45 @@ cleanup: return status; } + +QDF_STATUS ucfg_ndi_remove_entry_from_policy_mgr(struct wlan_objmgr_vdev *vdev) +{ + struct wlan_objmgr_psoc *psoc; + struct nan_psoc_priv_obj *psoc_priv_obj; + struct nan_vdev_priv_obj *vdev_priv_obj = nan_get_vdev_priv_obj(vdev); + enum nan_datapath_state state; + uint32_t active_ndp_peers; + + psoc = wlan_vdev_get_psoc(vdev); + if (!psoc) { + nan_err("can't get psoc"); + return QDF_STATUS_E_FAILURE; + } + + psoc_priv_obj = nan_get_psoc_priv_obj(psoc); + if (!psoc_priv_obj) { + nan_err("psoc_priv_obj is null"); + return QDF_STATUS_E_NULL_VALUE; + } + + if (!vdev_priv_obj) { + nan_err("priv_obj is null"); + return QDF_STATUS_E_NULL_VALUE; + } + + qdf_spin_lock_bh(&vdev_priv_obj->lock); + state = vdev_priv_obj->state; + active_ndp_peers = vdev_priv_obj->active_ndp_peers; + qdf_spin_unlock_bh(&vdev_priv_obj->lock); + + if (state == NAN_DATA_NDI_DELETED_STATE && + psoc_priv_obj->nan_caps.ndi_dbs_supported && + active_ndp_peers) { + nan_info("Delete NDP peers: %u and remove NDI from policy mgr", + active_ndp_peers); + policy_mgr_decr_session_set_pcl(psoc, QDF_NDI_MODE, + wlan_vdev_get_id(vdev)); + } + + return QDF_STATUS_SUCCESS; +} diff --git a/os_if/nan/src/os_if_nan.c b/os_if/nan/src/os_if_nan.c index 42608e9ff5..970ef8f7c5 100644 --- a/os_if/nan/src/os_if_nan.c +++ b/os_if/nan/src/os_if_nan.c @@ -2451,6 +2451,7 @@ void os_if_nan_ndi_session_end(struct wlan_objmgr_vdev *vdev) ucfg_nan_set_ndp_delete_transaction_id(vdev, 0); ucfg_nan_set_ndi_state(vdev, NAN_DATA_NDI_DELETED_STATE); + ucfg_ndi_remove_entry_from_policy_mgr(vdev); cfg80211_vendor_event(vendor_event, GFP_KERNEL); return;