diff --git a/components/nan/dispatcher/inc/nan_ucfg_api.h b/components/nan/dispatcher/inc/nan_ucfg_api.h index 3a38bb829d..bf876c840d 100644 --- a/components/nan/dispatcher/inc/nan_ucfg_api.h +++ b/components/nan/dispatcher/inc/nan_ucfg_api.h @@ -463,6 +463,19 @@ bool ucfg_is_nan_vdev(struct wlan_objmgr_vdev *vdev); * Return: QDF_STATUS */ QDF_STATUS ucfg_nan_disable_ind_to_userspace(struct wlan_objmgr_psoc *psoc); + +/** + * ucfg_is_nan_allowed_on_freq() - Check if NAN is allowed on given freq + * @pdev: pdev context + * @freq: Frequency to be checked + * + * Check if NAN/NDP can be enabled on given frequency. + * Validate SRD channels based on the ini and reg domain. Assume rest of the + * channels support NAN/NDP for now. + * + * Return: True if NAN is allowed on the given frequency + */ +bool ucfg_is_nan_allowed_on_freq(struct wlan_objmgr_pdev *pdev, uint32_t freq); #else /* WLAN_FEATURE_NAN */ static inline @@ -576,5 +589,11 @@ QDF_STATUS ucfg_nan_disable_ind_to_userspace(struct wlan_objmgr_psoc *psoc) { return QDF_STATUS_SUCCESS; } + +static inline +bool ucfg_is_nan_allowed_on_freq(struct wlan_objmgr_pdev *pdev, uint32_t freq) +{ + return false; +} #endif /* WLAN_FEATURE_NAN */ #endif /* _NAN_UCFG_API_H_ */ diff --git a/components/nan/dispatcher/src/nan_ucfg_api.c b/components/nan/dispatcher/src/nan_ucfg_api.c index 6b5ecd8052..3dda88bfe9 100644 --- a/components/nan/dispatcher/src/nan_ucfg_api.c +++ b/components/nan/dispatcher/src/nan_ucfg_api.c @@ -32,6 +32,7 @@ #include "wlan_policy_mgr_api.h" #include "cfg_ucfg_api.h" #include "cfg_nan.h" +#include "wlan_mlme_api.h" struct wlan_objmgr_psoc; struct wlan_objmgr_vdev; @@ -1255,3 +1256,18 @@ QDF_STATUS ucfg_nan_disable_ind_to_userspace(struct wlan_objmgr_psoc *psoc) qdf_mem_free(disable_ind); return QDF_STATUS_SUCCESS; } + +bool ucfg_is_nan_allowed_on_freq(struct wlan_objmgr_pdev *pdev, uint32_t freq) +{ + bool nan_allowed = false; + + /* Check for SRD channels only */ + if (!wlan_reg_is_etsi13_srd_chan_for_freq(pdev, freq)) + return true; + + wlan_mlme_get_srd_master_mode_for_vdev(wlan_pdev_get_psoc(pdev), + QDF_NAN_DISC_MODE, + &nan_allowed); + + return nan_allowed; +} diff --git a/core/mac/inc/sir_api.h b/core/mac/inc/sir_api.h index e568b630ef..6382eb7d90 100644 --- a/core/mac/inc/sir_api.h +++ b/core/mac/inc/sir_api.h @@ -2590,6 +2590,7 @@ typedef struct sSirScanOffloadEvent { * @dfsSet: is dfs supported or not * @half_rate: is the channel operating at 10MHz * @quarter_rate: is the channel operating at 5MHz + * @nan_disabled: is NAN disabled on @freq */ typedef struct sSirUpdateChanParam { uint32_t freq; @@ -2597,6 +2598,7 @@ typedef struct sSirUpdateChanParam { bool dfsSet; bool half_rate; bool quarter_rate; + bool nan_disabled; } tSirUpdateChanParam, *tpSirUpdateChanParam; typedef struct sSirUpdateChan { diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c index a065937a83..eb27e26103 100644 --- a/core/sme/src/csr/csr_api_roam.c +++ b/core/sme/src/csr/csr_api_roam.c @@ -68,6 +68,7 @@ #include "wlan_scan_utils_api.h" #include "wlan_p2p_cfg_api.h" #include "cfg_nan_api.h" +#include "nan_ucfg_api.h" #include #include "wlan_pkt_capture_ucfg_api.h" @@ -1175,11 +1176,12 @@ QDF_STATUS csr_update_channel_list(struct mac_context *mac) } } + if (!ucfg_is_nan_allowed_on_freq(mac->pdev, + pChanList->chanParam[num_channel].freq)) + pChanList->chanParam[num_channel].nan_disabled = + true; - if (CHANNEL_STATE_ENABLE == channel_state) - pChanList->chanParam[num_channel].dfsSet = - false; - else + if (CHANNEL_STATE_ENABLE != channel_state) pChanList->chanParam[num_channel].dfsSet = true; diff --git a/core/wma/src/wma_scan_roam.c b/core/wma/src/wma_scan_roam.c index bb9ba530c8..3d112136e2 100644 --- a/core/wma/src/wma_scan_roam.c +++ b/core/wma/src/wma_scan_roam.c @@ -168,6 +168,9 @@ QDF_STATUS wma_update_channel_list(WMA_HANDLE handle, chan_p->dfs_set = 1; } + if (chan_list->chanParam[i].nan_disabled) + chan_p->nan_disabled = 1; + if (chan_p->mhz < WMA_2_4_GHZ_MAX_FREQ) { chan_p->phy_mode = MODE_11G; if (chan_list->vht_en && chan_list->vht_24_en)