diff --git a/components/nan/core/src/nan_main_i.h b/components/nan/core/src/nan_main_i.h index 13dbf5221cdc..66023decd3b4 100644 --- a/components/nan/core/src/nan_main_i.h +++ b/components/nan/core/src/nan_main_i.h @@ -80,11 +80,13 @@ enum nan_disc_state { * @enable: NAN feature enable * @dp_enable: NAN Datapath feature enable * @ndi_mac_randomize: Randomize NAN datapath interface MAC + * @ndp_inactivity_timeout: NDP inactivity timeout */ struct nan_cfg_params { bool enable; bool dp_enable; bool ndi_mac_randomize; + uint16_t ndp_inactivity_timeout; }; /** diff --git a/components/nan/dispatcher/inc/cfg_nan.h b/components/nan/dispatcher/inc/cfg_nan.h index 4a45c4271eb1..3d8564105e7b 100644 --- a/components/nan/dispatcher/inc/cfg_nan.h +++ b/components/nan/dispatcher/inc/cfg_nan.h @@ -93,10 +93,36 @@ 1, \ "Enable NAN MAC Randomization") +/* + * + * ndp_inactivity_timeout - To configure duration of how many seconds + * without TX/RX data traffic, NDI vdev can kickout the connected + * peer(i.e. NDP Termination). + * + * @Min: 0 + * @Max: 1800 + * @Default: 60 + * + * Related: None + * + * Supported Feature: NAN + * + * Usage: External + * + * + */ +#define CFG_NAN_NDP_INACTIVITY_TIMEOUT CFG_INI_UINT("ndp_inactivity_timeout", \ + 0, \ + 1800, \ + 60, \ + CFG_VALUE_OR_DEFAULT, \ + "NDP Auto Terminate time") + #ifdef WLAN_FEATURE_NAN #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_RANDOMIZE_NDI_MAC) \ + CFG(CFG_NAN_NDP_INACTIVITY_TIMEOUT) #else #define CFG_NAN_DISC #define CFG_NAN_DP diff --git a/components/nan/dispatcher/inc/cfg_nan_api.h b/components/nan/dispatcher/inc/cfg_nan_api.h index 5561907acaff..0e1d26c24bad 100644 --- a/components/nan/dispatcher/inc/cfg_nan_api.h +++ b/components/nan/dispatcher/inc/cfg_nan_api.h @@ -53,6 +53,17 @@ bool cfg_nan_get_datapath_enable(struct wlan_objmgr_psoc *psoc); * This function returns NAN Datapath Interface MAC randomization status */ bool cfg_nan_get_ndi_mac_randomize(struct wlan_objmgr_psoc *psoc); + +/** + * cfg_nan_get_ndp_inactivity_timeout() - get NDP inactivity timeout value + * @psoc: pointer to psoc object + * @val: pointer to the value where inactivity timeout has to be copied to + * + * Return: QDF_STATUS + */ +QDF_STATUS cfg_nan_get_ndp_inactivity_timeout(struct wlan_objmgr_psoc *psoc, + uint16_t *val); + #else static inline bool cfg_nan_get_enable(struct wlan_objmgr_psoc *psoc) { @@ -68,6 +79,13 @@ static inline bool cfg_nan_get_ndi_mac_randomize(struct wlan_objmgr_psoc *psoc) { return false; } + +static inline +QDF_STATUS cfg_nan_get_ndp_inactivity_timeout(struct wlan_objmgr_psoc *psoc, + uint16_t *val) +{ + return QDF_STATUS_SUCCESS; +} #endif #endif diff --git a/components/nan/dispatcher/src/cfg_nan.c b/components/nan/dispatcher/src/cfg_nan.c index fd113fd54275..78ecf079086d 100644 --- a/components/nan/dispatcher/src/cfg_nan.c +++ b/components/nan/dispatcher/src/cfg_nan.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018 The Linux Foundation. All rights reserved. + * Copyright (c) 2018-2019 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 @@ -67,3 +67,17 @@ bool cfg_nan_get_ndi_mac_randomize(struct wlan_objmgr_psoc *psoc) return nan_obj->cfg_param.ndi_mac_randomize; } +QDF_STATUS cfg_nan_get_ndp_inactivity_timeout(struct wlan_objmgr_psoc *psoc, + uint16_t *val) +{ + struct nan_psoc_priv_obj *nan_obj = cfg_nan_get_priv_obj(psoc); + + if (!nan_obj) { + nan_err("NAN obj null"); + return QDF_STATUS_E_INVAL; + } + + *val = nan_obj->cfg_param.ndp_inactivity_timeout; + return QDF_STATUS_SUCCESS; +} + diff --git a/components/nan/dispatcher/src/nan_ucfg_api.c b/components/nan/dispatcher/src/nan_ucfg_api.c index 6ffa7c4da245..9d1bf6ee0de4 100644 --- a/components/nan/dispatcher/src/nan_ucfg_api.c +++ b/components/nan/dispatcher/src/nan_ucfg_api.c @@ -64,6 +64,8 @@ static void nan_cfg_dp_init(struct wlan_objmgr_psoc *psoc, CFG_NAN_DATAPATH_ENABLE); nan_obj->cfg_param.ndi_mac_randomize = cfg_get(psoc, CFG_NAN_RANDOMIZE_NDI_MAC); + nan_obj->cfg_param.ndp_inactivity_timeout = + cfg_get(psoc, CFG_NAN_NDP_INACTIVITY_TIMEOUT); } #else static void nan_cfg_init(struct wlan_objmgr_psoc *psoc, diff --git a/core/hdd/src/wlan_hdd_nan_datapath.c b/core/hdd/src/wlan_hdd_nan_datapath.c index 7097e3129170..bed712318154 100644 --- a/core/hdd/src/wlan_hdd_nan_datapath.c +++ b/core/hdd/src/wlan_hdd_nan_datapath.c @@ -681,6 +681,7 @@ void hdd_ndi_drv_ndi_create_rsp_handler(uint8_t vdev_id, struct hdd_station_ctx *sta_ctx; struct csr_roam_info *roam_info; struct bss_description tmp_bss_descp = {0}; + uint16_t ndp_inactivity_timeout = 0; struct qdf_mac_addr bc_mac_addr = QDF_MAC_ADDR_BCAST_INIT; uint8_t sta_id; @@ -720,6 +721,14 @@ void hdd_ndi_drv_ndi_create_rsp_handler(uint8_t vdev_id, wlan_hdd_netif_queue_control(adapter, WLAN_START_ALL_NETIF_QUEUE_N_CARRIER, WLAN_CONTROL_PATH); + + if (QDF_IS_STATUS_ERROR(cfg_nan_get_ndp_inactivity_timeout( + hdd_ctx->psoc, &ndp_inactivity_timeout))) + hdd_err("Failed to fetch inactivity timeout value"); + + sme_cli_set_command(adapter->vdev_id, + WMI_VDEV_PARAM_NDP_INACTIVITY_TIMEOUT, + ndp_inactivity_timeout, VDEV_CMD); } else { hdd_alert("NDI interface creation failed with reason %d", ndi_rsp->reason /* create_reason */);