blob: 5938221448a011e77aead0eddf76b98cae1709f4 [file] [log] [blame]
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001/*
Jiachao Wuc279f972018-01-22 15:38:33 +08002 * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003 *
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004 * Permission to use, copy, modify, and/or distribute this software for
5 * any purpose with or without fee is hereby granted, provided that the
6 * above copyright notice and this permission notice appear in all
7 * copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
10 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
11 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
12 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
13 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
14 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
15 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16 * PERFORMANCE OF THIS SOFTWARE.
17 */
18
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080019/**
20 * ===========================================================================
21 * sapModule.C
22 * OVERVIEW:
23 * This software unit holds the implementation of the WLAN SAP modules
24 * functions providing EXTERNAL APIs. It is also where the global SAP module
25 * context gets initialised
26 * DEPENDENCIES:
27 * Are listed for each API below.
28 * ===========================================================================
29 */
30
31/* $Header$ */
32
33/*----------------------------------------------------------------------------
34 * Include Files
35 * -------------------------------------------------------------------------*/
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053036#include "qdf_trace.h"
Anurag Chouhanc5548422016-02-24 18:33:27 +053037#include "qdf_util.h"
Manishekar Chandrasekaranf7a1dad2016-06-23 06:43:47 +053038#include "qdf_atomic.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080039/* Pick up the sme callback registration API */
40#include "sme_api.h"
41
42/* SAP API header file */
43
44#include "sap_internal.h"
45#include "sme_inside.h"
46#include "cds_ieee80211_common_i.h"
Naveen Rawat3b6068c2016-04-14 19:01:06 -070047#include "cds_regdomain.h"
Tushnim Bhattacharyya66348bd2017-03-09 15:02:10 -080048#include "wlan_policy_mgr_api.h"
Tushnim Bhattacharyya45ed04f2017-03-15 10:15:05 -070049#include <wlan_scan_ucfg_api.h>
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070050#include "wlan_reg_services_api.h"
Arif Hussaincd151632017-02-11 16:57:19 -080051#include <wlan_dfs_utils_api.h>
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -070052#include <wlan_reg_ucfg_api.h>
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080053
54/*----------------------------------------------------------------------------
55 * Preprocessor Definitions and Constants
56 * -------------------------------------------------------------------------*/
57#define SAP_DEBUG
58
59/*----------------------------------------------------------------------------
60 * Type Declarations
61 * -------------------------------------------------------------------------*/
62
63/*----------------------------------------------------------------------------
64 * Global Data Definitions
65 * -------------------------------------------------------------------------*/
66
67/*----------------------------------------------------------------------------
68 * External declarations for global context
69 * -------------------------------------------------------------------------*/
70/* No! Get this from CDS. */
71/* The main per-Physical Link (per WLAN association) context. */
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -070072static struct sap_context *gp_sap_ctx[SAP_MAX_NUM_SESSION];
Manishekar Chandrasekaranf7a1dad2016-06-23 06:43:47 +053073static qdf_atomic_t sap_ctx_ref_count[SAP_MAX_NUM_SESSION];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080074
75/*----------------------------------------------------------------------------
76 * Static Variable Definitions
77 * -------------------------------------------------------------------------*/
Manishekar Chandrasekaranf7a1dad2016-06-23 06:43:47 +053078static qdf_mutex_t sap_context_lock;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080079
80/*----------------------------------------------------------------------------
81 * Static Function Declarations and Definitions
82 * -------------------------------------------------------------------------*/
83
84/*----------------------------------------------------------------------------
85 * Externalized Function Definitions
86 * -------------------------------------------------------------------------*/
87
88/*----------------------------------------------------------------------------
89 * Function Declarations and Documentation
90 * -------------------------------------------------------------------------*/
91
92/**
Manishekar Chandrasekaranf7a1dad2016-06-23 06:43:47 +053093 * wlansap_global_init() - Initialize SAP globals
94 *
95 * Initializes the SAP global data structures
96 *
97 * Return: QDF_STATUS
98 */
99QDF_STATUS wlansap_global_init(void)
100{
101 uint32_t i;
102
103 if (QDF_IS_STATUS_ERROR(qdf_mutex_create(&sap_context_lock))) {
104 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
105 "failed to init sap_context_lock");
106 return QDF_STATUS_E_FAULT;
107 }
108
109 for (i = 0; i < SAP_MAX_NUM_SESSION; i++) {
110 gp_sap_ctx[i] = NULL;
111 qdf_atomic_init(&sap_ctx_ref_count[i]);
112 }
113
Srinivas Girigowda678586c2017-03-10 00:13:58 -0800114 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG,
Manishekar Chandrasekaranf7a1dad2016-06-23 06:43:47 +0530115 "%s: sap global context initialized", __func__);
116
117 return QDF_STATUS_SUCCESS;
118}
119
120/**
121 * wlansap_global_deinit() - De-initialize SAP globals
122 *
123 * De-initializes the SAP global data structures
124 *
125 * Return: QDF_STATUS
126 */
127QDF_STATUS wlansap_global_deinit(void)
128{
129 uint32_t i;
130
131 for (i = 0; i < SAP_MAX_NUM_SESSION; i++) {
132 if (gp_sap_ctx[i]) {
133 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
134 "we could be leaking context:%d", i);
135 }
136 gp_sap_ctx[i] = NULL;
137 qdf_atomic_init(&sap_ctx_ref_count[i]);
138 }
139
140 if (QDF_IS_STATUS_ERROR(qdf_mutex_destroy(&sap_context_lock))) {
141 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
142 "failed to destroy sap_context_lock");
143 return QDF_STATUS_E_FAULT;
144 }
145
Srinivas Girigowda678586c2017-03-10 00:13:58 -0800146 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG,
Manishekar Chandrasekaranf7a1dad2016-06-23 06:43:47 +0530147 "%s: sap global context deinitialized", __func__);
148
149 return QDF_STATUS_SUCCESS;
150}
151
152/**
153 * wlansap_save_context() - Save the context in global SAP context
154 * @ctx: SAP context to be stored
155 *
156 * Stores the given SAP context in the global SAP context array
157 *
158 * Return: QDF_STATUS
159 */
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -0700160static QDF_STATUS wlansap_save_context(struct sap_context *ctx)
Manishekar Chandrasekaranf7a1dad2016-06-23 06:43:47 +0530161{
162 uint32_t i;
163
164 qdf_mutex_acquire(&sap_context_lock);
165 for (i = 0; i < SAP_MAX_NUM_SESSION; i++) {
166 if (gp_sap_ctx[i] == NULL) {
167 gp_sap_ctx[i] = ctx;
168 qdf_atomic_inc(&sap_ctx_ref_count[i]);
169 qdf_mutex_release(&sap_context_lock);
Srinivas Girigowda678586c2017-03-10 00:13:58 -0800170 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG,
171 "%s: sap context saved at index: %d",
Manishekar Chandrasekaranf7a1dad2016-06-23 06:43:47 +0530172 __func__, i);
173 return QDF_STATUS_SUCCESS;
174 }
175 }
176 qdf_mutex_release(&sap_context_lock);
177
178 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
179 "%s: failed to save sap context", __func__);
180
181 return QDF_STATUS_E_FAILURE;
182}
183
184/**
185 * wlansap_context_get() - Verify SAP context and increment ref count
186 * @ctx: Context to be checked
187 *
188 * Verifies the SAP context and increments the reference count maintained for
189 * the corresponding SAP context.
190 *
191 * Return: QDF_STATUS
192 */
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -0700193QDF_STATUS wlansap_context_get(struct sap_context *ctx)
Manishekar Chandrasekaranf7a1dad2016-06-23 06:43:47 +0530194{
195 uint32_t i;
196
197 qdf_mutex_acquire(&sap_context_lock);
198 for (i = 0; i < SAP_MAX_NUM_SESSION; i++) {
199 if (ctx && (gp_sap_ctx[i] == ctx)) {
200 qdf_atomic_inc(&sap_ctx_ref_count[i]);
201 qdf_mutex_release(&sap_context_lock);
202 return QDF_STATUS_SUCCESS;
203 }
204 }
205 qdf_mutex_release(&sap_context_lock);
206
Kiran Kumar Lokere94712212017-10-10 18:06:58 -0700207 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG,
Manishekar Chandrasekaranf7a1dad2016-06-23 06:43:47 +0530208 "%s: sap session is not valid", __func__);
209 return QDF_STATUS_E_FAILURE;
210}
211
212/**
213 * wlansap_context_put() - Check the reference count and free SAP context
214 * @ctx: SAP context to be checked and freed
215 *
216 * Checks the reference count and frees the SAP context
217 *
218 * Return: None
219 */
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -0700220void wlansap_context_put(struct sap_context *ctx)
Manishekar Chandrasekaranf7a1dad2016-06-23 06:43:47 +0530221{
222 uint32_t i;
223
224 if (!ctx)
225 return;
226
227 qdf_mutex_acquire(&sap_context_lock);
228 for (i = 0; i < SAP_MAX_NUM_SESSION; i++) {
229 if (gp_sap_ctx[i] == ctx) {
230 if (qdf_atomic_dec_and_test(&sap_ctx_ref_count[i])) {
gaurank kathpaliae4a628f2018-06-12 12:01:50 +0530231 if (ctx->channelList) {
232 qdf_mem_free(ctx->channelList);
233 ctx->channelList = NULL;
234 ctx->num_of_channel = 0;
235 }
Manishekar Chandrasekaranf7a1dad2016-06-23 06:43:47 +0530236 qdf_mem_free(ctx);
237 gp_sap_ctx[i] = NULL;
238 QDF_TRACE(QDF_MODULE_ID_SAP,
Srinivas Girigowda678586c2017-03-10 00:13:58 -0800239 QDF_TRACE_LEVEL_DEBUG,
Manishekar Chandrasekaranf7a1dad2016-06-23 06:43:47 +0530240 "%s: sap session freed: %d",
241 __func__, i);
242 }
243 qdf_mutex_release(&sap_context_lock);
244 return;
245 }
246 }
247 qdf_mutex_release(&sap_context_lock);
248}
249
Krunal Soni59437652017-11-21 13:42:14 -0800250struct sap_context *sap_create_ctx(void)
Ryan Hsu4252a2f2016-01-05 11:18:24 -0800251{
Jeff Johnsone13d8062017-09-28 06:54:55 -0700252 struct sap_context *sap_ctx;
Manishekar Chandrasekaranf7a1dad2016-06-23 06:43:47 +0530253 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800254
Ryan Hsu4252a2f2016-01-05 11:18:24 -0800255 /* dynamically allocate the sapContext */
Jeff Johnsone13d8062017-09-28 06:54:55 -0700256 sap_ctx = qdf_mem_malloc(sizeof(*sap_ctx));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800257
Jeff Johnsone13d8062017-09-28 06:54:55 -0700258 if (NULL == sap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530259 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800260 "%s: Invalid SAP pointer from p_cds_gctx", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800261 return NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800262 }
263
Ryan Hsu4252a2f2016-01-05 11:18:24 -0800264 /* Clean up SAP control block, initialize all values */
Krunal Soni074dd2c2017-04-14 14:57:34 -0700265 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG, FL("Enter"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800266
Manishekar Chandrasekaranf7a1dad2016-06-23 06:43:47 +0530267 /* Save the SAP context pointer */
Jeff Johnsone13d8062017-09-28 06:54:55 -0700268 status = wlansap_save_context(sap_ctx);
Manishekar Chandrasekaranf7a1dad2016-06-23 06:43:47 +0530269 if (QDF_IS_STATUS_ERROR(status)) {
270 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
271 "%s: failed to save SAP context", __func__);
Jeff Johnsone13d8062017-09-28 06:54:55 -0700272 qdf_mem_free(sap_ctx);
Manishekar Chandrasekaranf7a1dad2016-06-23 06:43:47 +0530273 return NULL;
274 }
Krunal Soni074dd2c2017-04-14 14:57:34 -0700275 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG, FL("Exit"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800276
Jeff Johnsone13d8062017-09-28 06:54:55 -0700277 return sap_ctx;
Krunal Soni59437652017-11-21 13:42:14 -0800278} /* sap_create_ctx */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800279
Krunal Soni59437652017-11-21 13:42:14 -0800280QDF_STATUS sap_init_ctx(struct sap_context *sap_ctx,
Jeff Johnsonc1e62782017-11-09 09:50:17 -0800281 enum QDF_OPMODE mode,
Dustin Brownd28772b2017-03-17 14:16:07 -0700282 uint8_t *addr, uint32_t session_id)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800283{
Peng Xu66162de2016-02-11 17:01:20 -0800284 QDF_STATUS qdf_ret_status;
285 tHalHandle hal;
Sandeep Puligilla0806e0f2017-03-06 19:25:47 -0800286 tpAniSirGlobal pmac;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800287
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530288 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800289 "wlansap_start invoked successfully");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800290
Jeff Johnsone13d8062017-09-28 06:54:55 -0700291 if (NULL == sap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530292 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Jeff Johnsond8b60572017-09-15 11:25:05 -0700293 "%s: Invalid SAP pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530294 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800295 }
296
297 /*------------------------------------------------------------------------
298 For now, presume security is not enabled.
299 -----------------------------------------------------------------------*/
Jeff Johnsone13d8062017-09-28 06:54:55 -0700300 sap_ctx->ucSecEnabled = WLANSAP_SECURITY_ENABLED_STATE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800301
302 /*------------------------------------------------------------------------
303 Now configure the roaming profile links. To SSID and bssid.
304 ------------------------------------------------------------------------*/
305 /* We have room for two SSIDs. */
Jeff Johnsone13d8062017-09-28 06:54:55 -0700306 sap_ctx->csr_roamProfile.SSIDs.numOfSSIDs = 1; /* This is true for now. */
307 sap_ctx->csr_roamProfile.SSIDs.SSIDList = sap_ctx->SSIDList; /* Array of two */
308 sap_ctx->csr_roamProfile.SSIDs.SSIDList[0].SSID.length = 0;
309 sap_ctx->csr_roamProfile.SSIDs.SSIDList[0].handoffPermitted = false;
310 sap_ctx->csr_roamProfile.SSIDs.SSIDList[0].ssidHidden =
311 sap_ctx->SSIDList[0].ssidHidden;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800312
Jeff Johnsone13d8062017-09-28 06:54:55 -0700313 sap_ctx->csr_roamProfile.BSSIDs.numOfBSSIDs = 1; /* This is true for now. */
314 sap_ctx->csr_roamProfile.BSSIDs.bssid = &sap_ctx->bssid;
315 sap_ctx->csr_roamProfile.csrPersona = mode;
316 qdf_mem_copy(sap_ctx->self_mac_addr, addr, QDF_MAC_ADDR_SIZE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800317
318 /* Now configure the auth type in the roaming profile. To open. */
Jeff Johnsone13d8062017-09-28 06:54:55 -0700319 sap_ctx->csr_roamProfile.negotiatedAuthType = eCSR_AUTH_TYPE_OPEN_SYSTEM; /* open is the default */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800320
Jeff Johnsonc0db3842017-09-13 18:34:28 -0700321 hal = (tHalHandle) CDS_GET_HAL_CB();
Chandrasekaran, Manishekard3cb4772016-02-22 22:21:10 +0530322 if (!hal) {
323 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
324 "%s: Invalid HAL pointer", __func__);
325 return QDF_STATUS_E_INVAL;
326 }
Sandeep Puligilla0806e0f2017-03-06 19:25:47 -0800327 pmac = PMAC_STRUCT(hal);
Jeff Johnsone13d8062017-09-28 06:54:55 -0700328 qdf_ret_status = sap_set_session_param(hal, sap_ctx, session_id);
Krunal Sonib01de792017-04-14 11:44:39 -0700329 if (QDF_STATUS_SUCCESS != qdf_ret_status) {
330 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
331 "In %s calling sap_set_session_param status = %d",
332 __func__, qdf_ret_status);
333 return QDF_STATUS_E_FAILURE;
334 }
Sandeep Puligilla0806e0f2017-03-06 19:25:47 -0800335 /* Register with scan component */
Jeff Johnsone13d8062017-09-28 06:54:55 -0700336 sap_ctx->req_id = ucfg_scan_register_requester(pmac->psoc, "SAP",
337 sap_scan_event_callback, sap_ctx);
Sandeep Puligilla994f6202017-06-19 18:29:05 -0700338
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530339 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800340}
341
Krunal Soni59437652017-11-21 13:42:14 -0800342QDF_STATUS sap_deinit_ctx(struct sap_context *sap_ctx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800343{
Krunal Soni074dd2c2017-04-14 14:57:34 -0700344 tHalHandle hal;
Sandeep Puligilla0806e0f2017-03-06 19:25:47 -0800345 tpAniSirGlobal pmac;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800346
Ryan Hsu4252a2f2016-01-05 11:18:24 -0800347 /* Sanity check - Extract SAP control block */
Krunal Soni074dd2c2017-04-14 14:57:34 -0700348 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800349 "wlansap_stop invoked successfully ");
350
Jeff Johnsone13d8062017-09-28 06:54:55 -0700351 if (NULL == sap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530352 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Jeff Johnson3d4c7102017-09-15 11:36:19 -0700353 "%s: Invalid SAP pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530354 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800355 }
Jeff Johnsonc0db3842017-09-13 18:34:28 -0700356 hal = CDS_GET_HAL_CB();
Krunal Soni074dd2c2017-04-14 14:57:34 -0700357 pmac = (tpAniSirGlobal) hal;
Sandeep Puligilla0806e0f2017-03-06 19:25:47 -0800358 if (NULL == pmac) {
Krunal Soni074dd2c2017-04-14 14:57:34 -0700359 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Jeff Johnson3d4c7102017-09-15 11:36:19 -0700360 "%s: Invalid MAC context", __func__);
Sandeep Puligilla0806e0f2017-03-06 19:25:47 -0800361 return QDF_STATUS_E_FAULT;
362 }
Jeff Johnsone13d8062017-09-28 06:54:55 -0700363 ucfg_scan_unregister_requester(pmac->psoc, sap_ctx->req_id);
364 sap_free_roam_profile(&sap_ctx->csr_roamProfile);
Krunal Sonif6a367b2017-10-31 11:38:57 -0700365 if (sap_ctx->sessionId != CSR_SESSION_ID_INVALID) {
366 /* empty queues/lists/pkts if any */
367 sap_clear_session_param(hal, sap_ctx, sap_ctx->sessionId);
368 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800369
Jiachao Wub8f89212018-05-24 15:43:59 +0800370 if (sap_ctx->channelList) {
371 qdf_mem_free(sap_ctx->channelList);
372 sap_ctx->channelList = NULL;
373 sap_ctx->num_of_channel = 0;
374 }
375
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530376 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800377}
378
Krunal Soni59437652017-11-21 13:42:14 -0800379QDF_STATUS sap_destroy_ctx(struct sap_context *sap_ctx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800380{
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530381 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Krunal Sonib5d18ae2017-11-20 21:52:35 -0800382 "sap_destroy_ctx invoked");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800383
Jeff Johnsone13d8062017-09-28 06:54:55 -0700384 if (NULL == sap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530385 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Jeff Johnson70955b52017-09-25 09:19:33 -0700386 "%s: Invalid SAP pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530387 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800388 }
Ryan Hsu4252a2f2016-01-05 11:18:24 -0800389 /* Cleanup SAP control block */
Krunal Soni074dd2c2017-04-14 14:57:34 -0700390 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG, FL("Enter"));
Krunal Soni074dd2c2017-04-14 14:57:34 -0700391 /*
Jeff Johnsone13d8062017-09-28 06:54:55 -0700392 * wlansap_context_put will release actual sap_ctx memory
Krunal Soni59437652017-11-21 13:42:14 -0800393 * allocated during sap_create_ctx
Krunal Soni074dd2c2017-04-14 14:57:34 -0700394 */
Jeff Johnsone13d8062017-09-28 06:54:55 -0700395 wlansap_context_put(sap_ctx);
Krunal Soni074dd2c2017-04-14 14:57:34 -0700396 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG, FL("Exit"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800397
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530398 return QDF_STATUS_SUCCESS;
Krunal Sonib5d18ae2017-11-20 21:52:35 -0800399} /* sap_destroy_ctx */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800400
Jeff Johnsone13d8062017-09-28 06:54:55 -0700401bool wlansap_is_channel_in_nol_list(struct sap_context *sap_ctx,
Kapil Gupta94ca6f62016-12-11 18:43:12 +0530402 uint8_t channelNumber,
403 ePhyChanBondState chanBondState)
404{
Jeff Johnsone13d8062017-09-28 06:54:55 -0700405 if (!sap_ctx) {
Kapil Gupta94ca6f62016-12-11 18:43:12 +0530406 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
407 "%s: Invalid SAP pointer from pCtx", __func__);
408 return QDF_STATUS_E_FAULT;
409 }
410
Jeff Johnsone13d8062017-09-28 06:54:55 -0700411 return sap_dfs_is_channel_in_nol_list(sap_ctx, channelNumber,
Kapil Gupta94ca6f62016-12-11 18:43:12 +0530412 chanBondState);
413}
414
bings1826d9c2018-01-23 16:14:01 +0800415static QDF_STATUS wlansap_mark_leaking_channel(struct wlan_objmgr_pdev *pdev,
Kapil Gupta94ca6f62016-12-11 18:43:12 +0530416 uint8_t *leakage_adjusted_lst,
417 uint8_t chan_bw)
418{
419
bings1826d9c2018-01-23 16:14:01 +0800420 return utils_dfs_mark_leaking_ch(pdev, chan_bw, 1,
Kapil Gupta94ca6f62016-12-11 18:43:12 +0530421 leakage_adjusted_lst);
422}
Kapil Gupta94ca6f62016-12-11 18:43:12 +0530423
Jeff Johnson2f6013c2017-09-24 19:40:07 -0700424bool wlansap_is_channel_leaking_in_nol(struct sap_context *sap_ctx,
425 uint8_t channel,
426 uint8_t chan_bw)
Kapil Gupta94ca6f62016-12-11 18:43:12 +0530427{
Kapil Gupta94ca6f62016-12-11 18:43:12 +0530428 tpAniSirGlobal mac_ctx;
429 uint8_t leakage_adjusted_lst[1];
430 void *handle = NULL;
Kapil Gupta94ca6f62016-12-11 18:43:12 +0530431
432 leakage_adjusted_lst[0] = channel;
Jeff Johnsonc0db3842017-09-13 18:34:28 -0700433 handle = CDS_GET_HAL_CB();
Kapil Gupta94ca6f62016-12-11 18:43:12 +0530434 mac_ctx = PMAC_STRUCT(handle);
435 if (!mac_ctx) {
436 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
437 "%s: Invalid mac pointer", __func__);
438 return QDF_STATUS_E_FAULT;
439 }
bings1826d9c2018-01-23 16:14:01 +0800440 if (QDF_IS_STATUS_ERROR(wlansap_mark_leaking_channel(mac_ctx->pdev,
441 leakage_adjusted_lst, chan_bw)))
Kapil Gupta94ca6f62016-12-11 18:43:12 +0530442 return true;
bings1826d9c2018-01-23 16:14:01 +0800443
444 if (!leakage_adjusted_lst[0])
Kapil Gupta94ca6f62016-12-11 18:43:12 +0530445 return true;
bings1826d9c2018-01-23 16:14:01 +0800446
Kapil Gupta94ca6f62016-12-11 18:43:12 +0530447 return false;
448}
449
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800450#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
Jeff Johnsone13d8062017-09-28 06:54:55 -0700451uint16_t wlansap_check_cc_intf(struct sap_context *sap_ctx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800452{
453 tHalHandle hHal;
454 uint16_t intf_ch;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800455
Jeff Johnsonc0db3842017-09-13 18:34:28 -0700456 hHal = (tHalHandle) CDS_GET_HAL_CB();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800457 if (NULL == hHal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530458 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800459 "%s: Invalid MAC context from p_cds_gctx", __func__);
460 return 0;
461 }
Rachit Kankane11ac4bc2017-09-18 19:58:07 +0530462 intf_ch = sme_check_concurrent_channel_overlap(hHal, sap_ctx->channel,
463 sap_ctx->csr_roamProfile.phyMode,
Jeff Johnsone13d8062017-09-28 06:54:55 -0700464 sap_ctx->cc_switch_mode);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800465 return intf_ch;
466}
467#endif
468
469 /**
470 * wlansap_set_scan_acs_channel_params() - Config scan and channel parameters.
471 * pconfig: Pointer to the SAP config
472 * psap_ctx: Pointer to the SAP Context.
473 * pusr_context: Parameter that will be passed
474 * back in all the SAP callback events.
475 *
476 * This api function is used to copy Scan and Channel parameters from sap
477 * config to sap context.
478 *
479 * Return: The result code associated with
480 * performing the operation
481 */
Jeff Johnson464f7ea2016-10-07 10:21:26 -0700482static QDF_STATUS
Jeff Johnsone4c11db2018-05-05 23:22:32 -0700483wlansap_set_scan_acs_channel_params(tsap_config_t *pconfig,
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -0700484 struct sap_context *psap_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800485 void *pusr_context)
486{
487 tHalHandle h_hal = NULL;
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -0700488 tpAniSirGlobal pmac;
489 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800490
491 if (NULL == pconfig) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530492 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800493 "%s: Invalid pconfig passed ", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530494 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800495 }
496
497 if (NULL == psap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530498 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800499 "%s: Invalid pconfig passed ", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530500 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800501 }
502
503 /* Channel selection is auto or configured */
504 psap_ctx->channel = pconfig->channel;
Agrawal Ashish65634612016-08-18 13:24:32 +0530505 psap_ctx->dfs_mode = pconfig->acs_dfs_mode;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800506#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
507 psap_ctx->cc_switch_mode = pconfig->cc_switch_mode;
508#endif
gaoleze5108942017-03-31 16:56:42 +0800509 psap_ctx->auto_channel_select_weight =
510 pconfig->auto_channel_select_weight;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800511 psap_ctx->pUsrContext = pusr_context;
512 psap_ctx->enableOverLapCh = pconfig->enOverLapCh;
513 psap_ctx->acs_cfg = &pconfig->acs_cfg;
514 psap_ctx->ch_width_orig = pconfig->acs_cfg.ch_width;
515 psap_ctx->secondary_ch = pconfig->sec_ch;
516
517 /*
518 * Set the BSSID to your "self MAC Addr" read
519 * the mac address from Configuation ITEM received
520 * from HDD
521 */
522 psap_ctx->csr_roamProfile.BSSIDs.numOfBSSIDs = 1;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800523
Peng Xuf5d60c82015-10-02 17:17:03 -0700524 /* Save a copy to SAP context */
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530525 qdf_mem_copy(psap_ctx->csr_roamProfile.BSSIDs.bssid,
Anurag Chouhan6d760662016-02-20 16:05:43 +0530526 pconfig->self_macaddr.bytes, QDF_MAC_ADDR_SIZE);
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530527 qdf_mem_copy(psap_ctx->self_mac_addr,
Anurag Chouhan6d760662016-02-20 16:05:43 +0530528 pconfig->self_macaddr.bytes, QDF_MAC_ADDR_SIZE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800529
Jeff Johnsonc0db3842017-09-13 18:34:28 -0700530 h_hal = (tHalHandle)CDS_GET_HAL_CB();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800531 if (NULL == h_hal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530532 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800533 "%s: Invalid MAC context from pvosGCtx", __func__);
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -0700534 return QDF_STATUS_E_FAULT;
535 }
536 pmac = PMAC_STRUCT(h_hal);
537 /*
538 * If concurrent session is running that is already associated
539 * then we just follow that sessions country info (whether
540 * present or not doesn't maater as we have to follow whatever
541 * STA session does)
542 */
543 if ((0 == sme_get_concurrent_operation_channel(h_hal)) &&
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800544 pconfig->ieee80211d) {
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -0700545 /* Setting the region/country information */
546 status = ucfg_reg_set_country(pmac->pdev,
547 pconfig->countryCode);
548 if (QDF_IS_STATUS_ERROR(status))
549 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
550 FL("Failed to set country"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800551 }
552
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -0700553 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800554}
bings58ce8622017-07-10 15:55:36 +0800555
Nachiket Kukaded9152832017-10-16 16:18:22 +0530556/**
557 * wlan_sap_get_roam_profile() - Returns sap roam profile.
558 * @sap_ctx: Pointer to Sap Context.
559 *
560 * This function provides the SAP roam profile.
561 *
562 * Return: SAP RoamProfile
563 */
Jeff Johnson66ee8a92018-03-17 15:24:26 -0700564struct csr_roam_profile *wlan_sap_get_roam_profile(struct sap_context *sap_ctx)
Nachiket Kukaded9152832017-10-16 16:18:22 +0530565{
566 if (!sap_ctx) {
567 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
568 FL("Invalid SAP pointer from ctx"));
569 return NULL;
570 }
571 return &sap_ctx->csr_roamProfile;
572}
573
Jeff Johnsonebb7f0a2017-09-24 20:00:13 -0700574eCsrPhyMode wlan_sap_get_phymode(struct sap_context *sap_ctx)
bings58ce8622017-07-10 15:55:36 +0800575{
bings58ce8622017-07-10 15:55:36 +0800576 if (!sap_ctx) {
577 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
578 FL("Invalid SAP pointer from ctx"));
579 return 0;
580 }
581 return sap_ctx->csr_roamProfile.phyMode;
582}
583
Jeff Johnsonee7a3932017-09-24 20:17:55 -0700584uint32_t wlan_sap_get_vht_ch_width(struct sap_context *sap_ctx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800585{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800586 if (!sap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530587 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Jeff Johnsonee7a3932017-09-24 20:17:55 -0700588 FL("Invalid SAP pointer"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800589 return 0;
590 }
591
592 return sap_ctx->ch_params.ch_width;
593}
594
Jeff Johnson2de14da2017-09-24 20:23:37 -0700595void wlan_sap_set_vht_ch_width(struct sap_context *sap_ctx,
596 uint32_t vht_channel_width)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800597{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800598 if (!sap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530599 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Jeff Johnson2de14da2017-09-24 20:23:37 -0700600 FL("Invalid SAP pointer"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800601 return;
602 }
603
604 sap_ctx->ch_params.ch_width = vht_channel_width;
605}
606
607/**
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +0530608 * wlan_sap_validate_channel_switch() - validate target channel switch w.r.t
609 * concurreny rules set to avoid channel interference.
610 * @hal - Hal context
611 * @sap_ch - channel to switch
612 * @sap_context - sap session context
613 *
614 * Return: true if there is no channel interference else return false
615 */
616#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
617static bool wlan_sap_validate_channel_switch(tHalHandle hal, uint16_t sap_ch,
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -0700618 struct sap_context *sap_context)
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +0530619{
620 return sme_validate_sap_channel_switch(
Manikandan Mohan22b83722015-12-15 15:03:23 -0800621 hal,
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +0530622 sap_ch,
623 sap_context->csr_roamProfile.phyMode,
624 sap_context->cc_switch_mode,
625 sap_context->sessionId);
626}
627#else
628static inline bool wlan_sap_validate_channel_switch(tHalHandle hal,
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -0700629 uint16_t sap_ch, struct sap_context *sap_context)
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +0530630{
631 return true;
632}
633#endif
Himanshu Agarwal33163982018-05-17 18:11:10 +0530634
635void wlan_sap_set_sap_ctx_acs_cfg(struct sap_context *sap_ctx,
636 tsap_config_t *sap_config)
637{
638 if (!sap_ctx) {
639 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
640 "%s: Invalid SAP pointer",
641 __func__);
642 return;
643 }
644
645 sap_ctx->acs_cfg = &sap_config->acs_cfg;
646}
647
Jeff Johnsone13d8062017-09-28 06:54:55 -0700648QDF_STATUS wlansap_start_bss(struct sap_context *sap_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800649 tpWLAN_SAPEventCB pSapEventCallback,
Jeff Johnsone4c11db2018-05-05 23:22:32 -0700650 tsap_config_t *pConfig, void *pUsrContext)
Jeff Johnsone2f7d542017-09-24 20:52:24 -0700651{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800652 tWLAN_SAPEvent sapEvent; /* State machine event */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530653 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800654 tHalHandle hHal;
655 tpAniSirGlobal pmac = NULL;
656
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530657 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Jeff Johnsone13d8062017-09-28 06:54:55 -0700658 "wlansap_start_bss: sapContext=%pK", sap_ctx);
Peng Xuf5d60c82015-10-02 17:17:03 -0700659
Jeff Johnsone13d8062017-09-28 06:54:55 -0700660 if (NULL == sap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530661 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Jeff Johnsone2f7d542017-09-24 20:52:24 -0700662 "%s: Invalid SAP pointer",
Peng Xuf5d60c82015-10-02 17:17:03 -0700663 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530664 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800665 }
Rajeev Kumar Sirasanagandla301aacb2018-08-07 15:48:18 +0530666 sap_ctx->fsm_state = SAP_INIT;
Peng Xuf5d60c82015-10-02 17:17:03 -0700667
668 /* Channel selection is auto or configured */
Jeff Johnsone13d8062017-09-28 06:54:55 -0700669 sap_ctx->channel = pConfig->channel;
670 sap_ctx->dfs_mode = pConfig->acs_dfs_mode;
671 sap_ctx->ch_params.ch_width = pConfig->ch_params.ch_width;
672 sap_ctx->ch_params.center_freq_seg0 =
Peng Xuf5d60c82015-10-02 17:17:03 -0700673 pConfig->ch_params.center_freq_seg0;
Jeff Johnsone13d8062017-09-28 06:54:55 -0700674 sap_ctx->ch_params.center_freq_seg1 =
Peng Xuf5d60c82015-10-02 17:17:03 -0700675 pConfig->ch_params.center_freq_seg1;
Jeff Johnsone13d8062017-09-28 06:54:55 -0700676 sap_ctx->ch_params.sec_ch_offset =
Peng Xuf5d60c82015-10-02 17:17:03 -0700677 pConfig->ch_params.sec_ch_offset;
Jeff Johnsone13d8062017-09-28 06:54:55 -0700678 sap_ctx->ch_width_orig = pConfig->ch_width_orig;
Peng Xuf5d60c82015-10-02 17:17:03 -0700679#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
Jeff Johnsone13d8062017-09-28 06:54:55 -0700680 sap_ctx->cc_switch_mode = pConfig->cc_switch_mode;
Peng Xuf5d60c82015-10-02 17:17:03 -0700681#endif
Jeff Johnsone13d8062017-09-28 06:54:55 -0700682 sap_ctx->auto_channel_select_weight =
gaoleze5108942017-03-31 16:56:42 +0800683 pConfig->auto_channel_select_weight;
Jeff Johnsone13d8062017-09-28 06:54:55 -0700684 sap_ctx->pUsrContext = pUsrContext;
685 sap_ctx->enableOverLapCh = pConfig->enOverLapCh;
686 sap_ctx->acs_cfg = &pConfig->acs_cfg;
hqu8f11faa2018-04-27 20:57:05 +0800687 sap_ctx->secondary_ch = pConfig->sec_ch;
Jeff Johnsone13d8062017-09-28 06:54:55 -0700688 sap_ctx->dfs_cac_offload = pConfig->dfs_cac_offload;
689 sap_ctx->isCacEndNotified = false;
Sandeep Puligilla20aa0c72017-10-30 12:24:06 -0700690 sap_ctx->is_chan_change_inprogress = false;
Vignesh Viswanathan200f5c12018-02-27 14:01:59 +0530691 sap_ctx->stop_bss_in_progress = false;
Peng Xuf5d60c82015-10-02 17:17:03 -0700692 /* Set the BSSID to your "self MAC Addr" read the mac address
693 from Configuation ITEM received from HDD */
Jeff Johnsone13d8062017-09-28 06:54:55 -0700694 sap_ctx->csr_roamProfile.BSSIDs.numOfBSSIDs = 1;
695 qdf_mem_copy(sap_ctx->csr_roamProfile.BSSIDs.bssid,
696 sap_ctx->self_mac_addr, sizeof(struct qdf_mac_addr));
Peng Xuf5d60c82015-10-02 17:17:03 -0700697
698 /* Save a copy to SAP context */
Jeff Johnsone13d8062017-09-28 06:54:55 -0700699 qdf_mem_copy(sap_ctx->csr_roamProfile.BSSIDs.bssid,
Anurag Chouhan6d760662016-02-20 16:05:43 +0530700 pConfig->self_macaddr.bytes, QDF_MAC_ADDR_SIZE);
Jeff Johnsone13d8062017-09-28 06:54:55 -0700701 qdf_mem_copy(sap_ctx->self_mac_addr,
Anurag Chouhan6d760662016-02-20 16:05:43 +0530702 pConfig->self_macaddr.bytes, QDF_MAC_ADDR_SIZE);
Peng Xuf5d60c82015-10-02 17:17:03 -0700703
704 /* copy the configuration items to csrProfile */
705 sapconvert_to_csr_profile(pConfig, eCSR_BSS_TYPE_INFRA_AP,
Jeff Johnsone13d8062017-09-28 06:54:55 -0700706 &sap_ctx->csr_roamProfile);
Jeff Johnsonc0db3842017-09-13 18:34:28 -0700707 hHal = (tHalHandle) CDS_GET_HAL_CB();
Peng Xuf5d60c82015-10-02 17:17:03 -0700708 if (NULL == hHal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530709 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Peng Xuf5d60c82015-10-02 17:17:03 -0700710 "%s: Invalid MAC context from p_cds_gctx",
711 __func__);
Manikandan Mohan3dad1a42017-06-14 10:50:18 -0700712 qdf_status = QDF_STATUS_E_FAULT;
713 goto fail;
Peng Xuf5d60c82015-10-02 17:17:03 -0700714 }
Peng Xuf5d60c82015-10-02 17:17:03 -0700715 pmac = PMAC_STRUCT(hHal);
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -0700716 /* If concurrent session is running that is already associated
717 * then we just follow that sessions country info (whether
718 * present or not doesn't maater as we have to follow whatever
719 * STA session does) */
720 if ((0 == sme_get_concurrent_operation_channel(hHal)) &&
721 pConfig->ieee80211d) {
722 /* Setting the region/country information */
723 qdf_status = ucfg_reg_set_country(pmac->pdev,
724 pConfig->countryCode);
725 if (QDF_IS_STATUS_ERROR(qdf_status))
726 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
727 FL("Failed to set country"));
728 }
729
Peng Xuf5d60c82015-10-02 17:17:03 -0700730 /*
731 * Copy the DFS Test Mode setting to pmac for
732 * access in lower layers
733 */
734 pmac->sap.SapDfsInfo.disable_dfs_ch_switch =
735 pConfig->disableDFSChSwitch;
gaoleze2920bd2017-03-21 17:38:42 +0800736 pmac->sap.SapDfsInfo.sap_ch_switch_beacon_cnt =
737 pConfig->sap_chanswitch_beacon_cnt;
gaolez76d2a162017-03-21 19:23:58 +0800738 pmac->sap.SapDfsInfo.sap_ch_switch_mode =
739 pConfig->sap_chanswitch_mode;
gaoleze2920bd2017-03-21 17:38:42 +0800740
Zhu Jianminc147a542018-05-21 13:15:40 +0800741 pmac->sap.sapCtxList[sap_ctx->sessionId].sap_context = sap_ctx;
Jeff Johnsone13d8062017-09-28 06:54:55 -0700742 pmac->sap.sapCtxList[sap_ctx->sessionId].sapPersona =
743 sap_ctx->csr_roamProfile.csrPersona;
744 pmac->sap.sapCtxList[sap_ctx->sessionId].sessionID =
745 sap_ctx->sessionId;
lifeng1c16b6b2017-09-25 13:59:55 +0800746 pmac->sap.SapDfsInfo.dfs_beacon_tx_enhanced =
747 pConfig->dfs_beacon_tx_enhanced;
lifeng7c607dd2017-02-21 21:16:49 +0800748 pmac->sap.SapDfsInfo.reduced_beacon_interval =
749 pConfig->reduced_beacon_interval;
Peng Xuf5d60c82015-10-02 17:17:03 -0700750
751 /* Copy MAC filtering settings to sap context */
Jeff Johnsone13d8062017-09-28 06:54:55 -0700752 sap_ctx->eSapMacAddrAclMode = pConfig->SapMacaddr_acl;
753 qdf_mem_copy(sap_ctx->acceptMacList, pConfig->accept_mac,
Peng Xuf5d60c82015-10-02 17:17:03 -0700754 sizeof(pConfig->accept_mac));
Jeff Johnsone13d8062017-09-28 06:54:55 -0700755 sap_ctx->nAcceptMac = pConfig->num_accept_mac;
756 sap_sort_mac_list(sap_ctx->acceptMacList, sap_ctx->nAcceptMac);
757 qdf_mem_copy(sap_ctx->denyMacList, pConfig->deny_mac,
Peng Xuf5d60c82015-10-02 17:17:03 -0700758 sizeof(pConfig->deny_mac));
Jeff Johnsone13d8062017-09-28 06:54:55 -0700759 sap_ctx->nDenyMac = pConfig->num_deny_mac;
760 sap_sort_mac_list(sap_ctx->denyMacList, sap_ctx->nDenyMac);
761 sap_ctx->beacon_tx_rate = pConfig->beacon_tx_rate;
Jiachao Wu712d4fd2017-08-23 16:52:34 +0800762
Peng Xuf5d60c82015-10-02 17:17:03 -0700763 /* Fill in the event structure for FSM */
764 sapEvent.event = eSAP_HDD_START_INFRA_BSS;
765 sapEvent.params = 0; /* pSapPhysLinkCreate */
766
767 /* Store the HDD callback in SAP context */
Jeff Johnsone13d8062017-09-28 06:54:55 -0700768 sap_ctx->pfnSapEventCallback = pSapEventCallback;
Peng Xuf5d60c82015-10-02 17:17:03 -0700769
770 /* Handle event */
Jeff Johnsone13d8062017-09-28 06:54:55 -0700771 qdf_status = sap_fsm(sap_ctx, &sapEvent);
Manikandan Mohan3dad1a42017-06-14 10:50:18 -0700772fail:
773 if (QDF_IS_STATUS_ERROR(qdf_status))
Jeff Johnsone13d8062017-09-28 06:54:55 -0700774 sap_free_roam_profile(&sap_ctx->csr_roamProfile);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800775
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530776 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800777} /* wlansap_start_bss */
778
Jeff Johnsone13d8062017-09-28 06:54:55 -0700779QDF_STATUS wlansap_set_mac_acl(struct sap_context *sap_ctx,
Jeff Johnsone4c11db2018-05-05 23:22:32 -0700780 tsap_config_t *pConfig)
Jeff Johnson65dd6d92017-09-24 21:12:49 -0700781{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530782 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800783
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530784 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800785 "wlansap_set_mac_acl");
786
Jeff Johnsone13d8062017-09-28 06:54:55 -0700787 if (NULL == sap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530788 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Jeff Johnson65dd6d92017-09-24 21:12:49 -0700789 "%s: Invalid SAP pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530790 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800791 }
Peng Xuf5d60c82015-10-02 17:17:03 -0700792 /* Copy MAC filtering settings to sap context */
Jeff Johnsone13d8062017-09-28 06:54:55 -0700793 sap_ctx->eSapMacAddrAclMode = pConfig->SapMacaddr_acl;
Peng Xuf5d60c82015-10-02 17:17:03 -0700794
Jeff Johnsone13d8062017-09-28 06:54:55 -0700795 if (eSAP_DENY_UNLESS_ACCEPTED == sap_ctx->eSapMacAddrAclMode) {
796 qdf_mem_copy(sap_ctx->acceptMacList,
Peng Xuf5d60c82015-10-02 17:17:03 -0700797 pConfig->accept_mac,
798 sizeof(pConfig->accept_mac));
Jeff Johnsone13d8062017-09-28 06:54:55 -0700799 sap_ctx->nAcceptMac = pConfig->num_accept_mac;
800 sap_sort_mac_list(sap_ctx->acceptMacList,
801 sap_ctx->nAcceptMac);
802 } else if (eSAP_ACCEPT_UNLESS_DENIED == sap_ctx->eSapMacAddrAclMode) {
803 qdf_mem_copy(sap_ctx->denyMacList, pConfig->deny_mac,
Peng Xuf5d60c82015-10-02 17:17:03 -0700804 sizeof(pConfig->deny_mac));
Jeff Johnsone13d8062017-09-28 06:54:55 -0700805 sap_ctx->nDenyMac = pConfig->num_deny_mac;
806 sap_sort_mac_list(sap_ctx->denyMacList, sap_ctx->nDenyMac);
Peng Xuf5d60c82015-10-02 17:17:03 -0700807 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800808
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530809 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800810} /* wlansap_set_mac_acl */
811
Vignesh Viswanathan200f5c12018-02-27 14:01:59 +0530812void wlansap_set_stop_bss_inprogress(struct sap_context *sap_ctx,
813 bool in_progress)
814{
815 if (!sap_ctx) {
816 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
817 "%s: Invalid SAP pointer from ctx", __func__);
818 return;
819 }
820
821 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG,
822 "%s: Set stop_bss_in_progress to %d",
823 __func__, in_progress);
824 sap_ctx->stop_bss_in_progress = in_progress;
825}
826
Jeff Johnsone13d8062017-09-28 06:54:55 -0700827QDF_STATUS wlansap_stop_bss(struct sap_context *sap_ctx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800828{
829 tWLAN_SAPEvent sapEvent; /* State machine event */
Jeff Johnson16e29cd2017-09-24 21:01:19 -0700830 QDF_STATUS qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800831
Jeff Johnsone13d8062017-09-28 06:54:55 -0700832 if (NULL == sap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530833 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Jeff Johnson16e29cd2017-09-24 21:01:19 -0700834 "%s: Invalid SAP pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530835 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800836 }
837
838 /* Fill in the event structure for FSM */
839 sapEvent.event = eSAP_HDD_STOP_INFRA_BSS;
840 sapEvent.params = 0;
841
842 /* Handle event */
Jeff Johnsone13d8062017-09-28 06:54:55 -0700843 qdf_status = sap_fsm(sap_ctx, &sapEvent);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800844
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530845 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800846}
847
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800848/* This routine will set the mode of operation for ACL dynamically*/
Jeff Johnsone13d8062017-09-28 06:54:55 -0700849QDF_STATUS wlansap_set_acl_mode(struct sap_context *sap_ctx,
Jeff Johnsonf8ac7372017-09-24 21:24:25 -0700850 eSapMacAddrACL mode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800851{
Jeff Johnsone13d8062017-09-28 06:54:55 -0700852 if (NULL == sap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530853 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Jeff Johnsonf8ac7372017-09-24 21:24:25 -0700854 "%s: Invalid SAP pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530855 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800856 }
857
Jeff Johnsone13d8062017-09-28 06:54:55 -0700858 sap_ctx->eSapMacAddrAclMode = mode;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530859 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800860}
861
Jeff Johnsone13d8062017-09-28 06:54:55 -0700862QDF_STATUS wlansap_get_acl_mode(struct sap_context *sap_ctx,
Jeff Johnson1030f8c2017-09-24 21:33:40 -0700863 eSapMacAddrACL *mode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800864{
Jeff Johnsone13d8062017-09-28 06:54:55 -0700865 if (NULL == sap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530866 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Jeff Johnson1030f8c2017-09-24 21:33:40 -0700867 "%s: Invalid SAP pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530868 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800869 }
870
Jeff Johnsone13d8062017-09-28 06:54:55 -0700871 *mode = sap_ctx->eSapMacAddrAclMode;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530872 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800873}
874
Jeff Johnsone13d8062017-09-28 06:54:55 -0700875QDF_STATUS wlansap_get_acl_accept_list(struct sap_context *sap_ctx,
Jeff Johnson878f6d52017-09-25 08:28:53 -0700876 struct qdf_mac_addr *pAcceptList,
877 uint8_t *nAcceptList)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800878{
Jeff Johnsone13d8062017-09-28 06:54:55 -0700879 if (NULL == sap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530880 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Jeff Johnson878f6d52017-09-25 08:28:53 -0700881 "%s: Invalid SAP pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530882 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800883 }
884
Jeff Johnsone13d8062017-09-28 06:54:55 -0700885 memcpy(pAcceptList, sap_ctx->acceptMacList,
886 (sap_ctx->nAcceptMac * QDF_MAC_ADDR_SIZE));
887 *nAcceptList = sap_ctx->nAcceptMac;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530888 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800889}
890
Jeff Johnsone13d8062017-09-28 06:54:55 -0700891QDF_STATUS wlansap_get_acl_deny_list(struct sap_context *sap_ctx,
Jeff Johnson49c819f2017-09-25 13:48:36 -0700892 struct qdf_mac_addr *pDenyList,
893 uint8_t *nDenyList)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800894{
Jeff Johnsone13d8062017-09-28 06:54:55 -0700895 if (NULL == sap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530896 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800897 "%s: Invalid SAP pointer from p_cds_gctx", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530898 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800899 }
900
Jeff Johnsone13d8062017-09-28 06:54:55 -0700901 memcpy(pDenyList, sap_ctx->denyMacList,
902 (sap_ctx->nDenyMac * QDF_MAC_ADDR_SIZE));
903 *nDenyList = sap_ctx->nDenyMac;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530904 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800905}
906
Jeff Johnsone13d8062017-09-28 06:54:55 -0700907QDF_STATUS wlansap_clear_acl(struct sap_context *sap_ctx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800908{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800909 uint8_t i;
910
Jeff Johnsone13d8062017-09-28 06:54:55 -0700911 if (NULL == sap_ctx) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530912 return QDF_STATUS_E_RESOURCES;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800913 }
914
Jeff Johnsone13d8062017-09-28 06:54:55 -0700915 for (i = 0; i < (sap_ctx->nDenyMac - 1); i++) {
916 qdf_mem_zero((sap_ctx->denyMacList + i)->bytes,
Yingying Tang22facc12016-10-20 17:43:59 +0800917 QDF_MAC_ADDR_SIZE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800918 }
Yingying Tang22facc12016-10-20 17:43:59 +0800919
Jeff Johnsone13d8062017-09-28 06:54:55 -0700920 sap_print_acl(sap_ctx->denyMacList, sap_ctx->nDenyMac);
921 sap_ctx->nDenyMac = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800922
Jeff Johnsone13d8062017-09-28 06:54:55 -0700923 for (i = 0; i < (sap_ctx->nAcceptMac - 1); i++) {
924 qdf_mem_zero((sap_ctx->acceptMacList + i)->bytes,
Yingying Tang22facc12016-10-20 17:43:59 +0800925 QDF_MAC_ADDR_SIZE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800926 }
Yingying Tang22facc12016-10-20 17:43:59 +0800927
Jeff Johnsone13d8062017-09-28 06:54:55 -0700928 sap_print_acl(sap_ctx->acceptMacList, sap_ctx->nAcceptMac);
929 sap_ctx->nAcceptMac = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800930
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530931 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800932}
933
Jeff Johnson42fbe2f2017-09-24 17:42:11 -0700934QDF_STATUS wlansap_modify_acl(struct sap_context *sap_ctx,
935 uint8_t *peer_sta_mac,
936 eSapACLType list_type, eSapACLCmdType cmd)
937{
Srinivas Girigowda74a66d62017-06-21 23:28:25 -0700938 bool sta_white_list = false, sta_black_list = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800939 uint8_t staWLIndex, staBLIndex;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800940
941 if (NULL == sap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530942 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800943 "%s: Invalid SAP Context", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530944 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800945 }
946
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530947 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800948 "Modify ACL entered\n" "Before modification of ACL\n"
949 "size of accept and deny lists %d %d", sap_ctx->nAcceptMac,
950 sap_ctx->nDenyMac);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530951 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800952 "*** WHITE LIST ***");
953 sap_print_acl(sap_ctx->acceptMacList, sap_ctx->nAcceptMac);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530954 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800955 "*** BLACK LIST ***");
956 sap_print_acl(sap_ctx->denyMacList, sap_ctx->nDenyMac);
957
Jeff Johnson42fbe2f2017-09-24 17:42:11 -0700958 /* the expectation is a mac addr will not be in both the lists
959 * at the same time. It is the responsiblity of userspace to
960 * ensure this
961 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800962 sta_white_list =
963 sap_search_mac_list(sap_ctx->acceptMacList, sap_ctx->nAcceptMac,
964 peer_sta_mac, &staWLIndex);
965 sta_black_list =
966 sap_search_mac_list(sap_ctx->denyMacList, sap_ctx->nDenyMac,
967 peer_sta_mac, &staBLIndex);
968
969 if (sta_white_list && sta_black_list) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530970 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800971 "Peer mac " MAC_ADDRESS_STR
972 " found in white and black lists."
973 "Initial lists passed incorrect. Cannot execute this command.",
974 MAC_ADDR_ARRAY(peer_sta_mac));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530975 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800976
977 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530978 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800979 "cmd %d", cmd);
980
981 switch (list_type) {
982 case eSAP_WHITE_LIST:
983 if (cmd == ADD_STA_TO_ACL) {
984 /* error check */
985 /* if list is already at max, return failure */
986 if (sap_ctx->nAcceptMac == MAX_ACL_MAC_ADDRESS) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530987 QDF_TRACE(QDF_MODULE_ID_SAP,
988 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800989 "White list is already maxed out. Cannot accept "
990 MAC_ADDRESS_STR,
991 MAC_ADDR_ARRAY(peer_sta_mac));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530992 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800993 }
994 if (sta_white_list) {
995 /* Do nothing if already present in white list. Just print a warning */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530996 QDF_TRACE(QDF_MODULE_ID_SAP,
997 QDF_TRACE_LEVEL_WARN,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800998 "MAC address already present in white list "
999 MAC_ADDRESS_STR,
1000 MAC_ADDR_ARRAY(peer_sta_mac));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301001 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001002 }
1003 if (sta_black_list) {
1004 /* remove it from black list before adding to the white list */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301005 QDF_TRACE(QDF_MODULE_ID_SAP,
1006 QDF_TRACE_LEVEL_WARN,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001007 "STA present in black list so first remove from it");
Jeff Johnson42fbe2f2017-09-24 17:42:11 -07001008 sap_remove_mac_from_acl(sap_ctx->denyMacList,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001009 &sap_ctx->nDenyMac,
1010 staBLIndex);
1011 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301012 QDF_TRACE(QDF_MODULE_ID_SAP,
1013 QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001014 "... Now add to the white list");
1015 sap_add_mac_to_acl(sap_ctx->acceptMacList,
1016 &sap_ctx->nAcceptMac,
1017 peer_sta_mac);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301018 QDF_TRACE(QDF_MODULE_ID_SAP,
1019 QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001020 "size of accept and deny lists %d %d",
1021 sap_ctx->nAcceptMac,
1022 sap_ctx->nDenyMac);
1023 } else if (cmd == DELETE_STA_FROM_ACL) {
1024 if (sta_white_list) {
1025
Jeff Johnsone6bf7192017-11-07 15:16:09 -08001026 struct csr_del_sta_params delStaParams;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001027
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301028 QDF_TRACE(QDF_MODULE_ID_SAP,
1029 QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001030 "Delete from white list");
1031 sap_remove_mac_from_acl(sap_ctx->acceptMacList,
1032 &sap_ctx->nAcceptMac,
1033 staWLIndex);
1034 /* If a client is deleted from white list and it is connected, send deauth */
1035 wlansap_populate_del_sta_params(peer_sta_mac,
1036 eCsrForcedDeauthSta,
1037 (SIR_MAC_MGMT_DEAUTH >> 4),
1038 &delStaParams);
Jeff Johnson42fbe2f2017-09-24 17:42:11 -07001039 wlansap_deauth_sta(sap_ctx, &delStaParams);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301040 QDF_TRACE(QDF_MODULE_ID_SAP,
1041 QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001042 "size of accept and deny lists %d %d",
1043 sap_ctx->nAcceptMac,
1044 sap_ctx->nDenyMac);
1045 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301046 QDF_TRACE(QDF_MODULE_ID_SAP,
1047 QDF_TRACE_LEVEL_WARN,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001048 "MAC address to be deleted is not present in the white list "
1049 MAC_ADDRESS_STR,
1050 MAC_ADDR_ARRAY(peer_sta_mac));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301051 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001052 }
1053 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301054 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001055 "Invalid cmd type passed");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301056 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001057 }
1058 break;
1059
1060 case eSAP_BLACK_LIST:
1061
1062 if (cmd == ADD_STA_TO_ACL) {
Jeff Johnsone6bf7192017-11-07 15:16:09 -08001063 struct csr_del_sta_params delStaParams;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001064 /* error check */
1065 /* if list is already at max, return failure */
1066 if (sap_ctx->nDenyMac == MAX_ACL_MAC_ADDRESS) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301067 QDF_TRACE(QDF_MODULE_ID_SAP,
1068 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001069 "Black list is already maxed out. Cannot accept "
1070 MAC_ADDRESS_STR,
1071 MAC_ADDR_ARRAY(peer_sta_mac));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301072 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001073 }
1074 if (sta_black_list) {
1075 /* Do nothing if already present in white list */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301076 QDF_TRACE(QDF_MODULE_ID_SAP,
1077 QDF_TRACE_LEVEL_WARN,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001078 "MAC address already present in black list "
1079 MAC_ADDRESS_STR,
1080 MAC_ADDR_ARRAY(peer_sta_mac));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301081 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001082 }
1083 if (sta_white_list) {
1084 /* remove it from white list before adding to the black list */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301085 QDF_TRACE(QDF_MODULE_ID_SAP,
1086 QDF_TRACE_LEVEL_WARN,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001087 "Present in white list so first remove from it");
Jeff Johnson42fbe2f2017-09-24 17:42:11 -07001088 sap_remove_mac_from_acl(sap_ctx->acceptMacList,
1089 &sap_ctx->nAcceptMac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001090 staWLIndex);
1091 }
1092 /* If we are adding a client to the black list; if its connected, send deauth */
1093 wlansap_populate_del_sta_params(peer_sta_mac,
1094 eCsrForcedDeauthSta,
1095 (SIR_MAC_MGMT_DEAUTH >> 4),
1096 &delStaParams);
Jeff Johnson42fbe2f2017-09-24 17:42:11 -07001097 wlansap_deauth_sta(sap_ctx, &delStaParams);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301098 QDF_TRACE(QDF_MODULE_ID_SAP,
1099 QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001100 "... Now add to black list");
1101 sap_add_mac_to_acl(sap_ctx->denyMacList,
1102 &sap_ctx->nDenyMac, peer_sta_mac);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301103 QDF_TRACE(QDF_MODULE_ID_SAP,
1104 QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001105 "size of accept and deny lists %d %d",
1106 sap_ctx->nAcceptMac,
1107 sap_ctx->nDenyMac);
1108 } else if (cmd == DELETE_STA_FROM_ACL) {
1109 if (sta_black_list) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301110 QDF_TRACE(QDF_MODULE_ID_SAP,
1111 QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001112 "Delete from black list");
1113 sap_remove_mac_from_acl(sap_ctx->denyMacList,
1114 &sap_ctx->nDenyMac,
1115 staBLIndex);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301116 QDF_TRACE(QDF_MODULE_ID_SAP,
1117 QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001118 "no accept and deny mac %d %d",
1119 sap_ctx->nAcceptMac,
1120 sap_ctx->nDenyMac);
1121 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301122 QDF_TRACE(QDF_MODULE_ID_SAP,
1123 QDF_TRACE_LEVEL_WARN,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001124 "MAC address to be deleted is not present in the black list "
1125 MAC_ADDRESS_STR,
1126 MAC_ADDR_ARRAY(peer_sta_mac));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301127 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001128 }
1129 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301130 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001131 "Invalid cmd type passed");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301132 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001133 }
1134 break;
1135
1136 default:
1137 {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301138 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001139 "Invalid list type passed %d", list_type);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301140 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001141 }
1142 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301143 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001144 "After modification of ACL");
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301145 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001146 "*** WHITE LIST ***");
1147 sap_print_acl(sap_ctx->acceptMacList, sap_ctx->nAcceptMac);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301148 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001149 "*** BLACK LIST ***");
1150 sap_print_acl(sap_ctx->denyMacList, sap_ctx->nDenyMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301151 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001152}
1153
Jeff Johnsone13d8062017-09-28 06:54:55 -07001154QDF_STATUS wlansap_disassoc_sta(struct sap_context *sap_ctx,
Jeff Johnsone6bf7192017-11-07 15:16:09 -08001155 struct csr_del_sta_params *p_del_sta_params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001156{
Jeff Johnsone13d8062017-09-28 06:54:55 -07001157 if (NULL == sap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301158 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Jeff Johnson92e867c2017-09-25 13:58:52 -07001159 "%s: Invalid SAP pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301160 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001161 }
1162
Jeff Johnsonc0db3842017-09-13 18:34:28 -07001163 sme_roam_disconnect_sta(CDS_GET_HAL_CB(),
Jeff Johnsone13d8062017-09-28 06:54:55 -07001164 sap_ctx->sessionId, p_del_sta_params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001165
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301166 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001167}
1168
Jeff Johnsone13d8062017-09-28 06:54:55 -07001169QDF_STATUS wlansap_deauth_sta(struct sap_context *sap_ctx,
Jeff Johnsone6bf7192017-11-07 15:16:09 -08001170 struct csr_del_sta_params *pDelStaParams)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001171{
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301172 QDF_STATUS qdf_ret_status = QDF_STATUS_E_FAILURE;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301173 QDF_STATUS qdf_status = QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001174
Jeff Johnsone13d8062017-09-28 06:54:55 -07001175 if (NULL == sap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301176 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Jeff Johnsone7ff1d02017-09-25 14:03:34 -07001177 "%s: Invalid SAP pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301178 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001179 }
1180
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301181 qdf_ret_status =
Jeff Johnsonc0db3842017-09-13 18:34:28 -07001182 sme_roam_deauth_sta(CDS_GET_HAL_CB(),
Jeff Johnsone13d8062017-09-28 06:54:55 -07001183 sap_ctx->sessionId, pDelStaParams);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001184
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301185 if (qdf_ret_status == QDF_STATUS_SUCCESS) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301186 qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001187 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301188 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001189}
1190
Edhar, Mahesh Kumarbd8b3912015-11-25 19:28:12 +05301191/**
Jeff Johnsonc7e4d162018-05-12 16:20:34 -07001192 * wlansap_update_csa_channel_params() - function to populate channel width and
Edhar, Mahesh Kumarbd8b3912015-11-25 19:28:12 +05301193 * bonding modes.
1194 * @sap_context: sap adapter context
1195 * @channel: target channel
1196 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301197 * Return: The QDF_STATUS code associated with performing the operation
Edhar, Mahesh Kumarbd8b3912015-11-25 19:28:12 +05301198 */
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -07001199static QDF_STATUS
1200wlansap_update_csa_channel_params(struct sap_context *sap_context,
1201 uint32_t channel)
Edhar, Mahesh Kumarbd8b3912015-11-25 19:28:12 +05301202{
1203 void *hal;
1204 tpAniSirGlobal mac_ctx;
Edhar, Mahesh Kumarbd8b3912015-11-25 19:28:12 +05301205 uint8_t bw;
1206
Jeff Johnsonc0db3842017-09-13 18:34:28 -07001207 hal = CDS_GET_HAL_CB();
Edhar, Mahesh Kumarbd8b3912015-11-25 19:28:12 +05301208 if (!hal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301209 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Edhar, Mahesh Kumarbd8b3912015-11-25 19:28:12 +05301210 "%s: Invalid hal pointer from p_cds_gctx", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301211 return QDF_STATUS_E_FAULT;
Edhar, Mahesh Kumarbd8b3912015-11-25 19:28:12 +05301212 }
1213
1214 mac_ctx = PMAC_STRUCT(hal);
1215
Amar Singhalb8d4f152016-02-10 10:21:43 -08001216 if (channel <= CHAN_ENUM_14) {
Edhar, Mahesh Kumarbd8b3912015-11-25 19:28:12 +05301217 /*
1218 * currently OBSS scan is done in hostapd, so to avoid
1219 * SAP coming up in HT40 on channel switch we are
1220 * disabling channel bonding in 2.4Ghz.
1221 */
Edhar, Mahesh Kumarbd8b3912015-11-25 19:28:12 +05301222 mac_ctx->sap.SapDfsInfo.new_chanWidth = 0;
1223
1224 } else {
Himanshu Agarwalf5c5b102018-05-22 20:13:57 +05301225 if (sap_context->csr_roamProfile.phyMode ==
1226 eCSR_DOT11_MODE_11ac ||
1227 sap_context->csr_roamProfile.phyMode ==
1228 eCSR_DOT11_MODE_11ac_ONLY)
Edhar, Mahesh Kumarbd8b3912015-11-25 19:28:12 +05301229 bw = BW80;
Edhar, Mahesh Kumarbd8b3912015-11-25 19:28:12 +05301230 else
Himanshu Agarwalf5c5b102018-05-22 20:13:57 +05301231 bw = BW40_HIGH_PRIMARY;
Edhar, Mahesh Kumarbd8b3912015-11-25 19:28:12 +05301232
1233 for (; bw >= BW20; bw--) {
1234 uint16_t op_class;
1235
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07001236 op_class = wlan_reg_dmn_get_opclass_from_channel(
Edhar, Mahesh Kumarbd8b3912015-11-25 19:28:12 +05301237 mac_ctx->scan.countryCodeCurrent,
1238 channel, bw);
1239 if (!op_class)
1240 continue;
1241
1242 if (bw == BW80) {
Edhar, Mahesh Kumarbd8b3912015-11-25 19:28:12 +05301243 mac_ctx->sap.SapDfsInfo.new_chanWidth =
1244 CH_WIDTH_80MHZ;
1245 } else if (bw == BW40_HIGH_PRIMARY) {
1246 mac_ctx->sap.SapDfsInfo.new_chanWidth =
1247 CH_WIDTH_40MHZ;
Edhar, Mahesh Kumarbd8b3912015-11-25 19:28:12 +05301248 } else if (bw == BW40_LOW_PRIMARY) {
1249 mac_ctx->sap.SapDfsInfo.new_chanWidth =
1250 CH_WIDTH_40MHZ;
Edhar, Mahesh Kumarbd8b3912015-11-25 19:28:12 +05301251 } else {
1252 mac_ctx->sap.SapDfsInfo.new_chanWidth =
1253 CH_WIDTH_20MHZ;
Edhar, Mahesh Kumarbd8b3912015-11-25 19:28:12 +05301254 }
1255 break;
1256 }
1257
1258 }
1259
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301260 return QDF_STATUS_SUCCESS;
Edhar, Mahesh Kumarbd8b3912015-11-25 19:28:12 +05301261}
1262
Chandrasekaran, Manishekara74bb022016-01-12 18:37:43 +05301263/**
1264 * wlansap_set_channel_change_with_csa() - Set channel change with CSA
Jeff Johnson52a2ce32017-09-25 14:13:27 -07001265 * @sapContext: Pointer to SAP context
Chandrasekaran, Manishekara74bb022016-01-12 18:37:43 +05301266 * @targetChannel: Target channel
1267 * @target_bw: Target bandwidth
Min Liu2fef5792018-01-19 17:59:42 +08001268 * @strict: if true switch to the requested channel always,
1269 * SCC/MCC check will be ignored,
1270 * fail otherwise
Chandrasekaran, Manishekara74bb022016-01-12 18:37:43 +05301271 *
1272 * This api function does a channel change to the target channel specified.
1273 * CSA IE is included in the beacons before doing a channel change.
1274 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301275 * Return: QDF_STATUS
Chandrasekaran, Manishekara74bb022016-01-12 18:37:43 +05301276 */
Jeff Johnson52a2ce32017-09-25 14:13:27 -07001277QDF_STATUS wlansap_set_channel_change_with_csa(struct sap_context *sapContext,
1278 uint32_t targetChannel,
1279 enum phy_ch_width target_bw,
1280 bool strict)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001281{
1282
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001283 tWLAN_SAPEvent sapEvent;
1284 tpAniSirGlobal pMac = NULL;
1285 void *hHal = NULL;
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +05301286 bool valid;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301287 QDF_STATUS status;
Bala Venkatesh5479cf82018-06-09 20:02:38 +05301288 bool sta_sap_scc_on_dfs_chan;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001289
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001290 if (NULL == sapContext) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301291 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Jeff Johnson52a2ce32017-09-25 14:13:27 -07001292 "%s: Invalid SAP pointer", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001293
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301294 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001295 }
Edhar, Mahesh Kumarbd8b3912015-11-25 19:28:12 +05301296
Jeff Johnsonc0db3842017-09-13 18:34:28 -07001297 hHal = CDS_GET_HAL_CB();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001298 if (NULL == hHal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301299 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001300 "%s: Invalid HAL pointer from p_cds_gctx", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301301 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001302 }
1303 pMac = PMAC_STRUCT(hHal);
1304
Tushnim Bhattacharyya9a929992017-06-18 00:59:09 -07001305 if (strict && !policy_mgr_is_safe_channel(pMac->psoc, targetChannel)) {
1306 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
1307 "%u is unsafe channel", targetChannel);
1308 return QDF_STATUS_E_FAULT;
1309 }
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05301310 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
Manishekar Chandrasekaran1004ad92016-09-04 22:01:47 +05301311 "%s: sap chan:%d target:%d conn on 5GHz:%d",
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05301312 __func__, sapContext->channel, targetChannel,
Tushnim Bhattacharyya66348bd2017-03-09 15:02:10 -08001313 policy_mgr_is_any_mode_active_on_band_along_with_session(
1314 pMac->psoc, sapContext->sessionId, POLICY_MGR_BAND_5));
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05301315
Bala Venkatesh5479cf82018-06-09 20:02:38 +05301316 sta_sap_scc_on_dfs_chan =
1317 policy_mgr_is_sta_sap_scc_allowed_on_dfs_chan(pMac->psoc);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001318 /*
1319 * Now, validate if the passed channel is valid in the
1320 * current regulatory domain.
1321 */
1322 if (sapContext->channel != targetChannel &&
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07001323 ((wlan_reg_get_channel_state(pMac->pdev, targetChannel) ==
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001324 CHANNEL_STATE_ENABLE) ||
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07001325 (wlan_reg_get_channel_state(pMac->pdev, targetChannel) ==
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001326 CHANNEL_STATE_DFS &&
Bala Venkatesh5479cf82018-06-09 20:02:38 +05301327 (!policy_mgr_is_any_mode_active_on_band_along_with_session(
Tushnim Bhattacharyya66348bd2017-03-09 15:02:10 -08001328 pMac->psoc, sapContext->sessionId,
Bala Venkatesh5479cf82018-06-09 20:02:38 +05301329 POLICY_MGR_BAND_5) ||
1330 sta_sap_scc_on_dfs_chan)))) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001331 /*
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +05301332 * validate target channel switch w.r.t various concurrency
1333 * rules set.
1334 */
Min Liu2fef5792018-01-19 17:59:42 +08001335 if (!strict) {
1336 valid = wlan_sap_validate_channel_switch(hHal,
1337 targetChannel, sapContext);
1338 if (!valid) {
1339 QDF_TRACE(QDF_MODULE_ID_SAP,
1340 QDF_TRACE_LEVEL_ERROR,
1341 FL("Channel switch to %u is not allowed due to concurrent channel interference"),
1342 targetChannel);
1343 return QDF_STATUS_E_FAULT;
1344 }
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +05301345 }
1346 /*
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001347 * Post a CSA IE request to SAP state machine with
1348 * target channel information and also CSA IE required
Rajeev Kumar Sirasanagandla301aacb2018-08-07 15:48:18 +05301349 * flag set in sapContext only, if SAP is in SAP_STARTED
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001350 * state.
1351 */
Rajeev Kumar Sirasanagandla301aacb2018-08-07 15:48:18 +05301352 if (sapContext->fsm_state == SAP_STARTED) {
Edhar, Mahesh Kumarbd8b3912015-11-25 19:28:12 +05301353 status = wlansap_update_csa_channel_params(sapContext,
1354 targetChannel);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301355 if (status != QDF_STATUS_SUCCESS)
Edhar, Mahesh Kumarbd8b3912015-11-25 19:28:12 +05301356 return status;
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +05301357
1358 /*
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001359 * Copy the requested target channel
1360 * to sap context.
1361 */
1362 pMac->sap.SapDfsInfo.target_channel = targetChannel;
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08001363 pMac->sap.SapDfsInfo.new_ch_params.ch_width =
1364 pMac->sap.SapDfsInfo.new_chanWidth;
Chandrasekaran, Manishekara74bb022016-01-12 18:37:43 +05301365
1366 /* By this time, the best bandwidth is calculated for
1367 * the given target channel. Now, if there was a
1368 * request from user to move to a selected bandwidth,
1369 * we can see if it can be honored.
1370 *
1371 * Ex1: BW80 was selected for the target channel and
1372 * user wants BW40, it can be allowed
1373 * Ex2: BW40 was selected for the target channel and
1374 * user wants BW80, it cannot be allowed for the given
1375 * target channel.
1376 *
1377 * So, the MIN of the selected channel bandwidth and
1378 * user input is used for the bandwidth
1379 */
1380 if (target_bw != CH_WIDTH_MAX) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301381 QDF_TRACE(QDF_MODULE_ID_SAP,
1382 QDF_TRACE_LEVEL_INFO,
Chandrasekaran, Manishekara74bb022016-01-12 18:37:43 +05301383 "%s: target bw:%d new width:%d",
1384 __func__, target_bw,
1385 pMac->sap.SapDfsInfo.
1386 new_ch_params.ch_width);
1387 pMac->sap.SapDfsInfo.new_ch_params.ch_width =
1388 pMac->sap.SapDfsInfo.new_chanWidth =
Anurag Chouhan6d760662016-02-20 16:05:43 +05301389 QDF_MIN(pMac->sap.SapDfsInfo.
Chandrasekaran, Manishekara74bb022016-01-12 18:37:43 +05301390 new_ch_params.ch_width,
1391 target_bw);
1392 }
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07001393 wlan_reg_set_channel_params(pMac->pdev, targetChannel,
Sandeep Puligilla1cc23f62016-04-27 16:52:49 -07001394 0, &pMac->sap.SapDfsInfo.new_ch_params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001395 /*
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001396 * Set the CSA IE required flag.
1397 */
1398 pMac->sap.SapDfsInfo.csaIERequired = true;
1399
1400 /*
1401 * Set the radar found status to allow the channel
1402 * change to happen same as in the case of a radar
1403 * detection. Since, this will allow SAP to be in
1404 * correct state and also resume the netif queues
1405 * that were suspended in HDD before the channel
1406 * request was issued.
1407 */
1408 pMac->sap.SapDfsInfo.sap_radar_found_status = true;
Edhar, Mahesh Kumar695468e2015-10-19 12:06:20 +05301409 pMac->sap.SapDfsInfo.cac_state =
1410 eSAP_DFS_DO_NOT_SKIP_CAC;
1411 sap_cac_reset_notify(hHal);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001412
1413 /*
Chandrasekaran, Manishekar8104abd2016-01-29 18:10:27 +05301414 * Post the eSAP_CHANNEL_SWITCH_ANNOUNCEMENT_START
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001415 * to SAP state machine to process the channel
1416 * request with CSA IE set in the beacons.
1417 */
1418 sapEvent.event =
Chandrasekaran, Manishekar8104abd2016-01-29 18:10:27 +05301419 eSAP_CHANNEL_SWITCH_ANNOUNCEMENT_START;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001420 sapEvent.params = 0;
1421 sapEvent.u1 = 0;
1422 sapEvent.u2 = 0;
1423
1424 sap_fsm(sapContext, &sapEvent);
1425
1426 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301427 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Rajeev Kumar Sirasanagandla301aacb2018-08-07 15:48:18 +05301428 "%s: Failed to request Channel Change, since SAP is not in SAP_STARTED state",
1429 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301430 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001431 }
1432
1433 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301434 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001435 "%s: Channel = %d is not valid in the current"
1436 "regulatory domain", __func__, targetChannel);
1437
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301438 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001439 }
1440
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301441 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Chandrasekaran, Manishekar8104abd2016-01-29 18:10:27 +05301442 "%s: Posted eSAP_CHANNEL_SWITCH_ANNOUNCEMENT_START successfully to sap_fsm for Channel = %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001443 __func__, targetChannel);
1444
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301445 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001446}
1447
Jeff Johnsone13d8062017-09-28 06:54:55 -07001448QDF_STATUS wlansap_set_key_sta(struct sap_context *sap_ctx,
Jeff Johnsone6b25d92017-09-25 14:30:32 -07001449 tCsrRoamSetKey *pSetKeyInfo)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001450{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301451 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001452 void *hHal = NULL;
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301453 QDF_STATUS qdf_ret_status = QDF_STATUS_E_FAILURE;
Krunal Sonibfd05492017-10-03 15:48:37 -07001454 uint32_t roamId = INVALID_ROAM_ID;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001455
Rajeev Kumar Sirasanagandla301aacb2018-08-07 15:48:18 +05301456 if (!sap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301457 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Jeff Johnsone6b25d92017-09-25 14:30:32 -07001458 "%s: Invalid SAP pointer",
Peng Xuf5d60c82015-10-02 17:17:03 -07001459 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301460 return QDF_STATUS_E_FAULT;
Peng Xuf5d60c82015-10-02 17:17:03 -07001461 }
Jeff Johnsonc0db3842017-09-13 18:34:28 -07001462 hHal = CDS_GET_HAL_CB();
Peng Xuf5d60c82015-10-02 17:17:03 -07001463 if (NULL == hHal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301464 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Jeff Johnsone6b25d92017-09-25 14:30:32 -07001465 "%s: Invalid HAL pointer",
Peng Xuf5d60c82015-10-02 17:17:03 -07001466 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301467 return QDF_STATUS_E_FAULT;
Peng Xuf5d60c82015-10-02 17:17:03 -07001468 }
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301469 qdf_ret_status =
Jeff Johnsone13d8062017-09-28 06:54:55 -07001470 sme_roam_set_key(hHal, sap_ctx->sessionId, pSetKeyInfo,
Peng Xuf5d60c82015-10-02 17:17:03 -07001471 &roamId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001472
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301473 if (qdf_ret_status == QDF_STATUS_SUCCESS)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301474 qdf_status = QDF_STATUS_SUCCESS;
Peng Xuf5d60c82015-10-02 17:17:03 -07001475 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301476 qdf_status = QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001477
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301478 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001479}
1480
Jeff Johnson617fe642017-09-24 17:52:51 -07001481QDF_STATUS wlan_sap_getstation_ie_information(struct sap_context *sap_ctx,
1482 uint32_t *len, uint8_t *buf)
1483{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301484 QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001485 uint32_t ie_len = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001486
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001487 if (NULL == sap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301488 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Jeff Johnson617fe642017-09-24 17:52:51 -07001489 FL("Invalid SAP pointer"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301490 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001491 }
1492
1493 if (len) {
1494 ie_len = *len;
1495 *len = sap_ctx->nStaWPARSnReqIeLength;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301496 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001497 FL("WPAIE len : %x"), *len);
1498 if ((buf) && (ie_len >= sap_ctx->nStaWPARSnReqIeLength)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301499 qdf_mem_copy(buf,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001500 sap_ctx->pStaWpaRsnReqIE,
1501 sap_ctx->nStaWPARSnReqIeLength);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301502 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001503 FL("WPAIE: %02x:%02x:%02x:%02x:%02x:%02x"),
1504 buf[0], buf[1], buf[2], buf[3], buf[4],
1505 buf[5]);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301506 qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001507 }
1508 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301509 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001510}
1511
Jeff Johnsoncd1ee1e2017-09-25 14:50:49 -07001512QDF_STATUS wlan_sap_update_next_channel(struct sap_context *sap_ctx,
1513 uint8_t channel,
1514 enum phy_ch_width chan_bw)
Kapil Gupta8878ad92017-02-13 11:56:04 +05301515{
Kapil Gupta8878ad92017-02-13 11:56:04 +05301516 if (!sap_ctx) {
1517 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
1518 "%s: Invalid SAP pointer", __func__);
1519 return QDF_STATUS_E_FAULT;
1520 }
1521
1522 sap_ctx->dfs_vendor_channel = channel;
1523 sap_ctx->dfs_vendor_chan_bw = chan_bw;
1524
1525 return QDF_STATUS_SUCCESS;
1526}
1527
Qiwei Caie689a262018-07-26 15:50:22 +08001528#ifdef FEATURE_SAP_COND_CHAN_SWITCH
Jeff Johnson108566e2017-09-25 14:54:35 -07001529QDF_STATUS wlan_sap_set_pre_cac_status(struct sap_context *sap_ctx,
1530 bool status, tHalHandle handle)
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05301531{
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05301532 tpAniSirGlobal mac_ctx = PMAC_STRUCT(handle);
1533
1534 if (!mac_ctx) {
1535 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
1536 "%s: Invalid mac pointer", __func__);
1537 return QDF_STATUS_E_FAULT;
1538 }
1539
1540 if (!sap_ctx) {
1541 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
1542 "%s: Invalid SAP pointer", __func__);
1543 return QDF_STATUS_E_FAULT;
1544 }
1545
1546 sap_ctx->is_pre_cac_on = status;
1547 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG,
1548 "%s: is_pre_cac_on:%d", __func__, sap_ctx->is_pre_cac_on);
1549
1550 return QDF_STATUS_SUCCESS;
1551}
1552
Jeff Johnson2cdcfdc2017-09-25 15:00:22 -07001553QDF_STATUS wlan_sap_set_chan_before_pre_cac(struct sap_context *sap_ctx,
1554 uint8_t chan_before_pre_cac)
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05301555{
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05301556 if (!sap_ctx) {
1557 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
1558 "%s: Invalid SAP pointer", __func__);
1559 return QDF_STATUS_E_FAULT;
1560 }
1561
1562 sap_ctx->chan_before_pre_cac = chan_before_pre_cac;
1563 return QDF_STATUS_SUCCESS;
1564}
Qiwei Caie689a262018-07-26 15:50:22 +08001565#endif /* FEATURE_SAP_COND_CHAN_SWITCH */
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05301566
Jeff Johnsona68cc532017-09-25 15:18:30 -07001567QDF_STATUS wlan_sap_set_pre_cac_complete_status(struct sap_context *sap_ctx,
1568 bool status)
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05301569{
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05301570 if (!sap_ctx) {
1571 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
1572 "%s: Invalid SAP pointer", __func__);
1573 return QDF_STATUS_E_FAULT;
1574 }
1575
1576 sap_ctx->pre_cac_complete = status;
1577
1578 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG,
1579 "%s: pre cac complete status:%d session:%d",
1580 __func__, status, sap_ctx->sessionId);
1581
1582 return QDF_STATUS_SUCCESS;
1583}
1584
1585/**
1586 * wlan_sap_is_pre_cac_active() - Checks if pre cac in in progress
1587 * @handle: Global MAC handle
1588 *
1589 * Checks if pre cac is in progress in any of the SAP contexts
1590 *
1591 * Return: True is pre cac is active, false otherwise
1592 */
1593bool wlan_sap_is_pre_cac_active(tHalHandle handle)
1594{
1595 tpAniSirGlobal mac = NULL;
1596 int i;
1597
1598 mac = PMAC_STRUCT(handle);
1599 if (!mac) {
1600 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
1601 "%s: Invalid mac context", __func__);
1602 return false;
1603 }
1604
1605 for (i = 0; i < SAP_MAX_NUM_SESSION; i++) {
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -07001606 struct sap_context *context =
Zhu Jianminc147a542018-05-21 13:15:40 +08001607 mac->sap.sapCtxList[i].sap_context;
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05301608 if (context && context->is_pre_cac_on)
1609 return true;
1610 }
1611 return false;
1612}
1613
1614/**
1615 * wlan_sap_get_pre_cac_vdev_id() - Get vdev id of the pre cac interface
1616 * @handle: Global handle
1617 * @vdev_id: vdev id
1618 *
1619 * Fetches the vdev id of the pre cac interface
1620 *
1621 * Return: QDF_STATUS
1622 */
1623QDF_STATUS wlan_sap_get_pre_cac_vdev_id(tHalHandle handle, uint8_t *vdev_id)
1624{
1625 tpAniSirGlobal mac = NULL;
1626 uint8_t i;
1627
1628 mac = PMAC_STRUCT(handle);
1629 if (!mac) {
1630 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
1631 "%s: Invalid mac context", __func__);
1632 return QDF_STATUS_E_FAULT;
1633 }
1634
1635 for (i = 0; i < SAP_MAX_NUM_SESSION; i++) {
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -07001636 struct sap_context *context =
Zhu Jianminc147a542018-05-21 13:15:40 +08001637 mac->sap.sapCtxList[i].sap_context;
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05301638 if (context && context->is_pre_cac_on) {
1639 *vdev_id = i;
1640 return QDF_STATUS_SUCCESS;
1641 }
1642 }
1643 return QDF_STATUS_E_FAILURE;
1644}
1645
Jeff Johnsone13d8062017-09-28 06:54:55 -07001646QDF_STATUS wlansap_register_mgmt_frame(struct sap_context *sap_ctx,
Jeff Johnson4a7ff432017-09-24 18:10:00 -07001647 uint16_t frameType,
1648 uint8_t *matchData,
1649 uint16_t matchLen)
1650{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001651 void *hHal = NULL;
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301652 QDF_STATUS qdf_ret_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001653
Jeff Johnsone13d8062017-09-28 06:54:55 -07001654 if (NULL == sap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301655 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Peng Xuf5d60c82015-10-02 17:17:03 -07001656 "%s: Invalid SAP pointer from pCtx",
1657 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301658 return QDF_STATUS_E_FAULT;
Peng Xuf5d60c82015-10-02 17:17:03 -07001659 }
Jeff Johnsonc0db3842017-09-13 18:34:28 -07001660 hHal = CDS_GET_HAL_CB();
Krunal Soni074dd2c2017-04-14 14:57:34 -07001661 if (NULL == hHal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301662 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Krunal Soni074dd2c2017-04-14 14:57:34 -07001663 FL("hal pointer null"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301664 return QDF_STATUS_E_FAULT;
Peng Xuf5d60c82015-10-02 17:17:03 -07001665 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001666
Jeff Johnsone13d8062017-09-28 06:54:55 -07001667 qdf_ret_status = sme_register_mgmt_frame(hHal, sap_ctx->sessionId,
Peng Xuf5d60c82015-10-02 17:17:03 -07001668 frameType, matchData,
1669 matchLen);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001670
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301671 if (QDF_STATUS_SUCCESS == qdf_ret_status) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301672 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001673 }
1674
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301675 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001676 "Failed to Register MGMT frame");
1677
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301678 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001679}
1680
Jeff Johnsone13d8062017-09-28 06:54:55 -07001681QDF_STATUS wlansap_de_register_mgmt_frame(struct sap_context *sap_ctx,
Jeff Johnson42e7c402017-09-24 18:18:10 -07001682 uint16_t frameType,
1683 uint8_t *matchData,
1684 uint16_t matchLen)
1685{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001686 void *hHal = NULL;
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301687 QDF_STATUS qdf_ret_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001688
Jeff Johnsone13d8062017-09-28 06:54:55 -07001689 if (NULL == sap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301690 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Peng Xuf5d60c82015-10-02 17:17:03 -07001691 "%s: Invalid SAP pointer from pCtx",
1692 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301693 return QDF_STATUS_E_FAULT;
Peng Xuf5d60c82015-10-02 17:17:03 -07001694 }
Jeff Johnsonc0db3842017-09-13 18:34:28 -07001695 hHal = CDS_GET_HAL_CB();
Krunal Soni074dd2c2017-04-14 14:57:34 -07001696 if (NULL == hHal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301697 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Krunal Soni074dd2c2017-04-14 14:57:34 -07001698 FL("hal pointer null"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301699 return QDF_STATUS_E_FAULT;
Peng Xuf5d60c82015-10-02 17:17:03 -07001700 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001701
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301702 qdf_ret_status =
Jeff Johnsone13d8062017-09-28 06:54:55 -07001703 sme_deregister_mgmt_frame(hHal, sap_ctx->sessionId, frameType,
Peng Xuf5d60c82015-10-02 17:17:03 -07001704 matchData, matchLen);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001705
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301706 if (QDF_STATUS_SUCCESS == qdf_ret_status) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301707 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001708 }
1709
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301710 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001711 "Failed to Deregister MGMT frame");
1712
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301713 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001714}
1715
Jeff Johnson164b3bb2017-09-25 19:34:14 -07001716QDF_STATUS wlansap_channel_change_request(struct sap_context *sapContext,
1717 uint8_t target_channel)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001718{
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301719 QDF_STATUS qdf_ret_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001720 void *hHal = NULL;
1721 tpAniSirGlobal mac_ctx = NULL;
1722 eCsrPhyMode phy_mode;
Amar Singhal5cccafe2017-02-15 12:42:58 -08001723 struct ch_params *ch_params;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001724
Naveen Rawatb4ea70f2018-03-23 17:10:01 -07001725 if (!target_channel) {
1726 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
1727 "%s: channel 0 requested", __func__);
1728 return QDF_STATUS_E_FAULT;
1729 }
1730
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001731 if (NULL == sapContext) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301732 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001733 "%s: Invalid SAP pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301734 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001735 }
1736
Jeff Johnsonc0db3842017-09-13 18:34:28 -07001737 hHal = CDS_GET_HAL_CB();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001738 if (NULL == hHal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301739 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001740 "%s: Invalid HAL pointer from p_cds_gctx", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301741 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001742 }
1743 mac_ctx = PMAC_STRUCT(hHal);
1744 phy_mode = sapContext->csr_roamProfile.phyMode;
Wu Gaoa61310a2016-11-29 17:02:36 +08001745
Vignesh Viswanathan694bec32018-07-11 14:37:39 +05301746 /* Update phy_mode if the target channel is in the other band */
1747 if (WLAN_CHAN_IS_5GHZ(target_channel) &&
1748 ((phy_mode == eCSR_DOT11_MODE_11g) ||
1749 (phy_mode == eCSR_DOT11_MODE_11g_ONLY)))
1750 phy_mode = eCSR_DOT11_MODE_11a;
1751 else if (WLAN_CHAN_IS_2GHZ(target_channel) &&
1752 (phy_mode == eCSR_DOT11_MODE_11a))
1753 phy_mode = eCSR_DOT11_MODE_11g;
1754
1755 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG,
1756 "%s: phy_mode: %d, target_channel: %d new phy_mode: %d",
1757 __func__, sapContext->csr_roamProfile.phyMode,
1758 target_channel, phy_mode);
1759 sapContext->csr_roamProfile.phyMode = phy_mode;
1760
Wu Gaoa61310a2016-11-29 17:02:36 +08001761 if (sapContext->csr_roamProfile.ChannelInfo.numOfChannels == 0 ||
1762 sapContext->csr_roamProfile.ChannelInfo.ChannelList == NULL) {
1763 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
1764 FL("Invalid channel list"));
1765 return QDF_STATUS_E_FAULT;
1766 }
Abhishek Singh518323d2015-10-19 17:42:01 +05301767 sapContext->csr_roamProfile.ChannelInfo.ChannelList[0] = target_channel;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001768 /*
1769 * We are getting channel bonding mode from sapDfsInfor structure
1770 * because we've implemented channel width fallback mechanism for DFS
1771 * which will result in channel width changing dynamically.
1772 */
Sandeep Puligilla2111d3c2016-02-03 01:46:15 -08001773 ch_params = &mac_ctx->sap.SapDfsInfo.new_ch_params;
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07001774 wlan_reg_set_channel_params(mac_ctx->pdev, target_channel,
1775 0, ch_params);
Sandeep Puligilla2111d3c2016-02-03 01:46:15 -08001776 sapContext->ch_params.ch_width = ch_params->ch_width;
Abhishek Singh518323d2015-10-19 17:42:01 +05301777 /* Update the channel as this will be used to
1778 * send event to supplicant
1779 */
1780 sapContext->channel = target_channel;
Sandeep Puligilla2111d3c2016-02-03 01:46:15 -08001781 sapContext->csr_roamProfile.ch_params.ch_width = ch_params->ch_width;
Manishekar Chandrasekaranec267592016-05-26 19:10:04 +05301782 sapContext->csr_roamProfile.ch_params.sec_ch_offset =
1783 ch_params->sec_ch_offset;
1784 sapContext->csr_roamProfile.ch_params.center_freq_seg0 =
1785 ch_params->center_freq_seg0;
1786 sapContext->csr_roamProfile.ch_params.center_freq_seg1 =
1787 ch_params->center_freq_seg1;
Arif Hussaincd151632017-02-11 16:57:19 -08001788 sap_dfs_set_current_channel(sapContext);
Manishekar Chandrasekaranec267592016-05-26 19:10:04 +05301789
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301790 qdf_ret_status = sme_roam_channel_change_req(hHal, sapContext->bssid,
Sandeep Puligilla2111d3c2016-02-03 01:46:15 -08001791 ch_params, &sapContext->csr_roamProfile);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001792
Manishekar Chandrasekaranec267592016-05-26 19:10:04 +05301793 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
Vignesh Viswanathan694bec32018-07-11 14:37:39 +05301794 "%s: chan:%d phy_mode %d width:%d offset:%d seg0:%d seg1:%d",
1795 __func__, sapContext->channel, phy_mode, ch_params->ch_width,
Manishekar Chandrasekaranec267592016-05-26 19:10:04 +05301796 ch_params->sec_ch_offset, ch_params->center_freq_seg0,
1797 ch_params->center_freq_seg1);
1798
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301799 if (qdf_ret_status == QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001800 sap_signal_hdd_event(sapContext, NULL,
1801 eSAP_CHANNEL_CHANGE_EVENT,
1802 (void *) eSAP_STATUS_SUCCESS);
1803
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301804 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001805 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301806 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001807}
1808
Jeff Johnson3abdd242017-09-25 19:21:33 -07001809QDF_STATUS wlansap_start_beacon_req(struct sap_context *sap_ctx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001810{
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301811 QDF_STATUS qdf_ret_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001812 void *hHal = NULL;
1813 uint8_t dfsCacWaitStatus = 0;
1814 tpAniSirGlobal pMac = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001815
Jeff Johnson3abdd242017-09-25 19:21:33 -07001816 if (NULL == sap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301817 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001818 "%s: Invalid SAP pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301819 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001820 }
1821
Jeff Johnsonc0db3842017-09-13 18:34:28 -07001822 hHal = CDS_GET_HAL_CB();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001823 if (NULL == hHal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301824 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Jeff Johnson3abdd242017-09-25 19:21:33 -07001825 "%s: Invalid HAL pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301826 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001827 }
1828 pMac = PMAC_STRUCT(hHal);
1829
1830 /* No Radar was found during CAC WAIT, So start Beaconing */
1831 if (pMac->sap.SapDfsInfo.sap_radar_found_status == false) {
1832 /* CAC Wait done without any Radar Detection */
1833 dfsCacWaitStatus = true;
Jeff Johnson3abdd242017-09-25 19:21:33 -07001834 sap_ctx->pre_cac_complete = false;
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301835 qdf_ret_status = sme_roam_start_beacon_req(hHal,
Jeff Johnson3abdd242017-09-25 19:21:33 -07001836 sap_ctx->bssid,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001837 dfsCacWaitStatus);
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301838 if (qdf_ret_status == QDF_STATUS_SUCCESS) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301839 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001840 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301841 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001842 }
1843
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301844 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001845}
1846
Jeff Johnsonbfeafc62017-09-25 18:50:01 -07001847QDF_STATUS wlansap_dfs_send_csa_ie_request(struct sap_context *sap_ctx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001848{
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301849 QDF_STATUS qdf_ret_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001850 void *hHal = NULL;
1851 tpAniSirGlobal pMac = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001852
Jeff Johnsonbfeafc62017-09-25 18:50:01 -07001853 if (NULL == sap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301854 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001855 "%s: Invalid SAP pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301856 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001857 }
1858
Jeff Johnsonc0db3842017-09-13 18:34:28 -07001859 hHal = CDS_GET_HAL_CB();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001860 if (NULL == hHal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301861 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Jeff Johnsonbfeafc62017-09-25 18:50:01 -07001862 "%s: Invalid HAL pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301863 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001864 }
1865 pMac = PMAC_STRUCT(hHal);
1866
Sandeep Puligilla2111d3c2016-02-03 01:46:15 -08001867 pMac->sap.SapDfsInfo.new_ch_params.ch_width =
1868 pMac->sap.SapDfsInfo.new_chanWidth;
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07001869 wlan_reg_set_channel_params(pMac->pdev,
1870 pMac->sap.SapDfsInfo.target_channel,
1871 0, &pMac->sap.SapDfsInfo.new_ch_params);
Sandeep Puligilla2111d3c2016-02-03 01:46:15 -08001872
Chandrasekaran Manishekar4fcb7f52016-03-07 19:09:20 +05301873 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
1874 "%s: chan:%d req:%d width:%d off:%d",
1875 __func__, pMac->sap.SapDfsInfo.target_channel,
1876 pMac->sap.SapDfsInfo.csaIERequired,
1877 pMac->sap.SapDfsInfo.new_ch_params.ch_width,
1878 pMac->sap.SapDfsInfo.new_ch_params.sec_ch_offset);
1879
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301880 qdf_ret_status = sme_roam_csa_ie_request(hHal,
Jeff Johnsonbfeafc62017-09-25 18:50:01 -07001881 sap_ctx->bssid,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001882 pMac->sap.SapDfsInfo.target_channel,
1883 pMac->sap.SapDfsInfo.csaIERequired,
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08001884 &pMac->sap.SapDfsInfo.new_ch_params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001885
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301886 if (qdf_ret_status == QDF_STATUS_SUCCESS) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301887 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001888 }
1889
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301890 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001891}
1892
1893/*==========================================================================
1894 FUNCTION wlansap_get_dfs_ignore_cac
1895
1896 DESCRIPTION
1897 This API is used to get the value of ignore_cac value
1898
1899 DEPENDENCIES
1900 NA.
1901
1902 PARAMETERS
1903 IN
1904 hHal : HAL pointer
1905 pIgnore_cac : pointer to ignore_cac variable
1906
1907 RETURN VALUE
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301908 The QDF_STATUS code associated with performing the operation
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001909
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301910 QDF_STATUS_SUCCESS: Success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001911
1912 SIDE EFFECTS
1913 ============================================================================*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301914QDF_STATUS wlansap_get_dfs_ignore_cac(tHalHandle hHal, uint8_t *pIgnore_cac)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001915{
1916 tpAniSirGlobal pMac = NULL;
1917
1918 if (NULL != hHal) {
1919 pMac = PMAC_STRUCT(hHal);
1920 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301921 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001922 "%s: Invalid hHal pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301923 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001924 }
1925
1926 *pIgnore_cac = pMac->sap.SapDfsInfo.ignore_cac;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301927 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001928}
1929
1930/*==========================================================================
1931 FUNCTION wlansap_set_dfs_ignore_cac
1932
1933 DESCRIPTION
1934 This API is used to Set the value of ignore_cac value
1935
1936 DEPENDENCIES
1937 NA.
1938
1939 PARAMETERS
1940 IN
1941 hHal : HAL pointer
1942 ignore_cac : value to set for ignore_cac variable in DFS global structure.
1943
1944 RETURN VALUE
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301945 The QDF_STATUS code associated with performing the operation
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001946
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301947 QDF_STATUS_SUCCESS: Success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001948
1949 SIDE EFFECTS
1950 ============================================================================*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301951QDF_STATUS wlansap_set_dfs_ignore_cac(tHalHandle hHal, uint8_t ignore_cac)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001952{
1953 tpAniSirGlobal pMac = NULL;
1954
1955 if (NULL != hHal) {
1956 pMac = PMAC_STRUCT(hHal);
1957 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301958 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001959 "%s: Invalid hHal pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301960 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001961 }
1962
1963 pMac->sap.SapDfsInfo.ignore_cac = (ignore_cac >= true) ?
1964 true : false;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301965 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001966}
1967
1968/**
1969 * wlansap_set_dfs_restrict_japan_w53() - enable/disable dfS for japan
1970 * @hHal : HAL pointer
1971 * @disable_Dfs_JapanW3 :Indicates if Japan W53 is disabled when set to 1
1972 * Indicates if Japan W53 is enabled when set to 0
1973 *
1974 * This API is used to enable or disable Japan W53 Band
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301975 * Return: The QDF_STATUS code associated with performing the operation
1976 * QDF_STATUS_SUCCESS: Success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001977 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301978QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001979wlansap_set_dfs_restrict_japan_w53(tHalHandle hHal, uint8_t disable_Dfs_W53)
1980{
1981 tpAniSirGlobal pMac = NULL;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301982 QDF_STATUS status;
Amar Singhal5cccafe2017-02-15 12:42:58 -08001983 enum dfs_reg dfs_region;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001984
1985 if (NULL != hHal) {
1986 pMac = PMAC_STRUCT(hHal);
1987 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301988 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001989 "%s: Invalid hHal pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301990 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001991 }
1992
Amar Singhal7f55e342017-05-24 15:23:06 -07001993 wlan_reg_get_dfs_region(pMac->pdev, &dfs_region);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001994
1995 /*
1996 * Set the JAPAN W53 restriction only if the current
1997 * regulatory domain is JAPAN.
1998 */
Amar Singhal5cccafe2017-02-15 12:42:58 -08001999 if (DFS_MKK_REG == dfs_region) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002000 pMac->sap.SapDfsInfo.is_dfs_w53_disabled = disable_Dfs_W53;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302001 QDF_TRACE(QDF_MODULE_ID_SAP,
2002 QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002003 FL("sapdfs: SET DFS JAPAN W53 DISABLED = %d"),
2004 pMac->sap.SapDfsInfo.is_dfs_w53_disabled);
2005
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302006 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002007 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302008 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002009 FL
Srinivas Girigowda678586c2017-03-10 00:13:58 -08002010 ("Regdomain not japan, set disable JP W53 not valid"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002011
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302012 status = QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002013 }
2014
2015 return status;
2016}
2017
Jeff Johnsonbc110a72017-09-25 15:22:18 -07002018bool sap_is_auto_channel_select(struct sap_context *sapcontext)
bings394afdd2017-01-09 11:22:38 +08002019{
bings394afdd2017-01-09 11:22:38 +08002020 if (NULL == sapcontext) {
2021 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
2022 "%s: Invalid SAP pointer", __func__);
Jeff Johnsonbc110a72017-09-25 15:22:18 -07002023 return false;
bings394afdd2017-01-09 11:22:38 +08002024 }
2025 return sapcontext->channel == AUTO_CHANNEL_SELECT;
2026}
2027
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002028#ifdef FEATURE_AP_MCC_CH_AVOIDANCE
2029/**
2030 * wlan_sap_set_channel_avoidance() - sets sap mcc channel avoidance ini param
2031 * @hal: hal handle
2032 * @sap_channel_avoidance: ini parameter value
2033 *
2034 * sets sap mcc channel avoidance ini param, to be called in sap_start
2035 *
2036 * Return: success of failure of operation
2037 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302038QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002039wlan_sap_set_channel_avoidance(tHalHandle hal, bool sap_channel_avoidance)
2040{
2041 tpAniSirGlobal mac_ctx = NULL;
Srinivas Girigowda4d65ebe2017-10-13 21:41:42 -07002042
Pragaspathi Thilagarajb11dbe42018-07-23 16:42:17 +05302043 if (NULL != hal) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002044 mac_ctx = PMAC_STRUCT(hal);
Pragaspathi Thilagarajb11dbe42018-07-23 16:42:17 +05302045 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302046 QDF_TRACE(QDF_MODULE_ID_SAP,
2047 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002048 FL("hal or mac_ctx pointer NULL"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302049 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002050 }
2051 mac_ctx->sap.sap_channel_avoidance = sap_channel_avoidance;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302052 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002053}
2054#endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
2055
2056/**
2057 * wlansap_set_dfs_preferred_channel_location() - set dfs preferred channel
2058 * @hHal : HAL pointer
2059 * @dfs_Preferred_Channels_location :
2060 * 0 - Indicates No preferred channel location restrictions
2061 * 1 - Indicates SAP Indoor Channels operation only.
2062 * 2 - Indicates SAP Outdoor Channels operation only.
2063 *
2064 * This API is used to set sap preferred channels location
2065 * to resetrict the DFS random channel selection algorithm
2066 * either Indoor/Outdoor channels only.
2067 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302068 * Return: The QDF_STATUS code associated with performing the operation
2069 * QDF_STATUS_SUCCESS: Success and error code otherwise.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002070 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302071QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002072wlansap_set_dfs_preferred_channel_location(tHalHandle hHal,
2073 uint8_t
2074 dfs_Preferred_Channels_location)
2075{
2076 tpAniSirGlobal pMac = NULL;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302077 QDF_STATUS status;
Amar Singhal5cccafe2017-02-15 12:42:58 -08002078 enum dfs_reg dfs_region;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002079
2080 if (NULL != hHal) {
2081 pMac = PMAC_STRUCT(hHal);
2082 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302083 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002084 "%s: Invalid hHal pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302085 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002086 }
2087
Amar Singhal7f55e342017-05-24 15:23:06 -07002088 wlan_reg_get_dfs_region(pMac->pdev, &dfs_region);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002089
2090 /*
2091 * The Indoor/Outdoor only random channel selection
2092 * restriction is currently enforeced only for
2093 * JAPAN regulatory domain.
2094 */
Amar Singhal5cccafe2017-02-15 12:42:58 -08002095 if (DFS_MKK_REG == dfs_region) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002096 pMac->sap.SapDfsInfo.sap_operating_chan_preferred_location =
2097 dfs_Preferred_Channels_location;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302098 QDF_TRACE(QDF_MODULE_ID_SAP,
2099 QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002100 FL
2101 ("sapdfs:Set Preferred Operating Channel location=%d"),
2102 pMac->sap.SapDfsInfo.
2103 sap_operating_chan_preferred_location);
2104
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302105 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002106 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302107 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002108 FL
2109 ("sapdfs:NOT JAPAN REG, Invalid Set preferred chans location"));
2110
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302111 status = QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002112 }
2113
2114 return status;
2115}
2116
2117/*==========================================================================
2118 FUNCTION wlansap_set_dfs_target_chnl
2119
2120 DESCRIPTION
2121 This API is used to set next target chnl as provided channel.
2122 you can provide any valid channel to this API.
2123
2124 DEPENDENCIES
2125 NA.
2126
2127 PARAMETERS
2128 IN
2129 hHal : HAL pointer
2130 target_channel : target channel to be set
2131
2132 RETURN VALUE
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302133 The QDF_STATUS code associated with performing the operation
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002134
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302135 QDF_STATUS_SUCCESS: Success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002136
2137 SIDE EFFECTS
2138 ============================================================================*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302139QDF_STATUS wlansap_set_dfs_target_chnl(tHalHandle hHal, uint8_t target_channel)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002140{
2141 tpAniSirGlobal pMac = NULL;
2142
2143 if (NULL != hHal) {
2144 pMac = PMAC_STRUCT(hHal);
2145 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302146 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002147 "%s: Invalid hHal pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302148 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002149 }
2150 if (target_channel > 0) {
2151 pMac->sap.SapDfsInfo.user_provided_target_channel =
2152 target_channel;
2153 } else {
2154 pMac->sap.SapDfsInfo.user_provided_target_channel = 0;
2155 }
2156
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302157 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002158}
2159
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302160QDF_STATUS
Jeff Johnsone4c11db2018-05-05 23:22:32 -07002161wlansap_update_sap_config_add_ie(tsap_config_t *pConfig,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002162 const uint8_t *pAdditionIEBuffer,
2163 uint16_t additionIELength,
2164 eUpdateIEsType updateType)
2165{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302166 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002167 uint8_t bufferValid = false;
2168 uint16_t bufferLength = 0;
2169 uint8_t *pBuffer = NULL;
2170
2171 if (NULL == pConfig) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302172 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002173 }
2174
2175 if ((pAdditionIEBuffer != NULL) && (additionIELength != 0)) {
2176 /* initialize the buffer pointer so that pe can copy */
2177 if (additionIELength > 0) {
2178 bufferLength = additionIELength;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302179 pBuffer = qdf_mem_malloc(bufferLength);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002180 if (NULL == pBuffer) {
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -08002181 QDF_TRACE(QDF_MODULE_ID_SAP,
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302182 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002183 FL("Could not allocate the buffer "));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302184 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002185 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302186 qdf_mem_copy(pBuffer, pAdditionIEBuffer, bufferLength);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002187 bufferValid = true;
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -08002188 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
2189 FL("update_type: %d"), updateType);
2190 qdf_trace_hex_dump(QDF_MODULE_ID_SAP,
2191 QDF_TRACE_LEVEL_INFO, pBuffer, bufferLength);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002192 }
2193 }
2194
2195 switch (updateType) {
2196 case eUPDATE_IE_PROBE_BCN:
Jiachao Wuc279f972018-01-22 15:38:33 +08002197 if (pConfig->pProbeRespBcnIEsBuffer)
2198 qdf_mem_free(pConfig->pProbeRespBcnIEsBuffer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002199 if (bufferValid) {
2200 pConfig->probeRespBcnIEsLen = bufferLength;
2201 pConfig->pProbeRespBcnIEsBuffer = pBuffer;
2202 } else {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002203 pConfig->probeRespBcnIEsLen = 0;
2204 pConfig->pProbeRespBcnIEsBuffer = NULL;
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -08002205 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
2206 FL("No Probe Resp beacone IE received in set beacon"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002207 }
2208 break;
2209 case eUPDATE_IE_PROBE_RESP:
Jiachao Wuc279f972018-01-22 15:38:33 +08002210 if (pConfig->pProbeRespIEsBuffer)
2211 qdf_mem_free(pConfig->pProbeRespIEsBuffer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002212 if (bufferValid) {
2213 pConfig->probeRespIEsBufferLen = bufferLength;
2214 pConfig->pProbeRespIEsBuffer = pBuffer;
2215 } else {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002216 pConfig->probeRespIEsBufferLen = 0;
2217 pConfig->pProbeRespIEsBuffer = NULL;
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -08002218 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
2219 FL("No Probe Response IE received in set beacon"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002220 }
2221 break;
2222 case eUPDATE_IE_ASSOC_RESP:
Jiachao Wuc279f972018-01-22 15:38:33 +08002223 if (pConfig->pAssocRespIEsBuffer)
2224 qdf_mem_free(pConfig->pAssocRespIEsBuffer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002225 if (bufferValid) {
2226 pConfig->assocRespIEsLen = bufferLength;
2227 pConfig->pAssocRespIEsBuffer = pBuffer;
2228 } else {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002229 pConfig->assocRespIEsLen = 0;
2230 pConfig->pAssocRespIEsBuffer = NULL;
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -08002231 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
2232 FL("No Assoc Response IE received in set beacon"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002233 }
2234 break;
2235 default:
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -08002236 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002237 FL("No matching buffer type %d"), updateType);
2238 if (pBuffer != NULL)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302239 qdf_mem_free(pBuffer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002240 break;
2241 }
2242
2243 return status;
2244}
2245
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302246QDF_STATUS
Jeff Johnsone4c11db2018-05-05 23:22:32 -07002247wlansap_reset_sap_config_add_ie(tsap_config_t *pConfig, eUpdateIEsType updateType)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002248{
2249 if (NULL == pConfig) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302250 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002251 "%s: Invalid Config pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302252 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002253 }
2254
2255 switch (updateType) {
2256 case eUPDATE_IE_ALL: /*only used to reset */
2257 case eUPDATE_IE_PROBE_RESP:
Arunk Khandavalli96c122f2017-10-17 11:49:36 +05302258 if (pConfig->pProbeRespIEsBuffer) {
2259 qdf_mem_free(pConfig->pProbeRespIEsBuffer);
2260 pConfig->probeRespIEsBufferLen = 0;
2261 pConfig->pProbeRespIEsBuffer = NULL;
2262 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002263 if (eUPDATE_IE_ALL != updateType)
2264 break;
2265
2266 case eUPDATE_IE_ASSOC_RESP:
Arunk Khandavalli96c122f2017-10-17 11:49:36 +05302267 if (pConfig->pAssocRespIEsBuffer) {
2268 qdf_mem_free(pConfig->pAssocRespIEsBuffer);
2269 pConfig->assocRespIEsLen = 0;
2270 pConfig->pAssocRespIEsBuffer = NULL;
2271 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002272 if (eUPDATE_IE_ALL != updateType)
2273 break;
2274
2275 case eUPDATE_IE_PROBE_BCN:
Arunk Khandavalli96c122f2017-10-17 11:49:36 +05302276 if (pConfig->pProbeRespBcnIEsBuffer) {
2277 qdf_mem_free(pConfig->pProbeRespBcnIEsBuffer);
2278 pConfig->probeRespBcnIEsLen = 0;
2279 pConfig->pProbeRespBcnIEsBuffer = NULL;
2280 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002281 if (eUPDATE_IE_ALL != updateType)
2282 break;
2283
2284 default:
2285 if (eUPDATE_IE_ALL != updateType)
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302286 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002287 FL("Invalid buffer type %d"), updateType);
2288 break;
2289 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302290 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002291}
2292
2293/*==========================================================================
2294 FUNCTION wlansap_extend_to_acs_range
2295
2296 DESCRIPTION Function extends give channel range to consider ACS chan bonding
2297
2298 DEPENDENCIES PARAMETERS
2299
2300 IN /OUT
2301 *startChannelNum : ACS extend start ch
2302 *endChannelNum : ACS extended End ch
2303 *bandStartChannel: Band start ch
2304 *bandEndChannel : Band end ch
2305
2306 RETURN VALUE NONE
2307
2308 SIDE EFFECTS
2309 ============================================================================*/
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07002310void wlansap_extend_to_acs_range(tHalHandle hal, uint8_t *startChannelNum,
2311 uint8_t *endChannelNum, uint8_t *bandStartChannel,
2312 uint8_t *bandEndChannel)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002313{
2314#define ACS_WLAN_20M_CH_INC 4
2315#define ACS_2G_EXTEND ACS_WLAN_20M_CH_INC
2316#define ACS_5G_EXTEND (ACS_WLAN_20M_CH_INC * 3)
2317
2318 uint8_t tmp_startChannelNum = 0, tmp_endChannelNum = 0;
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07002319 tpAniSirGlobal mac_ctx;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002320
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07002321 mac_ctx = PMAC_STRUCT(hal);
2322 if (!mac_ctx) {
2323 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
2324 "%s: Invalid mac_ctx", __func__);
2325 return;
2326 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002327 if (*startChannelNum <= 14 && *endChannelNum <= 14) {
Amar Singhalb8d4f152016-02-10 10:21:43 -08002328 *bandStartChannel = CHAN_ENUM_1;
2329 *bandEndChannel = CHAN_ENUM_14;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002330 tmp_startChannelNum = *startChannelNum > 5 ?
2331 (*startChannelNum - ACS_2G_EXTEND) : 1;
2332 tmp_endChannelNum = (*endChannelNum + ACS_2G_EXTEND) <= 14 ?
2333 (*endChannelNum + ACS_2G_EXTEND) : 14;
2334 } else if (*startChannelNum >= 36 && *endChannelNum >= 36) {
Amar Singhalb8d4f152016-02-10 10:21:43 -08002335 *bandStartChannel = CHAN_ENUM_36;
Kiran Kumar Lokere1a43bcf2018-05-15 15:51:58 -07002336 *bandEndChannel = CHAN_ENUM_173;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002337 tmp_startChannelNum = (*startChannelNum - ACS_5G_EXTEND) > 36 ?
2338 (*startChannelNum - ACS_5G_EXTEND) : 36;
Kiran Kumar Lokere1a43bcf2018-05-15 15:51:58 -07002339 tmp_endChannelNum = (*endChannelNum + ACS_5G_EXTEND) <=
2340 WNI_CFG_CURRENT_CHANNEL_STAMAX ?
2341 (*endChannelNum + ACS_5G_EXTEND) :
2342 WNI_CFG_CURRENT_CHANNEL_STAMAX;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002343 } else {
Amar Singhalb8d4f152016-02-10 10:21:43 -08002344 *bandStartChannel = CHAN_ENUM_1;
Kiran Kumar Lokere1a43bcf2018-05-15 15:51:58 -07002345 *bandEndChannel = CHAN_ENUM_173;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002346 tmp_startChannelNum = *startChannelNum > 5 ?
2347 (*startChannelNum - ACS_2G_EXTEND) : 1;
Kiran Kumar Lokere1a43bcf2018-05-15 15:51:58 -07002348 tmp_endChannelNum = (*endChannelNum + ACS_5G_EXTEND) <=
2349 WNI_CFG_CURRENT_CHANNEL_STAMAX ?
2350 (*endChannelNum + ACS_5G_EXTEND) :
2351 WNI_CFG_CURRENT_CHANNEL_STAMAX;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002352 }
2353
2354 /* Note if the ACS range include only DFS channels, do not cross range
2355 * Active scanning in adjacent non DFS channels results in transmission
2356 * spikes in DFS specturm channels which is due to emission spill.
2357 * Remove the active channels from extend ACS range for DFS only range
2358 */
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07002359 if (wlan_reg_is_dfs_ch(mac_ctx->pdev, *startChannelNum)) {
2360 while (!wlan_reg_is_dfs_ch(mac_ctx->pdev,
2361 tmp_startChannelNum) &&
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002362 tmp_startChannelNum < *startChannelNum)
2363 tmp_startChannelNum += ACS_WLAN_20M_CH_INC;
2364
2365 *startChannelNum = tmp_startChannelNum;
2366 }
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07002367 if (wlan_reg_is_dfs_ch(mac_ctx->pdev, *endChannelNum)) {
2368 while (!wlan_reg_is_dfs_ch(mac_ctx->pdev,
2369 tmp_endChannelNum) &&
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002370 tmp_endChannelNum > *endChannelNum)
2371 tmp_endChannelNum -= ACS_WLAN_20M_CH_INC;
2372
2373 *endChannelNum = tmp_endChannelNum;
2374 }
2375}
2376
Jeff Johnsoned4ed172017-09-25 18:36:16 -07002377QDF_STATUS wlan_sap_set_vendor_acs(struct sap_context *sap_context,
2378 bool is_vendor_acs)
Kapil Gupta8878ad92017-02-13 11:56:04 +05302379{
Kapil Gupta8878ad92017-02-13 11:56:04 +05302380 if (!sap_context) {
2381 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
2382 "%s: Invalid SAP pointer", __func__);
2383 return QDF_STATUS_E_FAULT;
2384 }
Himanshu Agarwaldfc4dca2017-08-29 19:49:05 +05302385 sap_context->vendor_acs_dfs_lte_enabled = is_vendor_acs;
Kapil Gupta8878ad92017-02-13 11:56:04 +05302386
2387 return QDF_STATUS_SUCCESS;
2388}
Jeff Johnsonb26e2702017-09-25 18:31:14 -07002389
Wen Gong01a2c632018-04-11 18:34:55 +08002390#ifdef DFS_COMPONENT_ENABLE
Jeff Johnsonb3c4f7e2017-09-25 18:23:05 -07002391QDF_STATUS wlansap_set_dfs_nol(struct sap_context *sap_ctx,
2392 eSapDfsNolType conf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002393{
Arif Hussaincd151632017-02-11 16:57:19 -08002394 void *hal = NULL;
2395 tpAniSirGlobal mac = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002396
Arif Hussaincd151632017-02-11 16:57:19 -08002397 if (!sap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302398 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Jeff Johnsonb3c4f7e2017-09-25 18:23:05 -07002399 "%s: Invalid SAP pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302400 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002401 }
Arif Hussaincd151632017-02-11 16:57:19 -08002402
Jeff Johnsonc0db3842017-09-13 18:34:28 -07002403 hal = CDS_GET_HAL_CB();
Arif Hussaincd151632017-02-11 16:57:19 -08002404 if (!hal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302405 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Jeff Johnsonb3c4f7e2017-09-25 18:23:05 -07002406 "%s: Invalid HAL pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302407 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002408 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002409
Arif Hussaincd151632017-02-11 16:57:19 -08002410 mac = PMAC_STRUCT(hal);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002411
2412 if (conf == eSAP_DFS_NOL_CLEAR) {
Arif Hussaincd151632017-02-11 16:57:19 -08002413 struct wlan_objmgr_pdev *pdev;
2414
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302415 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002416 "%s: clear the DFS NOL", __func__);
2417
Arif Hussaincd151632017-02-11 16:57:19 -08002418 pdev = mac->pdev;
2419 if (!pdev) {
2420 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
2421 "%s: null pdev", __func__);
2422 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002423 }
Arif Hussain4549efa2017-10-10 17:10:47 -07002424 utils_dfs_clear_nol_channels(pdev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002425 } else if (conf == eSAP_DFS_NOL_RANDOMIZE) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302426 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002427 "%s: Randomize the DFS NOL", __func__);
2428
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002429 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302430 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002431 "%s: unsupport type %d", __func__, conf);
2432 }
2433
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302434 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002435}
Wen Gong01a2c632018-04-11 18:34:55 +08002436#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002437
2438/**
2439 * wlansap_populate_del_sta_params() - populate delete station parameter
2440 * @mac: Pointer to peer mac address.
2441 * @reason_code: Reason code for the disassoc/deauth.
2442 * @subtype: Subtype points to either disassoc/deauth frame.
2443 * @pDelStaParams: Address where parameters to be populated.
2444 *
2445 * This API is used to populate delete station parameter structure
2446 *
2447 * Return: none
2448 */
2449
2450void wlansap_populate_del_sta_params(const uint8_t *mac,
2451 uint16_t reason_code,
2452 uint8_t subtype,
Jeff Johnsone6bf7192017-11-07 15:16:09 -08002453 struct csr_del_sta_params *pDelStaParams)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002454{
2455 if (NULL == mac)
Anurag Chouhanc5548422016-02-24 18:33:27 +05302456 qdf_set_macaddr_broadcast(&pDelStaParams->peerMacAddr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002457 else
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302458 qdf_mem_copy(pDelStaParams->peerMacAddr.bytes, mac,
Anurag Chouhan6d760662016-02-20 16:05:43 +05302459 QDF_MAC_ADDR_SIZE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002460
2461 if (reason_code == 0)
2462 pDelStaParams->reason_code = eSIR_MAC_DEAUTH_LEAVING_BSS_REASON;
2463 else
2464 pDelStaParams->reason_code = reason_code;
2465
2466 if (subtype == (SIR_MAC_MGMT_DEAUTH >> 4) ||
2467 subtype == (SIR_MAC_MGMT_DISASSOC >> 4))
2468 pDelStaParams->subtype = subtype;
2469 else
2470 pDelStaParams->subtype = (SIR_MAC_MGMT_DEAUTH >> 4);
2471
Srinivas Girigowda678586c2017-03-10 00:13:58 -08002472 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002473 FL(
2474 "Delete STA with RC:%hu subtype:%hhu MAC::"
2475 MAC_ADDRESS_STR),
2476 pDelStaParams->reason_code, pDelStaParams->subtype,
2477 MAC_ADDR_ARRAY(pDelStaParams->peerMacAddr.bytes));
2478}
2479
Jeff Johnson630fd6a2017-09-25 15:27:39 -07002480QDF_STATUS wlansap_acs_chselect(struct sap_context *sap_context,
2481 tpWLAN_SAPEventCB pacs_event_callback,
Jeff Johnsone4c11db2018-05-05 23:22:32 -07002482 tsap_config_t *pconfig,
Jeff Johnson630fd6a2017-09-25 15:27:39 -07002483 void *pusr_context)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002484{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002485 tHalHandle h_hal = NULL;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302486 QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002487 tpAniSirGlobal pmac = NULL;
2488
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002489 if (NULL == sap_context) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302490 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Jeff Johnson630fd6a2017-09-25 15:27:39 -07002491 "%s: Invalid SAP pointer", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002492
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302493 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002494 }
2495
Jeff Johnsonc0db3842017-09-13 18:34:28 -07002496 h_hal = (tHalHandle)CDS_GET_HAL_CB();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002497 if (NULL == h_hal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302498 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Jeff Johnson630fd6a2017-09-25 15:27:39 -07002499 "%s: Invalid MAC context", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302500 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002501 }
2502
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002503 pmac = PMAC_STRUCT(h_hal);
2504 sap_context->acs_cfg = &pconfig->acs_cfg;
2505 sap_context->ch_width_orig = pconfig->acs_cfg.ch_width;
2506 sap_context->csr_roamProfile.phyMode = pconfig->acs_cfg.hw_mode;
2507
Peng Xu66162de2016-02-11 17:01:20 -08002508 /*
2509 * Now, configure the scan and ACS channel params
2510 * to issue a scan request.
2511 */
2512 wlansap_set_scan_acs_channel_params(pconfig, sap_context,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002513 pusr_context);
2514
Peng Xu66162de2016-02-11 17:01:20 -08002515 /*
2516 * Copy the HDD callback function to report the
2517 * ACS result after scan in SAP context callback function.
2518 */
2519 sap_context->pfnSapEventCallback = pacs_event_callback;
2520 /*
2521 * init dfs channel nol
2522 */
2523 sap_init_dfs_channel_nol_list(sap_context);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002524
Peng Xu66162de2016-02-11 17:01:20 -08002525 /*
2526 * Issue the scan request. This scan request is
2527 * issued before the start BSS is done so
2528 *
2529 * 1. No need to pass the second parameter
2530 * as the SAP state machine is not started yet
2531 * and there is no need for any event posting.
2532 *
2533 * 2. Set third parameter to TRUE to indicate the
2534 * channel selection function to register a
Jeff Johnsonc7e4d162018-05-12 16:20:34 -07002535 * different scan callback function to process
Peng Xu66162de2016-02-11 17:01:20 -08002536 * the results pre start BSS.
2537 */
Abhishek Singh53791fa2018-06-14 14:02:50 +05302538 qdf_status = sap_channel_sel(sap_context);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002539
Peng Xu66162de2016-02-11 17:01:20 -08002540 if (QDF_STATUS_E_ABORTED == qdf_status) {
2541 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002542 "In %s,DFS not supported in the current operating mode",
2543 __func__);
Peng Xu66162de2016-02-11 17:01:20 -08002544 return QDF_STATUS_E_FAILURE;
2545 } else if (QDF_STATUS_E_CANCELED == qdf_status) {
2546 /*
2547 * ERROR is returned when either the SME scan request
2548 * failed or ACS is overridden due to other constrainst
2549 * So send selected channel to HDD
2550 */
2551 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
2552 FL("Scan Req Failed/ACS Overridden"));
2553 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
2554 FL("Selected channel = %d"),
2555 sap_context->channel);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002556
Peng Xu66162de2016-02-11 17:01:20 -08002557 return sap_signal_hdd_event(sap_context, NULL,
2558 eSAP_ACS_CHANNEL_SELECTED,
2559 (void *) eSAP_STATUS_SUCCESS);
2560 } else if (QDF_STATUS_SUCCESS == qdf_status) {
2561 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002562 FL("Successfully Issued a Pre Start Bss Scan Request"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002563 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302564 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002565}
2566
2567/**
2568 * wlan_sap_enable_phy_error_logs() - Enable DFS phy error logs
2569 * @hal: global hal handle
2570 * @enable_log: value to set
2571 *
2572 * Since the frequency of DFS phy error is very high, enabling logs for them
2573 * all the times can cause crash and will also create lot of useless logs
2574 * causing difficulties in debugging other issue. This function will be called
2575 * from iwpriv cmd to eanble such logs temporarily.
2576 *
2577 * Return: void
2578 */
bings10f26452018-01-21 15:37:46 +08002579void wlan_sap_enable_phy_error_logs(tHalHandle hal, uint32_t enable_log)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002580{
bings10f26452018-01-21 15:37:46 +08002581 int error;
2582
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002583 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Srinivas Girigowda4d65ebe2017-10-13 21:41:42 -07002584
bings10f26452018-01-21 15:37:46 +08002585 mac_ctx->sap.enable_dfs_phy_error_logs = !!enable_log;
2586 tgt_dfs_control(mac_ctx->pdev, DFS_SET_DEBUG_LEVEL, &enable_log,
2587 sizeof(uint32_t), NULL, NULL, &error);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002588}
Kai Liubdd5fcb2016-09-28 22:55:44 +08002589
Jeff Johnson92675a52017-09-25 15:35:19 -07002590uint32_t wlansap_get_chan_width(struct sap_context *sap_ctx)
Kai Liubdd5fcb2016-09-28 22:55:44 +08002591{
Jeff Johnson92675a52017-09-25 15:35:19 -07002592 return wlan_sap_get_vht_ch_width(sap_ctx);
Kai Liubdd5fcb2016-09-28 22:55:44 +08002593}
Yingying Tangb4832f72016-10-20 13:44:55 +08002594
Yingying Tangb4832f72016-10-20 13:44:55 +08002595QDF_STATUS wlansap_set_tx_leakage_threshold(tHalHandle hal,
2596 uint16_t tx_leakage_threshold)
2597{
2598 tpAniSirGlobal mac;
2599
2600 if (NULL == hal) {
2601 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
2602 "%s: Invalid hal pointer", __func__);
2603 return QDF_STATUS_E_FAULT;
2604 }
2605
2606 mac = PMAC_STRUCT(hal);
bings1826d9c2018-01-23 16:14:01 +08002607 tgt_dfs_set_tx_leakage_threshold(mac->pdev, tx_leakage_threshold);
Yingying Tangb4832f72016-10-20 13:44:55 +08002608 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
2609 "%s: leakage_threshold %d", __func__,
bings1826d9c2018-01-23 16:14:01 +08002610 tx_leakage_threshold);
Yingying Tangb4832f72016-10-20 13:44:55 +08002611 return QDF_STATUS_SUCCESS;
2612}
Wu Gao36717432016-11-21 15:09:48 +08002613
Jeff Johnson104433a2017-09-25 15:39:43 -07002614QDF_STATUS wlansap_set_invalid_session(struct sap_context *sap_ctx)
Wu Gao36717432016-11-21 15:09:48 +08002615{
Jeff Johnson104433a2017-09-25 15:39:43 -07002616 if (NULL == sap_ctx) {
Wu Gao36717432016-11-21 15:09:48 +08002617 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Jeff Johnson104433a2017-09-25 15:39:43 -07002618 FL("Invalid SAP pointer"));
Wu Gao36717432016-11-21 15:09:48 +08002619 return QDF_STATUS_E_FAILURE;
2620 }
2621
Jeff Johnson104433a2017-09-25 15:39:43 -07002622 sap_ctx->sessionId = CSR_SESSION_ID_INVALID;
Wu Gao36717432016-11-21 15:09:48 +08002623
2624 return QDF_STATUS_SUCCESS;
2625}
Wu Gao3545e642017-07-14 19:24:41 +08002626
Jeff Johnson14ec0682017-09-25 15:44:03 -07002627void wlansap_cleanup_cac_timer(struct sap_context *sap_ctx)
Wu Gao3545e642017-07-14 19:24:41 +08002628{
2629 tHalHandle hal;
Wu Gao3545e642017-07-14 19:24:41 +08002630 tpAniSirGlobal pmac;
2631
Jeff Johnson14ec0682017-09-25 15:44:03 -07002632 if (!sap_ctx) {
Wu Gao35a5cfe2017-07-27 16:31:02 +08002633 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
2634 FL("Invalid SAP context"));
Wu Gao3545e642017-07-14 19:24:41 +08002635 return;
Wu Gao35a5cfe2017-07-27 16:31:02 +08002636 }
Wu Gao3545e642017-07-14 19:24:41 +08002637
Jeff Johnsonc0db3842017-09-13 18:34:28 -07002638 hal = CDS_GET_HAL_CB();
Wu Gao35a5cfe2017-07-27 16:31:02 +08002639 if (!hal) {
2640 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
2641 FL("Invalid hal pointer"));
2642 return;
2643 }
2644
Wu Gao3545e642017-07-14 19:24:41 +08002645 pmac = PMAC_STRUCT(hal);
2646 if (pmac->sap.SapDfsInfo.is_dfs_cac_timer_running) {
2647 qdf_mc_timer_stop(&pmac->sap.SapDfsInfo.
2648 sap_dfs_cac_timer);
2649 pmac->sap.SapDfsInfo.is_dfs_cac_timer_running = 0;
2650 qdf_mc_timer_destroy(
2651 &pmac->sap.SapDfsInfo.sap_dfs_cac_timer);
2652 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
2653 FL("sapdfs, force cleanup running dfs cac timer"));
2654 }
2655}