blob: 610899f308ebb9a0c449dd1064813883154b3e71 [file] [log] [blame]
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001/*
bings394afdd2017-01-09 11:22:38 +08002 * Copyright (c) 2012-2017 The Linux Foundation. All rights reserved.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003 *
4 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
5 *
6 *
7 * Permission to use, copy, modify, and/or distribute this software for
8 * any purpose with or without fee is hereby granted, provided that the
9 * above copyright notice and this permission notice appear in all
10 * copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
13 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
14 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
15 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
16 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
17 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
18 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19 * PERFORMANCE OF THIS SOFTWARE.
20 */
21
22/*
23 * This file was originally distributed by Qualcomm Atheros, Inc.
24 * under proprietary terms before Copyright ownership was assigned
25 * to the Linux Foundation.
26 */
27
28/**
29 * ===========================================================================
30 * sapModule.C
31 * OVERVIEW:
32 * This software unit holds the implementation of the WLAN SAP modules
33 * functions providing EXTERNAL APIs. It is also where the global SAP module
34 * context gets initialised
35 * DEPENDENCIES:
36 * Are listed for each API below.
37 * ===========================================================================
38 */
39
40/* $Header$ */
41
42/*----------------------------------------------------------------------------
43 * Include Files
44 * -------------------------------------------------------------------------*/
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053045#include "qdf_trace.h"
Anurag Chouhanc5548422016-02-24 18:33:27 +053046#include "qdf_util.h"
Manishekar Chandrasekaranf7a1dad2016-06-23 06:43:47 +053047#include "qdf_atomic.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080048/* Pick up the sme callback registration API */
49#include "sme_api.h"
50
51/* SAP API header file */
52
53#include "sap_internal.h"
54#include "sme_inside.h"
55#include "cds_ieee80211_common_i.h"
Naveen Rawat3b6068c2016-04-14 19:01:06 -070056#include "cds_regdomain.h"
Tushnim Bhattacharyya66348bd2017-03-09 15:02:10 -080057#include "wlan_policy_mgr_api.h"
Tushnim Bhattacharyya45ed04f2017-03-15 10:15:05 -070058#include <wlan_scan_ucfg_api.h>
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070059#include "wlan_reg_services_api.h"
Arif Hussaincd151632017-02-11 16:57:19 -080060#include <wlan_dfs_utils_api.h>
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -070061#include <wlan_reg_ucfg_api.h>
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080062
63/*----------------------------------------------------------------------------
64 * Preprocessor Definitions and Constants
65 * -------------------------------------------------------------------------*/
66#define SAP_DEBUG
67
68/*----------------------------------------------------------------------------
69 * Type Declarations
70 * -------------------------------------------------------------------------*/
71
72/*----------------------------------------------------------------------------
73 * Global Data Definitions
74 * -------------------------------------------------------------------------*/
75
76/*----------------------------------------------------------------------------
77 * External declarations for global context
78 * -------------------------------------------------------------------------*/
79/* No! Get this from CDS. */
80/* The main per-Physical Link (per WLAN association) context. */
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -070081static struct sap_context *gp_sap_ctx[SAP_MAX_NUM_SESSION];
Manishekar Chandrasekaranf7a1dad2016-06-23 06:43:47 +053082static qdf_atomic_t sap_ctx_ref_count[SAP_MAX_NUM_SESSION];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080083
84/*----------------------------------------------------------------------------
85 * Static Variable Definitions
86 * -------------------------------------------------------------------------*/
Manishekar Chandrasekaranf7a1dad2016-06-23 06:43:47 +053087static qdf_mutex_t sap_context_lock;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080088
89/*----------------------------------------------------------------------------
90 * Static Function Declarations and Definitions
91 * -------------------------------------------------------------------------*/
92
93/*----------------------------------------------------------------------------
94 * Externalized Function Definitions
95 * -------------------------------------------------------------------------*/
96
97/*----------------------------------------------------------------------------
98 * Function Declarations and Documentation
99 * -------------------------------------------------------------------------*/
100
101/**
Manishekar Chandrasekaranf7a1dad2016-06-23 06:43:47 +0530102 * wlansap_global_init() - Initialize SAP globals
103 *
104 * Initializes the SAP global data structures
105 *
106 * Return: QDF_STATUS
107 */
108QDF_STATUS wlansap_global_init(void)
109{
110 uint32_t i;
111
112 if (QDF_IS_STATUS_ERROR(qdf_mutex_create(&sap_context_lock))) {
113 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
114 "failed to init sap_context_lock");
115 return QDF_STATUS_E_FAULT;
116 }
117
118 for (i = 0; i < SAP_MAX_NUM_SESSION; i++) {
119 gp_sap_ctx[i] = NULL;
120 qdf_atomic_init(&sap_ctx_ref_count[i]);
121 }
122
Srinivas Girigowda678586c2017-03-10 00:13:58 -0800123 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG,
Manishekar Chandrasekaranf7a1dad2016-06-23 06:43:47 +0530124 "%s: sap global context initialized", __func__);
125
126 return QDF_STATUS_SUCCESS;
127}
128
129/**
130 * wlansap_global_deinit() - De-initialize SAP globals
131 *
132 * De-initializes the SAP global data structures
133 *
134 * Return: QDF_STATUS
135 */
136QDF_STATUS wlansap_global_deinit(void)
137{
138 uint32_t i;
139
140 for (i = 0; i < SAP_MAX_NUM_SESSION; i++) {
141 if (gp_sap_ctx[i]) {
142 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
143 "we could be leaking context:%d", i);
144 }
145 gp_sap_ctx[i] = NULL;
146 qdf_atomic_init(&sap_ctx_ref_count[i]);
147 }
148
149 if (QDF_IS_STATUS_ERROR(qdf_mutex_destroy(&sap_context_lock))) {
150 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
151 "failed to destroy sap_context_lock");
152 return QDF_STATUS_E_FAULT;
153 }
154
Srinivas Girigowda678586c2017-03-10 00:13:58 -0800155 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG,
Manishekar Chandrasekaranf7a1dad2016-06-23 06:43:47 +0530156 "%s: sap global context deinitialized", __func__);
157
158 return QDF_STATUS_SUCCESS;
159}
160
161/**
162 * wlansap_save_context() - Save the context in global SAP context
163 * @ctx: SAP context to be stored
164 *
165 * Stores the given SAP context in the global SAP context array
166 *
167 * Return: QDF_STATUS
168 */
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -0700169static QDF_STATUS wlansap_save_context(struct sap_context *ctx)
Manishekar Chandrasekaranf7a1dad2016-06-23 06:43:47 +0530170{
171 uint32_t i;
172
173 qdf_mutex_acquire(&sap_context_lock);
174 for (i = 0; i < SAP_MAX_NUM_SESSION; i++) {
175 if (gp_sap_ctx[i] == NULL) {
176 gp_sap_ctx[i] = ctx;
177 qdf_atomic_inc(&sap_ctx_ref_count[i]);
178 qdf_mutex_release(&sap_context_lock);
Srinivas Girigowda678586c2017-03-10 00:13:58 -0800179 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG,
180 "%s: sap context saved at index: %d",
Manishekar Chandrasekaranf7a1dad2016-06-23 06:43:47 +0530181 __func__, i);
182 return QDF_STATUS_SUCCESS;
183 }
184 }
185 qdf_mutex_release(&sap_context_lock);
186
187 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
188 "%s: failed to save sap context", __func__);
189
190 return QDF_STATUS_E_FAILURE;
191}
192
193/**
194 * wlansap_context_get() - Verify SAP context and increment ref count
195 * @ctx: Context to be checked
196 *
197 * Verifies the SAP context and increments the reference count maintained for
198 * the corresponding SAP context.
199 *
200 * Return: QDF_STATUS
201 */
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -0700202QDF_STATUS wlansap_context_get(struct sap_context *ctx)
Manishekar Chandrasekaranf7a1dad2016-06-23 06:43:47 +0530203{
204 uint32_t i;
205
206 qdf_mutex_acquire(&sap_context_lock);
207 for (i = 0; i < SAP_MAX_NUM_SESSION; i++) {
208 if (ctx && (gp_sap_ctx[i] == ctx)) {
209 qdf_atomic_inc(&sap_ctx_ref_count[i]);
210 qdf_mutex_release(&sap_context_lock);
211 return QDF_STATUS_SUCCESS;
212 }
213 }
214 qdf_mutex_release(&sap_context_lock);
215
216 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
217 "%s: sap session is not valid", __func__);
218 return QDF_STATUS_E_FAILURE;
219}
220
221/**
222 * wlansap_context_put() - Check the reference count and free SAP context
223 * @ctx: SAP context to be checked and freed
224 *
225 * Checks the reference count and frees the SAP context
226 *
227 * Return: None
228 */
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -0700229void wlansap_context_put(struct sap_context *ctx)
Manishekar Chandrasekaranf7a1dad2016-06-23 06:43:47 +0530230{
231 uint32_t i;
232
233 if (!ctx)
234 return;
235
236 qdf_mutex_acquire(&sap_context_lock);
237 for (i = 0; i < SAP_MAX_NUM_SESSION; i++) {
238 if (gp_sap_ctx[i] == ctx) {
239 if (qdf_atomic_dec_and_test(&sap_ctx_ref_count[i])) {
240 qdf_mem_free(ctx);
241 gp_sap_ctx[i] = NULL;
242 QDF_TRACE(QDF_MODULE_ID_SAP,
Srinivas Girigowda678586c2017-03-10 00:13:58 -0800243 QDF_TRACE_LEVEL_DEBUG,
Manishekar Chandrasekaranf7a1dad2016-06-23 06:43:47 +0530244 "%s: sap session freed: %d",
245 __func__, i);
246 }
247 qdf_mutex_release(&sap_context_lock);
248 return;
249 }
250 }
251 qdf_mutex_release(&sap_context_lock);
252}
253
Jeff Johnson2bc0b722017-09-25 08:51:43 -0700254struct sap_context *wlansap_open(void)
Ryan Hsu4252a2f2016-01-05 11:18:24 -0800255{
Jeff Johnsone13d8062017-09-28 06:54:55 -0700256 struct sap_context *sap_ctx;
Manishekar Chandrasekaranf7a1dad2016-06-23 06:43:47 +0530257 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800258
Ryan Hsu4252a2f2016-01-05 11:18:24 -0800259 /* dynamically allocate the sapContext */
Jeff Johnsone13d8062017-09-28 06:54:55 -0700260 sap_ctx = qdf_mem_malloc(sizeof(*sap_ctx));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800261
Jeff Johnsone13d8062017-09-28 06:54:55 -0700262 if (NULL == sap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530263 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800264 "%s: Invalid SAP pointer from p_cds_gctx", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800265 return NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800266 }
267
Ryan Hsu4252a2f2016-01-05 11:18:24 -0800268 /* Clean up SAP control block, initialize all values */
Krunal Soni074dd2c2017-04-14 14:57:34 -0700269 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG, FL("Enter"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800270
Manishekar Chandrasekaranf7a1dad2016-06-23 06:43:47 +0530271 /* Save the SAP context pointer */
Jeff Johnsone13d8062017-09-28 06:54:55 -0700272 status = wlansap_save_context(sap_ctx);
Manishekar Chandrasekaranf7a1dad2016-06-23 06:43:47 +0530273 if (QDF_IS_STATUS_ERROR(status)) {
274 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
275 "%s: failed to save SAP context", __func__);
Jeff Johnsone13d8062017-09-28 06:54:55 -0700276 qdf_mem_free(sap_ctx);
Manishekar Chandrasekaranf7a1dad2016-06-23 06:43:47 +0530277 return NULL;
278 }
Krunal Soni074dd2c2017-04-14 14:57:34 -0700279 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG, FL("Exit"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800280
Jeff Johnsone13d8062017-09-28 06:54:55 -0700281 return sap_ctx;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800282} /* wlansap_open */
283
Jeff Johnsone13d8062017-09-28 06:54:55 -0700284QDF_STATUS wlansap_start(struct sap_context *sap_ctx,
Jeff Johnsond8b60572017-09-15 11:25:05 -0700285 enum tQDF_ADAPTER_MODE mode,
Dustin Brownd28772b2017-03-17 14:16:07 -0700286 uint8_t *addr, uint32_t session_id)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800287{
Peng Xu66162de2016-02-11 17:01:20 -0800288 QDF_STATUS qdf_ret_status;
289 tHalHandle hal;
Sandeep Puligilla0806e0f2017-03-06 19:25:47 -0800290 tpAniSirGlobal pmac;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800291
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530292 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800293 "wlansap_start invoked successfully");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800294
Jeff Johnsone13d8062017-09-28 06:54:55 -0700295 if (NULL == sap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530296 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Jeff Johnsond8b60572017-09-15 11:25:05 -0700297 "%s: Invalid SAP pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530298 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800299 }
300
301 /*------------------------------------------------------------------------
302 For now, presume security is not enabled.
303 -----------------------------------------------------------------------*/
Jeff Johnsone13d8062017-09-28 06:54:55 -0700304 sap_ctx->ucSecEnabled = WLANSAP_SECURITY_ENABLED_STATE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800305
306 /*------------------------------------------------------------------------
307 Now configure the roaming profile links. To SSID and bssid.
308 ------------------------------------------------------------------------*/
309 /* We have room for two SSIDs. */
Jeff Johnsone13d8062017-09-28 06:54:55 -0700310 sap_ctx->csr_roamProfile.SSIDs.numOfSSIDs = 1; /* This is true for now. */
311 sap_ctx->csr_roamProfile.SSIDs.SSIDList = sap_ctx->SSIDList; /* Array of two */
312 sap_ctx->csr_roamProfile.SSIDs.SSIDList[0].SSID.length = 0;
313 sap_ctx->csr_roamProfile.SSIDs.SSIDList[0].handoffPermitted = false;
314 sap_ctx->csr_roamProfile.SSIDs.SSIDList[0].ssidHidden =
315 sap_ctx->SSIDList[0].ssidHidden;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800316
Jeff Johnsone13d8062017-09-28 06:54:55 -0700317 sap_ctx->csr_roamProfile.BSSIDs.numOfBSSIDs = 1; /* This is true for now. */
318 sap_ctx->csr_roamProfile.BSSIDs.bssid = &sap_ctx->bssid;
319 sap_ctx->csr_roamProfile.csrPersona = mode;
320 qdf_mem_copy(sap_ctx->self_mac_addr, addr, QDF_MAC_ADDR_SIZE);
321 qdf_event_create(&sap_ctx->sap_session_opened_evt);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800322
323 /* Now configure the auth type in the roaming profile. To open. */
Jeff Johnsone13d8062017-09-28 06:54:55 -0700324 sap_ctx->csr_roamProfile.negotiatedAuthType = eCSR_AUTH_TYPE_OPEN_SYSTEM; /* open is the default */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800325
Jeff Johnsonc0db3842017-09-13 18:34:28 -0700326 hal = (tHalHandle) CDS_GET_HAL_CB();
Chandrasekaran, Manishekard3cb4772016-02-22 22:21:10 +0530327 if (!hal) {
328 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
329 "%s: Invalid HAL pointer", __func__);
330 return QDF_STATUS_E_INVAL;
331 }
Sandeep Puligilla0806e0f2017-03-06 19:25:47 -0800332 pmac = PMAC_STRUCT(hal);
Krunal Sonib01de792017-04-14 11:44:39 -0700333 /*
334 * Anytime when you call sap_open_session, please call
335 * sap_set_session_param to fill sap context parameters
336 */
Jeff Johnsone13d8062017-09-28 06:54:55 -0700337 qdf_ret_status = sap_open_session(hal, sap_ctx, session_id);
Peng Xu66162de2016-02-11 17:01:20 -0800338 if (QDF_STATUS_SUCCESS != qdf_ret_status) {
339 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
340 "Error: In %s calling sap_open_session status = %d",
341 __func__, qdf_ret_status);
342 return QDF_STATUS_E_FAILURE;
343 }
Jeff Johnsone13d8062017-09-28 06:54:55 -0700344 qdf_ret_status = sap_set_session_param(hal, sap_ctx, session_id);
Krunal Sonib01de792017-04-14 11:44:39 -0700345 if (QDF_STATUS_SUCCESS != qdf_ret_status) {
346 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
347 "In %s calling sap_set_session_param status = %d",
348 __func__, qdf_ret_status);
349 return QDF_STATUS_E_FAILURE;
350 }
Sandeep Puligilla0806e0f2017-03-06 19:25:47 -0800351 /* Register with scan component */
Jeff Johnsone13d8062017-09-28 06:54:55 -0700352 sap_ctx->req_id = ucfg_scan_register_requester(pmac->psoc, "SAP",
353 sap_scan_event_callback, sap_ctx);
Sandeep Puligilla994f6202017-06-19 18:29:05 -0700354
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530355 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800356}
357
Jeff Johnsone13d8062017-09-28 06:54:55 -0700358QDF_STATUS wlansap_stop(struct sap_context *sap_ctx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800359{
Krunal Soni074dd2c2017-04-14 14:57:34 -0700360 tHalHandle hal;
Sandeep Puligilla0806e0f2017-03-06 19:25:47 -0800361 tpAniSirGlobal pmac;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800362
Ryan Hsu4252a2f2016-01-05 11:18:24 -0800363 /* Sanity check - Extract SAP control block */
Krunal Soni074dd2c2017-04-14 14:57:34 -0700364 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800365 "wlansap_stop invoked successfully ");
366
Jeff Johnsone13d8062017-09-28 06:54:55 -0700367 if (NULL == sap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530368 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Jeff Johnson3d4c7102017-09-15 11:36:19 -0700369 "%s: Invalid SAP pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530370 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800371 }
Jeff Johnsonc0db3842017-09-13 18:34:28 -0700372 hal = CDS_GET_HAL_CB();
Krunal Soni074dd2c2017-04-14 14:57:34 -0700373 pmac = (tpAniSirGlobal) hal;
Sandeep Puligilla0806e0f2017-03-06 19:25:47 -0800374 if (NULL == pmac) {
Krunal Soni074dd2c2017-04-14 14:57:34 -0700375 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Jeff Johnson3d4c7102017-09-15 11:36:19 -0700376 "%s: Invalid MAC context", __func__);
Sandeep Puligilla0806e0f2017-03-06 19:25:47 -0800377 return QDF_STATUS_E_FAULT;
378 }
Krunal Soni074dd2c2017-04-14 14:57:34 -0700379 if (QDF_STATUS_SUCCESS !=
Jeff Johnsone13d8062017-09-28 06:54:55 -0700380 sap_close_session(hal, sap_ctx, NULL, false)) {
Krunal Soni074dd2c2017-04-14 14:57:34 -0700381 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
382 FL("sap session can't be closed"));
383 return QDF_STATUS_E_FAULT;
384 }
Jeff Johnsone13d8062017-09-28 06:54:55 -0700385 ucfg_scan_unregister_requester(pmac->psoc, sap_ctx->req_id);
386 sap_free_roam_profile(&sap_ctx->csr_roamProfile);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800387
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530388 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800389}
390
Jeff Johnsone13d8062017-09-28 06:54:55 -0700391QDF_STATUS wlansap_close(struct sap_context *sap_ctx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800392{
Krunal Soni074dd2c2017-04-14 14:57:34 -0700393 tHalHandle hal;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800394
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530395 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800396 "wlansap_close invoked");
397
Jeff Johnsone13d8062017-09-28 06:54:55 -0700398 if (NULL == sap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530399 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Jeff Johnson70955b52017-09-25 09:19:33 -0700400 "%s: Invalid SAP pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530401 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800402 }
Ryan Hsu4252a2f2016-01-05 11:18:24 -0800403 /* Cleanup SAP control block */
Krunal Soni074dd2c2017-04-14 14:57:34 -0700404 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG, FL("Enter"));
Jeff Johnsone13d8062017-09-28 06:54:55 -0700405 sap_cleanup_channel_list(sap_ctx);
Jeff Johnsonc0db3842017-09-13 18:34:28 -0700406 hal = CDS_GET_HAL_CB();
Krunal Soni0bdfc772017-04-28 18:37:06 -0700407 if (!hal)
408 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
409 FL("hal is NULL, so lets skip global sap cleanup"));
Jeff Johnsone13d8062017-09-28 06:54:55 -0700410 else if (sap_ctx->sessionId != CSR_SESSION_ID_INVALID)
Krunal Soni0bdfc772017-04-28 18:37:06 -0700411 /* empty queues/lists/pkts if any */
Jeff Johnsone13d8062017-09-28 06:54:55 -0700412 sap_clear_session_param(hal, sap_ctx, sap_ctx->sessionId);
Krunal Soni074dd2c2017-04-14 14:57:34 -0700413 /*
Jeff Johnsone13d8062017-09-28 06:54:55 -0700414 * wlansap_context_put will release actual sap_ctx memory
Krunal Soni074dd2c2017-04-14 14:57:34 -0700415 * allocated during wlansap_open
416 */
Jeff Johnsone13d8062017-09-28 06:54:55 -0700417 wlansap_context_put(sap_ctx);
Krunal Soni074dd2c2017-04-14 14:57:34 -0700418 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG, FL("Exit"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800419
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530420 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800421} /* wlansap_close */
422
Jeff Johnsone13d8062017-09-28 06:54:55 -0700423bool wlansap_is_channel_in_nol_list(struct sap_context *sap_ctx,
Kapil Gupta94ca6f62016-12-11 18:43:12 +0530424 uint8_t channelNumber,
425 ePhyChanBondState chanBondState)
426{
Jeff Johnsone13d8062017-09-28 06:54:55 -0700427 if (!sap_ctx) {
Kapil Gupta94ca6f62016-12-11 18:43:12 +0530428 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
429 "%s: Invalid SAP pointer from pCtx", __func__);
430 return QDF_STATUS_E_FAULT;
431 }
432
Jeff Johnsone13d8062017-09-28 06:54:55 -0700433 return sap_dfs_is_channel_in_nol_list(sap_ctx, channelNumber,
Kapil Gupta94ca6f62016-12-11 18:43:12 +0530434 chanBondState);
435}
436
437#ifdef WLAN_ENABLE_CHNL_MATRIX_RESTRICTION
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -0700438static QDF_STATUS wlansap_mark_leaking_channel(struct sap_context *sap_ctx,
Kapil Gupta94ca6f62016-12-11 18:43:12 +0530439 tSapDfsNolInfo *nol,
440 uint8_t *leakage_adjusted_lst,
441 uint8_t chan_bw)
442{
443
444 return sap_mark_leaking_ch(sap_ctx, chan_bw, nol, 1,
445 leakage_adjusted_lst);
446}
447#else
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -0700448static QDF_STATUS wlansap_mark_leaking_channel(struct sap_context *sap_ctx,
Kapil Gupta94ca6f62016-12-11 18:43:12 +0530449 tSapDfsNolInfo *nol,
450 uint8_t *leakage_adjusted_lst,
451 uint8_t chan_bw)
452{
453 return QDF_STATUS_SUCCESS;
454}
455#endif
456
Jeff Johnson2f6013c2017-09-24 19:40:07 -0700457bool wlansap_is_channel_leaking_in_nol(struct sap_context *sap_ctx,
458 uint8_t channel,
459 uint8_t chan_bw)
Kapil Gupta94ca6f62016-12-11 18:43:12 +0530460{
Kapil Gupta94ca6f62016-12-11 18:43:12 +0530461 tpAniSirGlobal mac_ctx;
462 uint8_t leakage_adjusted_lst[1];
463 void *handle = NULL;
464 tSapDfsNolInfo *nol;
465
466 leakage_adjusted_lst[0] = channel;
Jeff Johnsonc0db3842017-09-13 18:34:28 -0700467 handle = CDS_GET_HAL_CB();
Kapil Gupta94ca6f62016-12-11 18:43:12 +0530468 mac_ctx = PMAC_STRUCT(handle);
469 if (!mac_ctx) {
470 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
471 "%s: Invalid mac pointer", __func__);
472 return QDF_STATUS_E_FAULT;
473 }
474 nol = mac_ctx->sap.SapDfsInfo.sapDfsChannelNolList;
475 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
476 FL("sapdfs: Processing current chan against NOL."));
477 if (wlansap_mark_leaking_channel(sap_ctx, nol,
478 leakage_adjusted_lst, chan_bw) != QDF_STATUS_SUCCESS) {
479 return true;
480 }
481 if (leakage_adjusted_lst[0] == 0)
482 return true;
483 return false;
484}
485
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800486#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
Jeff Johnsone13d8062017-09-28 06:54:55 -0700487uint16_t wlansap_check_cc_intf(struct sap_context *sap_ctx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800488{
489 tHalHandle hHal;
490 uint16_t intf_ch;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800491
Jeff Johnsonc0db3842017-09-13 18:34:28 -0700492 hHal = (tHalHandle) CDS_GET_HAL_CB();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800493 if (NULL == hHal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530494 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800495 "%s: Invalid MAC context from p_cds_gctx", __func__);
496 return 0;
497 }
498 intf_ch = sme_check_concurrent_channel_overlap(hHal, 0, 0,
Jeff Johnsone13d8062017-09-28 06:54:55 -0700499 sap_ctx->cc_switch_mode);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800500 return intf_ch;
501}
502#endif
503
504 /**
505 * wlansap_set_scan_acs_channel_params() - Config scan and channel parameters.
506 * pconfig: Pointer to the SAP config
507 * psap_ctx: Pointer to the SAP Context.
508 * pusr_context: Parameter that will be passed
509 * back in all the SAP callback events.
510 *
511 * This api function is used to copy Scan and Channel parameters from sap
512 * config to sap context.
513 *
514 * Return: The result code associated with
515 * performing the operation
516 */
Jeff Johnson464f7ea2016-10-07 10:21:26 -0700517static QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800518wlansap_set_scan_acs_channel_params(tsap_Config_t *pconfig,
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -0700519 struct sap_context *psap_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800520 void *pusr_context)
521{
522 tHalHandle h_hal = NULL;
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -0700523 tpAniSirGlobal pmac;
524 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800525
526 if (NULL == pconfig) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530527 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800528 "%s: Invalid pconfig passed ", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530529 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800530 }
531
532 if (NULL == psap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530533 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800534 "%s: Invalid pconfig passed ", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530535 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800536 }
537
538 /* Channel selection is auto or configured */
539 psap_ctx->channel = pconfig->channel;
Agrawal Ashish65634612016-08-18 13:24:32 +0530540 psap_ctx->dfs_mode = pconfig->acs_dfs_mode;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800541#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
542 psap_ctx->cc_switch_mode = pconfig->cc_switch_mode;
543#endif
gaoleze5108942017-03-31 16:56:42 +0800544 psap_ctx->auto_channel_select_weight =
545 pconfig->auto_channel_select_weight;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800546 psap_ctx->pUsrContext = pusr_context;
547 psap_ctx->enableOverLapCh = pconfig->enOverLapCh;
548 psap_ctx->acs_cfg = &pconfig->acs_cfg;
549 psap_ctx->ch_width_orig = pconfig->acs_cfg.ch_width;
550 psap_ctx->secondary_ch = pconfig->sec_ch;
551
552 /*
553 * Set the BSSID to your "self MAC Addr" read
554 * the mac address from Configuation ITEM received
555 * from HDD
556 */
557 psap_ctx->csr_roamProfile.BSSIDs.numOfBSSIDs = 1;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800558
Peng Xuf5d60c82015-10-02 17:17:03 -0700559 /* Save a copy to SAP context */
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530560 qdf_mem_copy(psap_ctx->csr_roamProfile.BSSIDs.bssid,
Anurag Chouhan6d760662016-02-20 16:05:43 +0530561 pconfig->self_macaddr.bytes, QDF_MAC_ADDR_SIZE);
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530562 qdf_mem_copy(psap_ctx->self_mac_addr,
Anurag Chouhan6d760662016-02-20 16:05:43 +0530563 pconfig->self_macaddr.bytes, QDF_MAC_ADDR_SIZE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800564
Jeff Johnsonc0db3842017-09-13 18:34:28 -0700565 h_hal = (tHalHandle)CDS_GET_HAL_CB();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800566 if (NULL == h_hal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530567 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800568 "%s: Invalid MAC context from pvosGCtx", __func__);
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -0700569 return QDF_STATUS_E_FAULT;
570 }
571 pmac = PMAC_STRUCT(h_hal);
572 /*
573 * If concurrent session is running that is already associated
574 * then we just follow that sessions country info (whether
575 * present or not doesn't maater as we have to follow whatever
576 * STA session does)
577 */
578 if ((0 == sme_get_concurrent_operation_channel(h_hal)) &&
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800579 pconfig->ieee80211d) {
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -0700580 /* Setting the region/country information */
581 status = ucfg_reg_set_country(pmac->pdev,
582 pconfig->countryCode);
583 if (QDF_IS_STATUS_ERROR(status))
584 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
585 FL("Failed to set country"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800586 }
587
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -0700588 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800589}
bings58ce8622017-07-10 15:55:36 +0800590
Jeff Johnsonebb7f0a2017-09-24 20:00:13 -0700591eCsrPhyMode wlan_sap_get_phymode(struct sap_context *sap_ctx)
bings58ce8622017-07-10 15:55:36 +0800592{
bings58ce8622017-07-10 15:55:36 +0800593 if (!sap_ctx) {
594 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
595 FL("Invalid SAP pointer from ctx"));
596 return 0;
597 }
598 return sap_ctx->csr_roamProfile.phyMode;
599}
600
Jeff Johnsonee7a3932017-09-24 20:17:55 -0700601uint32_t wlan_sap_get_vht_ch_width(struct sap_context *sap_ctx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800602{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800603 if (!sap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530604 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Jeff Johnsonee7a3932017-09-24 20:17:55 -0700605 FL("Invalid SAP pointer"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800606 return 0;
607 }
608
609 return sap_ctx->ch_params.ch_width;
610}
611
Jeff Johnson2de14da2017-09-24 20:23:37 -0700612void wlan_sap_set_vht_ch_width(struct sap_context *sap_ctx,
613 uint32_t vht_channel_width)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800614{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800615 if (!sap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530616 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Jeff Johnson2de14da2017-09-24 20:23:37 -0700617 FL("Invalid SAP pointer"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800618 return;
619 }
620
621 sap_ctx->ch_params.ch_width = vht_channel_width;
622}
623
624/**
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +0530625 * wlan_sap_validate_channel_switch() - validate target channel switch w.r.t
626 * concurreny rules set to avoid channel interference.
627 * @hal - Hal context
628 * @sap_ch - channel to switch
629 * @sap_context - sap session context
630 *
631 * Return: true if there is no channel interference else return false
632 */
633#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
634static bool wlan_sap_validate_channel_switch(tHalHandle hal, uint16_t sap_ch,
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -0700635 struct sap_context *sap_context)
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +0530636{
637 return sme_validate_sap_channel_switch(
Manikandan Mohan22b83722015-12-15 15:03:23 -0800638 hal,
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +0530639 sap_ch,
640 sap_context->csr_roamProfile.phyMode,
641 sap_context->cc_switch_mode,
642 sap_context->sessionId);
643}
644#else
645static inline bool wlan_sap_validate_channel_switch(tHalHandle hal,
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -0700646 uint16_t sap_ch, struct sap_context *sap_context)
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +0530647{
648 return true;
649}
650#endif
Jeff Johnsone13d8062017-09-28 06:54:55 -0700651QDF_STATUS wlansap_start_bss(struct sap_context *sap_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800652 tpWLAN_SAPEventCB pSapEventCallback,
Jeff Johnsone2f7d542017-09-24 20:52:24 -0700653 tsap_Config_t *pConfig, void *pUsrContext)
654{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800655 tWLAN_SAPEvent sapEvent; /* State machine event */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530656 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800657 tHalHandle hHal;
658 tpAniSirGlobal pmac = NULL;
659
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530660 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Jeff Johnsone13d8062017-09-28 06:54:55 -0700661 "wlansap_start_bss: sapContext=%pK", sap_ctx);
Peng Xuf5d60c82015-10-02 17:17:03 -0700662
Jeff Johnsone13d8062017-09-28 06:54:55 -0700663 if (NULL == sap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530664 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Jeff Johnsone2f7d542017-09-24 20:52:24 -0700665 "%s: Invalid SAP pointer",
Peng Xuf5d60c82015-10-02 17:17:03 -0700666 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530667 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800668 }
Jeff Johnsone13d8062017-09-28 06:54:55 -0700669 sap_ctx->sapsMachine = eSAP_DISCONNECTED;
Peng Xuf5d60c82015-10-02 17:17:03 -0700670
671 /* Channel selection is auto or configured */
Jeff Johnsone13d8062017-09-28 06:54:55 -0700672 sap_ctx->channel = pConfig->channel;
673 sap_ctx->dfs_mode = pConfig->acs_dfs_mode;
674 sap_ctx->ch_params.ch_width = pConfig->ch_params.ch_width;
675 sap_ctx->ch_params.center_freq_seg0 =
Peng Xuf5d60c82015-10-02 17:17:03 -0700676 pConfig->ch_params.center_freq_seg0;
Jeff Johnsone13d8062017-09-28 06:54:55 -0700677 sap_ctx->ch_params.center_freq_seg1 =
Peng Xuf5d60c82015-10-02 17:17:03 -0700678 pConfig->ch_params.center_freq_seg1;
Jeff Johnsone13d8062017-09-28 06:54:55 -0700679 sap_ctx->ch_params.sec_ch_offset =
Peng Xuf5d60c82015-10-02 17:17:03 -0700680 pConfig->ch_params.sec_ch_offset;
Jeff Johnsone13d8062017-09-28 06:54:55 -0700681 sap_ctx->ch_width_orig = pConfig->ch_width_orig;
Peng Xuf5d60c82015-10-02 17:17:03 -0700682#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
Jeff Johnsone13d8062017-09-28 06:54:55 -0700683 sap_ctx->cc_switch_mode = pConfig->cc_switch_mode;
Peng Xuf5d60c82015-10-02 17:17:03 -0700684#endif
Jeff Johnsone13d8062017-09-28 06:54:55 -0700685 sap_ctx->auto_channel_select_weight =
gaoleze5108942017-03-31 16:56:42 +0800686 pConfig->auto_channel_select_weight;
Jeff Johnsone13d8062017-09-28 06:54:55 -0700687 sap_ctx->pUsrContext = pUsrContext;
688 sap_ctx->enableOverLapCh = pConfig->enOverLapCh;
689 sap_ctx->acs_cfg = &pConfig->acs_cfg;
690 sap_ctx->dfs_cac_offload = pConfig->dfs_cac_offload;
691 sap_ctx->isCacEndNotified = 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);
716 if (NULL == pmac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530717 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Peng Xuf5d60c82015-10-02 17:17:03 -0700718 "%s: Invalid MAC context from p_cds_gctx",
719 __func__);
Manikandan Mohan3dad1a42017-06-14 10:50:18 -0700720 qdf_status = QDF_STATUS_E_FAULT;
721 goto fail;
Peng Xuf5d60c82015-10-02 17:17:03 -0700722 }
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -0700723 /* If concurrent session is running that is already associated
724 * then we just follow that sessions country info (whether
725 * present or not doesn't maater as we have to follow whatever
726 * STA session does) */
727 if ((0 == sme_get_concurrent_operation_channel(hHal)) &&
728 pConfig->ieee80211d) {
729 /* Setting the region/country information */
730 qdf_status = ucfg_reg_set_country(pmac->pdev,
731 pConfig->countryCode);
732 if (QDF_IS_STATUS_ERROR(qdf_status))
733 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
734 FL("Failed to set country"));
735 }
736
Peng Xuf5d60c82015-10-02 17:17:03 -0700737 /*
738 * Copy the DFS Test Mode setting to pmac for
739 * access in lower layers
740 */
741 pmac->sap.SapDfsInfo.disable_dfs_ch_switch =
742 pConfig->disableDFSChSwitch;
gaoleze2920bd2017-03-21 17:38:42 +0800743 pmac->sap.SapDfsInfo.sap_ch_switch_beacon_cnt =
744 pConfig->sap_chanswitch_beacon_cnt;
gaolez76d2a162017-03-21 19:23:58 +0800745 pmac->sap.SapDfsInfo.sap_ch_switch_mode =
746 pConfig->sap_chanswitch_mode;
gaoleze2920bd2017-03-21 17:38:42 +0800747
Jeff Johnsone13d8062017-09-28 06:54:55 -0700748 pmac->sap.sapCtxList[sap_ctx->sessionId].pSapContext = sap_ctx;
749 pmac->sap.sapCtxList[sap_ctx->sessionId].sapPersona =
750 sap_ctx->csr_roamProfile.csrPersona;
751 pmac->sap.sapCtxList[sap_ctx->sessionId].sessionID =
752 sap_ctx->sessionId;
Peng Xuf5d60c82015-10-02 17:17:03 -0700753
754 /* Copy MAC filtering settings to sap context */
Jeff Johnsone13d8062017-09-28 06:54:55 -0700755 sap_ctx->eSapMacAddrAclMode = pConfig->SapMacaddr_acl;
756 qdf_mem_copy(sap_ctx->acceptMacList, pConfig->accept_mac,
Peng Xuf5d60c82015-10-02 17:17:03 -0700757 sizeof(pConfig->accept_mac));
Jeff Johnsone13d8062017-09-28 06:54:55 -0700758 sap_ctx->nAcceptMac = pConfig->num_accept_mac;
759 sap_sort_mac_list(sap_ctx->acceptMacList, sap_ctx->nAcceptMac);
760 qdf_mem_copy(sap_ctx->denyMacList, pConfig->deny_mac,
Peng Xuf5d60c82015-10-02 17:17:03 -0700761 sizeof(pConfig->deny_mac));
Jeff Johnsone13d8062017-09-28 06:54:55 -0700762 sap_ctx->nDenyMac = pConfig->num_deny_mac;
763 sap_sort_mac_list(sap_ctx->denyMacList, sap_ctx->nDenyMac);
764 sap_ctx->beacon_tx_rate = pConfig->beacon_tx_rate;
Jiachao Wu712d4fd2017-08-23 16:52:34 +0800765
Peng Xuf5d60c82015-10-02 17:17:03 -0700766 /* Fill in the event structure for FSM */
767 sapEvent.event = eSAP_HDD_START_INFRA_BSS;
768 sapEvent.params = 0; /* pSapPhysLinkCreate */
769
770 /* Store the HDD callback in SAP context */
Jeff Johnsone13d8062017-09-28 06:54:55 -0700771 sap_ctx->pfnSapEventCallback = pSapEventCallback;
Peng Xuf5d60c82015-10-02 17:17:03 -0700772
773 /* Handle event */
Jeff Johnsone13d8062017-09-28 06:54:55 -0700774 qdf_status = sap_fsm(sap_ctx, &sapEvent);
Manikandan Mohan3dad1a42017-06-14 10:50:18 -0700775fail:
776 if (QDF_IS_STATUS_ERROR(qdf_status))
Jeff Johnsone13d8062017-09-28 06:54:55 -0700777 sap_free_roam_profile(&sap_ctx->csr_roamProfile);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800778
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530779 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800780} /* wlansap_start_bss */
781
Jeff Johnsone13d8062017-09-28 06:54:55 -0700782QDF_STATUS wlansap_set_mac_acl(struct sap_context *sap_ctx,
Jeff Johnson65dd6d92017-09-24 21:12:49 -0700783 tsap_Config_t *pConfig)
784{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530785 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800786
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530787 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800788 "wlansap_set_mac_acl");
789
Jeff Johnsone13d8062017-09-28 06:54:55 -0700790 if (NULL == sap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530791 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Jeff Johnson65dd6d92017-09-24 21:12:49 -0700792 "%s: Invalid SAP pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530793 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800794 }
Peng Xuf5d60c82015-10-02 17:17:03 -0700795 /* Copy MAC filtering settings to sap context */
Jeff Johnsone13d8062017-09-28 06:54:55 -0700796 sap_ctx->eSapMacAddrAclMode = pConfig->SapMacaddr_acl;
Peng Xuf5d60c82015-10-02 17:17:03 -0700797
Jeff Johnsone13d8062017-09-28 06:54:55 -0700798 if (eSAP_DENY_UNLESS_ACCEPTED == sap_ctx->eSapMacAddrAclMode) {
799 qdf_mem_copy(sap_ctx->acceptMacList,
Peng Xuf5d60c82015-10-02 17:17:03 -0700800 pConfig->accept_mac,
801 sizeof(pConfig->accept_mac));
Jeff Johnsone13d8062017-09-28 06:54:55 -0700802 sap_ctx->nAcceptMac = pConfig->num_accept_mac;
803 sap_sort_mac_list(sap_ctx->acceptMacList,
804 sap_ctx->nAcceptMac);
805 } else if (eSAP_ACCEPT_UNLESS_DENIED == sap_ctx->eSapMacAddrAclMode) {
806 qdf_mem_copy(sap_ctx->denyMacList, pConfig->deny_mac,
Peng Xuf5d60c82015-10-02 17:17:03 -0700807 sizeof(pConfig->deny_mac));
Jeff Johnsone13d8062017-09-28 06:54:55 -0700808 sap_ctx->nDenyMac = pConfig->num_deny_mac;
809 sap_sort_mac_list(sap_ctx->denyMacList, sap_ctx->nDenyMac);
Peng Xuf5d60c82015-10-02 17:17:03 -0700810 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800811
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530812 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800813} /* wlansap_set_mac_acl */
814
Jeff Johnsone13d8062017-09-28 06:54:55 -0700815QDF_STATUS wlansap_stop_bss(struct sap_context *sap_ctx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800816{
817 tWLAN_SAPEvent sapEvent; /* State machine event */
Jeff Johnson16e29cd2017-09-24 21:01:19 -0700818 QDF_STATUS qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800819
Jeff Johnsone13d8062017-09-28 06:54:55 -0700820 if (NULL == sap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530821 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Jeff Johnson16e29cd2017-09-24 21:01:19 -0700822 "%s: Invalid SAP pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530823 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800824 }
825
826 /* Fill in the event structure for FSM */
827 sapEvent.event = eSAP_HDD_STOP_INFRA_BSS;
828 sapEvent.params = 0;
829
830 /* Handle event */
Jeff Johnsone13d8062017-09-28 06:54:55 -0700831 qdf_status = sap_fsm(sap_ctx, &sapEvent);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800832
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530833 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800834}
835
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800836/* This routine will set the mode of operation for ACL dynamically*/
Jeff Johnsone13d8062017-09-28 06:54:55 -0700837QDF_STATUS wlansap_set_acl_mode(struct sap_context *sap_ctx,
Jeff Johnsonf8ac7372017-09-24 21:24:25 -0700838 eSapMacAddrACL mode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800839{
Jeff Johnsone13d8062017-09-28 06:54:55 -0700840 if (NULL == sap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530841 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Jeff Johnsonf8ac7372017-09-24 21:24:25 -0700842 "%s: Invalid SAP pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530843 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800844 }
845
Jeff Johnsone13d8062017-09-28 06:54:55 -0700846 sap_ctx->eSapMacAddrAclMode = mode;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530847 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800848}
849
Jeff Johnsone13d8062017-09-28 06:54:55 -0700850QDF_STATUS wlansap_get_acl_mode(struct sap_context *sap_ctx,
Jeff Johnson1030f8c2017-09-24 21:33:40 -0700851 eSapMacAddrACL *mode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800852{
Jeff Johnsone13d8062017-09-28 06:54:55 -0700853 if (NULL == sap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530854 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Jeff Johnson1030f8c2017-09-24 21:33:40 -0700855 "%s: Invalid SAP pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530856 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800857 }
858
Jeff Johnsone13d8062017-09-28 06:54:55 -0700859 *mode = sap_ctx->eSapMacAddrAclMode;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530860 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800861}
862
Jeff Johnsone13d8062017-09-28 06:54:55 -0700863QDF_STATUS wlansap_get_acl_accept_list(struct sap_context *sap_ctx,
Jeff Johnson878f6d52017-09-25 08:28:53 -0700864 struct qdf_mac_addr *pAcceptList,
865 uint8_t *nAcceptList)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800866{
Jeff Johnsone13d8062017-09-28 06:54:55 -0700867 if (NULL == sap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530868 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Jeff Johnson878f6d52017-09-25 08:28:53 -0700869 "%s: Invalid SAP pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530870 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800871 }
872
Jeff Johnsone13d8062017-09-28 06:54:55 -0700873 memcpy(pAcceptList, sap_ctx->acceptMacList,
874 (sap_ctx->nAcceptMac * QDF_MAC_ADDR_SIZE));
875 *nAcceptList = sap_ctx->nAcceptMac;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530876 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800877}
878
Jeff Johnsone13d8062017-09-28 06:54:55 -0700879QDF_STATUS wlansap_get_acl_deny_list(struct sap_context *sap_ctx,
Jeff Johnson49c819f2017-09-25 13:48:36 -0700880 struct qdf_mac_addr *pDenyList,
881 uint8_t *nDenyList)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800882{
Jeff Johnsone13d8062017-09-28 06:54:55 -0700883 if (NULL == sap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530884 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800885 "%s: Invalid SAP pointer from p_cds_gctx", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530886 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800887 }
888
Jeff Johnsone13d8062017-09-28 06:54:55 -0700889 memcpy(pDenyList, sap_ctx->denyMacList,
890 (sap_ctx->nDenyMac * QDF_MAC_ADDR_SIZE));
891 *nDenyList = sap_ctx->nDenyMac;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530892 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800893}
894
Jeff Johnsone13d8062017-09-28 06:54:55 -0700895QDF_STATUS wlansap_clear_acl(struct sap_context *sap_ctx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800896{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800897 uint8_t i;
898
Jeff Johnsone13d8062017-09-28 06:54:55 -0700899 if (NULL == sap_ctx) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530900 return QDF_STATUS_E_RESOURCES;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800901 }
902
Jeff Johnsone13d8062017-09-28 06:54:55 -0700903 for (i = 0; i < (sap_ctx->nDenyMac - 1); i++) {
904 qdf_mem_zero((sap_ctx->denyMacList + i)->bytes,
Yingying Tang22facc12016-10-20 17:43:59 +0800905 QDF_MAC_ADDR_SIZE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800906 }
Yingying Tang22facc12016-10-20 17:43:59 +0800907
Jeff Johnsone13d8062017-09-28 06:54:55 -0700908 sap_print_acl(sap_ctx->denyMacList, sap_ctx->nDenyMac);
909 sap_ctx->nDenyMac = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800910
Jeff Johnsone13d8062017-09-28 06:54:55 -0700911 for (i = 0; i < (sap_ctx->nAcceptMac - 1); i++) {
912 qdf_mem_zero((sap_ctx->acceptMacList + i)->bytes,
Yingying Tang22facc12016-10-20 17:43:59 +0800913 QDF_MAC_ADDR_SIZE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800914 }
Yingying Tang22facc12016-10-20 17:43:59 +0800915
Jeff Johnsone13d8062017-09-28 06:54:55 -0700916 sap_print_acl(sap_ctx->acceptMacList, sap_ctx->nAcceptMac);
917 sap_ctx->nAcceptMac = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800918
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530919 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800920}
921
Jeff Johnson42fbe2f2017-09-24 17:42:11 -0700922QDF_STATUS wlansap_modify_acl(struct sap_context *sap_ctx,
923 uint8_t *peer_sta_mac,
924 eSapACLType list_type, eSapACLCmdType cmd)
925{
Srinivas Girigowda74a66d62017-06-21 23:28:25 -0700926 bool sta_white_list = false, sta_black_list = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800927 uint8_t staWLIndex, staBLIndex;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800928
929 if (NULL == sap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530930 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800931 "%s: Invalid SAP Context", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530932 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800933 }
934
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530935 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800936 "Modify ACL entered\n" "Before modification of ACL\n"
937 "size of accept and deny lists %d %d", sap_ctx->nAcceptMac,
938 sap_ctx->nDenyMac);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530939 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800940 "*** WHITE LIST ***");
941 sap_print_acl(sap_ctx->acceptMacList, sap_ctx->nAcceptMac);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530942 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800943 "*** BLACK LIST ***");
944 sap_print_acl(sap_ctx->denyMacList, sap_ctx->nDenyMac);
945
Jeff Johnson42fbe2f2017-09-24 17:42:11 -0700946 /* the expectation is a mac addr will not be in both the lists
947 * at the same time. It is the responsiblity of userspace to
948 * ensure this
949 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800950 sta_white_list =
951 sap_search_mac_list(sap_ctx->acceptMacList, sap_ctx->nAcceptMac,
952 peer_sta_mac, &staWLIndex);
953 sta_black_list =
954 sap_search_mac_list(sap_ctx->denyMacList, sap_ctx->nDenyMac,
955 peer_sta_mac, &staBLIndex);
956
957 if (sta_white_list && sta_black_list) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530958 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800959 "Peer mac " MAC_ADDRESS_STR
960 " found in white and black lists."
961 "Initial lists passed incorrect. Cannot execute this command.",
962 MAC_ADDR_ARRAY(peer_sta_mac));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530963 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800964
965 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530966 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800967 "cmd %d", cmd);
968
969 switch (list_type) {
970 case eSAP_WHITE_LIST:
971 if (cmd == ADD_STA_TO_ACL) {
972 /* error check */
973 /* if list is already at max, return failure */
974 if (sap_ctx->nAcceptMac == MAX_ACL_MAC_ADDRESS) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530975 QDF_TRACE(QDF_MODULE_ID_SAP,
976 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800977 "White list is already maxed out. Cannot accept "
978 MAC_ADDRESS_STR,
979 MAC_ADDR_ARRAY(peer_sta_mac));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530980 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800981 }
982 if (sta_white_list) {
983 /* Do nothing if already present in white list. Just print a warning */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530984 QDF_TRACE(QDF_MODULE_ID_SAP,
985 QDF_TRACE_LEVEL_WARN,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800986 "MAC address already present in white list "
987 MAC_ADDRESS_STR,
988 MAC_ADDR_ARRAY(peer_sta_mac));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530989 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800990 }
991 if (sta_black_list) {
992 /* remove it from black list before adding to the white list */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530993 QDF_TRACE(QDF_MODULE_ID_SAP,
994 QDF_TRACE_LEVEL_WARN,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800995 "STA present in black list so first remove from it");
Jeff Johnson42fbe2f2017-09-24 17:42:11 -0700996 sap_remove_mac_from_acl(sap_ctx->denyMacList,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800997 &sap_ctx->nDenyMac,
998 staBLIndex);
999 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301000 QDF_TRACE(QDF_MODULE_ID_SAP,
1001 QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001002 "... Now add to the white list");
1003 sap_add_mac_to_acl(sap_ctx->acceptMacList,
1004 &sap_ctx->nAcceptMac,
1005 peer_sta_mac);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301006 QDF_TRACE(QDF_MODULE_ID_SAP,
1007 QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001008 "size of accept and deny lists %d %d",
1009 sap_ctx->nAcceptMac,
1010 sap_ctx->nDenyMac);
1011 } else if (cmd == DELETE_STA_FROM_ACL) {
1012 if (sta_white_list) {
1013
1014 struct tagCsrDelStaParams delStaParams;
1015
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301016 QDF_TRACE(QDF_MODULE_ID_SAP,
1017 QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001018 "Delete from white list");
1019 sap_remove_mac_from_acl(sap_ctx->acceptMacList,
1020 &sap_ctx->nAcceptMac,
1021 staWLIndex);
1022 /* If a client is deleted from white list and it is connected, send deauth */
1023 wlansap_populate_del_sta_params(peer_sta_mac,
1024 eCsrForcedDeauthSta,
1025 (SIR_MAC_MGMT_DEAUTH >> 4),
1026 &delStaParams);
Jeff Johnson42fbe2f2017-09-24 17:42:11 -07001027 wlansap_deauth_sta(sap_ctx, &delStaParams);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301028 QDF_TRACE(QDF_MODULE_ID_SAP,
1029 QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001030 "size of accept and deny lists %d %d",
1031 sap_ctx->nAcceptMac,
1032 sap_ctx->nDenyMac);
1033 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301034 QDF_TRACE(QDF_MODULE_ID_SAP,
1035 QDF_TRACE_LEVEL_WARN,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001036 "MAC address to be deleted is not present in the white list "
1037 MAC_ADDRESS_STR,
1038 MAC_ADDR_ARRAY(peer_sta_mac));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301039 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001040 }
1041 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301042 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001043 "Invalid cmd type passed");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301044 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001045 }
1046 break;
1047
1048 case eSAP_BLACK_LIST:
1049
1050 if (cmd == ADD_STA_TO_ACL) {
1051 struct tagCsrDelStaParams delStaParams;
1052 /* error check */
1053 /* if list is already at max, return failure */
1054 if (sap_ctx->nDenyMac == MAX_ACL_MAC_ADDRESS) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301055 QDF_TRACE(QDF_MODULE_ID_SAP,
1056 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001057 "Black list is already maxed out. Cannot accept "
1058 MAC_ADDRESS_STR,
1059 MAC_ADDR_ARRAY(peer_sta_mac));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301060 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001061 }
1062 if (sta_black_list) {
1063 /* Do nothing if already present in white list */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301064 QDF_TRACE(QDF_MODULE_ID_SAP,
1065 QDF_TRACE_LEVEL_WARN,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001066 "MAC address already present in black list "
1067 MAC_ADDRESS_STR,
1068 MAC_ADDR_ARRAY(peer_sta_mac));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301069 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001070 }
1071 if (sta_white_list) {
1072 /* remove it from white list before adding to the black list */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301073 QDF_TRACE(QDF_MODULE_ID_SAP,
1074 QDF_TRACE_LEVEL_WARN,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001075 "Present in white list so first remove from it");
Jeff Johnson42fbe2f2017-09-24 17:42:11 -07001076 sap_remove_mac_from_acl(sap_ctx->acceptMacList,
1077 &sap_ctx->nAcceptMac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001078 staWLIndex);
1079 }
1080 /* If we are adding a client to the black list; if its connected, send deauth */
1081 wlansap_populate_del_sta_params(peer_sta_mac,
1082 eCsrForcedDeauthSta,
1083 (SIR_MAC_MGMT_DEAUTH >> 4),
1084 &delStaParams);
Jeff Johnson42fbe2f2017-09-24 17:42:11 -07001085 wlansap_deauth_sta(sap_ctx, &delStaParams);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301086 QDF_TRACE(QDF_MODULE_ID_SAP,
1087 QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001088 "... Now add to black list");
1089 sap_add_mac_to_acl(sap_ctx->denyMacList,
1090 &sap_ctx->nDenyMac, peer_sta_mac);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301091 QDF_TRACE(QDF_MODULE_ID_SAP,
1092 QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001093 "size of accept and deny lists %d %d",
1094 sap_ctx->nAcceptMac,
1095 sap_ctx->nDenyMac);
1096 } else if (cmd == DELETE_STA_FROM_ACL) {
1097 if (sta_black_list) {
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 "Delete from black list");
1101 sap_remove_mac_from_acl(sap_ctx->denyMacList,
1102 &sap_ctx->nDenyMac,
1103 staBLIndex);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301104 QDF_TRACE(QDF_MODULE_ID_SAP,
1105 QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001106 "no accept and deny mac %d %d",
1107 sap_ctx->nAcceptMac,
1108 sap_ctx->nDenyMac);
1109 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301110 QDF_TRACE(QDF_MODULE_ID_SAP,
1111 QDF_TRACE_LEVEL_WARN,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001112 "MAC address to be deleted is not present in the black list "
1113 MAC_ADDRESS_STR,
1114 MAC_ADDR_ARRAY(peer_sta_mac));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301115 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001116 }
1117 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301118 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001119 "Invalid cmd type passed");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301120 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001121 }
1122 break;
1123
1124 default:
1125 {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301126 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001127 "Invalid list type passed %d", list_type);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301128 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001129 }
1130 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301131 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001132 "After modification of ACL");
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301133 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001134 "*** WHITE LIST ***");
1135 sap_print_acl(sap_ctx->acceptMacList, sap_ctx->nAcceptMac);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301136 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001137 "*** BLACK LIST ***");
1138 sap_print_acl(sap_ctx->denyMacList, sap_ctx->nDenyMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301139 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001140}
1141
Jeff Johnsone13d8062017-09-28 06:54:55 -07001142QDF_STATUS wlansap_disassoc_sta(struct sap_context *sap_ctx,
Deepthi Gowrib3bfefd2016-09-13 15:14:34 +05301143 struct tagCsrDelStaParams *p_del_sta_params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001144{
Jeff Johnsone13d8062017-09-28 06:54:55 -07001145 if (NULL == sap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301146 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Jeff Johnson92e867c2017-09-25 13:58:52 -07001147 "%s: Invalid SAP pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301148 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001149 }
1150
Jeff Johnsonc0db3842017-09-13 18:34:28 -07001151 sme_roam_disconnect_sta(CDS_GET_HAL_CB(),
Jeff Johnsone13d8062017-09-28 06:54:55 -07001152 sap_ctx->sessionId, p_del_sta_params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001153
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301154 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001155}
1156
Jeff Johnsone13d8062017-09-28 06:54:55 -07001157QDF_STATUS wlansap_deauth_sta(struct sap_context *sap_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001158 struct tagCsrDelStaParams *pDelStaParams)
1159{
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301160 QDF_STATUS qdf_ret_status = QDF_STATUS_E_FAILURE;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301161 QDF_STATUS qdf_status = QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001162
Jeff Johnsone13d8062017-09-28 06:54:55 -07001163 if (NULL == sap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301164 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Jeff Johnsone7ff1d02017-09-25 14:03:34 -07001165 "%s: Invalid SAP pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301166 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001167 }
1168
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301169 qdf_ret_status =
Jeff Johnsonc0db3842017-09-13 18:34:28 -07001170 sme_roam_deauth_sta(CDS_GET_HAL_CB(),
Jeff Johnsone13d8062017-09-28 06:54:55 -07001171 sap_ctx->sessionId, pDelStaParams);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001172
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301173 if (qdf_ret_status == QDF_STATUS_SUCCESS) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301174 qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001175 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301176 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001177}
1178
Edhar, Mahesh Kumarbd8b3912015-11-25 19:28:12 +05301179/**
Edhar, Mahesh Kumarbd8b3912015-11-25 19:28:12 +05301180 * wlansap_update_csa_channel_params() - fucntion to populate channel width and
1181 * bonding modes.
1182 * @sap_context: sap adapter context
1183 * @channel: target channel
1184 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301185 * Return: The QDF_STATUS code associated with performing the operation
Edhar, Mahesh Kumarbd8b3912015-11-25 19:28:12 +05301186 */
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -07001187static QDF_STATUS
1188wlansap_update_csa_channel_params(struct sap_context *sap_context,
1189 uint32_t channel)
Edhar, Mahesh Kumarbd8b3912015-11-25 19:28:12 +05301190{
1191 void *hal;
1192 tpAniSirGlobal mac_ctx;
Edhar, Mahesh Kumarbd8b3912015-11-25 19:28:12 +05301193 uint8_t bw;
1194
Jeff Johnsonc0db3842017-09-13 18:34:28 -07001195 hal = CDS_GET_HAL_CB();
Edhar, Mahesh Kumarbd8b3912015-11-25 19:28:12 +05301196 if (!hal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301197 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Edhar, Mahesh Kumarbd8b3912015-11-25 19:28:12 +05301198 "%s: Invalid hal pointer from p_cds_gctx", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301199 return QDF_STATUS_E_FAULT;
Edhar, Mahesh Kumarbd8b3912015-11-25 19:28:12 +05301200 }
1201
1202 mac_ctx = PMAC_STRUCT(hal);
1203
Amar Singhalb8d4f152016-02-10 10:21:43 -08001204 if (channel <= CHAN_ENUM_14) {
Edhar, Mahesh Kumarbd8b3912015-11-25 19:28:12 +05301205 /*
1206 * currently OBSS scan is done in hostapd, so to avoid
1207 * SAP coming up in HT40 on channel switch we are
1208 * disabling channel bonding in 2.4Ghz.
1209 */
Edhar, Mahesh Kumarbd8b3912015-11-25 19:28:12 +05301210 mac_ctx->sap.SapDfsInfo.new_chanWidth = 0;
1211
1212 } else {
1213
1214 if (sap_context->ch_width_orig >= CH_WIDTH_80MHZ)
1215 bw = BW80;
1216 else if (sap_context->ch_width_orig == CH_WIDTH_40MHZ)
1217 bw = BW40_HIGH_PRIMARY;
1218 else
1219 bw = BW20;
1220
1221 for (; bw >= BW20; bw--) {
1222 uint16_t op_class;
1223
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07001224 op_class = wlan_reg_dmn_get_opclass_from_channel(
Edhar, Mahesh Kumarbd8b3912015-11-25 19:28:12 +05301225 mac_ctx->scan.countryCodeCurrent,
1226 channel, bw);
1227 if (!op_class)
1228 continue;
1229
1230 if (bw == BW80) {
Edhar, Mahesh Kumarbd8b3912015-11-25 19:28:12 +05301231 mac_ctx->sap.SapDfsInfo.new_chanWidth =
1232 CH_WIDTH_80MHZ;
1233 } else if (bw == BW40_HIGH_PRIMARY) {
1234 mac_ctx->sap.SapDfsInfo.new_chanWidth =
1235 CH_WIDTH_40MHZ;
Edhar, Mahesh Kumarbd8b3912015-11-25 19:28:12 +05301236 } else if (bw == BW40_LOW_PRIMARY) {
1237 mac_ctx->sap.SapDfsInfo.new_chanWidth =
1238 CH_WIDTH_40MHZ;
Edhar, Mahesh Kumarbd8b3912015-11-25 19:28:12 +05301239 } else {
1240 mac_ctx->sap.SapDfsInfo.new_chanWidth =
1241 CH_WIDTH_20MHZ;
Edhar, Mahesh Kumarbd8b3912015-11-25 19:28:12 +05301242 }
1243 break;
1244 }
1245
1246 }
1247
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301248 return QDF_STATUS_SUCCESS;
Edhar, Mahesh Kumarbd8b3912015-11-25 19:28:12 +05301249}
1250
Chandrasekaran, Manishekara74bb022016-01-12 18:37:43 +05301251/**
1252 * wlansap_set_channel_change_with_csa() - Set channel change with CSA
Jeff Johnson52a2ce32017-09-25 14:13:27 -07001253 * @sapContext: Pointer to SAP context
Chandrasekaran, Manishekara74bb022016-01-12 18:37:43 +05301254 * @targetChannel: Target channel
1255 * @target_bw: Target bandwidth
Tushnim Bhattacharyya9a929992017-06-18 00:59:09 -07001256 * @strict: if true switch to the requested channel always, fail
1257 * otherwise
Chandrasekaran, Manishekara74bb022016-01-12 18:37:43 +05301258 *
1259 * This api function does a channel change to the target channel specified.
1260 * CSA IE is included in the beacons before doing a channel change.
1261 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301262 * Return: QDF_STATUS
Chandrasekaran, Manishekara74bb022016-01-12 18:37:43 +05301263 */
Jeff Johnson52a2ce32017-09-25 14:13:27 -07001264QDF_STATUS wlansap_set_channel_change_with_csa(struct sap_context *sapContext,
1265 uint32_t targetChannel,
1266 enum phy_ch_width target_bw,
1267 bool strict)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001268{
1269
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001270 tWLAN_SAPEvent sapEvent;
1271 tpAniSirGlobal pMac = NULL;
1272 void *hHal = NULL;
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +05301273 bool valid;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301274 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001275
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001276 if (NULL == sapContext) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301277 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Jeff Johnson52a2ce32017-09-25 14:13:27 -07001278 "%s: Invalid SAP pointer", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001279
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301280 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001281 }
Edhar, Mahesh Kumarbd8b3912015-11-25 19:28:12 +05301282
Jeff Johnsonc0db3842017-09-13 18:34:28 -07001283 hHal = CDS_GET_HAL_CB();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001284 if (NULL == hHal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301285 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001286 "%s: Invalid HAL pointer from p_cds_gctx", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301287 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001288 }
1289 pMac = PMAC_STRUCT(hHal);
1290
Tushnim Bhattacharyya9a929992017-06-18 00:59:09 -07001291 if (strict && !policy_mgr_is_safe_channel(pMac->psoc, targetChannel)) {
1292 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
1293 "%u is unsafe channel", targetChannel);
1294 return QDF_STATUS_E_FAULT;
1295 }
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05301296 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
Manishekar Chandrasekaran1004ad92016-09-04 22:01:47 +05301297 "%s: sap chan:%d target:%d conn on 5GHz:%d",
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05301298 __func__, sapContext->channel, targetChannel,
Tushnim Bhattacharyya66348bd2017-03-09 15:02:10 -08001299 policy_mgr_is_any_mode_active_on_band_along_with_session(
1300 pMac->psoc, sapContext->sessionId, POLICY_MGR_BAND_5));
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05301301
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001302 /*
1303 * Now, validate if the passed channel is valid in the
1304 * current regulatory domain.
1305 */
1306 if (sapContext->channel != targetChannel &&
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07001307 ((wlan_reg_get_channel_state(pMac->pdev, targetChannel) ==
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001308 CHANNEL_STATE_ENABLE) ||
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07001309 (wlan_reg_get_channel_state(pMac->pdev, targetChannel) ==
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001310 CHANNEL_STATE_DFS &&
Tushnim Bhattacharyya66348bd2017-03-09 15:02:10 -08001311 !policy_mgr_is_any_mode_active_on_band_along_with_session(
1312 pMac->psoc, sapContext->sessionId,
1313 POLICY_MGR_BAND_5)))) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001314 /*
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +05301315 * validate target channel switch w.r.t various concurrency
1316 * rules set.
1317 */
1318 valid = wlan_sap_validate_channel_switch(hHal, targetChannel,
1319 sapContext);
1320 if (!valid) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301321 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +05301322 FL("Channel switch to %u is not allowed due to concurrent channel interference"),
1323 targetChannel);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301324 return QDF_STATUS_E_FAULT;
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +05301325 }
1326 /*
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001327 * Post a CSA IE request to SAP state machine with
1328 * target channel information and also CSA IE required
1329 * flag set in sapContext only, if SAP is in eSAP_STARTED
1330 * state.
1331 */
1332 if (eSAP_STARTED == sapContext->sapsMachine) {
Edhar, Mahesh Kumarbd8b3912015-11-25 19:28:12 +05301333 status = wlansap_update_csa_channel_params(sapContext,
1334 targetChannel);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301335 if (status != QDF_STATUS_SUCCESS)
Edhar, Mahesh Kumarbd8b3912015-11-25 19:28:12 +05301336 return status;
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +05301337
1338 /*
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001339 * Copy the requested target channel
1340 * to sap context.
1341 */
1342 pMac->sap.SapDfsInfo.target_channel = targetChannel;
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08001343 pMac->sap.SapDfsInfo.new_ch_params.ch_width =
1344 pMac->sap.SapDfsInfo.new_chanWidth;
Chandrasekaran, Manishekara74bb022016-01-12 18:37:43 +05301345
1346 /* By this time, the best bandwidth is calculated for
1347 * the given target channel. Now, if there was a
1348 * request from user to move to a selected bandwidth,
1349 * we can see if it can be honored.
1350 *
1351 * Ex1: BW80 was selected for the target channel and
1352 * user wants BW40, it can be allowed
1353 * Ex2: BW40 was selected for the target channel and
1354 * user wants BW80, it cannot be allowed for the given
1355 * target channel.
1356 *
1357 * So, the MIN of the selected channel bandwidth and
1358 * user input is used for the bandwidth
1359 */
1360 if (target_bw != CH_WIDTH_MAX) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301361 QDF_TRACE(QDF_MODULE_ID_SAP,
1362 QDF_TRACE_LEVEL_INFO,
Chandrasekaran, Manishekara74bb022016-01-12 18:37:43 +05301363 "%s: target bw:%d new width:%d",
1364 __func__, target_bw,
1365 pMac->sap.SapDfsInfo.
1366 new_ch_params.ch_width);
1367 pMac->sap.SapDfsInfo.new_ch_params.ch_width =
1368 pMac->sap.SapDfsInfo.new_chanWidth =
Anurag Chouhan6d760662016-02-20 16:05:43 +05301369 QDF_MIN(pMac->sap.SapDfsInfo.
Chandrasekaran, Manishekara74bb022016-01-12 18:37:43 +05301370 new_ch_params.ch_width,
1371 target_bw);
1372 }
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07001373 wlan_reg_set_channel_params(pMac->pdev, targetChannel,
Sandeep Puligilla1cc23f62016-04-27 16:52:49 -07001374 0, &pMac->sap.SapDfsInfo.new_ch_params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001375 /*
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001376 * Set the CSA IE required flag.
1377 */
1378 pMac->sap.SapDfsInfo.csaIERequired = true;
1379
1380 /*
1381 * Set the radar found status to allow the channel
1382 * change to happen same as in the case of a radar
1383 * detection. Since, this will allow SAP to be in
1384 * correct state and also resume the netif queues
1385 * that were suspended in HDD before the channel
1386 * request was issued.
1387 */
1388 pMac->sap.SapDfsInfo.sap_radar_found_status = true;
Edhar, Mahesh Kumar695468e2015-10-19 12:06:20 +05301389 pMac->sap.SapDfsInfo.cac_state =
1390 eSAP_DFS_DO_NOT_SKIP_CAC;
1391 sap_cac_reset_notify(hHal);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001392
1393 /*
Chandrasekaran, Manishekar8104abd2016-01-29 18:10:27 +05301394 * Post the eSAP_CHANNEL_SWITCH_ANNOUNCEMENT_START
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001395 * to SAP state machine to process the channel
1396 * request with CSA IE set in the beacons.
1397 */
1398 sapEvent.event =
Chandrasekaran, Manishekar8104abd2016-01-29 18:10:27 +05301399 eSAP_CHANNEL_SWITCH_ANNOUNCEMENT_START;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001400 sapEvent.params = 0;
1401 sapEvent.u1 = 0;
1402 sapEvent.u2 = 0;
1403
1404 sap_fsm(sapContext, &sapEvent);
1405
1406 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301407 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001408 "%s: Failed to request Channel Change, since"
1409 "SAP is not in eSAP_STARTED state", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301410 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001411 }
1412
1413 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301414 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001415 "%s: Channel = %d is not valid in the current"
1416 "regulatory domain", __func__, targetChannel);
1417
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301418 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001419 }
1420
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301421 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Chandrasekaran, Manishekar8104abd2016-01-29 18:10:27 +05301422 "%s: Posted eSAP_CHANNEL_SWITCH_ANNOUNCEMENT_START successfully to sap_fsm for Channel = %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001423 __func__, targetChannel);
1424
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301425 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001426}
1427
Jeff Johnsone13d8062017-09-28 06:54:55 -07001428QDF_STATUS wlansap_set_key_sta(struct sap_context *sap_ctx,
Jeff Johnsone6b25d92017-09-25 14:30:32 -07001429 tCsrRoamSetKey *pSetKeyInfo)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001430{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301431 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001432 void *hHal = NULL;
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301433 QDF_STATUS qdf_ret_status = QDF_STATUS_E_FAILURE;
Krunal Sonibfd05492017-10-03 15:48:37 -07001434 uint32_t roamId = INVALID_ROAM_ID;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001435
Jeff Johnsone13d8062017-09-28 06:54:55 -07001436 if (NULL == sap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301437 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Jeff Johnsone6b25d92017-09-25 14:30:32 -07001438 "%s: Invalid SAP pointer",
Peng Xuf5d60c82015-10-02 17:17:03 -07001439 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301440 return QDF_STATUS_E_FAULT;
Peng Xuf5d60c82015-10-02 17:17:03 -07001441 }
Jeff Johnsonc0db3842017-09-13 18:34:28 -07001442 hHal = CDS_GET_HAL_CB();
Peng Xuf5d60c82015-10-02 17:17:03 -07001443 if (NULL == hHal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301444 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Jeff Johnsone6b25d92017-09-25 14:30:32 -07001445 "%s: Invalid HAL pointer",
Peng Xuf5d60c82015-10-02 17:17:03 -07001446 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301447 return QDF_STATUS_E_FAULT;
Peng Xuf5d60c82015-10-02 17:17:03 -07001448 }
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301449 qdf_ret_status =
Jeff Johnsone13d8062017-09-28 06:54:55 -07001450 sme_roam_set_key(hHal, sap_ctx->sessionId, pSetKeyInfo,
Peng Xuf5d60c82015-10-02 17:17:03 -07001451 &roamId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001452
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301453 if (qdf_ret_status == QDF_STATUS_SUCCESS)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301454 qdf_status = QDF_STATUS_SUCCESS;
Peng Xuf5d60c82015-10-02 17:17:03 -07001455 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301456 qdf_status = QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001457
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301458 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001459}
1460
Jeff Johnson617fe642017-09-24 17:52:51 -07001461QDF_STATUS wlan_sap_getstation_ie_information(struct sap_context *sap_ctx,
1462 uint32_t *len, uint8_t *buf)
1463{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301464 QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001465 uint32_t ie_len = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001466
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001467 if (NULL == sap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301468 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Jeff Johnson617fe642017-09-24 17:52:51 -07001469 FL("Invalid SAP pointer"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301470 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001471 }
1472
1473 if (len) {
1474 ie_len = *len;
1475 *len = sap_ctx->nStaWPARSnReqIeLength;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301476 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001477 FL("WPAIE len : %x"), *len);
1478 if ((buf) && (ie_len >= sap_ctx->nStaWPARSnReqIeLength)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301479 qdf_mem_copy(buf,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001480 sap_ctx->pStaWpaRsnReqIE,
1481 sap_ctx->nStaWPARSnReqIeLength);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301482 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001483 FL("WPAIE: %02x:%02x:%02x:%02x:%02x:%02x"),
1484 buf[0], buf[1], buf[2], buf[3], buf[4],
1485 buf[5]);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301486 qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001487 }
1488 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301489 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001490}
1491
Jeff Johnsone13d8062017-09-28 06:54:55 -07001492QDF_STATUS wlansap_send_action(struct sap_context *sap_ctx,
Jeff Johnson730c2502017-09-25 14:33:45 -07001493 const uint8_t *pBuf, uint32_t len,
1494 uint16_t wait, uint16_t channel_freq)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001495{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001496 void *hHal = NULL;
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301497 QDF_STATUS qdf_ret_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001498
Jeff Johnsone13d8062017-09-28 06:54:55 -07001499 if (NULL == sap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301500 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Jeff Johnson730c2502017-09-25 14:33:45 -07001501 "%s: Invalid SAP pointer",
Peng Xuf5d60c82015-10-02 17:17:03 -07001502 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301503 return QDF_STATUS_E_FAULT;
Peng Xuf5d60c82015-10-02 17:17:03 -07001504 }
Jeff Johnsonc0db3842017-09-13 18:34:28 -07001505 hHal = CDS_GET_HAL_CB();
Krunal Soni074dd2c2017-04-14 14:57:34 -07001506 if (NULL == hHal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301507 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Krunal Soni074dd2c2017-04-14 14:57:34 -07001508 FL("NULL hal pointer"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301509 return QDF_STATUS_E_FAULT;
Peng Xuf5d60c82015-10-02 17:17:03 -07001510 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001511
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301512 qdf_ret_status =
Jeff Johnsone13d8062017-09-28 06:54:55 -07001513 sme_send_action(hHal, sap_ctx->sessionId, pBuf, len, 0,
Peng Xuf5d60c82015-10-02 17:17:03 -07001514 0, channel_freq);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001515
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301516 if (QDF_STATUS_SUCCESS == qdf_ret_status) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301517 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001518 }
1519
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301520 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001521 "Failed to Send Action Frame");
1522
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301523 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001524}
1525
Jeff Johnsone13d8062017-09-28 06:54:55 -07001526QDF_STATUS wlansap_remain_on_channel(struct sap_context *sap_ctx,
Jeff Johnsoneea4e302017-09-25 14:40:14 -07001527 uint8_t channel, uint32_t duration,
1528 remainOnChanCallback callback,
1529 void *pContext, uint32_t *scan_id)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001530{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001531 void *hHal = NULL;
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301532 QDF_STATUS qdf_ret_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001533
Jeff Johnsone13d8062017-09-28 06:54:55 -07001534 if (NULL == sap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301535 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Jeff Johnsoneea4e302017-09-25 14:40:14 -07001536 "%s: Invalid SAP pointer",
Peng Xuf5d60c82015-10-02 17:17:03 -07001537 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301538 return QDF_STATUS_E_FAULT;
Peng Xuf5d60c82015-10-02 17:17:03 -07001539 }
Jeff Johnsonc0db3842017-09-13 18:34:28 -07001540 hHal = CDS_GET_HAL_CB();
Krunal Soni074dd2c2017-04-14 14:57:34 -07001541 if (NULL == hHal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301542 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Krunal Soni074dd2c2017-04-14 14:57:34 -07001543 FL("NULL hal pointer"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301544 return QDF_STATUS_E_FAULT;
Peng Xuf5d60c82015-10-02 17:17:03 -07001545 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001546
Jeff Johnsone13d8062017-09-28 06:54:55 -07001547 qdf_ret_status = sme_remain_on_channel(hHal, sap_ctx->sessionId,
Peng Xuf5d60c82015-10-02 17:17:03 -07001548 channel, duration, callback, pContext,
1549 true, scan_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001550
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301551 if (QDF_STATUS_SUCCESS == qdf_ret_status) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301552 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001553 }
1554
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301555 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001556 "Failed to Set Remain on Channel");
1557
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301558 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001559}
1560
Jeff Johnsone13d8062017-09-28 06:54:55 -07001561QDF_STATUS wlansap_cancel_remain_on_channel(struct sap_context *sap_ctx,
Jeff Johnsond4ca1e52017-09-25 14:44:50 -07001562 uint32_t scan_id)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001563{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001564 void *hHal = NULL;
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301565 QDF_STATUS qdf_ret_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001566
Jeff Johnsone13d8062017-09-28 06:54:55 -07001567 if (NULL == sap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301568 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Jeff Johnsond4ca1e52017-09-25 14:44:50 -07001569 "%s: Invalid SAP pointer",
Peng Xuf5d60c82015-10-02 17:17:03 -07001570 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301571 return QDF_STATUS_E_FAULT;
Peng Xuf5d60c82015-10-02 17:17:03 -07001572 }
Jeff Johnsonc0db3842017-09-13 18:34:28 -07001573 hHal = CDS_GET_HAL_CB();
Krunal Soni074dd2c2017-04-14 14:57:34 -07001574 if (NULL == hHal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301575 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Krunal Soni074dd2c2017-04-14 14:57:34 -07001576 FL("HAL pointer is null"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301577 return QDF_STATUS_E_FAULT;
Peng Xuf5d60c82015-10-02 17:17:03 -07001578 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001579
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301580 qdf_ret_status =
Jeff Johnsone13d8062017-09-28 06:54:55 -07001581 sme_cancel_remain_on_channel(hHal, sap_ctx->sessionId,
Peng Xuf5d60c82015-10-02 17:17:03 -07001582 scan_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001583
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301584 if (QDF_STATUS_SUCCESS == qdf_ret_status) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301585 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001586 }
1587
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301588 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001589 "Failed to Cancel Remain on Channel");
1590
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301591 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001592}
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05301593
Jeff Johnsoncd1ee1e2017-09-25 14:50:49 -07001594QDF_STATUS wlan_sap_update_next_channel(struct sap_context *sap_ctx,
1595 uint8_t channel,
1596 enum phy_ch_width chan_bw)
Kapil Gupta8878ad92017-02-13 11:56:04 +05301597{
Kapil Gupta8878ad92017-02-13 11:56:04 +05301598 if (!sap_ctx) {
1599 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
1600 "%s: Invalid SAP pointer", __func__);
1601 return QDF_STATUS_E_FAULT;
1602 }
1603
1604 sap_ctx->dfs_vendor_channel = channel;
1605 sap_ctx->dfs_vendor_chan_bw = chan_bw;
1606
1607 return QDF_STATUS_SUCCESS;
1608}
1609
Jeff Johnson108566e2017-09-25 14:54:35 -07001610QDF_STATUS wlan_sap_set_pre_cac_status(struct sap_context *sap_ctx,
1611 bool status, tHalHandle handle)
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05301612{
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05301613 tpAniSirGlobal mac_ctx = PMAC_STRUCT(handle);
1614
1615 if (!mac_ctx) {
1616 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
1617 "%s: Invalid mac pointer", __func__);
1618 return QDF_STATUS_E_FAULT;
1619 }
1620
1621 if (!sap_ctx) {
1622 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
1623 "%s: Invalid SAP pointer", __func__);
1624 return QDF_STATUS_E_FAULT;
1625 }
1626
1627 sap_ctx->is_pre_cac_on = status;
1628 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG,
1629 "%s: is_pre_cac_on:%d", __func__, sap_ctx->is_pre_cac_on);
1630
1631 return QDF_STATUS_SUCCESS;
1632}
1633
Jeff Johnson2cdcfdc2017-09-25 15:00:22 -07001634QDF_STATUS wlan_sap_set_chan_before_pre_cac(struct sap_context *sap_ctx,
1635 uint8_t chan_before_pre_cac)
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05301636{
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05301637 if (!sap_ctx) {
1638 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
1639 "%s: Invalid SAP pointer", __func__);
1640 return QDF_STATUS_E_FAULT;
1641 }
1642
1643 sap_ctx->chan_before_pre_cac = chan_before_pre_cac;
1644 return QDF_STATUS_SUCCESS;
1645}
1646
Jeff Johnsona68cc532017-09-25 15:18:30 -07001647QDF_STATUS wlan_sap_set_pre_cac_complete_status(struct sap_context *sap_ctx,
1648 bool status)
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05301649{
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05301650 if (!sap_ctx) {
1651 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
1652 "%s: Invalid SAP pointer", __func__);
1653 return QDF_STATUS_E_FAULT;
1654 }
1655
1656 sap_ctx->pre_cac_complete = status;
1657
1658 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG,
1659 "%s: pre cac complete status:%d session:%d",
1660 __func__, status, sap_ctx->sessionId);
1661
1662 return QDF_STATUS_SUCCESS;
1663}
1664
1665/**
1666 * wlan_sap_is_pre_cac_active() - Checks if pre cac in in progress
1667 * @handle: Global MAC handle
1668 *
1669 * Checks if pre cac is in progress in any of the SAP contexts
1670 *
1671 * Return: True is pre cac is active, false otherwise
1672 */
1673bool wlan_sap_is_pre_cac_active(tHalHandle handle)
1674{
1675 tpAniSirGlobal mac = NULL;
1676 int i;
1677
1678 mac = PMAC_STRUCT(handle);
1679 if (!mac) {
1680 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
1681 "%s: Invalid mac context", __func__);
1682 return false;
1683 }
1684
1685 for (i = 0; i < SAP_MAX_NUM_SESSION; i++) {
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -07001686 struct sap_context *context =
1687 mac->sap.sapCtxList[i].pSapContext;
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05301688 if (context && context->is_pre_cac_on)
1689 return true;
1690 }
1691 return false;
1692}
1693
1694/**
1695 * wlan_sap_get_pre_cac_vdev_id() - Get vdev id of the pre cac interface
1696 * @handle: Global handle
1697 * @vdev_id: vdev id
1698 *
1699 * Fetches the vdev id of the pre cac interface
1700 *
1701 * Return: QDF_STATUS
1702 */
1703QDF_STATUS wlan_sap_get_pre_cac_vdev_id(tHalHandle handle, uint8_t *vdev_id)
1704{
1705 tpAniSirGlobal mac = NULL;
1706 uint8_t i;
1707
1708 mac = PMAC_STRUCT(handle);
1709 if (!mac) {
1710 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
1711 "%s: Invalid mac context", __func__);
1712 return QDF_STATUS_E_FAULT;
1713 }
1714
1715 for (i = 0; i < SAP_MAX_NUM_SESSION; i++) {
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -07001716 struct sap_context *context =
1717 mac->sap.sapCtxList[i].pSapContext;
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05301718 if (context && context->is_pre_cac_on) {
1719 *vdev_id = i;
1720 return QDF_STATUS_SUCCESS;
1721 }
1722 }
1723 return QDF_STATUS_E_FAILURE;
1724}
1725
Jeff Johnsone13d8062017-09-28 06:54:55 -07001726QDF_STATUS wlansap_register_mgmt_frame(struct sap_context *sap_ctx,
Jeff Johnson4a7ff432017-09-24 18:10:00 -07001727 uint16_t frameType,
1728 uint8_t *matchData,
1729 uint16_t matchLen)
1730{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001731 void *hHal = NULL;
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301732 QDF_STATUS qdf_ret_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001733
Jeff Johnsone13d8062017-09-28 06:54:55 -07001734 if (NULL == sap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301735 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Peng Xuf5d60c82015-10-02 17:17:03 -07001736 "%s: Invalid SAP pointer from pCtx",
1737 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301738 return QDF_STATUS_E_FAULT;
Peng Xuf5d60c82015-10-02 17:17:03 -07001739 }
Jeff Johnsonc0db3842017-09-13 18:34:28 -07001740 hHal = CDS_GET_HAL_CB();
Krunal Soni074dd2c2017-04-14 14:57:34 -07001741 if (NULL == hHal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301742 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Krunal Soni074dd2c2017-04-14 14:57:34 -07001743 FL("hal pointer null"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301744 return QDF_STATUS_E_FAULT;
Peng Xuf5d60c82015-10-02 17:17:03 -07001745 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001746
Jeff Johnsone13d8062017-09-28 06:54:55 -07001747 qdf_ret_status = sme_register_mgmt_frame(hHal, sap_ctx->sessionId,
Peng Xuf5d60c82015-10-02 17:17:03 -07001748 frameType, matchData,
1749 matchLen);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001750
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301751 if (QDF_STATUS_SUCCESS == qdf_ret_status) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301752 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001753 }
1754
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301755 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001756 "Failed to Register MGMT frame");
1757
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301758 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001759}
1760
Jeff Johnsone13d8062017-09-28 06:54:55 -07001761QDF_STATUS wlansap_de_register_mgmt_frame(struct sap_context *sap_ctx,
Jeff Johnson42e7c402017-09-24 18:18:10 -07001762 uint16_t frameType,
1763 uint8_t *matchData,
1764 uint16_t matchLen)
1765{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001766 void *hHal = NULL;
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301767 QDF_STATUS qdf_ret_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001768
Jeff Johnsone13d8062017-09-28 06:54:55 -07001769 if (NULL == sap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301770 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Peng Xuf5d60c82015-10-02 17:17:03 -07001771 "%s: Invalid SAP pointer from pCtx",
1772 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301773 return QDF_STATUS_E_FAULT;
Peng Xuf5d60c82015-10-02 17:17:03 -07001774 }
Jeff Johnsonc0db3842017-09-13 18:34:28 -07001775 hHal = CDS_GET_HAL_CB();
Krunal Soni074dd2c2017-04-14 14:57:34 -07001776 if (NULL == hHal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301777 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Krunal Soni074dd2c2017-04-14 14:57:34 -07001778 FL("hal pointer null"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301779 return QDF_STATUS_E_FAULT;
Peng Xuf5d60c82015-10-02 17:17:03 -07001780 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001781
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301782 qdf_ret_status =
Jeff Johnsone13d8062017-09-28 06:54:55 -07001783 sme_deregister_mgmt_frame(hHal, sap_ctx->sessionId, frameType,
Peng Xuf5d60c82015-10-02 17:17:03 -07001784 matchData, matchLen);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001785
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301786 if (QDF_STATUS_SUCCESS == qdf_ret_status) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301787 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001788 }
1789
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301790 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001791 "Failed to Deregister MGMT frame");
1792
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301793 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001794}
1795
Jeff Johnson164b3bb2017-09-25 19:34:14 -07001796QDF_STATUS wlansap_channel_change_request(struct sap_context *sapContext,
1797 uint8_t target_channel)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001798{
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301799 QDF_STATUS qdf_ret_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001800 void *hHal = NULL;
1801 tpAniSirGlobal mac_ctx = NULL;
1802 eCsrPhyMode phy_mode;
Amar Singhal5cccafe2017-02-15 12:42:58 -08001803 struct ch_params *ch_params;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001804
1805 if (NULL == sapContext) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301806 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001807 "%s: Invalid SAP pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301808 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001809 }
1810
Jeff Johnsonc0db3842017-09-13 18:34:28 -07001811 hHal = CDS_GET_HAL_CB();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001812 if (NULL == hHal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301813 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001814 "%s: Invalid HAL pointer from p_cds_gctx", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301815 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001816 }
1817 mac_ctx = PMAC_STRUCT(hHal);
1818 phy_mode = sapContext->csr_roamProfile.phyMode;
Wu Gaoa61310a2016-11-29 17:02:36 +08001819
1820 if (sapContext->csr_roamProfile.ChannelInfo.numOfChannels == 0 ||
1821 sapContext->csr_roamProfile.ChannelInfo.ChannelList == NULL) {
1822 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
1823 FL("Invalid channel list"));
1824 return QDF_STATUS_E_FAULT;
1825 }
Abhishek Singh518323d2015-10-19 17:42:01 +05301826 sapContext->csr_roamProfile.ChannelInfo.ChannelList[0] = target_channel;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001827 /*
1828 * We are getting channel bonding mode from sapDfsInfor structure
1829 * because we've implemented channel width fallback mechanism for DFS
1830 * which will result in channel width changing dynamically.
1831 */
Sandeep Puligilla2111d3c2016-02-03 01:46:15 -08001832 ch_params = &mac_ctx->sap.SapDfsInfo.new_ch_params;
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07001833 wlan_reg_set_channel_params(mac_ctx->pdev, target_channel,
1834 0, ch_params);
Sandeep Puligilla2111d3c2016-02-03 01:46:15 -08001835 sapContext->ch_params.ch_width = ch_params->ch_width;
Abhishek Singh518323d2015-10-19 17:42:01 +05301836 /* Update the channel as this will be used to
1837 * send event to supplicant
1838 */
1839 sapContext->channel = target_channel;
Sandeep Puligilla2111d3c2016-02-03 01:46:15 -08001840 sapContext->csr_roamProfile.ch_params.ch_width = ch_params->ch_width;
Manishekar Chandrasekaranec267592016-05-26 19:10:04 +05301841 sapContext->csr_roamProfile.ch_params.sec_ch_offset =
1842 ch_params->sec_ch_offset;
1843 sapContext->csr_roamProfile.ch_params.center_freq_seg0 =
1844 ch_params->center_freq_seg0;
1845 sapContext->csr_roamProfile.ch_params.center_freq_seg1 =
1846 ch_params->center_freq_seg1;
Arif Hussaincd151632017-02-11 16:57:19 -08001847 sap_dfs_set_current_channel(sapContext);
Manishekar Chandrasekaranec267592016-05-26 19:10:04 +05301848
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301849 qdf_ret_status = sme_roam_channel_change_req(hHal, sapContext->bssid,
Sandeep Puligilla2111d3c2016-02-03 01:46:15 -08001850 ch_params, &sapContext->csr_roamProfile);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001851
Manishekar Chandrasekaranec267592016-05-26 19:10:04 +05301852 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
1853 "%s: chan:%d width:%d offset:%d seg0:%d seg1:%d",
1854 __func__, sapContext->channel, ch_params->ch_width,
1855 ch_params->sec_ch_offset, ch_params->center_freq_seg0,
1856 ch_params->center_freq_seg1);
1857
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301858 if (qdf_ret_status == QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001859 sap_signal_hdd_event(sapContext, NULL,
1860 eSAP_CHANNEL_CHANGE_EVENT,
1861 (void *) eSAP_STATUS_SUCCESS);
1862
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301863 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001864 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301865 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001866}
1867
Jeff Johnson3abdd242017-09-25 19:21:33 -07001868QDF_STATUS wlansap_start_beacon_req(struct sap_context *sap_ctx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001869{
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301870 QDF_STATUS qdf_ret_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001871 void *hHal = NULL;
1872 uint8_t dfsCacWaitStatus = 0;
1873 tpAniSirGlobal pMac = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001874
Jeff Johnson3abdd242017-09-25 19:21:33 -07001875 if (NULL == sap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301876 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001877 "%s: Invalid SAP pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301878 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001879 }
1880
Jeff Johnsonc0db3842017-09-13 18:34:28 -07001881 hHal = CDS_GET_HAL_CB();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001882 if (NULL == hHal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301883 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Jeff Johnson3abdd242017-09-25 19:21:33 -07001884 "%s: Invalid HAL pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301885 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001886 }
1887 pMac = PMAC_STRUCT(hHal);
1888
1889 /* No Radar was found during CAC WAIT, So start Beaconing */
1890 if (pMac->sap.SapDfsInfo.sap_radar_found_status == false) {
1891 /* CAC Wait done without any Radar Detection */
1892 dfsCacWaitStatus = true;
Jeff Johnson3abdd242017-09-25 19:21:33 -07001893 sap_ctx->pre_cac_complete = false;
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301894 qdf_ret_status = sme_roam_start_beacon_req(hHal,
Jeff Johnson3abdd242017-09-25 19:21:33 -07001895 sap_ctx->bssid,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001896 dfsCacWaitStatus);
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301897 if (qdf_ret_status == QDF_STATUS_SUCCESS) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301898 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001899 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301900 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001901 }
1902
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301903 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001904}
1905
Jeff Johnsonbfeafc62017-09-25 18:50:01 -07001906QDF_STATUS wlansap_dfs_send_csa_ie_request(struct sap_context *sap_ctx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001907{
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301908 QDF_STATUS qdf_ret_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001909 void *hHal = NULL;
1910 tpAniSirGlobal pMac = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001911
Jeff Johnsonbfeafc62017-09-25 18:50:01 -07001912 if (NULL == sap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301913 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001914 "%s: Invalid SAP pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301915 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001916 }
1917
Jeff Johnsonc0db3842017-09-13 18:34:28 -07001918 hHal = CDS_GET_HAL_CB();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001919 if (NULL == hHal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301920 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Jeff Johnsonbfeafc62017-09-25 18:50:01 -07001921 "%s: Invalid HAL pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301922 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001923 }
1924 pMac = PMAC_STRUCT(hHal);
1925
Sandeep Puligilla2111d3c2016-02-03 01:46:15 -08001926 pMac->sap.SapDfsInfo.new_ch_params.ch_width =
1927 pMac->sap.SapDfsInfo.new_chanWidth;
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07001928 wlan_reg_set_channel_params(pMac->pdev,
1929 pMac->sap.SapDfsInfo.target_channel,
1930 0, &pMac->sap.SapDfsInfo.new_ch_params);
Sandeep Puligilla2111d3c2016-02-03 01:46:15 -08001931
Chandrasekaran Manishekar4fcb7f52016-03-07 19:09:20 +05301932 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
1933 "%s: chan:%d req:%d width:%d off:%d",
1934 __func__, pMac->sap.SapDfsInfo.target_channel,
1935 pMac->sap.SapDfsInfo.csaIERequired,
1936 pMac->sap.SapDfsInfo.new_ch_params.ch_width,
1937 pMac->sap.SapDfsInfo.new_ch_params.sec_ch_offset);
1938
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301939 qdf_ret_status = sme_roam_csa_ie_request(hHal,
Jeff Johnsonbfeafc62017-09-25 18:50:01 -07001940 sap_ctx->bssid,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001941 pMac->sap.SapDfsInfo.target_channel,
1942 pMac->sap.SapDfsInfo.csaIERequired,
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08001943 &pMac->sap.SapDfsInfo.new_ch_params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001944
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301945 if (qdf_ret_status == QDF_STATUS_SUCCESS) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301946 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001947 }
1948
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301949 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001950}
1951
1952/*==========================================================================
1953 FUNCTION wlansap_get_dfs_ignore_cac
1954
1955 DESCRIPTION
1956 This API is used to get the value of ignore_cac value
1957
1958 DEPENDENCIES
1959 NA.
1960
1961 PARAMETERS
1962 IN
1963 hHal : HAL pointer
1964 pIgnore_cac : pointer to ignore_cac variable
1965
1966 RETURN VALUE
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301967 The QDF_STATUS code associated with performing the operation
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001968
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301969 QDF_STATUS_SUCCESS: Success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001970
1971 SIDE EFFECTS
1972 ============================================================================*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301973QDF_STATUS wlansap_get_dfs_ignore_cac(tHalHandle hHal, uint8_t *pIgnore_cac)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001974{
1975 tpAniSirGlobal pMac = NULL;
1976
1977 if (NULL != hHal) {
1978 pMac = PMAC_STRUCT(hHal);
1979 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301980 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001981 "%s: Invalid hHal pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301982 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001983 }
1984
1985 *pIgnore_cac = pMac->sap.SapDfsInfo.ignore_cac;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301986 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001987}
1988
1989/*==========================================================================
1990 FUNCTION wlansap_set_dfs_ignore_cac
1991
1992 DESCRIPTION
1993 This API is used to Set the value of ignore_cac value
1994
1995 DEPENDENCIES
1996 NA.
1997
1998 PARAMETERS
1999 IN
2000 hHal : HAL pointer
2001 ignore_cac : value to set for ignore_cac variable in DFS global structure.
2002
2003 RETURN VALUE
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302004 The QDF_STATUS code associated with performing the operation
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002005
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302006 QDF_STATUS_SUCCESS: Success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002007
2008 SIDE EFFECTS
2009 ============================================================================*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302010QDF_STATUS wlansap_set_dfs_ignore_cac(tHalHandle hHal, uint8_t ignore_cac)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002011{
2012 tpAniSirGlobal pMac = NULL;
2013
2014 if (NULL != hHal) {
2015 pMac = PMAC_STRUCT(hHal);
2016 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302017 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002018 "%s: Invalid hHal pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302019 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002020 }
2021
2022 pMac->sap.SapDfsInfo.ignore_cac = (ignore_cac >= true) ?
2023 true : false;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302024 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002025}
2026
2027/**
2028 * wlansap_set_dfs_restrict_japan_w53() - enable/disable dfS for japan
2029 * @hHal : HAL pointer
2030 * @disable_Dfs_JapanW3 :Indicates if Japan W53 is disabled when set to 1
2031 * Indicates if Japan W53 is enabled when set to 0
2032 *
2033 * This API is used to enable or disable Japan W53 Band
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302034 * Return: The QDF_STATUS code associated with performing the operation
2035 * QDF_STATUS_SUCCESS: Success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002036 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302037QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002038wlansap_set_dfs_restrict_japan_w53(tHalHandle hHal, uint8_t disable_Dfs_W53)
2039{
2040 tpAniSirGlobal pMac = NULL;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302041 QDF_STATUS status;
Amar Singhal5cccafe2017-02-15 12:42:58 -08002042 enum dfs_reg dfs_region;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002043
2044 if (NULL != hHal) {
2045 pMac = PMAC_STRUCT(hHal);
2046 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302047 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002048 "%s: Invalid hHal pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302049 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002050 }
2051
Amar Singhal7f55e342017-05-24 15:23:06 -07002052 wlan_reg_get_dfs_region(pMac->pdev, &dfs_region);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002053
2054 /*
2055 * Set the JAPAN W53 restriction only if the current
2056 * regulatory domain is JAPAN.
2057 */
Amar Singhal5cccafe2017-02-15 12:42:58 -08002058 if (DFS_MKK_REG == dfs_region) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002059 pMac->sap.SapDfsInfo.is_dfs_w53_disabled = disable_Dfs_W53;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302060 QDF_TRACE(QDF_MODULE_ID_SAP,
2061 QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002062 FL("sapdfs: SET DFS JAPAN W53 DISABLED = %d"),
2063 pMac->sap.SapDfsInfo.is_dfs_w53_disabled);
2064
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302065 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002066 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302067 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002068 FL
Srinivas Girigowda678586c2017-03-10 00:13:58 -08002069 ("Regdomain not japan, set disable JP W53 not valid"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002070
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302071 status = QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002072 }
2073
2074 return status;
2075}
2076
Jeff Johnsonbc110a72017-09-25 15:22:18 -07002077bool sap_is_auto_channel_select(struct sap_context *sapcontext)
bings394afdd2017-01-09 11:22:38 +08002078{
bings394afdd2017-01-09 11:22:38 +08002079 if (NULL == sapcontext) {
2080 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
2081 "%s: Invalid SAP pointer", __func__);
Jeff Johnsonbc110a72017-09-25 15:22:18 -07002082 return false;
bings394afdd2017-01-09 11:22:38 +08002083 }
2084 return sapcontext->channel == AUTO_CHANNEL_SELECT;
2085}
2086
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002087#ifdef FEATURE_AP_MCC_CH_AVOIDANCE
2088/**
2089 * wlan_sap_set_channel_avoidance() - sets sap mcc channel avoidance ini param
2090 * @hal: hal handle
2091 * @sap_channel_avoidance: ini parameter value
2092 *
2093 * sets sap mcc channel avoidance ini param, to be called in sap_start
2094 *
2095 * Return: success of failure of operation
2096 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302097QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002098wlan_sap_set_channel_avoidance(tHalHandle hal, bool sap_channel_avoidance)
2099{
2100 tpAniSirGlobal mac_ctx = NULL;
2101 if (NULL != hal)
2102 mac_ctx = PMAC_STRUCT(hal);
2103 if (mac_ctx == NULL || hal == NULL) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302104 QDF_TRACE(QDF_MODULE_ID_SAP,
2105 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002106 FL("hal or mac_ctx pointer NULL"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302107 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002108 }
2109 mac_ctx->sap.sap_channel_avoidance = sap_channel_avoidance;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302110 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002111}
2112#endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
2113
2114/**
2115 * wlansap_set_dfs_preferred_channel_location() - set dfs preferred channel
2116 * @hHal : HAL pointer
2117 * @dfs_Preferred_Channels_location :
2118 * 0 - Indicates No preferred channel location restrictions
2119 * 1 - Indicates SAP Indoor Channels operation only.
2120 * 2 - Indicates SAP Outdoor Channels operation only.
2121 *
2122 * This API is used to set sap preferred channels location
2123 * to resetrict the DFS random channel selection algorithm
2124 * either Indoor/Outdoor channels only.
2125 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302126 * Return: The QDF_STATUS code associated with performing the operation
2127 * QDF_STATUS_SUCCESS: Success and error code otherwise.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002128 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302129QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002130wlansap_set_dfs_preferred_channel_location(tHalHandle hHal,
2131 uint8_t
2132 dfs_Preferred_Channels_location)
2133{
2134 tpAniSirGlobal pMac = NULL;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302135 QDF_STATUS status;
Amar Singhal5cccafe2017-02-15 12:42:58 -08002136 enum dfs_reg dfs_region;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002137
2138 if (NULL != hHal) {
2139 pMac = PMAC_STRUCT(hHal);
2140 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302141 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002142 "%s: Invalid hHal pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302143 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002144 }
2145
Amar Singhal7f55e342017-05-24 15:23:06 -07002146 wlan_reg_get_dfs_region(pMac->pdev, &dfs_region);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002147
2148 /*
2149 * The Indoor/Outdoor only random channel selection
2150 * restriction is currently enforeced only for
2151 * JAPAN regulatory domain.
2152 */
Amar Singhal5cccafe2017-02-15 12:42:58 -08002153 if (DFS_MKK_REG == dfs_region) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002154 pMac->sap.SapDfsInfo.sap_operating_chan_preferred_location =
2155 dfs_Preferred_Channels_location;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302156 QDF_TRACE(QDF_MODULE_ID_SAP,
2157 QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002158 FL
2159 ("sapdfs:Set Preferred Operating Channel location=%d"),
2160 pMac->sap.SapDfsInfo.
2161 sap_operating_chan_preferred_location);
2162
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302163 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002164 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302165 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002166 FL
2167 ("sapdfs:NOT JAPAN REG, Invalid Set preferred chans location"));
2168
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302169 status = QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002170 }
2171
2172 return status;
2173}
2174
2175/*==========================================================================
2176 FUNCTION wlansap_set_dfs_target_chnl
2177
2178 DESCRIPTION
2179 This API is used to set next target chnl as provided channel.
2180 you can provide any valid channel to this API.
2181
2182 DEPENDENCIES
2183 NA.
2184
2185 PARAMETERS
2186 IN
2187 hHal : HAL pointer
2188 target_channel : target channel to be set
2189
2190 RETURN VALUE
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302191 The QDF_STATUS code associated with performing the operation
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002192
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302193 QDF_STATUS_SUCCESS: Success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002194
2195 SIDE EFFECTS
2196 ============================================================================*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302197QDF_STATUS wlansap_set_dfs_target_chnl(tHalHandle hHal, uint8_t target_channel)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002198{
2199 tpAniSirGlobal pMac = NULL;
2200
2201 if (NULL != hHal) {
2202 pMac = PMAC_STRUCT(hHal);
2203 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302204 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002205 "%s: Invalid hHal pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302206 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002207 }
2208 if (target_channel > 0) {
2209 pMac->sap.SapDfsInfo.user_provided_target_channel =
2210 target_channel;
2211 } else {
2212 pMac->sap.SapDfsInfo.user_provided_target_channel = 0;
2213 }
2214
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302215 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002216}
2217
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302218QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002219wlansap_update_sap_config_add_ie(tsap_Config_t *pConfig,
2220 const uint8_t *pAdditionIEBuffer,
2221 uint16_t additionIELength,
2222 eUpdateIEsType updateType)
2223{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302224 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002225 uint8_t bufferValid = false;
2226 uint16_t bufferLength = 0;
2227 uint8_t *pBuffer = NULL;
2228
2229 if (NULL == pConfig) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302230 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002231 }
2232
2233 if ((pAdditionIEBuffer != NULL) && (additionIELength != 0)) {
2234 /* initialize the buffer pointer so that pe can copy */
2235 if (additionIELength > 0) {
2236 bufferLength = additionIELength;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302237 pBuffer = qdf_mem_malloc(bufferLength);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002238 if (NULL == pBuffer) {
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -08002239 QDF_TRACE(QDF_MODULE_ID_SAP,
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302240 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002241 FL("Could not allocate the buffer "));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302242 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002243 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302244 qdf_mem_copy(pBuffer, pAdditionIEBuffer, bufferLength);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002245 bufferValid = true;
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -08002246 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
2247 FL("update_type: %d"), updateType);
2248 qdf_trace_hex_dump(QDF_MODULE_ID_SAP,
2249 QDF_TRACE_LEVEL_INFO, pBuffer, bufferLength);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002250 }
2251 }
2252
2253 switch (updateType) {
2254 case eUPDATE_IE_PROBE_BCN:
2255 if (bufferValid) {
2256 pConfig->probeRespBcnIEsLen = bufferLength;
2257 pConfig->pProbeRespBcnIEsBuffer = pBuffer;
2258 } else {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302259 qdf_mem_free(pConfig->pProbeRespBcnIEsBuffer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002260 pConfig->probeRespBcnIEsLen = 0;
2261 pConfig->pProbeRespBcnIEsBuffer = NULL;
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -08002262 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
2263 FL("No Probe Resp beacone IE received in set beacon"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002264 }
2265 break;
2266 case eUPDATE_IE_PROBE_RESP:
2267 if (bufferValid) {
2268 pConfig->probeRespIEsBufferLen = bufferLength;
2269 pConfig->pProbeRespIEsBuffer = pBuffer;
2270 } else {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302271 qdf_mem_free(pConfig->pProbeRespIEsBuffer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002272 pConfig->probeRespIEsBufferLen = 0;
2273 pConfig->pProbeRespIEsBuffer = NULL;
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -08002274 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
2275 FL("No Probe Response IE received in set beacon"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002276 }
2277 break;
2278 case eUPDATE_IE_ASSOC_RESP:
2279 if (bufferValid) {
2280 pConfig->assocRespIEsLen = bufferLength;
2281 pConfig->pAssocRespIEsBuffer = pBuffer;
2282 } else {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302283 qdf_mem_free(pConfig->pAssocRespIEsBuffer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002284 pConfig->assocRespIEsLen = 0;
2285 pConfig->pAssocRespIEsBuffer = NULL;
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -08002286 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
2287 FL("No Assoc Response IE received in set beacon"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002288 }
2289 break;
2290 default:
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -08002291 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002292 FL("No matching buffer type %d"), updateType);
2293 if (pBuffer != NULL)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302294 qdf_mem_free(pBuffer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002295 break;
2296 }
2297
2298 return status;
2299}
2300
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302301QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002302wlansap_reset_sap_config_add_ie(tsap_Config_t *pConfig, eUpdateIEsType updateType)
2303{
2304 if (NULL == pConfig) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302305 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002306 "%s: Invalid Config pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302307 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002308 }
2309
2310 switch (updateType) {
2311 case eUPDATE_IE_ALL: /*only used to reset */
2312 case eUPDATE_IE_PROBE_RESP:
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302313 qdf_mem_free(pConfig->pProbeRespIEsBuffer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002314 pConfig->probeRespIEsBufferLen = 0;
2315 pConfig->pProbeRespIEsBuffer = NULL;
2316 if (eUPDATE_IE_ALL != updateType)
2317 break;
2318
2319 case eUPDATE_IE_ASSOC_RESP:
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302320 qdf_mem_free(pConfig->pAssocRespIEsBuffer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002321 pConfig->assocRespIEsLen = 0;
2322 pConfig->pAssocRespIEsBuffer = NULL;
2323 if (eUPDATE_IE_ALL != updateType)
2324 break;
2325
2326 case eUPDATE_IE_PROBE_BCN:
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302327 qdf_mem_free(pConfig->pProbeRespBcnIEsBuffer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002328 pConfig->probeRespBcnIEsLen = 0;
2329 pConfig->pProbeRespBcnIEsBuffer = NULL;
2330 if (eUPDATE_IE_ALL != updateType)
2331 break;
2332
2333 default:
2334 if (eUPDATE_IE_ALL != updateType)
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302335 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002336 FL("Invalid buffer type %d"), updateType);
2337 break;
2338 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302339 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002340}
2341
2342/*==========================================================================
2343 FUNCTION wlansap_extend_to_acs_range
2344
2345 DESCRIPTION Function extends give channel range to consider ACS chan bonding
2346
2347 DEPENDENCIES PARAMETERS
2348
2349 IN /OUT
2350 *startChannelNum : ACS extend start ch
2351 *endChannelNum : ACS extended End ch
2352 *bandStartChannel: Band start ch
2353 *bandEndChannel : Band end ch
2354
2355 RETURN VALUE NONE
2356
2357 SIDE EFFECTS
2358 ============================================================================*/
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07002359void wlansap_extend_to_acs_range(tHalHandle hal, uint8_t *startChannelNum,
2360 uint8_t *endChannelNum, uint8_t *bandStartChannel,
2361 uint8_t *bandEndChannel)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002362{
2363#define ACS_WLAN_20M_CH_INC 4
2364#define ACS_2G_EXTEND ACS_WLAN_20M_CH_INC
2365#define ACS_5G_EXTEND (ACS_WLAN_20M_CH_INC * 3)
2366
2367 uint8_t tmp_startChannelNum = 0, tmp_endChannelNum = 0;
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07002368 tpAniSirGlobal mac_ctx;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002369
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07002370 mac_ctx = PMAC_STRUCT(hal);
2371 if (!mac_ctx) {
2372 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
2373 "%s: Invalid mac_ctx", __func__);
2374 return;
2375 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002376 if (*startChannelNum <= 14 && *endChannelNum <= 14) {
Amar Singhalb8d4f152016-02-10 10:21:43 -08002377 *bandStartChannel = CHAN_ENUM_1;
2378 *bandEndChannel = CHAN_ENUM_14;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002379 tmp_startChannelNum = *startChannelNum > 5 ?
2380 (*startChannelNum - ACS_2G_EXTEND) : 1;
2381 tmp_endChannelNum = (*endChannelNum + ACS_2G_EXTEND) <= 14 ?
2382 (*endChannelNum + ACS_2G_EXTEND) : 14;
2383 } else if (*startChannelNum >= 36 && *endChannelNum >= 36) {
Amar Singhalb8d4f152016-02-10 10:21:43 -08002384 *bandStartChannel = CHAN_ENUM_36;
2385 *bandEndChannel = CHAN_ENUM_165;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002386 tmp_startChannelNum = (*startChannelNum - ACS_5G_EXTEND) > 36 ?
2387 (*startChannelNum - ACS_5G_EXTEND) : 36;
2388 tmp_endChannelNum = (*endChannelNum + ACS_5G_EXTEND) <= 165 ?
2389 (*endChannelNum + ACS_5G_EXTEND) : 165;
2390 } else {
Amar Singhalb8d4f152016-02-10 10:21:43 -08002391 *bandStartChannel = CHAN_ENUM_1;
2392 *bandEndChannel = CHAN_ENUM_165;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002393 tmp_startChannelNum = *startChannelNum > 5 ?
2394 (*startChannelNum - ACS_2G_EXTEND) : 1;
2395 tmp_endChannelNum = (*endChannelNum + ACS_5G_EXTEND) <= 165 ?
2396 (*endChannelNum + ACS_5G_EXTEND) : 165;
2397 }
2398
2399 /* Note if the ACS range include only DFS channels, do not cross range
2400 * Active scanning in adjacent non DFS channels results in transmission
2401 * spikes in DFS specturm channels which is due to emission spill.
2402 * Remove the active channels from extend ACS range for DFS only range
2403 */
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07002404 if (wlan_reg_is_dfs_ch(mac_ctx->pdev, *startChannelNum)) {
2405 while (!wlan_reg_is_dfs_ch(mac_ctx->pdev,
2406 tmp_startChannelNum) &&
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002407 tmp_startChannelNum < *startChannelNum)
2408 tmp_startChannelNum += ACS_WLAN_20M_CH_INC;
2409
2410 *startChannelNum = tmp_startChannelNum;
2411 }
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07002412 if (wlan_reg_is_dfs_ch(mac_ctx->pdev, *endChannelNum)) {
2413 while (!wlan_reg_is_dfs_ch(mac_ctx->pdev,
2414 tmp_endChannelNum) &&
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002415 tmp_endChannelNum > *endChannelNum)
2416 tmp_endChannelNum -= ACS_WLAN_20M_CH_INC;
2417
2418 *endChannelNum = tmp_endChannelNum;
2419 }
2420}
2421
Jeff Johnsoned4ed172017-09-25 18:36:16 -07002422QDF_STATUS wlan_sap_set_vendor_acs(struct sap_context *sap_context,
2423 bool is_vendor_acs)
Kapil Gupta8878ad92017-02-13 11:56:04 +05302424{
Kapil Gupta8878ad92017-02-13 11:56:04 +05302425 if (!sap_context) {
2426 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
2427 "%s: Invalid SAP pointer", __func__);
2428 return QDF_STATUS_E_FAULT;
2429 }
2430 sap_context->vendor_acs_enabled = is_vendor_acs;
2431
2432 return QDF_STATUS_SUCCESS;
2433}
Jeff Johnsonb26e2702017-09-25 18:31:14 -07002434
2435QDF_STATUS wlansap_get_dfs_nol(struct sap_context *sap_ctx,
2436 uint8_t *nol, uint32_t *nol_len)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002437{
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05302438 int i = 0, j = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002439 void *hHal = NULL;
2440 tpAniSirGlobal pMac = NULL;
2441 uint64_t current_time, found_time, elapsed_time;
2442 unsigned long left_time;
2443 tSapDfsNolInfo *dfs_nol = NULL;
2444 bool bAvailable = false;
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05302445 *nol_len = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002446
Jeff Johnsonb26e2702017-09-25 18:31:14 -07002447 if (NULL == sap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302448 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Jeff Johnsonb26e2702017-09-25 18:31:14 -07002449 "%s: Invalid SAP pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302450 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002451 }
Jeff Johnsonc0db3842017-09-13 18:34:28 -07002452 hHal = CDS_GET_HAL_CB();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002453 if (NULL == hHal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302454 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Jeff Johnsonb26e2702017-09-25 18:31:14 -07002455 "%s: Invalid HAL pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302456 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002457 }
2458 pMac = PMAC_STRUCT(hHal);
2459
2460 if (!pMac->sap.SapDfsInfo.numCurrentRegDomainDfsChannels) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302461 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002462 "%s: DFS NOL is empty", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302463 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002464 }
2465
2466 dfs_nol = pMac->sap.SapDfsInfo.sapDfsChannelNolList;
2467
2468 if (!dfs_nol) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302469 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002470 "%s: DFS NOL context is null", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302471 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002472 }
2473
2474 for (i = 0; i < pMac->sap.SapDfsInfo.numCurrentRegDomainDfsChannels;
2475 i++) {
2476 if (!dfs_nol[i].dfs_channel_number)
2477 continue;
2478
2479 current_time = cds_get_monotonic_boottime();
2480 found_time = dfs_nol[i].radar_found_timestamp;
2481
2482 elapsed_time = current_time - found_time;
2483
2484 /* check if channel is available
2485 * if either channel is usable or available, or timer expired 30mins
2486 */
2487 bAvailable =
2488 ((dfs_nol[i].radar_status_flag ==
2489 eSAP_DFS_CHANNEL_AVAILABLE)
2490 || (dfs_nol[i].radar_status_flag ==
2491 eSAP_DFS_CHANNEL_USABLE)
2492 || (elapsed_time >= SAP_DFS_NON_OCCUPANCY_PERIOD));
2493
2494 if (bAvailable) {
2495 dfs_nol[i].radar_status_flag =
2496 eSAP_DFS_CHANNEL_AVAILABLE;
2497 dfs_nol[i].radar_found_timestamp = 0;
2498
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302499 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002500 "%s: Channel[%d] is AVAILABLE",
2501 __func__, dfs_nol[i].dfs_channel_number);
2502 } else {
2503
2504 /* the time left in min */
2505 left_time = SAP_DFS_NON_OCCUPANCY_PERIOD - elapsed_time;
2506 left_time = left_time / (60 * 1000 * 1000);
2507
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05302508 nol[j++] = dfs_nol[i].dfs_channel_number;
2509 (*nol_len)++;
2510
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302511 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002512 "%s: Channel[%d] is UNAVAILABLE [%lu min left]",
2513 __func__,
2514 dfs_nol[i].dfs_channel_number, left_time);
2515 }
2516 }
2517
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302518 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002519}
2520
Jeff Johnsonb3c4f7e2017-09-25 18:23:05 -07002521QDF_STATUS wlansap_set_dfs_nol(struct sap_context *sap_ctx,
2522 eSapDfsNolType conf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002523{
Arif Hussaincd151632017-02-11 16:57:19 -08002524 void *hal = NULL;
2525 tpAniSirGlobal mac = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002526
Arif Hussaincd151632017-02-11 16:57:19 -08002527 if (!sap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302528 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Jeff Johnsonb3c4f7e2017-09-25 18:23:05 -07002529 "%s: Invalid SAP pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302530 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002531 }
Arif Hussaincd151632017-02-11 16:57:19 -08002532
Jeff Johnsonc0db3842017-09-13 18:34:28 -07002533 hal = CDS_GET_HAL_CB();
Arif Hussaincd151632017-02-11 16:57:19 -08002534 if (!hal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302535 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Jeff Johnsonb3c4f7e2017-09-25 18:23:05 -07002536 "%s: Invalid HAL pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302537 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002538 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002539
Arif Hussaincd151632017-02-11 16:57:19 -08002540 mac = PMAC_STRUCT(hal);
2541 if (!mac->sap.SapDfsInfo.numCurrentRegDomainDfsChannels) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302542 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002543 "%s: DFS NOL is empty", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302544 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002545 }
2546
2547 if (conf == eSAP_DFS_NOL_CLEAR) {
Arif Hussaincd151632017-02-11 16:57:19 -08002548 struct wlan_objmgr_pdev *pdev;
2549
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302550 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002551 "%s: clear the DFS NOL", __func__);
2552
Arif Hussaincd151632017-02-11 16:57:19 -08002553 pdev = mac->pdev;
2554 if (!pdev) {
2555 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
2556 "%s: null pdev", __func__);
2557 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002558 }
Arif Hussaincd151632017-02-11 16:57:19 -08002559 dfs_clear_nol_channels(pdev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002560 } else if (conf == eSAP_DFS_NOL_RANDOMIZE) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302561 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002562 "%s: Randomize the DFS NOL", __func__);
2563
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002564 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302565 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002566 "%s: unsupport type %d", __func__, conf);
2567 }
2568
2569 /* set DFS-NOL back to keep it update-to-date in CNSS */
Arif Hussaincd151632017-02-11 16:57:19 -08002570 sap_signal_hdd_event(sap_ctx, NULL, eSAP_DFS_NOL_SET,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002571 (void *) eSAP_STATUS_SUCCESS);
2572
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302573 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002574}
2575
2576/**
2577 * wlansap_populate_del_sta_params() - populate delete station parameter
2578 * @mac: Pointer to peer mac address.
2579 * @reason_code: Reason code for the disassoc/deauth.
2580 * @subtype: Subtype points to either disassoc/deauth frame.
2581 * @pDelStaParams: Address where parameters to be populated.
2582 *
2583 * This API is used to populate delete station parameter structure
2584 *
2585 * Return: none
2586 */
2587
2588void wlansap_populate_del_sta_params(const uint8_t *mac,
2589 uint16_t reason_code,
2590 uint8_t subtype,
2591 struct tagCsrDelStaParams *pDelStaParams)
2592{
2593 if (NULL == mac)
Anurag Chouhanc5548422016-02-24 18:33:27 +05302594 qdf_set_macaddr_broadcast(&pDelStaParams->peerMacAddr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002595 else
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302596 qdf_mem_copy(pDelStaParams->peerMacAddr.bytes, mac,
Anurag Chouhan6d760662016-02-20 16:05:43 +05302597 QDF_MAC_ADDR_SIZE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002598
2599 if (reason_code == 0)
2600 pDelStaParams->reason_code = eSIR_MAC_DEAUTH_LEAVING_BSS_REASON;
2601 else
2602 pDelStaParams->reason_code = reason_code;
2603
2604 if (subtype == (SIR_MAC_MGMT_DEAUTH >> 4) ||
2605 subtype == (SIR_MAC_MGMT_DISASSOC >> 4))
2606 pDelStaParams->subtype = subtype;
2607 else
2608 pDelStaParams->subtype = (SIR_MAC_MGMT_DEAUTH >> 4);
2609
Srinivas Girigowda678586c2017-03-10 00:13:58 -08002610 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002611 FL(
2612 "Delete STA with RC:%hu subtype:%hhu MAC::"
2613 MAC_ADDRESS_STR),
2614 pDelStaParams->reason_code, pDelStaParams->subtype,
2615 MAC_ADDR_ARRAY(pDelStaParams->peerMacAddr.bytes));
2616}
2617
Jeff Johnson630fd6a2017-09-25 15:27:39 -07002618QDF_STATUS wlansap_acs_chselect(struct sap_context *sap_context,
2619 tpWLAN_SAPEventCB pacs_event_callback,
2620 tsap_Config_t *pconfig,
2621 void *pusr_context)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002622{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002623 tHalHandle h_hal = NULL;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302624 QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002625 tpAniSirGlobal pmac = NULL;
Zhu Jianmin62e11962017-09-07 13:33:50 +08002626 tWLAN_SAPEvent sapEvent; /* State machine event */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002627
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002628 if (NULL == sap_context) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302629 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Jeff Johnson630fd6a2017-09-25 15:27:39 -07002630 "%s: Invalid SAP pointer", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002631
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302632 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002633 }
2634
Jeff Johnsonc0db3842017-09-13 18:34:28 -07002635 h_hal = (tHalHandle)CDS_GET_HAL_CB();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002636 if (NULL == h_hal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302637 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Jeff Johnson630fd6a2017-09-25 15:27:39 -07002638 "%s: Invalid MAC context", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302639 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002640 }
2641
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002642 pmac = PMAC_STRUCT(h_hal);
2643 sap_context->acs_cfg = &pconfig->acs_cfg;
2644 sap_context->ch_width_orig = pconfig->acs_cfg.ch_width;
2645 sap_context->csr_roamProfile.phyMode = pconfig->acs_cfg.hw_mode;
2646
Peng Xu66162de2016-02-11 17:01:20 -08002647 /*
2648 * Now, configure the scan and ACS channel params
2649 * to issue a scan request.
2650 */
2651 wlansap_set_scan_acs_channel_params(pconfig, sap_context,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002652 pusr_context);
2653
Peng Xu66162de2016-02-11 17:01:20 -08002654 /*
2655 * Copy the HDD callback function to report the
2656 * ACS result after scan in SAP context callback function.
2657 */
2658 sap_context->pfnSapEventCallback = pacs_event_callback;
2659 /*
2660 * init dfs channel nol
2661 */
2662 sap_init_dfs_channel_nol_list(sap_context);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002663
Peng Xu66162de2016-02-11 17:01:20 -08002664 /*
2665 * Issue the scan request. This scan request is
2666 * issued before the start BSS is done so
2667 *
2668 * 1. No need to pass the second parameter
2669 * as the SAP state machine is not started yet
2670 * and there is no need for any event posting.
2671 *
2672 * 2. Set third parameter to TRUE to indicate the
2673 * channel selection function to register a
2674 * different scan callback fucntion to process
2675 * the results pre start BSS.
2676 */
Zhu Jianmin62e11962017-09-07 13:33:50 +08002677 qdf_status = sap_goto_channel_sel(sap_context, &sapEvent, true, false);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002678
Peng Xu66162de2016-02-11 17:01:20 -08002679 if (QDF_STATUS_E_ABORTED == qdf_status) {
2680 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002681 "In %s,DFS not supported in the current operating mode",
2682 __func__);
Peng Xu66162de2016-02-11 17:01:20 -08002683 return QDF_STATUS_E_FAILURE;
2684 } else if (QDF_STATUS_E_CANCELED == qdf_status) {
2685 /*
2686 * ERROR is returned when either the SME scan request
2687 * failed or ACS is overridden due to other constrainst
2688 * So send selected channel to HDD
2689 */
2690 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
2691 FL("Scan Req Failed/ACS Overridden"));
2692 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
2693 FL("Selected channel = %d"),
2694 sap_context->channel);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002695
Peng Xu66162de2016-02-11 17:01:20 -08002696 return sap_signal_hdd_event(sap_context, NULL,
2697 eSAP_ACS_CHANNEL_SELECTED,
2698 (void *) eSAP_STATUS_SUCCESS);
2699 } else if (QDF_STATUS_SUCCESS == qdf_status) {
2700 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002701 FL("Successfully Issued a Pre Start Bss Scan Request"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002702 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302703 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002704}
2705
2706/**
2707 * wlan_sap_enable_phy_error_logs() - Enable DFS phy error logs
2708 * @hal: global hal handle
2709 * @enable_log: value to set
2710 *
2711 * Since the frequency of DFS phy error is very high, enabling logs for them
2712 * all the times can cause crash and will also create lot of useless logs
2713 * causing difficulties in debugging other issue. This function will be called
2714 * from iwpriv cmd to eanble such logs temporarily.
2715 *
2716 * Return: void
2717 */
2718void wlan_sap_enable_phy_error_logs(tHalHandle hal, bool enable_log)
2719{
2720 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
2721 mac_ctx->sap.enable_dfs_phy_error_logs = enable_log;
2722}
Kai Liubdd5fcb2016-09-28 22:55:44 +08002723
Jeff Johnson92675a52017-09-25 15:35:19 -07002724uint32_t wlansap_get_chan_width(struct sap_context *sap_ctx)
Kai Liubdd5fcb2016-09-28 22:55:44 +08002725{
Jeff Johnson92675a52017-09-25 15:35:19 -07002726 return wlan_sap_get_vht_ch_width(sap_ctx);
Kai Liubdd5fcb2016-09-28 22:55:44 +08002727}
Yingying Tangb4832f72016-10-20 13:44:55 +08002728
2729/**
2730 * wlansap_set_tx_leakage_threshold() - set sap tx leakage threshold.
2731 * @hal: HAL pointer
2732 * @tx_leakage_threshold: sap tx leakage threshold
2733 *
2734 * This function set sap tx leakage threshold.
2735 *
2736 * Return: QDF_STATUS.
2737 */
2738QDF_STATUS wlansap_set_tx_leakage_threshold(tHalHandle hal,
2739 uint16_t tx_leakage_threshold)
2740{
2741 tpAniSirGlobal mac;
2742
2743 if (NULL == hal) {
2744 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
2745 "%s: Invalid hal pointer", __func__);
2746 return QDF_STATUS_E_FAULT;
2747 }
2748
2749 mac = PMAC_STRUCT(hal);
2750 mac->sap.SapDfsInfo.tx_leakage_threshold = tx_leakage_threshold;
2751 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
2752 "%s: leakage_threshold %d", __func__,
2753 mac->sap.SapDfsInfo.tx_leakage_threshold);
2754 return QDF_STATUS_SUCCESS;
2755}
Wu Gao36717432016-11-21 15:09:48 +08002756
Jeff Johnson104433a2017-09-25 15:39:43 -07002757QDF_STATUS wlansap_set_invalid_session(struct sap_context *sap_ctx)
Wu Gao36717432016-11-21 15:09:48 +08002758{
Jeff Johnson104433a2017-09-25 15:39:43 -07002759 if (NULL == sap_ctx) {
Wu Gao36717432016-11-21 15:09:48 +08002760 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Jeff Johnson104433a2017-09-25 15:39:43 -07002761 FL("Invalid SAP pointer"));
Wu Gao36717432016-11-21 15:09:48 +08002762 return QDF_STATUS_E_FAILURE;
2763 }
2764
Jeff Johnson104433a2017-09-25 15:39:43 -07002765 sap_ctx->sessionId = CSR_SESSION_ID_INVALID;
Wu Gao36717432016-11-21 15:09:48 +08002766
2767 return QDF_STATUS_SUCCESS;
2768}
Wu Gao3545e642017-07-14 19:24:41 +08002769
Jeff Johnson14ec0682017-09-25 15:44:03 -07002770void wlansap_cleanup_cac_timer(struct sap_context *sap_ctx)
Wu Gao3545e642017-07-14 19:24:41 +08002771{
2772 tHalHandle hal;
Wu Gao3545e642017-07-14 19:24:41 +08002773 tpAniSirGlobal pmac;
2774
Jeff Johnson14ec0682017-09-25 15:44:03 -07002775 if (!sap_ctx) {
Wu Gao35a5cfe2017-07-27 16:31:02 +08002776 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
2777 FL("Invalid SAP context"));
Wu Gao3545e642017-07-14 19:24:41 +08002778 return;
Wu Gao35a5cfe2017-07-27 16:31:02 +08002779 }
Wu Gao3545e642017-07-14 19:24:41 +08002780
Jeff Johnsonc0db3842017-09-13 18:34:28 -07002781 hal = CDS_GET_HAL_CB();
Wu Gao35a5cfe2017-07-27 16:31:02 +08002782 if (!hal) {
2783 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
2784 FL("Invalid hal pointer"));
2785 return;
2786 }
2787
Wu Gao3545e642017-07-14 19:24:41 +08002788 pmac = PMAC_STRUCT(hal);
2789 if (pmac->sap.SapDfsInfo.is_dfs_cac_timer_running) {
2790 qdf_mc_timer_stop(&pmac->sap.SapDfsInfo.
2791 sap_dfs_cac_timer);
2792 pmac->sap.SapDfsInfo.is_dfs_cac_timer_running = 0;
2793 qdf_mc_timer_destroy(
2794 &pmac->sap.SapDfsInfo.sap_dfs_cac_timer);
2795 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
2796 FL("sapdfs, force cleanup running dfs cac timer"));
2797 }
2798}