diff --git a/components/nan/core/src/nan_main_i.h b/components/nan/core/src/nan_main_i.h index 4e71480d39..4c8e55db0b 100644 --- a/components/nan/core/src/nan_main_i.h +++ b/components/nan/core/src/nan_main_i.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2019 The Linux Foundation. All rights reserved. + * Copyright (c) 2012-2020 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 @@ -81,12 +81,14 @@ enum nan_disc_state { * @dp_enable: NAN Datapath feature enable * @ndi_mac_randomize: Randomize NAN datapath interface MAC * @ndp_inactivity_timeout: NDP inactivity timeout + * @nan_separate_iface_support: To supports separate iface creation for NAN */ struct nan_cfg_params { bool enable; bool dp_enable; bool ndi_mac_randomize; uint16_t ndp_inactivity_timeout; + bool nan_separate_iface_support; }; /** diff --git a/components/nan/dispatcher/inc/cfg_nan.h b/components/nan/dispatcher/inc/cfg_nan.h index 3d8564105e..eb29cb8278 100644 --- a/components/nan/dispatcher/inc/cfg_nan.h +++ b/components/nan/dispatcher/inc/cfg_nan.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved. + * Copyright (c) 2018-2020 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 @@ -49,6 +49,30 @@ #define CFG_NAN_ENABLE CFG_INI_BOOL("gEnableNanSupport", \ 0, \ "Enable NAN Support") + +/* + * + * nan_separate_iface_support: Separate iface creation for NAN + * @Min: 0 + * @Max: 1 + * @Default: 1 + * + * Value is 1 when Host HDD supports separate iface creation + * for NAN. + * + * Related: None + * + * Supported Feature: NAN + * + * Usage: External + * + * + */ +#define CFG_NAN_SEPARATE_IFACE_SUPP CFG_INI_BOOL("nan_separate_iface_support", \ + 0, \ + "Seperate iface for NAN") + + /* * * genable_nan_datapath - Enable NaN data path feature. NaN data path @@ -122,7 +146,8 @@ #define CFG_NAN_DISC CFG(CFG_NAN_ENABLE) #define CFG_NAN_DP CFG(CFG_NAN_DATAPATH_ENABLE) \ CFG(CFG_NAN_RANDOMIZE_NDI_MAC) \ - CFG(CFG_NAN_NDP_INACTIVITY_TIMEOUT) + CFG(CFG_NAN_NDP_INACTIVITY_TIMEOUT) \ + CFG(CFG_NAN_SEPARATE_IFACE_SUPP) #else #define CFG_NAN_DISC #define CFG_NAN_DP diff --git a/components/nan/dispatcher/inc/nan_ucfg_api.h b/components/nan/dispatcher/inc/nan_ucfg_api.h index e3f6598497..1b94239d56 100644 --- a/components/nan/dispatcher/inc/nan_ucfg_api.h +++ b/components/nan/dispatcher/inc/nan_ucfg_api.h @@ -369,6 +369,15 @@ bool ucfg_nan_is_sta_ndp_concurrency_allowed(struct wlan_objmgr_psoc *psoc, */ bool ucfg_nan_is_vdev_creation_allowed(struct wlan_objmgr_psoc *psoc); +/** + * ucfg_nan_get_is_separate_nan_iface() - get is_separate_nan_iface value + * @psoc: pointer to psoc object + * + * Return: True if host supports separate vdev for NAN, false otherwise + */ +bool +ucfg_nan_get_is_separate_nan_iface(struct wlan_objmgr_psoc *psoc); + /** * ucfg_disable_nan_discovery() - Disable NAN discovery * @psoc: pointer to psoc object @@ -441,6 +450,12 @@ bool ucfg_nan_is_vdev_creation_allowed(struct wlan_objmgr_psoc *psoc) return false; } +static inline +bool ucfg_nan_get_is_separate_nan_iface(struct wlan_objmgr_psoc *psoc) +{ + return false; +} + static inline QDF_STATUS ucfg_disable_nan_discovery(struct wlan_objmgr_psoc *psoc, uint8_t *data, uint32_t data_len) diff --git a/components/nan/dispatcher/src/nan_ucfg_api.c b/components/nan/dispatcher/src/nan_ucfg_api.c index 1338761a0a..479c22297d 100644 --- a/components/nan/dispatcher/src/nan_ucfg_api.c +++ b/components/nan/dispatcher/src/nan_ucfg_api.c @@ -66,6 +66,9 @@ static void nan_cfg_dp_init(struct wlan_objmgr_psoc *psoc, cfg_get(psoc, CFG_NAN_RANDOMIZE_NDI_MAC); nan_obj->cfg_param.ndp_inactivity_timeout = cfg_get(psoc, CFG_NAN_NDP_INACTIVITY_TIMEOUT); + nan_obj->cfg_param.nan_separate_iface_support = + cfg_get(psoc, CFG_NAN_SEPARATE_IFACE_SUPP); + } #else static void nan_cfg_init(struct wlan_objmgr_psoc *psoc, @@ -1046,6 +1049,17 @@ bool ucfg_nan_is_vdev_creation_allowed(struct wlan_objmgr_psoc *psoc) return psoc_nan_obj->nan_caps.nan_vdev_allowed; } +bool ucfg_nan_get_is_separate_nan_iface(struct wlan_objmgr_psoc *psoc) +{ + struct nan_psoc_priv_obj *nan_obj = nan_get_psoc_priv_obj(psoc); + + if (!nan_obj) { + nan_err("NAN obj null"); + return false; + } + return nan_obj->cfg_param.nan_separate_iface_support; +} + QDF_STATUS ucfg_disable_nan_discovery(struct wlan_objmgr_psoc *psoc, uint8_t *data, uint32_t data_len) { diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c index ba5f764419..623282c765 100644 --- a/core/hdd/src/wlan_hdd_main.c +++ b/core/hdd/src/wlan_hdd_main.c @@ -12866,7 +12866,12 @@ hdd_open_adapters_for_mission_mode(struct hdd_context *hdd_ctx) if (status) goto err_close_adapters; - if (ucfg_nan_is_vdev_creation_allowed(hdd_ctx->psoc)) { + /* + * Create separate interface (wifi-aware0) for NAN. All NAN commands + * should go on this new interface. + */ + if (ucfg_nan_is_vdev_creation_allowed(hdd_ctx->psoc) && + ucfg_nan_get_is_separate_nan_iface(hdd_ctx->psoc)) { mac_addr = wlan_hdd_get_intf_addr(hdd_ctx, QDF_NAN_DISC_MODE); status = hdd_open_adapter_no_trans(hdd_ctx, QDF_NAN_DISC_MODE, "wifi-aware%d", mac_addr); diff --git a/core/wma/src/wma_main.c b/core/wma/src/wma_main.c index 0492dd4f93..22de09065d 100644 --- a/core/wma/src/wma_main.c +++ b/core/wma/src/wma_main.c @@ -5392,6 +5392,10 @@ static int wma_update_hdd_cfg(tp_wma_handle wma_handle) return -EINVAL; } + wlan_res_cfg->nan_separate_iface_support = + ucfg_nan_is_vdev_creation_allowed(wma_handle->psoc) && + ucfg_nan_get_is_separate_nan_iface(wma_handle->psoc); + service_ext_param = target_psoc_get_service_ext_param(tgt_hdl); wmi_handle = get_wmi_unified_hdl_from_psoc(wma_handle->psoc);