blob: a484b9b477e05fa21e8b22da289e7c2863a4465d [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. */
Manishekar Chandrasekaranf7a1dad2016-06-23 06:43:47 +053081static ptSapContext gp_sap_ctx[SAP_MAX_NUM_SESSION];
82static 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 */
169static QDF_STATUS wlansap_save_context(ptSapContext ctx)
170{
171 uint32_t i;
172
173 qdf_mutex_acquire(&sap_context_lock);
174 for (i = 0; i < SAP_MAX_NUM_SESSION; i++) {
175 if (gp_sap_ctx[i] == NULL) {
176 gp_sap_ctx[i] = ctx;
177 qdf_atomic_inc(&sap_ctx_ref_count[i]);
178 qdf_mutex_release(&sap_context_lock);
Srinivas 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 */
202QDF_STATUS wlansap_context_get(ptSapContext ctx)
203{
204 uint32_t i;
205
206 qdf_mutex_acquire(&sap_context_lock);
207 for (i = 0; i < SAP_MAX_NUM_SESSION; i++) {
208 if (ctx && (gp_sap_ctx[i] == ctx)) {
209 qdf_atomic_inc(&sap_ctx_ref_count[i]);
210 qdf_mutex_release(&sap_context_lock);
211 return QDF_STATUS_SUCCESS;
212 }
213 }
214 qdf_mutex_release(&sap_context_lock);
215
216 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
217 "%s: sap session is not valid", __func__);
218 return QDF_STATUS_E_FAILURE;
219}
220
221/**
222 * wlansap_context_put() - Check the reference count and free SAP context
223 * @ctx: SAP context to be checked and freed
224 *
225 * Checks the reference count and frees the SAP context
226 *
227 * Return: None
228 */
229void wlansap_context_put(ptSapContext ctx)
230{
231 uint32_t i;
232
233 if (!ctx)
234 return;
235
236 qdf_mutex_acquire(&sap_context_lock);
237 for (i = 0; i < SAP_MAX_NUM_SESSION; i++) {
238 if (gp_sap_ctx[i] == ctx) {
239 if (qdf_atomic_dec_and_test(&sap_ctx_ref_count[i])) {
240 qdf_mem_free(ctx);
241 gp_sap_ctx[i] = NULL;
242 QDF_TRACE(QDF_MODULE_ID_SAP,
Srinivas 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
254/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800255 * wlansap_open() - WLAN SAP open function call
256 * @p_cds_gctx: Pointer to the global cds context; a handle to SAP's
257 *
258 * Called at driver initialization (cds_open). SAP will initialize
259 * all its internal resources and will wait for the call to start to
260 * register with the other modules.
261 *
Ryan Hsu4252a2f2016-01-05 11:18:24 -0800262 * Return: Pointer to the SAP context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800263 */
Ryan Hsu4252a2f2016-01-05 11:18:24 -0800264void *wlansap_open(void *p_cds_gctx)
265{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800266 ptSapContext pSapCtx = NULL;
Manishekar Chandrasekaranf7a1dad2016-06-23 06:43:47 +0530267 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800268
Ryan Hsu4252a2f2016-01-05 11:18:24 -0800269 /* dynamically allocate the sapContext */
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530270 pSapCtx = (ptSapContext) qdf_mem_malloc(sizeof(tSapContext));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800271
272 if (NULL == pSapCtx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530273 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800274 "%s: Invalid SAP pointer from p_cds_gctx", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800275 return NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800276 }
277
Ryan Hsu4252a2f2016-01-05 11:18:24 -0800278 /* Clean up SAP control block, initialize all values */
Krunal Soni074dd2c2017-04-14 14:57:34 -0700279 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG, FL("Enter"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800280
281 /* Setup the "link back" to the CDS context */
282 pSapCtx->p_cds_gctx = p_cds_gctx;
283
Manishekar Chandrasekaranf7a1dad2016-06-23 06:43:47 +0530284 /* Save the SAP context pointer */
285 status = wlansap_save_context(pSapCtx);
286 if (QDF_IS_STATUS_ERROR(status)) {
287 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
288 "%s: failed to save SAP context", __func__);
289 qdf_mem_free(pSapCtx);
290 return NULL;
291 }
Krunal Soni074dd2c2017-04-14 14:57:34 -0700292 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG, FL("Exit"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800293
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800294 return pSapCtx;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800295} /* wlansap_open */
296
297/**
298 * wlansap_start() - wlan start SAP.
299 * @pCtx: Pointer to the global cds context; a handle to SAP's
300 * control block can be extracted from its context
301 * When MBSSID feature is enabled, SAP context is directly
302 * passed to SAP APIs
Peng Xu66162de2016-02-11 17:01:20 -0800303 * @mode: Device mode
304 * @addr: MAC address of the SAP
305 * @session_id: Pointer to the session id
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800306 *
307 * Called as part of the overall start procedure (cds_enable). SAP will
308 * use this call to register with TL as the SAP entity for SAP RSN frames.
309 *
310 * Return: The result code associated with performing the operation
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530311 * QDF_STATUS_E_FAULT: Pointer to SAP cb is NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800312 * access would cause a page fault.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530313 * QDF_STATUS_SUCCESS: Success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800314 */
Peng Xu66162de2016-02-11 17:01:20 -0800315QDF_STATUS wlansap_start(void *pCtx, enum tQDF_ADAPTER_MODE mode,
Dustin Brownd28772b2017-03-17 14:16:07 -0700316 uint8_t *addr, uint32_t session_id)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800317{
318 ptSapContext pSapCtx = NULL;
Peng Xu66162de2016-02-11 17:01:20 -0800319 QDF_STATUS qdf_ret_status;
320 tHalHandle hal;
Sandeep Puligilla0806e0f2017-03-06 19:25:47 -0800321 tpAniSirGlobal pmac;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800322
323 /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
324
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530325 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800326 "wlansap_start invoked successfully");
327 /*------------------------------------------------------------------------
328 Sanity check
329 Extract SAP control block
330 ------------------------------------------------------------------------*/
331 pSapCtx = CDS_GET_SAP_CB(pCtx);
332
333 if (NULL == pSapCtx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530334 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800335 "%s: Invalid SAP pointer from pCtx", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530336 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800337 }
338
339 /*------------------------------------------------------------------------
340 For now, presume security is not enabled.
341 -----------------------------------------------------------------------*/
342 pSapCtx->ucSecEnabled = WLANSAP_SECURITY_ENABLED_STATE;
343
344 /*------------------------------------------------------------------------
345 Now configure the roaming profile links. To SSID and bssid.
346 ------------------------------------------------------------------------*/
347 /* We have room for two SSIDs. */
348 pSapCtx->csr_roamProfile.SSIDs.numOfSSIDs = 1; /* This is true for now. */
349 pSapCtx->csr_roamProfile.SSIDs.SSIDList = pSapCtx->SSIDList; /* Array of two */
350 pSapCtx->csr_roamProfile.SSIDs.SSIDList[0].SSID.length = 0;
351 pSapCtx->csr_roamProfile.SSIDs.SSIDList[0].handoffPermitted = false;
352 pSapCtx->csr_roamProfile.SSIDs.SSIDList[0].ssidHidden =
353 pSapCtx->SSIDList[0].ssidHidden;
354
355 pSapCtx->csr_roamProfile.BSSIDs.numOfBSSIDs = 1; /* This is true for now. */
356 pSapCtx->csr_roamProfile.BSSIDs.bssid = &pSapCtx->bssid;
Peng Xu66162de2016-02-11 17:01:20 -0800357 pSapCtx->csr_roamProfile.csrPersona = mode;
358 qdf_mem_copy(pSapCtx->self_mac_addr, addr, QDF_MAC_ADDR_SIZE);
359 qdf_event_create(&pSapCtx->sap_session_opened_evt);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800360
361 /* Now configure the auth type in the roaming profile. To open. */
362 pSapCtx->csr_roamProfile.negotiatedAuthType = eCSR_AUTH_TYPE_OPEN_SYSTEM; /* open is the default */
363
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530364 if (!QDF_IS_STATUS_SUCCESS(qdf_mutex_create(&pSapCtx->SapGlobalLock))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530365 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800366 "wlansap_start failed init lock");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530367 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800368 }
369
Peng Xu66162de2016-02-11 17:01:20 -0800370 hal = (tHalHandle) CDS_GET_HAL_CB(pSapCtx->p_cds_gctx);
Chandrasekaran, Manishekard3cb4772016-02-22 22:21:10 +0530371 if (!hal) {
372 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
373 "%s: Invalid HAL pointer", __func__);
374 return QDF_STATUS_E_INVAL;
375 }
Sandeep Puligilla0806e0f2017-03-06 19:25:47 -0800376 pmac = PMAC_STRUCT(hal);
Krunal Sonib01de792017-04-14 11:44:39 -0700377 /*
378 * Anytime when you call sap_open_session, please call
379 * sap_set_session_param to fill sap context parameters
380 */
Peng Xu66162de2016-02-11 17:01:20 -0800381 qdf_ret_status = sap_open_session(hal, pSapCtx, session_id);
Peng Xu66162de2016-02-11 17:01:20 -0800382 if (QDF_STATUS_SUCCESS != qdf_ret_status) {
383 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
384 "Error: In %s calling sap_open_session status = %d",
385 __func__, qdf_ret_status);
386 return QDF_STATUS_E_FAILURE;
387 }
Krunal Sonib01de792017-04-14 11:44:39 -0700388 qdf_ret_status = sap_set_session_param(hal, pSapCtx, session_id);
389 if (QDF_STATUS_SUCCESS != qdf_ret_status) {
390 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
391 "In %s calling sap_set_session_param status = %d",
392 __func__, qdf_ret_status);
393 return QDF_STATUS_E_FAILURE;
394 }
Sandeep Puligilla91273c22017-03-08 19:02:50 -0800395#ifdef NAPIER_SCAN
Sandeep Puligilla0806e0f2017-03-06 19:25:47 -0800396 /* Register with scan component */
397 pSapCtx->req_id = ucfg_scan_register_requester(pmac->psoc, "SAP",
398 sap_scan_event_callback, pSapCtx);
Sandeep Puligilla91273c22017-03-08 19:02:50 -0800399#endif
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530400 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800401}
402
403/**
404 * wlansap_stop() - stop SAP module.
405 * @pCtx: Pointer to the global cds context; a handle to SAP's control block
406 * can be extracted from its context. When MBSSID feature is enabled,
407 * SAP context is directly passed to SAP APIs
408 *
409 * Called by cds_disable to stop operation in SAP, before close. SAP will
410 * suspend all BT-AMP Protocol Adaption Layer operation and will wait for the
411 * close request to clean up its resources.
412 *
413 * Return: The result code associated with performing the operation
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530414 * QDF_STATUS_E_FAULT: Pointer to SAP cb is NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800415 * access would cause a page fault.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530416 * QDF_STATUS_SUCCESS: Success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800417 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530418QDF_STATUS wlansap_stop(void *pCtx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800419{
420 ptSapContext pSapCtx = NULL;
Krunal Soni074dd2c2017-04-14 14:57:34 -0700421 tHalHandle hal;
Sandeep Puligilla0806e0f2017-03-06 19:25:47 -0800422 tpAniSirGlobal pmac;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800423
Ryan Hsu4252a2f2016-01-05 11:18:24 -0800424 /* Sanity check - Extract SAP control block */
Krunal Soni074dd2c2017-04-14 14:57:34 -0700425 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800426 "wlansap_stop invoked successfully ");
427
428 pSapCtx = CDS_GET_SAP_CB(pCtx);
429 if (NULL == pSapCtx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530430 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800431 "%s: Invalid SAP pointer from pCtx", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530432 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800433 }
Krunal Soni074dd2c2017-04-14 14:57:34 -0700434 hal = CDS_GET_HAL_CB(pSapCtx->p_cds_gctx);
435 pmac = (tpAniSirGlobal) hal;
Sandeep Puligilla0806e0f2017-03-06 19:25:47 -0800436 if (NULL == pmac) {
Krunal Soni074dd2c2017-04-14 14:57:34 -0700437 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Sandeep Puligilla0806e0f2017-03-06 19:25:47 -0800438 "%s: Invalid MAC context from p_cds_gctx",
439 __func__);
440 return QDF_STATUS_E_FAULT;
441 }
Krunal Soni074dd2c2017-04-14 14:57:34 -0700442 if (QDF_STATUS_SUCCESS !=
443 sap_close_session(hal, pSapCtx, NULL, false)) {
444 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
445 FL("sap session can't be closed"));
446 return QDF_STATUS_E_FAULT;
447 }
Sandeep Puligilla91273c22017-03-08 19:02:50 -0800448#ifdef NAPIER_SCAN
Sandeep Puligilla0806e0f2017-03-06 19:25:47 -0800449 ucfg_scan_unregister_requester(pmac->psoc, pSapCtx->req_id);
Sandeep Puligilla91273c22017-03-08 19:02:50 -0800450#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800451 sap_free_roam_profile(&pSapCtx->csr_roamProfile);
452
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530453 if (!QDF_IS_STATUS_SUCCESS(qdf_mutex_destroy(&pSapCtx->SapGlobalLock))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530454 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800455 "wlansap_stop failed destroy lock");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530456 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800457 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800458
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530459 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800460}
461
462/**
463 * wlansap_close - close SAP module.
464 * @pCtx: Pointer to the global cds context; a handle to SAP's control block
465 * can be extracted from its context. When MBSSID feature is enabled,
466 * SAP context is directly passed to SAP APIs.
467 *
468 * Called by cds_close during general driver close procedure. SAP will clean up
469 * all the internal resources.
470 *
471 * Return: The result code associated with performing the operation
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530472 * QDF_STATUS_E_FAULT: Pointer to SAP cb is NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800473 * access would cause a page fault
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530474 * QDF_STATUS_SUCCESS: Success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800475 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530476QDF_STATUS wlansap_close(void *pCtx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800477{
478 ptSapContext pSapCtx = NULL;
Krunal Soni074dd2c2017-04-14 14:57:34 -0700479 tHalHandle hal;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800480
Ryan Hsu4252a2f2016-01-05 11:18:24 -0800481 /* Sanity check - Extract SAP control block */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530482 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800483 "wlansap_close invoked");
484
485 pSapCtx = CDS_GET_SAP_CB(pCtx);
486 if (NULL == pSapCtx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530487 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800488 "%s: Invalid SAP pointer from pCtx", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530489 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800490 }
Ryan Hsu4252a2f2016-01-05 11:18:24 -0800491 /* Cleanup SAP control block */
Krunal Soni074dd2c2017-04-14 14:57:34 -0700492 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG, FL("Enter"));
Liangwei Dongdf50df92016-09-29 03:06:50 -0400493 sap_cleanup_channel_list(pCtx);
Krunal Soni0bdfc772017-04-28 18:37:06 -0700494 hal = CDS_GET_HAL_CB(pSapCtx->p_cds_gctx);
495 if (!hal)
496 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
497 FL("hal is NULL, so lets skip global sap cleanup"));
498 else if (pSapCtx->sessionId != CSR_SESSION_ID_INVALID)
499 /* empty queues/lists/pkts if any */
Krunal Soni074dd2c2017-04-14 14:57:34 -0700500 sap_clear_session_param(hal, pSapCtx, pSapCtx->sessionId);
501 /*
502 * wlansap_context_put will release actual pSapCtx memory
503 * allocated during wlansap_open
504 */
Manishekar Chandrasekaranf7a1dad2016-06-23 06:43:47 +0530505 wlansap_context_put(pSapCtx);
Krunal Soni074dd2c2017-04-14 14:57:34 -0700506 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG, FL("Exit"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800507
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530508 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800509} /* wlansap_close */
510
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800511/*==========================================================================
512 FUNCTION wlansap_pmc_full_pwr_req_cb
513
514 DESCRIPTION
515 Callback provide to PMC in the pmc_request_full_power API.
516
517 DEPENDENCIES
518
519 PARAMETERS
520
521 IN
522 callbackContext: The user passed in a context to identify
Anurag Chouhanf04e84f2016-03-03 10:12:12 +0530523 status : The qdf_ret_status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800524
525 RETURN VALUE
526 None
527
528 SIDE EFFECTS
529 ============================================================================*/
530void
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530531wlansap_pmc_full_pwr_req_cb(void *callbackContext, QDF_STATUS status)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800532{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530533 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800534 /* If success what else to be handled??? */
535 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530536 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_FATAL,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800537 "wlansap_pmc_full_pwr_req_cb: PMC failed to put the chip in Full power");
538
539 }
540
541} /* wlansap_pmc_full_pwr_req_cb */
542
543/**
544 * wlansap_get_state() - get SAP state
545 * @pCtx: Pointer to the global cds context; a handle to SAP's control block
546 * can be extracted from its context. When MBSSID feature is enabled,
547 * SAP context is directly passed to SAP APIs.
548 *
549 * This api returns the current SAP state to the caller.
550 *
551 * Return: uint8_t - the SAP FSM state.
552 */
553uint8_t wlansap_get_state(void *pCtx)
554{
555 ptSapContext pSapCtx = NULL;
556
557 pSapCtx = CDS_GET_SAP_CB(pCtx);
558
559 if (NULL == pSapCtx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530560 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800561 "%s: Invalid SAP pointer from pCtx", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530562 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800563 }
564 return pSapCtx->sapsMachine;
565}
566
Kapil Gupta94ca6f62016-12-11 18:43:12 +0530567bool wlansap_is_channel_in_nol_list(void *p_cds_gctx,
568 uint8_t channelNumber,
569 ePhyChanBondState chanBondState)
570{
571 ptSapContext pSapCtx = NULL;
572
573 pSapCtx = CDS_GET_SAP_CB(p_cds_gctx);
574
575 if (!pSapCtx) {
576 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
577 "%s: Invalid SAP pointer from pCtx", __func__);
578 return QDF_STATUS_E_FAULT;
579 }
580
581 return sap_dfs_is_channel_in_nol_list(pSapCtx, channelNumber,
582 chanBondState);
583}
584
585#ifdef WLAN_ENABLE_CHNL_MATRIX_RESTRICTION
586static QDF_STATUS wlansap_mark_leaking_channel(ptSapContext sap_ctx,
587 tSapDfsNolInfo *nol,
588 uint8_t *leakage_adjusted_lst,
589 uint8_t chan_bw)
590{
591
592 return sap_mark_leaking_ch(sap_ctx, chan_bw, nol, 1,
593 leakage_adjusted_lst);
594}
595#else
596static QDF_STATUS wlansap_mark_leaking_channel(ptSapContext sap_ctx,
597 tSapDfsNolInfo *nol,
598 uint8_t *leakage_adjusted_lst,
599 uint8_t chan_bw)
600{
601 return QDF_STATUS_SUCCESS;
602}
603#endif
604
605bool wlansap_is_channel_leaking_in_nol(void *ctx, uint8_t channel,
606 uint8_t chan_bw)
607{
608 ptSapContext sap_ctx = CDS_GET_SAP_CB(ctx);
609 tpAniSirGlobal mac_ctx;
610 uint8_t leakage_adjusted_lst[1];
611 void *handle = NULL;
612 tSapDfsNolInfo *nol;
613
614 leakage_adjusted_lst[0] = channel;
615 handle = CDS_GET_HAL_CB(sapContext->p_cds_gctx);
616 mac_ctx = PMAC_STRUCT(handle);
617 if (!mac_ctx) {
618 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
619 "%s: Invalid mac pointer", __func__);
620 return QDF_STATUS_E_FAULT;
621 }
622 nol = mac_ctx->sap.SapDfsInfo.sapDfsChannelNolList;
623 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
624 FL("sapdfs: Processing current chan against NOL."));
625 if (wlansap_mark_leaking_channel(sap_ctx, nol,
626 leakage_adjusted_lst, chan_bw) != QDF_STATUS_SUCCESS) {
627 return true;
628 }
629 if (leakage_adjusted_lst[0] == 0)
630 return true;
631 return false;
632}
633
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800634#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
635/*==========================================================================
636 FUNCTION wlansap_check_cc_intf
637
638 DESCRIPTION Restart SAP if Concurrent Channel interfering
639
640 DEPENDENCIES NA.
641
642 PARAMETERS
643 IN
644 Ctx: Pointer to cds Context or Sap Context based on MBSSID
645
646 RETURN VALUE NONE
647
648 SIDE EFFECTS
649 ============================================================================*/
650uint16_t wlansap_check_cc_intf(void *Ctx)
651{
652 tHalHandle hHal;
653 uint16_t intf_ch;
654 ptSapContext pSapCtx = CDS_GET_SAP_CB(Ctx);
655
656 hHal = (tHalHandle) CDS_GET_HAL_CB(pSapCtx->p_cds_gctx);
657 if (NULL == hHal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530658 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800659 "%s: Invalid MAC context from p_cds_gctx", __func__);
660 return 0;
661 }
662 intf_ch = sme_check_concurrent_channel_overlap(hHal, 0, 0,
663 pSapCtx->cc_switch_mode);
664 return intf_ch;
665}
666#endif
667
668 /**
669 * wlansap_set_scan_acs_channel_params() - Config scan and channel parameters.
670 * pconfig: Pointer to the SAP config
671 * psap_ctx: Pointer to the SAP Context.
672 * pusr_context: Parameter that will be passed
673 * back in all the SAP callback events.
674 *
675 * This api function is used to copy Scan and Channel parameters from sap
676 * config to sap context.
677 *
678 * Return: The result code associated with
679 * performing the operation
680 */
Jeff Johnson464f7ea2016-10-07 10:21:26 -0700681static QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800682wlansap_set_scan_acs_channel_params(tsap_Config_t *pconfig,
683 ptSapContext psap_ctx,
684 void *pusr_context)
685{
686 tHalHandle h_hal = NULL;
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -0700687 tpAniSirGlobal pmac;
688 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800689
690 if (NULL == pconfig) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530691 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800692 "%s: Invalid pconfig passed ", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530693 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800694 }
695
696 if (NULL == psap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530697 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800698 "%s: Invalid pconfig passed ", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530699 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800700 }
701
702 /* Channel selection is auto or configured */
703 psap_ctx->channel = pconfig->channel;
Agrawal Ashish65634612016-08-18 13:24:32 +0530704 psap_ctx->dfs_mode = pconfig->acs_dfs_mode;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800705#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
706 psap_ctx->cc_switch_mode = pconfig->cc_switch_mode;
707#endif
708 psap_ctx->pUsrContext = pusr_context;
709 psap_ctx->enableOverLapCh = pconfig->enOverLapCh;
710 psap_ctx->acs_cfg = &pconfig->acs_cfg;
711 psap_ctx->ch_width_orig = pconfig->acs_cfg.ch_width;
712 psap_ctx->secondary_ch = pconfig->sec_ch;
713
714 /*
715 * Set the BSSID to your "self MAC Addr" read
716 * the mac address from Configuation ITEM received
717 * from HDD
718 */
719 psap_ctx->csr_roamProfile.BSSIDs.numOfBSSIDs = 1;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800720
Peng Xuf5d60c82015-10-02 17:17:03 -0700721 /* Save a copy to SAP context */
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530722 qdf_mem_copy(psap_ctx->csr_roamProfile.BSSIDs.bssid,
Anurag Chouhan6d760662016-02-20 16:05:43 +0530723 pconfig->self_macaddr.bytes, QDF_MAC_ADDR_SIZE);
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530724 qdf_mem_copy(psap_ctx->self_mac_addr,
Anurag Chouhan6d760662016-02-20 16:05:43 +0530725 pconfig->self_macaddr.bytes, QDF_MAC_ADDR_SIZE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800726
727 h_hal = (tHalHandle)CDS_GET_HAL_CB(psap_ctx->p_cds_gctx);
728 if (NULL == h_hal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530729 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800730 "%s: Invalid MAC context from pvosGCtx", __func__);
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -0700731 return QDF_STATUS_E_FAULT;
732 }
733 pmac = PMAC_STRUCT(h_hal);
734 /*
735 * If concurrent session is running that is already associated
736 * then we just follow that sessions country info (whether
737 * present or not doesn't maater as we have to follow whatever
738 * STA session does)
739 */
740 if ((0 == sme_get_concurrent_operation_channel(h_hal)) &&
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800741 pconfig->ieee80211d) {
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -0700742 /* Setting the region/country information */
743 status = ucfg_reg_set_country(pmac->pdev,
744 pconfig->countryCode);
745 if (QDF_IS_STATUS_ERROR(status))
746 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
747 FL("Failed to set country"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800748 }
749
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -0700750 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800751}
752/**
753 * wlan_sap_get_vht_ch_width() - Returns SAP VHT channel width.
754 * @ctx: Pointer to cds Context or Sap Context based on MBSSID
755 *
756 * This function provides the SAP current VHT channel with.
757 *
758 * Return: VHT channel width
759 */
760uint32_t wlan_sap_get_vht_ch_width(void *ctx)
761{
762 ptSapContext sap_ctx = CDS_GET_SAP_CB(ctx);
763
764 if (!sap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530765 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800766 FL("Invalid SAP pointer from ctx"));
767 return 0;
768 }
769
770 return sap_ctx->ch_params.ch_width;
771}
772
773/**
774 * wlan_sap_set_vht_ch_width() - Sets SAP VHT channel width.
775 * @ctx: Pointer to cds Context or Sap Context based on MBSSID
776 * @vht_channel_width: SAP VHT channel width value.
777 *
778 * This function sets the SAP current VHT channel with.
779 *
780 * Return: None
781 */
782void wlan_sap_set_vht_ch_width(void *ctx, uint32_t vht_channel_width)
783{
784 ptSapContext sap_ctx = CDS_GET_SAP_CB(ctx);
785
786 if (!sap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530787 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800788 FL("Invalid SAP pointer from ctx"));
789 return;
790 }
791
792 sap_ctx->ch_params.ch_width = vht_channel_width;
793}
794
795/**
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +0530796 * wlan_sap_validate_channel_switch() - validate target channel switch w.r.t
797 * concurreny rules set to avoid channel interference.
798 * @hal - Hal context
799 * @sap_ch - channel to switch
800 * @sap_context - sap session context
801 *
802 * Return: true if there is no channel interference else return false
803 */
804#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
805static bool wlan_sap_validate_channel_switch(tHalHandle hal, uint16_t sap_ch,
806 ptSapContext sap_context)
807{
808 return sme_validate_sap_channel_switch(
Manikandan Mohan22b83722015-12-15 15:03:23 -0800809 hal,
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +0530810 sap_ch,
811 sap_context->csr_roamProfile.phyMode,
812 sap_context->cc_switch_mode,
813 sap_context->sessionId);
814}
815#else
816static inline bool wlan_sap_validate_channel_switch(tHalHandle hal,
817 uint16_t sap_ch, ptSapContext sap_context)
818{
819 return true;
820}
821#endif
822/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800823 * wlansap_start_bss() - start BSS
824 * @pCtx: Pointer to the global cds context; a handle to SAP's control block
825 * can be extracted from its context. When MBSSID feature is enabled,
826 * SAP context is directly passed to SAP APIs.
827 * @pQctCommitConfig: Pointer to configuration structure passed down from
828 * HDD(HostApd for Android)
829 * @hdd_SapEventCallback: Callback function in HDD called by SAP to inform HDD
830 * about SAP results
831 * @pUsrContext: Parameter that will be passed back in all the SAP callback
832 * events.
833 *
834 * This api function provides SAP FSM event eWLAN_SAP_PHYSICAL_LINK_CREATE for
835 * starting AP BSS
836 *
837 * Return: The result code associated with performing the operation
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530838 * QDF_STATUS_E_FAULT: Pointer to SAP cb is NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800839 * access would cause a page fault
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530840 * QDF_STATUS_SUCCESS: Success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800841 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530842QDF_STATUS wlansap_start_bss(void *pCtx, /* pwextCtx */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800843 tpWLAN_SAPEventCB pSapEventCallback,
844 tsap_Config_t *pConfig, void *pUsrContext) {
845 tWLAN_SAPEvent sapEvent; /* State machine event */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530846 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800847 ptSapContext pSapCtx = NULL;
848 tHalHandle hHal;
849 tpAniSirGlobal pmac = NULL;
850
851 /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
852
853 /*------------------------------------------------------------------------
854 Sanity check
855 Extract SAP control block
856 ------------------------------------------------------------------------*/
Peng Xuf5d60c82015-10-02 17:17:03 -0700857 pSapCtx = CDS_GET_SAP_CB(pCtx);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800858
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530859 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Peng Xuf5d60c82015-10-02 17:17:03 -0700860 "wlansap_start_bss: sapContext=%p", pSapCtx);
861
862 if (NULL == pSapCtx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530863 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Peng Xuf5d60c82015-10-02 17:17:03 -0700864 "%s: Invalid SAP pointer from pCtx",
865 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530866 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800867 }
Peng Xuf5d60c82015-10-02 17:17:03 -0700868 pSapCtx->sapsMachine = eSAP_DISCONNECTED;
869
870 /* Channel selection is auto or configured */
871 pSapCtx->channel = pConfig->channel;
Agrawal Ashish65634612016-08-18 13:24:32 +0530872 pSapCtx->dfs_mode = pConfig->acs_dfs_mode;
Peng Xuf5d60c82015-10-02 17:17:03 -0700873 pSapCtx->ch_params.ch_width = pConfig->ch_params.ch_width;
874 pSapCtx->ch_params.center_freq_seg0 =
875 pConfig->ch_params.center_freq_seg0;
876 pSapCtx->ch_params.center_freq_seg1 =
877 pConfig->ch_params.center_freq_seg1;
878 pSapCtx->ch_params.sec_ch_offset =
879 pConfig->ch_params.sec_ch_offset;
880 pSapCtx->ch_width_orig = pConfig->ch_width_orig;
881#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
882 pSapCtx->cc_switch_mode = pConfig->cc_switch_mode;
883#endif
884 pSapCtx->pUsrContext = pUsrContext;
885 pSapCtx->enableOverLapCh = pConfig->enOverLapCh;
886 pSapCtx->acs_cfg = &pConfig->acs_cfg;
Arif Hussain759a0232017-03-20 13:17:18 -0700887 pSapCtx->dfs_cac_offload = pConfig->dfs_cac_offload;
Arif Hussain957b2082017-05-19 17:16:59 -0700888 pSapCtx->isCacEndNotified = false;
Peng Xuf5d60c82015-10-02 17:17:03 -0700889 /* Set the BSSID to your "self MAC Addr" read the mac address
890 from Configuation ITEM received from HDD */
891 pSapCtx->csr_roamProfile.BSSIDs.numOfBSSIDs = 1;
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530892 qdf_mem_copy(pSapCtx->csr_roamProfile.BSSIDs.bssid,
Anurag Chouhan6d760662016-02-20 16:05:43 +0530893 pSapCtx->self_mac_addr, sizeof(struct qdf_mac_addr));
Peng Xuf5d60c82015-10-02 17:17:03 -0700894
895 /* Save a copy to SAP context */
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530896 qdf_mem_copy(pSapCtx->csr_roamProfile.BSSIDs.bssid,
Anurag Chouhan6d760662016-02-20 16:05:43 +0530897 pConfig->self_macaddr.bytes, QDF_MAC_ADDR_SIZE);
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530898 qdf_mem_copy(pSapCtx->self_mac_addr,
Anurag Chouhan6d760662016-02-20 16:05:43 +0530899 pConfig->self_macaddr.bytes, QDF_MAC_ADDR_SIZE);
Peng Xuf5d60c82015-10-02 17:17:03 -0700900
901 /* copy the configuration items to csrProfile */
902 sapconvert_to_csr_profile(pConfig, eCSR_BSS_TYPE_INFRA_AP,
903 &pSapCtx->csr_roamProfile);
904 hHal = (tHalHandle) CDS_GET_HAL_CB(pSapCtx->p_cds_gctx);
905 if (NULL == hHal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530906 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Peng Xuf5d60c82015-10-02 17:17:03 -0700907 "%s: Invalid MAC context from p_cds_gctx",
908 __func__);
Manikandan Mohan3dad1a42017-06-14 10:50:18 -0700909 qdf_status = QDF_STATUS_E_FAULT;
910 goto fail;
Peng Xuf5d60c82015-10-02 17:17:03 -0700911 }
Peng Xuf5d60c82015-10-02 17:17:03 -0700912 pmac = PMAC_STRUCT(hHal);
913 if (NULL == pmac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530914 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Peng Xuf5d60c82015-10-02 17:17:03 -0700915 "%s: Invalid MAC context from p_cds_gctx",
916 __func__);
Manikandan Mohan3dad1a42017-06-14 10:50:18 -0700917 qdf_status = QDF_STATUS_E_FAULT;
918 goto fail;
Peng Xuf5d60c82015-10-02 17:17:03 -0700919 }
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -0700920 /* If concurrent session is running that is already associated
921 * then we just follow that sessions country info (whether
922 * present or not doesn't maater as we have to follow whatever
923 * STA session does) */
924 if ((0 == sme_get_concurrent_operation_channel(hHal)) &&
925 pConfig->ieee80211d) {
926 /* Setting the region/country information */
927 qdf_status = ucfg_reg_set_country(pmac->pdev,
928 pConfig->countryCode);
929 if (QDF_IS_STATUS_ERROR(qdf_status))
930 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
931 FL("Failed to set country"));
932 }
933
Peng Xuf5d60c82015-10-02 17:17:03 -0700934 /*
935 * Copy the DFS Test Mode setting to pmac for
936 * access in lower layers
937 */
938 pmac->sap.SapDfsInfo.disable_dfs_ch_switch =
939 pConfig->disableDFSChSwitch;
bings1fe8a472017-04-13 03:37:08 +0800940 pmac->sap.sapCtxList[pSapCtx->sessionId].pSapContext = pSapCtx;
941 pmac->sap.sapCtxList[pSapCtx->sessionId].sapPersona =
942 pSapCtx->csr_roamProfile.csrPersona;
943 pmac->sap.sapCtxList[pSapCtx->sessionId].sessionID =
944 pSapCtx->sessionId;
Peng Xuf5d60c82015-10-02 17:17:03 -0700945
946 /* Copy MAC filtering settings to sap context */
947 pSapCtx->eSapMacAddrAclMode = pConfig->SapMacaddr_acl;
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530948 qdf_mem_copy(pSapCtx->acceptMacList, pConfig->accept_mac,
Peng Xuf5d60c82015-10-02 17:17:03 -0700949 sizeof(pConfig->accept_mac));
950 pSapCtx->nAcceptMac = pConfig->num_accept_mac;
951 sap_sort_mac_list(pSapCtx->acceptMacList, pSapCtx->nAcceptMac);
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530952 qdf_mem_copy(pSapCtx->denyMacList, pConfig->deny_mac,
Peng Xuf5d60c82015-10-02 17:17:03 -0700953 sizeof(pConfig->deny_mac));
954 pSapCtx->nDenyMac = pConfig->num_deny_mac;
955 sap_sort_mac_list(pSapCtx->denyMacList, pSapCtx->nDenyMac);
956 /* Fill in the event structure for FSM */
957 sapEvent.event = eSAP_HDD_START_INFRA_BSS;
958 sapEvent.params = 0; /* pSapPhysLinkCreate */
959
960 /* Store the HDD callback in SAP context */
961 pSapCtx->pfnSapEventCallback = pSapEventCallback;
962
963 /* Handle event */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530964 qdf_status = sap_fsm(pSapCtx, &sapEvent);
Manikandan Mohan3dad1a42017-06-14 10:50:18 -0700965fail:
966 if (QDF_IS_STATUS_ERROR(qdf_status))
967 sap_free_roam_profile(&pSapCtx->csr_roamProfile);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800968
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530969 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800970} /* wlansap_start_bss */
971
972/**
973 * wlansap_set_mac_acl() - set MAC list entry in ACL.
974 * @pCtx: Pointer to the global cds context; a handle to SAP's control block
975 * can be extracted from its context. When MBSSID feature is enabled,
976 * SAP context is directly passed to SAP APIs.
977 * @pConfig: Pointer to SAP config.
978 *
979 * This api function provides SAP to set mac list entry in accept list as well
980 * as deny list
981 *
982 * Return: The result code associated with performing the operation
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530983 * QDF_STATUS_E_FAULT: Pointer to SAP cb is NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800984 * access would cause a page fault
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530985 * QDF_STATUS_SUCCESS: Success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800986 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530987QDF_STATUS wlansap_set_mac_acl(void *pCtx, /* pwextCtx */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800988 tsap_Config_t *pConfig) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530989 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800990 ptSapContext pSapCtx = NULL;
991
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530992 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800993 "wlansap_set_mac_acl");
994
Peng Xuf5d60c82015-10-02 17:17:03 -0700995 pSapCtx = CDS_GET_SAP_CB(pCtx);
996 if (NULL == pSapCtx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530997 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Peng Xuf5d60c82015-10-02 17:17:03 -0700998 "%s: Invalid SAP pointer from pCtx",
999 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301000 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001001 }
Peng Xuf5d60c82015-10-02 17:17:03 -07001002 /* Copy MAC filtering settings to sap context */
1003 pSapCtx->eSapMacAddrAclMode = pConfig->SapMacaddr_acl;
1004
1005 if (eSAP_DENY_UNLESS_ACCEPTED == pSapCtx->eSapMacAddrAclMode) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301006 qdf_mem_copy(pSapCtx->acceptMacList,
Peng Xuf5d60c82015-10-02 17:17:03 -07001007 pConfig->accept_mac,
1008 sizeof(pConfig->accept_mac));
1009 pSapCtx->nAcceptMac = pConfig->num_accept_mac;
1010 sap_sort_mac_list(pSapCtx->acceptMacList,
1011 pSapCtx->nAcceptMac);
1012 } else if (eSAP_ACCEPT_UNLESS_DENIED ==
1013 pSapCtx->eSapMacAddrAclMode) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301014 qdf_mem_copy(pSapCtx->denyMacList, pConfig->deny_mac,
Peng Xuf5d60c82015-10-02 17:17:03 -07001015 sizeof(pConfig->deny_mac));
1016 pSapCtx->nDenyMac = pConfig->num_deny_mac;
1017 sap_sort_mac_list(pSapCtx->denyMacList, pSapCtx->nDenyMac);
1018 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001019
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301020 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001021} /* wlansap_set_mac_acl */
1022
1023/**
1024 * wlansap_stop_bss() - stop BSS.
1025 * @pCtx: Pointer to the global cds context; a handle to SAP's control block
1026 * can be extracted from its context. When MBSSID feature is enabled,
1027 * SAP context is directly passed to SAP APIs.
1028 *
1029 * This api function provides SAP FSM event eSAP_HDD_STOP_INFRA_BSS for
1030 * stopping AP BSS
1031 *
1032 * Return: The result code associated with performing the operation
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301033 * QDF_STATUS_E_FAULT: Pointer to SAP cb is NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001034 * access would cause a page fault
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301035 * QDF_STATUS_SUCCESS: Success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001036 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301037QDF_STATUS wlansap_stop_bss(void *pCtx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001038{
1039 tWLAN_SAPEvent sapEvent; /* State machine event */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301040 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001041 ptSapContext pSapCtx = NULL;
1042 /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
1043
1044 /*------------------------------------------------------------------------
1045 Sanity check
1046 Extract SAP control block
1047 ------------------------------------------------------------------------*/
1048 if (NULL == pCtx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301049 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001050 "%s: Invalid Global CDS handle", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301051 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001052 }
1053
1054 pSapCtx = CDS_GET_SAP_CB(pCtx);
1055
1056 if (NULL == pSapCtx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301057 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001058 "%s: Invalid SAP pointer from pCtx", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301059 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001060 }
1061
1062 /* Fill in the event structure for FSM */
1063 sapEvent.event = eSAP_HDD_STOP_INFRA_BSS;
1064 sapEvent.params = 0;
1065
1066 /* Handle event */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301067 qdf_status = sap_fsm(pSapCtx, &sapEvent);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001068
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301069 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001070}
1071
1072/**
1073 * wlansap_get_assoc_stations() - get list of associated stations.
1074 * @pCtx: Pointer to the global cds context; a handle to SAP's control block
1075 * can be extracted from its context. When MBSSID feature is enabled,
1076 * SAP context is directly passed to SAP APIs.
1077 * @modId: Module from whom list of associtated stations is supposed to be
1078 * probed. If an invalid module is passed then by default
Anurag Chouhan6d760662016-02-20 16:05:43 +05301079 * QDF_MODULE_ID_PE will be probed
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001080 * @pAssocStas: Pointer to list of associated stations that are known to the
1081 * module specified in mod parameter
1082 *
1083 * This api function is used to probe the list of associated stations from
1084 * various modules of CORE stack
1085 * NOTE: The memory for this list will be allocated by the caller of this API
1086 *
1087 * Return: The result code associated with performing the operation
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301088 * QDF_STATUS_SUCCESS: Success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001089 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301090QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001091wlansap_get_assoc_stations
Anurag Chouhan6d760662016-02-20 16:05:43 +05301092 (void *pCtx, QDF_MODULE_ID modId, tpSap_AssocMacAddr pAssocStas) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001093 ptSapContext pSapCtx = CDS_GET_SAP_CB(pCtx);
1094
1095 /*------------------------------------------------------------------------
1096 Sanity check
1097 Extract SAP control block
1098 ------------------------------------------------------------------------*/
1099 if (NULL == pSapCtx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301100 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001101 "%s: Invalid SAP pointer from pCtx", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301102 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001103 }
1104
1105 sme_roam_get_associated_stas(CDS_GET_HAL_CB(pSapCtx->p_cds_gctx),
1106 pSapCtx->sessionId, modId,
1107 pSapCtx->pUsrContext,
1108 (void **) pSapCtx->pfnSapEventCallback,
1109 (uint8_t *) pAssocStas);
1110
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301111 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001112}
1113
1114/**
1115 * wlansap_remove_wps_session_overlap() - remove overlapping wps session.
1116 * @pCtx: Pointer to the global cds context; a handle to SAP's control block
1117 * can be extracted from its context. When MBSSID feature is enabled,
1118 * SAP context is directly passed to SAP APIs.
Anurag Chouhan6d760662016-02-20 16:05:43 +05301119 * @pRemoveMac: pointer to struct qdf_mac_addr for session MAC address
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001120 *
1121 * This api function provides for Ap App/HDD to remove an entry from session
1122 * overlap info.
1123 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301124 * Return: The QDF_STATUS code associated with performing the operation
1125 * QDF_STATUS_SUCCESS: Success
1126 * QDF_STATUS_E_FAULT: Session is not dectected.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001127 * The parameter is function not valid.
1128 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301129QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001130wlansap_remove_wps_session_overlap(void *pCtx,
Anurag Chouhan6d760662016-02-20 16:05:43 +05301131 struct qdf_mac_addr pRemoveMac)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001132{
1133 ptSapContext pSapCtx = CDS_GET_SAP_CB(pCtx);
1134
1135 /*------------------------------------------------------------------------
1136 Sanity check
1137 Extract SAP control block
1138 ------------------------------------------------------------------------*/
1139 if (NULL == pSapCtx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301140 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001141 "%s: Invalid SAP pointer from pCtx", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301142 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001143 }
1144
1145 sme_roam_get_wps_session_overlap(CDS_GET_HAL_CB(pSapCtx->p_cds_gctx),
1146 pSapCtx->sessionId, pSapCtx->pUsrContext,
1147 (void **) pSapCtx->pfnSapEventCallback,
1148 pRemoveMac);
1149
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301150 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001151}
1152
1153/**
1154 * wlansap_get_wps_session_overlap() - get overlapping wps session.
1155 * @pCtx: Pointer to the global cds context; a handle to SAP's control block
1156 * can be extracted from its context. When MBSSID feature is enabled,
1157 * SAP context is directly passed to SAP APIs.
1158 *
1159 * This api function provides for Ap App/HDD to get WPS session overlap info.
1160 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301161 * Return: The QDF_STATUS code associated with performing the operation
1162 * QDF_STATUS_SUCCESS: Success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001163 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301164QDF_STATUS wlansap_get_wps_session_overlap(void *pCtx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001165{
Anurag Chouhan6d760662016-02-20 16:05:43 +05301166 struct qdf_mac_addr pRemoveMac = QDF_MAC_ADDR_ZERO_INITIALIZER;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001167
1168 ptSapContext pSapCtx = CDS_GET_SAP_CB(pCtx);
1169
1170 /*------------------------------------------------------------------------
1171 Sanity check
1172 Extract SAP control block
1173 ------------------------------------------------------------------------*/
1174 if (NULL == pSapCtx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301175 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001176 "%s: Invalid SAP pointer from pCtx", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301177 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001178 }
1179
1180 sme_roam_get_wps_session_overlap(CDS_GET_HAL_CB(pSapCtx->p_cds_gctx),
1181 pSapCtx->sessionId, pSapCtx->pUsrContext,
1182 (void **) pSapCtx->pfnSapEventCallback,
1183 pRemoveMac);
1184
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301185 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001186}
1187
1188/* This routine will set the mode of operation for ACL dynamically*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301189QDF_STATUS wlansap_set_mode(void *pCtx, uint32_t mode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001190{
1191 ptSapContext pSapCtx = CDS_GET_SAP_CB(pCtx);
1192
1193 if (NULL == pSapCtx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301194 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001195 "%s: Invalid SAP pointer from pCtx", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301196 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001197 }
1198
1199 pSapCtx->eSapMacAddrAclMode = (eSapMacAddrACL) mode;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301200 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001201}
1202
1203/* Get ACL Mode */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301204QDF_STATUS wlansap_get_acl_mode(void *pCtx, eSapMacAddrACL *mode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001205{
1206 ptSapContext pSapCtx = CDS_GET_SAP_CB(pCtx);
1207
1208 if (NULL == pSapCtx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301209 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001210 "%s: Invalid SAP pointer from pCtx", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301211 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001212 }
1213
1214 *mode = pSapCtx->eSapMacAddrAclMode;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301215 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001216}
1217
1218/* API to get ACL Accept List */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301219QDF_STATUS
Anurag Chouhan6d760662016-02-20 16:05:43 +05301220wlansap_get_acl_accept_list(void *pCtx, struct qdf_mac_addr *pAcceptList,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001221 uint8_t *nAcceptList)
1222{
1223 ptSapContext pSapCtx = CDS_GET_SAP_CB(pCtx);
1224 if (NULL == pSapCtx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301225 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001226 "%s: Invalid SAP pointer from p_cds_gctx", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301227 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001228 }
1229
1230 memcpy((void *)pAcceptList, (void *)pSapCtx->acceptMacList,
Anurag Chouhan6d760662016-02-20 16:05:43 +05301231 (pSapCtx->nAcceptMac * QDF_MAC_ADDR_SIZE));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001232 *nAcceptList = pSapCtx->nAcceptMac;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301233 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001234}
1235
1236/* API to get Deny List */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301237QDF_STATUS
Anurag Chouhan6d760662016-02-20 16:05:43 +05301238wlansap_get_acl_deny_list(void *pCtx, struct qdf_mac_addr *pDenyList,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001239 uint8_t *nDenyList)
1240{
1241 ptSapContext pSapCtx = CDS_GET_SAP_CB(pCtx);
1242 if (NULL == pSapCtx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301243 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001244 "%s: Invalid SAP pointer from p_cds_gctx", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301245 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001246 }
1247
1248 memcpy((void *)pDenyList, (void *)pSapCtx->denyMacList,
Anurag Chouhan6d760662016-02-20 16:05:43 +05301249 (pSapCtx->nDenyMac * QDF_MAC_ADDR_SIZE));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001250 *nDenyList = pSapCtx->nDenyMac;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301251 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001252}
1253
1254/* This routine will clear all the entries in accept list as well as deny list */
1255
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301256QDF_STATUS wlansap_clear_acl(void *pCtx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001257{
1258 ptSapContext pSapCtx = CDS_GET_SAP_CB(pCtx);
1259 uint8_t i;
1260
1261 if (NULL == pSapCtx) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301262 return QDF_STATUS_E_RESOURCES;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001263 }
1264
1265 if (pSapCtx->denyMacList != NULL) {
1266 for (i = 0; i < (pSapCtx->nDenyMac - 1); i++) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301267 qdf_mem_zero((pSapCtx->denyMacList + i)->bytes,
Anurag Chouhan6d760662016-02-20 16:05:43 +05301268 QDF_MAC_ADDR_SIZE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001269
1270 }
1271 }
1272 sap_print_acl(pSapCtx->denyMacList, pSapCtx->nDenyMac);
1273 pSapCtx->nDenyMac = 0;
1274
1275 if (pSapCtx->acceptMacList != NULL) {
1276 for (i = 0; i < (pSapCtx->nAcceptMac - 1); i++) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301277 qdf_mem_zero((pSapCtx->acceptMacList + i)->bytes,
Anurag Chouhan6d760662016-02-20 16:05:43 +05301278 QDF_MAC_ADDR_SIZE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001279
1280 }
1281 }
1282 sap_print_acl(pSapCtx->acceptMacList, pSapCtx->nAcceptMac);
1283 pSapCtx->nAcceptMac = 0;
1284
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301285 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001286}
1287
1288/*
1289 * wlansap_modify_acl() -Update ACL entries
1290 *
1291 * @ctx: Global context
1292 * @peer_sta_mac: peer sta mac to be updated.
1293 * @list_type: white/Black list type.
1294 * @cmd: command to be executed on ACL.
1295 *
1296 * This function is called when a peer needs to be added or deleted from the
1297 * white/black ACL
1298 *
1299 * Return: Status
1300 */
1301
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301302QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001303wlansap_modify_acl
1304 (void *ctx,
1305 uint8_t *peer_sta_mac, eSapACLType list_type, eSapACLCmdType cmd) {
1306 eSapBool sta_white_list = eSAP_FALSE, sta_black_list = eSAP_FALSE;
1307 uint8_t staWLIndex, staBLIndex;
1308 ptSapContext sap_ctx = CDS_GET_SAP_CB(ctx);
1309
1310 if (NULL == sap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301311 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001312 "%s: Invalid SAP Context", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301313 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001314 }
1315
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301316 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001317 "Modify ACL entered\n" "Before modification of ACL\n"
1318 "size of accept and deny lists %d %d", sap_ctx->nAcceptMac,
1319 sap_ctx->nDenyMac);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301320 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001321 "*** WHITE LIST ***");
1322 sap_print_acl(sap_ctx->acceptMacList, sap_ctx->nAcceptMac);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301323 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001324 "*** BLACK LIST ***");
1325 sap_print_acl(sap_ctx->denyMacList, sap_ctx->nDenyMac);
1326
1327 /* the expectation is a mac addr will not be in both the lists at the same time.
1328 It is the responsiblity of userspace to ensure this */
1329 sta_white_list =
1330 sap_search_mac_list(sap_ctx->acceptMacList, sap_ctx->nAcceptMac,
1331 peer_sta_mac, &staWLIndex);
1332 sta_black_list =
1333 sap_search_mac_list(sap_ctx->denyMacList, sap_ctx->nDenyMac,
1334 peer_sta_mac, &staBLIndex);
1335
1336 if (sta_white_list && sta_black_list) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301337 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001338 "Peer mac " MAC_ADDRESS_STR
1339 " found in white and black lists."
1340 "Initial lists passed incorrect. Cannot execute this command.",
1341 MAC_ADDR_ARRAY(peer_sta_mac));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301342 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001343
1344 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301345 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001346 "cmd %d", cmd);
1347
1348 switch (list_type) {
1349 case eSAP_WHITE_LIST:
1350 if (cmd == ADD_STA_TO_ACL) {
1351 /* error check */
1352 /* if list is already at max, return failure */
1353 if (sap_ctx->nAcceptMac == MAX_ACL_MAC_ADDRESS) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301354 QDF_TRACE(QDF_MODULE_ID_SAP,
1355 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001356 "White list is already maxed out. Cannot accept "
1357 MAC_ADDRESS_STR,
1358 MAC_ADDR_ARRAY(peer_sta_mac));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301359 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001360 }
1361 if (sta_white_list) {
1362 /* Do nothing if already present in white list. Just print a warning */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301363 QDF_TRACE(QDF_MODULE_ID_SAP,
1364 QDF_TRACE_LEVEL_WARN,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001365 "MAC address already present in white list "
1366 MAC_ADDRESS_STR,
1367 MAC_ADDR_ARRAY(peer_sta_mac));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301368 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001369 }
1370 if (sta_black_list) {
1371 /* remove it from black list before adding to the white list */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301372 QDF_TRACE(QDF_MODULE_ID_SAP,
1373 QDF_TRACE_LEVEL_WARN,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001374 "STA present in black list so first remove from it");
1375 sap_remove_mac_from_acl(sap_ctx->
1376 denyMacList,
1377 &sap_ctx->nDenyMac,
1378 staBLIndex);
1379 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301380 QDF_TRACE(QDF_MODULE_ID_SAP,
1381 QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001382 "... Now add to the white list");
1383 sap_add_mac_to_acl(sap_ctx->acceptMacList,
1384 &sap_ctx->nAcceptMac,
1385 peer_sta_mac);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301386 QDF_TRACE(QDF_MODULE_ID_SAP,
1387 QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001388 "size of accept and deny lists %d %d",
1389 sap_ctx->nAcceptMac,
1390 sap_ctx->nDenyMac);
1391 } else if (cmd == DELETE_STA_FROM_ACL) {
1392 if (sta_white_list) {
1393
1394 struct tagCsrDelStaParams delStaParams;
1395
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301396 QDF_TRACE(QDF_MODULE_ID_SAP,
1397 QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001398 "Delete from white list");
1399 sap_remove_mac_from_acl(sap_ctx->acceptMacList,
1400 &sap_ctx->nAcceptMac,
1401 staWLIndex);
1402 /* If a client is deleted from white list and it is connected, send deauth */
1403 wlansap_populate_del_sta_params(peer_sta_mac,
1404 eCsrForcedDeauthSta,
1405 (SIR_MAC_MGMT_DEAUTH >> 4),
1406 &delStaParams);
1407 wlansap_deauth_sta(ctx, &delStaParams);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301408 QDF_TRACE(QDF_MODULE_ID_SAP,
1409 QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001410 "size of accept and deny lists %d %d",
1411 sap_ctx->nAcceptMac,
1412 sap_ctx->nDenyMac);
1413 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301414 QDF_TRACE(QDF_MODULE_ID_SAP,
1415 QDF_TRACE_LEVEL_WARN,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001416 "MAC address to be deleted is not present in the white list "
1417 MAC_ADDRESS_STR,
1418 MAC_ADDR_ARRAY(peer_sta_mac));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301419 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001420 }
1421 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301422 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001423 "Invalid cmd type passed");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301424 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001425 }
1426 break;
1427
1428 case eSAP_BLACK_LIST:
1429
1430 if (cmd == ADD_STA_TO_ACL) {
1431 struct tagCsrDelStaParams delStaParams;
1432 /* error check */
1433 /* if list is already at max, return failure */
1434 if (sap_ctx->nDenyMac == MAX_ACL_MAC_ADDRESS) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301435 QDF_TRACE(QDF_MODULE_ID_SAP,
1436 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001437 "Black list is already maxed out. Cannot accept "
1438 MAC_ADDRESS_STR,
1439 MAC_ADDR_ARRAY(peer_sta_mac));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301440 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001441 }
1442 if (sta_black_list) {
1443 /* Do nothing if already present in white list */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301444 QDF_TRACE(QDF_MODULE_ID_SAP,
1445 QDF_TRACE_LEVEL_WARN,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001446 "MAC address already present in black list "
1447 MAC_ADDRESS_STR,
1448 MAC_ADDR_ARRAY(peer_sta_mac));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301449 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001450 }
1451 if (sta_white_list) {
1452 /* remove it from white list before adding to the black list */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301453 QDF_TRACE(QDF_MODULE_ID_SAP,
1454 QDF_TRACE_LEVEL_WARN,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001455 "Present in white list so first remove from it");
1456 sap_remove_mac_from_acl(sap_ctx->
1457 acceptMacList,
1458 &sap_ctx->
1459 nAcceptMac,
1460 staWLIndex);
1461 }
1462 /* If we are adding a client to the black list; if its connected, send deauth */
1463 wlansap_populate_del_sta_params(peer_sta_mac,
1464 eCsrForcedDeauthSta,
1465 (SIR_MAC_MGMT_DEAUTH >> 4),
1466 &delStaParams);
1467 wlansap_deauth_sta(ctx, &delStaParams);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301468 QDF_TRACE(QDF_MODULE_ID_SAP,
1469 QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001470 "... Now add to black list");
1471 sap_add_mac_to_acl(sap_ctx->denyMacList,
1472 &sap_ctx->nDenyMac, peer_sta_mac);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301473 QDF_TRACE(QDF_MODULE_ID_SAP,
1474 QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001475 "size of accept and deny lists %d %d",
1476 sap_ctx->nAcceptMac,
1477 sap_ctx->nDenyMac);
1478 } else if (cmd == DELETE_STA_FROM_ACL) {
1479 if (sta_black_list) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301480 QDF_TRACE(QDF_MODULE_ID_SAP,
1481 QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001482 "Delete from black list");
1483 sap_remove_mac_from_acl(sap_ctx->denyMacList,
1484 &sap_ctx->nDenyMac,
1485 staBLIndex);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301486 QDF_TRACE(QDF_MODULE_ID_SAP,
1487 QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001488 "no accept and deny mac %d %d",
1489 sap_ctx->nAcceptMac,
1490 sap_ctx->nDenyMac);
1491 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301492 QDF_TRACE(QDF_MODULE_ID_SAP,
1493 QDF_TRACE_LEVEL_WARN,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001494 "MAC address to be deleted is not present in the black list "
1495 MAC_ADDRESS_STR,
1496 MAC_ADDR_ARRAY(peer_sta_mac));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301497 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001498 }
1499 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301500 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001501 "Invalid cmd type passed");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301502 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001503 }
1504 break;
1505
1506 default:
1507 {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301508 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001509 "Invalid list type passed %d", list_type);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301510 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001511 }
1512 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301513 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001514 "After modification of ACL");
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301515 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001516 "*** WHITE LIST ***");
1517 sap_print_acl(sap_ctx->acceptMacList, sap_ctx->nAcceptMac);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301518 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001519 "*** BLACK LIST ***");
1520 sap_print_acl(sap_ctx->denyMacList, sap_ctx->nDenyMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301521 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001522}
1523
1524/**
1525 * wlansap_disassoc_sta() - initiate disassociation of station.
1526 * @pCtx: Pointer to the global cds context; a handle to SAP's control block
1527 * can be extracted from its context. When MBSSID feature is enabled,
1528 * SAP context is directly passed to SAP APIs.
Deepthi Gowrib3bfefd2016-09-13 15:14:34 +05301529 * @p_del_sta_params: pointer to station deletion parameters
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001530 *
1531 * This api function provides for Ap App/HDD initiated disassociation of station
1532 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301533 * Return: The QDF_STATUS code associated with performing the operation
1534 * QDF_STATUS_SUCCESS: Success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001535 */
Deepthi Gowrib3bfefd2016-09-13 15:14:34 +05301536QDF_STATUS wlansap_disassoc_sta(void *pCtx,
1537 struct tagCsrDelStaParams *p_del_sta_params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001538{
1539 ptSapContext pSapCtx = CDS_GET_SAP_CB(pCtx);
1540
1541 /*------------------------------------------------------------------------
1542 Sanity check
1543 Extract SAP control block
1544 ------------------------------------------------------------------------*/
1545 if (NULL == pSapCtx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301546 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001547 "%s: Invalid SAP pointer from pCtx", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301548 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001549 }
1550
1551 sme_roam_disconnect_sta(CDS_GET_HAL_CB(pSapCtx->p_cds_gctx),
Deepthi Gowrib3bfefd2016-09-13 15:14:34 +05301552 pSapCtx->sessionId, p_del_sta_params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001553
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301554 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001555}
1556
1557/**
1558 * wlansap_deauth_sta() - Ap App/HDD initiated deauthentication of station
1559 * @pCtx : Pointer to the global cds context; a handle to SAP's
1560 * control block can be extracted from its context
1561 * When MBSSID feature is enabled, SAP context is directly
1562 * passed to SAP APIs
1563 * @pDelStaParams : Pointer to parameters of the station to deauthenticate
1564 *
1565 * This api function provides for Ap App/HDD initiated deauthentication of
1566 * station
1567 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301568 * Return: The QDF_STATUS code associated with performing the operation
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001569 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301570QDF_STATUS wlansap_deauth_sta(void *pCtx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001571 struct tagCsrDelStaParams *pDelStaParams)
1572{
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301573 QDF_STATUS qdf_ret_status = QDF_STATUS_E_FAILURE;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301574 QDF_STATUS qdf_status = QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001575 ptSapContext pSapCtx = CDS_GET_SAP_CB(pCtx);
1576
1577 /*------------------------------------------------------------------------
1578 Sanity check
1579 Extract SAP control block
1580 ------------------------------------------------------------------------*/
1581 if (NULL == pSapCtx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301582 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001583 "%s: Invalid SAP pointer from pCtx", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301584 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001585 }
1586
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301587 qdf_ret_status =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001588 sme_roam_deauth_sta(CDS_GET_HAL_CB(pSapCtx->p_cds_gctx),
1589 pSapCtx->sessionId, pDelStaParams);
1590
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301591 if (qdf_ret_status == QDF_STATUS_SUCCESS) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301592 qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001593 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301594 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001595}
1596
Edhar, Mahesh Kumarbd8b3912015-11-25 19:28:12 +05301597/**
1598 * wlansap_update_bw80_cbmode() - fucntion to update channel bonding mode for
1599 * VHT80 channel.
1600 * @channel: target channel
1601 * @sme_config: sme configuration context
1602 *
1603 * Return: none
1604 */
1605static inline void wlansap_update_bw80_cbmode(uint32_t channel,
1606 tSmeConfigParams *sme_config)
1607{
1608 if (channel == 36 || channel == 52 || channel == 100 ||
1609 channel == 116 || channel == 149 || channel == 132) {
1610 sme_config->csrConfig.channelBondingMode5GHz =
1611 eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW;
1612 } else if (channel == 40 || channel == 56 || channel == 104 ||
1613 channel == 120 || channel == 153 || channel == 136) {
1614 sme_config->csrConfig.channelBondingMode5GHz =
1615 eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW;
1616 } else if (channel == 44 || channel == 60 || channel == 108 ||
1617 channel == 124 || channel == 157 || channel == 140) {
1618 sme_config->csrConfig.channelBondingMode5GHz =
1619 eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH;
1620 } else if (channel == 48 || channel == 64 || channel == 112 ||
1621 channel == 128 || channel == 144 || channel == 161) {
1622 sme_config->csrConfig.channelBondingMode5GHz =
1623 eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH;
1624 }
1625}
1626
1627/**
1628 * wlansap_update_csa_channel_params() - fucntion to populate channel width and
1629 * bonding modes.
1630 * @sap_context: sap adapter context
1631 * @channel: target channel
1632 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301633 * Return: The QDF_STATUS code associated with performing the operation
Edhar, Mahesh Kumarbd8b3912015-11-25 19:28:12 +05301634 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301635static QDF_STATUS wlansap_update_csa_channel_params(ptSapContext sap_context,
Edhar, Mahesh Kumarbd8b3912015-11-25 19:28:12 +05301636 uint32_t channel)
1637{
1638 void *hal;
1639 tpAniSirGlobal mac_ctx;
Edhar, Mahesh Kumarbd8b3912015-11-25 19:28:12 +05301640 uint8_t bw;
1641
1642 hal = CDS_GET_HAL_CB(sap_context->p_cds_gctx);
1643 if (!hal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301644 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Edhar, Mahesh Kumarbd8b3912015-11-25 19:28:12 +05301645 "%s: Invalid hal pointer from p_cds_gctx", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301646 return QDF_STATUS_E_FAULT;
Edhar, Mahesh Kumarbd8b3912015-11-25 19:28:12 +05301647 }
1648
1649 mac_ctx = PMAC_STRUCT(hal);
1650
Amar Singhalb8d4f152016-02-10 10:21:43 -08001651 if (channel <= CHAN_ENUM_14) {
Edhar, Mahesh Kumarbd8b3912015-11-25 19:28:12 +05301652 /*
1653 * currently OBSS scan is done in hostapd, so to avoid
1654 * SAP coming up in HT40 on channel switch we are
1655 * disabling channel bonding in 2.4Ghz.
1656 */
Edhar, Mahesh Kumarbd8b3912015-11-25 19:28:12 +05301657 mac_ctx->sap.SapDfsInfo.new_chanWidth = 0;
1658
1659 } else {
1660
1661 if (sap_context->ch_width_orig >= CH_WIDTH_80MHZ)
1662 bw = BW80;
1663 else if (sap_context->ch_width_orig == CH_WIDTH_40MHZ)
1664 bw = BW40_HIGH_PRIMARY;
1665 else
1666 bw = BW20;
1667
1668 for (; bw >= BW20; bw--) {
1669 uint16_t op_class;
1670
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07001671 op_class = wlan_reg_dmn_get_opclass_from_channel(
Edhar, Mahesh Kumarbd8b3912015-11-25 19:28:12 +05301672 mac_ctx->scan.countryCodeCurrent,
1673 channel, bw);
1674 if (!op_class)
1675 continue;
1676
1677 if (bw == BW80) {
Edhar, Mahesh Kumarbd8b3912015-11-25 19:28:12 +05301678 mac_ctx->sap.SapDfsInfo.new_chanWidth =
1679 CH_WIDTH_80MHZ;
1680 } else if (bw == BW40_HIGH_PRIMARY) {
1681 mac_ctx->sap.SapDfsInfo.new_chanWidth =
1682 CH_WIDTH_40MHZ;
Edhar, Mahesh Kumarbd8b3912015-11-25 19:28:12 +05301683 } else if (bw == BW40_LOW_PRIMARY) {
1684 mac_ctx->sap.SapDfsInfo.new_chanWidth =
1685 CH_WIDTH_40MHZ;
Edhar, Mahesh Kumarbd8b3912015-11-25 19:28:12 +05301686 } else {
1687 mac_ctx->sap.SapDfsInfo.new_chanWidth =
1688 CH_WIDTH_20MHZ;
Edhar, Mahesh Kumarbd8b3912015-11-25 19:28:12 +05301689 }
1690 break;
1691 }
1692
1693 }
1694
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301695 return QDF_STATUS_SUCCESS;
Edhar, Mahesh Kumarbd8b3912015-11-25 19:28:12 +05301696}
1697
Chandrasekaran, Manishekara74bb022016-01-12 18:37:43 +05301698/**
1699 * wlansap_set_channel_change_with_csa() - Set channel change with CSA
1700 * @p_cds_gctx: Pointer to cds global context structure
1701 * @targetChannel: Target channel
1702 * @target_bw: Target bandwidth
1703 *
1704 * This api function does a channel change to the target channel specified.
1705 * CSA IE is included in the beacons before doing a channel change.
1706 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301707 * Return: QDF_STATUS
Chandrasekaran, Manishekara74bb022016-01-12 18:37:43 +05301708 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301709QDF_STATUS
Chandrasekaran, Manishekara74bb022016-01-12 18:37:43 +05301710wlansap_set_channel_change_with_csa(void *p_cds_gctx, uint32_t targetChannel,
Kiran Kumar Lokere13644672016-02-29 15:40:10 -08001711 enum phy_ch_width target_bw)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001712{
1713
1714 ptSapContext sapContext = NULL;
1715 tWLAN_SAPEvent sapEvent;
1716 tpAniSirGlobal pMac = NULL;
1717 void *hHal = NULL;
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +05301718 bool valid;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301719 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001720
1721 sapContext = CDS_GET_SAP_CB(p_cds_gctx);
1722 if (NULL == sapContext) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301723 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001724 "%s: Invalid SAP pointer from p_cds_gctx", __func__);
1725
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301726 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001727 }
Edhar, Mahesh Kumarbd8b3912015-11-25 19:28:12 +05301728
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001729 hHal = CDS_GET_HAL_CB(sapContext->p_cds_gctx);
1730 if (NULL == hHal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301731 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001732 "%s: Invalid HAL pointer from p_cds_gctx", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301733 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001734 }
1735 pMac = PMAC_STRUCT(hHal);
1736
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05301737 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
Manishekar Chandrasekaran1004ad92016-09-04 22:01:47 +05301738 "%s: sap chan:%d target:%d conn on 5GHz:%d",
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05301739 __func__, sapContext->channel, targetChannel,
Tushnim Bhattacharyya66348bd2017-03-09 15:02:10 -08001740 policy_mgr_is_any_mode_active_on_band_along_with_session(
1741 pMac->psoc, sapContext->sessionId, POLICY_MGR_BAND_5));
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05301742
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001743 /*
1744 * Now, validate if the passed channel is valid in the
1745 * current regulatory domain.
1746 */
1747 if (sapContext->channel != targetChannel &&
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07001748 ((wlan_reg_get_channel_state(pMac->pdev, targetChannel) ==
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001749 CHANNEL_STATE_ENABLE) ||
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07001750 (wlan_reg_get_channel_state(pMac->pdev, targetChannel) ==
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001751 CHANNEL_STATE_DFS &&
Tushnim Bhattacharyya66348bd2017-03-09 15:02:10 -08001752 !policy_mgr_is_any_mode_active_on_band_along_with_session(
1753 pMac->psoc, sapContext->sessionId,
1754 POLICY_MGR_BAND_5)))) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001755 /*
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +05301756 * validate target channel switch w.r.t various concurrency
1757 * rules set.
1758 */
1759 valid = wlan_sap_validate_channel_switch(hHal, targetChannel,
1760 sapContext);
1761 if (!valid) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301762 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +05301763 FL("Channel switch to %u is not allowed due to concurrent channel interference"),
1764 targetChannel);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301765 return QDF_STATUS_E_FAULT;
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +05301766 }
1767 /*
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001768 * Post a CSA IE request to SAP state machine with
1769 * target channel information and also CSA IE required
1770 * flag set in sapContext only, if SAP is in eSAP_STARTED
1771 * state.
1772 */
1773 if (eSAP_STARTED == sapContext->sapsMachine) {
Edhar, Mahesh Kumarbd8b3912015-11-25 19:28:12 +05301774 status = wlansap_update_csa_channel_params(sapContext,
1775 targetChannel);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301776 if (status != QDF_STATUS_SUCCESS)
Edhar, Mahesh Kumarbd8b3912015-11-25 19:28:12 +05301777 return status;
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +05301778
1779 /*
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001780 * Copy the requested target channel
1781 * to sap context.
1782 */
1783 pMac->sap.SapDfsInfo.target_channel = targetChannel;
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08001784 pMac->sap.SapDfsInfo.new_ch_params.ch_width =
1785 pMac->sap.SapDfsInfo.new_chanWidth;
Chandrasekaran, Manishekara74bb022016-01-12 18:37:43 +05301786
1787 /* By this time, the best bandwidth is calculated for
1788 * the given target channel. Now, if there was a
1789 * request from user to move to a selected bandwidth,
1790 * we can see if it can be honored.
1791 *
1792 * Ex1: BW80 was selected for the target channel and
1793 * user wants BW40, it can be allowed
1794 * Ex2: BW40 was selected for the target channel and
1795 * user wants BW80, it cannot be allowed for the given
1796 * target channel.
1797 *
1798 * So, the MIN of the selected channel bandwidth and
1799 * user input is used for the bandwidth
1800 */
1801 if (target_bw != CH_WIDTH_MAX) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301802 QDF_TRACE(QDF_MODULE_ID_SAP,
1803 QDF_TRACE_LEVEL_INFO,
Chandrasekaran, Manishekara74bb022016-01-12 18:37:43 +05301804 "%s: target bw:%d new width:%d",
1805 __func__, target_bw,
1806 pMac->sap.SapDfsInfo.
1807 new_ch_params.ch_width);
1808 pMac->sap.SapDfsInfo.new_ch_params.ch_width =
1809 pMac->sap.SapDfsInfo.new_chanWidth =
Anurag Chouhan6d760662016-02-20 16:05:43 +05301810 QDF_MIN(pMac->sap.SapDfsInfo.
Chandrasekaran, Manishekara74bb022016-01-12 18:37:43 +05301811 new_ch_params.ch_width,
1812 target_bw);
1813 }
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07001814 wlan_reg_set_channel_params(pMac->pdev, targetChannel,
Sandeep Puligilla1cc23f62016-04-27 16:52:49 -07001815 0, &pMac->sap.SapDfsInfo.new_ch_params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001816 /*
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001817 * Set the CSA IE required flag.
1818 */
1819 pMac->sap.SapDfsInfo.csaIERequired = true;
1820
1821 /*
1822 * Set the radar found status to allow the channel
1823 * change to happen same as in the case of a radar
1824 * detection. Since, this will allow SAP to be in
1825 * correct state and also resume the netif queues
1826 * that were suspended in HDD before the channel
1827 * request was issued.
1828 */
1829 pMac->sap.SapDfsInfo.sap_radar_found_status = true;
Edhar, Mahesh Kumar695468e2015-10-19 12:06:20 +05301830 pMac->sap.SapDfsInfo.cac_state =
1831 eSAP_DFS_DO_NOT_SKIP_CAC;
1832 sap_cac_reset_notify(hHal);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001833
1834 /*
Chandrasekaran, Manishekar8104abd2016-01-29 18:10:27 +05301835 * Post the eSAP_CHANNEL_SWITCH_ANNOUNCEMENT_START
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001836 * to SAP state machine to process the channel
1837 * request with CSA IE set in the beacons.
1838 */
1839 sapEvent.event =
Chandrasekaran, Manishekar8104abd2016-01-29 18:10:27 +05301840 eSAP_CHANNEL_SWITCH_ANNOUNCEMENT_START;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001841 sapEvent.params = 0;
1842 sapEvent.u1 = 0;
1843 sapEvent.u2 = 0;
1844
1845 sap_fsm(sapContext, &sapEvent);
1846
1847 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301848 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001849 "%s: Failed to request Channel Change, since"
1850 "SAP is not in eSAP_STARTED state", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301851 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001852 }
1853
1854 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301855 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001856 "%s: Channel = %d is not valid in the current"
1857 "regulatory domain", __func__, targetChannel);
1858
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301859 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001860 }
1861
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301862 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Chandrasekaran, Manishekar8104abd2016-01-29 18:10:27 +05301863 "%s: Posted eSAP_CHANNEL_SWITCH_ANNOUNCEMENT_START successfully to sap_fsm for Channel = %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001864 __func__, targetChannel);
1865
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301866 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001867}
1868
1869/**
1870 * wlansap_set_counter_measure() - set counter measure.
1871 * @pCtx: Pointer to the global cds context; a handle to SAP's control block
1872 * can be extracted from its context. When MBSSID feature is enabled,
1873 * SAP context is directly passed to SAP APIs.
1874 * @bEnable: If true than all stations will be disassociated and no more
1875 * will be allowed to associate. If false than CORE will come out
1876 * of this state.
1877 *
1878 * This api function is used to disassociate all the stations and prevent
1879 * association for any other station.Whenever Authenticator receives 2 mic
1880 * failures within 60 seconds, Authenticator will enable counter measure at
1881 * SAP Layer. Authenticator will start the 60 seconds timer. Core stack will
1882 * not allow any STA to associate till HDD disables counter meassure. Core
1883 * stack shall kick out all the STA which are currently associated and DIASSOC
1884 * Event will be propogated to HDD for each STA to clean up the HDD STA table.
1885 * Once the 60 seconds timer expires, Authenticator will disable the counter
1886 * meassure at core stack. Now core stack can allow STAs to associate.
1887 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301888 * Return: The QDF_STATUS code associated with performing the operation
1889 * QDF_STATUS_SUCCESS: Success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001890 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301891QDF_STATUS wlansap_set_counter_measure(void *pCtx, bool bEnable)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001892{
1893 ptSapContext pSapCtx = CDS_GET_SAP_CB(pCtx);
1894
1895 /*------------------------------------------------------------------------
1896 Sanity check
1897 Extract SAP control block
1898 ------------------------------------------------------------------------*/
1899 if (NULL == pSapCtx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301900 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001901 "%s: Invalid SAP pointer from pCtx", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301902 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001903 }
1904
1905 sme_roam_tkip_counter_measures(CDS_GET_HAL_CB(pSapCtx->p_cds_gctx),
1906 pSapCtx->sessionId, bEnable);
1907
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301908 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001909}
1910
1911/**
1912 * wlansap_set_key_sta() - set keys for a stations.
1913 * @pCtx: Pointer to the global cds context; a handle to SAP's control block
1914 * can be extracted from its context. When MBSSID feature is enabled,
1915 * SAP context is directly passed to SAP APIs.
1916 * @pSetKeyInfo : tCsrRoamSetKey structure for the station
1917 *
1918 * This api function provides for Ap App/HDD to set key for a station.
1919 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301920 * Return: The QDF_STATUS code associated with performing the operation
1921 * QDF_STATUS_SUCCESS: Success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001922 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301923QDF_STATUS wlansap_set_key_sta(void *pCtx, tCsrRoamSetKey *pSetKeyInfo)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001924{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301925 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001926 ptSapContext pSapCtx = NULL;
1927 void *hHal = NULL;
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301928 QDF_STATUS qdf_ret_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001929 uint32_t roamId = 0xFF;
1930
Peng Xuf5d60c82015-10-02 17:17:03 -07001931 pSapCtx = CDS_GET_SAP_CB(pCtx);
1932 if (NULL == pSapCtx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301933 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Peng Xuf5d60c82015-10-02 17:17:03 -07001934 "%s: Invalid SAP pointer from pCtx",
1935 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301936 return QDF_STATUS_E_FAULT;
Peng Xuf5d60c82015-10-02 17:17:03 -07001937 }
1938 hHal = CDS_GET_HAL_CB(pSapCtx->p_cds_gctx);
1939 if (NULL == hHal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301940 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Peng Xuf5d60c82015-10-02 17:17:03 -07001941 "%s: Invalid HAL pointer from p_cds_gctx",
1942 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301943 return QDF_STATUS_E_FAULT;
Peng Xuf5d60c82015-10-02 17:17:03 -07001944 }
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301945 qdf_ret_status =
Peng Xuf5d60c82015-10-02 17:17:03 -07001946 sme_roam_set_key(hHal, pSapCtx->sessionId, pSetKeyInfo,
1947 &roamId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001948
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301949 if (qdf_ret_status == QDF_STATUS_SUCCESS)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301950 qdf_status = QDF_STATUS_SUCCESS;
Peng Xuf5d60c82015-10-02 17:17:03 -07001951 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301952 qdf_status = QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001953
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301954 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001955}
1956
1957/**
1958 * wlan_sap_getstation_ie_information() - RSNIE Population
1959 *
1960 * @ctx: Global context
1961 * @len: Length of @buf
1962 * @buf: RSNIE IE data
1963 *
1964 * Populate RSN IE from CSR to HDD context
1965 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301966 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001967 */
1968
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301969QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001970wlan_sap_getstation_ie_information
1971 (void *ctx, uint32_t *len, uint8_t *buf) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301972 QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001973 ptSapContext sap_ctx = NULL;
1974 uint32_t ie_len = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001975
1976 sap_ctx = CDS_GET_SAP_CB(ctx);
1977 if (NULL == sap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301978 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001979 FL("Invalid SAP pointer from pCtx"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301980 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001981 }
1982
1983 if (len) {
1984 ie_len = *len;
1985 *len = sap_ctx->nStaWPARSnReqIeLength;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301986 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001987 FL("WPAIE len : %x"), *len);
1988 if ((buf) && (ie_len >= sap_ctx->nStaWPARSnReqIeLength)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301989 qdf_mem_copy(buf,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001990 sap_ctx->pStaWpaRsnReqIE,
1991 sap_ctx->nStaWPARSnReqIeLength);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301992 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001993 FL("WPAIE: %02x:%02x:%02x:%02x:%02x:%02x"),
1994 buf[0], buf[1], buf[2], buf[3], buf[4],
1995 buf[5]);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301996 qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001997 }
1998 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301999 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002000}
2001
2002/**
2003 * wlansap_set_wps_ie() - set WPI IE
2004 * @pCtx: Pointer to the global cds context; a handle to SAP's control block
2005 * can be extracted from its context. When MBSSID feature is enabled,
2006 * SAP context is directly passed to SAP APIs.
2007 * @pWPSIE: tSap_WPSIE structure that include WPS IEs
2008 *
2009 * This api function provides API for App/HDD to set WPS IE.
2010 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302011 * Return: The QDF_STATUS code associated with performing the operation
2012 * QDF_STATUS_SUCCESS: Success and error code otherwise.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002013 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302014QDF_STATUS wlansap_set_wps_ie(void *pCtx, tSap_WPSIE *pSap_WPSIe)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002015{
2016 ptSapContext pSapCtx = NULL;
2017 void *hHal = NULL;
2018
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302019 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002020 "%s, %d", __func__, __LINE__);
2021
Peng Xuf5d60c82015-10-02 17:17:03 -07002022 pSapCtx = CDS_GET_SAP_CB(pCtx);
2023 if (NULL == pSapCtx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302024 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Peng Xuf5d60c82015-10-02 17:17:03 -07002025 "%s: Invalid SAP pointer from pCtx",
2026 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302027 return QDF_STATUS_E_FAULT;
Peng Xuf5d60c82015-10-02 17:17:03 -07002028 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002029
Peng Xuf5d60c82015-10-02 17:17:03 -07002030 hHal = CDS_GET_HAL_CB(pSapCtx->p_cds_gctx);
2031 if (NULL == hHal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302032 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Peng Xuf5d60c82015-10-02 17:17:03 -07002033 "%s: Invalid HAL pointer from p_cds_gctx",
2034 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302035 return QDF_STATUS_E_FAULT;
Peng Xuf5d60c82015-10-02 17:17:03 -07002036 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002037
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302038 if (sap_acquire_global_lock(pSapCtx) == QDF_STATUS_SUCCESS) {
Peng Xuf5d60c82015-10-02 17:17:03 -07002039 if (pSap_WPSIe->sapWPSIECode == eSAP_WPS_BEACON_IE) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302040 qdf_mem_copy(&pSapCtx->APWPSIEs.SirWPSBeaconIE,
Peng Xuf5d60c82015-10-02 17:17:03 -07002041 &pSap_WPSIe->sapwpsie.
2042 sapWPSBeaconIE,
2043 sizeof(tSap_WPSBeaconIE));
2044 } else if (pSap_WPSIe->sapWPSIECode ==
2045 eSAP_WPS_PROBE_RSP_IE) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302046 qdf_mem_copy(&pSapCtx->APWPSIEs.
Peng Xuf5d60c82015-10-02 17:17:03 -07002047 SirWPSProbeRspIE,
2048 &pSap_WPSIe->sapwpsie.
2049 sapWPSProbeRspIE,
2050 sizeof(tSap_WPSProbeRspIE));
2051 } else {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002052 sap_release_global_lock(pSapCtx);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302053 return QDF_STATUS_E_FAULT;
Peng Xuf5d60c82015-10-02 17:17:03 -07002054 }
2055 sap_release_global_lock(pSapCtx);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302056 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002057 } else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302058 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002059}
2060
2061/**
2062 * wlansap_update_wps_ie() - update WPI IE
2063 * @pCtx: Pointer to the global cds context; a handle to SAP's control block
2064 * can be extracted from its context. When MBSSID feature is enabled,
2065 * SAP context is directly passed to SAP APIs.
2066 *
2067 * This api function provides API for App/HDD to update WPS IE.
2068 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302069 * Return: The QDF_STATUS code associated with performing the operation
2070 * QDF_STATUS_SUCCESS: Success and error code otherwise.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002071 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302072QDF_STATUS wlansap_update_wps_ie(void *pCtx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002073{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302074 QDF_STATUS qdf_status = QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002075 ptSapContext pSapCtx = NULL;
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302076 QDF_STATUS qdf_ret_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002077 void *hHal = NULL;
2078
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302079 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002080 "%s, %d", __func__, __LINE__);
2081
Peng Xuf5d60c82015-10-02 17:17:03 -07002082 pSapCtx = CDS_GET_SAP_CB(pCtx);
2083 if (NULL == pSapCtx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302084 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Peng Xuf5d60c82015-10-02 17:17:03 -07002085 "%s: Invalid SAP pointer from pCtx",
2086 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302087 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002088 }
2089
Peng Xuf5d60c82015-10-02 17:17:03 -07002090 hHal = CDS_GET_HAL_CB(pSapCtx->p_cds_gctx);
2091 if (NULL == hHal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302092 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Peng Xuf5d60c82015-10-02 17:17:03 -07002093 "%s: Invalid HAL pointer from p_cds_gctx",
2094 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302095 return QDF_STATUS_E_FAULT;
Peng Xuf5d60c82015-10-02 17:17:03 -07002096 }
2097
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302098 qdf_ret_status =
Peng Xuf5d60c82015-10-02 17:17:03 -07002099 sme_roam_update_apwpsie(hHal, pSapCtx->sessionId,
2100 &pSapCtx->APWPSIEs);
2101
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302102 if (qdf_ret_status == QDF_STATUS_SUCCESS)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302103 qdf_status = QDF_STATUS_SUCCESS;
Peng Xuf5d60c82015-10-02 17:17:03 -07002104 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302105 qdf_status = QDF_STATUS_E_FAULT;
Peng Xuf5d60c82015-10-02 17:17:03 -07002106
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302107 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002108}
2109
2110/**
2111 * wlansap_get_wps_state() - get WPS session state
2112 * @pCtx: Pointer to the global cds context; a handle to SAP's control block
2113 * can be extracted from its context. When MBSSID feature is enabled,
2114 * SAP context is directly passed to SAP APIs.
2115 * @pbWPSState: Pointer to variable to indicate if device is in
2116 * WPS Registration state
2117 *
2118 * This api function provides for Ap App/HDD to check if WPS session in process.
2119 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302120 * Return: The QDF_STATUS code associated with performing the operation
2121 * QDF_STATUS_SUCCESS: Success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002122 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302123QDF_STATUS wlansap_get_wps_state(void *pCtx, bool *bWPSState)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002124{
2125 ptSapContext pSapCtx = NULL;
2126 void *hHal = NULL;
2127
Peng Xuf5d60c82015-10-02 17:17:03 -07002128 pSapCtx = CDS_GET_SAP_CB(pCtx);
2129 if (NULL == pSapCtx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302130 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Peng Xuf5d60c82015-10-02 17:17:03 -07002131 "%s: Invalid SAP pointer from pCtx",
2132 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302133 return QDF_STATUS_E_FAULT;
Peng Xuf5d60c82015-10-02 17:17:03 -07002134 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002135
Peng Xuf5d60c82015-10-02 17:17:03 -07002136 hHal = CDS_GET_HAL_CB(pSapCtx->p_cds_gctx);
2137 if (NULL == hHal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302138 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Peng Xuf5d60c82015-10-02 17:17:03 -07002139 "%s: Invalid HAL pointer from p_cds_gctx",
2140 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302141 return QDF_STATUS_E_FAULT;
Peng Xuf5d60c82015-10-02 17:17:03 -07002142 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002143
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302144 if (sap_acquire_global_lock(pSapCtx) == QDF_STATUS_SUCCESS) {
Peng Xuf5d60c82015-10-02 17:17:03 -07002145 if (pSapCtx->APWPSIEs.SirWPSProbeRspIE.
2146 FieldPresent &
2147 SIR_WPS_PROBRSP_SELECTEDREGISTRA_PRESENT)
2148 *bWPSState = true;
2149 else
2150 *bWPSState = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002151
Peng Xuf5d60c82015-10-02 17:17:03 -07002152 sap_release_global_lock(pSapCtx);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002153
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302154 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002155 } else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302156 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002157
2158}
2159
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302160QDF_STATUS sap_acquire_global_lock(ptSapContext pSapCtx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002161{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302162 QDF_STATUS qdf_status = QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002163
Anurag Chouhana37b5b72016-02-21 14:53:42 +05302164 if (QDF_IS_STATUS_SUCCESS(qdf_mutex_acquire(&pSapCtx->SapGlobalLock))) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302165 qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002166 }
2167
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302168 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002169}
2170
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302171QDF_STATUS sap_release_global_lock(ptSapContext pSapCtx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002172{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302173 QDF_STATUS qdf_status = QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002174
Anurag Chouhana37b5b72016-02-21 14:53:42 +05302175 if (QDF_IS_STATUS_SUCCESS(qdf_mutex_release(&pSapCtx->SapGlobalLock))) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302176 qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002177 }
2178
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302179 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002180}
2181
2182/**
2183 * wlansap_set_wparsn_ies() - set WPA RSN IEs
2184 * @pCtx: Pointer to the global cds context; a handle to SAP's control block
2185 * can be extracted from its context. When MBSSID feature is enabled,
2186 * SAP context is directly passed to SAP APIs.
2187 * @pWPARSNIEs : buffer to the WPA/RSN IEs
2188 * @WPARSNIEsLen: length of WPA/RSN IEs
2189 *
2190 * This api function provides for Ap App/HDD to set AP WPA and RSN IE in its
2191 * beacon and probe response.
2192 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302193 * Return: The QDF_STATUS code associated with performing the operation
2194 * QDF_STATUS_SUCCESS: Success and error code otherwise
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002195 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302196QDF_STATUS wlansap_set_wparsn_ies
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002197 (void *pCtx, uint8_t *pWPARSNIEs, uint32_t WPARSNIEsLen) {
2198 ptSapContext pSapCtx = NULL;
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302199 QDF_STATUS qdf_ret_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002200 void *hHal = NULL;
2201
Peng Xuf5d60c82015-10-02 17:17:03 -07002202 pSapCtx = CDS_GET_SAP_CB(pCtx);
2203 if (NULL == pSapCtx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302204 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Peng Xuf5d60c82015-10-02 17:17:03 -07002205 "%s: Invalid SAP pointer from pCtx",
2206 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302207 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002208 }
2209
Peng Xuf5d60c82015-10-02 17:17:03 -07002210 hHal = CDS_GET_HAL_CB(pSapCtx->p_cds_gctx);
2211 if (NULL == hHal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302212 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Peng Xuf5d60c82015-10-02 17:17:03 -07002213 "%s: Invalid HAL pointer from p_cds_gctx",
2214 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302215 return QDF_STATUS_E_FAULT;
Peng Xuf5d60c82015-10-02 17:17:03 -07002216 }
2217
2218 pSapCtx->APWPARSNIEs.length = (uint16_t) WPARSNIEsLen;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302219 qdf_mem_copy(pSapCtx->APWPARSNIEs.rsnIEdata, pWPARSNIEs,
Peng Xuf5d60c82015-10-02 17:17:03 -07002220 WPARSNIEsLen);
2221
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302222 qdf_ret_status =
Peng Xuf5d60c82015-10-02 17:17:03 -07002223 sme_roam_update_apwparsni_es(hHal, pSapCtx->sessionId,
2224 &pSapCtx->APWPARSNIEs);
2225
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302226 if (qdf_ret_status == QDF_STATUS_SUCCESS)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302227 return QDF_STATUS_SUCCESS;
Peng Xuf5d60c82015-10-02 17:17:03 -07002228 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302229 return QDF_STATUS_E_FAULT;
Peng Xuf5d60c82015-10-02 17:17:03 -07002230
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302231 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002232}
2233
2234/**
2235 * wlansap_send_action() - send action frame
2236 * @pCtx: Pointer to the global cds context; a handle to SAP's control block
2237 * can be extracted from its context. When MBSSID feature is enabled,
2238 * SAP context is directly passed to SAP APIs.
2239 * @pBuf: Pointer of the action frame to be transmitted
2240 * @len: Length of the action frame
2241 *
2242 * This api function provides to send action frame sent by upper layer.
2243 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302244 * Return: The QDF_STATUS code associated with performing the operation
2245* QDF_STATUS_SUCCESS: Success and error code otherwise
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002246 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302247QDF_STATUS wlansap_send_action(void *pCtx, const uint8_t *pBuf,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002248 uint32_t len, uint16_t wait, uint16_t channel_freq)
2249{
2250 ptSapContext pSapCtx = NULL;
2251 void *hHal = NULL;
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302252 QDF_STATUS qdf_ret_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002253
Peng Xuf5d60c82015-10-02 17:17:03 -07002254 pSapCtx = CDS_GET_SAP_CB(pCtx);
2255 if (NULL == pSapCtx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302256 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Peng Xuf5d60c82015-10-02 17:17:03 -07002257 "%s: Invalid SAP pointer from pCtx",
2258 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302259 return QDF_STATUS_E_FAULT;
Peng Xuf5d60c82015-10-02 17:17:03 -07002260 }
2261 hHal = CDS_GET_HAL_CB(pSapCtx->p_cds_gctx);
Krunal Soni074dd2c2017-04-14 14:57:34 -07002262 if (NULL == hHal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302263 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Krunal Soni074dd2c2017-04-14 14:57:34 -07002264 FL("NULL hal pointer"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302265 return QDF_STATUS_E_FAULT;
Peng Xuf5d60c82015-10-02 17:17:03 -07002266 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002267
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302268 qdf_ret_status =
Peng Xuf5d60c82015-10-02 17:17:03 -07002269 sme_send_action(hHal, pSapCtx->sessionId, pBuf, len, 0,
2270 0, channel_freq);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002271
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302272 if (QDF_STATUS_SUCCESS == qdf_ret_status) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302273 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002274 }
2275
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302276 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002277 "Failed to Send Action Frame");
2278
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302279 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002280}
2281
2282/**
2283 * wlansap_remain_on_channel() - set remain on channel
2284 * @pCtx: Pointer to the global cds context; a handle to SAP's control block
2285 * can be extracted from its context. When MBSSID feature is enabled,
2286 * SAP context is directly passed to SAP APIs.
2287 * @channel: Channel on which driver has to listen
2288 * @duration: Duration for which driver has to listen on specified channel
2289 * @callback: Callback function to be called once Listen is done.
2290 * @pContext: Context needs to be called in callback function.
2291 * @scan_id: scan identifier
2292 *
2293 * This api function provides to set Remain On channel on specified channel
2294 * for specified duration.
2295 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302296 * Return: The QDF_STATUS code associated with performing the operation
2297 * QDF_STATUS_SUCCESS: Success and error code otherwise
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002298 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302299QDF_STATUS wlansap_remain_on_channel(void *pCtx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002300 uint8_t channel, uint32_t duration, remainOnChanCallback callback,
2301 void *pContext, uint32_t *scan_id)
2302{
2303 ptSapContext pSapCtx = NULL;
2304 void *hHal = NULL;
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302305 QDF_STATUS qdf_ret_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002306
Peng Xuf5d60c82015-10-02 17:17:03 -07002307 pSapCtx = CDS_GET_SAP_CB(pCtx);
2308 if (NULL == pSapCtx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302309 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Peng Xuf5d60c82015-10-02 17:17:03 -07002310 "%s: Invalid SAP pointer from pCtx",
2311 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302312 return QDF_STATUS_E_FAULT;
Peng Xuf5d60c82015-10-02 17:17:03 -07002313 }
2314 hHal = CDS_GET_HAL_CB(pSapCtx->p_cds_gctx);
Krunal Soni074dd2c2017-04-14 14:57:34 -07002315 if (NULL == hHal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302316 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Krunal Soni074dd2c2017-04-14 14:57:34 -07002317 FL("NULL hal pointer"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302318 return QDF_STATUS_E_FAULT;
Peng Xuf5d60c82015-10-02 17:17:03 -07002319 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002320
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302321 qdf_ret_status = sme_remain_on_channel(hHal, pSapCtx->sessionId,
Peng Xuf5d60c82015-10-02 17:17:03 -07002322 channel, duration, callback, pContext,
2323 true, scan_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002324
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302325 if (QDF_STATUS_SUCCESS == qdf_ret_status) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302326 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002327 }
2328
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302329 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002330 "Failed to Set Remain on Channel");
2331
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302332 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002333}
2334
2335/**
2336 * wlansap_cancel_remain_on_channel() - cancel remain on channel
2337 * @pCtx: Pointer to the global cds context; a handle to SAP's control block
2338 * can be extracted from its context. When MBSSID feature is enabled,
2339 * SAP context is directly passed to SAP APIs.
2340 *
2341 * This api cancel previous remain on channel request.
2342 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302343 * Return: The QDF_STATUS code associated with performing the operation
2344 * QDF_STATUS_SUCCESS: Success and error code otherwie
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002345 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302346QDF_STATUS wlansap_cancel_remain_on_channel(void *pCtx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002347 uint32_t scan_id)
2348{
2349 ptSapContext pSapCtx = NULL;
2350 void *hHal = NULL;
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302351 QDF_STATUS qdf_ret_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002352
Peng Xuf5d60c82015-10-02 17:17:03 -07002353 pSapCtx = CDS_GET_SAP_CB(pCtx);
2354 if (NULL == pSapCtx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302355 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Peng Xuf5d60c82015-10-02 17:17:03 -07002356 "%s: Invalid SAP pointer from pCtx",
2357 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302358 return QDF_STATUS_E_FAULT;
Peng Xuf5d60c82015-10-02 17:17:03 -07002359 }
2360 hHal = CDS_GET_HAL_CB(pSapCtx->p_cds_gctx);
Krunal Soni074dd2c2017-04-14 14:57:34 -07002361 if (NULL == hHal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302362 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Krunal Soni074dd2c2017-04-14 14:57:34 -07002363 FL("HAL pointer is null"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302364 return QDF_STATUS_E_FAULT;
Peng Xuf5d60c82015-10-02 17:17:03 -07002365 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002366
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302367 qdf_ret_status =
Peng Xuf5d60c82015-10-02 17:17:03 -07002368 sme_cancel_remain_on_channel(hHal, pSapCtx->sessionId,
2369 scan_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002370
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302371 if (QDF_STATUS_SUCCESS == qdf_ret_status) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302372 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002373 }
2374
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302375 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002376 "Failed to Cancel Remain on Channel");
2377
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302378 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002379}
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05302380
Kapil Gupta8878ad92017-02-13 11:56:04 +05302381QDF_STATUS wlan_sap_update_next_channel(void *ctx, uint8_t channel,
2382 enum phy_ch_width chan_bw)
2383{
2384 ptSapContext sap_ctx = CDS_GET_SAP_CB(ctx);
2385
2386 if (!sap_ctx) {
2387 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
2388 "%s: Invalid SAP pointer", __func__);
2389 return QDF_STATUS_E_FAULT;
2390 }
2391
2392 sap_ctx->dfs_vendor_channel = channel;
2393 sap_ctx->dfs_vendor_chan_bw = chan_bw;
2394
2395 return QDF_STATUS_SUCCESS;
2396}
2397
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05302398/**
2399 * wlan_sap_set_pre_cac_status() - Set the pre cac status
2400 * @ctx: SAP context
2401 * @status: Status of pre cac
2402 * @handle: Global MAC handle
2403 *
2404 * Sets the pre cac status in the MAC context and updates the state
2405 *
2406 * Return: QDF_STATUS
2407 */
2408QDF_STATUS wlan_sap_set_pre_cac_status(void *ctx, bool status,
2409 tHalHandle handle)
2410{
2411 ptSapContext sap_ctx = CDS_GET_SAP_CB(ctx);
2412 tpAniSirGlobal mac_ctx = PMAC_STRUCT(handle);
2413
2414 if (!mac_ctx) {
2415 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
2416 "%s: Invalid mac pointer", __func__);
2417 return QDF_STATUS_E_FAULT;
2418 }
2419
2420 if (!sap_ctx) {
2421 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
2422 "%s: Invalid SAP pointer", __func__);
2423 return QDF_STATUS_E_FAULT;
2424 }
2425
2426 sap_ctx->is_pre_cac_on = status;
2427 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG,
2428 "%s: is_pre_cac_on:%d", __func__, sap_ctx->is_pre_cac_on);
2429
2430 return QDF_STATUS_SUCCESS;
2431}
2432
2433/**
2434 * wlan_sap_set_chan_before_pre_cac() - Save the channel before pre cac
2435 * @ctx: SAP context
2436 * @chan_before_pre_cac: Channel before pre cac
2437 *
2438 * Saves the channel that was in use before pre cac operation
2439 *
2440 * Return: QDF_STATUS
2441 */
2442QDF_STATUS wlan_sap_set_chan_before_pre_cac(void *ctx,
2443 uint8_t chan_before_pre_cac)
2444{
2445 ptSapContext sap_ctx = CDS_GET_SAP_CB(ctx);
2446
2447 if (!sap_ctx) {
2448 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
2449 "%s: Invalid SAP pointer", __func__);
2450 return QDF_STATUS_E_FAULT;
2451 }
2452
2453 sap_ctx->chan_before_pre_cac = chan_before_pre_cac;
2454 return QDF_STATUS_SUCCESS;
2455}
2456
2457/**
2458 * wlan_sap_set_pre_cac_complete_status() - Sets pre cac complete status
2459 * @ctx: SAP context
2460 * @status: Status of pre cac complete
2461 *
2462 * Sets the status of pre cac i.e., whether pre cac is complete or not
2463 *
2464 * Return: QDF_STATUS
2465 */
2466QDF_STATUS wlan_sap_set_pre_cac_complete_status(void *ctx, bool status)
2467{
2468 ptSapContext sap_ctx = CDS_GET_SAP_CB(ctx);
2469
2470 if (!sap_ctx) {
2471 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
2472 "%s: Invalid SAP pointer", __func__);
2473 return QDF_STATUS_E_FAULT;
2474 }
2475
2476 sap_ctx->pre_cac_complete = status;
2477
2478 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG,
2479 "%s: pre cac complete status:%d session:%d",
2480 __func__, status, sap_ctx->sessionId);
2481
2482 return QDF_STATUS_SUCCESS;
2483}
2484
2485/**
2486 * wlan_sap_is_pre_cac_active() - Checks if pre cac in in progress
2487 * @handle: Global MAC handle
2488 *
2489 * Checks if pre cac is in progress in any of the SAP contexts
2490 *
2491 * Return: True is pre cac is active, false otherwise
2492 */
2493bool wlan_sap_is_pre_cac_active(tHalHandle handle)
2494{
2495 tpAniSirGlobal mac = NULL;
2496 int i;
2497
2498 mac = PMAC_STRUCT(handle);
2499 if (!mac) {
2500 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
2501 "%s: Invalid mac context", __func__);
2502 return false;
2503 }
2504
2505 for (i = 0; i < SAP_MAX_NUM_SESSION; i++) {
2506 ptSapContext context =
2507 (ptSapContext) mac->sap.sapCtxList[i].pSapContext;
2508 if (context && context->is_pre_cac_on)
2509 return true;
2510 }
2511 return false;
2512}
2513
2514/**
2515 * wlan_sap_get_pre_cac_vdev_id() - Get vdev id of the pre cac interface
2516 * @handle: Global handle
2517 * @vdev_id: vdev id
2518 *
2519 * Fetches the vdev id of the pre cac interface
2520 *
2521 * Return: QDF_STATUS
2522 */
2523QDF_STATUS wlan_sap_get_pre_cac_vdev_id(tHalHandle handle, uint8_t *vdev_id)
2524{
2525 tpAniSirGlobal mac = NULL;
2526 uint8_t i;
2527
2528 mac = PMAC_STRUCT(handle);
2529 if (!mac) {
2530 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
2531 "%s: Invalid mac context", __func__);
2532 return QDF_STATUS_E_FAULT;
2533 }
2534
2535 for (i = 0; i < SAP_MAX_NUM_SESSION; i++) {
2536 ptSapContext context =
2537 (ptSapContext) mac->sap.sapCtxList[i].pSapContext;
2538 if (context && context->is_pre_cac_on) {
2539 *vdev_id = i;
2540 return QDF_STATUS_SUCCESS;
2541 }
2542 }
2543 return QDF_STATUS_E_FAILURE;
2544}
2545
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002546/**
2547 * wlansap_register_mgmt_frame() - register management frame
2548 * @pCtx: Pointer to the global cds context; a handle to SAP's control block
2549 * can be extracted from its context. When MBSSID feature is enabled,
2550 * SAP context is directly passed to SAP APIs.
2551 * @frameType: frameType that needs to be registered with PE.
2552 * @matchData: Data pointer which should be matched after frame type is matched.
2553 * @matchLen: Length of the matchData
2554 *
2555 * HDD use this API to register specified type of frame with CORE stack.
2556 * On receiving such kind of frame CORE stack should pass this frame to HDD
2557 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302558 * Return: The QDF_STATUS code associated with performing the operation
2559 * QDF_STATUS_SUCCESS: Success and error code otherwise
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002560 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302561QDF_STATUS wlansap_register_mgmt_frame
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002562 (void *pCtx,
2563 uint16_t frameType, uint8_t *matchData, uint16_t matchLen) {
2564 ptSapContext pSapCtx = NULL;
2565 void *hHal = NULL;
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302566 QDF_STATUS qdf_ret_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002567
Peng Xuf5d60c82015-10-02 17:17:03 -07002568 pSapCtx = CDS_GET_SAP_CB(pCtx);
2569 if (NULL == pSapCtx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302570 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Peng Xuf5d60c82015-10-02 17:17:03 -07002571 "%s: Invalid SAP pointer from pCtx",
2572 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302573 return QDF_STATUS_E_FAULT;
Peng Xuf5d60c82015-10-02 17:17:03 -07002574 }
2575 hHal = CDS_GET_HAL_CB(pSapCtx->p_cds_gctx);
Krunal Soni074dd2c2017-04-14 14:57:34 -07002576 if (NULL == hHal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302577 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Krunal Soni074dd2c2017-04-14 14:57:34 -07002578 FL("hal pointer null"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302579 return QDF_STATUS_E_FAULT;
Peng Xuf5d60c82015-10-02 17:17:03 -07002580 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002581
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302582 qdf_ret_status = sme_register_mgmt_frame(hHal, pSapCtx->sessionId,
Peng Xuf5d60c82015-10-02 17:17:03 -07002583 frameType, matchData,
2584 matchLen);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002585
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302586 if (QDF_STATUS_SUCCESS == qdf_ret_status) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302587 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002588 }
2589
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302590 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002591 "Failed to Register MGMT frame");
2592
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302593 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002594}
2595
2596/**
2597 * wlansap_de_register_mgmt_frame() - de register management frame
2598 * @pCtx: Pointer to the global cds context; a handle to SAP's control block
2599 * can be extracted from its context. When MBSSID feature is enabled,
2600 * SAP context is directly passed to SAP APIs.
2601 * @frameType: frameType that needs to be De-registered with PE.
2602 * @matchData: Data pointer which should be matched after frame type is matched.
2603 * @matchLen: Length of the matchData
2604 *
2605 * This API is used to deregister previously registered frame.
2606 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302607 * Return: The QDF_STATUS code associated with performing the operation
2608 * QDF_STATUS_SUCCESS: Success and error code otherwise
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002609 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302610QDF_STATUS wlansap_de_register_mgmt_frame
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002611 (void *pCtx,
2612 uint16_t frameType, uint8_t *matchData, uint16_t matchLen) {
2613 ptSapContext pSapCtx = NULL;
2614 void *hHal = NULL;
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302615 QDF_STATUS qdf_ret_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002616
Peng Xuf5d60c82015-10-02 17:17:03 -07002617 pSapCtx = CDS_GET_SAP_CB(pCtx);
2618 if (NULL == pSapCtx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302619 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Peng Xuf5d60c82015-10-02 17:17:03 -07002620 "%s: Invalid SAP pointer from pCtx",
2621 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302622 return QDF_STATUS_E_FAULT;
Peng Xuf5d60c82015-10-02 17:17:03 -07002623 }
2624 hHal = CDS_GET_HAL_CB(pSapCtx->p_cds_gctx);
Krunal Soni074dd2c2017-04-14 14:57:34 -07002625 if (NULL == hHal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302626 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Krunal Soni074dd2c2017-04-14 14:57:34 -07002627 FL("hal pointer null"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302628 return QDF_STATUS_E_FAULT;
Peng Xuf5d60c82015-10-02 17:17:03 -07002629 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002630
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302631 qdf_ret_status =
Peng Xuf5d60c82015-10-02 17:17:03 -07002632 sme_deregister_mgmt_frame(hHal, pSapCtx->sessionId, frameType,
2633 matchData, matchLen);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002634
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302635 if (QDF_STATUS_SUCCESS == qdf_ret_status) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302636 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002637 }
2638
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302639 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002640 "Failed to Deregister MGMT frame");
2641
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302642 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002643}
2644
2645/*==========================================================================
2646 FUNCTION wlansap_channel_change_request
2647
2648 DESCRIPTION
2649 This API is used to send an Indication to SME/PE to change the
2650 current operating channel to a different target channel.
2651
2652 The Channel change will be issued by SAP under the following
2653 scenarios.
2654 1. A radar indication is received during SAP CAC WAIT STATE and
2655 channel change is required.
2656 2. A radar indication is received during SAP STARTED STATE and
2657 channel change is required.
2658 DEPENDENCIES
2659 NA.
2660
2661 PARAMETERS
2662 IN
2663 pSapCtx: Pointer to cds global context structure
2664
2665 RETURN VALUE
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302666 The QDF_STATUS code associated with performing the operation
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002667
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302668 QDF_STATUS_SUCCESS: Success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002669
2670 SIDE EFFECTS
2671 ============================================================================*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302672QDF_STATUS
Abhishek Singh518323d2015-10-19 17:42:01 +05302673wlansap_channel_change_request(void *pSapCtx, uint8_t target_channel)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002674{
2675 ptSapContext sapContext = NULL;
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302676 QDF_STATUS qdf_ret_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002677 void *hHal = NULL;
2678 tpAniSirGlobal mac_ctx = NULL;
2679 eCsrPhyMode phy_mode;
Amar Singhal5cccafe2017-02-15 12:42:58 -08002680 struct ch_params *ch_params;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002681 sapContext = (ptSapContext) pSapCtx;
2682
2683 if (NULL == sapContext) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302684 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002685 "%s: Invalid SAP pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302686 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002687 }
2688
2689 hHal = CDS_GET_HAL_CB(sapContext->p_cds_gctx);
2690 if (NULL == hHal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302691 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002692 "%s: Invalid HAL pointer from p_cds_gctx", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302693 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002694 }
2695 mac_ctx = PMAC_STRUCT(hHal);
2696 phy_mode = sapContext->csr_roamProfile.phyMode;
Wu Gaoa61310a2016-11-29 17:02:36 +08002697
2698 if (sapContext->csr_roamProfile.ChannelInfo.numOfChannels == 0 ||
2699 sapContext->csr_roamProfile.ChannelInfo.ChannelList == NULL) {
2700 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
2701 FL("Invalid channel list"));
2702 return QDF_STATUS_E_FAULT;
2703 }
Abhishek Singh518323d2015-10-19 17:42:01 +05302704 sapContext->csr_roamProfile.ChannelInfo.ChannelList[0] = target_channel;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002705 /*
2706 * We are getting channel bonding mode from sapDfsInfor structure
2707 * because we've implemented channel width fallback mechanism for DFS
2708 * which will result in channel width changing dynamically.
2709 */
Sandeep Puligilla2111d3c2016-02-03 01:46:15 -08002710 ch_params = &mac_ctx->sap.SapDfsInfo.new_ch_params;
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07002711 wlan_reg_set_channel_params(mac_ctx->pdev, target_channel,
2712 0, ch_params);
Sandeep Puligilla2111d3c2016-02-03 01:46:15 -08002713 sapContext->ch_params.ch_width = ch_params->ch_width;
Abhishek Singh518323d2015-10-19 17:42:01 +05302714 /* Update the channel as this will be used to
2715 * send event to supplicant
2716 */
2717 sapContext->channel = target_channel;
Sandeep Puligilla2111d3c2016-02-03 01:46:15 -08002718 sapContext->csr_roamProfile.ch_params.ch_width = ch_params->ch_width;
Manishekar Chandrasekaranec267592016-05-26 19:10:04 +05302719 sapContext->csr_roamProfile.ch_params.sec_ch_offset =
2720 ch_params->sec_ch_offset;
2721 sapContext->csr_roamProfile.ch_params.center_freq_seg0 =
2722 ch_params->center_freq_seg0;
2723 sapContext->csr_roamProfile.ch_params.center_freq_seg1 =
2724 ch_params->center_freq_seg1;
yeshwanth sriram guntuka92fefea2017-02-28 15:49:22 +05302725 sapContext->csr_roamProfile.supported_rates.numRates = 0;
2726 sapContext->csr_roamProfile.extended_rates.numRates = 0;
Arif Hussaincd151632017-02-11 16:57:19 -08002727 sap_dfs_set_current_channel(sapContext);
Manishekar Chandrasekaranec267592016-05-26 19:10:04 +05302728
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302729 qdf_ret_status = sme_roam_channel_change_req(hHal, sapContext->bssid,
Sandeep Puligilla2111d3c2016-02-03 01:46:15 -08002730 ch_params, &sapContext->csr_roamProfile);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002731
Manishekar Chandrasekaranec267592016-05-26 19:10:04 +05302732 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
2733 "%s: chan:%d width:%d offset:%d seg0:%d seg1:%d",
2734 __func__, sapContext->channel, ch_params->ch_width,
2735 ch_params->sec_ch_offset, ch_params->center_freq_seg0,
2736 ch_params->center_freq_seg1);
2737
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302738 if (qdf_ret_status == QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002739 sap_signal_hdd_event(sapContext, NULL,
2740 eSAP_CHANNEL_CHANGE_EVENT,
2741 (void *) eSAP_STATUS_SUCCESS);
2742
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302743 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002744 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302745 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002746}
2747
2748/*==========================================================================
2749
2750 FUNCTION wlansap_start_beacon_req
2751 DESCRIPTION
2752 This API is used to send an Indication to SME/PE to start
2753 beaconing on the current operating channel.
2754
2755 Brief:When SAP is started on DFS channel and when ADD BSS RESP is received
2756 LIM temporarily holds off Beaconing for SAP to do CAC WAIT. When
2757 CAC WAIT is done SAP resumes the Beacon Tx by sending a start beacon
2758 request to LIM.
2759
2760 DEPENDENCIES
2761 NA.
2762
2763 PARAMETERS
2764
2765 IN
2766 pSapCtx: Pointer to cds global context structure
2767
2768 RETURN VALUE
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302769 The QDF_STATUS code associated with performing the operation
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002770
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302771 QDF_STATUS_SUCCESS: Success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002772
2773 SIDE EFFECTS
2774 ============================================================================*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302775QDF_STATUS wlansap_start_beacon_req(void *pSapCtx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002776{
2777 ptSapContext sapContext = NULL;
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302778 QDF_STATUS qdf_ret_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002779 void *hHal = NULL;
2780 uint8_t dfsCacWaitStatus = 0;
2781 tpAniSirGlobal pMac = NULL;
2782 sapContext = (ptSapContext) pSapCtx;
2783
2784 if (NULL == sapContext) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302785 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002786 "%s: Invalid SAP pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302787 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002788 }
2789
2790 hHal = CDS_GET_HAL_CB(sapContext->p_cds_gctx);
2791 if (NULL == hHal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302792 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002793 "%s: Invalid HAL pointer from p_cds_gctx", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302794 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002795 }
2796 pMac = PMAC_STRUCT(hHal);
2797
2798 /* No Radar was found during CAC WAIT, So start Beaconing */
2799 if (pMac->sap.SapDfsInfo.sap_radar_found_status == false) {
2800 /* CAC Wait done without any Radar Detection */
2801 dfsCacWaitStatus = true;
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05302802 sapContext->pre_cac_complete = false;
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302803 qdf_ret_status = sme_roam_start_beacon_req(hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002804 sapContext->bssid,
2805 dfsCacWaitStatus);
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302806 if (qdf_ret_status == QDF_STATUS_SUCCESS) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302807 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002808 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302809 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002810 }
2811
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302812 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002813}
2814
2815/*==========================================================================
2816 FUNCTION wlansap_dfs_send_csa_ie_request
2817
2818 DESCRIPTION
2819 This API is used to send channel switch announcement request to PE
2820 DEPENDENCIES
2821 NA.
2822
2823 PARAMETERS
2824 IN
2825 pSapCtx: Pointer to cds global context structure
2826
2827 RETURN VALUE
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302828 The QDF_STATUS code associated with performing the operation
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002829
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302830 QDF_STATUS_SUCCESS: Success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002831
2832 SIDE EFFECTS
2833 ============================================================================*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302834QDF_STATUS wlansap_dfs_send_csa_ie_request(void *pSapCtx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002835{
2836 ptSapContext sapContext = NULL;
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302837 QDF_STATUS qdf_ret_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002838 void *hHal = NULL;
2839 tpAniSirGlobal pMac = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002840 sapContext = (ptSapContext) pSapCtx;
2841
2842 if (NULL == sapContext) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302843 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002844 "%s: Invalid SAP pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302845 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002846 }
2847
2848 hHal = CDS_GET_HAL_CB(sapContext->p_cds_gctx);
2849 if (NULL == hHal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302850 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002851 "%s: Invalid HAL pointer from p_cds_gctx", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302852 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002853 }
2854 pMac = PMAC_STRUCT(hHal);
2855
Sandeep Puligilla2111d3c2016-02-03 01:46:15 -08002856 pMac->sap.SapDfsInfo.new_ch_params.ch_width =
2857 pMac->sap.SapDfsInfo.new_chanWidth;
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07002858 wlan_reg_set_channel_params(pMac->pdev,
2859 pMac->sap.SapDfsInfo.target_channel,
2860 0, &pMac->sap.SapDfsInfo.new_ch_params);
Sandeep Puligilla2111d3c2016-02-03 01:46:15 -08002861
Chandrasekaran Manishekar4fcb7f52016-03-07 19:09:20 +05302862 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
2863 "%s: chan:%d req:%d width:%d off:%d",
2864 __func__, pMac->sap.SapDfsInfo.target_channel,
2865 pMac->sap.SapDfsInfo.csaIERequired,
2866 pMac->sap.SapDfsInfo.new_ch_params.ch_width,
2867 pMac->sap.SapDfsInfo.new_ch_params.sec_ch_offset);
2868
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302869 qdf_ret_status = sme_roam_csa_ie_request(hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002870 sapContext->bssid,
2871 pMac->sap.SapDfsInfo.target_channel,
2872 pMac->sap.SapDfsInfo.csaIERequired,
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08002873 &pMac->sap.SapDfsInfo.new_ch_params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002874
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302875 if (qdf_ret_status == QDF_STATUS_SUCCESS) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302876 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002877 }
2878
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302879 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002880}
2881
2882/*==========================================================================
2883 FUNCTION wlansap_get_dfs_ignore_cac
2884
2885 DESCRIPTION
2886 This API is used to get the value of ignore_cac value
2887
2888 DEPENDENCIES
2889 NA.
2890
2891 PARAMETERS
2892 IN
2893 hHal : HAL pointer
2894 pIgnore_cac : pointer to ignore_cac variable
2895
2896 RETURN VALUE
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302897 The QDF_STATUS code associated with performing the operation
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002898
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302899 QDF_STATUS_SUCCESS: Success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002900
2901 SIDE EFFECTS
2902 ============================================================================*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302903QDF_STATUS wlansap_get_dfs_ignore_cac(tHalHandle hHal, uint8_t *pIgnore_cac)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002904{
2905 tpAniSirGlobal pMac = NULL;
2906
2907 if (NULL != hHal) {
2908 pMac = PMAC_STRUCT(hHal);
2909 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302910 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002911 "%s: Invalid hHal pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302912 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002913 }
2914
2915 *pIgnore_cac = pMac->sap.SapDfsInfo.ignore_cac;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302916 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002917}
2918
2919/*==========================================================================
2920 FUNCTION wlansap_set_dfs_ignore_cac
2921
2922 DESCRIPTION
2923 This API is used to Set the value of ignore_cac value
2924
2925 DEPENDENCIES
2926 NA.
2927
2928 PARAMETERS
2929 IN
2930 hHal : HAL pointer
2931 ignore_cac : value to set for ignore_cac variable in DFS global structure.
2932
2933 RETURN VALUE
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302934 The QDF_STATUS code associated with performing the operation
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002935
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302936 QDF_STATUS_SUCCESS: Success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002937
2938 SIDE EFFECTS
2939 ============================================================================*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302940QDF_STATUS wlansap_set_dfs_ignore_cac(tHalHandle hHal, uint8_t ignore_cac)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002941{
2942 tpAniSirGlobal pMac = NULL;
2943
2944 if (NULL != hHal) {
2945 pMac = PMAC_STRUCT(hHal);
2946 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302947 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002948 "%s: Invalid hHal pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302949 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002950 }
2951
2952 pMac->sap.SapDfsInfo.ignore_cac = (ignore_cac >= true) ?
2953 true : false;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302954 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002955}
2956
2957/**
2958 * wlansap_set_dfs_restrict_japan_w53() - enable/disable dfS for japan
2959 * @hHal : HAL pointer
2960 * @disable_Dfs_JapanW3 :Indicates if Japan W53 is disabled when set to 1
2961 * Indicates if Japan W53 is enabled when set to 0
2962 *
2963 * This API is used to enable or disable Japan W53 Band
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302964 * Return: The QDF_STATUS code associated with performing the operation
2965 * QDF_STATUS_SUCCESS: Success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002966 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302967QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002968wlansap_set_dfs_restrict_japan_w53(tHalHandle hHal, uint8_t disable_Dfs_W53)
2969{
2970 tpAniSirGlobal pMac = NULL;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302971 QDF_STATUS status;
Amar Singhal5cccafe2017-02-15 12:42:58 -08002972 enum dfs_reg dfs_region;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002973
2974 if (NULL != hHal) {
2975 pMac = PMAC_STRUCT(hHal);
2976 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302977 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002978 "%s: Invalid hHal pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302979 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002980 }
2981
Amar Singhal5cccafe2017-02-15 12:42:58 -08002982 wlan_reg_get_dfs_region(pMac->psoc, &dfs_region);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002983
2984 /*
2985 * Set the JAPAN W53 restriction only if the current
2986 * regulatory domain is JAPAN.
2987 */
Amar Singhal5cccafe2017-02-15 12:42:58 -08002988 if (DFS_MKK_REG == dfs_region) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002989 pMac->sap.SapDfsInfo.is_dfs_w53_disabled = disable_Dfs_W53;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302990 QDF_TRACE(QDF_MODULE_ID_SAP,
2991 QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002992 FL("sapdfs: SET DFS JAPAN W53 DISABLED = %d"),
2993 pMac->sap.SapDfsInfo.is_dfs_w53_disabled);
2994
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302995 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002996 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302997 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002998 FL
Srinivas Girigowda678586c2017-03-10 00:13:58 -08002999 ("Regdomain not japan, set disable JP W53 not valid"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003000
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303001 status = QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003002 }
3003
3004 return status;
3005}
3006
bings394afdd2017-01-09 11:22:38 +08003007bool sap_is_auto_channel_select(void *pvos_gctx)
3008{
3009 ptSapContext sapcontext = CDS_GET_SAP_CB(pvos_gctx);
3010
3011 if (NULL == sapcontext) {
3012 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
3013 "%s: Invalid SAP pointer", __func__);
3014 return 0;
3015 }
3016 return sapcontext->channel == AUTO_CHANNEL_SELECT;
3017}
3018
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003019#ifdef FEATURE_AP_MCC_CH_AVOIDANCE
3020/**
3021 * wlan_sap_set_channel_avoidance() - sets sap mcc channel avoidance ini param
3022 * @hal: hal handle
3023 * @sap_channel_avoidance: ini parameter value
3024 *
3025 * sets sap mcc channel avoidance ini param, to be called in sap_start
3026 *
3027 * Return: success of failure of operation
3028 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303029QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003030wlan_sap_set_channel_avoidance(tHalHandle hal, bool sap_channel_avoidance)
3031{
3032 tpAniSirGlobal mac_ctx = NULL;
3033 if (NULL != hal)
3034 mac_ctx = PMAC_STRUCT(hal);
3035 if (mac_ctx == NULL || hal == NULL) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303036 QDF_TRACE(QDF_MODULE_ID_SAP,
3037 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003038 FL("hal or mac_ctx pointer NULL"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303039 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003040 }
3041 mac_ctx->sap.sap_channel_avoidance = sap_channel_avoidance;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303042 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003043}
3044#endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
3045
3046/**
3047 * wlansap_set_dfs_preferred_channel_location() - set dfs preferred channel
3048 * @hHal : HAL pointer
3049 * @dfs_Preferred_Channels_location :
3050 * 0 - Indicates No preferred channel location restrictions
3051 * 1 - Indicates SAP Indoor Channels operation only.
3052 * 2 - Indicates SAP Outdoor Channels operation only.
3053 *
3054 * This API is used to set sap preferred channels location
3055 * to resetrict the DFS random channel selection algorithm
3056 * either Indoor/Outdoor channels only.
3057 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303058 * Return: The QDF_STATUS code associated with performing the operation
3059 * QDF_STATUS_SUCCESS: Success and error code otherwise.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003060 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303061QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003062wlansap_set_dfs_preferred_channel_location(tHalHandle hHal,
3063 uint8_t
3064 dfs_Preferred_Channels_location)
3065{
3066 tpAniSirGlobal pMac = NULL;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303067 QDF_STATUS status;
Amar Singhal5cccafe2017-02-15 12:42:58 -08003068 enum dfs_reg dfs_region;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003069
3070 if (NULL != hHal) {
3071 pMac = PMAC_STRUCT(hHal);
3072 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303073 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003074 "%s: Invalid hHal pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303075 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003076 }
3077
Amar Singhal5cccafe2017-02-15 12:42:58 -08003078 wlan_reg_get_dfs_region(pMac->psoc, &dfs_region);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003079
3080 /*
3081 * The Indoor/Outdoor only random channel selection
3082 * restriction is currently enforeced only for
3083 * JAPAN regulatory domain.
3084 */
Amar Singhal5cccafe2017-02-15 12:42:58 -08003085 if (DFS_MKK_REG == dfs_region) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003086 pMac->sap.SapDfsInfo.sap_operating_chan_preferred_location =
3087 dfs_Preferred_Channels_location;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303088 QDF_TRACE(QDF_MODULE_ID_SAP,
3089 QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003090 FL
3091 ("sapdfs:Set Preferred Operating Channel location=%d"),
3092 pMac->sap.SapDfsInfo.
3093 sap_operating_chan_preferred_location);
3094
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303095 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003096 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303097 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003098 FL
3099 ("sapdfs:NOT JAPAN REG, Invalid Set preferred chans location"));
3100
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303101 status = QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003102 }
3103
3104 return status;
3105}
3106
3107/*==========================================================================
3108 FUNCTION wlansap_set_dfs_target_chnl
3109
3110 DESCRIPTION
3111 This API is used to set next target chnl as provided channel.
3112 you can provide any valid channel to this API.
3113
3114 DEPENDENCIES
3115 NA.
3116
3117 PARAMETERS
3118 IN
3119 hHal : HAL pointer
3120 target_channel : target channel to be set
3121
3122 RETURN VALUE
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303123 The QDF_STATUS code associated with performing the operation
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003124
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303125 QDF_STATUS_SUCCESS: Success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003126
3127 SIDE EFFECTS
3128 ============================================================================*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303129QDF_STATUS wlansap_set_dfs_target_chnl(tHalHandle hHal, uint8_t target_channel)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003130{
3131 tpAniSirGlobal pMac = NULL;
3132
3133 if (NULL != hHal) {
3134 pMac = PMAC_STRUCT(hHal);
3135 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303136 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003137 "%s: Invalid hHal pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303138 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003139 }
3140 if (target_channel > 0) {
3141 pMac->sap.SapDfsInfo.user_provided_target_channel =
3142 target_channel;
3143 } else {
3144 pMac->sap.SapDfsInfo.user_provided_target_channel = 0;
3145 }
3146
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303147 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003148}
3149
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303150QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003151wlansap_update_sap_config_add_ie(tsap_Config_t *pConfig,
3152 const uint8_t *pAdditionIEBuffer,
3153 uint16_t additionIELength,
3154 eUpdateIEsType updateType)
3155{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303156 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003157 uint8_t bufferValid = false;
3158 uint16_t bufferLength = 0;
3159 uint8_t *pBuffer = NULL;
3160
3161 if (NULL == pConfig) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303162 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003163 }
3164
3165 if ((pAdditionIEBuffer != NULL) && (additionIELength != 0)) {
3166 /* initialize the buffer pointer so that pe can copy */
3167 if (additionIELength > 0) {
3168 bufferLength = additionIELength;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303169 pBuffer = qdf_mem_malloc(bufferLength);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003170 if (NULL == pBuffer) {
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -08003171 QDF_TRACE(QDF_MODULE_ID_SAP,
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303172 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003173 FL("Could not allocate the buffer "));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303174 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003175 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303176 qdf_mem_copy(pBuffer, pAdditionIEBuffer, bufferLength);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003177 bufferValid = true;
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -08003178 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
3179 FL("update_type: %d"), updateType);
3180 qdf_trace_hex_dump(QDF_MODULE_ID_SAP,
3181 QDF_TRACE_LEVEL_INFO, pBuffer, bufferLength);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003182 }
3183 }
3184
3185 switch (updateType) {
3186 case eUPDATE_IE_PROBE_BCN:
3187 if (bufferValid) {
3188 pConfig->probeRespBcnIEsLen = bufferLength;
3189 pConfig->pProbeRespBcnIEsBuffer = pBuffer;
3190 } else {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303191 qdf_mem_free(pConfig->pProbeRespBcnIEsBuffer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003192 pConfig->probeRespBcnIEsLen = 0;
3193 pConfig->pProbeRespBcnIEsBuffer = NULL;
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -08003194 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
3195 FL("No Probe Resp beacone IE received in set beacon"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003196 }
3197 break;
3198 case eUPDATE_IE_PROBE_RESP:
3199 if (bufferValid) {
3200 pConfig->probeRespIEsBufferLen = bufferLength;
3201 pConfig->pProbeRespIEsBuffer = pBuffer;
3202 } else {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303203 qdf_mem_free(pConfig->pProbeRespIEsBuffer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003204 pConfig->probeRespIEsBufferLen = 0;
3205 pConfig->pProbeRespIEsBuffer = NULL;
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -08003206 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
3207 FL("No Probe Response IE received in set beacon"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003208 }
3209 break;
3210 case eUPDATE_IE_ASSOC_RESP:
3211 if (bufferValid) {
3212 pConfig->assocRespIEsLen = bufferLength;
3213 pConfig->pAssocRespIEsBuffer = pBuffer;
3214 } else {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303215 qdf_mem_free(pConfig->pAssocRespIEsBuffer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003216 pConfig->assocRespIEsLen = 0;
3217 pConfig->pAssocRespIEsBuffer = NULL;
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -08003218 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
3219 FL("No Assoc Response IE received in set beacon"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003220 }
3221 break;
3222 default:
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -08003223 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003224 FL("No matching buffer type %d"), updateType);
3225 if (pBuffer != NULL)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303226 qdf_mem_free(pBuffer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003227 break;
3228 }
3229
3230 return status;
3231}
3232
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303233QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003234wlansap_reset_sap_config_add_ie(tsap_Config_t *pConfig, eUpdateIEsType updateType)
3235{
3236 if (NULL == pConfig) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303237 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003238 "%s: Invalid Config pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303239 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003240 }
3241
3242 switch (updateType) {
3243 case eUPDATE_IE_ALL: /*only used to reset */
3244 case eUPDATE_IE_PROBE_RESP:
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303245 qdf_mem_free(pConfig->pProbeRespIEsBuffer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003246 pConfig->probeRespIEsBufferLen = 0;
3247 pConfig->pProbeRespIEsBuffer = NULL;
3248 if (eUPDATE_IE_ALL != updateType)
3249 break;
3250
3251 case eUPDATE_IE_ASSOC_RESP:
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303252 qdf_mem_free(pConfig->pAssocRespIEsBuffer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003253 pConfig->assocRespIEsLen = 0;
3254 pConfig->pAssocRespIEsBuffer = NULL;
3255 if (eUPDATE_IE_ALL != updateType)
3256 break;
3257
3258 case eUPDATE_IE_PROBE_BCN:
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303259 qdf_mem_free(pConfig->pProbeRespBcnIEsBuffer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003260 pConfig->probeRespBcnIEsLen = 0;
3261 pConfig->pProbeRespBcnIEsBuffer = NULL;
3262 if (eUPDATE_IE_ALL != updateType)
3263 break;
3264
3265 default:
3266 if (eUPDATE_IE_ALL != updateType)
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303267 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003268 FL("Invalid buffer type %d"), updateType);
3269 break;
3270 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303271 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003272}
3273
3274/*==========================================================================
3275 FUNCTION wlansap_extend_to_acs_range
3276
3277 DESCRIPTION Function extends give channel range to consider ACS chan bonding
3278
3279 DEPENDENCIES PARAMETERS
3280
3281 IN /OUT
3282 *startChannelNum : ACS extend start ch
3283 *endChannelNum : ACS extended End ch
3284 *bandStartChannel: Band start ch
3285 *bandEndChannel : Band end ch
3286
3287 RETURN VALUE NONE
3288
3289 SIDE EFFECTS
3290 ============================================================================*/
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07003291void wlansap_extend_to_acs_range(tHalHandle hal, uint8_t *startChannelNum,
3292 uint8_t *endChannelNum, uint8_t *bandStartChannel,
3293 uint8_t *bandEndChannel)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003294{
3295#define ACS_WLAN_20M_CH_INC 4
3296#define ACS_2G_EXTEND ACS_WLAN_20M_CH_INC
3297#define ACS_5G_EXTEND (ACS_WLAN_20M_CH_INC * 3)
3298
3299 uint8_t tmp_startChannelNum = 0, tmp_endChannelNum = 0;
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07003300 tpAniSirGlobal mac_ctx;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003301
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07003302 mac_ctx = PMAC_STRUCT(hal);
3303 if (!mac_ctx) {
3304 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
3305 "%s: Invalid mac_ctx", __func__);
3306 return;
3307 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003308 if (*startChannelNum <= 14 && *endChannelNum <= 14) {
Amar Singhalb8d4f152016-02-10 10:21:43 -08003309 *bandStartChannel = CHAN_ENUM_1;
3310 *bandEndChannel = CHAN_ENUM_14;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003311 tmp_startChannelNum = *startChannelNum > 5 ?
3312 (*startChannelNum - ACS_2G_EXTEND) : 1;
3313 tmp_endChannelNum = (*endChannelNum + ACS_2G_EXTEND) <= 14 ?
3314 (*endChannelNum + ACS_2G_EXTEND) : 14;
3315 } else if (*startChannelNum >= 36 && *endChannelNum >= 36) {
Amar Singhalb8d4f152016-02-10 10:21:43 -08003316 *bandStartChannel = CHAN_ENUM_36;
3317 *bandEndChannel = CHAN_ENUM_165;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003318 tmp_startChannelNum = (*startChannelNum - ACS_5G_EXTEND) > 36 ?
3319 (*startChannelNum - ACS_5G_EXTEND) : 36;
3320 tmp_endChannelNum = (*endChannelNum + ACS_5G_EXTEND) <= 165 ?
3321 (*endChannelNum + ACS_5G_EXTEND) : 165;
3322 } else {
Amar Singhalb8d4f152016-02-10 10:21:43 -08003323 *bandStartChannel = CHAN_ENUM_1;
3324 *bandEndChannel = CHAN_ENUM_165;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003325 tmp_startChannelNum = *startChannelNum > 5 ?
3326 (*startChannelNum - ACS_2G_EXTEND) : 1;
3327 tmp_endChannelNum = (*endChannelNum + ACS_5G_EXTEND) <= 165 ?
3328 (*endChannelNum + ACS_5G_EXTEND) : 165;
3329 }
3330
3331 /* Note if the ACS range include only DFS channels, do not cross range
3332 * Active scanning in adjacent non DFS channels results in transmission
3333 * spikes in DFS specturm channels which is due to emission spill.
3334 * Remove the active channels from extend ACS range for DFS only range
3335 */
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07003336 if (wlan_reg_is_dfs_ch(mac_ctx->pdev, *startChannelNum)) {
3337 while (!wlan_reg_is_dfs_ch(mac_ctx->pdev,
3338 tmp_startChannelNum) &&
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003339 tmp_startChannelNum < *startChannelNum)
3340 tmp_startChannelNum += ACS_WLAN_20M_CH_INC;
3341
3342 *startChannelNum = tmp_startChannelNum;
3343 }
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07003344 if (wlan_reg_is_dfs_ch(mac_ctx->pdev, *endChannelNum)) {
3345 while (!wlan_reg_is_dfs_ch(mac_ctx->pdev,
3346 tmp_endChannelNum) &&
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003347 tmp_endChannelNum > *endChannelNum)
3348 tmp_endChannelNum -= ACS_WLAN_20M_CH_INC;
3349
3350 *endChannelNum = tmp_endChannelNum;
3351 }
3352}
3353
Kapil Gupta8878ad92017-02-13 11:56:04 +05303354QDF_STATUS wlan_sap_set_vendor_acs(void *ctx, bool is_vendor_acs)
3355{
3356 ptSapContext sap_context = (ptSapContext) ctx;
3357
3358 if (!sap_context) {
3359 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
3360 "%s: Invalid SAP pointer", __func__);
3361 return QDF_STATUS_E_FAULT;
3362 }
3363 sap_context->vendor_acs_enabled = is_vendor_acs;
3364
3365 return QDF_STATUS_SUCCESS;
3366}
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05303367/**
3368 * wlansap_get_dfs_nol() - Get the DFS NOL
3369 * @pSapCtx: SAP context
3370 * @nol: Pointer to the NOL
3371 * @nol_len: Length of the NOL
3372 *
3373 * Provides the DFS NOL
3374 *
3375 * Return: QDF_STATUS
3376 */
3377QDF_STATUS wlansap_get_dfs_nol(void *pSapCtx, uint8_t *nol, uint32_t *nol_len)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003378{
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05303379 int i = 0, j = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003380 ptSapContext sapContext = (ptSapContext) pSapCtx;
3381 void *hHal = NULL;
3382 tpAniSirGlobal pMac = NULL;
3383 uint64_t current_time, found_time, elapsed_time;
3384 unsigned long left_time;
3385 tSapDfsNolInfo *dfs_nol = NULL;
3386 bool bAvailable = false;
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05303387 *nol_len = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003388
3389 if (NULL == sapContext) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303390 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003391 "%s: Invalid SAP pointer from p_cds_gctx", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303392 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003393 }
3394 hHal = CDS_GET_HAL_CB(sapContext->p_cds_gctx);
3395 if (NULL == hHal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303396 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003397 "%s: Invalid HAL pointer from p_cds_gctx", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303398 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003399 }
3400 pMac = PMAC_STRUCT(hHal);
3401
3402 if (!pMac->sap.SapDfsInfo.numCurrentRegDomainDfsChannels) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303403 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003404 "%s: DFS NOL is empty", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303405 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003406 }
3407
3408 dfs_nol = pMac->sap.SapDfsInfo.sapDfsChannelNolList;
3409
3410 if (!dfs_nol) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303411 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003412 "%s: DFS NOL context is null", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303413 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003414 }
3415
3416 for (i = 0; i < pMac->sap.SapDfsInfo.numCurrentRegDomainDfsChannels;
3417 i++) {
3418 if (!dfs_nol[i].dfs_channel_number)
3419 continue;
3420
3421 current_time = cds_get_monotonic_boottime();
3422 found_time = dfs_nol[i].radar_found_timestamp;
3423
3424 elapsed_time = current_time - found_time;
3425
3426 /* check if channel is available
3427 * if either channel is usable or available, or timer expired 30mins
3428 */
3429 bAvailable =
3430 ((dfs_nol[i].radar_status_flag ==
3431 eSAP_DFS_CHANNEL_AVAILABLE)
3432 || (dfs_nol[i].radar_status_flag ==
3433 eSAP_DFS_CHANNEL_USABLE)
3434 || (elapsed_time >= SAP_DFS_NON_OCCUPANCY_PERIOD));
3435
3436 if (bAvailable) {
3437 dfs_nol[i].radar_status_flag =
3438 eSAP_DFS_CHANNEL_AVAILABLE;
3439 dfs_nol[i].radar_found_timestamp = 0;
3440
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303441 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003442 "%s: Channel[%d] is AVAILABLE",
3443 __func__, dfs_nol[i].dfs_channel_number);
3444 } else {
3445
3446 /* the time left in min */
3447 left_time = SAP_DFS_NON_OCCUPANCY_PERIOD - elapsed_time;
3448 left_time = left_time / (60 * 1000 * 1000);
3449
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05303450 nol[j++] = dfs_nol[i].dfs_channel_number;
3451 (*nol_len)++;
3452
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303453 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003454 "%s: Channel[%d] is UNAVAILABLE [%lu min left]",
3455 __func__,
3456 dfs_nol[i].dfs_channel_number, left_time);
3457 }
3458 }
3459
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303460 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003461}
3462
Arif Hussaincd151632017-02-11 16:57:19 -08003463QDF_STATUS wlansap_set_dfs_nol(void *psap_ctx, eSapDfsNolType conf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003464{
Arif Hussaincd151632017-02-11 16:57:19 -08003465 ptSapContext sap_ctx = (ptSapContext) psap_ctx;
3466 void *hal = NULL;
3467 tpAniSirGlobal mac = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003468
Arif Hussaincd151632017-02-11 16:57:19 -08003469 if (!sap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303470 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003471 "%s: Invalid SAP pointer from p_cds_gctx", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303472 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003473 }
Arif Hussaincd151632017-02-11 16:57:19 -08003474
3475 hal = CDS_GET_HAL_CB(sap_ctx->p_cds_gctx);
3476 if (!hal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303477 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003478 "%s: Invalid HAL pointer from p_cds_gctx", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303479 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003480 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003481
Arif Hussaincd151632017-02-11 16:57:19 -08003482 mac = PMAC_STRUCT(hal);
3483 if (!mac->sap.SapDfsInfo.numCurrentRegDomainDfsChannels) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303484 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003485 "%s: DFS NOL is empty", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303486 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003487 }
3488
3489 if (conf == eSAP_DFS_NOL_CLEAR) {
Arif Hussaincd151632017-02-11 16:57:19 -08003490 struct wlan_objmgr_pdev *pdev;
3491
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303492 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003493 "%s: clear the DFS NOL", __func__);
3494
Arif Hussaincd151632017-02-11 16:57:19 -08003495 pdev = mac->pdev;
3496 if (!pdev) {
3497 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
3498 "%s: null pdev", __func__);
3499 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003500 }
Arif Hussaincd151632017-02-11 16:57:19 -08003501 dfs_clear_nol_channels(pdev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003502 } else if (conf == eSAP_DFS_NOL_RANDOMIZE) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303503 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003504 "%s: Randomize the DFS NOL", __func__);
3505
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003506 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303507 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003508 "%s: unsupport type %d", __func__, conf);
3509 }
3510
3511 /* set DFS-NOL back to keep it update-to-date in CNSS */
Arif Hussaincd151632017-02-11 16:57:19 -08003512 sap_signal_hdd_event(sap_ctx, NULL, eSAP_DFS_NOL_SET,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003513 (void *) eSAP_STATUS_SUCCESS);
3514
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303515 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003516}
3517
3518/**
3519 * wlansap_populate_del_sta_params() - populate delete station parameter
3520 * @mac: Pointer to peer mac address.
3521 * @reason_code: Reason code for the disassoc/deauth.
3522 * @subtype: Subtype points to either disassoc/deauth frame.
3523 * @pDelStaParams: Address where parameters to be populated.
3524 *
3525 * This API is used to populate delete station parameter structure
3526 *
3527 * Return: none
3528 */
3529
3530void wlansap_populate_del_sta_params(const uint8_t *mac,
3531 uint16_t reason_code,
3532 uint8_t subtype,
3533 struct tagCsrDelStaParams *pDelStaParams)
3534{
3535 if (NULL == mac)
Anurag Chouhanc5548422016-02-24 18:33:27 +05303536 qdf_set_macaddr_broadcast(&pDelStaParams->peerMacAddr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003537 else
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303538 qdf_mem_copy(pDelStaParams->peerMacAddr.bytes, mac,
Anurag Chouhan6d760662016-02-20 16:05:43 +05303539 QDF_MAC_ADDR_SIZE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003540
3541 if (reason_code == 0)
3542 pDelStaParams->reason_code = eSIR_MAC_DEAUTH_LEAVING_BSS_REASON;
3543 else
3544 pDelStaParams->reason_code = reason_code;
3545
3546 if (subtype == (SIR_MAC_MGMT_DEAUTH >> 4) ||
3547 subtype == (SIR_MAC_MGMT_DISASSOC >> 4))
3548 pDelStaParams->subtype = subtype;
3549 else
3550 pDelStaParams->subtype = (SIR_MAC_MGMT_DEAUTH >> 4);
3551
Srinivas Girigowda678586c2017-03-10 00:13:58 -08003552 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003553 FL(
3554 "Delete STA with RC:%hu subtype:%hhu MAC::"
3555 MAC_ADDRESS_STR),
3556 pDelStaParams->reason_code, pDelStaParams->subtype,
3557 MAC_ADDR_ARRAY(pDelStaParams->peerMacAddr.bytes));
3558}
3559
3560/**
3561 * wlansap_acs_chselect() - Initiates acs channel selection
3562 * @pvos_gctx: Pointer to vos global context structure
3563 * @pacs_event_callback: Callback function in hdd called by sap
3564 * to inform hdd about channel section result
3565 * @pconfig: Pointer to configuration structure
3566 * passed down from hdd
3567 * @pusr_context: Parameter that will be passed back in all
3568 * the sap callback events.
3569 *
3570 * This function serves as an api for hdd to initiate acs scan pre
3571 * start bss.
3572 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303573 * Return: The QDF_STATUS code associated with performing the operation.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003574 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303575QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003576wlansap_acs_chselect(void *pvos_gctx,
3577 tpWLAN_SAPEventCB pacs_event_callback,
3578 tsap_Config_t *pconfig,
3579 void *pusr_context)
3580{
3581 ptSapContext sap_context = NULL;
3582 tHalHandle h_hal = NULL;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303583 QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003584 tpAniSirGlobal pmac = NULL;
3585
3586 sap_context = CDS_GET_SAP_CB(pvos_gctx);
3587 if (NULL == sap_context) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303588 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003589 "%s: Invalid SAP pointer from pvos_gctx", __func__);
3590
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303591 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003592 }
3593
3594 h_hal = (tHalHandle)CDS_GET_HAL_CB(sap_context->p_cds_gctx);
3595 if (NULL == h_hal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303596 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003597 "%s: Invalid MAC context from pvosGCtx", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303598 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003599 }
3600
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003601 pmac = PMAC_STRUCT(h_hal);
3602 sap_context->acs_cfg = &pconfig->acs_cfg;
3603 sap_context->ch_width_orig = pconfig->acs_cfg.ch_width;
3604 sap_context->csr_roamProfile.phyMode = pconfig->acs_cfg.hw_mode;
3605
Peng Xu66162de2016-02-11 17:01:20 -08003606 /*
3607 * Now, configure the scan and ACS channel params
3608 * to issue a scan request.
3609 */
3610 wlansap_set_scan_acs_channel_params(pconfig, sap_context,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003611 pusr_context);
3612
Peng Xu66162de2016-02-11 17:01:20 -08003613 /*
3614 * Copy the HDD callback function to report the
3615 * ACS result after scan in SAP context callback function.
3616 */
3617 sap_context->pfnSapEventCallback = pacs_event_callback;
3618 /*
3619 * init dfs channel nol
3620 */
3621 sap_init_dfs_channel_nol_list(sap_context);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003622
Peng Xu66162de2016-02-11 17:01:20 -08003623 /*
3624 * Issue the scan request. This scan request is
3625 * issued before the start BSS is done so
3626 *
3627 * 1. No need to pass the second parameter
3628 * as the SAP state machine is not started yet
3629 * and there is no need for any event posting.
3630 *
3631 * 2. Set third parameter to TRUE to indicate the
3632 * channel selection function to register a
3633 * different scan callback fucntion to process
3634 * the results pre start BSS.
3635 */
Manishekar Chandrasekaran1db3abe2016-06-24 03:27:07 +05303636 qdf_status = sap_goto_channel_sel(sap_context, NULL, true, false);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003637
Peng Xu66162de2016-02-11 17:01:20 -08003638 if (QDF_STATUS_E_ABORTED == qdf_status) {
3639 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003640 "In %s,DFS not supported in the current operating mode",
3641 __func__);
Peng Xu66162de2016-02-11 17:01:20 -08003642 return QDF_STATUS_E_FAILURE;
3643 } else if (QDF_STATUS_E_CANCELED == qdf_status) {
3644 /*
3645 * ERROR is returned when either the SME scan request
3646 * failed or ACS is overridden due to other constrainst
3647 * So send selected channel to HDD
3648 */
3649 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
3650 FL("Scan Req Failed/ACS Overridden"));
3651 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
3652 FL("Selected channel = %d"),
3653 sap_context->channel);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003654
Peng Xu66162de2016-02-11 17:01:20 -08003655 return sap_signal_hdd_event(sap_context, NULL,
3656 eSAP_ACS_CHANNEL_SELECTED,
3657 (void *) eSAP_STATUS_SUCCESS);
3658 } else if (QDF_STATUS_SUCCESS == qdf_status) {
3659 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003660 FL("Successfully Issued a Pre Start Bss Scan Request"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003661 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303662 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003663}
3664
3665/**
3666 * wlan_sap_enable_phy_error_logs() - Enable DFS phy error logs
3667 * @hal: global hal handle
3668 * @enable_log: value to set
3669 *
3670 * Since the frequency of DFS phy error is very high, enabling logs for them
3671 * all the times can cause crash and will also create lot of useless logs
3672 * causing difficulties in debugging other issue. This function will be called
3673 * from iwpriv cmd to eanble such logs temporarily.
3674 *
3675 * Return: void
3676 */
3677void wlan_sap_enable_phy_error_logs(tHalHandle hal, bool enable_log)
3678{
3679 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
3680 mac_ctx->sap.enable_dfs_phy_error_logs = enable_log;
3681}
Kai Liubdd5fcb2016-09-28 22:55:44 +08003682
Kai Liubdd5fcb2016-09-28 22:55:44 +08003683/**
3684 * wlansap_get_chan_width() - get sap channel width.
3685 * @cds_ctx: pointer of global cds context
3686 *
3687 * This function get channel width of sap.
3688 *
3689 * Return: sap channel width
3690 */
3691uint32_t wlansap_get_chan_width(void *cds_ctx)
3692{
3693 ptSapContext sapcontext;
3694
3695 sapcontext = CDS_GET_SAP_CB(cds_ctx);
3696 return wlan_sap_get_vht_ch_width(sapcontext);
3697}
Yingying Tangb4832f72016-10-20 13:44:55 +08003698
3699/**
3700 * wlansap_set_tx_leakage_threshold() - set sap tx leakage threshold.
3701 * @hal: HAL pointer
3702 * @tx_leakage_threshold: sap tx leakage threshold
3703 *
3704 * This function set sap tx leakage threshold.
3705 *
3706 * Return: QDF_STATUS.
3707 */
3708QDF_STATUS wlansap_set_tx_leakage_threshold(tHalHandle hal,
3709 uint16_t tx_leakage_threshold)
3710{
3711 tpAniSirGlobal mac;
3712
3713 if (NULL == hal) {
3714 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
3715 "%s: Invalid hal pointer", __func__);
3716 return QDF_STATUS_E_FAULT;
3717 }
3718
3719 mac = PMAC_STRUCT(hal);
3720 mac->sap.SapDfsInfo.tx_leakage_threshold = tx_leakage_threshold;
3721 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
3722 "%s: leakage_threshold %d", __func__,
3723 mac->sap.SapDfsInfo.tx_leakage_threshold);
3724 return QDF_STATUS_SUCCESS;
3725}
Wu Gao36717432016-11-21 15:09:48 +08003726
3727/*
3728 * wlansap_set_invalid_session() - set session ID to invalid
3729 * @cds_ctx: pointer of global context
3730 *
3731 * This function sets session ID to invalid
3732 *
3733 * Return: QDF_STATUS
3734 */
3735QDF_STATUS
3736wlansap_set_invalid_session(void *cds_ctx)
3737{
3738 ptSapContext psapctx;
3739
3740 psapctx = CDS_GET_SAP_CB(cds_ctx);
3741 if (NULL == psapctx) {
3742 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
3743 FL("Invalid SAP pointer from pctx"));
3744 return QDF_STATUS_E_FAILURE;
3745 }
3746
3747 psapctx->sessionId = CSR_SESSION_ID_INVALID;
Wu Gao36717432016-11-21 15:09:48 +08003748
3749 return QDF_STATUS_SUCCESS;
3750}