qcacld-3.0: Create TWT context in peer private object

Create TWT context in peer object to store the TWT session
related parameters. Introduce mlme api to get/set various
twt session parameters for the peer.
Block the below commands till TWT setup is complete.
TWT GET
TWT Pause
TWT resume
TWT terminate

Add new files for TWT specific functionality in MLME component:
components/mlme/core/inc/wlan_mlme_twt_api.h
components/mlme/dispatcher/inc/wlan_mlme_twt_public_struct.h
components/mlme/dispatcher/inc/wlan_mlme_twt_ucfg_api.h
components/mlme/core/src/wlan_mlme_twt_api.c
components/mlme/dispatcher/src/wlan_mlme_twt_ucfg_api.c

Also return error to userspace if back to back TWT setup
command is received before TWT setup response is received from
firmware or already TWT setup is complete for given dialog id

Change-Id: I61e24dd41dc9dcb78fdfe33ef8fa0ecb374a4a72
CRs-Fixed: 2847213
This commit is contained in:
Pragaspathi Thilagaraj
2020-12-17 02:26:29 +05:30
committed by snandini
parent 1291654f4c
commit 1a9311161a
17 changed files with 1626 additions and 561 deletions

View File

@@ -626,9 +626,8 @@ QDF_STATUS mlme_update_tgt_he_caps_in_cfg(struct wlan_objmgr_psoc *psoc,
mlme_obj->cfg.he_caps.dot11_he_cap.broadcast_twt);
mlme_obj->cfg.he_caps.dot11_he_cap.broadcast_twt = value;
value = QDF_MIN(he_cap->flex_twt_sched,
mlme_obj->cfg.he_caps.dot11_he_cap.flex_twt_sched);
mlme_obj->cfg.he_caps.dot11_he_cap.flex_twt_sched = value;
mlme_obj->cfg.he_caps.dot11_he_cap.flex_twt_sched =
he_cap->flex_twt_sched;
mlme_obj->cfg.he_caps.dot11_he_cap.ba_32bit_bitmap =
he_cap->ba_32bit_bitmap;
@@ -4708,16 +4707,3 @@ bool wlan_mlme_is_sta_mon_conc_supported(struct wlan_objmgr_psoc *psoc)
return false;
}
#ifdef WLAN_SUPPORT_TWT
bool mlme_is_twt_enabled(struct wlan_objmgr_psoc *psoc)
{
struct wlan_mlme_psoc_ext_obj *mlme_obj;
mlme_obj = mlme_get_psoc_ext_obj(psoc);
if (!mlme_obj)
return cfg_default(CFG_ENABLE_TWT);
return mlme_obj->cfg.twt_cfg.is_twt_enabled;
}
#endif

View File

@@ -0,0 +1,270 @@
/*
* Copyright (c) 2018-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 above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/**
* DOC: define UCFG APIs exposed for TWT by the mlme component
*/
#include "wlan_mlme_main.h"
#include "wlan_mlme_api.h"
#include "wlan_mlme_ucfg_api.h"
#include "cfg_mlme_twt.h"
#include "wlan_mlme_twt_ucfg_api.h"
#if defined(WLAN_SUPPORT_TWT) && defined(WLAN_FEATURE_11AX)
QDF_STATUS
ucfg_mlme_get_twt_requestor(struct wlan_objmgr_psoc *psoc,
bool *val)
{
struct wlan_mlme_psoc_ext_obj *mlme_obj;
mlme_obj = mlme_get_psoc_ext_obj(psoc);
if (!mlme_obj) {
*val = cfg_default(CFG_TWT_REQUESTOR);
return QDF_STATUS_E_INVAL;
}
*val = mlme_obj->cfg.he_caps.dot11_he_cap.twt_request;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
ucfg_mlme_set_twt_requestor(struct wlan_objmgr_psoc *psoc,
bool val)
{
struct wlan_mlme_psoc_ext_obj *mlme_obj;
mlme_obj = mlme_get_psoc_ext_obj(psoc);
if (!mlme_obj)
return QDF_STATUS_E_INVAL;
mlme_obj->cfg.he_caps.dot11_he_cap.twt_request = val;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
ucfg_mlme_get_twt_responder(struct wlan_objmgr_psoc *psoc,
bool *val)
{
struct wlan_mlme_psoc_ext_obj *mlme_obj;
mlme_obj = mlme_get_psoc_ext_obj(psoc);
if (!mlme_obj) {
*val = cfg_default(CFG_TWT_RESPONDER);
return QDF_STATUS_E_INVAL;
}
*val = mlme_obj->cfg.he_caps.dot11_he_cap.twt_responder;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
ucfg_mlme_set_twt_responder(struct wlan_objmgr_psoc *psoc,
bool val)
{
struct wlan_mlme_psoc_ext_obj *mlme_obj;
mlme_obj = mlme_get_psoc_ext_obj(psoc);
if (!mlme_obj)
return QDF_STATUS_E_INVAL;
mlme_obj->cfg.he_caps.dot11_he_cap.twt_responder = val;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
ucfg_mlme_get_bcast_twt(struct wlan_objmgr_psoc *psoc,
bool *val)
{
struct wlan_mlme_psoc_ext_obj *mlme_obj;
mlme_obj = mlme_get_psoc_ext_obj(psoc);
if (!mlme_obj) {
*val = cfg_default(CFG_BCAST_TWT);
return QDF_STATUS_E_INVAL;
}
*val = mlme_obj->cfg.he_caps.dot11_he_cap.broadcast_twt;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
ucfg_mlme_set_bcast_twt(struct wlan_objmgr_psoc *psoc,
bool val)
{
struct wlan_mlme_psoc_ext_obj *mlme_obj;
mlme_obj = mlme_get_psoc_ext_obj(psoc);
if (!mlme_obj)
return QDF_STATUS_E_INVAL;
mlme_obj->cfg.he_caps.dot11_he_cap.broadcast_twt = val;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
ucfg_mlme_get_twt_congestion_timeout(struct wlan_objmgr_psoc *psoc,
uint32_t *val)
{
struct wlan_mlme_psoc_ext_obj *mlme_obj;
mlme_obj = mlme_get_psoc_ext_obj(psoc);
if (!mlme_obj) {
*val = cfg_default(CFG_TWT_CONGESTION_TIMEOUT);
return QDF_STATUS_E_INVAL;
}
*val = mlme_obj->cfg.twt_cfg.twt_congestion_timeout;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
ucfg_mlme_set_twt_congestion_timeout(struct wlan_objmgr_psoc *psoc,
uint32_t val)
{
struct wlan_mlme_psoc_ext_obj *mlme_obj;
mlme_obj = mlme_get_psoc_ext_obj(psoc);
if (!mlme_obj)
return QDF_STATUS_E_INVAL;
mlme_obj->cfg.twt_cfg.twt_congestion_timeout = val;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
ucfg_mlme_set_enable_twt(struct wlan_objmgr_psoc *psoc,
bool val)
{
struct wlan_mlme_psoc_ext_obj *mlme_obj;
mlme_obj = mlme_get_psoc_ext_obj(psoc);
if (!mlme_obj)
return QDF_STATUS_E_INVAL;
mlme_obj->cfg.twt_cfg.is_twt_enabled = val;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
ucfg_mlme_get_twt_bcast_requestor(struct wlan_objmgr_psoc *psoc,
bool *val)
{
struct wlan_mlme_psoc_ext_obj *mlme_obj;
mlme_obj = mlme_get_psoc_ext_obj(psoc);
if (!mlme_obj) {
uint32_t b_req_res;
b_req_res = cfg_default(CFG_BCAST_TWT_REQ_RESP);
*val = CFG_TWT_GET_BCAST_REQ(b_req_res);
return QDF_STATUS_E_INVAL;
}
*val = mlme_obj->cfg.twt_cfg.is_bcast_requestor_enabled;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
ucfg_mlme_get_twt_bcast_responder(struct wlan_objmgr_psoc *psoc,
bool *val)
{
struct wlan_mlme_psoc_ext_obj *mlme_obj;
mlme_obj = mlme_get_psoc_ext_obj(psoc);
if (!mlme_obj) {
uint32_t b_req_res;
b_req_res = cfg_default(CFG_BCAST_TWT_REQ_RESP);
*val = CFG_TWT_GET_BCAST_RES(b_req_res);
return QDF_STATUS_E_INVAL;
}
*val = mlme_obj->cfg.twt_cfg.is_bcast_responder_enabled;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
ucfg_mlme_set_twt_bcast_requestor(struct wlan_objmgr_psoc *psoc,
bool val)
{
struct wlan_mlme_psoc_ext_obj *mlme_obj;
mlme_obj = mlme_get_psoc_ext_obj(psoc);
if (!mlme_obj)
return QDF_STATUS_E_INVAL;
mlme_obj->cfg.twt_cfg.is_bcast_requestor_enabled = val;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
ucfg_mlme_set_twt_bcast_responder(struct wlan_objmgr_psoc *psoc,
bool val)
{
struct wlan_mlme_psoc_ext_obj *mlme_obj;
mlme_obj = mlme_get_psoc_ext_obj(psoc);
if (!mlme_obj)
return QDF_STATUS_E_INVAL;
mlme_obj->cfg.twt_cfg.is_bcast_responder_enabled = val;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
ucfg_mlme_set_twt_bcast_requestor_tgt_cap(struct wlan_objmgr_psoc *psoc,
bool val)
{
struct wlan_mlme_psoc_ext_obj *mlme_obj;
mlme_obj = mlme_get_psoc_ext_obj(psoc);
if (!mlme_obj)
return QDF_STATUS_E_INVAL;
mlme_obj->cfg.twt_cfg.bcast_requestor_tgt_cap = val;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
ucfg_mlme_set_twt_bcast_responder_tgt_cap(struct wlan_objmgr_psoc *psoc,
bool val)
{
struct wlan_mlme_psoc_ext_obj *mlme_obj;
mlme_obj = mlme_get_psoc_ext_obj(psoc);
if (!mlme_obj)
return QDF_STATUS_E_INVAL;
mlme_obj->cfg.twt_cfg.bcast_responder_tgt_cap = val;
return QDF_STATUS_SUCCESS;
}
#endif

View File

@@ -508,251 +508,6 @@ ucfg_mlme_set_pmkid_modes(struct wlan_objmgr_psoc *psoc,
return QDF_STATUS_SUCCESS;
}
#if defined(WLAN_SUPPORT_TWT) && defined(WLAN_FEATURE_11AX)
QDF_STATUS
ucfg_mlme_get_twt_requestor(struct wlan_objmgr_psoc *psoc,
bool *val)
{
struct wlan_mlme_psoc_ext_obj *mlme_obj;
mlme_obj = mlme_get_psoc_ext_obj(psoc);
if (!mlme_obj) {
*val = cfg_default(CFG_TWT_REQUESTOR);
return QDF_STATUS_E_INVAL;
}
*val = mlme_obj->cfg.he_caps.dot11_he_cap.twt_request;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
ucfg_mlme_set_twt_requestor(struct wlan_objmgr_psoc *psoc,
bool val)
{
struct wlan_mlme_psoc_ext_obj *mlme_obj;
mlme_obj = mlme_get_psoc_ext_obj(psoc);
if (!mlme_obj)
return QDF_STATUS_E_INVAL;
mlme_obj->cfg.he_caps.dot11_he_cap.twt_request = val;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
ucfg_mlme_get_twt_responder(struct wlan_objmgr_psoc *psoc,
bool *val)
{
struct wlan_mlme_psoc_ext_obj *mlme_obj;
mlme_obj = mlme_get_psoc_ext_obj(psoc);
if (!mlme_obj) {
*val = cfg_default(CFG_TWT_RESPONDER);
return QDF_STATUS_E_INVAL;
}
*val = mlme_obj->cfg.he_caps.dot11_he_cap.twt_responder;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
ucfg_mlme_set_twt_responder(struct wlan_objmgr_psoc *psoc,
bool val)
{
struct wlan_mlme_psoc_ext_obj *mlme_obj;
mlme_obj = mlme_get_psoc_ext_obj(psoc);
if (!mlme_obj)
return QDF_STATUS_E_INVAL;
mlme_obj->cfg.he_caps.dot11_he_cap.twt_responder = val;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
ucfg_mlme_get_bcast_twt(struct wlan_objmgr_psoc *psoc,
bool *val)
{
struct wlan_mlme_psoc_ext_obj *mlme_obj;
mlme_obj = mlme_get_psoc_ext_obj(psoc);
if (!mlme_obj) {
*val = cfg_default(CFG_BCAST_TWT);
return QDF_STATUS_E_INVAL;
}
*val = mlme_obj->cfg.he_caps.dot11_he_cap.broadcast_twt;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
ucfg_mlme_set_bcast_twt(struct wlan_objmgr_psoc *psoc,
bool val)
{
struct wlan_mlme_psoc_ext_obj *mlme_obj;
mlme_obj = mlme_get_psoc_ext_obj(psoc);
if (!mlme_obj)
return QDF_STATUS_E_INVAL;
mlme_obj->cfg.he_caps.dot11_he_cap.broadcast_twt = val;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
ucfg_mlme_get_twt_congestion_timeout(struct wlan_objmgr_psoc *psoc,
uint32_t *val)
{
struct wlan_mlme_psoc_ext_obj *mlme_obj;
mlme_obj = mlme_get_psoc_ext_obj(psoc);
if (!mlme_obj) {
*val = cfg_default(CFG_TWT_CONGESTION_TIMEOUT);
return QDF_STATUS_E_INVAL;
}
*val = mlme_obj->cfg.twt_cfg.twt_congestion_timeout;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
ucfg_mlme_set_twt_congestion_timeout(struct wlan_objmgr_psoc *psoc,
uint32_t val)
{
struct wlan_mlme_psoc_ext_obj *mlme_obj;
mlme_obj = mlme_get_psoc_ext_obj(psoc);
if (!mlme_obj)
return QDF_STATUS_E_INVAL;
mlme_obj->cfg.twt_cfg.twt_congestion_timeout = val;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
ucfg_mlme_set_enable_twt(struct wlan_objmgr_psoc *psoc,
bool val)
{
struct wlan_mlme_psoc_ext_obj *mlme_obj;
mlme_obj = mlme_get_psoc_ext_obj(psoc);
if (!mlme_obj)
return QDF_STATUS_E_INVAL;
mlme_obj->cfg.twt_cfg.is_twt_enabled = val;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
ucfg_mlme_get_twt_bcast_requestor(struct wlan_objmgr_psoc *psoc,
bool *val)
{
struct wlan_mlme_psoc_ext_obj *mlme_obj;
mlme_obj = mlme_get_psoc_ext_obj(psoc);
if (!mlme_obj) {
uint32_t b_req_res;
b_req_res = cfg_default(CFG_BCAST_TWT_REQ_RESP);
*val = CFG_TWT_GET_BCAST_REQ(b_req_res);
return QDF_STATUS_E_INVAL;
}
*val = mlme_obj->cfg.twt_cfg.is_bcast_requestor_enabled;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
ucfg_mlme_get_twt_bcast_responder(struct wlan_objmgr_psoc *psoc,
bool *val)
{
struct wlan_mlme_psoc_ext_obj *mlme_obj;
mlme_obj = mlme_get_psoc_ext_obj(psoc);
if (!mlme_obj) {
uint32_t b_req_res;
b_req_res = cfg_default(CFG_BCAST_TWT_REQ_RESP);
*val = CFG_TWT_GET_BCAST_RES(b_req_res);
return QDF_STATUS_E_INVAL;
}
*val = mlme_obj->cfg.twt_cfg.is_bcast_responder_enabled;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
ucfg_mlme_set_twt_bcast_requestor(struct wlan_objmgr_psoc *psoc,
bool val)
{
struct wlan_mlme_psoc_ext_obj *mlme_obj;
mlme_obj = mlme_get_psoc_ext_obj(psoc);
if (!mlme_obj)
return QDF_STATUS_E_INVAL;
mlme_obj->cfg.twt_cfg.is_bcast_requestor_enabled = val;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
ucfg_mlme_set_twt_bcast_responder(struct wlan_objmgr_psoc *psoc,
bool val)
{
struct wlan_mlme_psoc_ext_obj *mlme_obj;
mlme_obj = mlme_get_psoc_ext_obj(psoc);
if (!mlme_obj)
return QDF_STATUS_E_INVAL;
mlme_obj->cfg.twt_cfg.is_bcast_responder_enabled = val;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
ucfg_mlme_set_twt_bcast_requestor_tgt_cap(struct wlan_objmgr_psoc *psoc,
bool val)
{
struct wlan_mlme_psoc_ext_obj *mlme_obj;
mlme_obj = mlme_get_psoc_ext_obj(psoc);
if (!mlme_obj)
return QDF_STATUS_E_INVAL;
mlme_obj->cfg.twt_cfg.bcast_requestor_tgt_cap = val;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
ucfg_mlme_set_twt_bcast_responder_tgt_cap(struct wlan_objmgr_psoc *psoc,
bool val)
{
struct wlan_mlme_psoc_ext_obj *mlme_obj;
mlme_obj = mlme_get_psoc_ext_obj(psoc);
if (!mlme_obj)
return QDF_STATUS_E_INVAL;
mlme_obj->cfg.twt_cfg.bcast_responder_tgt_cap = val;
return QDF_STATUS_SUCCESS;
}
#endif
QDF_STATUS
ucfg_mlme_get_dot11p_mode(struct wlan_objmgr_psoc *psoc,
enum dot11p_mode *out_mode)