diff --git a/components/mlme/core/src/wlan_mlme_main.c b/components/mlme/core/src/wlan_mlme_main.c
index 1f9ac1359e..6e4a6ba187 100644
--- a/components/mlme/core/src/wlan_mlme_main.c
+++ b/components/mlme/core/src/wlan_mlme_main.c
@@ -2332,6 +2332,9 @@ static void mlme_init_reg_cfg(struct wlan_objmgr_psoc *psoc,
reg->retain_nol_across_regdmn_update =
cfg_get(psoc, CFG_RETAIN_NOL_ACROSS_REG_DOMAIN);
+ reg->enable_nan_on_indoor_channels =
+ cfg_get(psoc, CFG_INDOOR_CHANNEL_SUPPORT_FOR_NAN);
+
mlme_init_acs_avoid_freq_list(psoc, reg);
}
diff --git a/components/mlme/dispatcher/inc/cfg_mlme_reg.h b/components/mlme/dispatcher/inc/cfg_mlme_reg.h
index a65ebd4ff2..793be88de9 100644
--- a/components/mlme/dispatcher/inc/cfg_mlme_reg.h
+++ b/components/mlme/dispatcher/inc/cfg_mlme_reg.h
@@ -102,6 +102,29 @@
CFG_VALUE_OR_DEFAULT, \
"enable/disable ETSI SRD channels in master mode")
+/*
+ *
+ * enable_nan_indoor_channel - Enable Indoor channels for NAN
+ * @Min: 0
+ * @Max: 1
+ * @Default: 0
+ *
+ * This ini is used to support to indoor channels for NAN interface
+ * Customer can config this item to enable/disable NAN in indoor channel
+ *
+ * Related: None
+ *
+ * Supported Feature: NAN
+ *
+ * Usage: External
+ *
+ *
+ */
+#define CFG_INDOOR_CHANNEL_SUPPORT_FOR_NAN CFG_INI_BOOL( \
+ "enable_nan_indoor_channel", \
+ 0, \
+ "enable/disable indoor channels for NAN")
+
/*
*
* fcc_5dot9_ghz_chan_in_master_mode - Enable/disable 5.9 GHz channels in
@@ -315,6 +338,7 @@
CFG(CFG_ENABLE_PENDING_CHAN_LIST_REQ) \
CFG(CFG_ENABLE_11D_IN_WORLD_MODE) \
CFG(CFG_ETSI_SRD_CHAN_IN_MASTER_MODE) \
+ CFG(CFG_INDOOR_CHANNEL_SUPPORT_FOR_NAN) \
CFG(CFG_FCC_5DOT9_GHZ_CHAN_IN_MASTER_MODE) \
CFG(CFG_RESTART_BEACONING_ON_CH_AVOID) \
CFG(CFG_INDOOR_CHANNEL_SUPPORT) \
diff --git a/components/mlme/dispatcher/inc/wlan_mlme_api.h b/components/mlme/dispatcher/inc/wlan_mlme_api.h
index fa939ef59c..dda406dd92 100644
--- a/components/mlme/dispatcher/inc/wlan_mlme_api.h
+++ b/components/mlme/dispatcher/inc/wlan_mlme_api.h
@@ -2036,6 +2036,17 @@ wlan_mlme_get_srd_master_mode_for_vdev(struct wlan_objmgr_psoc *psoc,
enum QDF_OPMODE vdev_opmode,
bool *value);
+/**
+ * wlan_mlme_get_indoor_support_for_nan - Get indoor channel support for NAN
+ * @psoc: pointer to psoc object
+ * @value: pointer to the value which will be filled for the caller
+ *
+ * Return: QDF Status
+ */
+QDF_STATUS
+wlan_mlme_get_indoor_support_for_nan(struct wlan_objmgr_psoc *psoc,
+ bool *value);
+
/**
* wlan_mlme_get_force_sap_enabled() - Get the value of force SAP enabled
* @psoc: psoc context
diff --git a/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h b/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h
index 70ae27cce7..300ac228c5 100644
--- a/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h
+++ b/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h
@@ -2421,6 +2421,7 @@ enum mlme_reg_srd_master_modes {
* @enable_pending_chan_list_req: enables/disables scan channel
* list command to FW till the current scan is complete.
* @retain_nol_across_regdmn_update: Retain the NOL list across the regdomain.
+ * @enable_nan_on_indoor_channels: Enable nan on Indoor channels
*/
struct wlan_mlme_reg {
uint32_t self_gen_frm_pwr;
@@ -2440,6 +2441,7 @@ struct wlan_mlme_reg {
bool ignore_fw_reg_offload_ind;
bool enable_pending_chan_list_req;
bool retain_nol_across_regdmn_update;
+ bool enable_nan_on_indoor_channels;
};
#define IOT_AGGR_INFO_MAX_NUM 32
diff --git a/components/mlme/dispatcher/src/wlan_mlme_api.c b/components/mlme/dispatcher/src/wlan_mlme_api.c
index 5663a6d00f..cb3db4a8bf 100644
--- a/components/mlme/dispatcher/src/wlan_mlme_api.c
+++ b/components/mlme/dispatcher/src/wlan_mlme_api.c
@@ -3274,6 +3274,24 @@ wlan_mlme_get_vht20_mcs9(struct wlan_objmgr_psoc *psoc, bool *value)
return QDF_STATUS_SUCCESS;
}
+QDF_STATUS
+wlan_mlme_get_indoor_support_for_nan(struct wlan_objmgr_psoc *psoc,
+ bool *value)
+{
+ struct wlan_mlme_psoc_ext_obj *mlme_obj;
+
+ mlme_obj = mlme_get_psoc_ext_obj(psoc);
+ if (!mlme_obj) {
+ *value = false;
+ mlme_legacy_err("Failed to get MLME Obj");
+ return QDF_STATUS_E_INVAL;
+ }
+
+ *value = mlme_obj->cfg.reg.enable_nan_on_indoor_channels;
+
+ return QDF_STATUS_SUCCESS;
+}
+
QDF_STATUS
wlan_mlme_get_srd_master_mode_for_vdev(struct wlan_objmgr_psoc *psoc,
enum QDF_OPMODE vdev_opmode,
diff --git a/components/nan/core/inc/wlan_nan_api.h b/components/nan/core/inc/wlan_nan_api.h
index bba21cca9b..a37bcf323a 100644
--- a/components/nan/core/inc/wlan_nan_api.h
+++ b/components/nan/core/inc/wlan_nan_api.h
@@ -215,6 +215,18 @@ QDF_STATUS nan_disable_cleanup(struct wlan_objmgr_psoc *psoc);
* Return: True if beamforming is supported, false if not.
*/
bool wlan_nan_is_beamforming_supported(struct wlan_objmgr_psoc *psoc);
+
+/**
+ * wlan_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.
+ *
+ * Return: True if NAN is allowed on the given frequency
+ */
+bool wlan_is_nan_allowed_on_freq(struct wlan_objmgr_pdev *pdev, uint32_t freq);
+
#else /* WLAN_FEATURE_NAN */
static inline QDF_STATUS nan_init(void)
{
@@ -266,5 +278,11 @@ bool wlan_nan_is_beamforming_supported(struct wlan_objmgr_psoc *psoc)
{
return false;
}
+
+static inline
+bool wlan_is_nan_allowed_on_freq(struct wlan_objmgr_pdev *pdev, uint32_t freq)
+{
+ return false;
+}
#endif /* WLAN_FEATURE_NAN */
#endif /* _WLAN_NAN_API_H_ */
diff --git a/components/nan/core/src/nan_api.c b/components/nan/core/src/nan_api.c
index 00d4d9ca5e..993c0ec159 100644
--- a/components/nan/core/src/nan_api.c
+++ b/components/nan/core/src/nan_api.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016-2020 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
@@ -30,6 +30,7 @@
#include "wlan_objmgr_pdev_obj.h"
#include "wlan_objmgr_vdev_obj.h"
#include "nan_ucfg_api.h"
+#include
static QDF_STATUS nan_psoc_obj_created_notification(
struct wlan_objmgr_psoc *psoc, void *arg_list)
@@ -408,3 +409,24 @@ QDF_STATUS nan_psoc_disable(struct wlan_objmgr_psoc *psoc)
return QDF_STATUS_SUCCESS;
}
+
+bool wlan_is_nan_allowed_on_freq(struct wlan_objmgr_pdev *pdev, uint32_t freq)
+{
+ bool nan_allowed = true;
+
+ /* Check for SRD channels */
+ if (wlan_reg_is_etsi13_srd_chan_for_freq(pdev, freq))
+ wlan_mlme_get_srd_master_mode_for_vdev(wlan_pdev_get_psoc(pdev),
+ QDF_NAN_DISC_MODE,
+ &nan_allowed);
+
+ /* Check for Indoor channels */
+ if (wlan_reg_is_freq_indoor(pdev, freq))
+ wlan_mlme_get_indoor_support_for_nan(wlan_pdev_get_psoc(pdev),
+ &nan_allowed);
+ /* Check for dfs only if channel is not indoor */
+ else if (wlan_reg_is_dfs_for_freq(pdev, freq))
+ nan_allowed = false;
+
+ return nan_allowed;
+}
diff --git a/components/nan/dispatcher/src/nan_ucfg_api.c b/components/nan/dispatcher/src/nan_ucfg_api.c
index c44700e32c..9a5b4f3d48 100644
--- a/components/nan/dispatcher/src/nan_ucfg_api.c
+++ b/components/nan/dispatcher/src/nan_ucfg_api.c
@@ -1304,15 +1304,5 @@ QDF_STATUS ucfg_nan_disable_ind_to_userspace(struct wlan_objmgr_psoc *psoc)
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;
+ return wlan_is_nan_allowed_on_freq(pdev, freq);
}