Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1 | /* |
bings | 394afdd | 2017-01-09 11:22:38 +0800 | [diff] [blame] | 2 | * Copyright (c) 2012-2017 The Linux Foundation. All rights reserved. |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3 | * |
| 4 | * Previously licensed under the ISC license by Qualcomm Atheros, Inc. |
| 5 | * |
| 6 | * |
| 7 | * Permission to use, copy, modify, and/or distribute this software for |
| 8 | * any purpose with or without fee is hereby granted, provided that the |
| 9 | * above copyright notice and this permission notice appear in all |
| 10 | * copies. |
| 11 | * |
| 12 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL |
| 13 | * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED |
| 14 | * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE |
| 15 | * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL |
| 16 | * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR |
| 17 | * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER |
| 18 | * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR |
| 19 | * PERFORMANCE OF THIS SOFTWARE. |
| 20 | */ |
| 21 | |
| 22 | /* |
| 23 | * This file was originally distributed by Qualcomm Atheros, Inc. |
| 24 | * under proprietary terms before Copyright ownership was assigned |
| 25 | * to the Linux Foundation. |
| 26 | */ |
| 27 | |
| 28 | /** |
| 29 | * =========================================================================== |
| 30 | * sapModule.C |
| 31 | * OVERVIEW: |
| 32 | * This software unit holds the implementation of the WLAN SAP modules |
| 33 | * functions providing EXTERNAL APIs. It is also where the global SAP module |
| 34 | * context gets initialised |
| 35 | * DEPENDENCIES: |
| 36 | * Are listed for each API below. |
| 37 | * =========================================================================== |
| 38 | */ |
| 39 | |
| 40 | /* $Header$ */ |
| 41 | |
| 42 | /*---------------------------------------------------------------------------- |
| 43 | * Include Files |
| 44 | * -------------------------------------------------------------------------*/ |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 45 | #include "qdf_trace.h" |
Anurag Chouhan | c554842 | 2016-02-24 18:33:27 +0530 | [diff] [blame] | 46 | #include "qdf_util.h" |
Manishekar Chandrasekaran | f7a1dad | 2016-06-23 06:43:47 +0530 | [diff] [blame] | 47 | #include "qdf_atomic.h" |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 48 | /* Pick up the sme callback registration API */ |
| 49 | #include "sme_api.h" |
| 50 | |
| 51 | /* SAP API header file */ |
| 52 | |
| 53 | #include "sap_internal.h" |
| 54 | #include "sme_inside.h" |
| 55 | #include "cds_ieee80211_common_i.h" |
Naveen Rawat | 3b6068c | 2016-04-14 19:01:06 -0700 | [diff] [blame] | 56 | #include "cds_regdomain.h" |
Tushnim Bhattacharyya | 66348bd | 2017-03-09 15:02:10 -0800 | [diff] [blame] | 57 | #include "wlan_policy_mgr_api.h" |
Tushnim Bhattacharyya | 45ed04f | 2017-03-15 10:15:05 -0700 | [diff] [blame] | 58 | #include <wlan_scan_ucfg_api.h> |
Kiran Kumar Lokere | a3de226 | 2017-04-12 12:15:04 -0700 | [diff] [blame] | 59 | #include "wlan_reg_services_api.h" |
Arif Hussain | cd15163 | 2017-02-11 16:57:19 -0800 | [diff] [blame] | 60 | #include <wlan_dfs_utils_api.h> |
Kiran Kumar Lokere | b1d412e | 2017-04-23 17:19:43 -0700 | [diff] [blame] | 61 | #include <wlan_reg_ucfg_api.h> |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 62 | |
| 63 | /*---------------------------------------------------------------------------- |
| 64 | * Preprocessor Definitions and Constants |
| 65 | * -------------------------------------------------------------------------*/ |
| 66 | #define SAP_DEBUG |
| 67 | |
| 68 | /*---------------------------------------------------------------------------- |
| 69 | * Type Declarations |
| 70 | * -------------------------------------------------------------------------*/ |
| 71 | |
| 72 | /*---------------------------------------------------------------------------- |
| 73 | * Global Data Definitions |
| 74 | * -------------------------------------------------------------------------*/ |
| 75 | |
| 76 | /*---------------------------------------------------------------------------- |
| 77 | * External declarations for global context |
| 78 | * -------------------------------------------------------------------------*/ |
| 79 | /* No! Get this from CDS. */ |
| 80 | /* The main per-Physical Link (per WLAN association) context. */ |
Manishekar Chandrasekaran | f7a1dad | 2016-06-23 06:43:47 +0530 | [diff] [blame] | 81 | static ptSapContext gp_sap_ctx[SAP_MAX_NUM_SESSION]; |
| 82 | static qdf_atomic_t sap_ctx_ref_count[SAP_MAX_NUM_SESSION]; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 83 | |
| 84 | /*---------------------------------------------------------------------------- |
| 85 | * Static Variable Definitions |
| 86 | * -------------------------------------------------------------------------*/ |
Manishekar Chandrasekaran | f7a1dad | 2016-06-23 06:43:47 +0530 | [diff] [blame] | 87 | static qdf_mutex_t sap_context_lock; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 88 | |
| 89 | /*---------------------------------------------------------------------------- |
| 90 | * Static Function Declarations and Definitions |
| 91 | * -------------------------------------------------------------------------*/ |
| 92 | |
| 93 | /*---------------------------------------------------------------------------- |
| 94 | * Externalized Function Definitions |
| 95 | * -------------------------------------------------------------------------*/ |
| 96 | |
| 97 | /*---------------------------------------------------------------------------- |
| 98 | * Function Declarations and Documentation |
| 99 | * -------------------------------------------------------------------------*/ |
| 100 | |
| 101 | /** |
Manishekar Chandrasekaran | f7a1dad | 2016-06-23 06:43:47 +0530 | [diff] [blame] | 102 | * wlansap_global_init() - Initialize SAP globals |
| 103 | * |
| 104 | * Initializes the SAP global data structures |
| 105 | * |
| 106 | * Return: QDF_STATUS |
| 107 | */ |
| 108 | QDF_STATUS wlansap_global_init(void) |
| 109 | { |
| 110 | uint32_t i; |
| 111 | |
| 112 | if (QDF_IS_STATUS_ERROR(qdf_mutex_create(&sap_context_lock))) { |
| 113 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
| 114 | "failed to init sap_context_lock"); |
| 115 | return QDF_STATUS_E_FAULT; |
| 116 | } |
| 117 | |
| 118 | for (i = 0; i < SAP_MAX_NUM_SESSION; i++) { |
| 119 | gp_sap_ctx[i] = NULL; |
| 120 | qdf_atomic_init(&sap_ctx_ref_count[i]); |
| 121 | } |
| 122 | |
Srinivas Girigowda | 678586c | 2017-03-10 00:13:58 -0800 | [diff] [blame] | 123 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG, |
Manishekar Chandrasekaran | f7a1dad | 2016-06-23 06:43:47 +0530 | [diff] [blame] | 124 | "%s: sap global context initialized", __func__); |
| 125 | |
| 126 | return QDF_STATUS_SUCCESS; |
| 127 | } |
| 128 | |
| 129 | /** |
| 130 | * wlansap_global_deinit() - De-initialize SAP globals |
| 131 | * |
| 132 | * De-initializes the SAP global data structures |
| 133 | * |
| 134 | * Return: QDF_STATUS |
| 135 | */ |
| 136 | QDF_STATUS wlansap_global_deinit(void) |
| 137 | { |
| 138 | uint32_t i; |
| 139 | |
| 140 | for (i = 0; i < SAP_MAX_NUM_SESSION; i++) { |
| 141 | if (gp_sap_ctx[i]) { |
| 142 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
| 143 | "we could be leaking context:%d", i); |
| 144 | } |
| 145 | gp_sap_ctx[i] = NULL; |
| 146 | qdf_atomic_init(&sap_ctx_ref_count[i]); |
| 147 | } |
| 148 | |
| 149 | if (QDF_IS_STATUS_ERROR(qdf_mutex_destroy(&sap_context_lock))) { |
| 150 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
| 151 | "failed to destroy sap_context_lock"); |
| 152 | return QDF_STATUS_E_FAULT; |
| 153 | } |
| 154 | |
Srinivas Girigowda | 678586c | 2017-03-10 00:13:58 -0800 | [diff] [blame] | 155 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG, |
Manishekar Chandrasekaran | f7a1dad | 2016-06-23 06:43:47 +0530 | [diff] [blame] | 156 | "%s: sap global context deinitialized", __func__); |
| 157 | |
| 158 | return QDF_STATUS_SUCCESS; |
| 159 | } |
| 160 | |
| 161 | /** |
| 162 | * wlansap_save_context() - Save the context in global SAP context |
| 163 | * @ctx: SAP context to be stored |
| 164 | * |
| 165 | * Stores the given SAP context in the global SAP context array |
| 166 | * |
| 167 | * Return: QDF_STATUS |
| 168 | */ |
| 169 | static QDF_STATUS wlansap_save_context(ptSapContext ctx) |
| 170 | { |
| 171 | uint32_t i; |
| 172 | |
| 173 | qdf_mutex_acquire(&sap_context_lock); |
| 174 | for (i = 0; i < SAP_MAX_NUM_SESSION; i++) { |
| 175 | if (gp_sap_ctx[i] == NULL) { |
| 176 | gp_sap_ctx[i] = ctx; |
| 177 | qdf_atomic_inc(&sap_ctx_ref_count[i]); |
| 178 | qdf_mutex_release(&sap_context_lock); |
Srinivas Girigowda | 678586c | 2017-03-10 00:13:58 -0800 | [diff] [blame] | 179 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG, |
| 180 | "%s: sap context saved at index: %d", |
Manishekar Chandrasekaran | f7a1dad | 2016-06-23 06:43:47 +0530 | [diff] [blame] | 181 | __func__, i); |
| 182 | return QDF_STATUS_SUCCESS; |
| 183 | } |
| 184 | } |
| 185 | qdf_mutex_release(&sap_context_lock); |
| 186 | |
| 187 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
| 188 | "%s: failed to save sap context", __func__); |
| 189 | |
| 190 | return QDF_STATUS_E_FAILURE; |
| 191 | } |
| 192 | |
| 193 | /** |
| 194 | * wlansap_context_get() - Verify SAP context and increment ref count |
| 195 | * @ctx: Context to be checked |
| 196 | * |
| 197 | * Verifies the SAP context and increments the reference count maintained for |
| 198 | * the corresponding SAP context. |
| 199 | * |
| 200 | * Return: QDF_STATUS |
| 201 | */ |
| 202 | QDF_STATUS wlansap_context_get(ptSapContext ctx) |
| 203 | { |
| 204 | uint32_t i; |
| 205 | |
| 206 | qdf_mutex_acquire(&sap_context_lock); |
| 207 | for (i = 0; i < SAP_MAX_NUM_SESSION; i++) { |
| 208 | if (ctx && (gp_sap_ctx[i] == ctx)) { |
| 209 | qdf_atomic_inc(&sap_ctx_ref_count[i]); |
| 210 | qdf_mutex_release(&sap_context_lock); |
| 211 | return QDF_STATUS_SUCCESS; |
| 212 | } |
| 213 | } |
| 214 | qdf_mutex_release(&sap_context_lock); |
| 215 | |
| 216 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
| 217 | "%s: sap session is not valid", __func__); |
| 218 | return QDF_STATUS_E_FAILURE; |
| 219 | } |
| 220 | |
| 221 | /** |
| 222 | * wlansap_context_put() - Check the reference count and free SAP context |
| 223 | * @ctx: SAP context to be checked and freed |
| 224 | * |
| 225 | * Checks the reference count and frees the SAP context |
| 226 | * |
| 227 | * Return: None |
| 228 | */ |
| 229 | void wlansap_context_put(ptSapContext ctx) |
| 230 | { |
| 231 | uint32_t i; |
| 232 | |
| 233 | if (!ctx) |
| 234 | return; |
| 235 | |
| 236 | qdf_mutex_acquire(&sap_context_lock); |
| 237 | for (i = 0; i < SAP_MAX_NUM_SESSION; i++) { |
| 238 | if (gp_sap_ctx[i] == ctx) { |
| 239 | if (qdf_atomic_dec_and_test(&sap_ctx_ref_count[i])) { |
| 240 | qdf_mem_free(ctx); |
| 241 | gp_sap_ctx[i] = NULL; |
| 242 | QDF_TRACE(QDF_MODULE_ID_SAP, |
Srinivas Girigowda | 678586c | 2017-03-10 00:13:58 -0800 | [diff] [blame] | 243 | QDF_TRACE_LEVEL_DEBUG, |
Manishekar Chandrasekaran | f7a1dad | 2016-06-23 06:43:47 +0530 | [diff] [blame] | 244 | "%s: sap session freed: %d", |
| 245 | __func__, i); |
| 246 | } |
| 247 | qdf_mutex_release(&sap_context_lock); |
| 248 | return; |
| 249 | } |
| 250 | } |
| 251 | qdf_mutex_release(&sap_context_lock); |
| 252 | } |
| 253 | |
| 254 | /** |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 255 | * wlansap_open() - WLAN SAP open function call |
| 256 | * @p_cds_gctx: Pointer to the global cds context; a handle to SAP's |
| 257 | * |
| 258 | * Called at driver initialization (cds_open). SAP will initialize |
| 259 | * all its internal resources and will wait for the call to start to |
| 260 | * register with the other modules. |
| 261 | * |
Ryan Hsu | 4252a2f | 2016-01-05 11:18:24 -0800 | [diff] [blame] | 262 | * Return: Pointer to the SAP context |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 263 | */ |
Ryan Hsu | 4252a2f | 2016-01-05 11:18:24 -0800 | [diff] [blame] | 264 | void *wlansap_open(void *p_cds_gctx) |
| 265 | { |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 266 | ptSapContext pSapCtx = NULL; |
Manishekar Chandrasekaran | f7a1dad | 2016-06-23 06:43:47 +0530 | [diff] [blame] | 267 | QDF_STATUS status; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 268 | |
Ryan Hsu | 4252a2f | 2016-01-05 11:18:24 -0800 | [diff] [blame] | 269 | /* dynamically allocate the sapContext */ |
Anurag Chouhan | 600c3a0 | 2016-03-01 10:33:54 +0530 | [diff] [blame] | 270 | pSapCtx = (ptSapContext) qdf_mem_malloc(sizeof(tSapContext)); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 271 | |
| 272 | if (NULL == pSapCtx) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 273 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 274 | "%s: Invalid SAP pointer from p_cds_gctx", __func__); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 275 | return NULL; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 276 | } |
| 277 | |
Ryan Hsu | 4252a2f | 2016-01-05 11:18:24 -0800 | [diff] [blame] | 278 | /* Clean up SAP control block, initialize all values */ |
Krunal Soni | 074dd2c | 2017-04-14 14:57:34 -0700 | [diff] [blame] | 279 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG, FL("Enter")); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 280 | |
| 281 | /* Setup the "link back" to the CDS context */ |
| 282 | pSapCtx->p_cds_gctx = p_cds_gctx; |
| 283 | |
Manishekar Chandrasekaran | f7a1dad | 2016-06-23 06:43:47 +0530 | [diff] [blame] | 284 | /* Save the SAP context pointer */ |
| 285 | status = wlansap_save_context(pSapCtx); |
| 286 | if (QDF_IS_STATUS_ERROR(status)) { |
| 287 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
| 288 | "%s: failed to save SAP context", __func__); |
| 289 | qdf_mem_free(pSapCtx); |
| 290 | return NULL; |
| 291 | } |
Krunal Soni | 074dd2c | 2017-04-14 14:57:34 -0700 | [diff] [blame] | 292 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG, FL("Exit")); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 293 | |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 294 | return pSapCtx; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 295 | } /* wlansap_open */ |
| 296 | |
| 297 | /** |
| 298 | * wlansap_start() - wlan start SAP. |
| 299 | * @pCtx: Pointer to the global cds context; a handle to SAP's |
| 300 | * control block can be extracted from its context |
| 301 | * When MBSSID feature is enabled, SAP context is directly |
| 302 | * passed to SAP APIs |
Peng Xu | 66162de | 2016-02-11 17:01:20 -0800 | [diff] [blame] | 303 | * @mode: Device mode |
| 304 | * @addr: MAC address of the SAP |
| 305 | * @session_id: Pointer to the session id |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 306 | * |
| 307 | * Called as part of the overall start procedure (cds_enable). SAP will |
| 308 | * use this call to register with TL as the SAP entity for SAP RSN frames. |
| 309 | * |
| 310 | * Return: The result code associated with performing the operation |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 311 | * QDF_STATUS_E_FAULT: Pointer to SAP cb is NULL; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 312 | * access would cause a page fault. |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 313 | * QDF_STATUS_SUCCESS: Success |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 314 | */ |
Peng Xu | 66162de | 2016-02-11 17:01:20 -0800 | [diff] [blame] | 315 | QDF_STATUS wlansap_start(void *pCtx, enum tQDF_ADAPTER_MODE mode, |
Dustin Brown | d28772b | 2017-03-17 14:16:07 -0700 | [diff] [blame] | 316 | uint8_t *addr, uint32_t session_id) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 317 | { |
| 318 | ptSapContext pSapCtx = NULL; |
Peng Xu | 66162de | 2016-02-11 17:01:20 -0800 | [diff] [blame] | 319 | QDF_STATUS qdf_ret_status; |
| 320 | tHalHandle hal; |
Sandeep Puligilla | 0806e0f | 2017-03-06 19:25:47 -0800 | [diff] [blame] | 321 | tpAniSirGlobal pmac; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 322 | |
| 323 | /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ |
| 324 | |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 325 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 326 | "wlansap_start invoked successfully"); |
| 327 | /*------------------------------------------------------------------------ |
| 328 | Sanity check |
| 329 | Extract SAP control block |
| 330 | ------------------------------------------------------------------------*/ |
| 331 | pSapCtx = CDS_GET_SAP_CB(pCtx); |
| 332 | |
| 333 | if (NULL == pSapCtx) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 334 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 335 | "%s: Invalid SAP pointer from pCtx", __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 336 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 337 | } |
| 338 | |
| 339 | /*------------------------------------------------------------------------ |
| 340 | For now, presume security is not enabled. |
| 341 | -----------------------------------------------------------------------*/ |
| 342 | pSapCtx->ucSecEnabled = WLANSAP_SECURITY_ENABLED_STATE; |
| 343 | |
| 344 | /*------------------------------------------------------------------------ |
| 345 | Now configure the roaming profile links. To SSID and bssid. |
| 346 | ------------------------------------------------------------------------*/ |
| 347 | /* We have room for two SSIDs. */ |
| 348 | pSapCtx->csr_roamProfile.SSIDs.numOfSSIDs = 1; /* This is true for now. */ |
| 349 | pSapCtx->csr_roamProfile.SSIDs.SSIDList = pSapCtx->SSIDList; /* Array of two */ |
| 350 | pSapCtx->csr_roamProfile.SSIDs.SSIDList[0].SSID.length = 0; |
| 351 | pSapCtx->csr_roamProfile.SSIDs.SSIDList[0].handoffPermitted = false; |
| 352 | pSapCtx->csr_roamProfile.SSIDs.SSIDList[0].ssidHidden = |
| 353 | pSapCtx->SSIDList[0].ssidHidden; |
| 354 | |
| 355 | pSapCtx->csr_roamProfile.BSSIDs.numOfBSSIDs = 1; /* This is true for now. */ |
| 356 | pSapCtx->csr_roamProfile.BSSIDs.bssid = &pSapCtx->bssid; |
Peng Xu | 66162de | 2016-02-11 17:01:20 -0800 | [diff] [blame] | 357 | pSapCtx->csr_roamProfile.csrPersona = mode; |
| 358 | qdf_mem_copy(pSapCtx->self_mac_addr, addr, QDF_MAC_ADDR_SIZE); |
| 359 | qdf_event_create(&pSapCtx->sap_session_opened_evt); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 360 | |
| 361 | /* Now configure the auth type in the roaming profile. To open. */ |
| 362 | pSapCtx->csr_roamProfile.negotiatedAuthType = eCSR_AUTH_TYPE_OPEN_SYSTEM; /* open is the default */ |
| 363 | |
Anurag Chouhan | a37b5b7 | 2016-02-21 14:53:42 +0530 | [diff] [blame] | 364 | if (!QDF_IS_STATUS_SUCCESS(qdf_mutex_create(&pSapCtx->SapGlobalLock))) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 365 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 366 | "wlansap_start failed init lock"); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 367 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 368 | } |
| 369 | |
Peng Xu | 66162de | 2016-02-11 17:01:20 -0800 | [diff] [blame] | 370 | hal = (tHalHandle) CDS_GET_HAL_CB(pSapCtx->p_cds_gctx); |
Chandrasekaran, Manishekar | d3cb477 | 2016-02-22 22:21:10 +0530 | [diff] [blame] | 371 | if (!hal) { |
| 372 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
| 373 | "%s: Invalid HAL pointer", __func__); |
| 374 | return QDF_STATUS_E_INVAL; |
| 375 | } |
Sandeep Puligilla | 0806e0f | 2017-03-06 19:25:47 -0800 | [diff] [blame] | 376 | pmac = PMAC_STRUCT(hal); |
Krunal Soni | b01de79 | 2017-04-14 11:44:39 -0700 | [diff] [blame] | 377 | /* |
| 378 | * Anytime when you call sap_open_session, please call |
| 379 | * sap_set_session_param to fill sap context parameters |
| 380 | */ |
Peng Xu | 66162de | 2016-02-11 17:01:20 -0800 | [diff] [blame] | 381 | qdf_ret_status = sap_open_session(hal, pSapCtx, session_id); |
Peng Xu | 66162de | 2016-02-11 17:01:20 -0800 | [diff] [blame] | 382 | if (QDF_STATUS_SUCCESS != qdf_ret_status) { |
| 383 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
| 384 | "Error: In %s calling sap_open_session status = %d", |
| 385 | __func__, qdf_ret_status); |
| 386 | return QDF_STATUS_E_FAILURE; |
| 387 | } |
Krunal Soni | b01de79 | 2017-04-14 11:44:39 -0700 | [diff] [blame] | 388 | qdf_ret_status = sap_set_session_param(hal, pSapCtx, session_id); |
| 389 | if (QDF_STATUS_SUCCESS != qdf_ret_status) { |
| 390 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
| 391 | "In %s calling sap_set_session_param status = %d", |
| 392 | __func__, qdf_ret_status); |
| 393 | return QDF_STATUS_E_FAILURE; |
| 394 | } |
Sandeep Puligilla | 91273c2 | 2017-03-08 19:02:50 -0800 | [diff] [blame] | 395 | #ifdef NAPIER_SCAN |
Sandeep Puligilla | 0806e0f | 2017-03-06 19:25:47 -0800 | [diff] [blame] | 396 | /* Register with scan component */ |
| 397 | pSapCtx->req_id = ucfg_scan_register_requester(pmac->psoc, "SAP", |
| 398 | sap_scan_event_callback, pSapCtx); |
Sandeep Puligilla | 91273c2 | 2017-03-08 19:02:50 -0800 | [diff] [blame] | 399 | #endif |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 400 | return QDF_STATUS_SUCCESS; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 401 | } |
| 402 | |
| 403 | /** |
| 404 | * wlansap_stop() - stop SAP module. |
| 405 | * @pCtx: Pointer to the global cds context; a handle to SAP's control block |
| 406 | * can be extracted from its context. When MBSSID feature is enabled, |
| 407 | * SAP context is directly passed to SAP APIs |
| 408 | * |
| 409 | * Called by cds_disable to stop operation in SAP, before close. SAP will |
| 410 | * suspend all BT-AMP Protocol Adaption Layer operation and will wait for the |
| 411 | * close request to clean up its resources. |
| 412 | * |
| 413 | * Return: The result code associated with performing the operation |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 414 | * QDF_STATUS_E_FAULT: Pointer to SAP cb is NULL; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 415 | * access would cause a page fault. |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 416 | * QDF_STATUS_SUCCESS: Success |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 417 | */ |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 418 | QDF_STATUS wlansap_stop(void *pCtx) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 419 | { |
| 420 | ptSapContext pSapCtx = NULL; |
Krunal Soni | 074dd2c | 2017-04-14 14:57:34 -0700 | [diff] [blame] | 421 | tHalHandle hal; |
Sandeep Puligilla | 0806e0f | 2017-03-06 19:25:47 -0800 | [diff] [blame] | 422 | tpAniSirGlobal pmac; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 423 | |
Ryan Hsu | 4252a2f | 2016-01-05 11:18:24 -0800 | [diff] [blame] | 424 | /* Sanity check - Extract SAP control block */ |
Krunal Soni | 074dd2c | 2017-04-14 14:57:34 -0700 | [diff] [blame] | 425 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 426 | "wlansap_stop invoked successfully "); |
| 427 | |
| 428 | pSapCtx = CDS_GET_SAP_CB(pCtx); |
| 429 | if (NULL == pSapCtx) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 430 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 431 | "%s: Invalid SAP pointer from pCtx", __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 432 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 433 | } |
Krunal Soni | 074dd2c | 2017-04-14 14:57:34 -0700 | [diff] [blame] | 434 | hal = CDS_GET_HAL_CB(pSapCtx->p_cds_gctx); |
| 435 | pmac = (tpAniSirGlobal) hal; |
Sandeep Puligilla | 0806e0f | 2017-03-06 19:25:47 -0800 | [diff] [blame] | 436 | if (NULL == pmac) { |
Krunal Soni | 074dd2c | 2017-04-14 14:57:34 -0700 | [diff] [blame] | 437 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Sandeep Puligilla | 0806e0f | 2017-03-06 19:25:47 -0800 | [diff] [blame] | 438 | "%s: Invalid MAC context from p_cds_gctx", |
| 439 | __func__); |
| 440 | return QDF_STATUS_E_FAULT; |
| 441 | } |
Krunal Soni | 074dd2c | 2017-04-14 14:57:34 -0700 | [diff] [blame] | 442 | if (QDF_STATUS_SUCCESS != |
| 443 | sap_close_session(hal, pSapCtx, NULL, false)) { |
| 444 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
| 445 | FL("sap session can't be closed")); |
| 446 | return QDF_STATUS_E_FAULT; |
| 447 | } |
Sandeep Puligilla | 91273c2 | 2017-03-08 19:02:50 -0800 | [diff] [blame] | 448 | #ifdef NAPIER_SCAN |
Sandeep Puligilla | 0806e0f | 2017-03-06 19:25:47 -0800 | [diff] [blame] | 449 | ucfg_scan_unregister_requester(pmac->psoc, pSapCtx->req_id); |
Sandeep Puligilla | 91273c2 | 2017-03-08 19:02:50 -0800 | [diff] [blame] | 450 | #endif |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 451 | sap_free_roam_profile(&pSapCtx->csr_roamProfile); |
| 452 | |
Anurag Chouhan | a37b5b7 | 2016-02-21 14:53:42 +0530 | [diff] [blame] | 453 | if (!QDF_IS_STATUS_SUCCESS(qdf_mutex_destroy(&pSapCtx->SapGlobalLock))) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 454 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 455 | "wlansap_stop failed destroy lock"); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 456 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 457 | } |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 458 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 459 | return QDF_STATUS_SUCCESS; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 460 | } |
| 461 | |
| 462 | /** |
| 463 | * wlansap_close - close SAP module. |
| 464 | * @pCtx: Pointer to the global cds context; a handle to SAP's control block |
| 465 | * can be extracted from its context. When MBSSID feature is enabled, |
| 466 | * SAP context is directly passed to SAP APIs. |
| 467 | * |
| 468 | * Called by cds_close during general driver close procedure. SAP will clean up |
| 469 | * all the internal resources. |
| 470 | * |
| 471 | * Return: The result code associated with performing the operation |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 472 | * QDF_STATUS_E_FAULT: Pointer to SAP cb is NULL; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 473 | * access would cause a page fault |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 474 | * QDF_STATUS_SUCCESS: Success |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 475 | */ |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 476 | QDF_STATUS wlansap_close(void *pCtx) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 477 | { |
| 478 | ptSapContext pSapCtx = NULL; |
Krunal Soni | 074dd2c | 2017-04-14 14:57:34 -0700 | [diff] [blame] | 479 | tHalHandle hal; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 480 | |
Ryan Hsu | 4252a2f | 2016-01-05 11:18:24 -0800 | [diff] [blame] | 481 | /* Sanity check - Extract SAP control block */ |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 482 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 483 | "wlansap_close invoked"); |
| 484 | |
| 485 | pSapCtx = CDS_GET_SAP_CB(pCtx); |
| 486 | if (NULL == pSapCtx) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 487 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 488 | "%s: Invalid SAP pointer from pCtx", __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 489 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 490 | } |
Ryan Hsu | 4252a2f | 2016-01-05 11:18:24 -0800 | [diff] [blame] | 491 | /* Cleanup SAP control block */ |
Krunal Soni | 074dd2c | 2017-04-14 14:57:34 -0700 | [diff] [blame] | 492 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG, FL("Enter")); |
Liangwei Dong | df50df9 | 2016-09-29 03:06:50 -0400 | [diff] [blame] | 493 | sap_cleanup_channel_list(pCtx); |
Krunal Soni | 0bdfc77 | 2017-04-28 18:37:06 -0700 | [diff] [blame] | 494 | hal = CDS_GET_HAL_CB(pSapCtx->p_cds_gctx); |
| 495 | if (!hal) |
| 496 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
| 497 | FL("hal is NULL, so lets skip global sap cleanup")); |
| 498 | else if (pSapCtx->sessionId != CSR_SESSION_ID_INVALID) |
| 499 | /* empty queues/lists/pkts if any */ |
Krunal Soni | 074dd2c | 2017-04-14 14:57:34 -0700 | [diff] [blame] | 500 | sap_clear_session_param(hal, pSapCtx, pSapCtx->sessionId); |
| 501 | /* |
| 502 | * wlansap_context_put will release actual pSapCtx memory |
| 503 | * allocated during wlansap_open |
| 504 | */ |
Manishekar Chandrasekaran | f7a1dad | 2016-06-23 06:43:47 +0530 | [diff] [blame] | 505 | wlansap_context_put(pSapCtx); |
Krunal Soni | 074dd2c | 2017-04-14 14:57:34 -0700 | [diff] [blame] | 506 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG, FL("Exit")); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 507 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 508 | return QDF_STATUS_SUCCESS; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 509 | } /* wlansap_close */ |
| 510 | |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 511 | /*========================================================================== |
| 512 | FUNCTION wlansap_pmc_full_pwr_req_cb |
| 513 | |
| 514 | DESCRIPTION |
| 515 | Callback provide to PMC in the pmc_request_full_power API. |
| 516 | |
| 517 | DEPENDENCIES |
| 518 | |
| 519 | PARAMETERS |
| 520 | |
| 521 | IN |
| 522 | callbackContext: The user passed in a context to identify |
Anurag Chouhan | f04e84f | 2016-03-03 10:12:12 +0530 | [diff] [blame] | 523 | status : The qdf_ret_status |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 524 | |
| 525 | RETURN VALUE |
| 526 | None |
| 527 | |
| 528 | SIDE EFFECTS |
| 529 | ============================================================================*/ |
| 530 | void |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 531 | wlansap_pmc_full_pwr_req_cb(void *callbackContext, QDF_STATUS status) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 532 | { |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 533 | if (QDF_IS_STATUS_SUCCESS(status)) { |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 534 | /* If success what else to be handled??? */ |
| 535 | } else { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 536 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_FATAL, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 537 | "wlansap_pmc_full_pwr_req_cb: PMC failed to put the chip in Full power"); |
| 538 | |
| 539 | } |
| 540 | |
| 541 | } /* wlansap_pmc_full_pwr_req_cb */ |
| 542 | |
| 543 | /** |
| 544 | * wlansap_get_state() - get SAP state |
| 545 | * @pCtx: Pointer to the global cds context; a handle to SAP's control block |
| 546 | * can be extracted from its context. When MBSSID feature is enabled, |
| 547 | * SAP context is directly passed to SAP APIs. |
| 548 | * |
| 549 | * This api returns the current SAP state to the caller. |
| 550 | * |
| 551 | * Return: uint8_t - the SAP FSM state. |
| 552 | */ |
| 553 | uint8_t wlansap_get_state(void *pCtx) |
| 554 | { |
| 555 | ptSapContext pSapCtx = NULL; |
| 556 | |
| 557 | pSapCtx = CDS_GET_SAP_CB(pCtx); |
| 558 | |
| 559 | if (NULL == pSapCtx) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 560 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 561 | "%s: Invalid SAP pointer from pCtx", __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 562 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 563 | } |
| 564 | return pSapCtx->sapsMachine; |
| 565 | } |
| 566 | |
Kapil Gupta | 94ca6f6 | 2016-12-11 18:43:12 +0530 | [diff] [blame] | 567 | bool wlansap_is_channel_in_nol_list(void *p_cds_gctx, |
| 568 | uint8_t channelNumber, |
| 569 | ePhyChanBondState chanBondState) |
| 570 | { |
| 571 | ptSapContext pSapCtx = NULL; |
| 572 | |
| 573 | pSapCtx = CDS_GET_SAP_CB(p_cds_gctx); |
| 574 | |
| 575 | if (!pSapCtx) { |
| 576 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, |
| 577 | "%s: Invalid SAP pointer from pCtx", __func__); |
| 578 | return QDF_STATUS_E_FAULT; |
| 579 | } |
| 580 | |
| 581 | return sap_dfs_is_channel_in_nol_list(pSapCtx, channelNumber, |
| 582 | chanBondState); |
| 583 | } |
| 584 | |
| 585 | #ifdef WLAN_ENABLE_CHNL_MATRIX_RESTRICTION |
| 586 | static QDF_STATUS wlansap_mark_leaking_channel(ptSapContext sap_ctx, |
| 587 | tSapDfsNolInfo *nol, |
| 588 | uint8_t *leakage_adjusted_lst, |
| 589 | uint8_t chan_bw) |
| 590 | { |
| 591 | |
| 592 | return sap_mark_leaking_ch(sap_ctx, chan_bw, nol, 1, |
| 593 | leakage_adjusted_lst); |
| 594 | } |
| 595 | #else |
| 596 | static QDF_STATUS wlansap_mark_leaking_channel(ptSapContext sap_ctx, |
| 597 | tSapDfsNolInfo *nol, |
| 598 | uint8_t *leakage_adjusted_lst, |
| 599 | uint8_t chan_bw) |
| 600 | { |
| 601 | return QDF_STATUS_SUCCESS; |
| 602 | } |
| 603 | #endif |
| 604 | |
| 605 | bool wlansap_is_channel_leaking_in_nol(void *ctx, uint8_t channel, |
| 606 | uint8_t chan_bw) |
| 607 | { |
| 608 | ptSapContext sap_ctx = CDS_GET_SAP_CB(ctx); |
| 609 | tpAniSirGlobal mac_ctx; |
| 610 | uint8_t leakage_adjusted_lst[1]; |
| 611 | void *handle = NULL; |
| 612 | tSapDfsNolInfo *nol; |
| 613 | |
| 614 | leakage_adjusted_lst[0] = channel; |
| 615 | handle = CDS_GET_HAL_CB(sapContext->p_cds_gctx); |
| 616 | mac_ctx = PMAC_STRUCT(handle); |
| 617 | if (!mac_ctx) { |
| 618 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
| 619 | "%s: Invalid mac pointer", __func__); |
| 620 | return QDF_STATUS_E_FAULT; |
| 621 | } |
| 622 | nol = mac_ctx->sap.SapDfsInfo.sapDfsChannelNolList; |
| 623 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
| 624 | FL("sapdfs: Processing current chan against NOL.")); |
| 625 | if (wlansap_mark_leaking_channel(sap_ctx, nol, |
| 626 | leakage_adjusted_lst, chan_bw) != QDF_STATUS_SUCCESS) { |
| 627 | return true; |
| 628 | } |
| 629 | if (leakage_adjusted_lst[0] == 0) |
| 630 | return true; |
| 631 | return false; |
| 632 | } |
| 633 | |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 634 | #ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH |
| 635 | /*========================================================================== |
| 636 | FUNCTION wlansap_check_cc_intf |
| 637 | |
| 638 | DESCRIPTION Restart SAP if Concurrent Channel interfering |
| 639 | |
| 640 | DEPENDENCIES NA. |
| 641 | |
| 642 | PARAMETERS |
| 643 | IN |
| 644 | Ctx: Pointer to cds Context or Sap Context based on MBSSID |
| 645 | |
| 646 | RETURN VALUE NONE |
| 647 | |
| 648 | SIDE EFFECTS |
| 649 | ============================================================================*/ |
| 650 | uint16_t wlansap_check_cc_intf(void *Ctx) |
| 651 | { |
| 652 | tHalHandle hHal; |
| 653 | uint16_t intf_ch; |
| 654 | ptSapContext pSapCtx = CDS_GET_SAP_CB(Ctx); |
| 655 | |
| 656 | hHal = (tHalHandle) CDS_GET_HAL_CB(pSapCtx->p_cds_gctx); |
| 657 | if (NULL == hHal) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 658 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 659 | "%s: Invalid MAC context from p_cds_gctx", __func__); |
| 660 | return 0; |
| 661 | } |
| 662 | intf_ch = sme_check_concurrent_channel_overlap(hHal, 0, 0, |
| 663 | pSapCtx->cc_switch_mode); |
| 664 | return intf_ch; |
| 665 | } |
| 666 | #endif |
| 667 | |
| 668 | /** |
| 669 | * wlansap_set_scan_acs_channel_params() - Config scan and channel parameters. |
| 670 | * pconfig: Pointer to the SAP config |
| 671 | * psap_ctx: Pointer to the SAP Context. |
| 672 | * pusr_context: Parameter that will be passed |
| 673 | * back in all the SAP callback events. |
| 674 | * |
| 675 | * This api function is used to copy Scan and Channel parameters from sap |
| 676 | * config to sap context. |
| 677 | * |
| 678 | * Return: The result code associated with |
| 679 | * performing the operation |
| 680 | */ |
Jeff Johnson | 464f7ea | 2016-10-07 10:21:26 -0700 | [diff] [blame] | 681 | static QDF_STATUS |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 682 | wlansap_set_scan_acs_channel_params(tsap_Config_t *pconfig, |
| 683 | ptSapContext psap_ctx, |
| 684 | void *pusr_context) |
| 685 | { |
| 686 | tHalHandle h_hal = NULL; |
Kiran Kumar Lokere | b1d412e | 2017-04-23 17:19:43 -0700 | [diff] [blame] | 687 | tpAniSirGlobal pmac; |
| 688 | QDF_STATUS status = QDF_STATUS_SUCCESS; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 689 | |
| 690 | if (NULL == pconfig) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 691 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 692 | "%s: Invalid pconfig passed ", __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 693 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 694 | } |
| 695 | |
| 696 | if (NULL == psap_ctx) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 697 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 698 | "%s: Invalid pconfig passed ", __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 699 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 700 | } |
| 701 | |
| 702 | /* Channel selection is auto or configured */ |
| 703 | psap_ctx->channel = pconfig->channel; |
Agrawal Ashish | 6563461 | 2016-08-18 13:24:32 +0530 | [diff] [blame] | 704 | psap_ctx->dfs_mode = pconfig->acs_dfs_mode; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 705 | #ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH |
| 706 | psap_ctx->cc_switch_mode = pconfig->cc_switch_mode; |
| 707 | #endif |
| 708 | psap_ctx->pUsrContext = pusr_context; |
| 709 | psap_ctx->enableOverLapCh = pconfig->enOverLapCh; |
| 710 | psap_ctx->acs_cfg = &pconfig->acs_cfg; |
| 711 | psap_ctx->ch_width_orig = pconfig->acs_cfg.ch_width; |
| 712 | psap_ctx->secondary_ch = pconfig->sec_ch; |
| 713 | |
| 714 | /* |
| 715 | * Set the BSSID to your "self MAC Addr" read |
| 716 | * the mac address from Configuation ITEM received |
| 717 | * from HDD |
| 718 | */ |
| 719 | psap_ctx->csr_roamProfile.BSSIDs.numOfBSSIDs = 1; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 720 | |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 721 | /* Save a copy to SAP context */ |
Anurag Chouhan | 600c3a0 | 2016-03-01 10:33:54 +0530 | [diff] [blame] | 722 | qdf_mem_copy(psap_ctx->csr_roamProfile.BSSIDs.bssid, |
Anurag Chouhan | 6d76066 | 2016-02-20 16:05:43 +0530 | [diff] [blame] | 723 | pconfig->self_macaddr.bytes, QDF_MAC_ADDR_SIZE); |
Anurag Chouhan | 600c3a0 | 2016-03-01 10:33:54 +0530 | [diff] [blame] | 724 | qdf_mem_copy(psap_ctx->self_mac_addr, |
Anurag Chouhan | 6d76066 | 2016-02-20 16:05:43 +0530 | [diff] [blame] | 725 | pconfig->self_macaddr.bytes, QDF_MAC_ADDR_SIZE); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 726 | |
| 727 | h_hal = (tHalHandle)CDS_GET_HAL_CB(psap_ctx->p_cds_gctx); |
| 728 | if (NULL == h_hal) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 729 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 730 | "%s: Invalid MAC context from pvosGCtx", __func__); |
Kiran Kumar Lokere | b1d412e | 2017-04-23 17:19:43 -0700 | [diff] [blame] | 731 | return QDF_STATUS_E_FAULT; |
| 732 | } |
| 733 | pmac = PMAC_STRUCT(h_hal); |
| 734 | /* |
| 735 | * If concurrent session is running that is already associated |
| 736 | * then we just follow that sessions country info (whether |
| 737 | * present or not doesn't maater as we have to follow whatever |
| 738 | * STA session does) |
| 739 | */ |
| 740 | if ((0 == sme_get_concurrent_operation_channel(h_hal)) && |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 741 | pconfig->ieee80211d) { |
Kiran Kumar Lokere | b1d412e | 2017-04-23 17:19:43 -0700 | [diff] [blame] | 742 | /* Setting the region/country information */ |
| 743 | status = ucfg_reg_set_country(pmac->pdev, |
| 744 | pconfig->countryCode); |
| 745 | if (QDF_IS_STATUS_ERROR(status)) |
| 746 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
| 747 | FL("Failed to set country")); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 748 | } |
| 749 | |
Kiran Kumar Lokere | b1d412e | 2017-04-23 17:19:43 -0700 | [diff] [blame] | 750 | return status; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 751 | } |
| 752 | /** |
| 753 | * wlan_sap_get_vht_ch_width() - Returns SAP VHT channel width. |
| 754 | * @ctx: Pointer to cds Context or Sap Context based on MBSSID |
| 755 | * |
| 756 | * This function provides the SAP current VHT channel with. |
| 757 | * |
| 758 | * Return: VHT channel width |
| 759 | */ |
| 760 | uint32_t wlan_sap_get_vht_ch_width(void *ctx) |
| 761 | { |
| 762 | ptSapContext sap_ctx = CDS_GET_SAP_CB(ctx); |
| 763 | |
| 764 | if (!sap_ctx) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 765 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 766 | FL("Invalid SAP pointer from ctx")); |
| 767 | return 0; |
| 768 | } |
| 769 | |
| 770 | return sap_ctx->ch_params.ch_width; |
| 771 | } |
| 772 | |
| 773 | /** |
| 774 | * wlan_sap_set_vht_ch_width() - Sets SAP VHT channel width. |
| 775 | * @ctx: Pointer to cds Context or Sap Context based on MBSSID |
| 776 | * @vht_channel_width: SAP VHT channel width value. |
| 777 | * |
| 778 | * This function sets the SAP current VHT channel with. |
| 779 | * |
| 780 | * Return: None |
| 781 | */ |
| 782 | void wlan_sap_set_vht_ch_width(void *ctx, uint32_t vht_channel_width) |
| 783 | { |
| 784 | ptSapContext sap_ctx = CDS_GET_SAP_CB(ctx); |
| 785 | |
| 786 | if (!sap_ctx) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 787 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 788 | FL("Invalid SAP pointer from ctx")); |
| 789 | return; |
| 790 | } |
| 791 | |
| 792 | sap_ctx->ch_params.ch_width = vht_channel_width; |
| 793 | } |
| 794 | |
| 795 | /** |
Edhar, Mahesh Kumar | df2ec12 | 2015-11-16 11:33:16 +0530 | [diff] [blame] | 796 | * wlan_sap_validate_channel_switch() - validate target channel switch w.r.t |
| 797 | * concurreny rules set to avoid channel interference. |
| 798 | * @hal - Hal context |
| 799 | * @sap_ch - channel to switch |
| 800 | * @sap_context - sap session context |
| 801 | * |
| 802 | * Return: true if there is no channel interference else return false |
| 803 | */ |
| 804 | #ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH |
| 805 | static bool wlan_sap_validate_channel_switch(tHalHandle hal, uint16_t sap_ch, |
| 806 | ptSapContext sap_context) |
| 807 | { |
| 808 | return sme_validate_sap_channel_switch( |
Manikandan Mohan | 22b8372 | 2015-12-15 15:03:23 -0800 | [diff] [blame] | 809 | hal, |
Edhar, Mahesh Kumar | df2ec12 | 2015-11-16 11:33:16 +0530 | [diff] [blame] | 810 | sap_ch, |
| 811 | sap_context->csr_roamProfile.phyMode, |
| 812 | sap_context->cc_switch_mode, |
| 813 | sap_context->sessionId); |
| 814 | } |
| 815 | #else |
| 816 | static inline bool wlan_sap_validate_channel_switch(tHalHandle hal, |
| 817 | uint16_t sap_ch, ptSapContext sap_context) |
| 818 | { |
| 819 | return true; |
| 820 | } |
| 821 | #endif |
| 822 | /** |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 823 | * wlansap_start_bss() - start BSS |
| 824 | * @pCtx: Pointer to the global cds context; a handle to SAP's control block |
| 825 | * can be extracted from its context. When MBSSID feature is enabled, |
| 826 | * SAP context is directly passed to SAP APIs. |
| 827 | * @pQctCommitConfig: Pointer to configuration structure passed down from |
| 828 | * HDD(HostApd for Android) |
| 829 | * @hdd_SapEventCallback: Callback function in HDD called by SAP to inform HDD |
| 830 | * about SAP results |
| 831 | * @pUsrContext: Parameter that will be passed back in all the SAP callback |
| 832 | * events. |
| 833 | * |
| 834 | * This api function provides SAP FSM event eWLAN_SAP_PHYSICAL_LINK_CREATE for |
| 835 | * starting AP BSS |
| 836 | * |
| 837 | * Return: The result code associated with performing the operation |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 838 | * QDF_STATUS_E_FAULT: Pointer to SAP cb is NULL; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 839 | * access would cause a page fault |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 840 | * QDF_STATUS_SUCCESS: Success |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 841 | */ |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 842 | QDF_STATUS wlansap_start_bss(void *pCtx, /* pwextCtx */ |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 843 | tpWLAN_SAPEventCB pSapEventCallback, |
| 844 | tsap_Config_t *pConfig, void *pUsrContext) { |
| 845 | tWLAN_SAPEvent sapEvent; /* State machine event */ |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 846 | QDF_STATUS qdf_status = QDF_STATUS_SUCCESS; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 847 | ptSapContext pSapCtx = NULL; |
| 848 | tHalHandle hHal; |
| 849 | tpAniSirGlobal pmac = NULL; |
| 850 | |
| 851 | /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ |
| 852 | |
| 853 | /*------------------------------------------------------------------------ |
| 854 | Sanity check |
| 855 | Extract SAP control block |
| 856 | ------------------------------------------------------------------------*/ |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 857 | pSapCtx = CDS_GET_SAP_CB(pCtx); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 858 | |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 859 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 860 | "wlansap_start_bss: sapContext=%p", pSapCtx); |
| 861 | |
| 862 | if (NULL == pSapCtx) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 863 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 864 | "%s: Invalid SAP pointer from pCtx", |
| 865 | __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 866 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 867 | } |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 868 | pSapCtx->sapsMachine = eSAP_DISCONNECTED; |
| 869 | |
| 870 | /* Channel selection is auto or configured */ |
| 871 | pSapCtx->channel = pConfig->channel; |
Agrawal Ashish | 6563461 | 2016-08-18 13:24:32 +0530 | [diff] [blame] | 872 | pSapCtx->dfs_mode = pConfig->acs_dfs_mode; |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 873 | pSapCtx->ch_params.ch_width = pConfig->ch_params.ch_width; |
| 874 | pSapCtx->ch_params.center_freq_seg0 = |
| 875 | pConfig->ch_params.center_freq_seg0; |
| 876 | pSapCtx->ch_params.center_freq_seg1 = |
| 877 | pConfig->ch_params.center_freq_seg1; |
| 878 | pSapCtx->ch_params.sec_ch_offset = |
| 879 | pConfig->ch_params.sec_ch_offset; |
| 880 | pSapCtx->ch_width_orig = pConfig->ch_width_orig; |
| 881 | #ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH |
| 882 | pSapCtx->cc_switch_mode = pConfig->cc_switch_mode; |
| 883 | #endif |
| 884 | pSapCtx->pUsrContext = pUsrContext; |
| 885 | pSapCtx->enableOverLapCh = pConfig->enOverLapCh; |
| 886 | pSapCtx->acs_cfg = &pConfig->acs_cfg; |
Arif Hussain | 759a023 | 2017-03-20 13:17:18 -0700 | [diff] [blame] | 887 | pSapCtx->dfs_cac_offload = pConfig->dfs_cac_offload; |
Arif Hussain | 957b208 | 2017-05-19 17:16:59 -0700 | [diff] [blame] | 888 | pSapCtx->isCacEndNotified = false; |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 889 | /* Set the BSSID to your "self MAC Addr" read the mac address |
| 890 | from Configuation ITEM received from HDD */ |
| 891 | pSapCtx->csr_roamProfile.BSSIDs.numOfBSSIDs = 1; |
Anurag Chouhan | 600c3a0 | 2016-03-01 10:33:54 +0530 | [diff] [blame] | 892 | qdf_mem_copy(pSapCtx->csr_roamProfile.BSSIDs.bssid, |
Anurag Chouhan | 6d76066 | 2016-02-20 16:05:43 +0530 | [diff] [blame] | 893 | pSapCtx->self_mac_addr, sizeof(struct qdf_mac_addr)); |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 894 | |
| 895 | /* Save a copy to SAP context */ |
Anurag Chouhan | 600c3a0 | 2016-03-01 10:33:54 +0530 | [diff] [blame] | 896 | qdf_mem_copy(pSapCtx->csr_roamProfile.BSSIDs.bssid, |
Anurag Chouhan | 6d76066 | 2016-02-20 16:05:43 +0530 | [diff] [blame] | 897 | pConfig->self_macaddr.bytes, QDF_MAC_ADDR_SIZE); |
Anurag Chouhan | 600c3a0 | 2016-03-01 10:33:54 +0530 | [diff] [blame] | 898 | qdf_mem_copy(pSapCtx->self_mac_addr, |
Anurag Chouhan | 6d76066 | 2016-02-20 16:05:43 +0530 | [diff] [blame] | 899 | pConfig->self_macaddr.bytes, QDF_MAC_ADDR_SIZE); |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 900 | |
| 901 | /* copy the configuration items to csrProfile */ |
| 902 | sapconvert_to_csr_profile(pConfig, eCSR_BSS_TYPE_INFRA_AP, |
| 903 | &pSapCtx->csr_roamProfile); |
| 904 | hHal = (tHalHandle) CDS_GET_HAL_CB(pSapCtx->p_cds_gctx); |
| 905 | if (NULL == hHal) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 906 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 907 | "%s: Invalid MAC context from p_cds_gctx", |
| 908 | __func__); |
Manikandan Mohan | 3dad1a4 | 2017-06-14 10:50:18 -0700 | [diff] [blame^] | 909 | qdf_status = QDF_STATUS_E_FAULT; |
| 910 | goto fail; |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 911 | } |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 912 | pmac = PMAC_STRUCT(hHal); |
| 913 | if (NULL == pmac) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 914 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 915 | "%s: Invalid MAC context from p_cds_gctx", |
| 916 | __func__); |
Manikandan Mohan | 3dad1a4 | 2017-06-14 10:50:18 -0700 | [diff] [blame^] | 917 | qdf_status = QDF_STATUS_E_FAULT; |
| 918 | goto fail; |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 919 | } |
Kiran Kumar Lokere | b1d412e | 2017-04-23 17:19:43 -0700 | [diff] [blame] | 920 | /* If concurrent session is running that is already associated |
| 921 | * then we just follow that sessions country info (whether |
| 922 | * present or not doesn't maater as we have to follow whatever |
| 923 | * STA session does) */ |
| 924 | if ((0 == sme_get_concurrent_operation_channel(hHal)) && |
| 925 | pConfig->ieee80211d) { |
| 926 | /* Setting the region/country information */ |
| 927 | qdf_status = ucfg_reg_set_country(pmac->pdev, |
| 928 | pConfig->countryCode); |
| 929 | if (QDF_IS_STATUS_ERROR(qdf_status)) |
| 930 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
| 931 | FL("Failed to set country")); |
| 932 | } |
| 933 | |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 934 | /* |
| 935 | * Copy the DFS Test Mode setting to pmac for |
| 936 | * access in lower layers |
| 937 | */ |
| 938 | pmac->sap.SapDfsInfo.disable_dfs_ch_switch = |
| 939 | pConfig->disableDFSChSwitch; |
bings | 1fe8a47 | 2017-04-13 03:37:08 +0800 | [diff] [blame] | 940 | pmac->sap.sapCtxList[pSapCtx->sessionId].pSapContext = pSapCtx; |
| 941 | pmac->sap.sapCtxList[pSapCtx->sessionId].sapPersona = |
| 942 | pSapCtx->csr_roamProfile.csrPersona; |
| 943 | pmac->sap.sapCtxList[pSapCtx->sessionId].sessionID = |
| 944 | pSapCtx->sessionId; |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 945 | |
| 946 | /* Copy MAC filtering settings to sap context */ |
| 947 | pSapCtx->eSapMacAddrAclMode = pConfig->SapMacaddr_acl; |
Anurag Chouhan | 600c3a0 | 2016-03-01 10:33:54 +0530 | [diff] [blame] | 948 | qdf_mem_copy(pSapCtx->acceptMacList, pConfig->accept_mac, |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 949 | sizeof(pConfig->accept_mac)); |
| 950 | pSapCtx->nAcceptMac = pConfig->num_accept_mac; |
| 951 | sap_sort_mac_list(pSapCtx->acceptMacList, pSapCtx->nAcceptMac); |
Anurag Chouhan | 600c3a0 | 2016-03-01 10:33:54 +0530 | [diff] [blame] | 952 | qdf_mem_copy(pSapCtx->denyMacList, pConfig->deny_mac, |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 953 | sizeof(pConfig->deny_mac)); |
| 954 | pSapCtx->nDenyMac = pConfig->num_deny_mac; |
| 955 | sap_sort_mac_list(pSapCtx->denyMacList, pSapCtx->nDenyMac); |
| 956 | /* Fill in the event structure for FSM */ |
| 957 | sapEvent.event = eSAP_HDD_START_INFRA_BSS; |
| 958 | sapEvent.params = 0; /* pSapPhysLinkCreate */ |
| 959 | |
| 960 | /* Store the HDD callback in SAP context */ |
| 961 | pSapCtx->pfnSapEventCallback = pSapEventCallback; |
| 962 | |
| 963 | /* Handle event */ |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 964 | qdf_status = sap_fsm(pSapCtx, &sapEvent); |
Manikandan Mohan | 3dad1a4 | 2017-06-14 10:50:18 -0700 | [diff] [blame^] | 965 | fail: |
| 966 | if (QDF_IS_STATUS_ERROR(qdf_status)) |
| 967 | sap_free_roam_profile(&pSapCtx->csr_roamProfile); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 968 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 969 | return qdf_status; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 970 | } /* wlansap_start_bss */ |
| 971 | |
| 972 | /** |
| 973 | * wlansap_set_mac_acl() - set MAC list entry in ACL. |
| 974 | * @pCtx: Pointer to the global cds context; a handle to SAP's control block |
| 975 | * can be extracted from its context. When MBSSID feature is enabled, |
| 976 | * SAP context is directly passed to SAP APIs. |
| 977 | * @pConfig: Pointer to SAP config. |
| 978 | * |
| 979 | * This api function provides SAP to set mac list entry in accept list as well |
| 980 | * as deny list |
| 981 | * |
| 982 | * Return: The result code associated with performing the operation |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 983 | * QDF_STATUS_E_FAULT: Pointer to SAP cb is NULL; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 984 | * access would cause a page fault |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 985 | * QDF_STATUS_SUCCESS: Success |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 986 | */ |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 987 | QDF_STATUS wlansap_set_mac_acl(void *pCtx, /* pwextCtx */ |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 988 | tsap_Config_t *pConfig) { |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 989 | QDF_STATUS qdf_status = QDF_STATUS_SUCCESS; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 990 | ptSapContext pSapCtx = NULL; |
| 991 | |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 992 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 993 | "wlansap_set_mac_acl"); |
| 994 | |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 995 | pSapCtx = CDS_GET_SAP_CB(pCtx); |
| 996 | if (NULL == pSapCtx) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 997 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 998 | "%s: Invalid SAP pointer from pCtx", |
| 999 | __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1000 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1001 | } |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 1002 | /* Copy MAC filtering settings to sap context */ |
| 1003 | pSapCtx->eSapMacAddrAclMode = pConfig->SapMacaddr_acl; |
| 1004 | |
| 1005 | if (eSAP_DENY_UNLESS_ACCEPTED == pSapCtx->eSapMacAddrAclMode) { |
Anurag Chouhan | 600c3a0 | 2016-03-01 10:33:54 +0530 | [diff] [blame] | 1006 | qdf_mem_copy(pSapCtx->acceptMacList, |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 1007 | pConfig->accept_mac, |
| 1008 | sizeof(pConfig->accept_mac)); |
| 1009 | pSapCtx->nAcceptMac = pConfig->num_accept_mac; |
| 1010 | sap_sort_mac_list(pSapCtx->acceptMacList, |
| 1011 | pSapCtx->nAcceptMac); |
| 1012 | } else if (eSAP_ACCEPT_UNLESS_DENIED == |
| 1013 | pSapCtx->eSapMacAddrAclMode) { |
Anurag Chouhan | 600c3a0 | 2016-03-01 10:33:54 +0530 | [diff] [blame] | 1014 | qdf_mem_copy(pSapCtx->denyMacList, pConfig->deny_mac, |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 1015 | sizeof(pConfig->deny_mac)); |
| 1016 | pSapCtx->nDenyMac = pConfig->num_deny_mac; |
| 1017 | sap_sort_mac_list(pSapCtx->denyMacList, pSapCtx->nDenyMac); |
| 1018 | } |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1019 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1020 | return qdf_status; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1021 | } /* wlansap_set_mac_acl */ |
| 1022 | |
| 1023 | /** |
| 1024 | * wlansap_stop_bss() - stop BSS. |
| 1025 | * @pCtx: Pointer to the global cds context; a handle to SAP's control block |
| 1026 | * can be extracted from its context. When MBSSID feature is enabled, |
| 1027 | * SAP context is directly passed to SAP APIs. |
| 1028 | * |
| 1029 | * This api function provides SAP FSM event eSAP_HDD_STOP_INFRA_BSS for |
| 1030 | * stopping AP BSS |
| 1031 | * |
| 1032 | * Return: The result code associated with performing the operation |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1033 | * QDF_STATUS_E_FAULT: Pointer to SAP cb is NULL; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1034 | * access would cause a page fault |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1035 | * QDF_STATUS_SUCCESS: Success |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1036 | */ |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1037 | QDF_STATUS wlansap_stop_bss(void *pCtx) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1038 | { |
| 1039 | tWLAN_SAPEvent sapEvent; /* State machine event */ |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1040 | QDF_STATUS qdf_status = QDF_STATUS_SUCCESS; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1041 | ptSapContext pSapCtx = NULL; |
| 1042 | /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ |
| 1043 | |
| 1044 | /*------------------------------------------------------------------------ |
| 1045 | Sanity check |
| 1046 | Extract SAP control block |
| 1047 | ------------------------------------------------------------------------*/ |
| 1048 | if (NULL == pCtx) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1049 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1050 | "%s: Invalid Global CDS handle", __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1051 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1052 | } |
| 1053 | |
| 1054 | pSapCtx = CDS_GET_SAP_CB(pCtx); |
| 1055 | |
| 1056 | if (NULL == pSapCtx) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1057 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1058 | "%s: Invalid SAP pointer from pCtx", __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1059 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1060 | } |
| 1061 | |
| 1062 | /* Fill in the event structure for FSM */ |
| 1063 | sapEvent.event = eSAP_HDD_STOP_INFRA_BSS; |
| 1064 | sapEvent.params = 0; |
| 1065 | |
| 1066 | /* Handle event */ |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1067 | qdf_status = sap_fsm(pSapCtx, &sapEvent); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1068 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1069 | return qdf_status; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1070 | } |
| 1071 | |
| 1072 | /** |
| 1073 | * wlansap_get_assoc_stations() - get list of associated stations. |
| 1074 | * @pCtx: Pointer to the global cds context; a handle to SAP's control block |
| 1075 | * can be extracted from its context. When MBSSID feature is enabled, |
| 1076 | * SAP context is directly passed to SAP APIs. |
| 1077 | * @modId: Module from whom list of associtated stations is supposed to be |
| 1078 | * probed. If an invalid module is passed then by default |
Anurag Chouhan | 6d76066 | 2016-02-20 16:05:43 +0530 | [diff] [blame] | 1079 | * QDF_MODULE_ID_PE will be probed |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1080 | * @pAssocStas: Pointer to list of associated stations that are known to the |
| 1081 | * module specified in mod parameter |
| 1082 | * |
| 1083 | * This api function is used to probe the list of associated stations from |
| 1084 | * various modules of CORE stack |
| 1085 | * NOTE: The memory for this list will be allocated by the caller of this API |
| 1086 | * |
| 1087 | * Return: The result code associated with performing the operation |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1088 | * QDF_STATUS_SUCCESS: Success |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1089 | */ |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1090 | QDF_STATUS |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1091 | wlansap_get_assoc_stations |
Anurag Chouhan | 6d76066 | 2016-02-20 16:05:43 +0530 | [diff] [blame] | 1092 | (void *pCtx, QDF_MODULE_ID modId, tpSap_AssocMacAddr pAssocStas) { |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1093 | ptSapContext pSapCtx = CDS_GET_SAP_CB(pCtx); |
| 1094 | |
| 1095 | /*------------------------------------------------------------------------ |
| 1096 | Sanity check |
| 1097 | Extract SAP control block |
| 1098 | ------------------------------------------------------------------------*/ |
| 1099 | if (NULL == pSapCtx) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1100 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1101 | "%s: Invalid SAP pointer from pCtx", __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1102 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1103 | } |
| 1104 | |
| 1105 | sme_roam_get_associated_stas(CDS_GET_HAL_CB(pSapCtx->p_cds_gctx), |
| 1106 | pSapCtx->sessionId, modId, |
| 1107 | pSapCtx->pUsrContext, |
| 1108 | (void **) pSapCtx->pfnSapEventCallback, |
| 1109 | (uint8_t *) pAssocStas); |
| 1110 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1111 | return QDF_STATUS_SUCCESS; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1112 | } |
| 1113 | |
| 1114 | /** |
| 1115 | * wlansap_remove_wps_session_overlap() - remove overlapping wps session. |
| 1116 | * @pCtx: Pointer to the global cds context; a handle to SAP's control block |
| 1117 | * can be extracted from its context. When MBSSID feature is enabled, |
| 1118 | * SAP context is directly passed to SAP APIs. |
Anurag Chouhan | 6d76066 | 2016-02-20 16:05:43 +0530 | [diff] [blame] | 1119 | * @pRemoveMac: pointer to struct qdf_mac_addr for session MAC address |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1120 | * |
| 1121 | * This api function provides for Ap App/HDD to remove an entry from session |
| 1122 | * overlap info. |
| 1123 | * |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1124 | * Return: The QDF_STATUS code associated with performing the operation |
| 1125 | * QDF_STATUS_SUCCESS: Success |
| 1126 | * QDF_STATUS_E_FAULT: Session is not dectected. |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1127 | * The parameter is function not valid. |
| 1128 | */ |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1129 | QDF_STATUS |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1130 | wlansap_remove_wps_session_overlap(void *pCtx, |
Anurag Chouhan | 6d76066 | 2016-02-20 16:05:43 +0530 | [diff] [blame] | 1131 | struct qdf_mac_addr pRemoveMac) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1132 | { |
| 1133 | ptSapContext pSapCtx = CDS_GET_SAP_CB(pCtx); |
| 1134 | |
| 1135 | /*------------------------------------------------------------------------ |
| 1136 | Sanity check |
| 1137 | Extract SAP control block |
| 1138 | ------------------------------------------------------------------------*/ |
| 1139 | if (NULL == pSapCtx) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1140 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1141 | "%s: Invalid SAP pointer from pCtx", __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1142 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1143 | } |
| 1144 | |
| 1145 | sme_roam_get_wps_session_overlap(CDS_GET_HAL_CB(pSapCtx->p_cds_gctx), |
| 1146 | pSapCtx->sessionId, pSapCtx->pUsrContext, |
| 1147 | (void **) pSapCtx->pfnSapEventCallback, |
| 1148 | pRemoveMac); |
| 1149 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1150 | return QDF_STATUS_SUCCESS; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1151 | } |
| 1152 | |
| 1153 | /** |
| 1154 | * wlansap_get_wps_session_overlap() - get overlapping wps session. |
| 1155 | * @pCtx: Pointer to the global cds context; a handle to SAP's control block |
| 1156 | * can be extracted from its context. When MBSSID feature is enabled, |
| 1157 | * SAP context is directly passed to SAP APIs. |
| 1158 | * |
| 1159 | * This api function provides for Ap App/HDD to get WPS session overlap info. |
| 1160 | * |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1161 | * Return: The QDF_STATUS code associated with performing the operation |
| 1162 | * QDF_STATUS_SUCCESS: Success |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1163 | */ |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1164 | QDF_STATUS wlansap_get_wps_session_overlap(void *pCtx) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1165 | { |
Anurag Chouhan | 6d76066 | 2016-02-20 16:05:43 +0530 | [diff] [blame] | 1166 | struct qdf_mac_addr pRemoveMac = QDF_MAC_ADDR_ZERO_INITIALIZER; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1167 | |
| 1168 | ptSapContext pSapCtx = CDS_GET_SAP_CB(pCtx); |
| 1169 | |
| 1170 | /*------------------------------------------------------------------------ |
| 1171 | Sanity check |
| 1172 | Extract SAP control block |
| 1173 | ------------------------------------------------------------------------*/ |
| 1174 | if (NULL == pSapCtx) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1175 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1176 | "%s: Invalid SAP pointer from pCtx", __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1177 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1178 | } |
| 1179 | |
| 1180 | sme_roam_get_wps_session_overlap(CDS_GET_HAL_CB(pSapCtx->p_cds_gctx), |
| 1181 | pSapCtx->sessionId, pSapCtx->pUsrContext, |
| 1182 | (void **) pSapCtx->pfnSapEventCallback, |
| 1183 | pRemoveMac); |
| 1184 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1185 | return QDF_STATUS_SUCCESS; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1186 | } |
| 1187 | |
| 1188 | /* This routine will set the mode of operation for ACL dynamically*/ |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1189 | QDF_STATUS wlansap_set_mode(void *pCtx, uint32_t mode) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1190 | { |
| 1191 | ptSapContext pSapCtx = CDS_GET_SAP_CB(pCtx); |
| 1192 | |
| 1193 | if (NULL == pSapCtx) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1194 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1195 | "%s: Invalid SAP pointer from pCtx", __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1196 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1197 | } |
| 1198 | |
| 1199 | pSapCtx->eSapMacAddrAclMode = (eSapMacAddrACL) mode; |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1200 | return QDF_STATUS_SUCCESS; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1201 | } |
| 1202 | |
| 1203 | /* Get ACL Mode */ |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1204 | QDF_STATUS wlansap_get_acl_mode(void *pCtx, eSapMacAddrACL *mode) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1205 | { |
| 1206 | ptSapContext pSapCtx = CDS_GET_SAP_CB(pCtx); |
| 1207 | |
| 1208 | if (NULL == pSapCtx) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1209 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1210 | "%s: Invalid SAP pointer from pCtx", __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1211 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1212 | } |
| 1213 | |
| 1214 | *mode = pSapCtx->eSapMacAddrAclMode; |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1215 | return QDF_STATUS_SUCCESS; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1216 | } |
| 1217 | |
| 1218 | /* API to get ACL Accept List */ |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1219 | QDF_STATUS |
Anurag Chouhan | 6d76066 | 2016-02-20 16:05:43 +0530 | [diff] [blame] | 1220 | wlansap_get_acl_accept_list(void *pCtx, struct qdf_mac_addr *pAcceptList, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1221 | uint8_t *nAcceptList) |
| 1222 | { |
| 1223 | ptSapContext pSapCtx = CDS_GET_SAP_CB(pCtx); |
| 1224 | if (NULL == pSapCtx) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1225 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1226 | "%s: Invalid SAP pointer from p_cds_gctx", __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1227 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1228 | } |
| 1229 | |
| 1230 | memcpy((void *)pAcceptList, (void *)pSapCtx->acceptMacList, |
Anurag Chouhan | 6d76066 | 2016-02-20 16:05:43 +0530 | [diff] [blame] | 1231 | (pSapCtx->nAcceptMac * QDF_MAC_ADDR_SIZE)); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1232 | *nAcceptList = pSapCtx->nAcceptMac; |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1233 | return QDF_STATUS_SUCCESS; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1234 | } |
| 1235 | |
| 1236 | /* API to get Deny List */ |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1237 | QDF_STATUS |
Anurag Chouhan | 6d76066 | 2016-02-20 16:05:43 +0530 | [diff] [blame] | 1238 | wlansap_get_acl_deny_list(void *pCtx, struct qdf_mac_addr *pDenyList, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1239 | uint8_t *nDenyList) |
| 1240 | { |
| 1241 | ptSapContext pSapCtx = CDS_GET_SAP_CB(pCtx); |
| 1242 | if (NULL == pSapCtx) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1243 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1244 | "%s: Invalid SAP pointer from p_cds_gctx", __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1245 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1246 | } |
| 1247 | |
| 1248 | memcpy((void *)pDenyList, (void *)pSapCtx->denyMacList, |
Anurag Chouhan | 6d76066 | 2016-02-20 16:05:43 +0530 | [diff] [blame] | 1249 | (pSapCtx->nDenyMac * QDF_MAC_ADDR_SIZE)); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1250 | *nDenyList = pSapCtx->nDenyMac; |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1251 | return QDF_STATUS_SUCCESS; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1252 | } |
| 1253 | |
| 1254 | /* This routine will clear all the entries in accept list as well as deny list */ |
| 1255 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1256 | QDF_STATUS wlansap_clear_acl(void *pCtx) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1257 | { |
| 1258 | ptSapContext pSapCtx = CDS_GET_SAP_CB(pCtx); |
| 1259 | uint8_t i; |
| 1260 | |
| 1261 | if (NULL == pSapCtx) { |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1262 | return QDF_STATUS_E_RESOURCES; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1263 | } |
| 1264 | |
| 1265 | if (pSapCtx->denyMacList != NULL) { |
| 1266 | for (i = 0; i < (pSapCtx->nDenyMac - 1); i++) { |
Anurag Chouhan | 600c3a0 | 2016-03-01 10:33:54 +0530 | [diff] [blame] | 1267 | qdf_mem_zero((pSapCtx->denyMacList + i)->bytes, |
Anurag Chouhan | 6d76066 | 2016-02-20 16:05:43 +0530 | [diff] [blame] | 1268 | QDF_MAC_ADDR_SIZE); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1269 | |
| 1270 | } |
| 1271 | } |
| 1272 | sap_print_acl(pSapCtx->denyMacList, pSapCtx->nDenyMac); |
| 1273 | pSapCtx->nDenyMac = 0; |
| 1274 | |
| 1275 | if (pSapCtx->acceptMacList != NULL) { |
| 1276 | for (i = 0; i < (pSapCtx->nAcceptMac - 1); i++) { |
Anurag Chouhan | 600c3a0 | 2016-03-01 10:33:54 +0530 | [diff] [blame] | 1277 | qdf_mem_zero((pSapCtx->acceptMacList + i)->bytes, |
Anurag Chouhan | 6d76066 | 2016-02-20 16:05:43 +0530 | [diff] [blame] | 1278 | QDF_MAC_ADDR_SIZE); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1279 | |
| 1280 | } |
| 1281 | } |
| 1282 | sap_print_acl(pSapCtx->acceptMacList, pSapCtx->nAcceptMac); |
| 1283 | pSapCtx->nAcceptMac = 0; |
| 1284 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1285 | return QDF_STATUS_SUCCESS; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1286 | } |
| 1287 | |
| 1288 | /* |
| 1289 | * wlansap_modify_acl() -Update ACL entries |
| 1290 | * |
| 1291 | * @ctx: Global context |
| 1292 | * @peer_sta_mac: peer sta mac to be updated. |
| 1293 | * @list_type: white/Black list type. |
| 1294 | * @cmd: command to be executed on ACL. |
| 1295 | * |
| 1296 | * This function is called when a peer needs to be added or deleted from the |
| 1297 | * white/black ACL |
| 1298 | * |
| 1299 | * Return: Status |
| 1300 | */ |
| 1301 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1302 | QDF_STATUS |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1303 | wlansap_modify_acl |
| 1304 | (void *ctx, |
| 1305 | uint8_t *peer_sta_mac, eSapACLType list_type, eSapACLCmdType cmd) { |
| 1306 | eSapBool sta_white_list = eSAP_FALSE, sta_black_list = eSAP_FALSE; |
| 1307 | uint8_t staWLIndex, staBLIndex; |
| 1308 | ptSapContext sap_ctx = CDS_GET_SAP_CB(ctx); |
| 1309 | |
| 1310 | if (NULL == sap_ctx) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1311 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1312 | "%s: Invalid SAP Context", __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1313 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1314 | } |
| 1315 | |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1316 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_LOW, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1317 | "Modify ACL entered\n" "Before modification of ACL\n" |
| 1318 | "size of accept and deny lists %d %d", sap_ctx->nAcceptMac, |
| 1319 | sap_ctx->nDenyMac); |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1320 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1321 | "*** WHITE LIST ***"); |
| 1322 | sap_print_acl(sap_ctx->acceptMacList, sap_ctx->nAcceptMac); |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1323 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1324 | "*** BLACK LIST ***"); |
| 1325 | sap_print_acl(sap_ctx->denyMacList, sap_ctx->nDenyMac); |
| 1326 | |
| 1327 | /* the expectation is a mac addr will not be in both the lists at the same time. |
| 1328 | It is the responsiblity of userspace to ensure this */ |
| 1329 | sta_white_list = |
| 1330 | sap_search_mac_list(sap_ctx->acceptMacList, sap_ctx->nAcceptMac, |
| 1331 | peer_sta_mac, &staWLIndex); |
| 1332 | sta_black_list = |
| 1333 | sap_search_mac_list(sap_ctx->denyMacList, sap_ctx->nDenyMac, |
| 1334 | peer_sta_mac, &staBLIndex); |
| 1335 | |
| 1336 | if (sta_white_list && sta_black_list) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1337 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1338 | "Peer mac " MAC_ADDRESS_STR |
| 1339 | " found in white and black lists." |
| 1340 | "Initial lists passed incorrect. Cannot execute this command.", |
| 1341 | MAC_ADDR_ARRAY(peer_sta_mac)); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1342 | return QDF_STATUS_E_FAILURE; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1343 | |
| 1344 | } |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1345 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_LOW, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1346 | "cmd %d", cmd); |
| 1347 | |
| 1348 | switch (list_type) { |
| 1349 | case eSAP_WHITE_LIST: |
| 1350 | if (cmd == ADD_STA_TO_ACL) { |
| 1351 | /* error check */ |
| 1352 | /* if list is already at max, return failure */ |
| 1353 | if (sap_ctx->nAcceptMac == MAX_ACL_MAC_ADDRESS) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1354 | QDF_TRACE(QDF_MODULE_ID_SAP, |
| 1355 | QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1356 | "White list is already maxed out. Cannot accept " |
| 1357 | MAC_ADDRESS_STR, |
| 1358 | MAC_ADDR_ARRAY(peer_sta_mac)); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1359 | return QDF_STATUS_E_FAILURE; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1360 | } |
| 1361 | if (sta_white_list) { |
| 1362 | /* Do nothing if already present in white list. Just print a warning */ |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1363 | QDF_TRACE(QDF_MODULE_ID_SAP, |
| 1364 | QDF_TRACE_LEVEL_WARN, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1365 | "MAC address already present in white list " |
| 1366 | MAC_ADDRESS_STR, |
| 1367 | MAC_ADDR_ARRAY(peer_sta_mac)); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1368 | return QDF_STATUS_SUCCESS; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1369 | } |
| 1370 | if (sta_black_list) { |
| 1371 | /* remove it from black list before adding to the white list */ |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1372 | QDF_TRACE(QDF_MODULE_ID_SAP, |
| 1373 | QDF_TRACE_LEVEL_WARN, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1374 | "STA present in black list so first remove from it"); |
| 1375 | sap_remove_mac_from_acl(sap_ctx-> |
| 1376 | denyMacList, |
| 1377 | &sap_ctx->nDenyMac, |
| 1378 | staBLIndex); |
| 1379 | } |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1380 | QDF_TRACE(QDF_MODULE_ID_SAP, |
| 1381 | QDF_TRACE_LEVEL_INFO, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1382 | "... Now add to the white list"); |
| 1383 | sap_add_mac_to_acl(sap_ctx->acceptMacList, |
| 1384 | &sap_ctx->nAcceptMac, |
| 1385 | peer_sta_mac); |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1386 | QDF_TRACE(QDF_MODULE_ID_SAP, |
| 1387 | QDF_TRACE_LEVEL_INFO_LOW, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1388 | "size of accept and deny lists %d %d", |
| 1389 | sap_ctx->nAcceptMac, |
| 1390 | sap_ctx->nDenyMac); |
| 1391 | } else if (cmd == DELETE_STA_FROM_ACL) { |
| 1392 | if (sta_white_list) { |
| 1393 | |
| 1394 | struct tagCsrDelStaParams delStaParams; |
| 1395 | |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1396 | QDF_TRACE(QDF_MODULE_ID_SAP, |
| 1397 | QDF_TRACE_LEVEL_INFO, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1398 | "Delete from white list"); |
| 1399 | sap_remove_mac_from_acl(sap_ctx->acceptMacList, |
| 1400 | &sap_ctx->nAcceptMac, |
| 1401 | staWLIndex); |
| 1402 | /* If a client is deleted from white list and it is connected, send deauth */ |
| 1403 | wlansap_populate_del_sta_params(peer_sta_mac, |
| 1404 | eCsrForcedDeauthSta, |
| 1405 | (SIR_MAC_MGMT_DEAUTH >> 4), |
| 1406 | &delStaParams); |
| 1407 | wlansap_deauth_sta(ctx, &delStaParams); |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1408 | QDF_TRACE(QDF_MODULE_ID_SAP, |
| 1409 | QDF_TRACE_LEVEL_INFO_LOW, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1410 | "size of accept and deny lists %d %d", |
| 1411 | sap_ctx->nAcceptMac, |
| 1412 | sap_ctx->nDenyMac); |
| 1413 | } else { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1414 | QDF_TRACE(QDF_MODULE_ID_SAP, |
| 1415 | QDF_TRACE_LEVEL_WARN, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1416 | "MAC address to be deleted is not present in the white list " |
| 1417 | MAC_ADDRESS_STR, |
| 1418 | MAC_ADDR_ARRAY(peer_sta_mac)); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1419 | return QDF_STATUS_E_FAILURE; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1420 | } |
| 1421 | } else { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1422 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1423 | "Invalid cmd type passed"); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1424 | return QDF_STATUS_E_FAILURE; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1425 | } |
| 1426 | break; |
| 1427 | |
| 1428 | case eSAP_BLACK_LIST: |
| 1429 | |
| 1430 | if (cmd == ADD_STA_TO_ACL) { |
| 1431 | struct tagCsrDelStaParams delStaParams; |
| 1432 | /* error check */ |
| 1433 | /* if list is already at max, return failure */ |
| 1434 | if (sap_ctx->nDenyMac == MAX_ACL_MAC_ADDRESS) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1435 | QDF_TRACE(QDF_MODULE_ID_SAP, |
| 1436 | QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1437 | "Black list is already maxed out. Cannot accept " |
| 1438 | MAC_ADDRESS_STR, |
| 1439 | MAC_ADDR_ARRAY(peer_sta_mac)); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1440 | return QDF_STATUS_E_FAILURE; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1441 | } |
| 1442 | if (sta_black_list) { |
| 1443 | /* Do nothing if already present in white list */ |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1444 | QDF_TRACE(QDF_MODULE_ID_SAP, |
| 1445 | QDF_TRACE_LEVEL_WARN, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1446 | "MAC address already present in black list " |
| 1447 | MAC_ADDRESS_STR, |
| 1448 | MAC_ADDR_ARRAY(peer_sta_mac)); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1449 | return QDF_STATUS_SUCCESS; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1450 | } |
| 1451 | if (sta_white_list) { |
| 1452 | /* remove it from white list before adding to the black list */ |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1453 | QDF_TRACE(QDF_MODULE_ID_SAP, |
| 1454 | QDF_TRACE_LEVEL_WARN, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1455 | "Present in white list so first remove from it"); |
| 1456 | sap_remove_mac_from_acl(sap_ctx-> |
| 1457 | acceptMacList, |
| 1458 | &sap_ctx-> |
| 1459 | nAcceptMac, |
| 1460 | staWLIndex); |
| 1461 | } |
| 1462 | /* If we are adding a client to the black list; if its connected, send deauth */ |
| 1463 | wlansap_populate_del_sta_params(peer_sta_mac, |
| 1464 | eCsrForcedDeauthSta, |
| 1465 | (SIR_MAC_MGMT_DEAUTH >> 4), |
| 1466 | &delStaParams); |
| 1467 | wlansap_deauth_sta(ctx, &delStaParams); |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1468 | QDF_TRACE(QDF_MODULE_ID_SAP, |
| 1469 | QDF_TRACE_LEVEL_INFO, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1470 | "... Now add to black list"); |
| 1471 | sap_add_mac_to_acl(sap_ctx->denyMacList, |
| 1472 | &sap_ctx->nDenyMac, peer_sta_mac); |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1473 | QDF_TRACE(QDF_MODULE_ID_SAP, |
| 1474 | QDF_TRACE_LEVEL_INFO_LOW, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1475 | "size of accept and deny lists %d %d", |
| 1476 | sap_ctx->nAcceptMac, |
| 1477 | sap_ctx->nDenyMac); |
| 1478 | } else if (cmd == DELETE_STA_FROM_ACL) { |
| 1479 | if (sta_black_list) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1480 | QDF_TRACE(QDF_MODULE_ID_SAP, |
| 1481 | QDF_TRACE_LEVEL_INFO, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1482 | "Delete from black list"); |
| 1483 | sap_remove_mac_from_acl(sap_ctx->denyMacList, |
| 1484 | &sap_ctx->nDenyMac, |
| 1485 | staBLIndex); |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1486 | QDF_TRACE(QDF_MODULE_ID_SAP, |
| 1487 | QDF_TRACE_LEVEL_INFO_LOW, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1488 | "no accept and deny mac %d %d", |
| 1489 | sap_ctx->nAcceptMac, |
| 1490 | sap_ctx->nDenyMac); |
| 1491 | } else { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1492 | QDF_TRACE(QDF_MODULE_ID_SAP, |
| 1493 | QDF_TRACE_LEVEL_WARN, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1494 | "MAC address to be deleted is not present in the black list " |
| 1495 | MAC_ADDRESS_STR, |
| 1496 | MAC_ADDR_ARRAY(peer_sta_mac)); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1497 | return QDF_STATUS_E_FAILURE; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1498 | } |
| 1499 | } else { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1500 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1501 | "Invalid cmd type passed"); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1502 | return QDF_STATUS_E_FAILURE; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1503 | } |
| 1504 | break; |
| 1505 | |
| 1506 | default: |
| 1507 | { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1508 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1509 | "Invalid list type passed %d", list_type); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1510 | return QDF_STATUS_E_FAILURE; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1511 | } |
| 1512 | } |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1513 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_LOW, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1514 | "After modification of ACL"); |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1515 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1516 | "*** WHITE LIST ***"); |
| 1517 | sap_print_acl(sap_ctx->acceptMacList, sap_ctx->nAcceptMac); |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1518 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1519 | "*** BLACK LIST ***"); |
| 1520 | sap_print_acl(sap_ctx->denyMacList, sap_ctx->nDenyMac); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1521 | return QDF_STATUS_SUCCESS; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1522 | } |
| 1523 | |
| 1524 | /** |
| 1525 | * wlansap_disassoc_sta() - initiate disassociation of station. |
| 1526 | * @pCtx: Pointer to the global cds context; a handle to SAP's control block |
| 1527 | * can be extracted from its context. When MBSSID feature is enabled, |
| 1528 | * SAP context is directly passed to SAP APIs. |
Deepthi Gowri | b3bfefd | 2016-09-13 15:14:34 +0530 | [diff] [blame] | 1529 | * @p_del_sta_params: pointer to station deletion parameters |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1530 | * |
| 1531 | * This api function provides for Ap App/HDD initiated disassociation of station |
| 1532 | * |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1533 | * Return: The QDF_STATUS code associated with performing the operation |
| 1534 | * QDF_STATUS_SUCCESS: Success |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1535 | */ |
Deepthi Gowri | b3bfefd | 2016-09-13 15:14:34 +0530 | [diff] [blame] | 1536 | QDF_STATUS wlansap_disassoc_sta(void *pCtx, |
| 1537 | struct tagCsrDelStaParams *p_del_sta_params) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1538 | { |
| 1539 | ptSapContext pSapCtx = CDS_GET_SAP_CB(pCtx); |
| 1540 | |
| 1541 | /*------------------------------------------------------------------------ |
| 1542 | Sanity check |
| 1543 | Extract SAP control block |
| 1544 | ------------------------------------------------------------------------*/ |
| 1545 | if (NULL == pSapCtx) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1546 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1547 | "%s: Invalid SAP pointer from pCtx", __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1548 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1549 | } |
| 1550 | |
| 1551 | sme_roam_disconnect_sta(CDS_GET_HAL_CB(pSapCtx->p_cds_gctx), |
Deepthi Gowri | b3bfefd | 2016-09-13 15:14:34 +0530 | [diff] [blame] | 1552 | pSapCtx->sessionId, p_del_sta_params); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1553 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1554 | return QDF_STATUS_SUCCESS; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1555 | } |
| 1556 | |
| 1557 | /** |
| 1558 | * wlansap_deauth_sta() - Ap App/HDD initiated deauthentication of station |
| 1559 | * @pCtx : Pointer to the global cds context; a handle to SAP's |
| 1560 | * control block can be extracted from its context |
| 1561 | * When MBSSID feature is enabled, SAP context is directly |
| 1562 | * passed to SAP APIs |
| 1563 | * @pDelStaParams : Pointer to parameters of the station to deauthenticate |
| 1564 | * |
| 1565 | * This api function provides for Ap App/HDD initiated deauthentication of |
| 1566 | * station |
| 1567 | * |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1568 | * Return: The QDF_STATUS code associated with performing the operation |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1569 | */ |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1570 | QDF_STATUS wlansap_deauth_sta(void *pCtx, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1571 | struct tagCsrDelStaParams *pDelStaParams) |
| 1572 | { |
Anurag Chouhan | f04e84f | 2016-03-03 10:12:12 +0530 | [diff] [blame] | 1573 | QDF_STATUS qdf_ret_status = QDF_STATUS_E_FAILURE; |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1574 | QDF_STATUS qdf_status = QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1575 | ptSapContext pSapCtx = CDS_GET_SAP_CB(pCtx); |
| 1576 | |
| 1577 | /*------------------------------------------------------------------------ |
| 1578 | Sanity check |
| 1579 | Extract SAP control block |
| 1580 | ------------------------------------------------------------------------*/ |
| 1581 | if (NULL == pSapCtx) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1582 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1583 | "%s: Invalid SAP pointer from pCtx", __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1584 | return qdf_status; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1585 | } |
| 1586 | |
Anurag Chouhan | f04e84f | 2016-03-03 10:12:12 +0530 | [diff] [blame] | 1587 | qdf_ret_status = |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1588 | sme_roam_deauth_sta(CDS_GET_HAL_CB(pSapCtx->p_cds_gctx), |
| 1589 | pSapCtx->sessionId, pDelStaParams); |
| 1590 | |
Anurag Chouhan | f04e84f | 2016-03-03 10:12:12 +0530 | [diff] [blame] | 1591 | if (qdf_ret_status == QDF_STATUS_SUCCESS) { |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1592 | qdf_status = QDF_STATUS_SUCCESS; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1593 | } |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1594 | return qdf_status; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1595 | } |
| 1596 | |
Edhar, Mahesh Kumar | bd8b391 | 2015-11-25 19:28:12 +0530 | [diff] [blame] | 1597 | /** |
| 1598 | * wlansap_update_bw80_cbmode() - fucntion to update channel bonding mode for |
| 1599 | * VHT80 channel. |
| 1600 | * @channel: target channel |
| 1601 | * @sme_config: sme configuration context |
| 1602 | * |
| 1603 | * Return: none |
| 1604 | */ |
| 1605 | static inline void wlansap_update_bw80_cbmode(uint32_t channel, |
| 1606 | tSmeConfigParams *sme_config) |
| 1607 | { |
| 1608 | if (channel == 36 || channel == 52 || channel == 100 || |
| 1609 | channel == 116 || channel == 149 || channel == 132) { |
| 1610 | sme_config->csrConfig.channelBondingMode5GHz = |
| 1611 | eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW; |
| 1612 | } else if (channel == 40 || channel == 56 || channel == 104 || |
| 1613 | channel == 120 || channel == 153 || channel == 136) { |
| 1614 | sme_config->csrConfig.channelBondingMode5GHz = |
| 1615 | eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW; |
| 1616 | } else if (channel == 44 || channel == 60 || channel == 108 || |
| 1617 | channel == 124 || channel == 157 || channel == 140) { |
| 1618 | sme_config->csrConfig.channelBondingMode5GHz = |
| 1619 | eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH; |
| 1620 | } else if (channel == 48 || channel == 64 || channel == 112 || |
| 1621 | channel == 128 || channel == 144 || channel == 161) { |
| 1622 | sme_config->csrConfig.channelBondingMode5GHz = |
| 1623 | eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH; |
| 1624 | } |
| 1625 | } |
| 1626 | |
| 1627 | /** |
| 1628 | * wlansap_update_csa_channel_params() - fucntion to populate channel width and |
| 1629 | * bonding modes. |
| 1630 | * @sap_context: sap adapter context |
| 1631 | * @channel: target channel |
| 1632 | * |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1633 | * Return: The QDF_STATUS code associated with performing the operation |
Edhar, Mahesh Kumar | bd8b391 | 2015-11-25 19:28:12 +0530 | [diff] [blame] | 1634 | */ |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1635 | static QDF_STATUS wlansap_update_csa_channel_params(ptSapContext sap_context, |
Edhar, Mahesh Kumar | bd8b391 | 2015-11-25 19:28:12 +0530 | [diff] [blame] | 1636 | uint32_t channel) |
| 1637 | { |
| 1638 | void *hal; |
| 1639 | tpAniSirGlobal mac_ctx; |
Edhar, Mahesh Kumar | bd8b391 | 2015-11-25 19:28:12 +0530 | [diff] [blame] | 1640 | uint8_t bw; |
| 1641 | |
| 1642 | hal = CDS_GET_HAL_CB(sap_context->p_cds_gctx); |
| 1643 | if (!hal) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1644 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Edhar, Mahesh Kumar | bd8b391 | 2015-11-25 19:28:12 +0530 | [diff] [blame] | 1645 | "%s: Invalid hal pointer from p_cds_gctx", __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1646 | return QDF_STATUS_E_FAULT; |
Edhar, Mahesh Kumar | bd8b391 | 2015-11-25 19:28:12 +0530 | [diff] [blame] | 1647 | } |
| 1648 | |
| 1649 | mac_ctx = PMAC_STRUCT(hal); |
| 1650 | |
Amar Singhal | b8d4f15 | 2016-02-10 10:21:43 -0800 | [diff] [blame] | 1651 | if (channel <= CHAN_ENUM_14) { |
Edhar, Mahesh Kumar | bd8b391 | 2015-11-25 19:28:12 +0530 | [diff] [blame] | 1652 | /* |
| 1653 | * currently OBSS scan is done in hostapd, so to avoid |
| 1654 | * SAP coming up in HT40 on channel switch we are |
| 1655 | * disabling channel bonding in 2.4Ghz. |
| 1656 | */ |
Edhar, Mahesh Kumar | bd8b391 | 2015-11-25 19:28:12 +0530 | [diff] [blame] | 1657 | mac_ctx->sap.SapDfsInfo.new_chanWidth = 0; |
| 1658 | |
| 1659 | } else { |
| 1660 | |
| 1661 | if (sap_context->ch_width_orig >= CH_WIDTH_80MHZ) |
| 1662 | bw = BW80; |
| 1663 | else if (sap_context->ch_width_orig == CH_WIDTH_40MHZ) |
| 1664 | bw = BW40_HIGH_PRIMARY; |
| 1665 | else |
| 1666 | bw = BW20; |
| 1667 | |
| 1668 | for (; bw >= BW20; bw--) { |
| 1669 | uint16_t op_class; |
| 1670 | |
Kiran Kumar Lokere | a3de226 | 2017-04-12 12:15:04 -0700 | [diff] [blame] | 1671 | op_class = wlan_reg_dmn_get_opclass_from_channel( |
Edhar, Mahesh Kumar | bd8b391 | 2015-11-25 19:28:12 +0530 | [diff] [blame] | 1672 | mac_ctx->scan.countryCodeCurrent, |
| 1673 | channel, bw); |
| 1674 | if (!op_class) |
| 1675 | continue; |
| 1676 | |
| 1677 | if (bw == BW80) { |
Edhar, Mahesh Kumar | bd8b391 | 2015-11-25 19:28:12 +0530 | [diff] [blame] | 1678 | mac_ctx->sap.SapDfsInfo.new_chanWidth = |
| 1679 | CH_WIDTH_80MHZ; |
| 1680 | } else if (bw == BW40_HIGH_PRIMARY) { |
| 1681 | mac_ctx->sap.SapDfsInfo.new_chanWidth = |
| 1682 | CH_WIDTH_40MHZ; |
Edhar, Mahesh Kumar | bd8b391 | 2015-11-25 19:28:12 +0530 | [diff] [blame] | 1683 | } else if (bw == BW40_LOW_PRIMARY) { |
| 1684 | mac_ctx->sap.SapDfsInfo.new_chanWidth = |
| 1685 | CH_WIDTH_40MHZ; |
Edhar, Mahesh Kumar | bd8b391 | 2015-11-25 19:28:12 +0530 | [diff] [blame] | 1686 | } else { |
| 1687 | mac_ctx->sap.SapDfsInfo.new_chanWidth = |
| 1688 | CH_WIDTH_20MHZ; |
Edhar, Mahesh Kumar | bd8b391 | 2015-11-25 19:28:12 +0530 | [diff] [blame] | 1689 | } |
| 1690 | break; |
| 1691 | } |
| 1692 | |
| 1693 | } |
| 1694 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1695 | return QDF_STATUS_SUCCESS; |
Edhar, Mahesh Kumar | bd8b391 | 2015-11-25 19:28:12 +0530 | [diff] [blame] | 1696 | } |
| 1697 | |
Chandrasekaran, Manishekar | a74bb02 | 2016-01-12 18:37:43 +0530 | [diff] [blame] | 1698 | /** |
| 1699 | * wlansap_set_channel_change_with_csa() - Set channel change with CSA |
| 1700 | * @p_cds_gctx: Pointer to cds global context structure |
| 1701 | * @targetChannel: Target channel |
| 1702 | * @target_bw: Target bandwidth |
| 1703 | * |
| 1704 | * This api function does a channel change to the target channel specified. |
| 1705 | * CSA IE is included in the beacons before doing a channel change. |
| 1706 | * |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1707 | * Return: QDF_STATUS |
Chandrasekaran, Manishekar | a74bb02 | 2016-01-12 18:37:43 +0530 | [diff] [blame] | 1708 | */ |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1709 | QDF_STATUS |
Chandrasekaran, Manishekar | a74bb02 | 2016-01-12 18:37:43 +0530 | [diff] [blame] | 1710 | wlansap_set_channel_change_with_csa(void *p_cds_gctx, uint32_t targetChannel, |
Kiran Kumar Lokere | 1364467 | 2016-02-29 15:40:10 -0800 | [diff] [blame] | 1711 | enum phy_ch_width target_bw) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1712 | { |
| 1713 | |
| 1714 | ptSapContext sapContext = NULL; |
| 1715 | tWLAN_SAPEvent sapEvent; |
| 1716 | tpAniSirGlobal pMac = NULL; |
| 1717 | void *hHal = NULL; |
Edhar, Mahesh Kumar | df2ec12 | 2015-11-16 11:33:16 +0530 | [diff] [blame] | 1718 | bool valid; |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1719 | QDF_STATUS status; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1720 | |
| 1721 | sapContext = CDS_GET_SAP_CB(p_cds_gctx); |
| 1722 | if (NULL == sapContext) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1723 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1724 | "%s: Invalid SAP pointer from p_cds_gctx", __func__); |
| 1725 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1726 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1727 | } |
Edhar, Mahesh Kumar | bd8b391 | 2015-11-25 19:28:12 +0530 | [diff] [blame] | 1728 | |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1729 | hHal = CDS_GET_HAL_CB(sapContext->p_cds_gctx); |
| 1730 | if (NULL == hHal) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1731 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1732 | "%s: Invalid HAL pointer from p_cds_gctx", __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1733 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1734 | } |
| 1735 | pMac = PMAC_STRUCT(hHal); |
| 1736 | |
Manishekar Chandrasekaran | 9e8c7be | 2016-08-03 14:57:14 +0530 | [diff] [blame] | 1737 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO, |
Manishekar Chandrasekaran | 1004ad9 | 2016-09-04 22:01:47 +0530 | [diff] [blame] | 1738 | "%s: sap chan:%d target:%d conn on 5GHz:%d", |
Manishekar Chandrasekaran | 9e8c7be | 2016-08-03 14:57:14 +0530 | [diff] [blame] | 1739 | __func__, sapContext->channel, targetChannel, |
Tushnim Bhattacharyya | 66348bd | 2017-03-09 15:02:10 -0800 | [diff] [blame] | 1740 | policy_mgr_is_any_mode_active_on_band_along_with_session( |
| 1741 | pMac->psoc, sapContext->sessionId, POLICY_MGR_BAND_5)); |
Manishekar Chandrasekaran | 9e8c7be | 2016-08-03 14:57:14 +0530 | [diff] [blame] | 1742 | |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1743 | /* |
| 1744 | * Now, validate if the passed channel is valid in the |
| 1745 | * current regulatory domain. |
| 1746 | */ |
| 1747 | if (sapContext->channel != targetChannel && |
Kiran Kumar Lokere | a3de226 | 2017-04-12 12:15:04 -0700 | [diff] [blame] | 1748 | ((wlan_reg_get_channel_state(pMac->pdev, targetChannel) == |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1749 | CHANNEL_STATE_ENABLE) || |
Kiran Kumar Lokere | a3de226 | 2017-04-12 12:15:04 -0700 | [diff] [blame] | 1750 | (wlan_reg_get_channel_state(pMac->pdev, targetChannel) == |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1751 | CHANNEL_STATE_DFS && |
Tushnim Bhattacharyya | 66348bd | 2017-03-09 15:02:10 -0800 | [diff] [blame] | 1752 | !policy_mgr_is_any_mode_active_on_band_along_with_session( |
| 1753 | pMac->psoc, sapContext->sessionId, |
| 1754 | POLICY_MGR_BAND_5)))) { |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1755 | /* |
Edhar, Mahesh Kumar | df2ec12 | 2015-11-16 11:33:16 +0530 | [diff] [blame] | 1756 | * validate target channel switch w.r.t various concurrency |
| 1757 | * rules set. |
| 1758 | */ |
| 1759 | valid = wlan_sap_validate_channel_switch(hHal, targetChannel, |
| 1760 | sapContext); |
| 1761 | if (!valid) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1762 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Edhar, Mahesh Kumar | df2ec12 | 2015-11-16 11:33:16 +0530 | [diff] [blame] | 1763 | FL("Channel switch to %u is not allowed due to concurrent channel interference"), |
| 1764 | targetChannel); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1765 | return QDF_STATUS_E_FAULT; |
Edhar, Mahesh Kumar | df2ec12 | 2015-11-16 11:33:16 +0530 | [diff] [blame] | 1766 | } |
| 1767 | /* |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1768 | * Post a CSA IE request to SAP state machine with |
| 1769 | * target channel information and also CSA IE required |
| 1770 | * flag set in sapContext only, if SAP is in eSAP_STARTED |
| 1771 | * state. |
| 1772 | */ |
| 1773 | if (eSAP_STARTED == sapContext->sapsMachine) { |
Edhar, Mahesh Kumar | bd8b391 | 2015-11-25 19:28:12 +0530 | [diff] [blame] | 1774 | status = wlansap_update_csa_channel_params(sapContext, |
| 1775 | targetChannel); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1776 | if (status != QDF_STATUS_SUCCESS) |
Edhar, Mahesh Kumar | bd8b391 | 2015-11-25 19:28:12 +0530 | [diff] [blame] | 1777 | return status; |
Edhar, Mahesh Kumar | df2ec12 | 2015-11-16 11:33:16 +0530 | [diff] [blame] | 1778 | |
| 1779 | /* |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1780 | * Copy the requested target channel |
| 1781 | * to sap context. |
| 1782 | */ |
| 1783 | pMac->sap.SapDfsInfo.target_channel = targetChannel; |
Kiran Kumar Lokere | 999e58c | 2016-01-07 02:18:39 -0800 | [diff] [blame] | 1784 | pMac->sap.SapDfsInfo.new_ch_params.ch_width = |
| 1785 | pMac->sap.SapDfsInfo.new_chanWidth; |
Chandrasekaran, Manishekar | a74bb02 | 2016-01-12 18:37:43 +0530 | [diff] [blame] | 1786 | |
| 1787 | /* By this time, the best bandwidth is calculated for |
| 1788 | * the given target channel. Now, if there was a |
| 1789 | * request from user to move to a selected bandwidth, |
| 1790 | * we can see if it can be honored. |
| 1791 | * |
| 1792 | * Ex1: BW80 was selected for the target channel and |
| 1793 | * user wants BW40, it can be allowed |
| 1794 | * Ex2: BW40 was selected for the target channel and |
| 1795 | * user wants BW80, it cannot be allowed for the given |
| 1796 | * target channel. |
| 1797 | * |
| 1798 | * So, the MIN of the selected channel bandwidth and |
| 1799 | * user input is used for the bandwidth |
| 1800 | */ |
| 1801 | if (target_bw != CH_WIDTH_MAX) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1802 | QDF_TRACE(QDF_MODULE_ID_SAP, |
| 1803 | QDF_TRACE_LEVEL_INFO, |
Chandrasekaran, Manishekar | a74bb02 | 2016-01-12 18:37:43 +0530 | [diff] [blame] | 1804 | "%s: target bw:%d new width:%d", |
| 1805 | __func__, target_bw, |
| 1806 | pMac->sap.SapDfsInfo. |
| 1807 | new_ch_params.ch_width); |
| 1808 | pMac->sap.SapDfsInfo.new_ch_params.ch_width = |
| 1809 | pMac->sap.SapDfsInfo.new_chanWidth = |
Anurag Chouhan | 6d76066 | 2016-02-20 16:05:43 +0530 | [diff] [blame] | 1810 | QDF_MIN(pMac->sap.SapDfsInfo. |
Chandrasekaran, Manishekar | a74bb02 | 2016-01-12 18:37:43 +0530 | [diff] [blame] | 1811 | new_ch_params.ch_width, |
| 1812 | target_bw); |
| 1813 | } |
Kiran Kumar Lokere | a3de226 | 2017-04-12 12:15:04 -0700 | [diff] [blame] | 1814 | wlan_reg_set_channel_params(pMac->pdev, targetChannel, |
Sandeep Puligilla | 1cc23f6 | 2016-04-27 16:52:49 -0700 | [diff] [blame] | 1815 | 0, &pMac->sap.SapDfsInfo.new_ch_params); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1816 | /* |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1817 | * Set the CSA IE required flag. |
| 1818 | */ |
| 1819 | pMac->sap.SapDfsInfo.csaIERequired = true; |
| 1820 | |
| 1821 | /* |
| 1822 | * Set the radar found status to allow the channel |
| 1823 | * change to happen same as in the case of a radar |
| 1824 | * detection. Since, this will allow SAP to be in |
| 1825 | * correct state and also resume the netif queues |
| 1826 | * that were suspended in HDD before the channel |
| 1827 | * request was issued. |
| 1828 | */ |
| 1829 | pMac->sap.SapDfsInfo.sap_radar_found_status = true; |
Edhar, Mahesh Kumar | 695468e | 2015-10-19 12:06:20 +0530 | [diff] [blame] | 1830 | pMac->sap.SapDfsInfo.cac_state = |
| 1831 | eSAP_DFS_DO_NOT_SKIP_CAC; |
| 1832 | sap_cac_reset_notify(hHal); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1833 | |
| 1834 | /* |
Chandrasekaran, Manishekar | 8104abd | 2016-01-29 18:10:27 +0530 | [diff] [blame] | 1835 | * Post the eSAP_CHANNEL_SWITCH_ANNOUNCEMENT_START |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1836 | * to SAP state machine to process the channel |
| 1837 | * request with CSA IE set in the beacons. |
| 1838 | */ |
| 1839 | sapEvent.event = |
Chandrasekaran, Manishekar | 8104abd | 2016-01-29 18:10:27 +0530 | [diff] [blame] | 1840 | eSAP_CHANNEL_SWITCH_ANNOUNCEMENT_START; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1841 | sapEvent.params = 0; |
| 1842 | sapEvent.u1 = 0; |
| 1843 | sapEvent.u2 = 0; |
| 1844 | |
| 1845 | sap_fsm(sapContext, &sapEvent); |
| 1846 | |
| 1847 | } else { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1848 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1849 | "%s: Failed to request Channel Change, since" |
| 1850 | "SAP is not in eSAP_STARTED state", __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1851 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1852 | } |
| 1853 | |
| 1854 | } else { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1855 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1856 | "%s: Channel = %d is not valid in the current" |
| 1857 | "regulatory domain", __func__, targetChannel); |
| 1858 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1859 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1860 | } |
| 1861 | |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1862 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, |
Chandrasekaran, Manishekar | 8104abd | 2016-01-29 18:10:27 +0530 | [diff] [blame] | 1863 | "%s: Posted eSAP_CHANNEL_SWITCH_ANNOUNCEMENT_START successfully to sap_fsm for Channel = %d", |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1864 | __func__, targetChannel); |
| 1865 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1866 | return QDF_STATUS_SUCCESS; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1867 | } |
| 1868 | |
| 1869 | /** |
| 1870 | * wlansap_set_counter_measure() - set counter measure. |
| 1871 | * @pCtx: Pointer to the global cds context; a handle to SAP's control block |
| 1872 | * can be extracted from its context. When MBSSID feature is enabled, |
| 1873 | * SAP context is directly passed to SAP APIs. |
| 1874 | * @bEnable: If true than all stations will be disassociated and no more |
| 1875 | * will be allowed to associate. If false than CORE will come out |
| 1876 | * of this state. |
| 1877 | * |
| 1878 | * This api function is used to disassociate all the stations and prevent |
| 1879 | * association for any other station.Whenever Authenticator receives 2 mic |
| 1880 | * failures within 60 seconds, Authenticator will enable counter measure at |
| 1881 | * SAP Layer. Authenticator will start the 60 seconds timer. Core stack will |
| 1882 | * not allow any STA to associate till HDD disables counter meassure. Core |
| 1883 | * stack shall kick out all the STA which are currently associated and DIASSOC |
| 1884 | * Event will be propogated to HDD for each STA to clean up the HDD STA table. |
| 1885 | * Once the 60 seconds timer expires, Authenticator will disable the counter |
| 1886 | * meassure at core stack. Now core stack can allow STAs to associate. |
| 1887 | * |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1888 | * Return: The QDF_STATUS code associated with performing the operation |
| 1889 | * QDF_STATUS_SUCCESS: Success |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1890 | */ |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1891 | QDF_STATUS wlansap_set_counter_measure(void *pCtx, bool bEnable) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1892 | { |
| 1893 | ptSapContext pSapCtx = CDS_GET_SAP_CB(pCtx); |
| 1894 | |
| 1895 | /*------------------------------------------------------------------------ |
| 1896 | Sanity check |
| 1897 | Extract SAP control block |
| 1898 | ------------------------------------------------------------------------*/ |
| 1899 | if (NULL == pSapCtx) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1900 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1901 | "%s: Invalid SAP pointer from pCtx", __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1902 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1903 | } |
| 1904 | |
| 1905 | sme_roam_tkip_counter_measures(CDS_GET_HAL_CB(pSapCtx->p_cds_gctx), |
| 1906 | pSapCtx->sessionId, bEnable); |
| 1907 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1908 | return QDF_STATUS_SUCCESS; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1909 | } |
| 1910 | |
| 1911 | /** |
| 1912 | * wlansap_set_key_sta() - set keys for a stations. |
| 1913 | * @pCtx: Pointer to the global cds context; a handle to SAP's control block |
| 1914 | * can be extracted from its context. When MBSSID feature is enabled, |
| 1915 | * SAP context is directly passed to SAP APIs. |
| 1916 | * @pSetKeyInfo : tCsrRoamSetKey structure for the station |
| 1917 | * |
| 1918 | * This api function provides for Ap App/HDD to set key for a station. |
| 1919 | * |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1920 | * Return: The QDF_STATUS code associated with performing the operation |
| 1921 | * QDF_STATUS_SUCCESS: Success |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1922 | */ |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1923 | QDF_STATUS wlansap_set_key_sta(void *pCtx, tCsrRoamSetKey *pSetKeyInfo) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1924 | { |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1925 | QDF_STATUS qdf_status = QDF_STATUS_SUCCESS; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1926 | ptSapContext pSapCtx = NULL; |
| 1927 | void *hHal = NULL; |
Anurag Chouhan | f04e84f | 2016-03-03 10:12:12 +0530 | [diff] [blame] | 1928 | QDF_STATUS qdf_ret_status = QDF_STATUS_E_FAILURE; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1929 | uint32_t roamId = 0xFF; |
| 1930 | |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 1931 | pSapCtx = CDS_GET_SAP_CB(pCtx); |
| 1932 | if (NULL == pSapCtx) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1933 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 1934 | "%s: Invalid SAP pointer from pCtx", |
| 1935 | __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1936 | return QDF_STATUS_E_FAULT; |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 1937 | } |
| 1938 | hHal = CDS_GET_HAL_CB(pSapCtx->p_cds_gctx); |
| 1939 | if (NULL == hHal) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1940 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 1941 | "%s: Invalid HAL pointer from p_cds_gctx", |
| 1942 | __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1943 | return QDF_STATUS_E_FAULT; |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 1944 | } |
Anurag Chouhan | f04e84f | 2016-03-03 10:12:12 +0530 | [diff] [blame] | 1945 | qdf_ret_status = |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 1946 | sme_roam_set_key(hHal, pSapCtx->sessionId, pSetKeyInfo, |
| 1947 | &roamId); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1948 | |
Anurag Chouhan | f04e84f | 2016-03-03 10:12:12 +0530 | [diff] [blame] | 1949 | if (qdf_ret_status == QDF_STATUS_SUCCESS) |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1950 | qdf_status = QDF_STATUS_SUCCESS; |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 1951 | else |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1952 | qdf_status = QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1953 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1954 | return qdf_status; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1955 | } |
| 1956 | |
| 1957 | /** |
| 1958 | * wlan_sap_getstation_ie_information() - RSNIE Population |
| 1959 | * |
| 1960 | * @ctx: Global context |
| 1961 | * @len: Length of @buf |
| 1962 | * @buf: RSNIE IE data |
| 1963 | * |
| 1964 | * Populate RSN IE from CSR to HDD context |
| 1965 | * |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1966 | * Return: QDF_STATUS enumeration |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1967 | */ |
| 1968 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1969 | QDF_STATUS |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1970 | wlan_sap_getstation_ie_information |
| 1971 | (void *ctx, uint32_t *len, uint8_t *buf) { |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1972 | QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1973 | ptSapContext sap_ctx = NULL; |
| 1974 | uint32_t ie_len = 0; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1975 | |
| 1976 | sap_ctx = CDS_GET_SAP_CB(ctx); |
| 1977 | if (NULL == sap_ctx) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1978 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1979 | FL("Invalid SAP pointer from pCtx")); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1980 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1981 | } |
| 1982 | |
| 1983 | if (len) { |
| 1984 | ie_len = *len; |
| 1985 | *len = sap_ctx->nStaWPARSnReqIeLength; |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1986 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1987 | FL("WPAIE len : %x"), *len); |
| 1988 | if ((buf) && (ie_len >= sap_ctx->nStaWPARSnReqIeLength)) { |
Anurag Chouhan | 600c3a0 | 2016-03-01 10:33:54 +0530 | [diff] [blame] | 1989 | qdf_mem_copy(buf, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1990 | sap_ctx->pStaWpaRsnReqIE, |
| 1991 | sap_ctx->nStaWPARSnReqIeLength); |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1992 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1993 | FL("WPAIE: %02x:%02x:%02x:%02x:%02x:%02x"), |
| 1994 | buf[0], buf[1], buf[2], buf[3], buf[4], |
| 1995 | buf[5]); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1996 | qdf_status = QDF_STATUS_SUCCESS; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1997 | } |
| 1998 | } |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1999 | return qdf_status; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2000 | } |
| 2001 | |
| 2002 | /** |
| 2003 | * wlansap_set_wps_ie() - set WPI IE |
| 2004 | * @pCtx: Pointer to the global cds context; a handle to SAP's control block |
| 2005 | * can be extracted from its context. When MBSSID feature is enabled, |
| 2006 | * SAP context is directly passed to SAP APIs. |
| 2007 | * @pWPSIE: tSap_WPSIE structure that include WPS IEs |
| 2008 | * |
| 2009 | * This api function provides API for App/HDD to set WPS IE. |
| 2010 | * |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2011 | * Return: The QDF_STATUS code associated with performing the operation |
| 2012 | * QDF_STATUS_SUCCESS: Success and error code otherwise. |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2013 | */ |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2014 | QDF_STATUS wlansap_set_wps_ie(void *pCtx, tSap_WPSIE *pSap_WPSIe) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2015 | { |
| 2016 | ptSapContext pSapCtx = NULL; |
| 2017 | void *hHal = NULL; |
| 2018 | |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2019 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2020 | "%s, %d", __func__, __LINE__); |
| 2021 | |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2022 | pSapCtx = CDS_GET_SAP_CB(pCtx); |
| 2023 | if (NULL == pSapCtx) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2024 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2025 | "%s: Invalid SAP pointer from pCtx", |
| 2026 | __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2027 | return QDF_STATUS_E_FAULT; |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2028 | } |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2029 | |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2030 | hHal = CDS_GET_HAL_CB(pSapCtx->p_cds_gctx); |
| 2031 | if (NULL == hHal) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2032 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2033 | "%s: Invalid HAL pointer from p_cds_gctx", |
| 2034 | __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2035 | return QDF_STATUS_E_FAULT; |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2036 | } |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2037 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2038 | if (sap_acquire_global_lock(pSapCtx) == QDF_STATUS_SUCCESS) { |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2039 | if (pSap_WPSIe->sapWPSIECode == eSAP_WPS_BEACON_IE) { |
Anurag Chouhan | 600c3a0 | 2016-03-01 10:33:54 +0530 | [diff] [blame] | 2040 | qdf_mem_copy(&pSapCtx->APWPSIEs.SirWPSBeaconIE, |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2041 | &pSap_WPSIe->sapwpsie. |
| 2042 | sapWPSBeaconIE, |
| 2043 | sizeof(tSap_WPSBeaconIE)); |
| 2044 | } else if (pSap_WPSIe->sapWPSIECode == |
| 2045 | eSAP_WPS_PROBE_RSP_IE) { |
Anurag Chouhan | 600c3a0 | 2016-03-01 10:33:54 +0530 | [diff] [blame] | 2046 | qdf_mem_copy(&pSapCtx->APWPSIEs. |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2047 | SirWPSProbeRspIE, |
| 2048 | &pSap_WPSIe->sapwpsie. |
| 2049 | sapWPSProbeRspIE, |
| 2050 | sizeof(tSap_WPSProbeRspIE)); |
| 2051 | } else { |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2052 | sap_release_global_lock(pSapCtx); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2053 | return QDF_STATUS_E_FAULT; |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2054 | } |
| 2055 | sap_release_global_lock(pSapCtx); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2056 | return QDF_STATUS_SUCCESS; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2057 | } else |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2058 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2059 | } |
| 2060 | |
| 2061 | /** |
| 2062 | * wlansap_update_wps_ie() - update WPI IE |
| 2063 | * @pCtx: Pointer to the global cds context; a handle to SAP's control block |
| 2064 | * can be extracted from its context. When MBSSID feature is enabled, |
| 2065 | * SAP context is directly passed to SAP APIs. |
| 2066 | * |
| 2067 | * This api function provides API for App/HDD to update WPS IE. |
| 2068 | * |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2069 | * Return: The QDF_STATUS code associated with performing the operation |
| 2070 | * QDF_STATUS_SUCCESS: Success and error code otherwise. |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2071 | */ |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2072 | QDF_STATUS wlansap_update_wps_ie(void *pCtx) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2073 | { |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2074 | QDF_STATUS qdf_status = QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2075 | ptSapContext pSapCtx = NULL; |
Anurag Chouhan | f04e84f | 2016-03-03 10:12:12 +0530 | [diff] [blame] | 2076 | QDF_STATUS qdf_ret_status = QDF_STATUS_E_FAILURE; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2077 | void *hHal = NULL; |
| 2078 | |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2079 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2080 | "%s, %d", __func__, __LINE__); |
| 2081 | |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2082 | pSapCtx = CDS_GET_SAP_CB(pCtx); |
| 2083 | if (NULL == pSapCtx) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2084 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2085 | "%s: Invalid SAP pointer from pCtx", |
| 2086 | __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2087 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2088 | } |
| 2089 | |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2090 | hHal = CDS_GET_HAL_CB(pSapCtx->p_cds_gctx); |
| 2091 | if (NULL == hHal) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2092 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2093 | "%s: Invalid HAL pointer from p_cds_gctx", |
| 2094 | __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2095 | return QDF_STATUS_E_FAULT; |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2096 | } |
| 2097 | |
Anurag Chouhan | f04e84f | 2016-03-03 10:12:12 +0530 | [diff] [blame] | 2098 | qdf_ret_status = |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2099 | sme_roam_update_apwpsie(hHal, pSapCtx->sessionId, |
| 2100 | &pSapCtx->APWPSIEs); |
| 2101 | |
Anurag Chouhan | f04e84f | 2016-03-03 10:12:12 +0530 | [diff] [blame] | 2102 | if (qdf_ret_status == QDF_STATUS_SUCCESS) |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2103 | qdf_status = QDF_STATUS_SUCCESS; |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2104 | else |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2105 | qdf_status = QDF_STATUS_E_FAULT; |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2106 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2107 | return qdf_status; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2108 | } |
| 2109 | |
| 2110 | /** |
| 2111 | * wlansap_get_wps_state() - get WPS session state |
| 2112 | * @pCtx: Pointer to the global cds context; a handle to SAP's control block |
| 2113 | * can be extracted from its context. When MBSSID feature is enabled, |
| 2114 | * SAP context is directly passed to SAP APIs. |
| 2115 | * @pbWPSState: Pointer to variable to indicate if device is in |
| 2116 | * WPS Registration state |
| 2117 | * |
| 2118 | * This api function provides for Ap App/HDD to check if WPS session in process. |
| 2119 | * |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2120 | * Return: The QDF_STATUS code associated with performing the operation |
| 2121 | * QDF_STATUS_SUCCESS: Success |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2122 | */ |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2123 | QDF_STATUS wlansap_get_wps_state(void *pCtx, bool *bWPSState) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2124 | { |
| 2125 | ptSapContext pSapCtx = NULL; |
| 2126 | void *hHal = NULL; |
| 2127 | |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2128 | pSapCtx = CDS_GET_SAP_CB(pCtx); |
| 2129 | if (NULL == pSapCtx) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2130 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2131 | "%s: Invalid SAP pointer from pCtx", |
| 2132 | __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2133 | return QDF_STATUS_E_FAULT; |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2134 | } |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2135 | |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2136 | hHal = CDS_GET_HAL_CB(pSapCtx->p_cds_gctx); |
| 2137 | if (NULL == hHal) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2138 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2139 | "%s: Invalid HAL pointer from p_cds_gctx", |
| 2140 | __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2141 | return QDF_STATUS_E_FAULT; |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2142 | } |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2143 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2144 | if (sap_acquire_global_lock(pSapCtx) == QDF_STATUS_SUCCESS) { |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2145 | if (pSapCtx->APWPSIEs.SirWPSProbeRspIE. |
| 2146 | FieldPresent & |
| 2147 | SIR_WPS_PROBRSP_SELECTEDREGISTRA_PRESENT) |
| 2148 | *bWPSState = true; |
| 2149 | else |
| 2150 | *bWPSState = false; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2151 | |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2152 | sap_release_global_lock(pSapCtx); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2153 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2154 | return QDF_STATUS_SUCCESS; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2155 | } else |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2156 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2157 | |
| 2158 | } |
| 2159 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2160 | QDF_STATUS sap_acquire_global_lock(ptSapContext pSapCtx) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2161 | { |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2162 | QDF_STATUS qdf_status = QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2163 | |
Anurag Chouhan | a37b5b7 | 2016-02-21 14:53:42 +0530 | [diff] [blame] | 2164 | if (QDF_IS_STATUS_SUCCESS(qdf_mutex_acquire(&pSapCtx->SapGlobalLock))) { |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2165 | qdf_status = QDF_STATUS_SUCCESS; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2166 | } |
| 2167 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2168 | return qdf_status; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2169 | } |
| 2170 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2171 | QDF_STATUS sap_release_global_lock(ptSapContext pSapCtx) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2172 | { |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2173 | QDF_STATUS qdf_status = QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2174 | |
Anurag Chouhan | a37b5b7 | 2016-02-21 14:53:42 +0530 | [diff] [blame] | 2175 | if (QDF_IS_STATUS_SUCCESS(qdf_mutex_release(&pSapCtx->SapGlobalLock))) { |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2176 | qdf_status = QDF_STATUS_SUCCESS; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2177 | } |
| 2178 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2179 | return qdf_status; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2180 | } |
| 2181 | |
| 2182 | /** |
| 2183 | * wlansap_set_wparsn_ies() - set WPA RSN IEs |
| 2184 | * @pCtx: Pointer to the global cds context; a handle to SAP's control block |
| 2185 | * can be extracted from its context. When MBSSID feature is enabled, |
| 2186 | * SAP context is directly passed to SAP APIs. |
| 2187 | * @pWPARSNIEs : buffer to the WPA/RSN IEs |
| 2188 | * @WPARSNIEsLen: length of WPA/RSN IEs |
| 2189 | * |
| 2190 | * This api function provides for Ap App/HDD to set AP WPA and RSN IE in its |
| 2191 | * beacon and probe response. |
| 2192 | * |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2193 | * Return: The QDF_STATUS code associated with performing the operation |
| 2194 | * QDF_STATUS_SUCCESS: Success and error code otherwise |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2195 | */ |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2196 | QDF_STATUS wlansap_set_wparsn_ies |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2197 | (void *pCtx, uint8_t *pWPARSNIEs, uint32_t WPARSNIEsLen) { |
| 2198 | ptSapContext pSapCtx = NULL; |
Anurag Chouhan | f04e84f | 2016-03-03 10:12:12 +0530 | [diff] [blame] | 2199 | QDF_STATUS qdf_ret_status = QDF_STATUS_E_FAILURE; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2200 | void *hHal = NULL; |
| 2201 | |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2202 | pSapCtx = CDS_GET_SAP_CB(pCtx); |
| 2203 | if (NULL == pSapCtx) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2204 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2205 | "%s: Invalid SAP pointer from pCtx", |
| 2206 | __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2207 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2208 | } |
| 2209 | |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2210 | hHal = CDS_GET_HAL_CB(pSapCtx->p_cds_gctx); |
| 2211 | if (NULL == hHal) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2212 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2213 | "%s: Invalid HAL pointer from p_cds_gctx", |
| 2214 | __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2215 | return QDF_STATUS_E_FAULT; |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2216 | } |
| 2217 | |
| 2218 | pSapCtx->APWPARSNIEs.length = (uint16_t) WPARSNIEsLen; |
Anurag Chouhan | 600c3a0 | 2016-03-01 10:33:54 +0530 | [diff] [blame] | 2219 | qdf_mem_copy(pSapCtx->APWPARSNIEs.rsnIEdata, pWPARSNIEs, |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2220 | WPARSNIEsLen); |
| 2221 | |
Anurag Chouhan | f04e84f | 2016-03-03 10:12:12 +0530 | [diff] [blame] | 2222 | qdf_ret_status = |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2223 | sme_roam_update_apwparsni_es(hHal, pSapCtx->sessionId, |
| 2224 | &pSapCtx->APWPARSNIEs); |
| 2225 | |
Anurag Chouhan | f04e84f | 2016-03-03 10:12:12 +0530 | [diff] [blame] | 2226 | if (qdf_ret_status == QDF_STATUS_SUCCESS) |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2227 | return QDF_STATUS_SUCCESS; |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2228 | else |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2229 | return QDF_STATUS_E_FAULT; |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2230 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2231 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2232 | } |
| 2233 | |
| 2234 | /** |
| 2235 | * wlansap_send_action() - send action frame |
| 2236 | * @pCtx: Pointer to the global cds context; a handle to SAP's control block |
| 2237 | * can be extracted from its context. When MBSSID feature is enabled, |
| 2238 | * SAP context is directly passed to SAP APIs. |
| 2239 | * @pBuf: Pointer of the action frame to be transmitted |
| 2240 | * @len: Length of the action frame |
| 2241 | * |
| 2242 | * This api function provides to send action frame sent by upper layer. |
| 2243 | * |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2244 | * Return: The QDF_STATUS code associated with performing the operation |
| 2245 | * QDF_STATUS_SUCCESS: Success and error code otherwise |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2246 | */ |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2247 | QDF_STATUS wlansap_send_action(void *pCtx, const uint8_t *pBuf, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2248 | uint32_t len, uint16_t wait, uint16_t channel_freq) |
| 2249 | { |
| 2250 | ptSapContext pSapCtx = NULL; |
| 2251 | void *hHal = NULL; |
Anurag Chouhan | f04e84f | 2016-03-03 10:12:12 +0530 | [diff] [blame] | 2252 | QDF_STATUS qdf_ret_status = QDF_STATUS_E_FAILURE; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2253 | |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2254 | pSapCtx = CDS_GET_SAP_CB(pCtx); |
| 2255 | if (NULL == pSapCtx) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2256 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2257 | "%s: Invalid SAP pointer from pCtx", |
| 2258 | __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2259 | return QDF_STATUS_E_FAULT; |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2260 | } |
| 2261 | hHal = CDS_GET_HAL_CB(pSapCtx->p_cds_gctx); |
Krunal Soni | 074dd2c | 2017-04-14 14:57:34 -0700 | [diff] [blame] | 2262 | if (NULL == hHal) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2263 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Krunal Soni | 074dd2c | 2017-04-14 14:57:34 -0700 | [diff] [blame] | 2264 | FL("NULL hal pointer")); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2265 | return QDF_STATUS_E_FAULT; |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2266 | } |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2267 | |
Anurag Chouhan | f04e84f | 2016-03-03 10:12:12 +0530 | [diff] [blame] | 2268 | qdf_ret_status = |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2269 | sme_send_action(hHal, pSapCtx->sessionId, pBuf, len, 0, |
| 2270 | 0, channel_freq); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2271 | |
Anurag Chouhan | f04e84f | 2016-03-03 10:12:12 +0530 | [diff] [blame] | 2272 | if (QDF_STATUS_SUCCESS == qdf_ret_status) { |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2273 | return QDF_STATUS_SUCCESS; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2274 | } |
| 2275 | |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2276 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2277 | "Failed to Send Action Frame"); |
| 2278 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2279 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2280 | } |
| 2281 | |
| 2282 | /** |
| 2283 | * wlansap_remain_on_channel() - set remain on channel |
| 2284 | * @pCtx: Pointer to the global cds context; a handle to SAP's control block |
| 2285 | * can be extracted from its context. When MBSSID feature is enabled, |
| 2286 | * SAP context is directly passed to SAP APIs. |
| 2287 | * @channel: Channel on which driver has to listen |
| 2288 | * @duration: Duration for which driver has to listen on specified channel |
| 2289 | * @callback: Callback function to be called once Listen is done. |
| 2290 | * @pContext: Context needs to be called in callback function. |
| 2291 | * @scan_id: scan identifier |
| 2292 | * |
| 2293 | * This api function provides to set Remain On channel on specified channel |
| 2294 | * for specified duration. |
| 2295 | * |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2296 | * Return: The QDF_STATUS code associated with performing the operation |
| 2297 | * QDF_STATUS_SUCCESS: Success and error code otherwise |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2298 | */ |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2299 | QDF_STATUS wlansap_remain_on_channel(void *pCtx, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2300 | uint8_t channel, uint32_t duration, remainOnChanCallback callback, |
| 2301 | void *pContext, uint32_t *scan_id) |
| 2302 | { |
| 2303 | ptSapContext pSapCtx = NULL; |
| 2304 | void *hHal = NULL; |
Anurag Chouhan | f04e84f | 2016-03-03 10:12:12 +0530 | [diff] [blame] | 2305 | QDF_STATUS qdf_ret_status = QDF_STATUS_E_FAILURE; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2306 | |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2307 | pSapCtx = CDS_GET_SAP_CB(pCtx); |
| 2308 | if (NULL == pSapCtx) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2309 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2310 | "%s: Invalid SAP pointer from pCtx", |
| 2311 | __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2312 | return QDF_STATUS_E_FAULT; |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2313 | } |
| 2314 | hHal = CDS_GET_HAL_CB(pSapCtx->p_cds_gctx); |
Krunal Soni | 074dd2c | 2017-04-14 14:57:34 -0700 | [diff] [blame] | 2315 | if (NULL == hHal) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2316 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Krunal Soni | 074dd2c | 2017-04-14 14:57:34 -0700 | [diff] [blame] | 2317 | FL("NULL hal pointer")); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2318 | return QDF_STATUS_E_FAULT; |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2319 | } |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2320 | |
Anurag Chouhan | f04e84f | 2016-03-03 10:12:12 +0530 | [diff] [blame] | 2321 | qdf_ret_status = sme_remain_on_channel(hHal, pSapCtx->sessionId, |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2322 | channel, duration, callback, pContext, |
| 2323 | true, scan_id); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2324 | |
Anurag Chouhan | f04e84f | 2016-03-03 10:12:12 +0530 | [diff] [blame] | 2325 | if (QDF_STATUS_SUCCESS == qdf_ret_status) { |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2326 | return QDF_STATUS_SUCCESS; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2327 | } |
| 2328 | |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2329 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2330 | "Failed to Set Remain on Channel"); |
| 2331 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2332 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2333 | } |
| 2334 | |
| 2335 | /** |
| 2336 | * wlansap_cancel_remain_on_channel() - cancel remain on channel |
| 2337 | * @pCtx: Pointer to the global cds context; a handle to SAP's control block |
| 2338 | * can be extracted from its context. When MBSSID feature is enabled, |
| 2339 | * SAP context is directly passed to SAP APIs. |
| 2340 | * |
| 2341 | * This api cancel previous remain on channel request. |
| 2342 | * |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2343 | * Return: The QDF_STATUS code associated with performing the operation |
| 2344 | * QDF_STATUS_SUCCESS: Success and error code otherwie |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2345 | */ |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2346 | QDF_STATUS wlansap_cancel_remain_on_channel(void *pCtx, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2347 | uint32_t scan_id) |
| 2348 | { |
| 2349 | ptSapContext pSapCtx = NULL; |
| 2350 | void *hHal = NULL; |
Anurag Chouhan | f04e84f | 2016-03-03 10:12:12 +0530 | [diff] [blame] | 2351 | QDF_STATUS qdf_ret_status = QDF_STATUS_E_FAILURE; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2352 | |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2353 | pSapCtx = CDS_GET_SAP_CB(pCtx); |
| 2354 | if (NULL == pSapCtx) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2355 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2356 | "%s: Invalid SAP pointer from pCtx", |
| 2357 | __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2358 | return QDF_STATUS_E_FAULT; |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2359 | } |
| 2360 | hHal = CDS_GET_HAL_CB(pSapCtx->p_cds_gctx); |
Krunal Soni | 074dd2c | 2017-04-14 14:57:34 -0700 | [diff] [blame] | 2361 | if (NULL == hHal) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2362 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Krunal Soni | 074dd2c | 2017-04-14 14:57:34 -0700 | [diff] [blame] | 2363 | FL("HAL pointer is null")); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2364 | return QDF_STATUS_E_FAULT; |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2365 | } |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2366 | |
Anurag Chouhan | f04e84f | 2016-03-03 10:12:12 +0530 | [diff] [blame] | 2367 | qdf_ret_status = |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2368 | sme_cancel_remain_on_channel(hHal, pSapCtx->sessionId, |
| 2369 | scan_id); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2370 | |
Anurag Chouhan | f04e84f | 2016-03-03 10:12:12 +0530 | [diff] [blame] | 2371 | if (QDF_STATUS_SUCCESS == qdf_ret_status) { |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2372 | return QDF_STATUS_SUCCESS; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2373 | } |
| 2374 | |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2375 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2376 | "Failed to Cancel Remain on Channel"); |
| 2377 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2378 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2379 | } |
Manishekar Chandrasekaran | 9e8c7be | 2016-08-03 14:57:14 +0530 | [diff] [blame] | 2380 | |
Kapil Gupta | 8878ad9 | 2017-02-13 11:56:04 +0530 | [diff] [blame] | 2381 | QDF_STATUS wlan_sap_update_next_channel(void *ctx, uint8_t channel, |
| 2382 | enum phy_ch_width chan_bw) |
| 2383 | { |
| 2384 | ptSapContext sap_ctx = CDS_GET_SAP_CB(ctx); |
| 2385 | |
| 2386 | if (!sap_ctx) { |
| 2387 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
| 2388 | "%s: Invalid SAP pointer", __func__); |
| 2389 | return QDF_STATUS_E_FAULT; |
| 2390 | } |
| 2391 | |
| 2392 | sap_ctx->dfs_vendor_channel = channel; |
| 2393 | sap_ctx->dfs_vendor_chan_bw = chan_bw; |
| 2394 | |
| 2395 | return QDF_STATUS_SUCCESS; |
| 2396 | } |
| 2397 | |
Manishekar Chandrasekaran | 9e8c7be | 2016-08-03 14:57:14 +0530 | [diff] [blame] | 2398 | /** |
| 2399 | * wlan_sap_set_pre_cac_status() - Set the pre cac status |
| 2400 | * @ctx: SAP context |
| 2401 | * @status: Status of pre cac |
| 2402 | * @handle: Global MAC handle |
| 2403 | * |
| 2404 | * Sets the pre cac status in the MAC context and updates the state |
| 2405 | * |
| 2406 | * Return: QDF_STATUS |
| 2407 | */ |
| 2408 | QDF_STATUS wlan_sap_set_pre_cac_status(void *ctx, bool status, |
| 2409 | tHalHandle handle) |
| 2410 | { |
| 2411 | ptSapContext sap_ctx = CDS_GET_SAP_CB(ctx); |
| 2412 | tpAniSirGlobal mac_ctx = PMAC_STRUCT(handle); |
| 2413 | |
| 2414 | if (!mac_ctx) { |
| 2415 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
| 2416 | "%s: Invalid mac pointer", __func__); |
| 2417 | return QDF_STATUS_E_FAULT; |
| 2418 | } |
| 2419 | |
| 2420 | if (!sap_ctx) { |
| 2421 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
| 2422 | "%s: Invalid SAP pointer", __func__); |
| 2423 | return QDF_STATUS_E_FAULT; |
| 2424 | } |
| 2425 | |
| 2426 | sap_ctx->is_pre_cac_on = status; |
| 2427 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG, |
| 2428 | "%s: is_pre_cac_on:%d", __func__, sap_ctx->is_pre_cac_on); |
| 2429 | |
| 2430 | return QDF_STATUS_SUCCESS; |
| 2431 | } |
| 2432 | |
| 2433 | /** |
| 2434 | * wlan_sap_set_chan_before_pre_cac() - Save the channel before pre cac |
| 2435 | * @ctx: SAP context |
| 2436 | * @chan_before_pre_cac: Channel before pre cac |
| 2437 | * |
| 2438 | * Saves the channel that was in use before pre cac operation |
| 2439 | * |
| 2440 | * Return: QDF_STATUS |
| 2441 | */ |
| 2442 | QDF_STATUS wlan_sap_set_chan_before_pre_cac(void *ctx, |
| 2443 | uint8_t chan_before_pre_cac) |
| 2444 | { |
| 2445 | ptSapContext sap_ctx = CDS_GET_SAP_CB(ctx); |
| 2446 | |
| 2447 | if (!sap_ctx) { |
| 2448 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
| 2449 | "%s: Invalid SAP pointer", __func__); |
| 2450 | return QDF_STATUS_E_FAULT; |
| 2451 | } |
| 2452 | |
| 2453 | sap_ctx->chan_before_pre_cac = chan_before_pre_cac; |
| 2454 | return QDF_STATUS_SUCCESS; |
| 2455 | } |
| 2456 | |
| 2457 | /** |
| 2458 | * wlan_sap_set_pre_cac_complete_status() - Sets pre cac complete status |
| 2459 | * @ctx: SAP context |
| 2460 | * @status: Status of pre cac complete |
| 2461 | * |
| 2462 | * Sets the status of pre cac i.e., whether pre cac is complete or not |
| 2463 | * |
| 2464 | * Return: QDF_STATUS |
| 2465 | */ |
| 2466 | QDF_STATUS wlan_sap_set_pre_cac_complete_status(void *ctx, bool status) |
| 2467 | { |
| 2468 | ptSapContext sap_ctx = CDS_GET_SAP_CB(ctx); |
| 2469 | |
| 2470 | if (!sap_ctx) { |
| 2471 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
| 2472 | "%s: Invalid SAP pointer", __func__); |
| 2473 | return QDF_STATUS_E_FAULT; |
| 2474 | } |
| 2475 | |
| 2476 | sap_ctx->pre_cac_complete = status; |
| 2477 | |
| 2478 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG, |
| 2479 | "%s: pre cac complete status:%d session:%d", |
| 2480 | __func__, status, sap_ctx->sessionId); |
| 2481 | |
| 2482 | return QDF_STATUS_SUCCESS; |
| 2483 | } |
| 2484 | |
| 2485 | /** |
| 2486 | * wlan_sap_is_pre_cac_active() - Checks if pre cac in in progress |
| 2487 | * @handle: Global MAC handle |
| 2488 | * |
| 2489 | * Checks if pre cac is in progress in any of the SAP contexts |
| 2490 | * |
| 2491 | * Return: True is pre cac is active, false otherwise |
| 2492 | */ |
| 2493 | bool wlan_sap_is_pre_cac_active(tHalHandle handle) |
| 2494 | { |
| 2495 | tpAniSirGlobal mac = NULL; |
| 2496 | int i; |
| 2497 | |
| 2498 | mac = PMAC_STRUCT(handle); |
| 2499 | if (!mac) { |
| 2500 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, |
| 2501 | "%s: Invalid mac context", __func__); |
| 2502 | return false; |
| 2503 | } |
| 2504 | |
| 2505 | for (i = 0; i < SAP_MAX_NUM_SESSION; i++) { |
| 2506 | ptSapContext context = |
| 2507 | (ptSapContext) mac->sap.sapCtxList[i].pSapContext; |
| 2508 | if (context && context->is_pre_cac_on) |
| 2509 | return true; |
| 2510 | } |
| 2511 | return false; |
| 2512 | } |
| 2513 | |
| 2514 | /** |
| 2515 | * wlan_sap_get_pre_cac_vdev_id() - Get vdev id of the pre cac interface |
| 2516 | * @handle: Global handle |
| 2517 | * @vdev_id: vdev id |
| 2518 | * |
| 2519 | * Fetches the vdev id of the pre cac interface |
| 2520 | * |
| 2521 | * Return: QDF_STATUS |
| 2522 | */ |
| 2523 | QDF_STATUS wlan_sap_get_pre_cac_vdev_id(tHalHandle handle, uint8_t *vdev_id) |
| 2524 | { |
| 2525 | tpAniSirGlobal mac = NULL; |
| 2526 | uint8_t i; |
| 2527 | |
| 2528 | mac = PMAC_STRUCT(handle); |
| 2529 | if (!mac) { |
| 2530 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, |
| 2531 | "%s: Invalid mac context", __func__); |
| 2532 | return QDF_STATUS_E_FAULT; |
| 2533 | } |
| 2534 | |
| 2535 | for (i = 0; i < SAP_MAX_NUM_SESSION; i++) { |
| 2536 | ptSapContext context = |
| 2537 | (ptSapContext) mac->sap.sapCtxList[i].pSapContext; |
| 2538 | if (context && context->is_pre_cac_on) { |
| 2539 | *vdev_id = i; |
| 2540 | return QDF_STATUS_SUCCESS; |
| 2541 | } |
| 2542 | } |
| 2543 | return QDF_STATUS_E_FAILURE; |
| 2544 | } |
| 2545 | |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2546 | /** |
| 2547 | * wlansap_register_mgmt_frame() - register management frame |
| 2548 | * @pCtx: Pointer to the global cds context; a handle to SAP's control block |
| 2549 | * can be extracted from its context. When MBSSID feature is enabled, |
| 2550 | * SAP context is directly passed to SAP APIs. |
| 2551 | * @frameType: frameType that needs to be registered with PE. |
| 2552 | * @matchData: Data pointer which should be matched after frame type is matched. |
| 2553 | * @matchLen: Length of the matchData |
| 2554 | * |
| 2555 | * HDD use this API to register specified type of frame with CORE stack. |
| 2556 | * On receiving such kind of frame CORE stack should pass this frame to HDD |
| 2557 | * |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2558 | * Return: The QDF_STATUS code associated with performing the operation |
| 2559 | * QDF_STATUS_SUCCESS: Success and error code otherwise |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2560 | */ |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2561 | QDF_STATUS wlansap_register_mgmt_frame |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2562 | (void *pCtx, |
| 2563 | uint16_t frameType, uint8_t *matchData, uint16_t matchLen) { |
| 2564 | ptSapContext pSapCtx = NULL; |
| 2565 | void *hHal = NULL; |
Anurag Chouhan | f04e84f | 2016-03-03 10:12:12 +0530 | [diff] [blame] | 2566 | QDF_STATUS qdf_ret_status = QDF_STATUS_E_FAILURE; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2567 | |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2568 | pSapCtx = CDS_GET_SAP_CB(pCtx); |
| 2569 | if (NULL == pSapCtx) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2570 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2571 | "%s: Invalid SAP pointer from pCtx", |
| 2572 | __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2573 | return QDF_STATUS_E_FAULT; |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2574 | } |
| 2575 | hHal = CDS_GET_HAL_CB(pSapCtx->p_cds_gctx); |
Krunal Soni | 074dd2c | 2017-04-14 14:57:34 -0700 | [diff] [blame] | 2576 | if (NULL == hHal) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2577 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Krunal Soni | 074dd2c | 2017-04-14 14:57:34 -0700 | [diff] [blame] | 2578 | FL("hal pointer null")); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2579 | return QDF_STATUS_E_FAULT; |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2580 | } |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2581 | |
Anurag Chouhan | f04e84f | 2016-03-03 10:12:12 +0530 | [diff] [blame] | 2582 | qdf_ret_status = sme_register_mgmt_frame(hHal, pSapCtx->sessionId, |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2583 | frameType, matchData, |
| 2584 | matchLen); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2585 | |
Anurag Chouhan | f04e84f | 2016-03-03 10:12:12 +0530 | [diff] [blame] | 2586 | if (QDF_STATUS_SUCCESS == qdf_ret_status) { |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2587 | return QDF_STATUS_SUCCESS; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2588 | } |
| 2589 | |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2590 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2591 | "Failed to Register MGMT frame"); |
| 2592 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2593 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2594 | } |
| 2595 | |
| 2596 | /** |
| 2597 | * wlansap_de_register_mgmt_frame() - de register management frame |
| 2598 | * @pCtx: Pointer to the global cds context; a handle to SAP's control block |
| 2599 | * can be extracted from its context. When MBSSID feature is enabled, |
| 2600 | * SAP context is directly passed to SAP APIs. |
| 2601 | * @frameType: frameType that needs to be De-registered with PE. |
| 2602 | * @matchData: Data pointer which should be matched after frame type is matched. |
| 2603 | * @matchLen: Length of the matchData |
| 2604 | * |
| 2605 | * This API is used to deregister previously registered frame. |
| 2606 | * |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2607 | * Return: The QDF_STATUS code associated with performing the operation |
| 2608 | * QDF_STATUS_SUCCESS: Success and error code otherwise |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2609 | */ |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2610 | QDF_STATUS wlansap_de_register_mgmt_frame |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2611 | (void *pCtx, |
| 2612 | uint16_t frameType, uint8_t *matchData, uint16_t matchLen) { |
| 2613 | ptSapContext pSapCtx = NULL; |
| 2614 | void *hHal = NULL; |
Anurag Chouhan | f04e84f | 2016-03-03 10:12:12 +0530 | [diff] [blame] | 2615 | QDF_STATUS qdf_ret_status = QDF_STATUS_E_FAILURE; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2616 | |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2617 | pSapCtx = CDS_GET_SAP_CB(pCtx); |
| 2618 | if (NULL == pSapCtx) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2619 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2620 | "%s: Invalid SAP pointer from pCtx", |
| 2621 | __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2622 | return QDF_STATUS_E_FAULT; |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2623 | } |
| 2624 | hHal = CDS_GET_HAL_CB(pSapCtx->p_cds_gctx); |
Krunal Soni | 074dd2c | 2017-04-14 14:57:34 -0700 | [diff] [blame] | 2625 | if (NULL == hHal) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2626 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Krunal Soni | 074dd2c | 2017-04-14 14:57:34 -0700 | [diff] [blame] | 2627 | FL("hal pointer null")); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2628 | return QDF_STATUS_E_FAULT; |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2629 | } |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2630 | |
Anurag Chouhan | f04e84f | 2016-03-03 10:12:12 +0530 | [diff] [blame] | 2631 | qdf_ret_status = |
Peng Xu | f5d60c8 | 2015-10-02 17:17:03 -0700 | [diff] [blame] | 2632 | sme_deregister_mgmt_frame(hHal, pSapCtx->sessionId, frameType, |
| 2633 | matchData, matchLen); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2634 | |
Anurag Chouhan | f04e84f | 2016-03-03 10:12:12 +0530 | [diff] [blame] | 2635 | if (QDF_STATUS_SUCCESS == qdf_ret_status) { |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2636 | return QDF_STATUS_SUCCESS; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2637 | } |
| 2638 | |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2639 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2640 | "Failed to Deregister MGMT frame"); |
| 2641 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2642 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2643 | } |
| 2644 | |
| 2645 | /*========================================================================== |
| 2646 | FUNCTION wlansap_channel_change_request |
| 2647 | |
| 2648 | DESCRIPTION |
| 2649 | This API is used to send an Indication to SME/PE to change the |
| 2650 | current operating channel to a different target channel. |
| 2651 | |
| 2652 | The Channel change will be issued by SAP under the following |
| 2653 | scenarios. |
| 2654 | 1. A radar indication is received during SAP CAC WAIT STATE and |
| 2655 | channel change is required. |
| 2656 | 2. A radar indication is received during SAP STARTED STATE and |
| 2657 | channel change is required. |
| 2658 | DEPENDENCIES |
| 2659 | NA. |
| 2660 | |
| 2661 | PARAMETERS |
| 2662 | IN |
| 2663 | pSapCtx: Pointer to cds global context structure |
| 2664 | |
| 2665 | RETURN VALUE |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2666 | The QDF_STATUS code associated with performing the operation |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2667 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2668 | QDF_STATUS_SUCCESS: Success |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2669 | |
| 2670 | SIDE EFFECTS |
| 2671 | ============================================================================*/ |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2672 | QDF_STATUS |
Abhishek Singh | 518323d | 2015-10-19 17:42:01 +0530 | [diff] [blame] | 2673 | wlansap_channel_change_request(void *pSapCtx, uint8_t target_channel) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2674 | { |
| 2675 | ptSapContext sapContext = NULL; |
Anurag Chouhan | f04e84f | 2016-03-03 10:12:12 +0530 | [diff] [blame] | 2676 | QDF_STATUS qdf_ret_status = QDF_STATUS_E_FAILURE; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2677 | void *hHal = NULL; |
| 2678 | tpAniSirGlobal mac_ctx = NULL; |
| 2679 | eCsrPhyMode phy_mode; |
Amar Singhal | 5cccafe | 2017-02-15 12:42:58 -0800 | [diff] [blame] | 2680 | struct ch_params *ch_params; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2681 | sapContext = (ptSapContext) pSapCtx; |
| 2682 | |
| 2683 | if (NULL == sapContext) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2684 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2685 | "%s: Invalid SAP pointer", __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2686 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2687 | } |
| 2688 | |
| 2689 | hHal = CDS_GET_HAL_CB(sapContext->p_cds_gctx); |
| 2690 | if (NULL == hHal) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2691 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2692 | "%s: Invalid HAL pointer from p_cds_gctx", __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2693 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2694 | } |
| 2695 | mac_ctx = PMAC_STRUCT(hHal); |
| 2696 | phy_mode = sapContext->csr_roamProfile.phyMode; |
Wu Gao | a61310a | 2016-11-29 17:02:36 +0800 | [diff] [blame] | 2697 | |
| 2698 | if (sapContext->csr_roamProfile.ChannelInfo.numOfChannels == 0 || |
| 2699 | sapContext->csr_roamProfile.ChannelInfo.ChannelList == NULL) { |
| 2700 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
| 2701 | FL("Invalid channel list")); |
| 2702 | return QDF_STATUS_E_FAULT; |
| 2703 | } |
Abhishek Singh | 518323d | 2015-10-19 17:42:01 +0530 | [diff] [blame] | 2704 | sapContext->csr_roamProfile.ChannelInfo.ChannelList[0] = target_channel; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2705 | /* |
| 2706 | * We are getting channel bonding mode from sapDfsInfor structure |
| 2707 | * because we've implemented channel width fallback mechanism for DFS |
| 2708 | * which will result in channel width changing dynamically. |
| 2709 | */ |
Sandeep Puligilla | 2111d3c | 2016-02-03 01:46:15 -0800 | [diff] [blame] | 2710 | ch_params = &mac_ctx->sap.SapDfsInfo.new_ch_params; |
Kiran Kumar Lokere | a3de226 | 2017-04-12 12:15:04 -0700 | [diff] [blame] | 2711 | wlan_reg_set_channel_params(mac_ctx->pdev, target_channel, |
| 2712 | 0, ch_params); |
Sandeep Puligilla | 2111d3c | 2016-02-03 01:46:15 -0800 | [diff] [blame] | 2713 | sapContext->ch_params.ch_width = ch_params->ch_width; |
Abhishek Singh | 518323d | 2015-10-19 17:42:01 +0530 | [diff] [blame] | 2714 | /* Update the channel as this will be used to |
| 2715 | * send event to supplicant |
| 2716 | */ |
| 2717 | sapContext->channel = target_channel; |
Sandeep Puligilla | 2111d3c | 2016-02-03 01:46:15 -0800 | [diff] [blame] | 2718 | sapContext->csr_roamProfile.ch_params.ch_width = ch_params->ch_width; |
Manishekar Chandrasekaran | ec26759 | 2016-05-26 19:10:04 +0530 | [diff] [blame] | 2719 | sapContext->csr_roamProfile.ch_params.sec_ch_offset = |
| 2720 | ch_params->sec_ch_offset; |
| 2721 | sapContext->csr_roamProfile.ch_params.center_freq_seg0 = |
| 2722 | ch_params->center_freq_seg0; |
| 2723 | sapContext->csr_roamProfile.ch_params.center_freq_seg1 = |
| 2724 | ch_params->center_freq_seg1; |
yeshwanth sriram guntuka | 92fefea | 2017-02-28 15:49:22 +0530 | [diff] [blame] | 2725 | sapContext->csr_roamProfile.supported_rates.numRates = 0; |
| 2726 | sapContext->csr_roamProfile.extended_rates.numRates = 0; |
Arif Hussain | cd15163 | 2017-02-11 16:57:19 -0800 | [diff] [blame] | 2727 | sap_dfs_set_current_channel(sapContext); |
Manishekar Chandrasekaran | ec26759 | 2016-05-26 19:10:04 +0530 | [diff] [blame] | 2728 | |
Anurag Chouhan | f04e84f | 2016-03-03 10:12:12 +0530 | [diff] [blame] | 2729 | qdf_ret_status = sme_roam_channel_change_req(hHal, sapContext->bssid, |
Sandeep Puligilla | 2111d3c | 2016-02-03 01:46:15 -0800 | [diff] [blame] | 2730 | ch_params, &sapContext->csr_roamProfile); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2731 | |
Manishekar Chandrasekaran | ec26759 | 2016-05-26 19:10:04 +0530 | [diff] [blame] | 2732 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO, |
| 2733 | "%s: chan:%d width:%d offset:%d seg0:%d seg1:%d", |
| 2734 | __func__, sapContext->channel, ch_params->ch_width, |
| 2735 | ch_params->sec_ch_offset, ch_params->center_freq_seg0, |
| 2736 | ch_params->center_freq_seg1); |
| 2737 | |
Anurag Chouhan | f04e84f | 2016-03-03 10:12:12 +0530 | [diff] [blame] | 2738 | if (qdf_ret_status == QDF_STATUS_SUCCESS) { |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2739 | sap_signal_hdd_event(sapContext, NULL, |
| 2740 | eSAP_CHANNEL_CHANGE_EVENT, |
| 2741 | (void *) eSAP_STATUS_SUCCESS); |
| 2742 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2743 | return QDF_STATUS_SUCCESS; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2744 | } |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2745 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2746 | } |
| 2747 | |
| 2748 | /*========================================================================== |
| 2749 | |
| 2750 | FUNCTION wlansap_start_beacon_req |
| 2751 | DESCRIPTION |
| 2752 | This API is used to send an Indication to SME/PE to start |
| 2753 | beaconing on the current operating channel. |
| 2754 | |
| 2755 | Brief:When SAP is started on DFS channel and when ADD BSS RESP is received |
| 2756 | LIM temporarily holds off Beaconing for SAP to do CAC WAIT. When |
| 2757 | CAC WAIT is done SAP resumes the Beacon Tx by sending a start beacon |
| 2758 | request to LIM. |
| 2759 | |
| 2760 | DEPENDENCIES |
| 2761 | NA. |
| 2762 | |
| 2763 | PARAMETERS |
| 2764 | |
| 2765 | IN |
| 2766 | pSapCtx: Pointer to cds global context structure |
| 2767 | |
| 2768 | RETURN VALUE |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2769 | The QDF_STATUS code associated with performing the operation |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2770 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2771 | QDF_STATUS_SUCCESS: Success |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2772 | |
| 2773 | SIDE EFFECTS |
| 2774 | ============================================================================*/ |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2775 | QDF_STATUS wlansap_start_beacon_req(void *pSapCtx) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2776 | { |
| 2777 | ptSapContext sapContext = NULL; |
Anurag Chouhan | f04e84f | 2016-03-03 10:12:12 +0530 | [diff] [blame] | 2778 | QDF_STATUS qdf_ret_status = QDF_STATUS_E_FAILURE; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2779 | void *hHal = NULL; |
| 2780 | uint8_t dfsCacWaitStatus = 0; |
| 2781 | tpAniSirGlobal pMac = NULL; |
| 2782 | sapContext = (ptSapContext) pSapCtx; |
| 2783 | |
| 2784 | if (NULL == sapContext) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2785 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2786 | "%s: Invalid SAP pointer", __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2787 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2788 | } |
| 2789 | |
| 2790 | hHal = CDS_GET_HAL_CB(sapContext->p_cds_gctx); |
| 2791 | if (NULL == hHal) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2792 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2793 | "%s: Invalid HAL pointer from p_cds_gctx", __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2794 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2795 | } |
| 2796 | pMac = PMAC_STRUCT(hHal); |
| 2797 | |
| 2798 | /* No Radar was found during CAC WAIT, So start Beaconing */ |
| 2799 | if (pMac->sap.SapDfsInfo.sap_radar_found_status == false) { |
| 2800 | /* CAC Wait done without any Radar Detection */ |
| 2801 | dfsCacWaitStatus = true; |
Manishekar Chandrasekaran | 9e8c7be | 2016-08-03 14:57:14 +0530 | [diff] [blame] | 2802 | sapContext->pre_cac_complete = false; |
Anurag Chouhan | f04e84f | 2016-03-03 10:12:12 +0530 | [diff] [blame] | 2803 | qdf_ret_status = sme_roam_start_beacon_req(hHal, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2804 | sapContext->bssid, |
| 2805 | dfsCacWaitStatus); |
Anurag Chouhan | f04e84f | 2016-03-03 10:12:12 +0530 | [diff] [blame] | 2806 | if (qdf_ret_status == QDF_STATUS_SUCCESS) { |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2807 | return QDF_STATUS_SUCCESS; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2808 | } |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2809 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2810 | } |
| 2811 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2812 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2813 | } |
| 2814 | |
| 2815 | /*========================================================================== |
| 2816 | FUNCTION wlansap_dfs_send_csa_ie_request |
| 2817 | |
| 2818 | DESCRIPTION |
| 2819 | This API is used to send channel switch announcement request to PE |
| 2820 | DEPENDENCIES |
| 2821 | NA. |
| 2822 | |
| 2823 | PARAMETERS |
| 2824 | IN |
| 2825 | pSapCtx: Pointer to cds global context structure |
| 2826 | |
| 2827 | RETURN VALUE |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2828 | The QDF_STATUS code associated with performing the operation |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2829 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2830 | QDF_STATUS_SUCCESS: Success |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2831 | |
| 2832 | SIDE EFFECTS |
| 2833 | ============================================================================*/ |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2834 | QDF_STATUS wlansap_dfs_send_csa_ie_request(void *pSapCtx) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2835 | { |
| 2836 | ptSapContext sapContext = NULL; |
Anurag Chouhan | f04e84f | 2016-03-03 10:12:12 +0530 | [diff] [blame] | 2837 | QDF_STATUS qdf_ret_status = QDF_STATUS_E_FAILURE; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2838 | void *hHal = NULL; |
| 2839 | tpAniSirGlobal pMac = NULL; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2840 | sapContext = (ptSapContext) pSapCtx; |
| 2841 | |
| 2842 | if (NULL == sapContext) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2843 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2844 | "%s: Invalid SAP pointer", __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2845 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2846 | } |
| 2847 | |
| 2848 | hHal = CDS_GET_HAL_CB(sapContext->p_cds_gctx); |
| 2849 | if (NULL == hHal) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2850 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2851 | "%s: Invalid HAL pointer from p_cds_gctx", __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2852 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2853 | } |
| 2854 | pMac = PMAC_STRUCT(hHal); |
| 2855 | |
Sandeep Puligilla | 2111d3c | 2016-02-03 01:46:15 -0800 | [diff] [blame] | 2856 | pMac->sap.SapDfsInfo.new_ch_params.ch_width = |
| 2857 | pMac->sap.SapDfsInfo.new_chanWidth; |
Kiran Kumar Lokere | a3de226 | 2017-04-12 12:15:04 -0700 | [diff] [blame] | 2858 | wlan_reg_set_channel_params(pMac->pdev, |
| 2859 | pMac->sap.SapDfsInfo.target_channel, |
| 2860 | 0, &pMac->sap.SapDfsInfo.new_ch_params); |
Sandeep Puligilla | 2111d3c | 2016-02-03 01:46:15 -0800 | [diff] [blame] | 2861 | |
Chandrasekaran Manishekar | 4fcb7f5 | 2016-03-07 19:09:20 +0530 | [diff] [blame] | 2862 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO, |
| 2863 | "%s: chan:%d req:%d width:%d off:%d", |
| 2864 | __func__, pMac->sap.SapDfsInfo.target_channel, |
| 2865 | pMac->sap.SapDfsInfo.csaIERequired, |
| 2866 | pMac->sap.SapDfsInfo.new_ch_params.ch_width, |
| 2867 | pMac->sap.SapDfsInfo.new_ch_params.sec_ch_offset); |
| 2868 | |
Anurag Chouhan | f04e84f | 2016-03-03 10:12:12 +0530 | [diff] [blame] | 2869 | qdf_ret_status = sme_roam_csa_ie_request(hHal, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2870 | sapContext->bssid, |
| 2871 | pMac->sap.SapDfsInfo.target_channel, |
| 2872 | pMac->sap.SapDfsInfo.csaIERequired, |
Kiran Kumar Lokere | 999e58c | 2016-01-07 02:18:39 -0800 | [diff] [blame] | 2873 | &pMac->sap.SapDfsInfo.new_ch_params); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2874 | |
Anurag Chouhan | f04e84f | 2016-03-03 10:12:12 +0530 | [diff] [blame] | 2875 | if (qdf_ret_status == QDF_STATUS_SUCCESS) { |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2876 | return QDF_STATUS_SUCCESS; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2877 | } |
| 2878 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2879 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2880 | } |
| 2881 | |
| 2882 | /*========================================================================== |
| 2883 | FUNCTION wlansap_get_dfs_ignore_cac |
| 2884 | |
| 2885 | DESCRIPTION |
| 2886 | This API is used to get the value of ignore_cac value |
| 2887 | |
| 2888 | DEPENDENCIES |
| 2889 | NA. |
| 2890 | |
| 2891 | PARAMETERS |
| 2892 | IN |
| 2893 | hHal : HAL pointer |
| 2894 | pIgnore_cac : pointer to ignore_cac variable |
| 2895 | |
| 2896 | RETURN VALUE |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2897 | The QDF_STATUS code associated with performing the operation |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2898 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2899 | QDF_STATUS_SUCCESS: Success |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2900 | |
| 2901 | SIDE EFFECTS |
| 2902 | ============================================================================*/ |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2903 | QDF_STATUS wlansap_get_dfs_ignore_cac(tHalHandle hHal, uint8_t *pIgnore_cac) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2904 | { |
| 2905 | tpAniSirGlobal pMac = NULL; |
| 2906 | |
| 2907 | if (NULL != hHal) { |
| 2908 | pMac = PMAC_STRUCT(hHal); |
| 2909 | } else { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2910 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2911 | "%s: Invalid hHal pointer", __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2912 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2913 | } |
| 2914 | |
| 2915 | *pIgnore_cac = pMac->sap.SapDfsInfo.ignore_cac; |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2916 | return QDF_STATUS_SUCCESS; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2917 | } |
| 2918 | |
| 2919 | /*========================================================================== |
| 2920 | FUNCTION wlansap_set_dfs_ignore_cac |
| 2921 | |
| 2922 | DESCRIPTION |
| 2923 | This API is used to Set the value of ignore_cac value |
| 2924 | |
| 2925 | DEPENDENCIES |
| 2926 | NA. |
| 2927 | |
| 2928 | PARAMETERS |
| 2929 | IN |
| 2930 | hHal : HAL pointer |
| 2931 | ignore_cac : value to set for ignore_cac variable in DFS global structure. |
| 2932 | |
| 2933 | RETURN VALUE |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2934 | The QDF_STATUS code associated with performing the operation |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2935 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2936 | QDF_STATUS_SUCCESS: Success |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2937 | |
| 2938 | SIDE EFFECTS |
| 2939 | ============================================================================*/ |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2940 | QDF_STATUS wlansap_set_dfs_ignore_cac(tHalHandle hHal, uint8_t ignore_cac) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2941 | { |
| 2942 | tpAniSirGlobal pMac = NULL; |
| 2943 | |
| 2944 | if (NULL != hHal) { |
| 2945 | pMac = PMAC_STRUCT(hHal); |
| 2946 | } else { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2947 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2948 | "%s: Invalid hHal pointer", __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2949 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2950 | } |
| 2951 | |
| 2952 | pMac->sap.SapDfsInfo.ignore_cac = (ignore_cac >= true) ? |
| 2953 | true : false; |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2954 | return QDF_STATUS_SUCCESS; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2955 | } |
| 2956 | |
| 2957 | /** |
| 2958 | * wlansap_set_dfs_restrict_japan_w53() - enable/disable dfS for japan |
| 2959 | * @hHal : HAL pointer |
| 2960 | * @disable_Dfs_JapanW3 :Indicates if Japan W53 is disabled when set to 1 |
| 2961 | * Indicates if Japan W53 is enabled when set to 0 |
| 2962 | * |
| 2963 | * This API is used to enable or disable Japan W53 Band |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2964 | * Return: The QDF_STATUS code associated with performing the operation |
| 2965 | * QDF_STATUS_SUCCESS: Success |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2966 | */ |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2967 | QDF_STATUS |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2968 | wlansap_set_dfs_restrict_japan_w53(tHalHandle hHal, uint8_t disable_Dfs_W53) |
| 2969 | { |
| 2970 | tpAniSirGlobal pMac = NULL; |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2971 | QDF_STATUS status; |
Amar Singhal | 5cccafe | 2017-02-15 12:42:58 -0800 | [diff] [blame] | 2972 | enum dfs_reg dfs_region; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2973 | |
| 2974 | if (NULL != hHal) { |
| 2975 | pMac = PMAC_STRUCT(hHal); |
| 2976 | } else { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2977 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2978 | "%s: Invalid hHal pointer", __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2979 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2980 | } |
| 2981 | |
Amar Singhal | 5cccafe | 2017-02-15 12:42:58 -0800 | [diff] [blame] | 2982 | wlan_reg_get_dfs_region(pMac->psoc, &dfs_region); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2983 | |
| 2984 | /* |
| 2985 | * Set the JAPAN W53 restriction only if the current |
| 2986 | * regulatory domain is JAPAN. |
| 2987 | */ |
Amar Singhal | 5cccafe | 2017-02-15 12:42:58 -0800 | [diff] [blame] | 2988 | if (DFS_MKK_REG == dfs_region) { |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2989 | pMac->sap.SapDfsInfo.is_dfs_w53_disabled = disable_Dfs_W53; |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2990 | QDF_TRACE(QDF_MODULE_ID_SAP, |
| 2991 | QDF_TRACE_LEVEL_INFO_LOW, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2992 | FL("sapdfs: SET DFS JAPAN W53 DISABLED = %d"), |
| 2993 | pMac->sap.SapDfsInfo.is_dfs_w53_disabled); |
| 2994 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2995 | status = QDF_STATUS_SUCCESS; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2996 | } else { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2997 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2998 | FL |
Srinivas Girigowda | 678586c | 2017-03-10 00:13:58 -0800 | [diff] [blame] | 2999 | ("Regdomain not japan, set disable JP W53 not valid")); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3000 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 3001 | status = QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3002 | } |
| 3003 | |
| 3004 | return status; |
| 3005 | } |
| 3006 | |
bings | 394afdd | 2017-01-09 11:22:38 +0800 | [diff] [blame] | 3007 | bool sap_is_auto_channel_select(void *pvos_gctx) |
| 3008 | { |
| 3009 | ptSapContext sapcontext = CDS_GET_SAP_CB(pvos_gctx); |
| 3010 | |
| 3011 | if (NULL == sapcontext) { |
| 3012 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
| 3013 | "%s: Invalid SAP pointer", __func__); |
| 3014 | return 0; |
| 3015 | } |
| 3016 | return sapcontext->channel == AUTO_CHANNEL_SELECT; |
| 3017 | } |
| 3018 | |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3019 | #ifdef FEATURE_AP_MCC_CH_AVOIDANCE |
| 3020 | /** |
| 3021 | * wlan_sap_set_channel_avoidance() - sets sap mcc channel avoidance ini param |
| 3022 | * @hal: hal handle |
| 3023 | * @sap_channel_avoidance: ini parameter value |
| 3024 | * |
| 3025 | * sets sap mcc channel avoidance ini param, to be called in sap_start |
| 3026 | * |
| 3027 | * Return: success of failure of operation |
| 3028 | */ |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 3029 | QDF_STATUS |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3030 | wlan_sap_set_channel_avoidance(tHalHandle hal, bool sap_channel_avoidance) |
| 3031 | { |
| 3032 | tpAniSirGlobal mac_ctx = NULL; |
| 3033 | if (NULL != hal) |
| 3034 | mac_ctx = PMAC_STRUCT(hal); |
| 3035 | if (mac_ctx == NULL || hal == NULL) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3036 | QDF_TRACE(QDF_MODULE_ID_SAP, |
| 3037 | QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3038 | FL("hal or mac_ctx pointer NULL")); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 3039 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3040 | } |
| 3041 | mac_ctx->sap.sap_channel_avoidance = sap_channel_avoidance; |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 3042 | return QDF_STATUS_SUCCESS; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3043 | } |
| 3044 | #endif /* FEATURE_AP_MCC_CH_AVOIDANCE */ |
| 3045 | |
| 3046 | /** |
| 3047 | * wlansap_set_dfs_preferred_channel_location() - set dfs preferred channel |
| 3048 | * @hHal : HAL pointer |
| 3049 | * @dfs_Preferred_Channels_location : |
| 3050 | * 0 - Indicates No preferred channel location restrictions |
| 3051 | * 1 - Indicates SAP Indoor Channels operation only. |
| 3052 | * 2 - Indicates SAP Outdoor Channels operation only. |
| 3053 | * |
| 3054 | * This API is used to set sap preferred channels location |
| 3055 | * to resetrict the DFS random channel selection algorithm |
| 3056 | * either Indoor/Outdoor channels only. |
| 3057 | * |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 3058 | * Return: The QDF_STATUS code associated with performing the operation |
| 3059 | * QDF_STATUS_SUCCESS: Success and error code otherwise. |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3060 | */ |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 3061 | QDF_STATUS |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3062 | wlansap_set_dfs_preferred_channel_location(tHalHandle hHal, |
| 3063 | uint8_t |
| 3064 | dfs_Preferred_Channels_location) |
| 3065 | { |
| 3066 | tpAniSirGlobal pMac = NULL; |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 3067 | QDF_STATUS status; |
Amar Singhal | 5cccafe | 2017-02-15 12:42:58 -0800 | [diff] [blame] | 3068 | enum dfs_reg dfs_region; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3069 | |
| 3070 | if (NULL != hHal) { |
| 3071 | pMac = PMAC_STRUCT(hHal); |
| 3072 | } else { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3073 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3074 | "%s: Invalid hHal pointer", __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 3075 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3076 | } |
| 3077 | |
Amar Singhal | 5cccafe | 2017-02-15 12:42:58 -0800 | [diff] [blame] | 3078 | wlan_reg_get_dfs_region(pMac->psoc, &dfs_region); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3079 | |
| 3080 | /* |
| 3081 | * The Indoor/Outdoor only random channel selection |
| 3082 | * restriction is currently enforeced only for |
| 3083 | * JAPAN regulatory domain. |
| 3084 | */ |
Amar Singhal | 5cccafe | 2017-02-15 12:42:58 -0800 | [diff] [blame] | 3085 | if (DFS_MKK_REG == dfs_region) { |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3086 | pMac->sap.SapDfsInfo.sap_operating_chan_preferred_location = |
| 3087 | dfs_Preferred_Channels_location; |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3088 | QDF_TRACE(QDF_MODULE_ID_SAP, |
| 3089 | QDF_TRACE_LEVEL_INFO_LOW, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3090 | FL |
| 3091 | ("sapdfs:Set Preferred Operating Channel location=%d"), |
| 3092 | pMac->sap.SapDfsInfo. |
| 3093 | sap_operating_chan_preferred_location); |
| 3094 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 3095 | status = QDF_STATUS_SUCCESS; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3096 | } else { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3097 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3098 | FL |
| 3099 | ("sapdfs:NOT JAPAN REG, Invalid Set preferred chans location")); |
| 3100 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 3101 | status = QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3102 | } |
| 3103 | |
| 3104 | return status; |
| 3105 | } |
| 3106 | |
| 3107 | /*========================================================================== |
| 3108 | FUNCTION wlansap_set_dfs_target_chnl |
| 3109 | |
| 3110 | DESCRIPTION |
| 3111 | This API is used to set next target chnl as provided channel. |
| 3112 | you can provide any valid channel to this API. |
| 3113 | |
| 3114 | DEPENDENCIES |
| 3115 | NA. |
| 3116 | |
| 3117 | PARAMETERS |
| 3118 | IN |
| 3119 | hHal : HAL pointer |
| 3120 | target_channel : target channel to be set |
| 3121 | |
| 3122 | RETURN VALUE |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 3123 | The QDF_STATUS code associated with performing the operation |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3124 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 3125 | QDF_STATUS_SUCCESS: Success |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3126 | |
| 3127 | SIDE EFFECTS |
| 3128 | ============================================================================*/ |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 3129 | QDF_STATUS wlansap_set_dfs_target_chnl(tHalHandle hHal, uint8_t target_channel) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3130 | { |
| 3131 | tpAniSirGlobal pMac = NULL; |
| 3132 | |
| 3133 | if (NULL != hHal) { |
| 3134 | pMac = PMAC_STRUCT(hHal); |
| 3135 | } else { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3136 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3137 | "%s: Invalid hHal pointer", __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 3138 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3139 | } |
| 3140 | if (target_channel > 0) { |
| 3141 | pMac->sap.SapDfsInfo.user_provided_target_channel = |
| 3142 | target_channel; |
| 3143 | } else { |
| 3144 | pMac->sap.SapDfsInfo.user_provided_target_channel = 0; |
| 3145 | } |
| 3146 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 3147 | return QDF_STATUS_SUCCESS; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3148 | } |
| 3149 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 3150 | QDF_STATUS |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3151 | wlansap_update_sap_config_add_ie(tsap_Config_t *pConfig, |
| 3152 | const uint8_t *pAdditionIEBuffer, |
| 3153 | uint16_t additionIELength, |
| 3154 | eUpdateIEsType updateType) |
| 3155 | { |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 3156 | QDF_STATUS status = QDF_STATUS_SUCCESS; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3157 | uint8_t bufferValid = false; |
| 3158 | uint16_t bufferLength = 0; |
| 3159 | uint8_t *pBuffer = NULL; |
| 3160 | |
| 3161 | if (NULL == pConfig) { |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 3162 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3163 | } |
| 3164 | |
| 3165 | if ((pAdditionIEBuffer != NULL) && (additionIELength != 0)) { |
| 3166 | /* initialize the buffer pointer so that pe can copy */ |
| 3167 | if (additionIELength > 0) { |
| 3168 | bufferLength = additionIELength; |
Anurag Chouhan | 600c3a0 | 2016-03-01 10:33:54 +0530 | [diff] [blame] | 3169 | pBuffer = qdf_mem_malloc(bufferLength); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3170 | if (NULL == pBuffer) { |
Krishna Kumaar Natarajan | 4f1d772 | 2017-03-03 21:12:51 -0800 | [diff] [blame] | 3171 | QDF_TRACE(QDF_MODULE_ID_SAP, |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3172 | QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3173 | FL("Could not allocate the buffer ")); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 3174 | return QDF_STATUS_E_NOMEM; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3175 | } |
Anurag Chouhan | 600c3a0 | 2016-03-01 10:33:54 +0530 | [diff] [blame] | 3176 | qdf_mem_copy(pBuffer, pAdditionIEBuffer, bufferLength); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3177 | bufferValid = true; |
Krishna Kumaar Natarajan | 4f1d772 | 2017-03-03 21:12:51 -0800 | [diff] [blame] | 3178 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO, |
| 3179 | FL("update_type: %d"), updateType); |
| 3180 | qdf_trace_hex_dump(QDF_MODULE_ID_SAP, |
| 3181 | QDF_TRACE_LEVEL_INFO, pBuffer, bufferLength); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3182 | } |
| 3183 | } |
| 3184 | |
| 3185 | switch (updateType) { |
| 3186 | case eUPDATE_IE_PROBE_BCN: |
| 3187 | if (bufferValid) { |
| 3188 | pConfig->probeRespBcnIEsLen = bufferLength; |
| 3189 | pConfig->pProbeRespBcnIEsBuffer = pBuffer; |
| 3190 | } else { |
Anurag Chouhan | 600c3a0 | 2016-03-01 10:33:54 +0530 | [diff] [blame] | 3191 | qdf_mem_free(pConfig->pProbeRespBcnIEsBuffer); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3192 | pConfig->probeRespBcnIEsLen = 0; |
| 3193 | pConfig->pProbeRespBcnIEsBuffer = NULL; |
Krishna Kumaar Natarajan | 4f1d772 | 2017-03-03 21:12:51 -0800 | [diff] [blame] | 3194 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO, |
| 3195 | FL("No Probe Resp beacone IE received in set beacon")); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3196 | } |
| 3197 | break; |
| 3198 | case eUPDATE_IE_PROBE_RESP: |
| 3199 | if (bufferValid) { |
| 3200 | pConfig->probeRespIEsBufferLen = bufferLength; |
| 3201 | pConfig->pProbeRespIEsBuffer = pBuffer; |
| 3202 | } else { |
Anurag Chouhan | 600c3a0 | 2016-03-01 10:33:54 +0530 | [diff] [blame] | 3203 | qdf_mem_free(pConfig->pProbeRespIEsBuffer); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3204 | pConfig->probeRespIEsBufferLen = 0; |
| 3205 | pConfig->pProbeRespIEsBuffer = NULL; |
Krishna Kumaar Natarajan | 4f1d772 | 2017-03-03 21:12:51 -0800 | [diff] [blame] | 3206 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO, |
| 3207 | FL("No Probe Response IE received in set beacon")); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3208 | } |
| 3209 | break; |
| 3210 | case eUPDATE_IE_ASSOC_RESP: |
| 3211 | if (bufferValid) { |
| 3212 | pConfig->assocRespIEsLen = bufferLength; |
| 3213 | pConfig->pAssocRespIEsBuffer = pBuffer; |
| 3214 | } else { |
Anurag Chouhan | 600c3a0 | 2016-03-01 10:33:54 +0530 | [diff] [blame] | 3215 | qdf_mem_free(pConfig->pAssocRespIEsBuffer); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3216 | pConfig->assocRespIEsLen = 0; |
| 3217 | pConfig->pAssocRespIEsBuffer = NULL; |
Krishna Kumaar Natarajan | 4f1d772 | 2017-03-03 21:12:51 -0800 | [diff] [blame] | 3218 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO, |
| 3219 | FL("No Assoc Response IE received in set beacon")); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3220 | } |
| 3221 | break; |
| 3222 | default: |
Krishna Kumaar Natarajan | 4f1d772 | 2017-03-03 21:12:51 -0800 | [diff] [blame] | 3223 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3224 | FL("No matching buffer type %d"), updateType); |
| 3225 | if (pBuffer != NULL) |
Anurag Chouhan | 600c3a0 | 2016-03-01 10:33:54 +0530 | [diff] [blame] | 3226 | qdf_mem_free(pBuffer); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3227 | break; |
| 3228 | } |
| 3229 | |
| 3230 | return status; |
| 3231 | } |
| 3232 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 3233 | QDF_STATUS |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3234 | wlansap_reset_sap_config_add_ie(tsap_Config_t *pConfig, eUpdateIEsType updateType) |
| 3235 | { |
| 3236 | if (NULL == pConfig) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3237 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3238 | "%s: Invalid Config pointer", __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 3239 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3240 | } |
| 3241 | |
| 3242 | switch (updateType) { |
| 3243 | case eUPDATE_IE_ALL: /*only used to reset */ |
| 3244 | case eUPDATE_IE_PROBE_RESP: |
Anurag Chouhan | 600c3a0 | 2016-03-01 10:33:54 +0530 | [diff] [blame] | 3245 | qdf_mem_free(pConfig->pProbeRespIEsBuffer); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3246 | pConfig->probeRespIEsBufferLen = 0; |
| 3247 | pConfig->pProbeRespIEsBuffer = NULL; |
| 3248 | if (eUPDATE_IE_ALL != updateType) |
| 3249 | break; |
| 3250 | |
| 3251 | case eUPDATE_IE_ASSOC_RESP: |
Anurag Chouhan | 600c3a0 | 2016-03-01 10:33:54 +0530 | [diff] [blame] | 3252 | qdf_mem_free(pConfig->pAssocRespIEsBuffer); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3253 | pConfig->assocRespIEsLen = 0; |
| 3254 | pConfig->pAssocRespIEsBuffer = NULL; |
| 3255 | if (eUPDATE_IE_ALL != updateType) |
| 3256 | break; |
| 3257 | |
| 3258 | case eUPDATE_IE_PROBE_BCN: |
Anurag Chouhan | 600c3a0 | 2016-03-01 10:33:54 +0530 | [diff] [blame] | 3259 | qdf_mem_free(pConfig->pProbeRespBcnIEsBuffer); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3260 | pConfig->probeRespBcnIEsLen = 0; |
| 3261 | pConfig->pProbeRespBcnIEsBuffer = NULL; |
| 3262 | if (eUPDATE_IE_ALL != updateType) |
| 3263 | break; |
| 3264 | |
| 3265 | default: |
| 3266 | if (eUPDATE_IE_ALL != updateType) |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3267 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3268 | FL("Invalid buffer type %d"), updateType); |
| 3269 | break; |
| 3270 | } |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 3271 | return QDF_STATUS_SUCCESS; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3272 | } |
| 3273 | |
| 3274 | /*========================================================================== |
| 3275 | FUNCTION wlansap_extend_to_acs_range |
| 3276 | |
| 3277 | DESCRIPTION Function extends give channel range to consider ACS chan bonding |
| 3278 | |
| 3279 | DEPENDENCIES PARAMETERS |
| 3280 | |
| 3281 | IN /OUT |
| 3282 | *startChannelNum : ACS extend start ch |
| 3283 | *endChannelNum : ACS extended End ch |
| 3284 | *bandStartChannel: Band start ch |
| 3285 | *bandEndChannel : Band end ch |
| 3286 | |
| 3287 | RETURN VALUE NONE |
| 3288 | |
| 3289 | SIDE EFFECTS |
| 3290 | ============================================================================*/ |
Kiran Kumar Lokere | a3de226 | 2017-04-12 12:15:04 -0700 | [diff] [blame] | 3291 | void wlansap_extend_to_acs_range(tHalHandle hal, uint8_t *startChannelNum, |
| 3292 | uint8_t *endChannelNum, uint8_t *bandStartChannel, |
| 3293 | uint8_t *bandEndChannel) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3294 | { |
| 3295 | #define ACS_WLAN_20M_CH_INC 4 |
| 3296 | #define ACS_2G_EXTEND ACS_WLAN_20M_CH_INC |
| 3297 | #define ACS_5G_EXTEND (ACS_WLAN_20M_CH_INC * 3) |
| 3298 | |
| 3299 | uint8_t tmp_startChannelNum = 0, tmp_endChannelNum = 0; |
Kiran Kumar Lokere | a3de226 | 2017-04-12 12:15:04 -0700 | [diff] [blame] | 3300 | tpAniSirGlobal mac_ctx; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3301 | |
Kiran Kumar Lokere | a3de226 | 2017-04-12 12:15:04 -0700 | [diff] [blame] | 3302 | mac_ctx = PMAC_STRUCT(hal); |
| 3303 | if (!mac_ctx) { |
| 3304 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
| 3305 | "%s: Invalid mac_ctx", __func__); |
| 3306 | return; |
| 3307 | } |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3308 | if (*startChannelNum <= 14 && *endChannelNum <= 14) { |
Amar Singhal | b8d4f15 | 2016-02-10 10:21:43 -0800 | [diff] [blame] | 3309 | *bandStartChannel = CHAN_ENUM_1; |
| 3310 | *bandEndChannel = CHAN_ENUM_14; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3311 | tmp_startChannelNum = *startChannelNum > 5 ? |
| 3312 | (*startChannelNum - ACS_2G_EXTEND) : 1; |
| 3313 | tmp_endChannelNum = (*endChannelNum + ACS_2G_EXTEND) <= 14 ? |
| 3314 | (*endChannelNum + ACS_2G_EXTEND) : 14; |
| 3315 | } else if (*startChannelNum >= 36 && *endChannelNum >= 36) { |
Amar Singhal | b8d4f15 | 2016-02-10 10:21:43 -0800 | [diff] [blame] | 3316 | *bandStartChannel = CHAN_ENUM_36; |
| 3317 | *bandEndChannel = CHAN_ENUM_165; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3318 | tmp_startChannelNum = (*startChannelNum - ACS_5G_EXTEND) > 36 ? |
| 3319 | (*startChannelNum - ACS_5G_EXTEND) : 36; |
| 3320 | tmp_endChannelNum = (*endChannelNum + ACS_5G_EXTEND) <= 165 ? |
| 3321 | (*endChannelNum + ACS_5G_EXTEND) : 165; |
| 3322 | } else { |
Amar Singhal | b8d4f15 | 2016-02-10 10:21:43 -0800 | [diff] [blame] | 3323 | *bandStartChannel = CHAN_ENUM_1; |
| 3324 | *bandEndChannel = CHAN_ENUM_165; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3325 | tmp_startChannelNum = *startChannelNum > 5 ? |
| 3326 | (*startChannelNum - ACS_2G_EXTEND) : 1; |
| 3327 | tmp_endChannelNum = (*endChannelNum + ACS_5G_EXTEND) <= 165 ? |
| 3328 | (*endChannelNum + ACS_5G_EXTEND) : 165; |
| 3329 | } |
| 3330 | |
| 3331 | /* Note if the ACS range include only DFS channels, do not cross range |
| 3332 | * Active scanning in adjacent non DFS channels results in transmission |
| 3333 | * spikes in DFS specturm channels which is due to emission spill. |
| 3334 | * Remove the active channels from extend ACS range for DFS only range |
| 3335 | */ |
Kiran Kumar Lokere | a3de226 | 2017-04-12 12:15:04 -0700 | [diff] [blame] | 3336 | if (wlan_reg_is_dfs_ch(mac_ctx->pdev, *startChannelNum)) { |
| 3337 | while (!wlan_reg_is_dfs_ch(mac_ctx->pdev, |
| 3338 | tmp_startChannelNum) && |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3339 | tmp_startChannelNum < *startChannelNum) |
| 3340 | tmp_startChannelNum += ACS_WLAN_20M_CH_INC; |
| 3341 | |
| 3342 | *startChannelNum = tmp_startChannelNum; |
| 3343 | } |
Kiran Kumar Lokere | a3de226 | 2017-04-12 12:15:04 -0700 | [diff] [blame] | 3344 | if (wlan_reg_is_dfs_ch(mac_ctx->pdev, *endChannelNum)) { |
| 3345 | while (!wlan_reg_is_dfs_ch(mac_ctx->pdev, |
| 3346 | tmp_endChannelNum) && |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3347 | tmp_endChannelNum > *endChannelNum) |
| 3348 | tmp_endChannelNum -= ACS_WLAN_20M_CH_INC; |
| 3349 | |
| 3350 | *endChannelNum = tmp_endChannelNum; |
| 3351 | } |
| 3352 | } |
| 3353 | |
Kapil Gupta | 8878ad9 | 2017-02-13 11:56:04 +0530 | [diff] [blame] | 3354 | QDF_STATUS wlan_sap_set_vendor_acs(void *ctx, bool is_vendor_acs) |
| 3355 | { |
| 3356 | ptSapContext sap_context = (ptSapContext) ctx; |
| 3357 | |
| 3358 | if (!sap_context) { |
| 3359 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
| 3360 | "%s: Invalid SAP pointer", __func__); |
| 3361 | return QDF_STATUS_E_FAULT; |
| 3362 | } |
| 3363 | sap_context->vendor_acs_enabled = is_vendor_acs; |
| 3364 | |
| 3365 | return QDF_STATUS_SUCCESS; |
| 3366 | } |
Manishekar Chandrasekaran | 9e8c7be | 2016-08-03 14:57:14 +0530 | [diff] [blame] | 3367 | /** |
| 3368 | * wlansap_get_dfs_nol() - Get the DFS NOL |
| 3369 | * @pSapCtx: SAP context |
| 3370 | * @nol: Pointer to the NOL |
| 3371 | * @nol_len: Length of the NOL |
| 3372 | * |
| 3373 | * Provides the DFS NOL |
| 3374 | * |
| 3375 | * Return: QDF_STATUS |
| 3376 | */ |
| 3377 | QDF_STATUS wlansap_get_dfs_nol(void *pSapCtx, uint8_t *nol, uint32_t *nol_len) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3378 | { |
Manishekar Chandrasekaran | 9e8c7be | 2016-08-03 14:57:14 +0530 | [diff] [blame] | 3379 | int i = 0, j = 0; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3380 | ptSapContext sapContext = (ptSapContext) pSapCtx; |
| 3381 | void *hHal = NULL; |
| 3382 | tpAniSirGlobal pMac = NULL; |
| 3383 | uint64_t current_time, found_time, elapsed_time; |
| 3384 | unsigned long left_time; |
| 3385 | tSapDfsNolInfo *dfs_nol = NULL; |
| 3386 | bool bAvailable = false; |
Manishekar Chandrasekaran | 9e8c7be | 2016-08-03 14:57:14 +0530 | [diff] [blame] | 3387 | *nol_len = 0; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3388 | |
| 3389 | if (NULL == sapContext) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3390 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3391 | "%s: Invalid SAP pointer from p_cds_gctx", __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 3392 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3393 | } |
| 3394 | hHal = CDS_GET_HAL_CB(sapContext->p_cds_gctx); |
| 3395 | if (NULL == hHal) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3396 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3397 | "%s: Invalid HAL pointer from p_cds_gctx", __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 3398 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3399 | } |
| 3400 | pMac = PMAC_STRUCT(hHal); |
| 3401 | |
| 3402 | if (!pMac->sap.SapDfsInfo.numCurrentRegDomainDfsChannels) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3403 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3404 | "%s: DFS NOL is empty", __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 3405 | return QDF_STATUS_SUCCESS; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3406 | } |
| 3407 | |
| 3408 | dfs_nol = pMac->sap.SapDfsInfo.sapDfsChannelNolList; |
| 3409 | |
| 3410 | if (!dfs_nol) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3411 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3412 | "%s: DFS NOL context is null", __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 3413 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3414 | } |
| 3415 | |
| 3416 | for (i = 0; i < pMac->sap.SapDfsInfo.numCurrentRegDomainDfsChannels; |
| 3417 | i++) { |
| 3418 | if (!dfs_nol[i].dfs_channel_number) |
| 3419 | continue; |
| 3420 | |
| 3421 | current_time = cds_get_monotonic_boottime(); |
| 3422 | found_time = dfs_nol[i].radar_found_timestamp; |
| 3423 | |
| 3424 | elapsed_time = current_time - found_time; |
| 3425 | |
| 3426 | /* check if channel is available |
| 3427 | * if either channel is usable or available, or timer expired 30mins |
| 3428 | */ |
| 3429 | bAvailable = |
| 3430 | ((dfs_nol[i].radar_status_flag == |
| 3431 | eSAP_DFS_CHANNEL_AVAILABLE) |
| 3432 | || (dfs_nol[i].radar_status_flag == |
| 3433 | eSAP_DFS_CHANNEL_USABLE) |
| 3434 | || (elapsed_time >= SAP_DFS_NON_OCCUPANCY_PERIOD)); |
| 3435 | |
| 3436 | if (bAvailable) { |
| 3437 | dfs_nol[i].radar_status_flag = |
| 3438 | eSAP_DFS_CHANNEL_AVAILABLE; |
| 3439 | dfs_nol[i].radar_found_timestamp = 0; |
| 3440 | |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3441 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3442 | "%s: Channel[%d] is AVAILABLE", |
| 3443 | __func__, dfs_nol[i].dfs_channel_number); |
| 3444 | } else { |
| 3445 | |
| 3446 | /* the time left in min */ |
| 3447 | left_time = SAP_DFS_NON_OCCUPANCY_PERIOD - elapsed_time; |
| 3448 | left_time = left_time / (60 * 1000 * 1000); |
| 3449 | |
Manishekar Chandrasekaran | 9e8c7be | 2016-08-03 14:57:14 +0530 | [diff] [blame] | 3450 | nol[j++] = dfs_nol[i].dfs_channel_number; |
| 3451 | (*nol_len)++; |
| 3452 | |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3453 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3454 | "%s: Channel[%d] is UNAVAILABLE [%lu min left]", |
| 3455 | __func__, |
| 3456 | dfs_nol[i].dfs_channel_number, left_time); |
| 3457 | } |
| 3458 | } |
| 3459 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 3460 | return QDF_STATUS_SUCCESS; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3461 | } |
| 3462 | |
Arif Hussain | cd15163 | 2017-02-11 16:57:19 -0800 | [diff] [blame] | 3463 | QDF_STATUS wlansap_set_dfs_nol(void *psap_ctx, eSapDfsNolType conf) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3464 | { |
Arif Hussain | cd15163 | 2017-02-11 16:57:19 -0800 | [diff] [blame] | 3465 | ptSapContext sap_ctx = (ptSapContext) psap_ctx; |
| 3466 | void *hal = NULL; |
| 3467 | tpAniSirGlobal mac = NULL; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3468 | |
Arif Hussain | cd15163 | 2017-02-11 16:57:19 -0800 | [diff] [blame] | 3469 | if (!sap_ctx) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3470 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3471 | "%s: Invalid SAP pointer from p_cds_gctx", __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 3472 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3473 | } |
Arif Hussain | cd15163 | 2017-02-11 16:57:19 -0800 | [diff] [blame] | 3474 | |
| 3475 | hal = CDS_GET_HAL_CB(sap_ctx->p_cds_gctx); |
| 3476 | if (!hal) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3477 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3478 | "%s: Invalid HAL pointer from p_cds_gctx", __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 3479 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3480 | } |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3481 | |
Arif Hussain | cd15163 | 2017-02-11 16:57:19 -0800 | [diff] [blame] | 3482 | mac = PMAC_STRUCT(hal); |
| 3483 | if (!mac->sap.SapDfsInfo.numCurrentRegDomainDfsChannels) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3484 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3485 | "%s: DFS NOL is empty", __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 3486 | return QDF_STATUS_SUCCESS; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3487 | } |
| 3488 | |
| 3489 | if (conf == eSAP_DFS_NOL_CLEAR) { |
Arif Hussain | cd15163 | 2017-02-11 16:57:19 -0800 | [diff] [blame] | 3490 | struct wlan_objmgr_pdev *pdev; |
| 3491 | |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3492 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3493 | "%s: clear the DFS NOL", __func__); |
| 3494 | |
Arif Hussain | cd15163 | 2017-02-11 16:57:19 -0800 | [diff] [blame] | 3495 | pdev = mac->pdev; |
| 3496 | if (!pdev) { |
| 3497 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
| 3498 | "%s: null pdev", __func__); |
| 3499 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3500 | } |
Arif Hussain | cd15163 | 2017-02-11 16:57:19 -0800 | [diff] [blame] | 3501 | dfs_clear_nol_channels(pdev); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3502 | } else if (conf == eSAP_DFS_NOL_RANDOMIZE) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3503 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3504 | "%s: Randomize the DFS NOL", __func__); |
| 3505 | |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3506 | } else { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3507 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3508 | "%s: unsupport type %d", __func__, conf); |
| 3509 | } |
| 3510 | |
| 3511 | /* set DFS-NOL back to keep it update-to-date in CNSS */ |
Arif Hussain | cd15163 | 2017-02-11 16:57:19 -0800 | [diff] [blame] | 3512 | sap_signal_hdd_event(sap_ctx, NULL, eSAP_DFS_NOL_SET, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3513 | (void *) eSAP_STATUS_SUCCESS); |
| 3514 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 3515 | return QDF_STATUS_SUCCESS; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3516 | } |
| 3517 | |
| 3518 | /** |
| 3519 | * wlansap_populate_del_sta_params() - populate delete station parameter |
| 3520 | * @mac: Pointer to peer mac address. |
| 3521 | * @reason_code: Reason code for the disassoc/deauth. |
| 3522 | * @subtype: Subtype points to either disassoc/deauth frame. |
| 3523 | * @pDelStaParams: Address where parameters to be populated. |
| 3524 | * |
| 3525 | * This API is used to populate delete station parameter structure |
| 3526 | * |
| 3527 | * Return: none |
| 3528 | */ |
| 3529 | |
| 3530 | void wlansap_populate_del_sta_params(const uint8_t *mac, |
| 3531 | uint16_t reason_code, |
| 3532 | uint8_t subtype, |
| 3533 | struct tagCsrDelStaParams *pDelStaParams) |
| 3534 | { |
| 3535 | if (NULL == mac) |
Anurag Chouhan | c554842 | 2016-02-24 18:33:27 +0530 | [diff] [blame] | 3536 | qdf_set_macaddr_broadcast(&pDelStaParams->peerMacAddr); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3537 | else |
Anurag Chouhan | 600c3a0 | 2016-03-01 10:33:54 +0530 | [diff] [blame] | 3538 | qdf_mem_copy(pDelStaParams->peerMacAddr.bytes, mac, |
Anurag Chouhan | 6d76066 | 2016-02-20 16:05:43 +0530 | [diff] [blame] | 3539 | QDF_MAC_ADDR_SIZE); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3540 | |
| 3541 | if (reason_code == 0) |
| 3542 | pDelStaParams->reason_code = eSIR_MAC_DEAUTH_LEAVING_BSS_REASON; |
| 3543 | else |
| 3544 | pDelStaParams->reason_code = reason_code; |
| 3545 | |
| 3546 | if (subtype == (SIR_MAC_MGMT_DEAUTH >> 4) || |
| 3547 | subtype == (SIR_MAC_MGMT_DISASSOC >> 4)) |
| 3548 | pDelStaParams->subtype = subtype; |
| 3549 | else |
| 3550 | pDelStaParams->subtype = (SIR_MAC_MGMT_DEAUTH >> 4); |
| 3551 | |
Srinivas Girigowda | 678586c | 2017-03-10 00:13:58 -0800 | [diff] [blame] | 3552 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3553 | FL( |
| 3554 | "Delete STA with RC:%hu subtype:%hhu MAC::" |
| 3555 | MAC_ADDRESS_STR), |
| 3556 | pDelStaParams->reason_code, pDelStaParams->subtype, |
| 3557 | MAC_ADDR_ARRAY(pDelStaParams->peerMacAddr.bytes)); |
| 3558 | } |
| 3559 | |
| 3560 | /** |
| 3561 | * wlansap_acs_chselect() - Initiates acs channel selection |
| 3562 | * @pvos_gctx: Pointer to vos global context structure |
| 3563 | * @pacs_event_callback: Callback function in hdd called by sap |
| 3564 | * to inform hdd about channel section result |
| 3565 | * @pconfig: Pointer to configuration structure |
| 3566 | * passed down from hdd |
| 3567 | * @pusr_context: Parameter that will be passed back in all |
| 3568 | * the sap callback events. |
| 3569 | * |
| 3570 | * This function serves as an api for hdd to initiate acs scan pre |
| 3571 | * start bss. |
| 3572 | * |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 3573 | * Return: The QDF_STATUS code associated with performing the operation. |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3574 | */ |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 3575 | QDF_STATUS |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3576 | wlansap_acs_chselect(void *pvos_gctx, |
| 3577 | tpWLAN_SAPEventCB pacs_event_callback, |
| 3578 | tsap_Config_t *pconfig, |
| 3579 | void *pusr_context) |
| 3580 | { |
| 3581 | ptSapContext sap_context = NULL; |
| 3582 | tHalHandle h_hal = NULL; |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 3583 | QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3584 | tpAniSirGlobal pmac = NULL; |
| 3585 | |
| 3586 | sap_context = CDS_GET_SAP_CB(pvos_gctx); |
| 3587 | if (NULL == sap_context) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3588 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3589 | "%s: Invalid SAP pointer from pvos_gctx", __func__); |
| 3590 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 3591 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3592 | } |
| 3593 | |
| 3594 | h_hal = (tHalHandle)CDS_GET_HAL_CB(sap_context->p_cds_gctx); |
| 3595 | if (NULL == h_hal) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3596 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3597 | "%s: Invalid MAC context from pvosGCtx", __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 3598 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3599 | } |
| 3600 | |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3601 | pmac = PMAC_STRUCT(h_hal); |
| 3602 | sap_context->acs_cfg = &pconfig->acs_cfg; |
| 3603 | sap_context->ch_width_orig = pconfig->acs_cfg.ch_width; |
| 3604 | sap_context->csr_roamProfile.phyMode = pconfig->acs_cfg.hw_mode; |
| 3605 | |
Peng Xu | 66162de | 2016-02-11 17:01:20 -0800 | [diff] [blame] | 3606 | /* |
| 3607 | * Now, configure the scan and ACS channel params |
| 3608 | * to issue a scan request. |
| 3609 | */ |
| 3610 | wlansap_set_scan_acs_channel_params(pconfig, sap_context, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3611 | pusr_context); |
| 3612 | |
Peng Xu | 66162de | 2016-02-11 17:01:20 -0800 | [diff] [blame] | 3613 | /* |
| 3614 | * Copy the HDD callback function to report the |
| 3615 | * ACS result after scan in SAP context callback function. |
| 3616 | */ |
| 3617 | sap_context->pfnSapEventCallback = pacs_event_callback; |
| 3618 | /* |
| 3619 | * init dfs channel nol |
| 3620 | */ |
| 3621 | sap_init_dfs_channel_nol_list(sap_context); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3622 | |
Peng Xu | 66162de | 2016-02-11 17:01:20 -0800 | [diff] [blame] | 3623 | /* |
| 3624 | * Issue the scan request. This scan request is |
| 3625 | * issued before the start BSS is done so |
| 3626 | * |
| 3627 | * 1. No need to pass the second parameter |
| 3628 | * as the SAP state machine is not started yet |
| 3629 | * and there is no need for any event posting. |
| 3630 | * |
| 3631 | * 2. Set third parameter to TRUE to indicate the |
| 3632 | * channel selection function to register a |
| 3633 | * different scan callback fucntion to process |
| 3634 | * the results pre start BSS. |
| 3635 | */ |
Manishekar Chandrasekaran | 1db3abe | 2016-06-24 03:27:07 +0530 | [diff] [blame] | 3636 | qdf_status = sap_goto_channel_sel(sap_context, NULL, true, false); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3637 | |
Peng Xu | 66162de | 2016-02-11 17:01:20 -0800 | [diff] [blame] | 3638 | if (QDF_STATUS_E_ABORTED == qdf_status) { |
| 3639 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3640 | "In %s,DFS not supported in the current operating mode", |
| 3641 | __func__); |
Peng Xu | 66162de | 2016-02-11 17:01:20 -0800 | [diff] [blame] | 3642 | return QDF_STATUS_E_FAILURE; |
| 3643 | } else if (QDF_STATUS_E_CANCELED == qdf_status) { |
| 3644 | /* |
| 3645 | * ERROR is returned when either the SME scan request |
| 3646 | * failed or ACS is overridden due to other constrainst |
| 3647 | * So send selected channel to HDD |
| 3648 | */ |
| 3649 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
| 3650 | FL("Scan Req Failed/ACS Overridden")); |
| 3651 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
| 3652 | FL("Selected channel = %d"), |
| 3653 | sap_context->channel); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3654 | |
Peng Xu | 66162de | 2016-02-11 17:01:20 -0800 | [diff] [blame] | 3655 | return sap_signal_hdd_event(sap_context, NULL, |
| 3656 | eSAP_ACS_CHANNEL_SELECTED, |
| 3657 | (void *) eSAP_STATUS_SUCCESS); |
| 3658 | } else if (QDF_STATUS_SUCCESS == qdf_status) { |
| 3659 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3660 | FL("Successfully Issued a Pre Start Bss Scan Request")); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3661 | } |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 3662 | return qdf_status; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3663 | } |
| 3664 | |
| 3665 | /** |
| 3666 | * wlan_sap_enable_phy_error_logs() - Enable DFS phy error logs |
| 3667 | * @hal: global hal handle |
| 3668 | * @enable_log: value to set |
| 3669 | * |
| 3670 | * Since the frequency of DFS phy error is very high, enabling logs for them |
| 3671 | * all the times can cause crash and will also create lot of useless logs |
| 3672 | * causing difficulties in debugging other issue. This function will be called |
| 3673 | * from iwpriv cmd to eanble such logs temporarily. |
| 3674 | * |
| 3675 | * Return: void |
| 3676 | */ |
| 3677 | void wlan_sap_enable_phy_error_logs(tHalHandle hal, bool enable_log) |
| 3678 | { |
| 3679 | tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal); |
| 3680 | mac_ctx->sap.enable_dfs_phy_error_logs = enable_log; |
| 3681 | } |
Kai Liu | bdd5fcb | 2016-09-28 22:55:44 +0800 | [diff] [blame] | 3682 | |
Kai Liu | bdd5fcb | 2016-09-28 22:55:44 +0800 | [diff] [blame] | 3683 | /** |
| 3684 | * wlansap_get_chan_width() - get sap channel width. |
| 3685 | * @cds_ctx: pointer of global cds context |
| 3686 | * |
| 3687 | * This function get channel width of sap. |
| 3688 | * |
| 3689 | * Return: sap channel width |
| 3690 | */ |
| 3691 | uint32_t wlansap_get_chan_width(void *cds_ctx) |
| 3692 | { |
| 3693 | ptSapContext sapcontext; |
| 3694 | |
| 3695 | sapcontext = CDS_GET_SAP_CB(cds_ctx); |
| 3696 | return wlan_sap_get_vht_ch_width(sapcontext); |
| 3697 | } |
Yingying Tang | b4832f7 | 2016-10-20 13:44:55 +0800 | [diff] [blame] | 3698 | |
| 3699 | /** |
| 3700 | * wlansap_set_tx_leakage_threshold() - set sap tx leakage threshold. |
| 3701 | * @hal: HAL pointer |
| 3702 | * @tx_leakage_threshold: sap tx leakage threshold |
| 3703 | * |
| 3704 | * This function set sap tx leakage threshold. |
| 3705 | * |
| 3706 | * Return: QDF_STATUS. |
| 3707 | */ |
| 3708 | QDF_STATUS wlansap_set_tx_leakage_threshold(tHalHandle hal, |
| 3709 | uint16_t tx_leakage_threshold) |
| 3710 | { |
| 3711 | tpAniSirGlobal mac; |
| 3712 | |
| 3713 | if (NULL == hal) { |
| 3714 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
| 3715 | "%s: Invalid hal pointer", __func__); |
| 3716 | return QDF_STATUS_E_FAULT; |
| 3717 | } |
| 3718 | |
| 3719 | mac = PMAC_STRUCT(hal); |
| 3720 | mac->sap.SapDfsInfo.tx_leakage_threshold = tx_leakage_threshold; |
| 3721 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO, |
| 3722 | "%s: leakage_threshold %d", __func__, |
| 3723 | mac->sap.SapDfsInfo.tx_leakage_threshold); |
| 3724 | return QDF_STATUS_SUCCESS; |
| 3725 | } |
Wu Gao | 3671743 | 2016-11-21 15:09:48 +0800 | [diff] [blame] | 3726 | |
| 3727 | /* |
| 3728 | * wlansap_set_invalid_session() - set session ID to invalid |
| 3729 | * @cds_ctx: pointer of global context |
| 3730 | * |
| 3731 | * This function sets session ID to invalid |
| 3732 | * |
| 3733 | * Return: QDF_STATUS |
| 3734 | */ |
| 3735 | QDF_STATUS |
| 3736 | wlansap_set_invalid_session(void *cds_ctx) |
| 3737 | { |
| 3738 | ptSapContext psapctx; |
| 3739 | |
| 3740 | psapctx = CDS_GET_SAP_CB(cds_ctx); |
| 3741 | if (NULL == psapctx) { |
| 3742 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
| 3743 | FL("Invalid SAP pointer from pctx")); |
| 3744 | return QDF_STATUS_E_FAILURE; |
| 3745 | } |
| 3746 | |
| 3747 | psapctx->sessionId = CSR_SESSION_ID_INVALID; |
Wu Gao | 3671743 | 2016-11-21 15:09:48 +0800 | [diff] [blame] | 3748 | |
| 3749 | return QDF_STATUS_SUCCESS; |
| 3750 | } |