From 77afc580542a9f022a68dab1d05d14e6e59c2b10 Mon Sep 17 00:00:00 2001 From: Utkarsh Bhatnagar Date: Wed, 1 Jun 2022 08:33:06 +0530 Subject: [PATCH] qcacld-3.0: Add check for allowing TDLS 6GHz Add check for allowing TDLS 6 GHz such as TDLS is only allowed for channels which supports VLP Power level. Change-Id: I32ea3fb61deed2ff236849ef22894d5cb791dd84 CRs-Fixed: 3223617 --- components/tdls/core/src/wlan_tdls_main.c | 61 ++++++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-) diff --git a/components/tdls/core/src/wlan_tdls_main.c b/components/tdls/core/src/wlan_tdls_main.c index a4624f03f1..a6e3ddcc57 100644 --- a/components/tdls/core/src/wlan_tdls_main.c +++ b/components/tdls/core/src/wlan_tdls_main.c @@ -32,7 +32,8 @@ #include "wlan_policy_mgr_public_struct.h" #include "wlan_policy_mgr_api.h" #include "wlan_scan_ucfg_api.h" - +#include "wlan_tdls_ucfg_api.h" +#include "wlan_cm_roam_api.h" /* Global tdls soc pvt object * this is useful for some functions which does not receive either vdev or psoc @@ -843,11 +844,64 @@ QDF_STATUS tdls_update_fw_tdls_state(struct tdls_soc_priv_obj *tdls_soc_obj, return status; } +#ifdef WLAN_FEATURE_11AX +static bool tdls_is_6g_freq_allowed(struct wlan_objmgr_vdev *vdev, + qdf_freq_t freq) +{ + struct wlan_objmgr_pdev *pdev = wlan_vdev_get_pdev(vdev); + struct regulatory_channel chan[NUM_CHANNELS] = {0}; + bool is_allowed = false; + uint8_t country_code[REG_ALPHA2_LEN + 1]; + uint8_t chn_idx, num_chan = 0; + uint8_t band_mask = BIT(REG_BAND_6G); + + /* No power check is required for non 6 Ghz channel */ + + if (!wlan_reg_is_6ghz_chan_freq(freq)) + goto error; + + if (!pdev) + goto error; + + wlan_cm_get_country_code(pdev, wlan_vdev_get_id(vdev), country_code); + if (!wlan_reg_ctry_support_vlp(country_code)) + goto error; + + num_chan = wlan_reg_get_band_channel_list_for_pwrmode(pdev, + band_mask, + chan, + REG_CLI_DEF_VLP); + tdls_debug("Country IE:%c%c freq %d num_chan %d", country_code[0], + country_code[1], freq, num_chan); + if (!num_chan) + goto error; + + for (chn_idx = 0; chn_idx < num_chan; chn_idx++) { + if (chan[chn_idx].center_freq == freq) { + tdls_debug("TDLS 6ghz freq: %d supports VLP power", + chan[chn_idx].center_freq); + is_allowed = true; + break; + } + } + +error: + return is_allowed; +} +#else +static bool tdls_is_6g_freq_allowed(struct wlan_objmgr_vdev *vdev, + qdf_freq_t freq) +{ + return false; +} +#endif + bool tdls_check_is_tdls_allowed(struct wlan_objmgr_vdev *vdev) { struct tdls_vdev_priv_obj *tdls_vdev_obj; struct tdls_soc_priv_obj *tdls_soc_obj; bool state = false; + qdf_freq_t ch_freq; if (QDF_STATUS_SUCCESS != wlan_objmgr_vdev_try_get_ref(vdev, WLAN_TDLS_NB_ID)) @@ -868,6 +922,11 @@ bool tdls_check_is_tdls_allowed(struct wlan_objmgr_vdev *vdev) /* print session information */ wlan_objmgr_vdev_release_ref(vdev, WLAN_TDLS_NB_ID); + + ch_freq = wlan_get_operation_chan_freq(vdev); + if (wlan_reg_is_6ghz_chan_freq(ch_freq)) + state &= tdls_is_6g_freq_allowed(vdev, ch_freq); + return state; }