blob: 66e1f48473a41df1f7e07727425dd16f5b5a6092 [file] [log] [blame]
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001/*
Jingxiang Ge4168a232018-01-03 18:47:15 +08002 * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003 *
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004 * Permission to use, copy, modify, and/or distribute this software for
5 * any purpose with or without fee is hereby granted, provided that the
6 * above copyright notice and this permission notice appear in all
7 * copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
10 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
11 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
12 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
13 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
14 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
15 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16 * PERFORMANCE OF THIS SOFTWARE.
17 */
18
19/*
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080020 * This file lim_process_sme_req_messages.cc contains the code
21 * for processing SME request messages.
22 * Author: Chandra Modumudi
23 * Date: 02/11/02
24 * History:-
25 * Date Modified by Modification Information
26 * --------------------------------------------------------------------
27 *
28 */
29
30#include "cds_api.h"
31#include "wni_api.h"
32#include "wni_cfg.h"
33#include "cfg_api.h"
34#include "sir_api.h"
35#include "sch_api.h"
36#include "utils_api.h"
37#include "lim_types.h"
38#include "lim_utils.h"
39#include "lim_assoc_utils.h"
40#include "lim_security_utils.h"
41#include "lim_ser_des_utils.h"
42#include "lim_sme_req_utils.h"
43#include "lim_ibss_peer_mgmt.h"
44#include "lim_admit_control.h"
45#include "dph_hash_table.h"
46#include "lim_send_messages.h"
47#include "lim_api.h"
48#include "wmm_apsd.h"
49#include "sir_mac_prot_def.h"
Krishna Kumaar Natarajanf599c6e2015-11-03 11:44:03 -080050#include "rrm_api.h"
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070051#include "nan_datapath.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080052#include "sap_api.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080053#include <lim_ft.h>
Naveen Rawat3b6068c2016-04-14 19:01:06 -070054#include "cds_regdomain.h"
Sridhar Selvaraj8c6f5e82017-08-21 14:53:46 +053055#include "lim_process_fils.h"
Naveen Rawat08db88f2017-09-08 15:07:48 -070056#include "wlan_utility.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080057
58/*
59 * This overhead is time for sending NOA start to host in case of GO/sending
60 * NULL data & receiving ACK in case of P2P Client and starting actual scanning
61 * with init scan req/rsp plus in case of concurrency, taking care of sending
62 * null data and receiving ACK to/from AP/Also SetChannel with calibration
63 * is taking around 7ms .
64 */
65#define SCAN_MESSAGING_OVERHEAD 20 /* in msecs */
66#define JOIN_NOA_DURATION 2000 /* in msecs */
67#define OEM_DATA_NOA_DURATION 60 /* in msecs */
68#define DEFAULT_PASSIVE_MAX_CHANNEL_TIME 110 /* in msecs */
69
70#define CONV_MS_TO_US 1024 /* conversion factor from ms to us */
71
Paul Zhangd2315472017-02-22 10:02:50 +080072#define BEACON_INTERVAL_THRESHOLD 50 /* in msecs */
73#define STA_BURST_SCAN_DURATION 120 /* in msecs */
74
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080075/* SME REQ processing function templates */
Jeff Johnson83d6c112018-12-02 13:05:00 -080076static bool __lim_process_sme_sys_ready_ind(struct mac_context *, uint32_t *);
77static bool __lim_process_sme_start_bss_req(struct mac_context *,
Rajeev Kumarfeb96382017-01-22 19:42:09 -080078 struct scheduler_msg *pMsg);
Jeff Johnson83d6c112018-12-02 13:05:00 -080079static void __lim_process_sme_join_req(struct mac_context *, uint32_t *);
80static void __lim_process_sme_reassoc_req(struct mac_context *, uint32_t *);
81static void __lim_process_sme_disassoc_req(struct mac_context *, uint32_t *);
82static void __lim_process_sme_disassoc_cnf(struct mac_context *, uint32_t *);
83static void __lim_process_sme_deauth_req(struct mac_context *, uint32_t *);
84static void __lim_process_sme_set_context_req(struct mac_context *, uint32_t *);
85static bool __lim_process_sme_stop_bss_req(struct mac_context *,
Rajeev Kumarfeb96382017-01-22 19:42:09 -080086 struct scheduler_msg *pMsg);
Jeff Johnson83d6c112018-12-02 13:05:00 -080087static void __lim_process_send_disassoc_frame(struct mac_context *mac_ctx,
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053088 uint32_t *msg_buf);
Jeff Johnson83d6c112018-12-02 13:05:00 -080089static void lim_process_sme_channel_change_request(struct mac_context *mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080090 uint32_t *pMsg);
Jeff Johnson83d6c112018-12-02 13:05:00 -080091static void lim_process_sme_start_beacon_req(struct mac_context *mac, uint32_t *pMsg);
92static void lim_process_sme_dfs_csa_ie_request(struct mac_context *mac, uint32_t *pMsg);
93static void lim_process_nss_update_request(struct mac_context *mac, uint32_t *pMsg);
94static void lim_process_set_ie_req(struct mac_context *mac, uint32_t *pMsg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080095
Jeff Johnson83d6c112018-12-02 13:05:00 -080096static void lim_start_bss_update_add_ie_buffer(struct mac_context *mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080097 uint8_t **pDstData_buff,
98 uint16_t *pDstDataLen,
99 uint8_t *pSrcData_buff,
100 uint16_t srcDataLen);
101
Jeff Johnson83d6c112018-12-02 13:05:00 -0800102static void lim_update_add_ie_buffer(struct mac_context *mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800103 uint8_t **pDstData_buff,
104 uint16_t *pDstDataLen,
105 uint8_t *pSrcData_buff, uint16_t srcDataLen);
Jeff Johnson83d6c112018-12-02 13:05:00 -0800106static bool lim_update_ibss_prop_add_ies(struct mac_context *mac,
Rajeev Kumar8e3e2832015-11-06 16:02:54 -0800107 uint8_t **pDstData_buff,
108 uint16_t *pDstDataLen,
109 tSirModifyIE *pModifyIE);
Jeff Johnson83d6c112018-12-02 13:05:00 -0800110static void lim_process_modify_add_ies(struct mac_context *mac, uint32_t *pMsg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800111
Jeff Johnson83d6c112018-12-02 13:05:00 -0800112static void lim_process_update_add_ies(struct mac_context *mac, uint32_t *pMsg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800113
Jeff Johnson83d6c112018-12-02 13:05:00 -0800114static void lim_process_ext_change_channel(struct mac_context *mac_ctx,
Abhishek Singh518323d2015-10-19 17:42:01 +0530115 uint32_t *msg);
116
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800117/**
118 * lim_process_set_hw_mode() - Send set HW mode command to WMA
119 * @mac: Globacl MAC pointer
120 * @msg: Message containing the hw mode index
121 *
122 * Send the set HW mode command to WMA
123 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530124 * Return: QDF_STATUS_SUCCESS if message posting is successful
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800125 */
Jeff Johnson83d6c112018-12-02 13:05:00 -0800126static QDF_STATUS lim_process_set_hw_mode(struct mac_context *mac, uint32_t *msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800127{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530128 QDF_STATUS status = QDF_STATUS_SUCCESS;
Rajeev Kumar37d478b2017-04-17 16:59:28 -0700129 struct scheduler_msg message = {0};
Tushnim Bhattacharyya66348bd2017-03-09 15:02:10 -0800130 struct policy_mgr_hw_mode *req_msg;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800131 uint32_t len;
132 struct s_sir_set_hw_mode *buf;
Rajeev Kumar37d478b2017-04-17 16:59:28 -0700133 struct scheduler_msg resp_msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800134 struct sir_set_hw_mode_resp *param;
135
136 buf = (struct s_sir_set_hw_mode *) msg;
137 if (!buf) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -0700138 pe_err("Set HW mode param is NULL");
Abhishek Singhd93a0b22018-10-30 17:04:56 +0530139 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800140 /* To free the active command list */
141 goto fail;
142 }
143
144 len = sizeof(*req_msg);
145
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530146 req_msg = qdf_mem_malloc(len);
Abhishek Singhd93a0b22018-10-30 17:04:56 +0530147 if (!req_msg) {
148 pe_debug("failed to allocate memory");
149 status = QDF_STATUS_E_NOMEM;
150 goto fail;
151 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800152
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800153 req_msg->hw_mode_index = buf->set_hw.hw_mode_index;
Chandrasekaran, Manishekaref70c0d2015-10-20 19:54:55 +0530154 req_msg->reason = buf->set_hw.reason;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800155 /* Other parameters are not needed for WMA */
156
Rajeev Kumarf7d84422017-01-21 15:45:44 -0800157 message.bodyptr = req_msg;
158 message.type = SIR_HAL_PDEV_SET_HW_MODE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800159
Srinivas Girigowda15b355e2017-03-26 21:51:00 -0700160 pe_debug("Posting SIR_HAL_SOC_SET_HW_MOD to WMA");
gaurank kathpalia3a7f25b2018-08-28 16:26:39 +0530161 status = scheduler_post_message(QDF_MODULE_ID_PE,
162 QDF_MODULE_ID_WMA,
163 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530164 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -0700165 pe_err("scheduler_post_msg failed!(err=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800166 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530167 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800168 goto fail;
169 }
170 return status;
171fail:
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530172 param = qdf_mem_malloc(sizeof(*param));
Arif Hussainf5b6c412018-10-10 19:41:09 -0700173 if (!param)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530174 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800175 param->status = SET_HW_MODE_STATUS_ECANCELED;
176 param->cfgd_hw_mode_index = 0;
177 param->num_vdev_mac_entries = 0;
178 resp_msg.type = eWNI_SME_SET_HW_MODE_RESP;
179 resp_msg.bodyptr = param;
180 resp_msg.bodyval = 0;
181 lim_sys_process_mmh_msg_api(mac, &resp_msg, ePROT);
Abhishek Singhd93a0b22018-10-30 17:04:56 +0530182 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800183}
184
185/**
186 * lim_process_set_dual_mac_cfg_req() - Set dual mac config command to WMA
187 * @mac: Global MAC pointer
188 * @msg: Message containing the dual mac config parameter
189 *
190 * Send the set dual mac config command to WMA
191 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530192 * Return: QDF_STATUS_SUCCESS if message posting is successful
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800193 */
Jeff Johnson83d6c112018-12-02 13:05:00 -0800194static QDF_STATUS lim_process_set_dual_mac_cfg_req(struct mac_context *mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800195 uint32_t *msg)
196{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530197 QDF_STATUS status = QDF_STATUS_SUCCESS;
Rajeev Kumar37d478b2017-04-17 16:59:28 -0700198 struct scheduler_msg message = {0};
Srinivas Girigowdaeb6ecf32018-02-15 17:04:22 -0800199 struct policy_mgr_dual_mac_config *req_msg;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800200 uint32_t len;
201 struct sir_set_dual_mac_cfg *buf;
Rajeev Kumar37d478b2017-04-17 16:59:28 -0700202 struct scheduler_msg resp_msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800203 struct sir_dual_mac_config_resp *param;
204
205 buf = (struct sir_set_dual_mac_cfg *) msg;
206 if (!buf) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -0700207 pe_err("Set Dual mac config is NULL");
Abhishek Singhd93a0b22018-10-30 17:04:56 +0530208 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800209 /* To free the active command list */
210 goto fail;
211 }
212
213 len = sizeof(*req_msg);
214
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530215 req_msg = qdf_mem_malloc(len);
Abhishek Singhd93a0b22018-10-30 17:04:56 +0530216 if (!req_msg) {
217 pe_debug("failed to allocate memory");
218 status = QDF_STATUS_E_NOMEM;
219 goto fail;
220 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800221
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800222 req_msg->scan_config = buf->set_dual_mac.scan_config;
223 req_msg->fw_mode_config = buf->set_dual_mac.fw_mode_config;
224 /* Other parameters are not needed for WMA */
225
Rajeev Kumarf7d84422017-01-21 15:45:44 -0800226 message.bodyptr = req_msg;
227 message.type = SIR_HAL_PDEV_DUAL_MAC_CFG_REQ;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800228
Srinivas Girigowda15b355e2017-03-26 21:51:00 -0700229 pe_debug("Post SIR_HAL_PDEV_DUAL_MAC_CFG_REQ to WMA: %x %x",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800230 req_msg->scan_config, req_msg->fw_mode_config);
gaurank kathpalia3a7f25b2018-08-28 16:26:39 +0530231 status = scheduler_post_message(QDF_MODULE_ID_PE,
232 QDF_MODULE_ID_WMA,
233 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530234 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -0700235 pe_err("scheduler_post_msg failed!(err=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800236 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530237 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800238 goto fail;
239 }
240 return status;
241fail:
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530242 param = qdf_mem_malloc(sizeof(*param));
Arif Hussainf5b6c412018-10-10 19:41:09 -0700243 if (!param)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530244 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800245 param->status = SET_HW_MODE_STATUS_ECANCELED;
246 resp_msg.type = eWNI_SME_SET_DUAL_MAC_CFG_RESP;
247 resp_msg.bodyptr = param;
248 resp_msg.bodyval = 0;
249 lim_sys_process_mmh_msg_api(mac, &resp_msg, ePROT);
Abhishek Singhd93a0b22018-10-30 17:04:56 +0530250 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800251}
252
253/**
Archana Ramachandrana20ef812015-11-13 16:12:13 -0800254 * lim_process_set_antenna_mode_req() - Set antenna mode command
255 * to WMA
256 * @mac: Global MAC pointer
257 * @msg: Message containing the antenna mode parameter
258 *
259 * Send the set antenna mode command to WMA
260 *
261 * Return: QDF_STATUS_SUCCESS if message posting is successful
262 */
Jeff Johnson83d6c112018-12-02 13:05:00 -0800263static QDF_STATUS lim_process_set_antenna_mode_req(struct mac_context *mac,
Archana Ramachandrana20ef812015-11-13 16:12:13 -0800264 uint32_t *msg)
265{
266 QDF_STATUS status = QDF_STATUS_SUCCESS;
Rajeev Kumar37d478b2017-04-17 16:59:28 -0700267 struct scheduler_msg message = {0};
Archana Ramachandrana20ef812015-11-13 16:12:13 -0800268 struct sir_antenna_mode_param *req_msg;
269 struct sir_set_antenna_mode *buf;
Rajeev Kumar37d478b2017-04-17 16:59:28 -0700270 struct scheduler_msg resp_msg = {0};
Archana Ramachandrana20ef812015-11-13 16:12:13 -0800271 struct sir_antenna_mode_resp *param;
272
273 buf = (struct sir_set_antenna_mode *) msg;
274 if (!buf) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -0700275 pe_err("Set antenna mode is NULL");
Abhishek Singhd93a0b22018-10-30 17:04:56 +0530276 status = QDF_STATUS_E_INVAL;
Archana Ramachandrana20ef812015-11-13 16:12:13 -0800277 /* To free the active command list */
278 goto fail;
279 }
280
281 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Abhishek Singhd93a0b22018-10-30 17:04:56 +0530282 if (!req_msg) {
283 pe_debug("failed to allocate memory");
284 status = QDF_STATUS_E_NOMEM;
285 goto fail;
286 }
Archana Ramachandrana20ef812015-11-13 16:12:13 -0800287
288 req_msg->num_rx_chains = buf->set_antenna_mode.num_rx_chains;
289 req_msg->num_tx_chains = buf->set_antenna_mode.num_tx_chains;
290
Rajeev Kumarf7d84422017-01-21 15:45:44 -0800291 message.bodyptr = req_msg;
292 message.type = SIR_HAL_SOC_ANTENNA_MODE_REQ;
Archana Ramachandrana20ef812015-11-13 16:12:13 -0800293
Srinivas Girigowda15b355e2017-03-26 21:51:00 -0700294 pe_debug("Post SIR_HAL_SOC_ANTENNA_MODE_REQ to WMA: %d %d",
Archana Ramachandrana20ef812015-11-13 16:12:13 -0800295 req_msg->num_rx_chains,
296 req_msg->num_tx_chains);
gaurank kathpalia3a7f25b2018-08-28 16:26:39 +0530297 status = scheduler_post_message(QDF_MODULE_ID_PE,
298 QDF_MODULE_ID_WMA,
299 QDF_MODULE_ID_WMA, &message);
Archana Ramachandrana20ef812015-11-13 16:12:13 -0800300 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -0700301 pe_err("scheduler_post_msg failed!(err=%d)",
Archana Ramachandrana20ef812015-11-13 16:12:13 -0800302 status);
303 qdf_mem_free(req_msg);
304 goto fail;
305 }
306 return status;
307fail:
308 param = qdf_mem_malloc(sizeof(*param));
Arif Hussainf5b6c412018-10-10 19:41:09 -0700309 if (!param)
Archana Ramachandrana20ef812015-11-13 16:12:13 -0800310 return QDF_STATUS_E_NOMEM;
Archana Ramachandrana20ef812015-11-13 16:12:13 -0800311 param->status = SET_ANTENNA_MODE_STATUS_ECANCELED;
312 resp_msg.type = eWNI_SME_SET_ANTENNA_MODE_RESP;
313 resp_msg.bodyptr = param;
314 resp_msg.bodyval = 0;
315 lim_sys_process_mmh_msg_api(mac, &resp_msg, ePROT);
Abhishek Singhd93a0b22018-10-30 17:04:56 +0530316 return status;
Archana Ramachandrana20ef812015-11-13 16:12:13 -0800317}
318
319/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800320 * __lim_is_sme_assoc_cnf_valid()
321 *
322 ***FUNCTION:
323 * This function is called by __lim_process_sme_assoc_cnf_new() upon
324 * receiving SME_ASSOC_CNF.
325 *
326 ***LOGIC:
327 * Message validity checks are performed in this function
328 *
329 ***ASSUMPTIONS:
330 *
331 ***NOTE:
332 *
333 * @param pMeasReq Pointer to Received ASSOC_CNF message
334 * @return true When received SME_ASSOC_CNF is formatted
335 * correctly
336 * false otherwise
337 */
338
339static inline uint8_t __lim_is_sme_assoc_cnf_valid(tpSirSmeAssocCnf pAssocCnf)
340{
Anurag Chouhanc5548422016-02-24 18:33:27 +0530341 if (qdf_is_macaddr_group(&pAssocCnf->peer_macaddr))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800342 return false;
343 else
344 return true;
345} /*** end __lim_is_sme_assoc_cnf_valid() ***/
346
347/**
348 * __lim_get_sme_join_req_size_for_alloc()
349 *
350 ***FUNCTION:
351 * This function is called in various places to get IE length
352 * from tSirBssDescription structure
353 * number being scanned.
354 *
355 ***PARAMS:
356 *
357 ***LOGIC:
358 *
359 ***ASSUMPTIONS:
360 * NA
361 *
362 ***NOTE:
363 * NA
364 *
365 * @param pBssDescr
366 * @return Total IE length
367 */
368
369static uint16_t __lim_get_sme_join_req_size_for_alloc(uint8_t *pBuf)
370{
371 uint16_t len = 0;
372
373 if (!pBuf)
374 return len;
375
376 pBuf += sizeof(uint16_t);
377 len = lim_get_u16(pBuf);
Arif Hussainc9651922017-04-16 14:08:23 -0700378 return len;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800379}
380
381/**
382 * __lim_is_defered_msg_for_learn() - message handling in SME learn state
Jeff Johnsonb3b2de22018-11-21 21:19:01 -0800383 * @mac: Global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800384 * @pMsg: Pointer to message posted from SME to LIM.
385 *
386 * Has role only if 11h is enabled. Not used on STA side.
387 * Defers the message if SME is in learn state and brings
388 * the LIM back to normal mode.
389 *
390 * Return: true - If defered false - Otherwise
391 */
392
Jeff Johnson83d6c112018-12-02 13:05:00 -0800393static bool __lim_is_defered_msg_for_learn(struct mac_context *mac,
Rajeev Kumarfeb96382017-01-22 19:42:09 -0800394 struct scheduler_msg *pMsg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800395{
Jeff Johnsonb3b2de22018-11-21 21:19:01 -0800396 if (lim_is_system_in_scan_state(mac)) {
397 if (lim_defer_msg(mac, pMsg) != TX_SUCCESS) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -0700398 pe_err("Could not defer Msg: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800399 return false;
400 }
Srinivas Girigowda15b355e2017-03-26 21:51:00 -0700401 pe_debug("Defer the message, in learn mode type: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800402 pMsg->type);
403 return true;
404 }
405 return false;
406}
407
408/**
409 * __lim_is_defered_msg_for_radar() - Defers the message if radar is detected
410 * @mac_ctx: Pointer to Global MAC structure
411 * @message: Pointer to message posted from SME to LIM.
412 *
413 * Has role only if 11h is enabled. Not used on STA side.
414 * Defers the message if radar is detected.
415 *
416 * Return: true, if defered otherwise return false.
417 */
418static bool
Jeff Johnson83d6c112018-12-02 13:05:00 -0800419__lim_is_defered_msg_for_radar(struct mac_context *mac_ctx,
Rajeev Kumarfeb96382017-01-22 19:42:09 -0800420 struct scheduler_msg *message)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800421{
422 /*
423 * fRadarDetCurOperChan will be set only if we
424 * detect radar in current operating channel and
425 * System Role == AP ROLE
426 *
427 * TODO: Need to take care radar detection.
428 *
429 * if (LIM_IS_RADAR_DETECTED(mac_ctx))
430 */
431 if (0) {
432 if (lim_defer_msg(mac_ctx, message) != TX_SUCCESS) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -0700433 pe_err("Could not defer Msg: %d", message->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800434 return false;
435 }
Srinivas Girigowda15b355e2017-03-26 21:51:00 -0700436 pe_debug("Defer the message, in learn mode type: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800437 message->type);
438 return true;
439 }
440 return false;
441}
442
443/**
444 * __lim_process_sme_sys_ready_ind () - Process ready indication from WMA
Jeff Johnsonb3b2de22018-11-21 21:19:01 -0800445 * @mac: Global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800446 * @pMsgBuf: Message from WMA
447 *
448 * handles the notification from HDD. PE just forwards this message to HAL.
449 *
450 * Return: true-Posting to HAL failed, so PE will consume the buffer.
451 * false-Posting to HAL successful, so HAL will consume the buffer.
452 */
453
Jeff Johnson83d6c112018-12-02 13:05:00 -0800454static bool __lim_process_sme_sys_ready_ind(struct mac_context *mac, uint32_t *pMsgBuf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800455{
Rajeev Kumar37d478b2017-04-17 16:59:28 -0700456 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800457 tSirSmeReadyReq *ready_req = (tSirSmeReadyReq *) pMsgBuf;
458
459 msg.type = WMA_SYS_READY_IND;
460 msg.reserved = 0;
461 msg.bodyptr = pMsgBuf;
462 msg.bodyval = 0;
463
Jeff Johnsonb3b2de22018-11-21 21:19:01 -0800464 if (ANI_DRIVER_TYPE(mac) != QDF_DRIVER_TYPE_MFG) {
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -0800465 ready_req->pe_roam_synch_cb = pe_roam_synch_callback;
Jeff Johnsonb3b2de22018-11-21 21:19:01 -0800466 pe_register_mgmt_rx_frm_callback(mac);
467 pe_register_callbacks_with_wma(mac, ready_req);
468 mac->lim.sme_msg_callback = ready_req->sme_msg_cb;
469 mac->lim.stop_roaming_callback = ready_req->stop_roaming_cb;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800470 }
Srinivas Girigowda15b355e2017-03-26 21:51:00 -0700471
472 pe_debug("sending WMA_SYS_READY_IND msg to HAL");
Jeff Johnsonb3b2de22018-11-21 21:19:01 -0800473 MTRACE(mac_trace_msg_tx(mac, NO_SESSION, msg.type));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800474
Jeff Johnsonb3b2de22018-11-21 21:19:01 -0800475 if (QDF_STATUS_SUCCESS != wma_post_ctrl_msg(mac, &msg)) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -0700476 pe_err("wma_post_ctrl_msg failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800477 return true;
478 }
479 return false;
480}
481
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800482/**
483 *lim_configure_ap_start_bss_session() - Configure the AP Start BSS in session.
484 *@mac_ctx: Pointer to Global MAC structure
485 *@session: A pointer to session entry
486 *@sme_start_bss_req: Start BSS Request from upper layers.
487 *
488 * This function is used to configure the start bss parameters
489 * in to the session.
490 *
491 * Return: None.
492 */
493static void
Jeff Johnson83d6c112018-12-02 13:05:00 -0800494lim_configure_ap_start_bss_session(struct mac_context *mac_ctx, struct pe_session *session,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800495 tpSirSmeStartBssReq sme_start_bss_req)
496{
497 session->limSystemRole = eLIM_AP_ROLE;
498 session->privacy = sme_start_bss_req->privacy;
499 session->fwdWPSPBCProbeReq = sme_start_bss_req->fwdWPSPBCProbeReq;
500 session->authType = sme_start_bss_req->authType;
501 /* Store the DTIM period */
502 session->dtimPeriod = (uint8_t) sme_start_bss_req->dtimPeriod;
503 /* Enable/disable UAPSD */
504 session->apUapsdEnable = sme_start_bss_req->apUapsdEnable;
Anurag Chouhan6d760662016-02-20 16:05:43 +0530505 if (session->pePersona == QDF_P2P_GO_MODE) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800506 session->proxyProbeRspEn = 0;
507 } else {
508 /*
509 * To detect PBC overlap in SAP WPS mode,
510 * Host handles Probe Requests.
511 */
512 if (SAP_WPS_DISABLED == sme_start_bss_req->wps_state)
513 session->proxyProbeRspEn = 1;
514 else
515 session->proxyProbeRspEn = 0;
516 }
517 session->ssidHidden = sme_start_bss_req->ssidHidden;
518 session->wps_state = sme_start_bss_req->wps_state;
519 session->sap_dot11mc = sme_start_bss_req->sap_dot11mc;
Kapil Gupta4b2efbb2016-10-03 13:07:20 +0530520 session->vendor_vht_sap =
521 sme_start_bss_req->vendor_vht_sap;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800522 lim_get_short_slot_from_phy_mode(mac_ctx, session, session->gLimPhyMode,
523 &session->shortSlotTimeSupported);
524 session->isCoalesingInIBSSAllowed =
525 sme_start_bss_req->isCoalesingInIBSSAllowed;
526
Jiachao Wu712d4fd2017-08-23 16:52:34 +0800527 session->beacon_tx_rate = sme_start_bss_req->beacon_tx_rate;
528
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800529}
530
531/**
Abhishek Singhdfa69c32018-08-30 15:39:34 +0530532 * lim_send_start_vdev_req() - send vdev start request
533 *@session: pe session
534 *@mlm_start_req: vdev start req
535 *
536 * Return: QDF_STATUS
537 */
Abhishek Singh3d30a3b2018-09-12 15:49:18 +0530538#ifdef CONFIG_VDEV_SM
539static QDF_STATUS
Jeff Johnson209dfa02018-11-18 22:54:38 -0800540lim_send_start_vdev_req(struct pe_session *session, tLimMlmStartReq *mlm_start_req)
Abhishek Singh3d30a3b2018-09-12 15:49:18 +0530541{
542 return wlan_vdev_mlme_sm_deliver_evt(session->vdev,
543 WLAN_VDEV_SM_EV_START,
544 sizeof(*mlm_start_req),
545 mlm_start_req);
546}
547#else
Abhishek Singhdfa69c32018-08-30 15:39:34 +0530548static QDF_STATUS
Jeff Johnson209dfa02018-11-18 22:54:38 -0800549lim_send_start_vdev_req(struct pe_session *session, tLimMlmStartReq *mlm_start_req)
Abhishek Singhdfa69c32018-08-30 15:39:34 +0530550{
551 lim_process_mlm_start_req(session->mac_ctx, mlm_start_req);
552
553 return QDF_STATUS_SUCCESS;
554}
Abhishek Singh3d30a3b2018-09-12 15:49:18 +0530555#endif
Abhishek Singhdfa69c32018-08-30 15:39:34 +0530556
557/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800558 * __lim_handle_sme_start_bss_request() - process SME_START_BSS_REQ message
559 *@mac_ctx: Pointer to Global MAC structure
560 *@msg_buf: A pointer to the SME message buffer
561 *
562 * This function is called to process SME_START_BSS_REQ message
563 * from HDD or upper layer application.
564 *
565 * Return: None
566 */
567static void
Jeff Johnson83d6c112018-12-02 13:05:00 -0800568__lim_handle_sme_start_bss_request(struct mac_context *mac_ctx, uint32_t *msg_buf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800569{
570 uint16_t size;
571 uint32_t val = 0;
Jeff Johnson0301ecb2018-06-29 09:36:23 -0700572 QDF_STATUS ret_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800573 tSirMacChanNum channel_number;
574 tLimMlmStartReq *mlm_start_req = NULL;
575 tpSirSmeStartBssReq sme_start_bss_req = NULL;
576 tSirResultCodes ret_code = eSIR_SME_SUCCESS;
577 /* Flag Used in case of IBSS to Auto generate BSSID. */
578 uint32_t auto_gen_bssid = false;
579 uint8_t session_id;
Jeff Johnson209dfa02018-11-18 22:54:38 -0800580 struct pe_session *session = NULL;
Krunal Sonib37bb352016-12-20 14:12:21 -0800581 uint8_t sme_session_id = 0xFF;
582 uint16_t sme_transaction_id = 0xFF;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800583 uint32_t chanwidth;
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -0700584 struct vdev_type_nss *vdev_type_nss;
Abhishek Singhdfa69c32018-08-30 15:39:34 +0530585 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800586
587/* FEATURE_WLAN_DIAG_SUPPORT */
588#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM
589 /*
590 * Since the session is not created yet, sending NULL.
591 * The response should have the correct state.
592 */
593 lim_diag_event_report(mac_ctx, WLAN_PE_DIAG_START_BSS_REQ_EVENT,
594 NULL, 0, 0);
595#endif /* FEATURE_WLAN_DIAG_SUPPORT */
596
Srinivas Girigowda15b355e2017-03-26 21:51:00 -0700597 pe_debug("Received START_BSS_REQ");
Krunal Sonib37bb352016-12-20 14:12:21 -0800598 size = sizeof(tSirSmeStartBssReq);
599 sme_start_bss_req = qdf_mem_malloc(size);
Arif Hussainf5b6c412018-10-10 19:41:09 -0700600 if (!sme_start_bss_req) {
Krunal Sonib37bb352016-12-20 14:12:21 -0800601 ret_code = eSIR_SME_RESOURCES_UNAVAILABLE;
602 goto free;
603 }
604 qdf_mem_copy(sme_start_bss_req, msg_buf, sizeof(tSirSmeStartBssReq));
605 sme_session_id = sme_start_bss_req->sessionId;
606 sme_transaction_id = sme_start_bss_req->transactionId;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800607
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800608 if ((mac_ctx->lim.gLimSmeState == eLIM_SME_OFFLINE_STATE) ||
609 (mac_ctx->lim.gLimSmeState == eLIM_SME_IDLE_STATE)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800610 if (!lim_is_sme_start_bss_req_valid(mac_ctx,
611 sme_start_bss_req)) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -0700612 pe_warn("Received invalid eWNI_SME_START_BSS_REQ");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800613 ret_code = eSIR_SME_INVALID_PARAMETERS;
614 goto free;
615 }
616
617 /*
618 * This is the place where PE is going to create a session.
619 * If session is not existed, then create a new session
620 */
621 session = pe_find_session_by_bssid(mac_ctx,
Srinivas Girigowdad8af4a62015-11-18 16:51:16 -0800622 sme_start_bss_req->bssid.bytes, &session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800623 if (session != NULL) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -0700624 pe_warn("Session Already exists for given BSSID");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800625 ret_code = eSIR_SME_BSS_ALREADY_STARTED_OR_JOINED;
626 session = NULL;
627 goto free;
628 } else {
629 session = pe_create_session(mac_ctx,
Srinivas Girigowdad8af4a62015-11-18 16:51:16 -0800630 sme_start_bss_req->bssid.bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800631 &session_id, mac_ctx->lim.maxStation,
Rajeev Kumar Sirasanagandlae3b59912018-08-24 15:53:31 +0530632 sme_start_bss_req->bssType,
633 sme_start_bss_req->sessionId);
634 if (!session) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -0700635 pe_warn("Session Can not be created");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800636 ret_code = eSIR_SME_RESOURCES_UNAVAILABLE;
637 goto free;
638 }
Vignesh Viswanathanb3dbbc82018-04-06 00:06:27 +0530639
640 /* Update the beacon/probe filter in mac_ctx */
641 lim_set_bcn_probe_filter(mac_ctx, session,
642 &sme_start_bss_req->ssId,
643 sme_start_bss_req->channelId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800644 }
645
Deepak Dhamdheree2dd5442016-05-27 15:05:51 -0700646 if (QDF_NDI_MODE != sme_start_bss_req->bssPersona) {
647 /* Probe resp add ie */
648 lim_start_bss_update_add_ie_buffer(mac_ctx,
649 &session->addIeParams.probeRespData_buff,
650 &session->addIeParams.probeRespDataLen,
651 sme_start_bss_req->addIeParams.
652 probeRespData_buff,
653 sme_start_bss_req->addIeParams.
654 probeRespDataLen);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800655
Deepak Dhamdheree2dd5442016-05-27 15:05:51 -0700656 /* Probe Beacon add ie */
657 lim_start_bss_update_add_ie_buffer(mac_ctx,
658 &session->addIeParams.probeRespBCNData_buff,
659 &session->addIeParams.probeRespBCNDataLen,
660 sme_start_bss_req->addIeParams.
661 probeRespBCNData_buff,
662 sme_start_bss_req->addIeParams.
663 probeRespBCNDataLen);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800664
Deepak Dhamdheree2dd5442016-05-27 15:05:51 -0700665 /* Assoc resp IE */
666 lim_start_bss_update_add_ie_buffer(mac_ctx,
667 &session->addIeParams.assocRespData_buff,
668 &session->addIeParams.assocRespDataLen,
669 sme_start_bss_req->addIeParams.
670 assocRespData_buff,
671 sme_start_bss_req->addIeParams.
672 assocRespDataLen);
673 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800674 /* Store the session related params in newly created session */
675 session->pLimStartBssReq = sme_start_bss_req;
676
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800677 session->transactionId = sme_start_bss_req->transactionId;
678
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530679 qdf_mem_copy(&(session->htConfig),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800680 &(sme_start_bss_req->htConfig),
681 sizeof(session->htConfig));
682
Sandeep Puligilla98917432016-06-10 13:50:28 -0700683 qdf_mem_copy(&(session->vht_config),
684 &(sme_start_bss_req->vht_config),
685 sizeof(session->vht_config));
686
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800687 sir_copy_mac_addr(session->selfMacAddr,
Srinivas Girigowdad8af4a62015-11-18 16:51:16 -0800688 sme_start_bss_req->self_macaddr.bytes);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800689
690 /* Copy SSID to session table */
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530691 qdf_mem_copy((uint8_t *) &session->ssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800692 (uint8_t *) &sme_start_bss_req->ssId,
693 (sme_start_bss_req->ssId.length + 1));
694
695 session->bssType = sme_start_bss_req->bssType;
696
697 session->nwType = sme_start_bss_req->nwType;
698
699 session->beaconParams.beaconInterval =
700 sme_start_bss_req->beaconInterval;
701
702 /* Store the channel number in session Table */
703 session->currentOperChannel =
704 sme_start_bss_req->channelId;
705
706 /* Store Persona */
707 session->pePersona = sme_start_bss_req->bssPersona;
Abhishek Singh4294f802017-08-10 16:37:07 +0530708 QDF_TRACE(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800709 FL("PE PERSONA=%d"), session->pePersona);
710
711 /* Update the phymode */
712 session->gLimPhyMode = sme_start_bss_req->nwType;
713
714 session->maxTxPower =
715 cfg_get_regulatory_max_transmit_power(mac_ctx,
716 session->currentOperChannel);
717 /* Store the dot 11 mode in to the session Table */
718 session->dot11mode = sme_start_bss_req->dot11mode;
719#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
720 session->cc_switch_mode =
721 sme_start_bss_req->cc_switch_mode;
722#endif
723 session->htCapability =
724 IS_DOT11_MODE_HT(session->dot11mode);
725 session->vhtCapability =
726 IS_DOT11_MODE_VHT(session->dot11mode);
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -0800727
Srinivas Girigowda28fb0122017-03-26 22:21:20 -0700728 pe_debug("HT[%d], VHT[%d]",
Krishna Kumaar Natarajan0103ef82017-02-17 18:15:56 -0800729 session->htCapability, session->vhtCapability);
730
731 if (IS_DOT11_MODE_HE(session->dot11mode)) {
732 lim_update_session_he_capable(mac_ctx, session);
733 lim_copy_bss_he_cap(session, sme_start_bss_req);
734 }
735
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800736 session->txLdpcIniFeatureEnabled =
737 sme_start_bss_req->txLdpcIniFeatureEnabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800738#ifdef WLAN_FEATURE_11W
739 session->limRmfEnabled =
740 sme_start_bss_req->pmfCapable ? 1 : 0;
Srinivas Girigowda15b355e2017-03-26 21:51:00 -0700741 pe_debug("Session RMF enabled: %d", session->limRmfEnabled);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800742#endif
743
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530744 qdf_mem_copy((void *)&session->rateSet,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800745 (void *)&sme_start_bss_req->operationalRateSet,
746 sizeof(tSirMacRateSet));
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530747 qdf_mem_copy((void *)&session->extRateSet,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800748 (void *)&sme_start_bss_req->extendedRateSet,
749 sizeof(tSirMacRateSet));
750
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -0700751 if (IS_5G_CH(session->currentOperChannel))
752 vdev_type_nss = &mac_ctx->vdev_type_nss_5g;
753 else
754 vdev_type_nss = &mac_ctx->vdev_type_nss_2g;
755
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800756 switch (sme_start_bss_req->bssType) {
757 case eSIR_INFRA_AP_MODE:
758 lim_configure_ap_start_bss_session(mac_ctx, session,
759 sme_start_bss_req);
Krunal Soni53993f72016-07-08 18:20:03 -0700760 if (session->pePersona == QDF_SAP_MODE)
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -0700761 session->vdev_nss = vdev_type_nss->sap;
Krunal Soni53993f72016-07-08 18:20:03 -0700762 else
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -0700763 session->vdev_nss = vdev_type_nss->p2p_go;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800764 break;
765 case eSIR_IBSS_MODE:
766 session->limSystemRole = eLIM_STA_IN_IBSS_ROLE;
767 lim_get_short_slot_from_phy_mode(mac_ctx, session,
768 session->gLimPhyMode,
769 &session->shortSlotTimeSupported);
770
771 /*
772 * initialize to "OPEN".
773 * will be updated upon key installation
774 */
775 session->encryptType = eSIR_ED_NONE;
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -0700776 session->vdev_nss = vdev_type_nss->ibss;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800777
778 break;
Deepak Dhamdheree2dd5442016-05-27 15:05:51 -0700779 case eSIR_NDI_MODE:
780 session->limSystemRole = eLIM_NDI_ROLE;
781 break;
782
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800783
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800784 /*
785 * There is one more mode called auto mode.
786 * which is used no where
787 */
788
789 /* FORBUILD -TEMPFIX.. HOW TO use AUTO MODE????? */
790
791 default:
792 /* not used anywhere...used in scan function */
793 break;
794 }
795
Srinivas Girigowda15b355e2017-03-26 21:51:00 -0700796 pe_debug("persona - %d, nss - %d",
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -0700797 session->pePersona, session->vdev_nss);
798 session->nss = session->vdev_nss;
Abhinav Kumarb074f2f2018-09-15 15:32:11 +0530799 if (!mac_ctx->mlme_cfg->vht_caps.vht_cap_info.enable2x2)
Kiran Kumar Lokerebc6fb2f2018-05-09 19:04:11 -0700800 session->nss = 1;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800801 /*
Rajeev Kumarc9a50e72016-04-15 15:18:42 -0700802 * Allocate memory for the array of
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800803 * parsed (Re)Assoc request structure
804 */
Rajeev Kumarc9a50e72016-04-15 15:18:42 -0700805 if (sme_start_bss_req->bssType == eSIR_INFRA_AP_MODE) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800806 session->parsedAssocReq =
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530807 qdf_mem_malloc(session->dph.dphHashTable.
Rajeev Kumarc9a50e72016-04-15 15:18:42 -0700808 size * sizeof(tpSirAssocReq));
Arif Hussainf5b6c412018-10-10 19:41:09 -0700809 if (!session->parsedAssocReq) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800810 ret_code = eSIR_SME_RESOURCES_UNAVAILABLE;
811 goto free;
812 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800813 }
814
Deepak Dhamdheree2dd5442016-05-27 15:05:51 -0700815 if (!sme_start_bss_req->channelId &&
816 sme_start_bss_req->bssType != eSIR_NDI_MODE) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -0700817 pe_err("Received invalid eWNI_SME_START_BSS_REQ");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800818 ret_code = eSIR_SME_INVALID_PARAMETERS;
819 goto free;
820 }
821 channel_number = sme_start_bss_req->channelId;
822#ifdef QCA_HT_2040_COEX
823 if (sme_start_bss_req->obssEnabled)
824 session->htSupportedChannelWidthSet =
825 session->htCapability;
826 else
827#endif
828 session->htSupportedChannelWidthSet =
829 (sme_start_bss_req->sec_ch_offset) ? 1 : 0;
830 session->htSecondaryChannelOffset =
831 sme_start_bss_req->sec_ch_offset;
832 session->htRecommendedTxWidthSet =
833 (session->htSecondaryChannelOffset) ? 1 : 0;
Abhishek Singh4294f802017-08-10 16:37:07 +0530834 QDF_TRACE(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800835 FL("cbMode %u"), sme_start_bss_req->cbMode);
Krishna Kumaar Natarajan0103ef82017-02-17 18:15:56 -0800836 if (lim_is_session_he_capable(session) ||
837 session->vhtCapability || session->htCapability) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800838 chanwidth = sme_start_bss_req->vht_channel_width;
Srinivas Girigowda15b355e2017-03-26 21:51:00 -0700839 pe_debug("vht_channel_width %u htSupportedChannelWidthSet %d",
Sandeep Puligillafade9b72016-02-01 12:41:54 -0800840 sme_start_bss_req->vht_channel_width,
841 session->htSupportedChannelWidthSet);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800842 session->ch_width = chanwidth;
843 if (session->htSupportedChannelWidthSet) {
844 session->ch_center_freq_seg0 =
845 sme_start_bss_req->center_freq_seg0;
846 session->ch_center_freq_seg1 =
847 sme_start_bss_req->center_freq_seg1;
848 } else {
849 session->ch_center_freq_seg0 = 0;
850 session->ch_center_freq_seg1 = 0;
851 }
852 }
Gaurank Kathpalia511634b2018-10-23 03:41:16 -0700853
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800854 if (session->vhtCapability &&
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -0800855 (session->ch_width > CH_WIDTH_80MHZ)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800856 session->nss = 1;
Srinivas Girigowda15b355e2017-03-26 21:51:00 -0700857 pe_debug("nss set to [%d]", session->nss);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800858 }
Srinivas Girigowda15b355e2017-03-26 21:51:00 -0700859 pe_debug("vht su tx bformer %d",
Krunal Soni53993f72016-07-08 18:20:03 -0700860 session->vht_config.su_beam_former);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800861
862 /* Delete pre-auth list if any */
863 lim_delete_pre_auth_list(mac_ctx);
864
865 /*
866 * keep the RSN/WPA IE information in PE Session Entry
867 * later will be using this to check when received (Re)Assoc req
868 */
869 lim_set_rs_nie_wp_aiefrom_sme_start_bss_req_message(mac_ctx,
870 &sme_start_bss_req->rsnIE, session);
871
Deepak Dhamdheree2dd5442016-05-27 15:05:51 -0700872 if (LIM_IS_AP_ROLE(session) ||
873 LIM_IS_IBSS_ROLE(session) ||
874 LIM_IS_NDI_ROLE(session)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800875 session->gLimProtectionControl =
876 sme_start_bss_req->protEnabled;
877 /*
878 * each byte will have the following info
879 * bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
880 * reserved reserved RIFS Lsig n-GF ht20 11g 11b
881 */
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530882 qdf_mem_copy((void *)&session->cfgProtection,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800883 (void *)&sme_start_bss_req->ht_capab,
884 sizeof(uint16_t));
885 /* Initialize WPS PBC session link list */
886 session->pAPWPSPBCSession = NULL;
887 }
888 /* Prepare and Issue LIM_MLM_START_REQ to MLM */
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530889 mlm_start_req = qdf_mem_malloc(sizeof(tLimMlmStartReq));
Arif Hussainf5b6c412018-10-10 19:41:09 -0700890 if (!mlm_start_req) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800891 ret_code = eSIR_SME_RESOURCES_UNAVAILABLE;
892 goto free;
893 }
894
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800895 /* Copy SSID to the MLM start structure */
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530896 qdf_mem_copy((uint8_t *) &mlm_start_req->ssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800897 (uint8_t *) &sme_start_bss_req->ssId,
898 sme_start_bss_req->ssId.length + 1);
899 mlm_start_req->ssidHidden = sme_start_bss_req->ssidHidden;
900 mlm_start_req->obssProtEnabled =
901 sme_start_bss_req->obssProtEnabled;
902
903 mlm_start_req->bssType = session->bssType;
904
905 /* Fill PE session Id from the session Table */
906 mlm_start_req->sessionId = session->peSessionId;
907
Deepak Dhamdheree2dd5442016-05-27 15:05:51 -0700908 if (mlm_start_req->bssType == eSIR_INFRA_AP_MODE ||
909 mlm_start_req->bssType == eSIR_NDI_MODE) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800910 /*
911 * Copy the BSSId from sessionTable to
912 * mlmStartReq struct
913 */
914 sir_copy_mac_addr(mlm_start_req->bssId, session->bssId);
915 } else {
916 /* ibss mode */
917 mac_ctx->lim.gLimIbssCoalescingHappened = false;
918
919 ret_status = wlan_cfg_get_int(mac_ctx,
920 WNI_CFG_IBSS_AUTO_BSSID,
921 &auto_gen_bssid);
Jeff Johnson0301ecb2018-06-29 09:36:23 -0700922 if (ret_status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -0700923 pe_err("Get Auto Gen BSSID fail,Status: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800924 ret_status);
Abhishek Singh4294f802017-08-10 16:37:07 +0530925 ret_code = eSIR_LOGE_EXCEPTION;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800926 goto free;
927 }
928
929 if (!auto_gen_bssid) {
930 /*
931 * We're not auto generating BSSID.
932 * Instead, get it from session entry
933 */
934 sir_copy_mac_addr(mlm_start_req->bssId,
935 session->bssId);
936 /*
937 * Start IBSS group BSSID
938 * Auto Generating BSSID.
939 */
940 auto_gen_bssid = ((mlm_start_req->bssId[0] &
941 0x01) ? true : false);
942 }
943
944 if (auto_gen_bssid) {
945 /*
946 * if BSSID is not any uc id.
947 * then use locally generated BSSID.
948 * Autogenerate the BSSID
949 */
950 lim_get_random_bssid(mac_ctx,
951 mlm_start_req->bssId);
952 mlm_start_req->bssId[0] = 0x02;
953
954 /*
955 * Copy randomly generated BSSID
956 * to the session Table
957 */
958 sir_copy_mac_addr(session->bssId,
959 mlm_start_req->bssId);
960 }
961 }
962 /* store the channel num in mlmstart req structure */
963 mlm_start_req->channelNumber = session->currentOperChannel;
964 mlm_start_req->cbMode = sme_start_bss_req->cbMode;
965 mlm_start_req->beaconPeriod =
966 session->beaconParams.beaconInterval;
Arif Hussain671a1902017-03-17 09:08:32 -0700967 mlm_start_req->cac_duration_ms =
968 sme_start_bss_req->cac_duration_ms;
969 mlm_start_req->dfs_regdomain =
970 sme_start_bss_req->dfs_regdomain;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800971 if (LIM_IS_AP_ROLE(session)) {
972 mlm_start_req->dtimPeriod = session->dtimPeriod;
973 mlm_start_req->wps_state = session->wps_state;
974
975 } else {
Bala Venkatesh2fde2c62018-09-11 20:33:24 +0530976 val = mac_ctx->mlme_cfg->sap_cfg.dtim_interval;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800977 mlm_start_req->dtimPeriod = (uint8_t) val;
978 }
979
Karthik Kantamneni22dd0f62018-08-07 14:53:50 +0530980 mlm_start_req->cfParamSet.cfpPeriod =
981 mac_ctx->mlme_cfg->rates.cfp_period;
982 mlm_start_req->cfParamSet.cfpMaxDuration =
983 mac_ctx->mlme_cfg->rates.cfp_max_duration;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800984
985 /*
986 * this may not be needed anymore now,
987 * as rateSet is now included in the
988 * session entry and MLM has session context.
989 */
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530990 qdf_mem_copy((void *)&mlm_start_req->rateSet,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800991 (void *)&session->rateSet,
992 sizeof(tSirMacRateSet));
993
994 /* Now populate the 11n related parameters */
995 mlm_start_req->nwType = session->nwType;
996 mlm_start_req->htCapable = session->htCapability;
997
998 mlm_start_req->htOperMode = mac_ctx->lim.gHTOperMode;
999 /* Unused */
1000 mlm_start_req->dualCTSProtection =
1001 mac_ctx->lim.gHTDualCTSProtection;
1002 mlm_start_req->txChannelWidthSet =
1003 session->htRecommendedTxWidthSet;
1004
1005 session->limRFBand = lim_get_rf_band(channel_number);
1006
1007 /* Initialize 11h Enable Flag */
1008 session->lim11hEnable = 0;
gaolez76d2a162017-03-21 19:23:58 +08001009 if (mlm_start_req->bssType != eSIR_IBSS_MODE &&
1010 (CHAN_HOP_ALL_BANDS_ENABLE ||
Varun Reddy Yeturua48bc412017-11-17 15:33:35 -08001011 BAND_5G == session->limRFBand)) {
Abhinav Kumard4d6eb72018-12-04 20:30:37 +05301012 session->lim11hEnable =
1013 mac_ctx->mlme_cfg->gen.enabled_11h;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001014
1015 if (session->lim11hEnable &&
1016 (eSIR_INFRA_AP_MODE ==
1017 mlm_start_req->bssType)) {
Arif Hussain88d1fdd2018-09-26 16:12:24 -07001018 session->lim11hEnable =
1019 mac_ctx->mlme_cfg->
1020 dfs_cfg.dfs_master_capable;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001021 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001022 }
1023
1024 if (!session->lim11hEnable) {
1025 if (cfg_set_int(mac_ctx,
1026 WNI_CFG_LOCAL_POWER_CONSTRAINT, 0) !=
Jeff Johnson0301ecb2018-06-29 09:36:23 -07001027 QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001028 /*
1029 * Failed to set the CFG param
1030 * WNI_CFG_LOCAL_POWER_CONSTRAINT
1031 */
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07001032 pe_err("Set LOCAL_POWER_CONSTRAINT failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001033 }
1034
Jiachao Wu712d4fd2017-08-23 16:52:34 +08001035 mlm_start_req->beacon_tx_rate = session->beacon_tx_rate;
1036
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001037 session->limPrevSmeState = session->limSmeState;
1038 session->limSmeState = eLIM_SME_WT_START_BSS_STATE;
1039 MTRACE(mac_trace
1040 (mac_ctx, TRACE_CODE_SME_STATE,
1041 session->peSessionId,
1042 session->limSmeState));
1043
Abhishek Singhdfa69c32018-08-30 15:39:34 +05301044 qdf_status = lim_send_start_vdev_req(session, mlm_start_req);
1045 if (QDF_IS_STATUS_ERROR(qdf_status))
1046 goto free;
Rajeev Kumar Sirasanagandla2f17f8d2018-10-03 17:24:20 +05301047 qdf_mem_free(mlm_start_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001048 return;
1049 } else {
1050
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07001051 pe_err("Received unexpected START_BSS_REQ, in state %X",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001052 mac_ctx->lim.gLimSmeState);
1053 ret_code = eSIR_SME_BSS_ALREADY_STARTED_OR_JOINED;
Krunal Sonib37bb352016-12-20 14:12:21 -08001054 goto free;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001055 } /* if (mac_ctx->lim.gLimSmeState == eLIM_SME_OFFLINE_STATE) */
1056
1057free:
1058 if ((session != NULL) &&
Krunal Sonib37bb352016-12-20 14:12:21 -08001059 (session->pLimStartBssReq == sme_start_bss_req)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001060 session->pLimStartBssReq = NULL;
1061 }
Krunal Sonib37bb352016-12-20 14:12:21 -08001062 if (NULL != sme_start_bss_req)
1063 qdf_mem_free(sme_start_bss_req);
1064 if (NULL != mlm_start_req)
1065 qdf_mem_free(mlm_start_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001066 if (NULL != session) {
1067 pe_delete_session(mac_ctx, session);
1068 session = NULL;
1069 }
1070 lim_send_sme_start_bss_rsp(mac_ctx, eWNI_SME_START_BSS_RSP, ret_code,
1071 session, sme_session_id, sme_transaction_id);
1072}
1073
1074/**
1075 * __lim_process_sme_start_bss_req() - Call handler to start BSS
1076 *
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08001077 * @mac: Global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001078 * @pMsg: Message pointer
1079 *
1080 * Wrapper for the function __lim_handle_sme_start_bss_request
1081 * This message will be defered until softmac come out of
1082 * scan mode or if we have detected radar on the current
1083 * operating channel.
1084 *
1085 * return true - If we consumed the buffer
1086 * false - If have defered the message.
1087 */
Jeff Johnson83d6c112018-12-02 13:05:00 -08001088static bool __lim_process_sme_start_bss_req(struct mac_context *mac,
Rajeev Kumarfeb96382017-01-22 19:42:09 -08001089 struct scheduler_msg *pMsg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001090{
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08001091 if (__lim_is_defered_msg_for_learn(mac, pMsg) ||
1092 __lim_is_defered_msg_for_radar(mac, pMsg)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001093 /**
1094 * If message defered, buffer is not consumed yet.
1095 * So return false
1096 */
1097 return false;
1098 }
1099
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08001100 __lim_handle_sme_start_bss_request(mac, (uint32_t *) pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001101 return true;
1102}
1103
1104/**
1105 * lim_get_random_bssid()
1106 *
1107 * FUNCTION:This function is called to process generate the random number for bssid
1108 * This function is called to process SME_SCAN_REQ message
1109 * from HDD or upper layer application.
1110 *
1111 * LOGIC:
1112 *
1113 * ASSUMPTIONS:
1114 *
1115 * NOTE:
1116 * 1. geneartes the unique random number for bssid in ibss
1117 *
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08001118 * @param mac Pointer to Global MAC structure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001119 * @param *data Pointer to bssid buffer
1120 * @return None
1121 */
Jeff Johnson83d6c112018-12-02 13:05:00 -08001122void lim_get_random_bssid(struct mac_context *mac, uint8_t *data)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001123{
1124 uint32_t random[2];
Srinivas Girigowda4d65ebe2017-10-13 21:41:42 -07001125
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001126 random[0] = tx_time_get();
1127 random[0] |= (random[0] << 15);
1128 random[1] = random[0] >> 1;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301129 qdf_mem_copy(data, (uint8_t *) random, sizeof(tSirMacAddr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001130}
1131
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001132/**
1133 * __lim_process_clear_dfs_channel_list()
1134 *
1135 ***FUNCTION:
Jeff Johnsonc00ae5b2018-05-06 16:06:35 -07001136 ***Clear DFS channel list when country is changed/acquired.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001137 .*This message is sent from SME.
1138 *
1139 ***LOGIC:
1140 *
1141 ***ASSUMPTIONS:
1142 *
1143 ***NOTE:
1144 *
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08001145 * @param mac Pointer to Global MAC structure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001146 * @param *pMsgBuf A pointer to the SME message buffer
1147 * @return None
1148 */
Jeff Johnson83d6c112018-12-02 13:05:00 -08001149static void __lim_process_clear_dfs_channel_list(struct mac_context *mac,
Rajeev Kumarfeb96382017-01-22 19:42:09 -08001150 struct scheduler_msg *pMsg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001151{
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08001152 qdf_mem_set(&mac->lim.dfschannelList, sizeof(tSirDFSChannelList), 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001153}
1154
Padma, Santhosh Kumarb8f65d92017-09-14 13:05:42 +05301155#ifdef WLAN_FEATURE_SAE
1156
1157/**
1158 * lim_update_sae_config()- This API update SAE session info to csr config
1159 * from join request.
1160 * @session: PE session
1161 * @sme_join_req: pointer to join request
1162 *
1163 * Return: None
1164 */
Jeff Johnson209dfa02018-11-18 22:54:38 -08001165static void lim_update_sae_config(struct pe_session *session,
Padma, Santhosh Kumarb8f65d92017-09-14 13:05:42 +05301166 tpSirSmeJoinReq sme_join_req)
1167{
1168 session->sae_pmk_cached = sme_join_req->sae_pmk_cached;
1169
1170 pe_debug("pmk_cached %d for BSSID=" MAC_ADDRESS_STR,
1171 session->sae_pmk_cached,
1172 MAC_ADDR_ARRAY(sme_join_req->bssDescription.bssId));
1173}
1174#else
Jeff Johnson209dfa02018-11-18 22:54:38 -08001175static inline void lim_update_sae_config(struct pe_session *session,
Padma, Santhosh Kumarb8f65d92017-09-14 13:05:42 +05301176 tpSirSmeJoinReq sme_join_req)
1177{}
1178#endif
1179
Sandeep Puligilla45e0c5e2018-09-21 00:38:23 -07001180/**
Jianmin Zhu09236602018-10-15 15:36:10 +08001181 * lim_send_join_req() - send vdev start request for assoc
Sandeep Puligilla45e0c5e2018-09-21 00:38:23 -07001182 *@session: pe session
1183 *@mlm_join_req: join req
1184 *
1185 * Return: QDF_STATUS
1186 */
1187
1188#ifdef CONFIG_VDEV_SM
Jeff Johnson209dfa02018-11-18 22:54:38 -08001189static QDF_STATUS lim_send_join_req(struct pe_session *session,
Sandeep Puligilla45e0c5e2018-09-21 00:38:23 -07001190 tLimMlmJoinReq *mlm_join_req)
1191{
Abhishek Singh254d5512018-10-30 12:17:05 +05301192 QDF_STATUS status;
1193
1194 status = mlme_set_assoc_type(session->vdev, VDEV_ASSOC);
1195 if (QDF_IS_STATUS_ERROR(status))
1196 return status;
1197
Sandeep Puligilla45e0c5e2018-09-21 00:38:23 -07001198 return wlan_vdev_mlme_sm_deliver_evt(session->vdev,
1199 WLAN_VDEV_SM_EV_START,
1200 sizeof(*mlm_join_req),
1201 mlm_join_req);
1202}
1203#else
Jeff Johnson209dfa02018-11-18 22:54:38 -08001204static QDF_STATUS lim_send_join_req(struct pe_session *session,
Sandeep Puligilla45e0c5e2018-09-21 00:38:23 -07001205 tLimMlmJoinReq *mlm_join_req)
1206{
1207 lim_process_mlm_join_req(session->mac_ctx, mlm_join_req);
1208
1209 return QDF_STATUS_SUCCESS;
1210}
1211#endif
1212
Jianmin Zhu09236602018-10-15 15:36:10 +08001213/**
1214 * lim_send_reassoc_req() - send vdev start request for reassoc
1215 *@session: pe session
1216 *@mlm_join_req: join req
1217 *
1218 * Return: QDF_STATUS
1219 */
1220
1221#ifdef CONFIG_VDEV_SM
Jeff Johnson209dfa02018-11-18 22:54:38 -08001222static QDF_STATUS lim_send_reassoc_req(struct pe_session *session,
Jianmin Zhu09236602018-10-15 15:36:10 +08001223 tLimMlmReassocReq *reassoc_req)
1224{
Abhishek Singh254d5512018-10-30 12:17:05 +05301225 QDF_STATUS status;
1226
1227 status = mlme_set_assoc_type(session->vdev, VDEV_REASSOC);
1228 if (QDF_IS_STATUS_ERROR(status))
1229 return status;
1230
Jianmin Zhu09236602018-10-15 15:36:10 +08001231 return wlan_vdev_mlme_sm_deliver_evt(session->vdev,
1232 WLAN_VDEV_SM_EV_START,
1233 sizeof(*reassoc_req),
1234 reassoc_req);
1235}
1236#else
Jeff Johnson209dfa02018-11-18 22:54:38 -08001237static QDF_STATUS lim_send_reassoc_req(struct pe_session *session,
Jianmin Zhu09236602018-10-15 15:36:10 +08001238 tLimMlmReassocReq *reassoc_req)
1239{
1240 lim_process_mlm_reassoc_req(session->mac_ctx, reassoc_req);
1241
1242 return QDF_STATUS_SUCCESS;
1243}
1244#endif
1245
1246/**
1247 * lim_send_ft_reassoc_req() - send vdev start request for ft_reassoc
1248 *@session: pe session
1249 *@mlm_join_req: join req
1250 *
1251 * Return: QDF_STATUS
1252 */
1253
1254#ifdef CONFIG_VDEV_SM
Jeff Johnson209dfa02018-11-18 22:54:38 -08001255static QDF_STATUS lim_send_ft_reassoc_req(struct pe_session *session,
Abhishek Singh254d5512018-10-30 12:17:05 +05301256 tLimMlmReassocReq *reassoc_req)
Jianmin Zhu09236602018-10-15 15:36:10 +08001257{
Abhishek Singh254d5512018-10-30 12:17:05 +05301258 QDF_STATUS status;
1259
1260 status = mlme_set_assoc_type(session->vdev, VDEV_FT_REASSOC);
1261 if (QDF_IS_STATUS_ERROR(status))
1262 return status;
1263
Jianmin Zhu09236602018-10-15 15:36:10 +08001264 return wlan_vdev_mlme_sm_deliver_evt(session->vdev,
1265 WLAN_VDEV_SM_EV_START,
Abhishek Singh254d5512018-10-30 12:17:05 +05301266 sizeof(*reassoc_req),
1267 reassoc_req);
Jianmin Zhu09236602018-10-15 15:36:10 +08001268}
1269#else
Jeff Johnson209dfa02018-11-18 22:54:38 -08001270static QDF_STATUS lim_send_ft_reassoc_req(struct pe_session *session,
Abhishek Singh254d5512018-10-30 12:17:05 +05301271 tLimMlmReassocReq *reassoc_req)
Jianmin Zhu09236602018-10-15 15:36:10 +08001272{
Abhishek Singh254d5512018-10-30 12:17:05 +05301273 lim_process_mlm_ft_reassoc_req(session->mac_ctx, reassoc_req);
Jianmin Zhu09236602018-10-15 15:36:10 +08001274
1275 return QDF_STATUS_SUCCESS;
1276}
1277#endif
Padma, Santhosh Kumarb8f65d92017-09-14 13:05:42 +05301278
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001279/**
1280 * __lim_process_sme_join_req() - process SME_JOIN_REQ message
1281 * @mac_ctx: Pointer to Global MAC structure
1282 * @msg_buf: A pointer to the SME message buffer
1283 *
1284 * This function is called to process SME_JOIN_REQ message
1285 * from HDD or upper layer application.
1286 *
1287 * Return: None
1288 */
1289static void
Jeff Johnson83d6c112018-12-02 13:05:00 -08001290__lim_process_sme_join_req(struct mac_context *mac_ctx, uint32_t *msg_buf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001291{
1292 tpSirSmeJoinReq sme_join_req = NULL;
1293 tLimMlmJoinReq *mlm_join_req;
1294 tSirResultCodes ret_code = eSIR_SME_SUCCESS;
1295 uint32_t val = 0;
1296 uint16_t n_size;
1297 uint8_t session_id;
Jeff Johnson209dfa02018-11-18 22:54:38 -08001298 struct pe_session *session = NULL;
Nitesh Shah0102cac2016-07-13 14:38:30 +05301299 uint8_t sme_session_id = 0;
1300 uint16_t sme_transaction_id = 0;
Amar Singhala297bfa2015-10-15 15:07:29 -07001301 int8_t local_power_constraint = 0, reg_max = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001302 uint16_t ie_len;
Naveen Rawat08db88f2017-09-08 15:07:48 -07001303 const uint8_t *vendor_ie;
Krunal Soni0acfdcd2016-03-09 12:03:06 -08001304 tSirBssDescription *bss_desc;
Abhishek Singh254d5512018-10-30 12:17:05 +05301305 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001306
Arif Hussain995fcaf2016-07-18 11:28:22 -07001307 if (!mac_ctx || !msg_buf) {
1308 QDF_TRACE(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_ERROR,
1309 FL("JOIN REQ with invalid data"));
1310 return;
1311 }
1312
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001313/* FEATURE_WLAN_DIAG_SUPPORT */
1314#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM
1315 /*
1316 * Not sending any session, since it is not created yet.
1317 * The response whould have correct state.
1318 */
1319 lim_diag_event_report(mac_ctx, WLAN_PE_DIAG_JOIN_REQ_EVENT, NULL, 0, 0);
1320#endif /* FEATURE_WLAN_DIAG_SUPPORT */
1321
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001322 /*
1323 * Expect Join request in idle state.
1324 * Reassociate request is expected in link established state.
1325 */
1326
1327 /* Global SME and LIM states are not defined yet for BT-AMP Support */
1328 if (mac_ctx->lim.gLimSmeState == eLIM_SME_IDLE_STATE) {
1329 n_size = __lim_get_sme_join_req_size_for_alloc((uint8_t *)
1330 msg_buf);
1331
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301332 sme_join_req = qdf_mem_malloc(n_size);
Arif Hussainf5b6c412018-10-10 19:41:09 -07001333 if (!sme_join_req) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001334 ret_code = eSIR_SME_RESOURCES_UNAVAILABLE;
Nitesh Shah0102cac2016-07-13 14:38:30 +05301335 goto end;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001336 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301337 (void)qdf_mem_copy((void *)sme_join_req, (void *)msg_buf,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001338 n_size);
1339
1340 if (!lim_is_sme_join_req_valid(mac_ctx, sme_join_req)) {
1341 /* Received invalid eWNI_SME_JOIN_REQ */
1342 /* Log the event */
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07001343 pe_warn("SessionId:%d JOIN REQ with invalid data",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001344 sme_join_req->sessionId);
1345 ret_code = eSIR_SME_INVALID_PARAMETERS;
1346 goto end;
1347 }
1348
Krishna Kumaar Natarajanf599c6e2015-11-03 11:44:03 -08001349 /*
1350 * Update the capability here itself as this is used in
1351 * lim_extract_ap_capability() below. If not updated issues
1352 * like not honoring power constraint on 1st association after
1353 * driver loading might occur.
1354 */
1355 lim_update_rrm_capability(mac_ctx, sme_join_req);
1356
Krunal Soni0acfdcd2016-03-09 12:03:06 -08001357 bss_desc = &sme_join_req->bssDescription;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001358 /* check for the existence of start BSS session */
Krunal Soni0acfdcd2016-03-09 12:03:06 -08001359 session = pe_find_session_by_bssid(mac_ctx, bss_desc->bssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001360 &session_id);
1361
1362 if (session != NULL) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07001363 pe_err("Session(%d) Already exists for BSSID: "
1364 MAC_ADDRESS_STR " in limSmeState = %X",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001365 session_id,
Krunal Soni0acfdcd2016-03-09 12:03:06 -08001366 MAC_ADDR_ARRAY(bss_desc->bssId),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001367 session->limSmeState);
1368
1369 if (session->limSmeState == eLIM_SME_LINK_EST_STATE &&
1370 session->smeSessionId == sme_join_req->sessionId) {
1371 /*
1372 * Received eWNI_SME_JOIN_REQ for same
1373 * BSS as currently associated.
1374 * Log the event and send success
1375 */
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07001376 pe_warn("SessionId: %d", session_id);
1377 pe_warn("JOIN_REQ for current joined BSS");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001378 /* Send Join success response to host */
1379 ret_code = eSIR_SME_ALREADY_JOINED_A_BSS;
1380 session = NULL;
1381 goto end;
1382 } else {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07001383 pe_err("JOIN_REQ not for current joined BSS");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001384 ret_code = eSIR_SME_REFUSED;
1385 session = NULL;
1386 goto end;
1387 }
1388 } else {
1389 /*
1390 * Session Entry does not exist for given BSSId
1391 * Try to Create a new session
1392 */
Krunal Soni0acfdcd2016-03-09 12:03:06 -08001393 session = pe_create_session(mac_ctx, bss_desc->bssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001394 &session_id, mac_ctx->lim.maxStation,
Rajeev Kumar Sirasanagandlae3b59912018-08-24 15:53:31 +05301395 eSIR_INFRASTRUCTURE_MODE,
1396 sme_join_req->sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001397 if (session == NULL) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07001398 pe_err("Session Can not be created");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001399 ret_code = eSIR_SME_RESOURCES_UNAVAILABLE;
1400 goto end;
Vignesh Viswanathanb3dbbc82018-04-06 00:06:27 +05301401 } else {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07001402 pe_debug("SessionId:%d New session created",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001403 session_id);
Vignesh Viswanathanb3dbbc82018-04-06 00:06:27 +05301404 }
1405
1406 /* Update the beacon/probe filter in mac_ctx */
1407 lim_set_bcn_probe_filter(mac_ctx, session,
1408 &sme_join_req->ssId,
1409 bss_desc->channelId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001410 }
Deepak Dhamdhere612392c2016-08-28 02:56:51 -07001411 session->max_amsdu_num = sme_join_req->max_amsdu_num;
Arif Hussain6686c0b2018-08-21 18:21:05 -07001412 session->enable_session_twt_support =
1413 sme_join_req->enable_session_twt_support;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001414 /*
1415 * Store Session related parameters
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001416 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001417
1418 /* store the smejoin req handle in session table */
1419 session->pLimJoinReq = sme_join_req;
1420
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001421 /* Store SME transaction Id in session Table */
1422 session->transactionId = sme_join_req->transactionId;
1423
1424 /* Store beaconInterval */
1425 session->beaconParams.beaconInterval =
Krunal Soni0acfdcd2016-03-09 12:03:06 -08001426 bss_desc->beaconInterval;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001427
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301428 qdf_mem_copy(&(session->htConfig), &(sme_join_req->htConfig),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001429 sizeof(session->htConfig));
1430
Sandeep Puligilla98917432016-06-10 13:50:28 -07001431 qdf_mem_copy(&(session->vht_config),
1432 &(sme_join_req->vht_config),
1433 sizeof(session->vht_config));
1434
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001435 /* Copying of bssId is already done, while creating session */
1436 sir_copy_mac_addr(session->selfMacAddr,
1437 sme_join_req->selfMacAddr);
1438 session->bssType = sme_join_req->bsstype;
1439
1440 session->statypeForBss = STA_ENTRY_PEER;
1441 session->limWmeEnabled = sme_join_req->isWMEenabled;
1442 session->limQosEnabled = sme_join_req->isQosEnabled;
Abhishek Singhf78bd2d2016-04-27 16:47:56 +05301443 session->wps_registration = sme_join_req->wps_registration;
Kiran Kumar Lokere722dccd2018-02-23 13:23:52 -08001444 session->he_with_wep_tkip = sme_join_req->he_with_wep_tkip;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001445
Selvaraj, Sridhar05ea0792017-05-17 12:17:03 +05301446 session->enable_bcast_probe_rsp =
1447 sme_join_req->enable_bcast_probe_rsp;
1448
Jeff Johnson179fd8a2018-05-11 14:20:05 -07001449 /* Store vendor specific IE for CISCO AP */
Krunal Soni0acfdcd2016-03-09 12:03:06 -08001450 ie_len = (bss_desc->length + sizeof(bss_desc->length) -
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001451 GET_FIELD_OFFSET(tSirBssDescription, ieFields));
1452
Naveen Rawat08db88f2017-09-08 15:07:48 -07001453 vendor_ie = wlan_get_vendor_ie_ptr_from_oui(
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001454 SIR_MAC_CISCO_OUI, SIR_MAC_CISCO_OUI_SIZE,
Krunal Soni0acfdcd2016-03-09 12:03:06 -08001455 ((uint8_t *)&bss_desc->ieFields), ie_len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001456
1457 if (NULL != vendor_ie) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07001458 pe_debug("Cisco vendor OUI present");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001459 session->isCiscoVendorAP = true;
1460 } else {
1461 session->isCiscoVendorAP = false;
1462 }
1463
1464 /* Copy the dot 11 mode in to the session table */
1465
1466 session->dot11mode = sme_join_req->dot11mode;
1467#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
1468 session->cc_switch_mode = sme_join_req->cc_switch_mode;
1469#endif
Krunal Soni0acfdcd2016-03-09 12:03:06 -08001470 session->nwType = bss_desc->nwType;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001471 session->enableAmpduPs = sme_join_req->enableAmpduPs;
1472 session->enableHtSmps = sme_join_req->enableHtSmps;
1473 session->htSmpsvalue = sme_join_req->htSmps;
Archana Ramachandranfec24812016-02-16 16:31:56 -08001474 session->send_smps_action =
1475 sme_join_req->send_smps_action;
Archana Ramachandran5482d6a2016-03-29 17:09:22 -07001476 /*
1477 * By default supported NSS 1x1 is set to true
1478 * and later on updated while determining session
1479 * supported rates which is the intersection of
1480 * self and peer rates
1481 */
1482 session->supported_nss_1x1 = true;
Abhishek Singh23edd1c2016-05-05 11:56:06 +05301483 /*Store Persona */
1484 session->pePersona = sme_join_req->staPersona;
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07001485 pe_debug("enable Smps: %d mode: %d send action: %d supported nss 1x1: %d pePersona %d cbMode %d",
Archana Ramachandran20d2e232016-02-11 16:58:40 -08001486 session->enableHtSmps,
Archana Ramachandranfec24812016-02-16 16:31:56 -08001487 session->htSmpsvalue,
Archana Ramachandran5482d6a2016-03-29 17:09:22 -07001488 session->send_smps_action,
Abhishek Singh23edd1c2016-05-05 11:56:06 +05301489 session->supported_nss_1x1,
1490 session->pePersona,
1491 sme_join_req->cbMode);
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07001492
1493 /*Store Persona */
1494 session->pePersona = sme_join_req->staPersona;
Abhishek Singh4294f802017-08-10 16:37:07 +05301495 QDF_TRACE(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_DEBUG,
Abhishek Singhb59f8d42017-07-31 14:42:47 +05301496 FL("PE PERSONA=%d cbMode %u nwType: %d dot11mode: %d force_24ghz_in_ht20 %d"),
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -08001497 session->pePersona, sme_join_req->cbMode,
Abhishek Singhb59f8d42017-07-31 14:42:47 +05301498 session->nwType, session->dot11mode,
1499 sme_join_req->force_24ghz_in_ht20);
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -08001500
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07001501 /* Copy The channel Id to the session Table */
1502 session->currentOperChannel = bss_desc->channelId;
Vignesh Viswanathand5a5f2e2018-06-01 15:35:51 +05301503
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001504 session->vhtCapability =
1505 IS_DOT11_MODE_VHT(session->dot11mode);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001506 if (session->vhtCapability) {
Anurag Chouhan6d760662016-02-20 16:05:43 +05301507 if (session->pePersona == QDF_STA_MODE) {
Krunal Soni53993f72016-07-08 18:20:03 -07001508 session->vht_config.su_beam_formee =
1509 sme_join_req->vht_config.su_beam_formee;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001510 } else {
Krunal Soni53993f72016-07-08 18:20:03 -07001511 session->vht_config.su_beam_formee = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001512 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001513 session->enableVhtpAid =
1514 sme_join_req->enableVhtpAid;
1515 session->enableVhtGid =
1516 sme_join_req->enableVhtGid;
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07001517 pe_debug("vht su bformer [%d]",
Krunal Soni53993f72016-07-08 18:20:03 -07001518 session->vht_config.su_beam_former);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001519 }
Krunal Soni53993f72016-07-08 18:20:03 -07001520
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07001521 pe_debug("vhtCapability: %d su_beam_formee: %d txbf_csn_value: %d su_tx_bformer %d",
Abhishek Singh23edd1c2016-05-05 11:56:06 +05301522 session->vhtCapability,
Krunal Soni53993f72016-07-08 18:20:03 -07001523 session->vht_config.su_beam_formee,
1524 session->vht_config.csnof_beamformer_antSup,
Krishna Kumaar Natarajan0103ef82017-02-17 18:15:56 -08001525 session->vht_config.su_beam_former);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001526 /*Phy mode */
Krunal Soni0acfdcd2016-03-09 12:03:06 -08001527 session->gLimPhyMode = bss_desc->nwType;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001528 handle_ht_capabilityand_ht_info(mac_ctx, session);
Abhishek Singhb59f8d42017-07-31 14:42:47 +05301529 session->force_24ghz_in_ht20 =
1530 sme_join_req->force_24ghz_in_ht20;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001531 /* cbMode is already merged value of peer and self -
1532 * done by csr in csr_get_cb_mode_from_ies */
1533 session->htSupportedChannelWidthSet =
1534 (sme_join_req->cbMode) ? 1 : 0;
1535 session->htRecommendedTxWidthSet =
1536 session->htSupportedChannelWidthSet;
1537 session->htSecondaryChannelOffset = sme_join_req->cbMode;
1538
1539 if (PHY_DOUBLE_CHANNEL_HIGH_PRIMARY == sme_join_req->cbMode) {
1540 session->ch_center_freq_seg0 =
1541 session->currentOperChannel - 2;
1542 session->ch_width = CH_WIDTH_40MHZ;
1543 } else if (PHY_DOUBLE_CHANNEL_LOW_PRIMARY ==
1544 sme_join_req->cbMode) {
1545 session->ch_center_freq_seg0 =
1546 session->currentOperChannel + 2;
1547 session->ch_width = CH_WIDTH_40MHZ;
1548 } else {
1549 session->ch_center_freq_seg0 = 0;
1550 session->ch_width = CH_WIDTH_20MHZ;
1551 }
1552
Naveen Rawataeca1b92017-10-16 16:55:31 -07001553 if (IS_DOT11_MODE_HE(session->dot11mode)) {
1554 lim_update_session_he_capable(mac_ctx, session);
1555 lim_copy_join_req_he_cap(session, sme_join_req);
1556 }
1557
1558
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001559 /* Record if management frames need to be protected */
1560#ifdef WLAN_FEATURE_11W
Padma, Santhosh Kumar4117d7a2017-12-20 17:39:33 +05301561 if ((eSIR_ED_AES_128_CMAC ==
1562 sme_join_req->MgmtEncryptionType) ||
1563 (eSIR_ED_AES_GMAC_128 == sme_join_req->MgmtEncryptionType) ||
1564 (eSIR_ED_AES_GMAC_256 == sme_join_req->MgmtEncryptionType))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001565 session->limRmfEnabled = 1;
Krishna Kumaar Natarajan48de7de2015-12-08 14:43:13 -08001566 else
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001567 session->limRmfEnabled = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001568#endif
1569
1570#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM
Krunal Soni0acfdcd2016-03-09 12:03:06 -08001571 session->rssi = bss_desc->rssi;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001572#endif
1573
1574 /* Copy the SSID from smejoinreq to session entry */
1575 session->ssId.length = sme_join_req->ssId.length;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301576 qdf_mem_copy(session->ssId.ssId, sme_join_req->ssId.ssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001577 session->ssId.length);
1578
1579 /*
1580 * Determin 11r or ESE connection based on input from SME
1581 * which inturn is dependent on the profile the user wants
1582 * to connect to, So input is coming from supplicant
1583 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001584 session->is11Rconnection = sme_join_req->is11Rconnection;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001585#ifdef FEATURE_WLAN_ESE
1586 session->isESEconnection = sme_join_req->isESEconnection;
1587#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001588 session->isFastTransitionEnabled =
1589 sme_join_req->isFastTransitionEnabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001590
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001591 session->isFastRoamIniFeatureEnabled =
1592 sme_join_req->isFastRoamIniFeatureEnabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001593 session->txLdpcIniFeatureEnabled =
1594 sme_join_req->txLdpcIniFeatureEnabled;
1595
Sridhar Selvaraj8c6f5e82017-08-21 14:53:46 +05301596 lim_update_fils_config(session, sme_join_req);
Padma, Santhosh Kumarb8f65d92017-09-14 13:05:42 +05301597 lim_update_sae_config(session, sme_join_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001598 if (session->bssType == eSIR_INFRASTRUCTURE_MODE) {
1599 session->limSystemRole = eLIM_STA_ROLE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001600 } else {
1601 /*
1602 * Throw an error and return and make
1603 * sure to delete the session.
1604 */
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07001605 pe_err("recvd JOIN_REQ with invalid bss type %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001606 session->bssType);
1607 ret_code = eSIR_SME_INVALID_PARAMETERS;
1608 goto end;
1609 }
1610
1611 if (sme_join_req->addIEScan.length)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301612 qdf_mem_copy(&session->pLimJoinReq->addIEScan,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001613 &sme_join_req->addIEScan, sizeof(tSirAddie));
1614
1615 if (sme_join_req->addIEAssoc.length)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301616 qdf_mem_copy(&session->pLimJoinReq->addIEAssoc,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001617 &sme_join_req->addIEAssoc, sizeof(tSirAddie));
1618
1619 val = sizeof(tLimMlmJoinReq) +
1620 session->pLimJoinReq->bssDescription.length + 2;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301621 mlm_join_req = qdf_mem_malloc(val);
Arif Hussainf5b6c412018-10-10 19:41:09 -07001622 if (!mlm_join_req) {
Nitesh Shah0102cac2016-07-13 14:38:30 +05301623 ret_code = eSIR_SME_RESOURCES_UNAVAILABLE;
1624 goto end;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001625 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001626
1627 /* PE SessionId is stored as a part of JoinReq */
1628 mlm_join_req->sessionId = session->peSessionId;
1629
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001630 /* copy operational rate from session */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301631 qdf_mem_copy((void *)&session->rateSet,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001632 (void *)&sme_join_req->operationalRateSet,
1633 sizeof(tSirMacRateSet));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301634 qdf_mem_copy((void *)&session->extRateSet,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001635 (void *)&sme_join_req->extendedRateSet,
1636 sizeof(tSirMacRateSet));
1637 /*
1638 * this may not be needed anymore now, as rateSet is now
1639 * included in the session entry and MLM has session context.
1640 */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301641 qdf_mem_copy((void *)&mlm_join_req->operationalRateSet,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001642 (void *)&session->rateSet,
1643 sizeof(tSirMacRateSet));
1644
1645 session->encryptType = sme_join_req->UCEncryptionType;
1646
Vignesh Viswanathand5a5f2e2018-06-01 15:35:51 +05301647 session->supported_nss_1x1 = sme_join_req->supported_nss_1x1;
1648 session->vdev_nss = sme_join_req->vdev_nss;
1649 session->nss = sme_join_req->nss;
1650 session->nss_forced_1x1 = sme_join_req->nss_forced_1x1;
1651
1652 pe_debug("nss %d, vdev_nss %d, supported_nss_1x1 %d",
1653 session->nss,
1654 session->vdev_nss,
1655 session->supported_nss_1x1);
1656
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001657 mlm_join_req->bssDescription.length =
1658 session->pLimJoinReq->bssDescription.length;
1659
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301660 qdf_mem_copy((uint8_t *) &mlm_join_req->bssDescription.bssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001661 (uint8_t *)
1662 &session->pLimJoinReq->bssDescription.bssId,
1663 session->pLimJoinReq->bssDescription.length + 2);
1664
1665 session->limCurrentBssCaps =
1666 session->pLimJoinReq->bssDescription.capabilityInfo;
1667
1668 reg_max = cfg_get_regulatory_max_transmit_power(mac_ctx,
1669 session->currentOperChannel);
1670 local_power_constraint = reg_max;
1671
1672 lim_extract_ap_capability(mac_ctx,
1673 (uint8_t *)
1674 session->pLimJoinReq->bssDescription.ieFields,
1675 lim_get_ielen_from_bss_description(
1676 &session->pLimJoinReq->bssDescription),
1677 &session->limCurrentBssQosCaps,
1678 &session->limCurrentBssPropCap,
1679 &session->gLimCurrentBssUapsd,
1680 &local_power_constraint, session);
1681
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001682 session->maxTxPower = lim_get_max_tx_power(reg_max,
1683 local_power_constraint,
1684 mac_ctx->roam.configParam.nTxPowerCap);
Abhinav Kumard528d192018-03-09 17:31:12 +05301685 session->def_max_tx_pwr = session->maxTxPower;
Padma, Santhosh Kumar29df3622016-08-16 19:15:16 +05301686
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07001687 pe_debug("Reg max %d local power con %d max tx pwr %d",
Varun Reddy Yeturu0e3989a2016-04-15 13:30:42 +05301688 reg_max, local_power_constraint, session->maxTxPower);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001689
Agrawal Ashish1fdcbb62017-03-10 17:48:57 +05301690 if (sme_join_req->powerCap.maxTxPower > session->maxTxPower) {
1691 sme_join_req->powerCap.maxTxPower = session->maxTxPower;
1692 pe_debug("Update MaxTxPower in join Req to %d",
1693 sme_join_req->powerCap.maxTxPower);
1694 }
1695
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001696 if (session->gLimCurrentBssUapsd) {
1697 session->gUapsdPerAcBitmask =
1698 session->pLimJoinReq->uapsdPerAcBitmask;
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07001699 pe_debug("UAPSD flag for all AC - 0x%2x",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001700 session->gUapsdPerAcBitmask);
1701
1702 /* resetting the dynamic uapsd mask */
1703 session->gUapsdPerAcDeliveryEnableMask = 0;
1704 session->gUapsdPerAcTriggerEnableMask = 0;
1705 }
1706
1707 session->limRFBand =
1708 lim_get_rf_band(session->currentOperChannel);
1709
1710 /* Initialize 11h Enable Flag */
Abhinav Kumard4d6eb72018-12-04 20:30:37 +05301711 if (session->limRFBand == BAND_5G)
1712 session->lim11hEnable =
1713 mac_ctx->mlme_cfg->gen.enabled_11h;
1714 else
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001715 session->lim11hEnable = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001716 /*
1717 * To care of the scenario when STA transitions from
1718 * IBSS to Infrastructure mode.
1719 */
1720 mac_ctx->lim.gLimIbssCoalescingHappened = false;
1721
1722 session->limPrevSmeState = session->limSmeState;
1723 session->limSmeState = eLIM_SME_WT_JOIN_STATE;
1724 MTRACE(mac_trace(mac_ctx, TRACE_CODE_SME_STATE,
1725 session->peSessionId,
1726 session->limSmeState));
1727
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001728 /* Indicate whether spectrum management is enabled */
1729 session->spectrumMgtEnabled =
1730 sme_join_req->spectrumMgtIndicator;
1731
1732 /* Enable the spectrum management if this is a DFS channel */
1733 if (session->country_info_present &&
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07001734 lim_isconnected_on_dfs_channel(mac_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001735 session->currentOperChannel))
1736 session->spectrumMgtEnabled = true;
1737
1738 session->isOSENConnection = sme_join_req->isOSENConnection;
1739
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001740 /* Issue LIM_MLM_JOIN_REQ to MLM */
Abhishek Singh254d5512018-10-30 12:17:05 +05301741 status = lim_send_join_req(session, mlm_join_req);
1742 if (QDF_IS_STATUS_ERROR(status)) {
1743 qdf_mem_free(mlm_join_req);
1744 ret_code = eSIR_SME_REFUSED;
1745 goto end;
1746 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001747 return;
1748
1749 } else {
1750 /* Received eWNI_SME_JOIN_REQ un expected state */
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07001751 pe_err("received unexpected SME_JOIN_REQ in state %X",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001752 mac_ctx->lim.gLimSmeState);
1753 lim_print_sme_state(mac_ctx, LOGE, mac_ctx->lim.gLimSmeState);
1754 ret_code = eSIR_SME_UNEXPECTED_REQ_RESULT_CODE;
1755 session = NULL;
1756 goto end;
1757 }
1758
1759end:
Nitesh Shah0102cac2016-07-13 14:38:30 +05301760 lim_get_session_info(mac_ctx, (uint8_t *) msg_buf,
1761 &sme_session_id, &sme_transaction_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001762
1763 if (sme_join_req) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301764 qdf_mem_free(sme_join_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001765 sme_join_req = NULL;
1766 if (NULL != session)
1767 session->pLimJoinReq = NULL;
1768 }
1769 if (ret_code != eSIR_SME_SUCCESS) {
1770 if (NULL != session) {
1771 pe_delete_session(mac_ctx, session);
1772 session = NULL;
1773 }
1774 }
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07001775 pe_debug("Send failure status on sessionid: %d with ret_code: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001776 sme_session_id, ret_code);
1777 lim_send_sme_join_reassoc_rsp(mac_ctx, eWNI_SME_JOIN_RSP, ret_code,
1778 eSIR_MAC_UNSPEC_FAILURE_STATUS, session, sme_session_id,
1779 sme_transaction_id);
1780}
1781
Amar Singhala297bfa2015-10-15 15:07:29 -07001782uint8_t lim_get_max_tx_power(int8_t regMax, int8_t apTxPower,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001783 uint8_t iniTxPower)
1784{
1785 uint8_t maxTxPower = 0;
Anurag Chouhan6d760662016-02-20 16:05:43 +05301786 uint8_t txPower = QDF_MIN(regMax, (apTxPower));
Srinivas Girigowda4d65ebe2017-10-13 21:41:42 -07001787
Anurag Chouhan6d760662016-02-20 16:05:43 +05301788 txPower = QDF_MIN(txPower, iniTxPower);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001789 if ((txPower >= MIN_TX_PWR_CAP) && (txPower <= MAX_TX_PWR_CAP))
1790 maxTxPower = txPower;
1791 else if (txPower < MIN_TX_PWR_CAP)
1792 maxTxPower = MIN_TX_PWR_CAP;
1793 else
1794 maxTxPower = MAX_TX_PWR_CAP;
1795
1796 return maxTxPower;
1797}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001798
1799/**
1800 * __lim_process_sme_reassoc_req() - process reassoc req
1801 *
1802 * @mac_ctx: Pointer to Global MAC structure
1803 * @msg_buf: pointer to the SME message buffer
1804 *
1805 * This function is called to process SME_REASSOC_REQ message
1806 * from HDD or upper layer application.
1807 *
1808 * Return: None
1809 */
1810
Jeff Johnson83d6c112018-12-02 13:05:00 -08001811static void __lim_process_sme_reassoc_req(struct mac_context *mac_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001812 uint32_t *msg_buf)
1813{
1814 uint16_t caps;
1815 uint32_t val;
1816 tpSirSmeJoinReq reassoc_req = NULL;
1817 tLimMlmReassocReq *mlm_reassoc_req;
1818 tSirResultCodes ret_code = eSIR_SME_SUCCESS;
Jeff Johnson209dfa02018-11-18 22:54:38 -08001819 struct pe_session *session_entry = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001820 uint8_t session_id;
1821 uint8_t sme_session_id;
1822 uint16_t transaction_id;
Amar Singhala297bfa2015-10-15 15:07:29 -07001823 int8_t local_pwr_constraint = 0, reg_max = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001824 uint32_t tele_bcn_en = 0;
1825 uint16_t size;
Abhishek Singh254d5512018-10-30 12:17:05 +05301826 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001827
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001828 size = __lim_get_sme_join_req_size_for_alloc((uint8_t *)msg_buf);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301829 reassoc_req = qdf_mem_malloc(size);
Arif Hussainf5b6c412018-10-10 19:41:09 -07001830 if (!reassoc_req) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001831 ret_code = eSIR_SME_RESOURCES_UNAVAILABLE;
1832 goto end;
1833 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301834 (void)qdf_mem_copy((void *)reassoc_req, (void *)msg_buf, size);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001835
1836 if (!lim_is_sme_join_req_valid(mac_ctx,
1837 (tpSirSmeJoinReq)reassoc_req)) {
1838 /*
1839 * Received invalid eWNI_SME_REASSOC_REQ
1840 */
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07001841 pe_warn("received SME_REASSOC_REQ with invalid data");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001842
1843 ret_code = eSIR_SME_INVALID_PARAMETERS;
1844 goto end;
1845 }
Jianmin Zhu09236602018-10-15 15:36:10 +08001846 lim_get_session_info(mac_ctx, (uint8_t *)msg_buf,
1847 &sme_session_id, &transaction_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001848
1849 session_entry = pe_find_session_by_bssid(mac_ctx,
1850 reassoc_req->bssDescription.bssId,
1851 &session_id);
1852 if (session_entry == NULL) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07001853 pe_err("Session does not exist for given bssId");
Varun Reddy Yeturu658b8022016-09-23 11:10:42 -07001854 lim_print_mac_addr(mac_ctx, reassoc_req->bssDescription.bssId,
1855 LOGE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001856 ret_code = eSIR_SME_INVALID_PARAMETERS;
Varun Reddy Yeturu658b8022016-09-23 11:10:42 -07001857 session_entry =
1858 pe_find_session_by_sme_session_id(mac_ctx,
1859 sme_session_id);
1860 if (session_entry != NULL)
1861 lim_handle_sme_join_result(mac_ctx,
1862 eSIR_SME_INVALID_PARAMETERS,
1863 eSIR_MAC_UNSPEC_FAILURE_STATUS,
1864 session_entry);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001865 goto end;
1866 }
1867#ifdef FEATURE_WLAN_DIAG_SUPPORT /* FEATURE_WLAN_DIAG_SUPPORT */
1868 lim_diag_event_report(mac_ctx, WLAN_PE_DIAG_REASSOC_REQ_EVENT,
Jeff Johnson0301ecb2018-06-29 09:36:23 -07001869 session_entry, QDF_STATUS_SUCCESS, QDF_STATUS_SUCCESS);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001870#endif /* FEATURE_WLAN_DIAG_SUPPORT */
1871 /* mac_ctx->lim.gpLimReassocReq = reassoc_req;//TO SUPPORT BT-AMP */
1872
1873 /* Store the reassoc handle in the session Table */
1874 session_entry->pLimReAssocReq = reassoc_req;
1875
1876 session_entry->dot11mode = reassoc_req->dot11mode;
1877 session_entry->vhtCapability =
1878 IS_DOT11_MODE_VHT(reassoc_req->dot11mode);
Archana Ramachandran20d2e232016-02-11 16:58:40 -08001879
Padma, Santhosh Kumar429553d2016-08-08 18:49:31 +05301880 if (session_entry->vhtCapability) {
1881 if (session_entry->pePersona == QDF_STA_MODE) {
1882 session_entry->vht_config.su_beam_formee =
1883 reassoc_req->vht_config.su_beam_formee;
1884 } else {
1885 reassoc_req->vht_config.su_beam_formee = 0;
1886 }
1887 session_entry->enableVhtpAid =
1888 reassoc_req->enableVhtpAid;
1889 session_entry->enableVhtGid =
1890 reassoc_req->enableVhtGid;
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07001891 pe_debug("vht su bformer [%d]", session_entry->vht_config.su_beam_former);
Padma, Santhosh Kumar429553d2016-08-08 18:49:31 +05301892 }
1893
Vignesh Viswanathand5a5f2e2018-06-01 15:35:51 +05301894 session_entry->supported_nss_1x1 = reassoc_req->supported_nss_1x1;
1895 session_entry->vdev_nss = reassoc_req->vdev_nss;
1896 session_entry->nss = reassoc_req->nss;
1897 session_entry->nss_forced_1x1 = reassoc_req->nss_forced_1x1;
1898
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07001899 pe_debug("vhtCapability: %d su_beam_formee: %d su_tx_bformer %d",
Padma, Santhosh Kumar429553d2016-08-08 18:49:31 +05301900 session_entry->vhtCapability,
1901 session_entry->vht_config.su_beam_formee,
1902 session_entry->vht_config.su_beam_former);
1903
Archana Ramachandran20d2e232016-02-11 16:58:40 -08001904 session_entry->enableHtSmps = reassoc_req->enableHtSmps;
1905 session_entry->htSmpsvalue = reassoc_req->htSmps;
Archana Ramachandranfec24812016-02-16 16:31:56 -08001906 session_entry->send_smps_action =
1907 reassoc_req->send_smps_action;
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07001908 pe_debug("enableHtSmps: %d htSmps: %d send action: %d supported nss 1x1: %d",
Archana Ramachandran20d2e232016-02-11 16:58:40 -08001909 session_entry->enableHtSmps,
Archana Ramachandranfec24812016-02-16 16:31:56 -08001910 session_entry->htSmpsvalue,
Archana Ramachandran5482d6a2016-03-29 17:09:22 -07001911 session_entry->send_smps_action,
1912 session_entry->supported_nss_1x1);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001913 /*
1914 * Reassociate request is expected
1915 * in link established state only.
1916 */
1917
1918 if (session_entry->limSmeState != eLIM_SME_LINK_EST_STATE) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001919 if (session_entry->limSmeState == eLIM_SME_WT_REASSOC_STATE) {
1920 /*
1921 * May be from 11r FT pre-auth. So lets check it
1922 * before we bail out
1923 */
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07001924 pe_debug("Session in reassoc state is %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001925 session_entry->peSessionId);
1926
1927 /* Make sure its our preauth bssid */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301928 if (qdf_mem_cmp(reassoc_req->bssDescription.bssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001929 session_entry->limReAssocbssId,
1930 6)) {
1931 lim_print_mac_addr(mac_ctx,
1932 reassoc_req->bssDescription.
1933 bssId, LOGE);
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07001934 pe_err("Unknown bssId in reassoc state");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001935 ret_code = eSIR_SME_INVALID_PARAMETERS;
1936 goto end;
1937 }
1938
Jianmin Zhu09236602018-10-15 15:36:10 +08001939 session_entry->smeSessionId = sme_session_id;
1940 session_entry->transactionId = transaction_id;
Abhishek Singh254d5512018-10-30 12:17:05 +05301941 mlm_reassoc_req =
1942 qdf_mem_malloc(sizeof(*mlm_reassoc_req));
1943 if (!mlm_reassoc_req) {
1944 ret_code = eSIR_SME_RESOURCES_UNAVAILABLE;
1945 goto end;
1946 }
1947
1948 /* Update PE sessionId */
1949 mlm_reassoc_req->sessionId = session_entry->peSessionId;
1950 status = lim_send_ft_reassoc_req(session_entry,
1951 mlm_reassoc_req);
1952 if (QDF_IS_STATUS_ERROR(status)) {
1953 qdf_mem_free(mlm_reassoc_req);
1954 ret_code = eSIR_SME_REFUSED;
1955 goto end;
1956 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001957 return;
1958 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001959 /*
1960 * Should not have received eWNI_SME_REASSOC_REQ
1961 */
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07001962 pe_err("received unexpected SME_REASSOC_REQ in state %X",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001963 session_entry->limSmeState);
1964 lim_print_sme_state(mac_ctx, LOGE, session_entry->limSmeState);
1965
1966 ret_code = eSIR_SME_UNEXPECTED_REQ_RESULT_CODE;
1967 goto end;
1968 }
1969
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301970 qdf_mem_copy(session_entry->limReAssocbssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001971 session_entry->pLimReAssocReq->bssDescription.bssId,
1972 sizeof(tSirMacAddr));
1973
1974 session_entry->limReassocChannelId =
1975 session_entry->pLimReAssocReq->bssDescription.channelId;
1976
1977 session_entry->reAssocHtSupportedChannelWidthSet =
1978 (session_entry->pLimReAssocReq->cbMode) ? 1 : 0;
1979 session_entry->reAssocHtRecommendedTxWidthSet =
1980 session_entry->reAssocHtSupportedChannelWidthSet;
1981 session_entry->reAssocHtSecondaryChannelOffset =
1982 session_entry->pLimReAssocReq->cbMode;
1983
1984 session_entry->limReassocBssCaps =
1985 session_entry->pLimReAssocReq->bssDescription.capabilityInfo;
1986 reg_max = cfg_get_regulatory_max_transmit_power(mac_ctx,
1987 session_entry->currentOperChannel);
1988 local_pwr_constraint = reg_max;
1989
1990 lim_extract_ap_capability(mac_ctx,
1991 (uint8_t *)session_entry->pLimReAssocReq->bssDescription.ieFields,
1992 lim_get_ielen_from_bss_description(
1993 &session_entry->pLimReAssocReq->bssDescription),
1994 &session_entry->limReassocBssQosCaps,
1995 &session_entry->limReassocBssPropCap,
1996 &session_entry->gLimCurrentBssUapsd,
1997 &local_pwr_constraint, session_entry);
Anurag Chouhan6d760662016-02-20 16:05:43 +05301998 session_entry->maxTxPower = QDF_MIN(reg_max, (local_pwr_constraint));
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07001999 pe_err("Reg max = %d, local pwr constraint = %d, max tx = %d",
Varun Reddy Yeturu0e3989a2016-04-15 13:30:42 +05302000 reg_max, local_pwr_constraint, session_entry->maxTxPower);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002001 /* Copy the SSID from session entry to local variable */
2002 session_entry->limReassocSSID.length = reassoc_req->ssId.length;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302003 qdf_mem_copy(session_entry->limReassocSSID.ssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002004 reassoc_req->ssId.ssId,
2005 session_entry->limReassocSSID.length);
2006 if (session_entry->gLimCurrentBssUapsd) {
2007 session_entry->gUapsdPerAcBitmask =
2008 session_entry->pLimReAssocReq->uapsdPerAcBitmask;
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002009 pe_debug("UAPSD flag for all AC - 0x%2x",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002010 session_entry->gUapsdPerAcBitmask);
2011 }
2012
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302013 mlm_reassoc_req = qdf_mem_malloc(sizeof(tLimMlmReassocReq));
Arif Hussainf5b6c412018-10-10 19:41:09 -07002014 if (!mlm_reassoc_req) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002015 ret_code = eSIR_SME_RESOURCES_UNAVAILABLE;
2016 goto end;
2017 }
2018
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302019 qdf_mem_copy(mlm_reassoc_req->peerMacAddr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002020 session_entry->limReAssocbssId, sizeof(tSirMacAddr));
2021
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002022 if (cfg_get_capability_info(mac_ctx, &caps, session_entry) !=
Jeff Johnson0301ecb2018-06-29 09:36:23 -07002023 QDF_STATUS_SUCCESS)
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002024 pe_err("could not retrieve Capabilities value");
Selvaraj, Sridharaf54e2e2016-06-24 12:25:02 +05302025
2026 lim_update_caps_info_for_bss(mac_ctx, &caps,
2027 reassoc_req->bssDescription.capabilityInfo);
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002028 pe_debug("Capabilities info Reassoc: 0x%X", caps);
Selvaraj, Sridharaf54e2e2016-06-24 12:25:02 +05302029
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002030 mlm_reassoc_req->capabilityInfo = caps;
2031
2032 /* Update PE session_id */
2033 mlm_reassoc_req->sessionId = session_id;
2034
2035 /*
2036 * If telescopic beaconing is enabled, set listen interval to
Bala Venkatesh2fde2c62018-09-11 20:33:24 +05302037 * CFG_TELE_BCN_MAX_LI
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002038 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002039
Bala Venkatesh2fde2c62018-09-11 20:33:24 +05302040 tele_bcn_en = mac_ctx->mlme_cfg->sap_cfg.tele_bcn_wakeup_en;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002041
Bala Venkatesh2fde2c62018-09-11 20:33:24 +05302042 if (tele_bcn_en)
2043 val = mac_ctx->mlme_cfg->sap_cfg.tele_bcn_max_li;
2044 else
2045 val = mac_ctx->mlme_cfg->sap_cfg.listen_interval;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002046
2047 mlm_reassoc_req->listenInterval = (uint16_t) val;
2048
2049 /* Indicate whether spectrum management is enabled */
2050 session_entry->spectrumMgtEnabled = reassoc_req->spectrumMgtIndicator;
2051
2052 /* Enable the spectrum management if this is a DFS channel */
2053 if (session_entry->country_info_present &&
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07002054 lim_isconnected_on_dfs_channel(mac_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002055 session_entry->currentOperChannel))
2056 session_entry->spectrumMgtEnabled = true;
2057
2058 session_entry->limPrevSmeState = session_entry->limSmeState;
2059 session_entry->limSmeState = eLIM_SME_WT_REASSOC_STATE;
2060
2061 MTRACE(mac_trace(mac_ctx, TRACE_CODE_SME_STATE,
2062 session_entry->peSessionId,
2063 session_entry->limSmeState));
2064
Abhishek Singh254d5512018-10-30 12:17:05 +05302065 status = lim_send_reassoc_req(session_entry, mlm_reassoc_req);
2066 if (QDF_IS_STATUS_ERROR(status)) {
2067 qdf_mem_free(mlm_reassoc_req);
2068 ret_code = eSIR_SME_REFUSED;
2069 goto end;
2070 }
Jianmin Zhu09236602018-10-15 15:36:10 +08002071
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002072 return;
2073end:
2074 if (reassoc_req) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302075 qdf_mem_free(reassoc_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002076 if (session_entry)
2077 session_entry->pLimReAssocReq = NULL;
2078 }
2079
2080 if (session_entry) {
2081 /*
2082 * error occurred after we determined the session so extract
2083 * session and transaction info from there
2084 */
2085 sme_session_id = session_entry->smeSessionId;
2086 transaction_id = session_entry->transactionId;
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002087 } else {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002088 /*
2089 * error occurred before or during the time we determined
2090 * the session so extract the session and transaction info
2091 * from the message
2092 */
2093 lim_get_session_info(mac_ctx, (uint8_t *) msg_buf,
2094 &sme_session_id, &transaction_id);
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002095 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002096 /*
2097 * Send Reassoc failure response to host
2098 * (note session_entry may be NULL, but that's OK)
2099 */
2100 lim_send_sme_join_reassoc_rsp(mac_ctx, eWNI_SME_REASSOC_RSP,
2101 ret_code, eSIR_MAC_UNSPEC_FAILURE_STATUS,
2102 session_entry, sme_session_id,
2103 transaction_id);
2104}
2105
2106bool send_disassoc_frame = 1;
2107/**
2108 * __lim_process_sme_disassoc_req()
2109 *
2110 ***FUNCTION:
2111 * This function is called to process SME_DISASSOC_REQ message
2112 * from HDD or upper layer application.
2113 *
2114 ***LOGIC:
2115 *
2116 ***ASSUMPTIONS:
2117 *
2118 ***NOTE:
2119 *
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002120 * @param mac Pointer to Global MAC structure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002121 * @param *pMsgBuf A pointer to the SME message buffer
2122 * @return None
2123 */
2124
Jeff Johnson83d6c112018-12-02 13:05:00 -08002125static void __lim_process_sme_disassoc_req(struct mac_context *mac, uint32_t *pMsgBuf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002126{
2127 uint16_t disassocTrigger, reasonCode;
2128 tLimMlmDisassocReq *pMlmDisassocReq;
2129 tSirResultCodes retCode = eSIR_SME_SUCCESS;
2130 tSirSmeDisassocReq smeDisassocReq;
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002131 struct pe_session *pe_session = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002132 uint8_t sessionId;
2133 uint8_t smesessionId;
2134 uint16_t smetransactionId;
2135
2136 if (pMsgBuf == NULL) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002137 pe_err("Buffer is Pointing to NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002138 return;
2139 }
2140
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302141 qdf_mem_copy(&smeDisassocReq, pMsgBuf, sizeof(tSirSmeDisassocReq));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002142 smesessionId = smeDisassocReq.sessionId;
2143 smetransactionId = smeDisassocReq.transactionId;
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002144 if (!lim_is_sme_disassoc_req_valid(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002145 &smeDisassocReq,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002146 pe_session)) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002147 pe_err("received invalid SME_DISASSOC_REQ message");
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002148 if (mac->lim.gLimRspReqd) {
2149 mac->lim.gLimRspReqd = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002150
2151 retCode = eSIR_SME_INVALID_PARAMETERS;
2152 disassocTrigger = eLIM_HOST_DISASSOC;
2153 goto sendDisassoc;
2154 }
2155
2156 return;
2157 }
2158
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002159 pe_session = pe_find_session_by_bssid(mac,
Srinivas Girigowda1a245362016-01-05 22:43:30 -08002160 smeDisassocReq.bssid.bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002161 &sessionId);
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002162 if (pe_session == NULL) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002163 pe_err("session does not exist for given bssId "
2164 MAC_ADDRESS_STR,
Srinivas Girigowda1a245362016-01-05 22:43:30 -08002165 MAC_ADDR_ARRAY(smeDisassocReq.bssid.bytes));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002166 retCode = eSIR_SME_INVALID_PARAMETERS;
2167 disassocTrigger = eLIM_HOST_DISASSOC;
2168 goto sendDisassoc;
2169 }
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002170 pe_debug("received DISASSOC_REQ message on sessionid %d Systemrole %d Reason: %u SmeState: %d from: "
2171 MAC_ADDRESS_STR, smesessionId,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002172 GET_LIM_SYSTEM_ROLE(pe_session), smeDisassocReq.reasonCode,
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002173 mac->lim.gLimSmeState,
Srinivas Girigowda1a245362016-01-05 22:43:30 -08002174 MAC_ADDR_ARRAY(smeDisassocReq.peer_macaddr.bytes));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002175
2176#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM /* FEATURE_WLAN_DIAG_SUPPORT */
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002177 lim_diag_event_report(mac, WLAN_PE_DIAG_DISASSOC_REQ_EVENT, pe_session,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002178 0, smeDisassocReq.reasonCode);
2179#endif /* FEATURE_WLAN_DIAG_SUPPORT */
2180
2181 /* Update SME session Id and SME transaction ID */
2182
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002183 pe_session->smeSessionId = smesessionId;
2184 pe_session->transactionId = smetransactionId;
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002185 pe_debug("ho_fail: %d ", smeDisassocReq.process_ho_fail);
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002186 pe_session->process_ho_fail = smeDisassocReq.process_ho_fail;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002187
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002188 switch (GET_LIM_SYSTEM_ROLE(pe_session)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002189 case eLIM_STA_ROLE:
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002190 switch (pe_session->limSmeState) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002191 case eLIM_SME_ASSOCIATED_STATE:
2192 case eLIM_SME_LINK_EST_STATE:
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002193 pe_debug("Rcvd SME_DISASSOC_REQ in limSmeState: %d ",
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002194 pe_session->limSmeState);
2195 pe_session->limPrevSmeState =
2196 pe_session->limSmeState;
2197 pe_session->limSmeState = eLIM_SME_WT_DISASSOC_STATE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002198 /* Delete all TDLS peers connected before leaving BSS */
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002199 lim_delete_tdls_peers(mac, pe_session);
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002200 MTRACE(mac_trace(mac, TRACE_CODE_SME_STATE,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002201 pe_session->peSessionId,
2202 pe_session->limSmeState));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002203 break;
2204
2205 case eLIM_SME_WT_DEAUTH_STATE:
2206 /* PE shall still process the DISASSOC_REQ and proceed with
2207 * link tear down even if it had already sent a DEAUTH_IND to
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002208 * to SME. mac->lim.gLimPrevSmeState shall remain the same as
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002209 * its been set when PE entered WT_DEAUTH_STATE.
2210 */
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002211 pe_session->limSmeState = eLIM_SME_WT_DISASSOC_STATE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002212 MTRACE(mac_trace
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002213 (mac, TRACE_CODE_SME_STATE,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002214 pe_session->peSessionId,
2215 pe_session->limSmeState));
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002216 pe_debug("Rcvd SME_DISASSOC_REQ while in SME_WT_DEAUTH_STATE");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002217 break;
2218
2219 case eLIM_SME_WT_DISASSOC_STATE:
Jeff Johnson47d75242018-05-12 15:58:53 -07002220 /* PE Received a Disassoc frame. Normally it gets DISASSOC_CNF but it
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002221 * received DISASSOC_REQ. Which means host is also trying to disconnect.
2222 * PE can continue processing DISASSOC_REQ and send the response instead
2223 * of failing the request. SME will anyway ignore DEAUTH_IND that was sent
2224 * for disassoc frame.
2225 *
2226 * It will send a disassoc, which is ok. However, we can use the global flag
2227 * sendDisassoc to not send disassoc frame.
2228 */
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002229 pe_debug("Rcvd SME_DISASSOC_REQ while in SME_WT_DISASSOC_STATE");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002230 break;
2231
2232 case eLIM_SME_JOIN_FAILURE_STATE: {
2233 /* Already in Disconnected State, return success */
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002234 pe_debug("Rcvd SME_DISASSOC_REQ while in eLIM_SME_JOIN_FAILURE_STATE");
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002235 if (mac->lim.gLimRspReqd) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002236 retCode = eSIR_SME_SUCCESS;
2237 disassocTrigger = eLIM_HOST_DISASSOC;
2238 goto sendDisassoc;
2239 }
2240 }
2241 break;
2242 default:
2243 /**
2244 * STA is not currently associated.
2245 * Log error and send response to host
2246 */
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002247 pe_err("received unexpected SME_DISASSOC_REQ in state %X",
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002248 pe_session->limSmeState);
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002249 lim_print_sme_state(mac, LOGE,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002250 pe_session->limSmeState);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002251
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002252 if (mac->lim.gLimRspReqd) {
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002253 if (pe_session->limSmeState !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002254 eLIM_SME_WT_ASSOC_STATE)
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002255 mac->lim.gLimRspReqd = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002256
2257 retCode = eSIR_SME_UNEXPECTED_REQ_RESULT_CODE;
2258 disassocTrigger = eLIM_HOST_DISASSOC;
2259 goto sendDisassoc;
2260 }
2261
2262 return;
2263 }
2264
2265 break;
2266
2267 case eLIM_AP_ROLE:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002268 /* Fall through */
2269 break;
2270
2271 case eLIM_STA_IN_IBSS_ROLE:
2272 default:
2273 /* eLIM_UNKNOWN_ROLE */
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002274 pe_err("received unexpected SME_DISASSOC_REQ for role %d",
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002275 GET_LIM_SYSTEM_ROLE(pe_session));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002276
2277 retCode = eSIR_SME_UNEXPECTED_REQ_RESULT_CODE;
2278 disassocTrigger = eLIM_HOST_DISASSOC;
2279 goto sendDisassoc;
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002280 } /* end switch (mac->lim.gLimSystemRole) */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002281
Edhar, Mahesh Kumare3c8d352015-11-16 12:03:45 +05302282 disassocTrigger = eLIM_HOST_DISASSOC;
2283 reasonCode = smeDisassocReq.reasonCode;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002284
2285 if (smeDisassocReq.doNotSendOverTheAir) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002286 pe_debug("do not send dissoc over the air");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002287 send_disassoc_frame = 0;
2288 }
2289 /* Trigger Disassociation frame to peer MAC entity */
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002290 pe_debug("Sending Disasscoc with disassoc Trigger"
2291 " : %d, reasonCode : %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002292 disassocTrigger, reasonCode);
2293
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302294 pMlmDisassocReq = qdf_mem_malloc(sizeof(tLimMlmDisassocReq));
Arif Hussainf5b6c412018-10-10 19:41:09 -07002295 if (!pMlmDisassocReq)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002296 return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002297
Anurag Chouhanc5548422016-02-24 18:33:27 +05302298 qdf_copy_macaddr(&pMlmDisassocReq->peer_macaddr,
Srinivas Girigowda1a245362016-01-05 22:43:30 -08002299 &smeDisassocReq.peer_macaddr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002300
2301 pMlmDisassocReq->reasonCode = reasonCode;
2302 pMlmDisassocReq->disassocTrigger = disassocTrigger;
2303
2304 /* Update PE session ID */
2305 pMlmDisassocReq->sessionId = sessionId;
2306
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002307 lim_post_mlm_message(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002308 LIM_MLM_DISASSOC_REQ, (uint32_t *) pMlmDisassocReq);
2309 return;
2310
2311sendDisassoc:
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002312 if (pe_session)
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002313 lim_send_sme_disassoc_ntf(mac,
Srinivas Girigowda1a245362016-01-05 22:43:30 -08002314 smeDisassocReq.peer_macaddr.bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002315 retCode,
2316 disassocTrigger,
2317 1, smesessionId, smetransactionId,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002318 pe_session);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002319 else
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002320 lim_send_sme_disassoc_ntf(mac,
Srinivas Girigowda1a245362016-01-05 22:43:30 -08002321 smeDisassocReq.peer_macaddr.bytes,
2322 retCode, disassocTrigger, 1,
2323 smesessionId, smetransactionId, NULL);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002324
2325} /*** end __lim_process_sme_disassoc_req() ***/
2326
2327/** -----------------------------------------------------------------
2328 \brief __lim_process_sme_disassoc_cnf() - Process SME_DISASSOC_CNF
2329
2330 This function is called to process SME_DISASSOC_CNF message
2331 from HDD or upper layer application.
2332
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002333 \param mac - global mac structure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002334 \param pStaDs - station dph hash node
2335 \return none
2336 \sa
2337 ----------------------------------------------------------------- */
Jeff Johnson83d6c112018-12-02 13:05:00 -08002338void __lim_process_sme_disassoc_cnf(struct mac_context *mac, uint32_t *pMsgBuf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002339{
2340 tSirSmeDisassocCnf smeDisassocCnf;
2341 uint16_t aid;
2342 tpDphHashNode pStaDs;
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002343 struct pe_session *pe_session;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002344 uint8_t sessionId;
Vignesh Viswanathan5b909f52018-05-15 20:13:35 +05302345 uint32_t *msg = NULL;
2346 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002347
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302348 qdf_mem_copy(&smeDisassocCnf, pMsgBuf,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002349 sizeof(struct sSirSmeDisassocCnf));
2350
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002351 pe_session = pe_find_session_by_bssid(mac,
Srinivas Girigowda5f3c81a2016-01-04 21:47:19 -08002352 smeDisassocCnf.bssid.bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002353 &sessionId);
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002354 if (pe_session == NULL) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002355 pe_err("session does not exist for given bssId");
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002356 status = lim_prepare_disconnect_done_ind(mac, &msg,
Vignesh Viswanathanb2dcdd02018-05-24 11:48:12 +05302357 smeDisassocCnf.sme_session_id,
Vignesh Viswanathan5b909f52018-05-15 20:13:35 +05302358 eSIR_SME_INVALID_SESSION,
2359 NULL);
2360 if (QDF_IS_STATUS_SUCCESS(status))
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002361 lim_send_sme_disassoc_deauth_ntf(mac,
Vignesh Viswanathan5b909f52018-05-15 20:13:35 +05302362 QDF_STATUS_SUCCESS,
2363 (uint32_t *)msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002364 return;
2365 }
2366
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002367 if (!lim_is_sme_disassoc_cnf_valid(mac, &smeDisassocCnf, pe_session)) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002368 pe_err("received invalid SME_DISASSOC_CNF message");
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002369 status = lim_prepare_disconnect_done_ind(mac, &msg,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002370 pe_session->smeSessionId,
Vignesh Viswanathan5b909f52018-05-15 20:13:35 +05302371 eSIR_SME_INVALID_PARAMETERS,
2372 &smeDisassocCnf.bssid.bytes[0]);
2373 if (QDF_IS_STATUS_SUCCESS(status))
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002374 lim_send_sme_disassoc_deauth_ntf(mac,
Vignesh Viswanathan5b909f52018-05-15 20:13:35 +05302375 QDF_STATUS_SUCCESS,
2376 (uint32_t *)msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002377 return;
2378 }
2379#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM /* FEATURE_WLAN_DIAG_SUPPORT */
2380 if (smeDisassocCnf.messageType == eWNI_SME_DISASSOC_CNF)
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002381 lim_diag_event_report(mac, WLAN_PE_DIAG_DISASSOC_CNF_EVENT,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002382 pe_session,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002383 (uint16_t) smeDisassocCnf.statusCode, 0);
2384 else if (smeDisassocCnf.messageType == eWNI_SME_DEAUTH_CNF)
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002385 lim_diag_event_report(mac, WLAN_PE_DIAG_DEAUTH_CNF_EVENT,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002386 pe_session,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002387 (uint16_t) smeDisassocCnf.statusCode, 0);
2388#endif /* FEATURE_WLAN_DIAG_SUPPORT */
2389
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002390 switch (GET_LIM_SYSTEM_ROLE(pe_session)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002391 case eLIM_STA_ROLE:
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002392 if ((pe_session->limSmeState != eLIM_SME_IDLE_STATE) &&
2393 (pe_session->limSmeState != eLIM_SME_WT_DISASSOC_STATE)
2394 && (pe_session->limSmeState !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002395 eLIM_SME_WT_DEAUTH_STATE)) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002396 pe_err("received unexp SME_DISASSOC_CNF in state %X",
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002397 pe_session->limSmeState);
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002398 lim_print_sme_state(mac, LOGE,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002399 pe_session->limSmeState);
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002400 status = lim_prepare_disconnect_done_ind(mac, &msg,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002401 pe_session->smeSessionId,
Vignesh Viswanathanb2dcdd02018-05-24 11:48:12 +05302402 eSIR_SME_INVALID_STATE,
2403 &smeDisassocCnf.bssid.bytes[0]);
Vignesh Viswanathan5b909f52018-05-15 20:13:35 +05302404 if (QDF_IS_STATUS_SUCCESS(status))
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002405 lim_send_sme_disassoc_deauth_ntf(mac,
Vignesh Viswanathan5b909f52018-05-15 20:13:35 +05302406 QDF_STATUS_SUCCESS,
2407 (uint32_t *)msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002408 return;
2409 }
2410 break;
2411
2412 case eLIM_AP_ROLE:
2413 /* Fall through */
2414 break;
2415
2416 case eLIM_STA_IN_IBSS_ROLE:
2417 default: /* eLIM_UNKNOWN_ROLE */
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002418 pe_err("received unexpected SME_DISASSOC_CNF role %d",
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002419 GET_LIM_SYSTEM_ROLE(pe_session));
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002420 status = lim_prepare_disconnect_done_ind(mac, &msg,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002421 pe_session->smeSessionId,
Vignesh Viswanathan5b909f52018-05-15 20:13:35 +05302422 eSIR_SME_INVALID_STATE,
2423 &smeDisassocCnf.bssid.bytes[0]);
2424 if (QDF_IS_STATUS_SUCCESS(status))
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002425 lim_send_sme_disassoc_deauth_ntf(mac,
Vignesh Viswanathan5b909f52018-05-15 20:13:35 +05302426 QDF_STATUS_SUCCESS,
2427 (uint32_t *)msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002428 return;
2429 }
2430
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002431 if ((pe_session->limSmeState == eLIM_SME_WT_DISASSOC_STATE) ||
2432 (pe_session->limSmeState == eLIM_SME_WT_DEAUTH_STATE) ||
2433 LIM_IS_AP_ROLE(pe_session)) {
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002434 pStaDs = dph_lookup_hash_entry(mac,
Srinivas Girigowda5f3c81a2016-01-04 21:47:19 -08002435 smeDisassocCnf.peer_macaddr.bytes, &aid,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002436 &pe_session->dph.dphHashTable);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002437 if (pStaDs == NULL) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002438 pe_err("DISASSOC_CNF for a STA with no context, addr= "
2439 MAC_ADDRESS_STR,
Srinivas Girigowda5f3c81a2016-01-04 21:47:19 -08002440 MAC_ADDR_ARRAY(smeDisassocCnf.peer_macaddr.bytes));
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002441 status = lim_prepare_disconnect_done_ind(mac, &msg,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002442 pe_session->smeSessionId,
Himanshu Agarwald519b4a2018-03-27 15:36:09 +05302443 eSIR_SME_INVALID_PARAMETERS,
Vignesh Viswanathan5b909f52018-05-15 20:13:35 +05302444 &smeDisassocCnf.bssid.bytes[0]);
2445 if (QDF_IS_STATUS_SUCCESS(status))
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002446 lim_send_sme_disassoc_deauth_ntf(mac,
Vignesh Viswanathan5b909f52018-05-15 20:13:35 +05302447 QDF_STATUS_SUCCESS,
2448 (uint32_t *)msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002449 return;
2450 }
Masti, Narayanraddi21bde252015-10-09 19:39:47 +05302451
2452 if ((pStaDs->mlmStaContext.mlmState ==
2453 eLIM_MLM_WT_DEL_STA_RSP_STATE) ||
2454 (pStaDs->mlmStaContext.mlmState ==
Arif Hussain5fa13782018-05-10 11:29:52 -07002455 eLIM_MLM_WT_DEL_BSS_RSP_STATE)) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002456 pe_err("No need of cleanup for addr:" MAC_ADDRESS_STR "as MLM state is %d",
Srinivas Girigowda5f3c81a2016-01-04 21:47:19 -08002457 MAC_ADDR_ARRAY(smeDisassocCnf.peer_macaddr.bytes),
Masti, Narayanraddi21bde252015-10-09 19:39:47 +05302458 pStaDs->mlmStaContext.mlmState);
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002459 status = lim_prepare_disconnect_done_ind(mac, &msg,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002460 pe_session->smeSessionId,
Vignesh Viswanathanb2dcdd02018-05-24 11:48:12 +05302461 eSIR_SME_SUCCESS,
2462 NULL);
Vignesh Viswanathan5b909f52018-05-15 20:13:35 +05302463 if (QDF_IS_STATUS_SUCCESS(status))
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002464 lim_send_sme_disassoc_deauth_ntf(mac,
Vignesh Viswanathan5b909f52018-05-15 20:13:35 +05302465 QDF_STATUS_SUCCESS,
2466 (uint32_t *)msg);
Masti, Narayanraddi21bde252015-10-09 19:39:47 +05302467 return;
2468 }
2469
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002470 /* Delete FT session if there exists one */
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002471 lim_ft_cleanup_pre_auth_info(mac, pe_session);
2472 lim_cleanup_rx_path(mac, pStaDs, pe_session);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002473
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002474 lim_clean_up_disassoc_deauth_req(mac,
Srinivas Girigowda5f3c81a2016-01-04 21:47:19 -08002475 (char *)&smeDisassocCnf.peer_macaddr, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002476 }
2477
2478 return;
2479}
2480
2481/**
2482 * __lim_process_sme_deauth_req() - process sme deauth req
2483 * @mac_ctx: Pointer to Global MAC structure
2484 * @msg_buf: pointer to the SME message buffer
2485 *
2486 * This function is called to process SME_DEAUTH_REQ message
2487 * from HDD or upper layer application.
2488 *
2489 * Return: None
2490 */
2491
Jeff Johnson83d6c112018-12-02 13:05:00 -08002492static void __lim_process_sme_deauth_req(struct mac_context *mac_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002493 uint32_t *msg_buf)
2494{
2495 uint16_t deauth_trigger, reason_code;
2496 tLimMlmDeauthReq *mlm_deauth_req;
2497 tSirSmeDeauthReq sme_deauth_req;
2498 tSirResultCodes ret_code = eSIR_SME_SUCCESS;
Jeff Johnson209dfa02018-11-18 22:54:38 -08002499 struct pe_session *session_entry;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002500 uint8_t session_id; /* PE sessionId */
2501 uint8_t sme_session_id;
2502 uint16_t sme_transaction_id;
2503
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302504 qdf_mem_copy(&sme_deauth_req, msg_buf, sizeof(tSirSmeDeauthReq));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002505 sme_session_id = sme_deauth_req.sessionId;
2506 sme_transaction_id = sme_deauth_req.transactionId;
2507
2508 /*
2509 * We need to get a session first but we don't even know
2510 * if the message is correct.
2511 */
Srinivas Girigowda9efa10e2016-01-04 18:49:40 -08002512 session_entry = pe_find_session_by_bssid(mac_ctx,
2513 sme_deauth_req.bssid.bytes,
2514 &session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002515 if (session_entry == NULL) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002516 pe_err("session does not exist for given bssId");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002517 ret_code = eSIR_SME_INVALID_PARAMETERS;
2518 deauth_trigger = eLIM_HOST_DEAUTH;
2519 goto send_deauth;
2520 }
2521
2522 if (!lim_is_sme_deauth_req_valid(mac_ctx, &sme_deauth_req,
2523 session_entry)) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002524 pe_err("received invalid SME_DEAUTH_REQ message");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002525 mac_ctx->lim.gLimRspReqd = false;
2526
2527 ret_code = eSIR_SME_INVALID_PARAMETERS;
2528 deauth_trigger = eLIM_HOST_DEAUTH;
2529 goto send_deauth;
2530 }
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002531 pe_debug("received DEAUTH_REQ sessionid %d Systemrole %d reasoncode %u limSmestate %d from "
2532 MAC_ADDRESS_STR, sme_session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002533 GET_LIM_SYSTEM_ROLE(session_entry), sme_deauth_req.reasonCode,
2534 session_entry->limSmeState,
Srinivas Girigowda9efa10e2016-01-04 18:49:40 -08002535 MAC_ADDR_ARRAY(sme_deauth_req.peer_macaddr.bytes));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002536#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM /* FEATURE_WLAN_DIAG_SUPPORT */
2537 lim_diag_event_report(mac_ctx, WLAN_PE_DIAG_DEAUTH_REQ_EVENT,
2538 session_entry, 0, sme_deauth_req.reasonCode);
2539#endif /* FEATURE_WLAN_DIAG_SUPPORT */
2540
2541 /* Update SME session ID and Transaction ID */
2542 session_entry->smeSessionId = sme_session_id;
2543 session_entry->transactionId = sme_transaction_id;
2544
2545 switch (GET_LIM_SYSTEM_ROLE(session_entry)) {
2546 case eLIM_STA_ROLE:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002547 switch (session_entry->limSmeState) {
2548 case eLIM_SME_ASSOCIATED_STATE:
2549 case eLIM_SME_LINK_EST_STATE:
Ganesh Kondabattini9d3d3b12017-03-15 16:20:19 +05302550 /* Delete all TDLS peers connected before leaving BSS */
2551 lim_delete_tdls_peers(mac_ctx, session_entry);
Abhinav Kumarac12c762018-05-02 13:51:02 +05302552 /* fallthrough */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002553 case eLIM_SME_WT_ASSOC_STATE:
2554 case eLIM_SME_JOIN_FAILURE_STATE:
2555 case eLIM_SME_IDLE_STATE:
2556 session_entry->limPrevSmeState =
2557 session_entry->limSmeState;
2558 session_entry->limSmeState = eLIM_SME_WT_DEAUTH_STATE;
2559 MTRACE(mac_trace(mac_ctx, TRACE_CODE_SME_STATE,
2560 session_entry->peSessionId,
2561 session_entry->limSmeState));
2562 /* Send Deauthentication request to MLM below */
2563 break;
2564 case eLIM_SME_WT_DEAUTH_STATE:
2565 case eLIM_SME_WT_DISASSOC_STATE:
2566 /*
Jeff Johnson47d75242018-05-12 15:58:53 -07002567 * PE Received a Deauth/Disassoc frame. Normally it get
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002568 * DEAUTH_CNF/DISASSOC_CNF but it received DEAUTH_REQ.
2569 * Which means host is also trying to disconnect.
2570 * PE can continue processing DEAUTH_REQ and send
2571 * the response instead of failing the request.
2572 * SME will anyway ignore DEAUTH_IND/DISASSOC_IND that
2573 * was sent for deauth/disassoc frame.
2574 */
2575 session_entry->limSmeState = eLIM_SME_WT_DEAUTH_STATE;
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002576 pe_debug("Rcvd SME_DEAUTH_REQ while in SME_WT_DEAUTH_STATE");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002577 break;
2578 default:
2579 /*
2580 * STA is not in a state to deauthenticate with
2581 * peer. Log error and send response to host.
2582 */
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002583 pe_err("received unexp SME_DEAUTH_REQ in state %X",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002584 session_entry->limSmeState);
2585 lim_print_sme_state(mac_ctx, LOGE,
2586 session_entry->limSmeState);
2587
2588 if (mac_ctx->lim.gLimRspReqd) {
2589 mac_ctx->lim.gLimRspReqd = false;
2590
2591 ret_code = eSIR_SME_STA_NOT_AUTHENTICATED;
2592 deauth_trigger = eLIM_HOST_DEAUTH;
2593
wadesong42968e92017-06-08 14:11:21 +08002594 /*
2595 * here we received deauth request from AP so
2596 * sme state is eLIM_SME_WT_DEAUTH_STATE.if we
2597 * have ISSUED delSta then mlm state should be
2598 * eLIM_MLM_WT_DEL_STA_RSP_STATE and ifwe got
2599 * delBSS rsp then mlm state should be
2600 * eLIM_MLM_IDLE_STATE so the below condition
2601 * captures the state where delSta not done
2602 * and firmware still in connected state.
2603 */
2604 if (session_entry->limSmeState ==
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002605 eLIM_SME_WT_DEAUTH_STATE &&
2606 session_entry->limMlmState !=
2607 eLIM_MLM_IDLE_STATE &&
2608 session_entry->limMlmState !=
2609 eLIM_MLM_WT_DEL_STA_RSP_STATE)
wadesong42968e92017-06-08 14:11:21 +08002610 ret_code = eSIR_SME_DEAUTH_STATUS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002611 goto send_deauth;
2612 }
2613 return;
2614 }
2615 break;
2616
2617 case eLIM_STA_IN_IBSS_ROLE:
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002618 pe_err("Deauth not allowed in IBSS");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002619 if (mac_ctx->lim.gLimRspReqd) {
2620 mac_ctx->lim.gLimRspReqd = false;
2621 ret_code = eSIR_SME_INVALID_PARAMETERS;
2622 deauth_trigger = eLIM_HOST_DEAUTH;
2623 goto send_deauth;
2624 }
2625 return;
2626 case eLIM_AP_ROLE:
2627 break;
2628 default:
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002629 pe_err("received unexpected SME_DEAUTH_REQ for role %X",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002630 GET_LIM_SYSTEM_ROLE(session_entry));
2631 if (mac_ctx->lim.gLimRspReqd) {
2632 mac_ctx->lim.gLimRspReqd = false;
2633 ret_code = eSIR_SME_INVALID_PARAMETERS;
2634 deauth_trigger = eLIM_HOST_DEAUTH;
2635 goto send_deauth;
2636 }
2637 return;
2638 } /* end switch (mac_ctx->lim.gLimSystemRole) */
2639
Yu Ouyang57c25532018-09-07 17:14:01 +08002640 if (sme_deauth_req.reasonCode == eLIM_LINK_MONITORING_DEAUTH &&
2641 session_entry->limSystemRole == eLIM_STA_ROLE) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002642 /* Deauthentication is triggered by Link Monitoring */
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002643 pe_debug("** Lost link with AP **");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002644 deauth_trigger = eLIM_LINK_MONITORING_DEAUTH;
2645 reason_code = eSIR_MAC_UNSPEC_FAILURE_REASON;
2646 } else {
2647 deauth_trigger = eLIM_HOST_DEAUTH;
2648 reason_code = sme_deauth_req.reasonCode;
2649 }
2650
2651 /* Trigger Deauthentication frame to peer MAC entity */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302652 mlm_deauth_req = qdf_mem_malloc(sizeof(tLimMlmDeauthReq));
Arif Hussainf5b6c412018-10-10 19:41:09 -07002653 if (!mlm_deauth_req) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002654 if (mac_ctx->lim.gLimRspReqd) {
2655 mac_ctx->lim.gLimRspReqd = false;
2656 ret_code = eSIR_SME_RESOURCES_UNAVAILABLE;
2657 deauth_trigger = eLIM_HOST_DEAUTH;
2658 goto send_deauth;
2659 }
2660 return;
2661 }
2662
Anurag Chouhanc5548422016-02-24 18:33:27 +05302663 qdf_copy_macaddr(&mlm_deauth_req->peer_macaddr,
Srinivas Girigowda9efa10e2016-01-04 18:49:40 -08002664 &sme_deauth_req.peer_macaddr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002665
2666 mlm_deauth_req->reasonCode = reason_code;
2667 mlm_deauth_req->deauthTrigger = deauth_trigger;
2668
2669 /* Update PE session Id */
2670 mlm_deauth_req->sessionId = session_id;
Sandeep Puligilla30bb8402018-09-23 22:01:08 -07002671 lim_process_mlm_deauth_req(mac_ctx, (uint32_t *)mlm_deauth_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002672
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002673 return;
2674
2675send_deauth:
Srinivas Girigowda9efa10e2016-01-04 18:49:40 -08002676 lim_send_sme_deauth_ntf(mac_ctx, sme_deauth_req.peer_macaddr.bytes,
2677 ret_code, deauth_trigger, 1,
2678 sme_session_id, sme_transaction_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002679}
2680
2681/**
2682 * __lim_process_sme_set_context_req()
2683 *
2684 * @mac_ctx: Pointer to Global MAC structure
2685 * @msg_buf: pointer to the SME message buffer
2686 *
2687 * This function is called to process SME_SETCONTEXT_REQ message
2688 * from HDD or upper layer application.
2689 *
2690 * Return: None
2691 */
2692
2693static void
Jeff Johnson83d6c112018-12-02 13:05:00 -08002694__lim_process_sme_set_context_req(struct mac_context *mac_ctx, uint32_t *msg_buf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002695{
2696 tpSirSmeSetContextReq set_context_req;
2697 tLimMlmSetKeysReq *mlm_set_key_req;
Jeff Johnson209dfa02018-11-18 22:54:38 -08002698 struct pe_session *session_entry;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002699 uint8_t session_id; /* PE sessionID */
2700 uint8_t sme_session_id;
2701 uint16_t sme_transaction_id;
2702
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002703 if (msg_buf == NULL) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002704 pe_err("Buffer is Pointing to NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002705 return;
2706 }
2707
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302708 set_context_req = qdf_mem_malloc(sizeof(struct sSirSmeSetContextReq));
Arif Hussainf5b6c412018-10-10 19:41:09 -07002709 if (!set_context_req)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002710 return;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302711 qdf_mem_copy(set_context_req, msg_buf,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002712 sizeof(struct sSirSmeSetContextReq));
2713 sme_session_id = set_context_req->sessionId;
2714 sme_transaction_id = set_context_req->transactionId;
2715
2716 if ((!lim_is_sme_set_context_req_valid(mac_ctx, set_context_req))) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002717 pe_warn("received invalid SME_SETCONTEXT_REQ message");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002718 goto end;
2719 }
2720
2721 if (set_context_req->keyMaterial.numKeys >
2722 SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002723 pe_err("numKeys:%d is more than SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002724 set_context_req->keyMaterial.numKeys);
2725 lim_send_sme_set_context_rsp(mac_ctx,
Srinivas Girigowdad5965c42015-12-04 13:43:16 -08002726 set_context_req->peer_macaddr, 1,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002727 eSIR_SME_INVALID_PARAMETERS, NULL,
2728 sme_session_id, sme_transaction_id);
2729 goto end;
2730 }
2731
2732 session_entry = pe_find_session_by_bssid(mac_ctx,
Srinivas Girigowdad5965c42015-12-04 13:43:16 -08002733 set_context_req->bssid.bytes, &session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002734 if (session_entry == NULL) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002735 pe_err("Session does not exist for given BSSID");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002736 lim_send_sme_set_context_rsp(mac_ctx,
Srinivas Girigowdad5965c42015-12-04 13:43:16 -08002737 set_context_req->peer_macaddr, 1,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002738 eSIR_SME_INVALID_PARAMETERS, NULL,
2739 sme_session_id, sme_transaction_id);
2740 goto end;
2741 }
2742#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM /* FEATURE_WLAN_DIAG_SUPPORT */
2743 lim_diag_event_report(mac_ctx, WLAN_PE_DIAG_SETCONTEXT_REQ_EVENT,
2744 session_entry, 0, 0);
2745#endif /* FEATURE_WLAN_DIAG_SUPPORT */
2746
Rajeev Kumarc9a50e72016-04-15 15:18:42 -07002747 if ((LIM_IS_STA_ROLE(session_entry) &&
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002748 (session_entry->limSmeState == eLIM_SME_LINK_EST_STATE)) ||
2749 ((LIM_IS_IBSS_ROLE(session_entry) ||
Rajeev Kumarc9a50e72016-04-15 15:18:42 -07002750 LIM_IS_AP_ROLE(session_entry)) &&
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002751 (session_entry->limSmeState == eLIM_SME_NORMAL_STATE))) {
2752 /* Trigger MLM_SETKEYS_REQ */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302753 mlm_set_key_req = qdf_mem_malloc(sizeof(tLimMlmSetKeysReq));
Arif Hussainf5b6c412018-10-10 19:41:09 -07002754 if (!mlm_set_key_req)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002755 goto end;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002756 mlm_set_key_req->edType = set_context_req->keyMaterial.edType;
2757 mlm_set_key_req->numKeys =
2758 set_context_req->keyMaterial.numKeys;
2759 if (mlm_set_key_req->numKeys >
2760 SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002761 pe_err("no.of keys exceeded max num of default keys limit");
Jingxiang Ge4168a232018-01-03 18:47:15 +08002762 qdf_mem_free(mlm_set_key_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002763 goto end;
2764 }
Anurag Chouhanc5548422016-02-24 18:33:27 +05302765 qdf_copy_macaddr(&mlm_set_key_req->peer_macaddr,
Srinivas Girigowdad5965c42015-12-04 13:43:16 -08002766 &set_context_req->peer_macaddr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002767
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302768 qdf_mem_copy((uint8_t *) &mlm_set_key_req->key,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002769 (uint8_t *) &set_context_req->keyMaterial.key,
2770 sizeof(tSirKeys) *
2771 (mlm_set_key_req->numKeys ? mlm_set_key_req->
2772 numKeys : 1));
2773
2774 mlm_set_key_req->sessionId = session_id;
2775 mlm_set_key_req->smesessionId = sme_session_id;
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002776 pe_debug("received SETCONTEXT_REQ message sessionId=%d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002777 mlm_set_key_req->sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002778
2779 if (((set_context_req->keyMaterial.edType == eSIR_ED_WEP40) ||
2780 (set_context_req->keyMaterial.edType == eSIR_ED_WEP104)) &&
2781 LIM_IS_AP_ROLE(session_entry)) {
2782 if (set_context_req->keyMaterial.key[0].keyLength) {
2783 uint8_t key_id;
Srinivas Girigowda4d65ebe2017-10-13 21:41:42 -07002784
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002785 key_id =
2786 set_context_req->keyMaterial.key[0].keyId;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302787 qdf_mem_copy((uint8_t *)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002788 &session_entry->WEPKeyMaterial[key_id],
2789 (uint8_t *) &set_context_req->keyMaterial,
2790 sizeof(tSirKeyMaterial));
2791 } else {
2792 uint32_t i;
Srinivas Girigowda4d65ebe2017-10-13 21:41:42 -07002793
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002794 for (i = 0; i < SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS;
2795 i++) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302796 qdf_mem_copy((uint8_t *)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002797 &mlm_set_key_req->key[i],
2798 (uint8_t *)session_entry->WEPKeyMaterial[i].key,
2799 sizeof(tSirKeys));
2800 }
2801 }
2802 }
2803 lim_post_mlm_message(mac_ctx, LIM_MLM_SETKEYS_REQ,
2804 (uint32_t *) mlm_set_key_req);
2805 } else {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002806 pe_err("rcvd unexpected SME_SETCONTEXT_REQ for role %d, state=%X",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002807 GET_LIM_SYSTEM_ROLE(session_entry),
2808 session_entry->limSmeState);
2809 lim_print_sme_state(mac_ctx, LOGE, session_entry->limSmeState);
2810
2811 lim_send_sme_set_context_rsp(mac_ctx,
Srinivas Girigowdad5965c42015-12-04 13:43:16 -08002812 set_context_req->peer_macaddr, 1,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002813 eSIR_SME_UNEXPECTED_REQ_RESULT_CODE,
2814 session_entry, sme_session_id,
2815 sme_transaction_id);
2816 }
2817end:
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302818 qdf_mem_free(set_context_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002819 return;
2820}
2821
2822/**
2823 * lim_process_sme_get_assoc_sta_info() - process sme assoc sta req
2824 *
2825 * @mac_ctx: Pointer to Global MAC structure
2826 * @msg_buf: pointer to the SME message buffer
2827 *
2828 * This function is called to process SME_GET_ASSOC_STAS_REQ message
2829 * from HDD or upper layer application.
2830 *
2831 * Return: None
2832 */
2833
Jeff Johnson83d6c112018-12-02 13:05:00 -08002834static void lim_process_sme_get_assoc_sta_info(struct mac_context *mac_ctx,
Jeff Johnson801f1532016-10-07 07:54:50 -07002835 uint32_t *msg_buf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002836{
2837 tSirSmeGetAssocSTAsReq get_assoc_stas_req;
2838 tpDphHashNode sta_ds = NULL;
Jeff Johnson209dfa02018-11-18 22:54:38 -08002839 struct pe_session *session_entry = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002840 tSap_Event sap_event;
2841 tpWLAN_SAPEventCB sap_event_cb = NULL;
2842 tpSap_AssocMacAddr assoc_sta_tmp = NULL;
2843 uint8_t session_id = CSR_SESSION_ID_INVALID;
2844 uint8_t assoc_id = 0;
2845 uint8_t sta_cnt = 0;
2846
2847 if (msg_buf == NULL) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002848 pe_err("Buffer is Pointing to NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002849 return;
2850 }
2851
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302852 qdf_mem_copy(&get_assoc_stas_req, msg_buf,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002853 sizeof(struct sSirSmeGetAssocSTAsReq));
2854 /*
2855 * Get Associated stations from PE.
2856 * Find PE session Entry
2857 */
2858 session_entry = pe_find_session_by_bssid(mac_ctx,
Srinivas Girigowda61de4bb2015-11-25 15:46:41 -08002859 get_assoc_stas_req.bssid.bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002860 &session_id);
2861 if (session_entry == NULL) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002862 pe_err("session does not exist for given bssId");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002863 goto lim_assoc_sta_end;
2864 }
2865
2866 if (!LIM_IS_AP_ROLE(session_entry)) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002867 pe_err("Received unexpected message in state %X, in role %X",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002868 session_entry->limSmeState,
2869 GET_LIM_SYSTEM_ROLE(session_entry));
2870 goto lim_assoc_sta_end;
2871 }
2872 /* Retrieve values obtained in the request message */
2873 sap_event_cb = (tpWLAN_SAPEventCB)get_assoc_stas_req.pSapEventCallback;
2874 assoc_sta_tmp = (tpSap_AssocMacAddr)get_assoc_stas_req.pAssocStasArray;
2875
2876 if (NULL == assoc_sta_tmp)
2877 goto lim_assoc_sta_end;
2878 for (assoc_id = 0; assoc_id < session_entry->dph.dphHashTable.size;
2879 assoc_id++) {
2880 sta_ds = dph_get_hash_entry(mac_ctx, assoc_id,
2881 &session_entry->dph.dphHashTable);
2882 if (NULL == sta_ds)
2883 continue;
2884 if (sta_ds->valid) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302885 qdf_mem_copy((uint8_t *) &assoc_sta_tmp->staMac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002886 (uint8_t *) &sta_ds->staAddr,
Anurag Chouhan6d760662016-02-20 16:05:43 +05302887 QDF_MAC_ADDR_SIZE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002888 assoc_sta_tmp->assocId = (uint8_t) sta_ds->assocId;
2889 assoc_sta_tmp->staId = (uint8_t) sta_ds->staIndex;
2890
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302891 qdf_mem_copy((uint8_t *)&assoc_sta_tmp->supportedRates,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002892 (uint8_t *)&sta_ds->supportedRates,
2893 sizeof(tSirSupportedRates));
2894 assoc_sta_tmp->ShortGI40Mhz = sta_ds->htShortGI40Mhz;
2895 assoc_sta_tmp->ShortGI20Mhz = sta_ds->htShortGI20Mhz;
2896 assoc_sta_tmp->Support40Mhz =
2897 sta_ds->htDsssCckRate40MHzSupport;
2898
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002899 pe_debug("dph Station Number = %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002900 sta_cnt + 1);
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002901 pe_debug("MAC = " MAC_ADDRESS_STR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002902 MAC_ADDR_ARRAY(sta_ds->staAddr));
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002903 pe_debug("Association Id: %d Station Index: %d",
2904 sta_ds->assocId, sta_ds->staIndex);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002905 assoc_sta_tmp++;
2906 sta_cnt++;
2907 }
2908 }
2909lim_assoc_sta_end:
2910 /*
2911 * Call hdd callback with sap event to send the list of
2912 * associated stations from PE
2913 */
2914 if (sap_event_cb != NULL) {
2915 sap_event.sapHddEventCode = eSAP_ASSOC_STA_CALLBACK_EVENT;
2916 sap_event.sapevt.sapAssocStaListEvent.module =
Anurag Chouhan6d760662016-02-20 16:05:43 +05302917 QDF_MODULE_ID_PE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002918 sap_event.sapevt.sapAssocStaListEvent.noOfAssocSta = sta_cnt;
2919 sap_event.sapevt.sapAssocStaListEvent.pAssocStas =
2920 (tpSap_AssocMacAddr)get_assoc_stas_req.pAssocStasArray;
2921 sap_event_cb(&sap_event, get_assoc_stas_req.pUsrContext);
2922 }
2923}
2924
2925/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002926 * __lim_counter_measures()
2927 *
2928 * FUNCTION:
2929 * This function is called to "implement" MIC counter measure
2930 * and is *temporary* only
2931 *
2932 * LOGIC: on AP, disassoc all STA associated thru TKIP,
2933 * we don't do the proper STA disassoc sequence since the
Jeff Johnsond460e842018-05-11 13:25:53 -07002934 * BSS will be stopped anyway
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002935 *
2936 ***ASSUMPTIONS:
2937 *
2938 ***NOTE:
2939 *
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002940 * @param mac Pointer to Global MAC structure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002941 * @return None
2942 */
2943
Jeff Johnson83d6c112018-12-02 13:05:00 -08002944static void __lim_counter_measures(struct mac_context *mac, struct pe_session *pe_session)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002945{
Jeff Johnson2b511902018-11-20 09:40:23 -08002946 tSirMacAddr mac_addr = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
Srinivas Girigowda4d65ebe2017-10-13 21:41:42 -07002947
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002948 if (LIM_IS_AP_ROLE(pe_session))
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002949 lim_send_disassoc_mgmt_frame(mac, eSIR_MAC_MIC_FAILURE_REASON,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002950 mac_addr, pe_session, false);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002951};
2952
Jeff Johnson83d6c112018-12-02 13:05:00 -08002953void lim_send_stop_bss_failure_resp(struct mac_context *mac_ctx,
Jeff Johnson209dfa02018-11-18 22:54:38 -08002954 struct pe_session *session)
Abhishek Singh2904a6a2018-08-30 17:45:59 +05302955{
2956 session->limSmeState = session->limPrevSmeState;
2957
2958 MTRACE(mac_trace(mac_ctx, TRACE_CODE_SME_STATE, session->peSessionId,
2959 session->limSmeState));
2960
2961 lim_send_sme_rsp(mac_ctx, eWNI_SME_STOP_BSS_RSP,
2962 eSIR_SME_STOP_BSS_FAILURE, session->smeSessionId,
2963 session->transactionId);
2964}
2965
Jeff Johnson209dfa02018-11-18 22:54:38 -08002966void lim_delete_all_peers(struct pe_session *session)
Abhishek Singh2904a6a2018-08-30 17:45:59 +05302967{
2968 uint8_t i = 0;
Jeff Johnson83d6c112018-12-02 13:05:00 -08002969 struct mac_context *mac_ctx = session->mac_ctx;
Abhishek Singh2904a6a2018-08-30 17:45:59 +05302970 tpDphHashNode sta_ds = NULL;
2971 QDF_STATUS status;
2972
2973 for (i = 1; i < session->dph.dphHashTable.size; i++) {
2974 sta_ds = dph_get_hash_entry(mac_ctx, i,
2975 &session->dph.dphHashTable);
2976 if (!sta_ds)
2977 continue;
2978 status = lim_del_sta(mac_ctx, sta_ds, false, session);
2979 if (QDF_STATUS_SUCCESS == status) {
2980 lim_delete_dph_hash_entry(mac_ctx, sta_ds->staAddr,
2981 sta_ds->assocId, session);
2982 lim_release_peer_idx(mac_ctx, sta_ds->assocId, session);
2983 } else {
2984 pe_err("lim_del_sta failed with Status: %d", status);
2985 QDF_ASSERT(0);
2986 }
2987 }
Abhishek Singhcaa61852018-09-12 15:50:04 +05302988
2989#ifdef CONFIG_VDEV_SM
2990 status =
2991 wlan_vdev_mlme_sm_deliver_evt(session->vdev,
2992 WLAN_VDEV_SM_EV_DISCONNECT_COMPLETE,
2993 sizeof(*session), session);
2994 if (QDF_IS_STATUS_ERROR(status)) {
2995 pe_err("failed to post WLAN_VDEV_SM_EV_DISCONNECT_COMPLETE for vdevid %d",
2996 session->smeSessionId);
2997 lim_send_stop_bss_failure_resp(mac_ctx, session);
2998 }
2999#endif
3000
Abhishek Singh2904a6a2018-08-30 17:45:59 +05303001}
3002
Jeff Johnson209dfa02018-11-18 22:54:38 -08003003QDF_STATUS lim_sta_send_del_bss(struct pe_session *session)
Sandeep Puligilla30bb8402018-09-23 22:01:08 -07003004{
Jeff Johnson83d6c112018-12-02 13:05:00 -08003005 struct mac_context *mac_ctx = session->mac_ctx;
Sandeep Puligilla30bb8402018-09-23 22:01:08 -07003006 QDF_STATUS status = QDF_STATUS_E_FAILURE;
3007 tpDphHashNode sta_ds = NULL;
3008
3009 sta_ds = dph_get_hash_entry(mac_ctx, DPH_STA_HASH_INDEX_PEER,
3010 &session->dph.dphHashTable);
3011 if (!sta_ds) {
3012 pe_err("DPH Entry for STA is missing, failed to send delbss");
3013 goto end;
3014 }
3015
3016 status = lim_del_bss(mac_ctx, sta_ds, 0, session);
3017 if (QDF_IS_STATUS_ERROR(status))
3018 pe_err("delBss failed for bss %d", session->bssIdx);
3019
3020end:
3021 return status;
3022}
3023
Jeff Johnson209dfa02018-11-18 22:54:38 -08003024QDF_STATUS lim_send_vdev_stop(struct pe_session *session)
Abhishek Singh2904a6a2018-08-30 17:45:59 +05303025{
Jeff Johnson83d6c112018-12-02 13:05:00 -08003026 struct mac_context *mac_ctx = session->mac_ctx;
Abhishek Singh2904a6a2018-08-30 17:45:59 +05303027 QDF_STATUS status;
3028
3029 status = lim_del_bss(mac_ctx, NULL, session->bssIdx, session);
3030
3031 if (QDF_IS_STATUS_ERROR(status)) {
3032 pe_err("delBss failed for bss %d", session->bssIdx);
3033 lim_send_stop_bss_failure_resp(mac_ctx, session);
3034 }
Abhishek Singhcaa61852018-09-12 15:50:04 +05303035
3036 return status;
Abhishek Singh2904a6a2018-08-30 17:45:59 +05303037}
3038
3039/**
3040 * lim_delete_peers_and_send_vdev_stop() -delete peers and send vdev stop
3041 * @session: session pointer
3042 *
3043 * Return None
3044 */
Abhishek Singhcaa61852018-09-12 15:50:04 +05303045#ifdef CONFIG_VDEV_SM
Jeff Johnson209dfa02018-11-18 22:54:38 -08003046static void lim_delete_peers_and_send_vdev_stop(struct pe_session *session)
Abhishek Singhcaa61852018-09-12 15:50:04 +05303047{
Jeff Johnson83d6c112018-12-02 13:05:00 -08003048 struct mac_context *mac_ctx = session->mac_ctx;
Abhishek Singhcaa61852018-09-12 15:50:04 +05303049 QDF_STATUS status;
3050
Abhishek Singhc5a54082018-09-12 16:08:03 +05303051 if (wlan_vdev_mlme_get_substate(session->vdev) ==
3052 WLAN_VDEV_SS_START_RESTART_PROGRESS)
3053 status =
3054 wlan_vdev_mlme_sm_deliver_evt(session->vdev,
3055 WLAN_VDEV_SM_EV_RESTART_REQ_FAIL,
Abhishek Singhcaa61852018-09-12 15:50:04 +05303056 sizeof(*session), session);
Abhishek Singhc5a54082018-09-12 16:08:03 +05303057 else
3058 status = wlan_vdev_mlme_sm_deliver_evt(session->vdev,
3059 WLAN_VDEV_SM_EV_DOWN,
3060 sizeof(*session),
3061 session);
Abhishek Singhcaa61852018-09-12 15:50:04 +05303062 if (QDF_IS_STATUS_ERROR(status)) {
3063 pe_err("failed to post WLAN_VDEV_SM_EV_DOWN for vdevid %d",
3064 session->smeSessionId);
3065 lim_send_stop_bss_failure_resp(mac_ctx, session);
3066 }
3067}
3068#else
Jeff Johnson209dfa02018-11-18 22:54:38 -08003069static void lim_delete_peers_and_send_vdev_stop(struct pe_session *session)
Abhishek Singh2904a6a2018-08-30 17:45:59 +05303070{
3071 lim_delete_all_peers(session);
3072 /* send a delBss to HAL and wait for a response */
3073 lim_send_vdev_stop(session);
3074}
Abhishek Singhcaa61852018-09-12 15:50:04 +05303075#endif
3076
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003077static void
Jeff Johnson83d6c112018-12-02 13:05:00 -08003078__lim_handle_sme_stop_bss_request(struct mac_context *mac, uint32_t *pMsgBuf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003079{
3080 tSirSmeStopBssReq stopBssReq;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003081 tLimSmeStates prevState;
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003082 struct pe_session *pe_session;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003083 uint8_t smesessionId;
3084 uint8_t sessionId;
3085 uint16_t smetransactionId;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003086
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303087 qdf_mem_copy(&stopBssReq, pMsgBuf, sizeof(tSirSmeStopBssReq));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003088 smesessionId = stopBssReq.sessionId;
3089 smetransactionId = stopBssReq.transactionId;
3090
3091 if (!lim_is_sme_stop_bss_req_valid(pMsgBuf)) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003092 pe_warn("received invalid SME_STOP_BSS_REQ message");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003093 /* Send Stop BSS response to host */
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003094 lim_send_sme_rsp(mac, eWNI_SME_STOP_BSS_RSP,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003095 eSIR_SME_INVALID_PARAMETERS, smesessionId,
3096 smetransactionId);
3097 return;
3098 }
3099
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003100 pe_session = pe_find_session_by_bssid(mac,
Srinivas Girigowdaa2302652016-01-04 14:32:25 -08003101 stopBssReq.bssid.bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003102 &sessionId);
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003103 if (pe_session == NULL) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003104 pe_err("session does not exist for given BSSID");
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003105 lim_send_sme_rsp(mac, eWNI_SME_STOP_BSS_RSP,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003106 eSIR_SME_INVALID_PARAMETERS, smesessionId,
3107 smetransactionId);
3108 return;
3109 }
3110#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM /* FEATURE_WLAN_DIAG_SUPPORT */
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003111 lim_diag_event_report(mac, WLAN_PE_DIAG_STOP_BSS_REQ_EVENT, pe_session,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003112 0, 0);
3113#endif /* FEATURE_WLAN_DIAG_SUPPORT */
3114
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003115 if (pe_session->limSmeState != eLIM_SME_NORMAL_STATE || /* Added For BT -AMP Support */
3116 LIM_IS_STA_ROLE(pe_session)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003117 /**
3118 * Should not have received STOP_BSS_REQ in states
3119 * other than 'normal' state or on STA in Infrastructure
3120 * mode. Log error and return response to host.
3121 */
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003122 pe_err("received unexpected SME_STOP_BSS_REQ in state %X, for role %d",
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003123 pe_session->limSmeState,
3124 GET_LIM_SYSTEM_ROLE(pe_session));
3125 lim_print_sme_state(mac, LOGE, pe_session->limSmeState);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003126 /* / Send Stop BSS response to host */
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003127 lim_send_sme_rsp(mac, eWNI_SME_STOP_BSS_RSP,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003128 eSIR_SME_UNEXPECTED_REQ_RESULT_CODE, smesessionId,
3129 smetransactionId);
3130 return;
3131 }
3132
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003133 if (LIM_IS_AP_ROLE(pe_session))
3134 lim_wpspbc_close(mac, pe_session);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003135
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003136 pe_debug("RECEIVED STOP_BSS_REQ with reason code=%d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003137 stopBssReq.reasonCode);
3138
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003139 prevState = pe_session->limSmeState;
3140 pe_session->limPrevSmeState = prevState;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003141
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003142 pe_session->limSmeState = eLIM_SME_IDLE_STATE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003143 MTRACE(mac_trace
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003144 (mac, TRACE_CODE_SME_STATE, pe_session->peSessionId,
3145 pe_session->limSmeState));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003146
3147 /* Update SME session Id and Transaction Id */
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003148 pe_session->smeSessionId = smesessionId;
3149 pe_session->transactionId = smetransactionId;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003150
Deepak Dhamdhere13983f22016-05-31 19:06:09 -07003151 /* STA_IN_IBSS and NDI should NOT send Disassoc frame */
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003152 if (!LIM_IS_IBSS_ROLE(pe_session) &&
3153 !LIM_IS_NDI_ROLE(pe_session)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003154 tSirMacAddr bcAddr = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
Srinivas Girigowda4d65ebe2017-10-13 21:41:42 -07003155
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003156 if (stopBssReq.reasonCode == eSIR_SME_MIC_COUNTER_MEASURES)
3157 /* Send disassoc all stations associated thru TKIP */
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003158 __lim_counter_measures(mac, pe_session);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003159 else
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003160 lim_send_disassoc_mgmt_frame(mac,
Deepak Dhamdhere13983f22016-05-31 19:06:09 -07003161 eSIR_MAC_DEAUTH_LEAVING_BSS_REASON,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003162 bcAddr, pe_session, false);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003163 }
3164
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003165 if (!LIM_IS_NDI_ROLE(pe_session)) {
Deepak Dhamdhere13983f22016-05-31 19:06:09 -07003166 /* Free the buffer allocated in START_BSS_REQ */
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003167 qdf_mem_free(pe_session->addIeParams.probeRespData_buff);
3168 pe_session->addIeParams.probeRespDataLen = 0;
3169 pe_session->addIeParams.probeRespData_buff = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003170
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003171 qdf_mem_free(pe_session->addIeParams.assocRespData_buff);
3172 pe_session->addIeParams.assocRespDataLen = 0;
3173 pe_session->addIeParams.assocRespData_buff = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003174
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003175 qdf_mem_free(pe_session->addIeParams.probeRespBCNData_buff);
3176 pe_session->addIeParams.probeRespBCNDataLen = 0;
3177 pe_session->addIeParams.probeRespBCNData_buff = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003178
Deepak Dhamdhere13983f22016-05-31 19:06:09 -07003179 /*
3180 * lim_del_bss is also called as part of coalescing,
3181 * when we send DEL BSS followed by Add Bss msg.
3182 */
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003183 mac->lim.gLimIbssCoalescingHappened = false;
Deepak Dhamdhere13983f22016-05-31 19:06:09 -07003184 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003185
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003186 lim_delete_peers_and_send_vdev_stop(pe_session);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003187
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003188}
3189
3190/**
3191 * __lim_process_sme_stop_bss_req() - Process STOP_BSS from SME
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003192 * @mac: Global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003193 * @pMsg: Message from SME
3194 *
3195 * Wrapper for the function __lim_handle_sme_stop_bss_request
3196 * This message will be defered until softmac come out of
3197 * scan mode. Message should be handled even if we have
3198 * detected radar in the current operating channel.
3199 *
3200 * Return: true - If we consumed the buffer
3201 * false - If have defered the message.
3202 */
3203
Jeff Johnson83d6c112018-12-02 13:05:00 -08003204static bool __lim_process_sme_stop_bss_req(struct mac_context *mac,
Rajeev Kumarfeb96382017-01-22 19:42:09 -08003205 struct scheduler_msg *pMsg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003206{
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003207 if (__lim_is_defered_msg_for_learn(mac, pMsg)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003208 /**
3209 * If message defered, buffer is not consumed yet.
3210 * So return false
3211 */
3212 return false;
3213 }
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003214 __lim_handle_sme_stop_bss_request(mac, (uint32_t *) pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003215 return true;
3216} /*** end __lim_process_sme_stop_bss_req() ***/
3217
Jeff Johnson83d6c112018-12-02 13:05:00 -08003218void lim_process_sme_del_bss_rsp(struct mac_context *mac,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003219 uint32_t body, struct pe_session *pe_session)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003220{
3221
3222 (void)body;
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003223 SET_LIM_PROCESS_DEFD_MESGS(mac, true);
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003224 lim_ibss_delete(mac, pe_session);
3225 dph_hash_table_class_init(mac, &pe_session->dph.dphHashTable);
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003226 lim_delete_pre_auth_list(mac);
3227 lim_send_sme_rsp(mac, eWNI_SME_STOP_BSS_RSP, eSIR_SME_SUCCESS,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003228 pe_session->smeSessionId,
3229 pe_session->transactionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003230 return;
3231}
3232
3233/**
3234 * __lim_process_sme_assoc_cnf_new() - process sme assoc/reassoc cnf
3235 *
3236 * @mac_ctx: pointer to mac context
3237 * @msg_type: message type
3238 * @msg_buf: pointer to the SME message buffer
3239 *
3240 * This function handles SME_ASSOC_CNF/SME_REASSOC_CNF
3241 * in BTAMP AP.
3242 *
3243 * Return: None
3244 */
3245
Jeff Johnson83d6c112018-12-02 13:05:00 -08003246void __lim_process_sme_assoc_cnf_new(struct mac_context *mac_ctx, uint32_t msg_type,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003247 uint32_t *msg_buf)
3248{
3249 tSirSmeAssocCnf assoc_cnf;
3250 tpDphHashNode sta_ds = NULL;
Jeff Johnson209dfa02018-11-18 22:54:38 -08003251 struct pe_session *session_entry = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003252 uint8_t session_id;
3253 tpSirAssocReq assoc_req;
3254
3255 if (msg_buf == NULL) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003256 pe_err("msg_buf is NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003257 goto end;
3258 }
3259
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303260 qdf_mem_copy(&assoc_cnf, msg_buf, sizeof(struct sSirSmeAssocCnf));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003261 if (!__lim_is_sme_assoc_cnf_valid(&assoc_cnf)) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003262 pe_err("Received invalid SME_RE(ASSOC)_CNF message");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003263 goto end;
3264 }
3265
Srinivas Girigowdafb796d12016-01-05 23:04:28 -08003266 session_entry = pe_find_session_by_bssid(mac_ctx, assoc_cnf.bssid.bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003267 &session_id);
3268 if (session_entry == NULL) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003269 pe_err("session does not exist for given bssId");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003270 goto end;
3271 }
3272
Rajeev Kumarc9a50e72016-04-15 15:18:42 -07003273 if ((!LIM_IS_AP_ROLE(session_entry)) ||
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003274 ((session_entry->limSmeState != eLIM_SME_NORMAL_STATE) &&
3275 (session_entry->limSmeState !=
3276 eLIM_SME_NORMAL_CHANNEL_SCAN_STATE))) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003277 pe_err("Rcvd unexpected msg %X in state %X, in role %X",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003278 msg_type, session_entry->limSmeState,
3279 GET_LIM_SYSTEM_ROLE(session_entry));
3280 goto end;
3281 }
3282 sta_ds = dph_get_hash_entry(mac_ctx, assoc_cnf.aid,
3283 &session_entry->dph.dphHashTable);
3284 if (sta_ds == NULL) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003285 pe_err("Rcvd invalid msg %X due to no STA ctx, aid %d, peer",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003286 msg_type, assoc_cnf.aid);
Abhishek Singh5d8d7332017-08-10 15:15:24 +05303287 lim_print_mac_addr(mac_ctx, assoc_cnf.peer_macaddr.bytes, LOGE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003288
3289 /*
3290 * send a DISASSOC_IND message to WSM to make sure
3291 * the state in WSM and LIM is the same
3292 */
Srinivas Girigowdafb796d12016-01-05 23:04:28 -08003293 lim_send_sme_disassoc_ntf(mac_ctx, assoc_cnf.peer_macaddr.bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003294 eSIR_SME_STA_NOT_ASSOCIATED,
3295 eLIM_PEER_ENTITY_DISASSOC, assoc_cnf.aid,
3296 session_entry->smeSessionId,
3297 session_entry->transactionId,
3298 session_entry);
3299 goto end;
3300 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303301 if (qdf_mem_cmp((uint8_t *)sta_ds->staAddr,
Srinivas Girigowdafb796d12016-01-05 23:04:28 -08003302 (uint8_t *) assoc_cnf.peer_macaddr.bytes,
Anurag Chouhan6d760662016-02-20 16:05:43 +05303303 QDF_MAC_ADDR_SIZE)) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003304 pe_debug("peerMacAddr mismatched for aid %d, peer ",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003305 assoc_cnf.aid);
Abhishek Singh5d8d7332017-08-10 15:15:24 +05303306 lim_print_mac_addr(mac_ctx, assoc_cnf.peer_macaddr.bytes, LOGD);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003307 goto end;
3308 }
3309
3310 if ((sta_ds->mlmStaContext.mlmState != eLIM_MLM_WT_ASSOC_CNF_STATE) ||
3311 ((sta_ds->mlmStaContext.subType == LIM_ASSOC) &&
3312 (msg_type != eWNI_SME_ASSOC_CNF)) ||
3313 ((sta_ds->mlmStaContext.subType == LIM_REASSOC) &&
3314 (msg_type != eWNI_SME_ASSOC_CNF))) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003315 pe_debug("not in MLM_WT_ASSOC_CNF_STATE, for aid %d, peer"
3316 "StaD mlmState: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003317 assoc_cnf.aid, sta_ds->mlmStaContext.mlmState);
Abhishek Singh5d8d7332017-08-10 15:15:24 +05303318 lim_print_mac_addr(mac_ctx, assoc_cnf.peer_macaddr.bytes, LOGD);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003319 goto end;
3320 }
3321 /*
3322 * Deactivate/delet CNF_WAIT timer since ASSOC_CNF
3323 * has been received
3324 */
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003325 pe_debug("Received SME_ASSOC_CNF. Delete Timer");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003326 lim_deactivate_and_change_per_sta_id_timer(mac_ctx,
3327 eLIM_CNF_WAIT_TIMER, sta_ds->assocId);
3328
3329 if (assoc_cnf.statusCode == eSIR_SME_SUCCESS) {
3330 /*
3331 * In BTAMP-AP, PE already finished the WMA_ADD_STA sequence
3332 * when it had received Assoc Request frame. Now, PE just needs
3333 * to send association rsp frame to the requesting BTAMP-STA.
3334 */
3335 sta_ds->mlmStaContext.mlmState =
3336 eLIM_MLM_LINK_ESTABLISHED_STATE;
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003337 pe_debug("sending Assoc Rsp frame to STA (assoc id=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003338 sta_ds->assocId);
Jeff Johnson0301ecb2018-06-29 09:36:23 -07003339 lim_send_assoc_rsp_mgmt_frame(mac_ctx, QDF_STATUS_SUCCESS,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003340 sta_ds->assocId, sta_ds->staAddr,
3341 sta_ds->mlmStaContext.subType, sta_ds,
3342 session_entry);
3343 goto end;
3344 } else {
3345 /*
3346 * SME_ASSOC_CNF status is non-success, so STA is not allowed
3347 * to be associated since the HAL sta entry is created for
3348 * denied STA we need to remove this HAL entry.
3349 * So to do that set updateContext to 1
3350 */
3351 if (!sta_ds->mlmStaContext.updateContext)
3352 sta_ds->mlmStaContext.updateContext = 1;
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003353 pe_debug("Recv Assoc Cnf, status Code : %d(assoc id=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003354 assoc_cnf.statusCode, sta_ds->assocId);
3355 lim_reject_association(mac_ctx, sta_ds->staAddr,
3356 sta_ds->mlmStaContext.subType,
3357 true, sta_ds->mlmStaContext.authType,
3358 sta_ds->assocId, true,
Sandeep Puligillaa9de16b2017-09-25 16:25:04 -07003359 eSIR_MAC_UNSPEC_FAILURE_STATUS,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003360 session_entry);
3361 }
3362end:
3363 if (((session_entry != NULL) && (sta_ds != NULL)) &&
3364 (session_entry->parsedAssocReq[sta_ds->assocId] != NULL)) {
3365 assoc_req = (tpSirAssocReq)
3366 session_entry->parsedAssocReq[sta_ds->assocId];
3367 if (assoc_req->assocReqFrame) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303368 qdf_mem_free(assoc_req->assocReqFrame);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003369 assoc_req->assocReqFrame = NULL;
3370 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303371 qdf_mem_free(session_entry->parsedAssocReq[sta_ds->assocId]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003372 session_entry->parsedAssocReq[sta_ds->assocId] = NULL;
3373 }
3374}
3375
Jeff Johnson83d6c112018-12-02 13:05:00 -08003376static void __lim_process_sme_addts_req(struct mac_context *mac, uint32_t *pMsgBuf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003377{
3378 tpDphHashNode pStaDs;
3379 tSirMacAddr peerMac;
3380 tpSirAddtsReq pSirAddts;
3381 uint32_t timeout;
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003382 struct pe_session *pe_session;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003383 uint8_t sessionId; /* PE sessionId */
3384 uint8_t smesessionId;
3385 uint16_t smetransactionId;
3386
3387 if (pMsgBuf == NULL) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003388 pe_err("Buffer is Pointing to NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003389 return;
3390 }
3391
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003392 lim_get_session_info(mac, (uint8_t *) pMsgBuf, &smesessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003393 &smetransactionId);
3394
3395 pSirAddts = (tpSirAddtsReq) pMsgBuf;
3396
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003397 pe_session = pe_find_session_by_bssid(mac, pSirAddts->bssid.bytes,
Srinivas Girigowdaaeb33322015-12-04 10:54:07 -08003398 &sessionId);
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003399 if (pe_session == NULL) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003400 pe_err("Session Does not exist for given bssId");
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003401 lim_send_sme_addts_rsp(mac, pSirAddts->rspReqd, QDF_STATUS_E_FAILURE,
yeshwanth sriram guntuka8fa6fa32017-03-23 13:59:22 +05303402 NULL, pSirAddts->req.tspec,
3403 smesessionId, smetransactionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003404 return;
3405 }
3406#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM /* FEATURE_WLAN_DIAG_SUPPORT */
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003407 lim_diag_event_report(mac, WLAN_PE_DIAG_ADDTS_REQ_EVENT, pe_session, 0,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003408 0);
3409#endif /* FEATURE_WLAN_DIAG_SUPPORT */
3410
3411 /* if sta
3412 * - verify assoc state
3413 * - send addts request to ap
3414 * - wait for addts response from ap
3415 * if ap, just ignore with error log
3416 */
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003417 pe_debug("Received SME_ADDTS_REQ (TSid %d, UP %d)",
3418 pSirAddts->req.tspec.tsinfo.traffic.tsid,
3419 pSirAddts->req.tspec.tsinfo.traffic.userPrio);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003420
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003421 if (!LIM_IS_STA_ROLE(pe_session)) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003422 pe_err("AddTs received on AP - ignoring");
Sreelakshmi Konamki2972b6e2017-07-17 12:10:36 +05303423 goto send_failure_addts_rsp;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003424 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003425
3426 pStaDs =
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003427 dph_get_hash_entry(mac, DPH_STA_HASH_INDEX_PEER,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003428 &pe_session->dph.dphHashTable);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003429
3430 if (pStaDs == NULL) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003431 pe_err("Cannot find AP context for addts req");
Sreelakshmi Konamki2972b6e2017-07-17 12:10:36 +05303432 goto send_failure_addts_rsp;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003433 }
3434
3435 if ((!pStaDs->valid) || (pStaDs->mlmStaContext.mlmState !=
3436 eLIM_MLM_LINK_ESTABLISHED_STATE)) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003437 pe_err("AddTs received in invalid MLM state");
Sreelakshmi Konamki2972b6e2017-07-17 12:10:36 +05303438 goto send_failure_addts_rsp;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003439 }
3440
3441 pSirAddts->req.wsmTspecPresent = 0;
3442 pSirAddts->req.wmeTspecPresent = 0;
3443 pSirAddts->req.lleTspecPresent = 0;
3444
3445 if ((pStaDs->wsmEnabled) &&
3446 (pSirAddts->req.tspec.tsinfo.traffic.accessPolicy !=
3447 SIR_MAC_ACCESSPOLICY_EDCA))
3448 pSirAddts->req.wsmTspecPresent = 1;
3449 else if (pStaDs->wmeEnabled)
3450 pSirAddts->req.wmeTspecPresent = 1;
3451 else if (pStaDs->lleEnabled)
3452 pSirAddts->req.lleTspecPresent = 1;
3453 else {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003454 pe_warn("ADDTS_REQ ignore - qos is disabled");
Sreelakshmi Konamki2972b6e2017-07-17 12:10:36 +05303455 goto send_failure_addts_rsp;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003456 }
3457
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003458 if ((pe_session->limSmeState != eLIM_SME_ASSOCIATED_STATE) &&
3459 (pe_session->limSmeState != eLIM_SME_LINK_EST_STATE)) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003460 pe_err("AddTs received in invalid LIMsme state (%d)",
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003461 pe_session->limSmeState);
Sreelakshmi Konamki2972b6e2017-07-17 12:10:36 +05303462 goto send_failure_addts_rsp;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003463 }
3464
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003465 if (mac->lim.gLimAddtsSent) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003466 pe_err("Addts (token %d, tsid %d, up %d) is still pending",
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003467 mac->lim.gLimAddtsReq.req.dialogToken,
3468 mac->lim.gLimAddtsReq.req.tspec.tsinfo.traffic.tsid,
3469 mac->lim.gLimAddtsReq.req.tspec.tsinfo.traffic.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003470 userPrio);
Sreelakshmi Konamki2972b6e2017-07-17 12:10:36 +05303471 goto send_failure_addts_rsp;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003472 }
3473
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003474 sir_copy_mac_addr(peerMac, pe_session->bssId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003475
3476 /* save the addts request */
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003477 mac->lim.gLimAddtsSent = true;
3478 qdf_mem_copy((uint8_t *) &mac->lim.gLimAddtsReq,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003479 (uint8_t *) pSirAddts, sizeof(tSirAddtsReq));
3480
3481 /* ship out the message now */
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003482 lim_send_addts_req_action_frame(mac, peerMac, &pSirAddts->req,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003483 pe_session);
Abhishek Singh5d8d7332017-08-10 15:15:24 +05303484 pe_err("Sent ADDTS request");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003485 /* start a timer to wait for the response */
3486 if (pSirAddts->timeout)
3487 timeout = pSirAddts->timeout;
Arif Hussain43e09712018-09-18 19:31:57 -07003488 else
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003489 timeout = mac->mlme_cfg->timeouts.addts_rsp_timeout;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003490
3491 timeout = SYS_MS_TO_TICKS(timeout);
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003492 if (tx_timer_change(&mac->lim.limTimers.gLimAddtsRspTimer, timeout, 0)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003493 != TX_SUCCESS) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003494 pe_err("AddtsRsp timer change failed!");
Sreelakshmi Konamki2972b6e2017-07-17 12:10:36 +05303495 goto send_failure_addts_rsp;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003496 }
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003497 mac->lim.gLimAddtsRspTimerCount++;
3498 if (tx_timer_change_context(&mac->lim.limTimers.gLimAddtsRspTimer,
3499 mac->lim.gLimAddtsRspTimerCount) !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003500 TX_SUCCESS) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003501 pe_err("AddtsRsp timer change failed!");
Sreelakshmi Konamki2972b6e2017-07-17 12:10:36 +05303502 goto send_failure_addts_rsp;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003503 }
3504 MTRACE(mac_trace
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003505 (mac, TRACE_CODE_TIMER_ACTIVATE, pe_session->peSessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003506 eLIM_ADDTS_RSP_TIMER));
3507
3508 /* add the sessionId to the timer object */
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003509 mac->lim.limTimers.gLimAddtsRspTimer.sessionId = sessionId;
3510 if (tx_timer_activate(&mac->lim.limTimers.gLimAddtsRspTimer) !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003511 TX_SUCCESS) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003512 pe_err("AddtsRsp timer activation failed!");
Sreelakshmi Konamki2972b6e2017-07-17 12:10:36 +05303513 goto send_failure_addts_rsp;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003514 }
3515 return;
Sreelakshmi Konamki2972b6e2017-07-17 12:10:36 +05303516
3517send_failure_addts_rsp:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003518 lim_send_sme_addts_rsp(mac, pSirAddts->rspReqd, QDF_STATUS_E_FAILURE,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003519 pe_session, pSirAddts->req.tspec,
Sreelakshmi Konamki2972b6e2017-07-17 12:10:36 +05303520 smesessionId, smetransactionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003521}
3522
Jeff Johnson83d6c112018-12-02 13:05:00 -08003523static void __lim_process_sme_delts_req(struct mac_context *mac, uint32_t *pMsgBuf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003524{
3525 tSirMacAddr peerMacAddr;
3526 uint8_t ac;
3527 tSirMacTSInfo *pTsinfo;
3528 tpSirDeltsReq pDeltsReq = (tpSirDeltsReq) pMsgBuf;
3529 tpDphHashNode pStaDs = NULL;
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003530 struct pe_session *pe_session;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003531 uint8_t sessionId;
Jeff Johnson0301ecb2018-06-29 09:36:23 -07003532 uint32_t status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003533 uint8_t smesessionId;
3534 uint16_t smetransactionId;
3535
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003536 lim_get_session_info(mac, (uint8_t *) pMsgBuf, &smesessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003537 &smetransactionId);
3538
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003539 pe_session = pe_find_session_by_bssid(mac,
Srinivas Girigowdabab88932015-12-03 19:18:11 -08003540 pDeltsReq->bssid.bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003541 &sessionId);
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003542 if (pe_session == NULL) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003543 pe_err("Session Does not exist for given bssId");
Jeff Johnson0301ecb2018-06-29 09:36:23 -07003544 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003545 goto end;
3546 }
3547#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM /* FEATURE_WLAN_DIAG_SUPPORT */
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003548 lim_diag_event_report(mac, WLAN_PE_DIAG_DELTS_REQ_EVENT, pe_session, 0,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003549 0);
3550#endif /* FEATURE_WLAN_DIAG_SUPPORT */
3551
Jeff Johnson0301ecb2018-06-29 09:36:23 -07003552 if (QDF_STATUS_SUCCESS !=
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003553 lim_validate_delts_req(mac, pDeltsReq, peerMacAddr, pe_session)) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003554 pe_err("lim_validate_delts_req failed");
Jeff Johnson0301ecb2018-06-29 09:36:23 -07003555 status = QDF_STATUS_E_FAILURE;
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003556 lim_send_sme_delts_rsp(mac, pDeltsReq, QDF_STATUS_E_FAILURE, pe_session,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003557 smesessionId, smetransactionId);
3558 return;
3559 }
3560
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003561 pe_debug("Sent DELTS request to station with assocId = %d MacAddr = "
3562 MAC_ADDRESS_STR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003563 pDeltsReq->aid, MAC_ADDR_ARRAY(peerMacAddr));
3564
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003565 lim_send_delts_req_action_frame(mac, peerMacAddr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003566 pDeltsReq->req.wmeTspecPresent,
3567 &pDeltsReq->req.tsinfo,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003568 &pDeltsReq->req.tspec, pe_session);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003569
3570 pTsinfo =
3571 pDeltsReq->req.wmeTspecPresent ? &pDeltsReq->req.tspec.
3572 tsinfo : &pDeltsReq->req.tsinfo;
3573
3574 /* We've successfully send DELTS frame to AP. Update the
3575 * dynamic UAPSD mask. The AC for this TSPEC to be deleted
3576 * is no longer trigger enabled or delivery enabled
3577 */
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003578 lim_set_tspec_uapsd_mask_per_session(mac, pe_session,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003579 pTsinfo, CLEAR_UAPSD_MASK);
3580
3581 /* We're deleting the TSPEC, so this particular AC is no longer
3582 * admitted. PE needs to downgrade the EDCA
3583 * parameters(for the AC for which TS is being deleted) to the
3584 * next best AC for which ACM is not enabled, and send the
3585 * updated values to HAL.
3586 */
3587 ac = upToAc(pTsinfo->traffic.userPrio);
3588
3589 if (pTsinfo->traffic.direction == SIR_MAC_DIRECTION_UPLINK) {
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003590 pe_session->gAcAdmitMask[SIR_MAC_DIRECTION_UPLINK] &=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003591 ~(1 << ac);
3592 } else if (pTsinfo->traffic.direction ==
3593 SIR_MAC_DIRECTION_DNLINK) {
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003594 pe_session->gAcAdmitMask[SIR_MAC_DIRECTION_DNLINK] &=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003595 ~(1 << ac);
3596 } else if (pTsinfo->traffic.direction ==
3597 SIR_MAC_DIRECTION_BIDIR) {
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003598 pe_session->gAcAdmitMask[SIR_MAC_DIRECTION_UPLINK] &=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003599 ~(1 << ac);
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003600 pe_session->gAcAdmitMask[SIR_MAC_DIRECTION_DNLINK] &=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003601 ~(1 << ac);
3602 }
3603
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003604 lim_set_active_edca_params(mac, pe_session->gLimEdcaParams,
3605 pe_session);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003606
3607 pStaDs =
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003608 dph_get_hash_entry(mac, DPH_STA_HASH_INDEX_PEER,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003609 &pe_session->dph.dphHashTable);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003610 if (pStaDs != NULL) {
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003611 lim_send_edca_params(mac, pe_session->gLimEdcaParamsActive,
Kiran Kumar Lokere27026ae2018-03-09 11:38:19 -08003612 pStaDs->bssId, false);
Jeff Johnson0301ecb2018-06-29 09:36:23 -07003613 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003614 } else {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003615 pe_err("Self entry missing in Hash Table");
Jeff Johnson0301ecb2018-06-29 09:36:23 -07003616 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003617 }
3618#ifdef FEATURE_WLAN_ESE
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003619 lim_send_sme_tsm_ie_ind(mac, pe_session, 0, 0, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003620#endif
3621
3622 /* send an sme response back */
3623end:
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003624 lim_send_sme_delts_rsp(mac, pDeltsReq, QDF_STATUS_SUCCESS, pe_session,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003625 smesessionId, smetransactionId);
3626}
3627
Jeff Johnson83d6c112018-12-02 13:05:00 -08003628void lim_process_sme_addts_rsp_timeout(struct mac_context *mac, uint32_t param)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003629{
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003630 /* fetch the pe_session based on the sessionId */
3631 struct pe_session *pe_session;
Srinivas Girigowda4d65ebe2017-10-13 21:41:42 -07003632
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003633 pe_session = pe_find_session_by_session_id(mac,
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003634 mac->lim.limTimers.gLimAddtsRspTimer.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003635 sessionId);
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003636 if (pe_session == NULL) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003637 pe_err("Session Does not exist for given sessionID");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003638 return;
3639 }
3640
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003641 if (!LIM_IS_STA_ROLE(pe_session)) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003642 pe_warn("AddtsRspTimeout in non-Sta role (%d)",
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003643 GET_LIM_SYSTEM_ROLE(pe_session));
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003644 mac->lim.gLimAddtsSent = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003645 return;
3646 }
3647
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003648 if (!mac->lim.gLimAddtsSent) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003649 pe_warn("AddtsRspTimeout but no AddtsSent");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003650 return;
3651 }
3652
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003653 if (param != mac->lim.gLimAddtsRspTimerCount) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003654 pe_err("Invalid AddtsRsp Timer count %d (exp %d)", param,
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003655 mac->lim.gLimAddtsRspTimerCount);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003656 return;
3657 }
3658 /* this a real response timeout */
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003659 mac->lim.gLimAddtsSent = false;
3660 mac->lim.gLimAddtsRspTimerCount++;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003661
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003662 lim_send_sme_addts_rsp(mac, true, eSIR_SME_ADDTS_RSP_TIMEOUT,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003663 pe_session, mac->lim.gLimAddtsReq.req.tspec,
3664 pe_session->smeSessionId,
3665 pe_session->transactionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003666}
3667
Naveen Rawatfa2a1002018-05-17 16:06:37 -07003668#ifndef QCA_SUPPORT_CP_STATS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003669/**
3670 * __lim_process_sme_get_statistics_request()
3671 *
3672 ***FUNCTION:
3673 *
3674 *
3675 ***NOTE:
3676 *
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003677 * @param mac Pointer to Global MAC structure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003678 * @param *pMsgBuf A pointer to the SME message buffer
3679 * @return None
3680 */
3681static void
Jeff Johnson83d6c112018-12-02 13:05:00 -08003682__lim_process_sme_get_statistics_request(struct mac_context *mac, uint32_t *pMsgBuf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003683{
3684 tpAniGetPEStatsReq pPEStatsReq;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07003685 struct scheduler_msg msgQ = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003686
3687 pPEStatsReq = (tpAniGetPEStatsReq) pMsgBuf;
3688
3689 msgQ.type = WMA_GET_STATISTICS_REQ;
3690
3691 msgQ.reserved = 0;
3692 msgQ.bodyptr = pMsgBuf;
3693 msgQ.bodyval = 0;
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003694 MTRACE(mac_trace_msg_tx(mac, NO_SESSION, msgQ.type));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003695
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003696 if (QDF_STATUS_SUCCESS != (wma_post_ctrl_msg(mac, &msgQ))) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303697 qdf_mem_free(pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003698 pMsgBuf = NULL;
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003699 pe_err("Unable to forward request");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003700 return;
3701 }
3702
3703 return;
3704}
Naveen Rawatfa2a1002018-05-17 16:06:37 -07003705#else
3706static void __lim_process_sme_get_statistics_request(
Jeff Johnson009c40f2018-11-05 09:54:37 -08003707 struct mac_context *mac_ctx, uint32_t *pMsgBuf) {}
Naveen Rawatfa2a1002018-05-17 16:06:37 -07003708#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003709
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08003710#ifdef FEATURE_WLAN_ESE
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003711/**
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08003712 * __lim_process_sme_get_tsm_stats_request() - get tsm stats request
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003713 *
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003714 * @mac: Pointer to Global MAC structure
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08003715 * @pMsgBuf: A pointer to the SME message buffer
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003716 *
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08003717 * Return: None
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003718 */
3719static void
Jeff Johnson83d6c112018-12-02 13:05:00 -08003720__lim_process_sme_get_tsm_stats_request(struct mac_context *mac, uint32_t *pMsgBuf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003721{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07003722 struct scheduler_msg msgQ = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003723
3724 msgQ.type = WMA_TSM_STATS_REQ;
3725 msgQ.reserved = 0;
3726 msgQ.bodyptr = pMsgBuf;
3727 msgQ.bodyval = 0;
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003728 MTRACE(mac_trace_msg_tx(mac, NO_SESSION, msgQ.type));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003729
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003730 if (QDF_STATUS_SUCCESS != (wma_post_ctrl_msg(mac, &msgQ))) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303731 qdf_mem_free(pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003732 pMsgBuf = NULL;
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003733 pe_err("Unable to forward request");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003734 return;
3735 }
3736}
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08003737#endif /* FEATURE_WLAN_ESE */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003738
Jeff Johnson83d6c112018-12-02 13:05:00 -08003739static void lim_process_sme_set_addba_accept(struct mac_context *mac_ctx,
Kiran Kumar Lokere08195ef2018-01-17 19:25:15 -08003740 struct sme_addba_accept *msg)
3741{
3742 if (!msg) {
3743 pe_err("Msg Buffer is NULL");
3744 return;
3745 }
3746 if (!msg->addba_accept)
3747 mac_ctx->reject_addba_req = 1;
3748 else
3749 mac_ctx->reject_addba_req = 0;
3750}
3751
Jeff Johnson83d6c112018-12-02 13:05:00 -08003752static void lim_process_sme_update_edca_params(struct mac_context *mac_ctx,
Arif Hussaineb8ba362018-03-07 19:15:13 -08003753 uint32_t sme_session_id)
3754{
Jeff Johnson209dfa02018-11-18 22:54:38 -08003755 struct pe_session *pe_session;
Arif Hussaineb8ba362018-03-07 19:15:13 -08003756 tpDphHashNode sta_ds_ptr;
3757
3758 pe_session = pe_find_session_by_sme_session_id(mac_ctx, sme_session_id);
3759 if (!pe_session) {
3760 pe_err("Session does not exist: sme_id %d", sme_session_id);
3761 return;
3762 }
3763 pe_session->gLimEdcaParamsActive[EDCA_AC_BE].no_ack =
3764 mac_ctx->no_ack_policy_cfg[EDCA_AC_BE];
3765 pe_session->gLimEdcaParamsActive[EDCA_AC_BK].no_ack =
3766 mac_ctx->no_ack_policy_cfg[EDCA_AC_BK];
3767 pe_session->gLimEdcaParamsActive[EDCA_AC_VI].no_ack =
3768 mac_ctx->no_ack_policy_cfg[EDCA_AC_VI];
3769 pe_session->gLimEdcaParamsActive[EDCA_AC_VO].no_ack =
3770 mac_ctx->no_ack_policy_cfg[EDCA_AC_VO];
3771 sta_ds_ptr = dph_get_hash_entry(mac_ctx, DPH_STA_HASH_INDEX_PEER,
3772 &pe_session->dph.dphHashTable);
3773 if (sta_ds_ptr)
3774 lim_send_edca_params(mac_ctx,
3775 pe_session->gLimEdcaParamsActive,
Kiran Kumar Lokere27026ae2018-03-09 11:38:19 -08003776 sta_ds_ptr->bssId, false);
Arif Hussaineb8ba362018-03-07 19:15:13 -08003777 else
3778 pe_err("Self entry missing in Hash Table");
3779}
3780
Jeff Johnson83d6c112018-12-02 13:05:00 -08003781static void lim_process_sme_update_mu_edca_params(struct mac_context *mac_ctx,
Kiran Kumar Lokerefba20632018-07-05 16:51:27 -07003782 uint32_t sme_session_id)
3783{
Jeff Johnson209dfa02018-11-18 22:54:38 -08003784 struct pe_session *pe_session;
Kiran Kumar Lokerefba20632018-07-05 16:51:27 -07003785 tpDphHashNode sta_ds_ptr;
3786
3787 pe_session = pe_find_session_by_sme_session_id(mac_ctx, sme_session_id);
3788 if (!pe_session) {
3789 pe_err("Session does not exist: sme_id %d", sme_session_id);
3790 return;
3791 }
3792 sta_ds_ptr = dph_get_hash_entry(mac_ctx, DPH_STA_HASH_INDEX_PEER,
3793 &pe_session->dph.dphHashTable);
3794 if (sta_ds_ptr)
3795 lim_send_edca_params(mac_ctx, mac_ctx->usr_mu_edca_params,
3796 sta_ds_ptr->bssId, true);
3797 else
3798 pe_err("Self entry missing in Hash Table");
3799}
3800
Kiran Kumar Lokereee205772018-09-27 00:27:27 -07003801static void
3802lim_process_sme_cfg_action_frm_in_tb_ppdu(struct mac_context *mac_ctx,
3803 struct sir_cfg_action_frm_tb_ppdu
3804 *msg)
3805{
3806 if (!msg) {
3807 pe_err("Buffer is NULL");
3808 return;
3809 }
3810
3811 lim_send_action_frm_tb_ppdu_cfg(mac_ctx, msg->session_id, msg->cfg);
3812}
3813
Jeff Johnson83d6c112018-12-02 13:05:00 -08003814static void lim_process_sme_update_config(struct mac_context *mac_ctx,
Naveen Rawat8029a402017-06-01 10:54:19 -07003815 struct update_config *msg)
3816{
Jeff Johnson209dfa02018-11-18 22:54:38 -08003817 struct pe_session *pe_session;
Naveen Rawat8029a402017-06-01 10:54:19 -07003818
3819 pe_debug("received eWNI_SME_UPDATE_HT_CONFIG message");
3820 if (msg == NULL) {
3821 pe_err("Buffer is Pointing to NULL");
3822 return;
3823 }
3824
3825 pe_session = pe_find_session_by_sme_session_id(mac_ctx,
3826 msg->sme_session_id);
3827 if (pe_session == NULL) {
3828 pe_warn("Session does not exist for given BSSID");
3829 return;
3830 }
3831
3832 switch (msg->capab) {
3833 case WNI_CFG_HT_CAP_INFO_ADVANCE_CODING:
3834 pe_session->htConfig.ht_rx_ldpc = msg->value;
3835 break;
3836 case WNI_CFG_HT_CAP_INFO_TX_STBC:
3837 pe_session->htConfig.ht_tx_stbc = msg->value;
3838 break;
3839 case WNI_CFG_HT_CAP_INFO_RX_STBC:
3840 pe_session->htConfig.ht_rx_stbc = msg->value;
3841 break;
3842 case WNI_CFG_HT_CAP_INFO_SHORT_GI_20MHZ:
3843 pe_session->htConfig.ht_sgi20 = msg->value;
3844 break;
3845 case WNI_CFG_HT_CAP_INFO_SHORT_GI_40MHZ:
3846 pe_session->htConfig.ht_sgi40 = msg->value;
3847 break;
3848 }
3849
3850 if (LIM_IS_AP_ROLE(pe_session)) {
3851 sch_set_fixed_beacon_fields(mac_ctx, pe_session);
Abhishek Singhfc740be2018-10-12 11:34:26 +05303852 lim_send_beacon_ind(mac_ctx, pe_session, REASON_CONFIG_UPDATE);
Naveen Rawat8029a402017-06-01 10:54:19 -07003853 }
3854}
3855
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003856void
Jeff Johnson83d6c112018-12-02 13:05:00 -08003857lim_send_vdev_restart(struct mac_context *mac,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003858 struct pe_session *pe_session, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003859{
3860 tpHalHiddenSsidVdevRestart pHalHiddenSsidVdevRestart = NULL;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07003861 struct scheduler_msg msgQ = {0};
Jeff Johnson0301ecb2018-06-29 09:36:23 -07003862 QDF_STATUS retCode = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003863
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003864 if (pe_session == NULL) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003865 pe_err("Invalid parameters");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003866 return;
3867 }
3868
3869 pHalHiddenSsidVdevRestart =
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303870 qdf_mem_malloc(sizeof(tHalHiddenSsidVdevRestart));
Arif Hussainf5b6c412018-10-10 19:41:09 -07003871 if (!pHalHiddenSsidVdevRestart)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003872 return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003873
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003874 pHalHiddenSsidVdevRestart->ssidHidden = pe_session->ssidHidden;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003875 pHalHiddenSsidVdevRestart->sessionId = sessionId;
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003876 pHalHiddenSsidVdevRestart->pe_session_id = pe_session->peSessionId;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003877
3878 msgQ.type = WMA_HIDDEN_SSID_VDEV_RESTART;
3879 msgQ.bodyptr = pHalHiddenSsidVdevRestart;
3880 msgQ.bodyval = 0;
3881
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003882 retCode = wma_post_ctrl_msg(mac, &msgQ);
Jeff Johnson0301ecb2018-06-29 09:36:23 -07003883 if (QDF_STATUS_SUCCESS != retCode) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003884 pe_err("wma_post_ctrl_msg() failed");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303885 qdf_mem_free(pHalHiddenSsidVdevRestart);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003886 }
3887}
3888
Selvaraj, Sridhar01741822016-08-30 18:26:19 +05303889/**
3890 * __lim_process_roam_scan_offload_req() - Process Roam scan offload from csr
3891 * @mac_ctx: Pointer to Global MAC structure
3892 * @msg_buf: Pointer to SME message buffer
3893 *
3894 * Return: None
3895 */
Jeff Johnson83d6c112018-12-02 13:05:00 -08003896static void __lim_process_roam_scan_offload_req(struct mac_context *mac_ctx,
Selvaraj, Sridhar01741822016-08-30 18:26:19 +05303897 uint32_t *msg_buf)
3898{
Jeff Johnson209dfa02018-11-18 22:54:38 -08003899 struct pe_session *pe_session;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07003900 struct scheduler_msg wma_msg = {0};
Jeff Johnson0301ecb2018-06-29 09:36:23 -07003901 QDF_STATUS status;
Selvaraj, Sridhar01741822016-08-30 18:26:19 +05303902 tSirRoamOffloadScanReq *req_buffer;
3903 uint16_t local_ie_len;
3904 uint8_t *local_ie_buf;
3905
3906 req_buffer = (tSirRoamOffloadScanReq *)msg_buf;
3907 pe_session = pe_find_session_by_sme_session_id(mac_ctx,
3908 req_buffer->sessionId);
3909
3910 local_ie_buf = qdf_mem_malloc(MAX_DEFAULT_SCAN_IE_LEN);
3911 if (!local_ie_buf) {
Manikandan Mohan41e2d6f2017-04-10 16:17:39 +05303912 qdf_mem_free(req_buffer);
Selvaraj, Sridhar01741822016-08-30 18:26:19 +05303913 return;
3914 }
3915
3916 local_ie_len = req_buffer->assoc_ie.length;
3917 /* Update ext cap IE if present */
3918 if (local_ie_len &&
Arif Hussain963331b2016-10-27 22:59:01 -07003919 !lim_update_ext_cap_ie(mac_ctx, req_buffer->assoc_ie.addIEdata,
3920 local_ie_buf, &local_ie_len)) {
3921 if (local_ie_len <
Arif Hussainc2bb4402016-10-25 15:24:08 -07003922 QDF_ARRAY_SIZE(req_buffer->assoc_ie.addIEdata)) {
3923 req_buffer->assoc_ie.length = local_ie_len;
3924 qdf_mem_copy(req_buffer->assoc_ie.addIEdata,
3925 local_ie_buf, local_ie_len);
3926 }
Selvaraj, Sridhar01741822016-08-30 18:26:19 +05303927 }
3928 qdf_mem_free(local_ie_buf);
3929
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05303930 if (pe_session)
3931 lim_update_fils_rik(pe_session, req_buffer);
3932
Selvaraj, Sridhar01741822016-08-30 18:26:19 +05303933 wma_msg.type = WMA_ROAM_SCAN_OFFLOAD_REQ;
3934 wma_msg.bodyptr = req_buffer;
3935
3936 status = wma_post_ctrl_msg(mac_ctx, &wma_msg);
Jeff Johnson0301ecb2018-06-29 09:36:23 -07003937 if (QDF_STATUS_SUCCESS != status) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003938 pe_err("Posting WMA_ROAM_SCAN_OFFLOAD_REQ failed");
Selvaraj, Sridhar01741822016-08-30 18:26:19 +05303939 qdf_mem_free(req_buffer);
3940 }
3941}
3942
Paul Zhang624f88d2018-11-07 15:29:45 +08003943#ifdef WLAN_FEATURE_ROAM_OFFLOAD
3944/**
3945 * lim_process_roam_invoke() - process the Roam Invoke req
3946 * @mac_ctx: Pointer to Global MAC structure
3947 * @msg_buf: Pointer to the SME message buffer
3948 *
3949 * This function is called by limProcessMessageQueue(). This function sends the
3950 * ROAM_INVOKE command to WMA.
3951 *
3952 * Return: None
3953 */
Jeff Johnson83d6c112018-12-02 13:05:00 -08003954static void lim_process_roam_invoke(struct mac_context *mac_ctx,
Paul Zhang624f88d2018-11-07 15:29:45 +08003955 uint32_t *msg_buf)
3956{
3957 struct scheduler_msg msg = {0};
3958 QDF_STATUS status;
3959
3960 msg.type = SIR_HAL_ROAM_INVOKE;
3961 msg.bodyptr = msg_buf;
3962 msg.reserved = 0;
3963
3964 status = wma_post_ctrl_msg(mac_ctx, &msg);
3965 if (QDF_STATUS_SUCCESS != status)
3966 pe_err("Not able to post SIR_HAL_ROAM_INVOKE to WMA");
3967}
3968#else
Jeff Johnson83d6c112018-12-02 13:05:00 -08003969static void lim_process_roam_invoke(struct mac_context *mac_ctx,
Paul Zhang624f88d2018-11-07 15:29:45 +08003970 uint32_t *msg_buf)
3971{
3972 qdf_mem_free(msg_buf);
3973}
3974#endif
3975
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05303976/*
3977 * lim_handle_update_ssid_hidden() - Processes SSID hidden update
3978 * @mac_ctx: Pointer to global mac context
3979 * @session: Pointer to PE session
3980 * @ssid_hidden: SSID hidden value to set; 0 - Broadcast SSID,
3981 * 1 - Disable broadcast SSID
3982 *
3983 * Return: None
3984 */
Jeff Johnson83d6c112018-12-02 13:05:00 -08003985static void lim_handle_update_ssid_hidden(struct mac_context *mac_ctx,
Jeff Johnson209dfa02018-11-18 22:54:38 -08003986 struct pe_session *session, uint8_t ssid_hidden)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003987{
Kiran Kumar Lokere5798bfa2017-04-27 20:49:39 -07003988 pe_debug("rcvd HIDE_SSID message old HIDE_SSID: %d new HIDE_SSID: %d",
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003989 session->ssidHidden, ssid_hidden);
3990
Kiran Kumar Lokere5798bfa2017-04-27 20:49:39 -07003991 if (ssid_hidden != session->ssidHidden) {
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05303992 session->ssidHidden = ssid_hidden;
Kiran Kumar Lokere5798bfa2017-04-27 20:49:39 -07003993 } else {
3994 pe_debug("Dont process HIDE_SSID msg with existing setting");
Selvaraj, Sridhara0083c42016-06-22 22:15:43 +05303995 return;
3996 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003997
Abhishek Singh6c681f42018-09-12 15:52:36 +05303998#ifdef CONFIG_VDEV_SM
3999 ap_mlme_set_hidden_ssid_restart_in_progress(session->vdev, true);
4000 wlan_vdev_mlme_sm_deliver_evt(session->vdev,
4001 WLAN_VDEV_SM_EV_FW_VDEV_RESTART,
4002 sizeof(*session), session);
4003#else
4004
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004005 /* Send vdev restart */
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05304006 lim_send_vdev_restart(mac_ctx, session, session->smeSessionId);
Abhishek Singh6c681f42018-09-12 15:52:36 +05304007#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004008
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004009 return;
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05304010}
4011
4012/**
4013 * __lim_process_sme_session_update - process SME session update msg
4014 *
4015 * @mac_ctx: Pointer to global mac context
4016 * @msg_buf: Pointer to the received message buffer
4017 *
4018 * Return: None
4019 */
Jeff Johnson83d6c112018-12-02 13:05:00 -08004020static void __lim_process_sme_session_update(struct mac_context *mac_ctx,
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05304021 uint32_t *msg_buf)
4022{
4023 struct sir_update_session_param *msg;
Jeff Johnson209dfa02018-11-18 22:54:38 -08004024 struct pe_session *session;
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05304025
4026 if (!msg_buf) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004027 pe_err("Buffer is Pointing to NULL");
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05304028 return;
4029 }
4030
4031 msg = (struct sir_update_session_param *) msg_buf;
4032
4033 session = pe_find_session_by_sme_session_id(mac_ctx, msg->session_id);
4034 if (!session) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004035 pe_warn("Session does not exist for given sessionId %d",
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05304036 msg->session_id);
4037 return;
4038 }
4039
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004040 pe_debug("received SME Session update for %d val %d",
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05304041 msg->param_type, msg->param_val);
4042 switch (msg->param_type) {
4043 case SIR_PARAM_SSID_HIDDEN:
4044 lim_handle_update_ssid_hidden(mac_ctx, session, msg->param_val);
4045 break;
Selvaraj, Sridharac4fcf32016-09-28 12:57:32 +05304046 case SIR_PARAM_IGNORE_ASSOC_DISALLOWED:
4047 session->ignore_assoc_disallowed = msg->param_val;
4048 break;
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05304049 default:
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004050 pe_err("Unknown session param");
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05304051 break;
4052 }
4053}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004054
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004055/*
4056 Update the beacon Interval dynamically if beaconInterval is different in MCC
4057 */
Jeff Johnson83d6c112018-12-02 13:05:00 -08004058static void __lim_process_sme_change_bi(struct mac_context *mac, uint32_t *pMsgBuf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004059{
4060 tpSirChangeBIParams pChangeBIParams;
Jeff Johnsonb5c13332018-12-03 09:54:51 -08004061 struct pe_session *pe_session;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004062 uint8_t sessionId = 0;
4063 tUpdateBeaconParams beaconParams;
4064
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004065 pe_debug("received Update Beacon Interval message");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004066
4067 if (pMsgBuf == NULL) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004068 pe_err("Buffer is Pointing to NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004069 return;
4070 }
4071
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304072 qdf_mem_zero(&beaconParams, sizeof(tUpdateBeaconParams));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004073 pChangeBIParams = (tpSirChangeBIParams) pMsgBuf;
4074
Jeff Johnsonb5c13332018-12-03 09:54:51 -08004075 pe_session = pe_find_session_by_bssid(mac,
Srinivas Girigowda8e717d32015-11-24 15:54:33 -08004076 pChangeBIParams->bssid.bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004077 &sessionId);
Jeff Johnsonb5c13332018-12-03 09:54:51 -08004078 if (pe_session == NULL) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004079 pe_err("Session does not exist for given BSSID");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004080 return;
4081 }
4082
Jeff Johnsonb5c13332018-12-03 09:54:51 -08004083 /*Update pe_session Beacon Interval */
4084 if (pe_session->beaconParams.beaconInterval !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004085 pChangeBIParams->beaconInterval) {
Jeff Johnsonb5c13332018-12-03 09:54:51 -08004086 pe_session->beaconParams.beaconInterval =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004087 pChangeBIParams->beaconInterval;
4088 }
4089
4090 /*Update sch beaconInterval */
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004091 if (mac->sch.schObject.gSchBeaconInterval !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004092 pChangeBIParams->beaconInterval) {
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004093 mac->sch.schObject.gSchBeaconInterval =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004094 pChangeBIParams->beaconInterval;
4095
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004096 pe_debug("LIM send update BeaconInterval Indication: %d",
4097 pChangeBIParams->beaconInterval);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004098
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004099 if (false == mac->sap.SapDfsInfo.is_dfs_cac_timer_running) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004100 /* Update beacon */
Jeff Johnsonb5c13332018-12-03 09:54:51 -08004101 sch_set_fixed_beacon_fields(mac, pe_session);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004102
Jeff Johnsonb5c13332018-12-03 09:54:51 -08004103 beaconParams.bssIdx = pe_session->bssIdx;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004104 /* Set change in beacon Interval */
4105 beaconParams.beaconInterval =
4106 pChangeBIParams->beaconInterval;
4107 beaconParams.paramChangeBitmap =
4108 PARAM_BCN_INTERVAL_CHANGED;
Jeff Johnsonb5c13332018-12-03 09:54:51 -08004109 lim_send_beacon_params(mac, &beaconParams, pe_session);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004110 }
4111 }
4112
4113 return;
Jeff Johnson83d6c112018-12-02 13:05:00 -08004114} /*** end __lim_process_sme_change_bi(struct mac_context *mac, uint32_t *pMsgBuf) ***/
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004115
4116#ifdef QCA_HT_2040_COEX
Jeff Johnson83d6c112018-12-02 13:05:00 -08004117static void __lim_process_sme_set_ht2040_mode(struct mac_context *mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004118 uint32_t *pMsgBuf)
4119{
4120 tpSirSetHT2040Mode pSetHT2040Mode;
Jeff Johnsonb5c13332018-12-03 09:54:51 -08004121 struct pe_session *pe_session;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004122 uint8_t sessionId = 0;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07004123 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004124 tUpdateVHTOpMode *pHtOpMode = NULL;
4125 uint16_t staId = 0;
4126 tpDphHashNode pStaDs = NULL;
4127
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004128 pe_debug("received Set HT 20/40 mode message");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004129 if (pMsgBuf == NULL) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004130 pe_err("Buffer is Pointing to NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004131 return;
4132 }
4133
4134 pSetHT2040Mode = (tpSirSetHT2040Mode) pMsgBuf;
4135
Jeff Johnsonb5c13332018-12-03 09:54:51 -08004136 pe_session = pe_find_session_by_bssid(mac,
Srinivas Girigowdac52474d2015-11-24 15:49:31 -08004137 pSetHT2040Mode->bssid.bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004138 &sessionId);
Jeff Johnsonb5c13332018-12-03 09:54:51 -08004139 if (pe_session == NULL) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004140 pe_debug("Session does not exist for given BSSID");
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004141 lim_print_mac_addr(mac, pSetHT2040Mode->bssid.bytes, LOGD);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004142 return;
4143 }
4144
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004145 pe_debug("Update session entry for cbMod=%d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004146 pSetHT2040Mode->cbMode);
Jeff Johnsonb5c13332018-12-03 09:54:51 -08004147 /*Update pe_session HT related fields */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004148 switch (pSetHT2040Mode->cbMode) {
4149 case PHY_SINGLE_CHANNEL_CENTERED:
Jeff Johnsonb5c13332018-12-03 09:54:51 -08004150 pe_session->htSecondaryChannelOffset =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004151 PHY_SINGLE_CHANNEL_CENTERED;
Jeff Johnsonb5c13332018-12-03 09:54:51 -08004152 pe_session->htRecommendedTxWidthSet = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004153 if (pSetHT2040Mode->obssEnabled)
Jeff Johnsonb5c13332018-12-03 09:54:51 -08004154 pe_session->htSupportedChannelWidthSet
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004155 = eHT_CHANNEL_WIDTH_40MHZ;
4156 else
Jeff Johnsonb5c13332018-12-03 09:54:51 -08004157 pe_session->htSupportedChannelWidthSet
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004158 = eHT_CHANNEL_WIDTH_20MHZ;
4159 break;
4160 case PHY_DOUBLE_CHANNEL_LOW_PRIMARY:
Jeff Johnsonb5c13332018-12-03 09:54:51 -08004161 pe_session->htSecondaryChannelOffset =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004162 PHY_DOUBLE_CHANNEL_LOW_PRIMARY;
Jeff Johnsonb5c13332018-12-03 09:54:51 -08004163 pe_session->htRecommendedTxWidthSet = 1;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004164 break;
4165 case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY:
Jeff Johnsonb5c13332018-12-03 09:54:51 -08004166 pe_session->htSecondaryChannelOffset =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004167 PHY_DOUBLE_CHANNEL_HIGH_PRIMARY;
Jeff Johnsonb5c13332018-12-03 09:54:51 -08004168 pe_session->htRecommendedTxWidthSet = 1;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004169 break;
4170 default:
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004171 pe_err("Invalid cbMode");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004172 return;
4173 }
4174
4175 /* Update beacon */
Jeff Johnsonb5c13332018-12-03 09:54:51 -08004176 sch_set_fixed_beacon_fields(mac, pe_session);
4177 lim_send_beacon_ind(mac, pe_session, REASON_SET_HT2040);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004178
4179 /* update OP Mode for each associated peer */
Jeff Johnsonb5c13332018-12-03 09:54:51 -08004180 for (staId = 0; staId < pe_session->dph.dphHashTable.size; staId++) {
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004181 pStaDs = dph_get_hash_entry(mac, staId,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08004182 &pe_session->dph.dphHashTable);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004183 if (NULL == pStaDs)
4184 continue;
4185
4186 if (pStaDs->valid && pStaDs->htSupportedChannelWidthSet) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304187 pHtOpMode = qdf_mem_malloc(sizeof(tUpdateVHTOpMode));
Arif Hussainf5b6c412018-10-10 19:41:09 -07004188 if (!pHtOpMode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004189 return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004190 pHtOpMode->opMode =
Jeff Johnsonb5c13332018-12-03 09:54:51 -08004191 (pe_session->htSecondaryChannelOffset ==
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004192 PHY_SINGLE_CHANNEL_CENTERED) ?
4193 eHT_CHANNEL_WIDTH_20MHZ : eHT_CHANNEL_WIDTH_40MHZ;
4194 pHtOpMode->staId = staId;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304195 qdf_mem_copy(pHtOpMode->peer_mac, &pStaDs->staAddr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004196 sizeof(tSirMacAddr));
4197 pHtOpMode->smesessionId = sessionId;
4198
4199 msg.type = WMA_UPDATE_OP_MODE;
4200 msg.reserved = 0;
4201 msg.bodyptr = pHtOpMode;
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004202 if (!QDF_IS_STATUS_SUCCESS
gaurank kathpalia3a7f25b2018-08-28 16:26:39 +05304203 (scheduler_post_message(QDF_MODULE_ID_PE,
4204 QDF_MODULE_ID_WMA,
4205 QDF_MODULE_ID_WMA,
4206 &msg))) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004207 pe_err("Not able to post WMA_UPDATE_OP_MODE message to WMA");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304208 qdf_mem_free(pHtOpMode);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004209 return;
4210 }
Jeff Johnson47d75242018-05-12 15:58:53 -07004211 pe_debug("Notified FW about OP mode: %d for staId=%d",
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004212 pHtOpMode->opMode, staId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004213
4214 } else
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004215 pe_debug("station %d does not support HT40", staId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004216 }
4217
4218 return;
4219}
4220#endif
4221
4222/* -------------------------------------------------------------------- */
4223/**
4224 * __lim_process_report_message
4225 *
4226 * FUNCTION: Processes the next received Radio Resource Management message
4227 *
4228 * LOGIC:
4229 *
4230 * ASSUMPTIONS:
4231 *
4232 * NOTE:
4233 *
4234 * @param None
4235 * @return None
4236 */
4237
Jeff Johnson83d6c112018-12-02 13:05:00 -08004238static void __lim_process_report_message(struct mac_context *mac,
Rajeev Kumarfeb96382017-01-22 19:42:09 -08004239 struct scheduler_msg *pMsg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004240{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004241 switch (pMsg->type) {
4242 case eWNI_SME_NEIGHBOR_REPORT_REQ_IND:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004243 rrm_process_neighbor_report_req(mac, pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004244 break;
4245 case eWNI_SME_BEACON_REPORT_RESP_XMIT_IND:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004246 rrm_process_beacon_report_xmit(mac, pMsg->bodyptr);
Krishna Kumaar Natarajanf599c6e2015-11-03 11:44:03 -08004247 break;
4248 default:
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004249 pe_err("Invalid msg type: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004250 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004251}
4252
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004253/* -------------------------------------------------------------------- */
4254/**
4255 * lim_send_set_max_tx_power_req
4256 *
4257 * FUNCTION: Send SIR_HAL_SET_MAX_TX_POWER_REQ message to change the max tx power.
4258 *
4259 * LOGIC:
4260 *
4261 * ASSUMPTIONS:
4262 *
4263 * NOTE:
4264 *
4265 * @param txPower txPower to be set.
Jeff Johnsonb5c13332018-12-03 09:54:51 -08004266 * @param pe_session session entry.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004267 * @return None
4268 */
Jeff Johnson0301ecb2018-06-29 09:36:23 -07004269QDF_STATUS
Jeff Johnson83d6c112018-12-02 13:05:00 -08004270lim_send_set_max_tx_power_req(struct mac_context *mac, int8_t txPower,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08004271 struct pe_session *pe_session)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004272{
4273 tpMaxTxPowerParams pMaxTxParams = NULL;
Jeff Johnson0301ecb2018-06-29 09:36:23 -07004274 QDF_STATUS retCode = QDF_STATUS_SUCCESS;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07004275 struct scheduler_msg msgQ = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004276
Jeff Johnsonb5c13332018-12-03 09:54:51 -08004277 if (pe_session == NULL) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004278 pe_err("Invalid parameters");
Jeff Johnson0301ecb2018-06-29 09:36:23 -07004279 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004280 }
4281
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304282 pMaxTxParams = qdf_mem_malloc(sizeof(tMaxTxPowerParams));
Arif Hussainf5b6c412018-10-10 19:41:09 -07004283 if (!pMaxTxParams)
Jeff Johnson0301ecb2018-06-29 09:36:23 -07004284 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004285 pMaxTxParams->power = txPower;
Jeff Johnsonb5c13332018-12-03 09:54:51 -08004286 qdf_mem_copy(pMaxTxParams->bssId.bytes, pe_session->bssId,
Anurag Chouhan6d760662016-02-20 16:05:43 +05304287 QDF_MAC_ADDR_SIZE);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304288 qdf_mem_copy(pMaxTxParams->selfStaMacAddr.bytes,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08004289 pe_session->selfMacAddr,
Anurag Chouhan6d760662016-02-20 16:05:43 +05304290 QDF_MAC_ADDR_SIZE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004291
4292 msgQ.type = WMA_SET_MAX_TX_POWER_REQ;
4293 msgQ.bodyptr = pMaxTxParams;
4294 msgQ.bodyval = 0;
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004295 pe_debug("Post WMA_SET_MAX_TX_POWER_REQ to WMA");
Jeff Johnsonb5c13332018-12-03 09:54:51 -08004296 MTRACE(mac_trace_msg_tx(mac, pe_session->peSessionId, msgQ.type));
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004297 retCode = wma_post_ctrl_msg(mac, &msgQ);
Jeff Johnson0301ecb2018-06-29 09:36:23 -07004298 if (QDF_STATUS_SUCCESS != retCode) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004299 pe_err("wma_post_ctrl_msg() failed");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304300 qdf_mem_free(pMaxTxParams);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004301 }
4302 return retCode;
4303}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004304
4305/**
4306 * __lim_process_sme_register_mgmt_frame_req() - process sme reg mgmt frame req
4307 *
4308 * @mac_ctx: Pointer to Global MAC structure
4309 * @msg_buf: pointer to the SME message buffer
4310 *
4311 * This function is called to process eWNI_SME_REGISTER_MGMT_FRAME_REQ message
4312 * from SME. It Register this information within PE.
4313 *
4314 * Return: None
4315 */
Jeff Johnson83d6c112018-12-02 13:05:00 -08004316static void __lim_process_sme_register_mgmt_frame_req(struct mac_context *mac_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004317 uint32_t *msg_buf)
4318{
Anurag Chouhanffb21542016-02-17 14:33:03 +05304319 QDF_STATUS qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004320 tpSirRegisterMgmtFrame sme_req = (tpSirRegisterMgmtFrame)msg_buf;
4321 struct mgmt_frm_reg_info *lim_mgmt_regn = NULL;
4322 struct mgmt_frm_reg_info *next = NULL;
4323 bool match = false;
4324
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004325 pe_debug("registerFrame %d, frameType %d, matchLen %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004326 sme_req->registerFrame, sme_req->frameType,
4327 sme_req->matchLen);
4328 /* First check whether entry exists already */
Anurag Chouhana37b5b72016-02-21 14:53:42 +05304329 qdf_mutex_acquire(&mac_ctx->lim.lim_frame_register_lock);
Anurag Chouhanffb21542016-02-17 14:33:03 +05304330 qdf_list_peek_front(&mac_ctx->lim.gLimMgmtFrameRegistratinQueue,
4331 (qdf_list_node_t **) &lim_mgmt_regn);
Anurag Chouhana37b5b72016-02-21 14:53:42 +05304332 qdf_mutex_release(&mac_ctx->lim.lim_frame_register_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004333
4334 while (lim_mgmt_regn != NULL) {
4335 if (lim_mgmt_regn->frameType != sme_req->frameType)
4336 goto skip_match;
4337 if (sme_req->matchLen) {
4338 if ((lim_mgmt_regn->matchLen == sme_req->matchLen) &&
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304339 (!qdf_mem_cmp(lim_mgmt_regn->matchData,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004340 sme_req->matchData,
4341 lim_mgmt_regn->matchLen))) {
4342 /* found match! */
4343 match = true;
4344 break;
4345 }
4346 } else {
4347 /* found match! */
4348 match = true;
4349 break;
4350 }
4351skip_match:
Anurag Chouhana37b5b72016-02-21 14:53:42 +05304352 qdf_mutex_acquire(&mac_ctx->lim.lim_frame_register_lock);
Anurag Chouhanffb21542016-02-17 14:33:03 +05304353 qdf_status = qdf_list_peek_next(
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004354 &mac_ctx->lim.gLimMgmtFrameRegistratinQueue,
Anurag Chouhanffb21542016-02-17 14:33:03 +05304355 (qdf_list_node_t *)lim_mgmt_regn,
4356 (qdf_list_node_t **)&next);
Anurag Chouhana37b5b72016-02-21 14:53:42 +05304357 qdf_mutex_release(&mac_ctx->lim.lim_frame_register_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004358 lim_mgmt_regn = next;
4359 next = NULL;
4360 }
4361 if (match) {
Anurag Chouhana37b5b72016-02-21 14:53:42 +05304362 qdf_mutex_acquire(&mac_ctx->lim.lim_frame_register_lock);
Naveen Rawat1a3dac62016-10-25 12:44:57 -07004363 if (QDF_STATUS_SUCCESS ==
4364 qdf_list_remove_node(
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004365 &mac_ctx->lim.gLimMgmtFrameRegistratinQueue,
Naveen Rawat1a3dac62016-10-25 12:44:57 -07004366 (qdf_list_node_t *)lim_mgmt_regn))
4367 qdf_mem_free(lim_mgmt_regn);
Anurag Chouhana37b5b72016-02-21 14:53:42 +05304368 qdf_mutex_release(&mac_ctx->lim.lim_frame_register_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004369 }
4370
4371 if (sme_req->registerFrame) {
4372 lim_mgmt_regn =
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304373 qdf_mem_malloc(sizeof(struct mgmt_frm_reg_info) +
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004374 sme_req->matchLen);
4375 if (lim_mgmt_regn != NULL) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004376 lim_mgmt_regn->frameType = sme_req->frameType;
4377 lim_mgmt_regn->matchLen = sme_req->matchLen;
4378 lim_mgmt_regn->sessionId = sme_req->sessionId;
4379 if (sme_req->matchLen) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304380 qdf_mem_copy(lim_mgmt_regn->matchData,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004381 sme_req->matchData,
4382 sme_req->matchLen);
4383 }
Anurag Chouhana37b5b72016-02-21 14:53:42 +05304384 qdf_mutex_acquire(
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004385 &mac_ctx->lim.lim_frame_register_lock);
Anurag Chouhanffb21542016-02-17 14:33:03 +05304386 qdf_list_insert_front(&mac_ctx->lim.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004387 gLimMgmtFrameRegistratinQueue,
4388 &lim_mgmt_regn->node);
Anurag Chouhana37b5b72016-02-21 14:53:42 +05304389 qdf_mutex_release(
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004390 &mac_ctx->lim.lim_frame_register_lock);
4391 }
4392 }
4393 return;
4394}
4395
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004396static void
Jeff Johnson83d6c112018-12-02 13:05:00 -08004397__lim_process_sme_reset_ap_caps_change(struct mac_context *mac, uint32_t *pMsgBuf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004398{
4399 tpSirResetAPCapsChange pResetCapsChange;
Jeff Johnsonb5c13332018-12-03 09:54:51 -08004400 struct pe_session *pe_session;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004401 uint8_t sessionId = 0;
Srinivas Girigowda4d65ebe2017-10-13 21:41:42 -07004402
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004403 if (pMsgBuf == NULL) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004404 pe_err("Buffer is Pointing to NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004405 return;
4406 }
4407
4408 pResetCapsChange = (tpSirResetAPCapsChange) pMsgBuf;
Jeff Johnsonb5c13332018-12-03 09:54:51 -08004409 pe_session =
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004410 pe_find_session_by_bssid(mac, pResetCapsChange->bssId.bytes,
Srinivas Girigowda40567b92015-09-24 15:17:25 -07004411 &sessionId);
Jeff Johnsonb5c13332018-12-03 09:54:51 -08004412 if (pe_session == NULL) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004413 pe_err("Session does not exist for given BSSID");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004414 return;
4415 }
4416
Jeff Johnsonb5c13332018-12-03 09:54:51 -08004417 pe_session->limSentCapsChangeNtf = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004418 return;
4419}
4420
4421/**
Abhishek Singh7996eb72015-12-30 17:24:02 +05304422 * lim_register_mgmt_frame_ind_cb() - Save the Management frame
4423 * indication callback in PE.
4424 * @mac_ptr: Mac pointer
4425 * @msg_buf: Msg pointer containing the callback
4426 *
4427 * This function is used save the Management frame
4428 * indication callback in PE.
4429 *
4430 * Return: None
4431 */
Jeff Johnson83d6c112018-12-02 13:05:00 -08004432static void lim_register_mgmt_frame_ind_cb(struct mac_context *mac_ctx,
Abhishek Singh7996eb72015-12-30 17:24:02 +05304433 uint32_t *msg_buf)
4434{
4435 struct sir_sme_mgmt_frame_cb_req *sme_req =
4436 (struct sir_sme_mgmt_frame_cb_req *)msg_buf;
4437
4438 if (NULL == msg_buf) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004439 pe_err("msg_buf is null");
Abhishek Singh7996eb72015-12-30 17:24:02 +05304440 return;
4441 }
4442 if (sme_req->callback)
4443 mac_ctx->mgmt_frame_ind_cb =
4444 (sir_mgmt_frame_ind_callback)sme_req->callback;
4445 else
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004446 pe_err("sme_req->callback is null");
Abhishek Singh7996eb72015-12-30 17:24:02 +05304447}
4448
4449/**
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +05304450 *__lim_process_send_disassoc_frame: function processes disassoc frame
4451 * @mac_ctx: pointer to mac context
4452 * @msg_buf: message buffer
4453 *
4454 * function processes disassoc request received from SME
4455 *
4456 * return: none
4457 */
Jeff Johnson83d6c112018-12-02 13:05:00 -08004458static void __lim_process_send_disassoc_frame(struct mac_context *mac_ctx,
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +05304459 uint32_t *msg_buf)
4460{
4461 struct sme_send_disassoc_frm_req sme_send_disassoc_frame_req;
Jeff Johnson0301ecb2018-06-29 09:36:23 -07004462 QDF_STATUS status;
Jeff Johnson209dfa02018-11-18 22:54:38 -08004463 struct pe_session *session_entry = NULL;
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +05304464 uint8_t sme_session_id;
4465 uint16_t sme_trans_id;
4466
4467 if (msg_buf == NULL) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004468 pe_err("Buffer is Pointing to NULL");
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +05304469 return;
4470 }
4471
4472 lim_get_session_info(mac_ctx, (uint8_t *)msg_buf, &sme_session_id,
4473 &sme_trans_id);
4474
4475 status = lim_send_disassoc_frm_req_ser_des(mac_ctx,
4476 &sme_send_disassoc_frame_req,
4477 (uint8_t *)msg_buf);
4478
Jeff Johnson0301ecb2018-06-29 09:36:23 -07004479 if ((QDF_STATUS_E_FAILURE == status) ||
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +05304480 (lim_is_group_addr(sme_send_disassoc_frame_req.peer_mac) &&
4481 !lim_is_addr_bc(sme_send_disassoc_frame_req.peer_mac))) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004482 pe_err("received invalid SME_DISASSOC_REQ message");
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +05304483 return;
4484 }
4485
4486 session_entry = pe_find_session_by_sme_session_id(
4487 mac_ctx, sme_session_id);
4488 if (session_entry == NULL) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004489 pe_err("session does not exist for given bssId "MAC_ADDRESS_STR,
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +05304490 MAC_ADDR_ARRAY(sme_send_disassoc_frame_req.peer_mac));
4491 return;
4492 }
4493
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004494 pe_debug("msg_type->%d len->%d sess_id->%d trans_id->%d mac->"MAC_ADDRESS_STR" reason->%d wait_for_ack->%d",
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +05304495 sme_send_disassoc_frame_req.msg_type,
4496 sme_send_disassoc_frame_req.length,
4497 sme_send_disassoc_frame_req.session_id,
4498 sme_send_disassoc_frame_req.trans_id,
4499 MAC_ADDR_ARRAY(sme_send_disassoc_frame_req.peer_mac),
4500 sme_send_disassoc_frame_req.reason,
4501 sme_send_disassoc_frame_req.wait_for_ack);
4502
4503 lim_send_disassoc_mgmt_frame(mac_ctx,
4504 sme_send_disassoc_frame_req.reason,
4505 sme_send_disassoc_frame_req.peer_mac,
4506 session_entry, sme_send_disassoc_frame_req.wait_for_ack);
4507}
4508
4509/**
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07004510 * lim_set_pdev_ht_ie() - sends the set HT IE req to FW
4511 * @mac_ctx: Pointer to Global MAC structure
4512 * @pdev_id: pdev id to set the IE.
4513 * @nss: Nss values to prepare the HT IE.
4514 *
4515 * Prepares the HT IE with self capabilities for different
4516 * Nss values and sends the set HT IE req to FW.
4517 *
4518 * Return: None
4519 */
Jeff Johnson83d6c112018-12-02 13:05:00 -08004520static void lim_set_pdev_ht_ie(struct mac_context *mac_ctx, uint8_t pdev_id,
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07004521 uint8_t nss)
4522{
4523 struct set_ie_param *ie_params;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07004524 struct scheduler_msg msg = {0};
Jeff Johnson0301ecb2018-06-29 09:36:23 -07004525 QDF_STATUS rc = QDF_STATUS_SUCCESS;
Naveen Rawat08db88f2017-09-08 15:07:48 -07004526 const uint8_t *p_ie = NULL;
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07004527 tHtCaps *p_ht_cap;
4528 int i;
4529
Kiran Kumar Lokere78790202016-09-16 14:09:50 -07004530 for (i = 1; i <= nss; i++) {
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07004531 ie_params = qdf_mem_malloc(sizeof(*ie_params));
Arif Hussainf5b6c412018-10-10 19:41:09 -07004532 if (!ie_params)
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07004533 return;
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07004534 ie_params->nss = i;
4535 ie_params->pdev_id = pdev_id;
4536 ie_params->ie_type = DOT11_HT_IE;
4537 /* 2 for IE len and EID */
4538 ie_params->ie_len = 2 + sizeof(tHtCaps);
4539 ie_params->ie_ptr = qdf_mem_malloc(ie_params->ie_len);
Arif Hussainf5b6c412018-10-10 19:41:09 -07004540 if (!ie_params->ie_ptr) {
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07004541 qdf_mem_free(ie_params);
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07004542 return;
4543 }
4544 *ie_params->ie_ptr = SIR_MAC_HT_CAPABILITIES_EID;
4545 *(ie_params->ie_ptr + 1) = ie_params->ie_len - 2;
4546 lim_set_ht_caps(mac_ctx, NULL, ie_params->ie_ptr,
4547 ie_params->ie_len);
4548
4549 if (NSS_1x1_MODE == i) {
Naveen Rawat08db88f2017-09-08 15:07:48 -07004550 p_ie = wlan_get_ie_ptr_from_eid(DOT11F_EID_HTCAPS,
4551 ie_params->ie_ptr, ie_params->ie_len);
Kiran Kumar Lokere53981332016-05-02 18:12:11 -07004552 if (NULL == p_ie) {
4553 qdf_mem_free(ie_params->ie_ptr);
4554 qdf_mem_free(ie_params);
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004555 pe_err("failed to get IE ptr");
Kiran Kumar Lokere53981332016-05-02 18:12:11 -07004556 return;
4557 }
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07004558 p_ht_cap = (tHtCaps *)&p_ie[2];
4559 p_ht_cap->supportedMCSSet[1] = 0;
4560 p_ht_cap->txSTBC = 0;
4561 }
4562
4563 msg.type = WMA_SET_PDEV_IE_REQ;
4564 msg.bodyptr = ie_params;
4565 msg.bodyval = 0;
4566
4567 rc = wma_post_ctrl_msg(mac_ctx, &msg);
Jeff Johnson0301ecb2018-06-29 09:36:23 -07004568 if (rc != QDF_STATUS_SUCCESS) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004569 pe_err("wma_post_ctrl_msg() return failure");
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07004570 qdf_mem_free(ie_params->ie_ptr);
4571 qdf_mem_free(ie_params);
4572 return;
4573 }
4574 }
4575}
4576
4577/**
4578 * lim_set_pdev_vht_ie() - sends the set VHT IE to req FW
4579 * @mac_ctx: Pointer to Global MAC structure
4580 * @pdev_id: pdev id to set the IE.
4581 * @nss: Nss values to prepare the VHT IE.
4582 *
4583 * Prepares the VHT IE with self capabilities for different
4584 * Nss values and sends the set VHT IE req to FW.
4585 *
4586 * Return: None
4587 */
Jeff Johnson83d6c112018-12-02 13:05:00 -08004588static void lim_set_pdev_vht_ie(struct mac_context *mac_ctx, uint8_t pdev_id,
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07004589 uint8_t nss)
4590{
4591 struct set_ie_param *ie_params;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07004592 struct scheduler_msg msg = {0};
Jeff Johnson0301ecb2018-06-29 09:36:23 -07004593 QDF_STATUS rc = QDF_STATUS_SUCCESS;
Naveen Rawat08db88f2017-09-08 15:07:48 -07004594 const uint8_t *p_ie = NULL;
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07004595 tSirMacVHTCapabilityInfo *vht_cap;
4596 int i;
4597 tSirVhtMcsInfo *vht_mcs;
4598
Kiran Kumar Lokere78790202016-09-16 14:09:50 -07004599 for (i = 1; i <= nss; i++) {
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07004600 ie_params = qdf_mem_malloc(sizeof(*ie_params));
Arif Hussainf5b6c412018-10-10 19:41:09 -07004601 if (!ie_params)
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07004602 return;
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07004603 ie_params->nss = i;
4604 ie_params->pdev_id = pdev_id;
4605 ie_params->ie_type = DOT11_VHT_IE;
4606 /* 2 for IE len and EID */
4607 ie_params->ie_len = 2 + sizeof(tSirMacVHTCapabilityInfo) +
4608 sizeof(tSirVhtMcsInfo);
4609 ie_params->ie_ptr = qdf_mem_malloc(ie_params->ie_len);
Arif Hussainf5b6c412018-10-10 19:41:09 -07004610 if (!ie_params->ie_ptr) {
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07004611 qdf_mem_free(ie_params);
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07004612 return;
4613 }
4614 *ie_params->ie_ptr = SIR_MAC_VHT_CAPABILITIES_EID;
4615 *(ie_params->ie_ptr + 1) = ie_params->ie_len - 2;
4616 lim_set_vht_caps(mac_ctx, NULL, ie_params->ie_ptr,
4617 ie_params->ie_len);
4618
4619 if (NSS_1x1_MODE == i) {
Naveen Rawat08db88f2017-09-08 15:07:48 -07004620 p_ie = wlan_get_ie_ptr_from_eid(DOT11F_EID_VHTCAPS,
4621 ie_params->ie_ptr, ie_params->ie_len);
Kiran Kumar Lokere53981332016-05-02 18:12:11 -07004622 if (NULL == p_ie) {
4623 qdf_mem_free(ie_params->ie_ptr);
4624 qdf_mem_free(ie_params);
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004625 pe_err("failed to get IE ptr");
Kiran Kumar Lokere53981332016-05-02 18:12:11 -07004626 return;
4627 }
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07004628 vht_cap = (tSirMacVHTCapabilityInfo *)&p_ie[2];
4629 vht_cap->txSTBC = 0;
4630 vht_mcs =
4631 (tSirVhtMcsInfo *)&p_ie[2 +
4632 sizeof(tSirMacVHTCapabilityInfo)];
4633 vht_mcs->rxMcsMap |= DISABLE_NSS2_MCS;
4634 vht_mcs->rxHighest =
4635 VHT_RX_HIGHEST_SUPPORTED_DATA_RATE_1_1;
4636 vht_mcs->txMcsMap |= DISABLE_NSS2_MCS;
4637 vht_mcs->txHighest =
4638 VHT_TX_HIGHEST_SUPPORTED_DATA_RATE_1_1;
4639 }
4640 msg.type = WMA_SET_PDEV_IE_REQ;
4641 msg.bodyptr = ie_params;
4642 msg.bodyval = 0;
4643
4644 rc = wma_post_ctrl_msg(mac_ctx, &msg);
Jeff Johnson0301ecb2018-06-29 09:36:23 -07004645 if (rc != QDF_STATUS_SUCCESS) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004646 pe_err("wma_post_ctrl_msg failure");
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07004647 qdf_mem_free(ie_params->ie_ptr);
4648 qdf_mem_free(ie_params);
4649 return;
4650 }
4651 }
4652}
4653
4654/**
Naveen Rawata410c5a2016-09-19 14:22:33 -07004655 * lim_process_set_vdev_ies_per_band() - process the set vdev IE req
4656 * @mac_ctx: Pointer to Global MAC structure
4657 * @msg_buf: Pointer to the SME message buffer
4658 *
4659 * This function is called by limProcessMessageQueue(). This function sets the
4660 * VDEV IEs to the FW.
4661 *
4662 * Return: None
4663 */
Jeff Johnson83d6c112018-12-02 13:05:00 -08004664static void lim_process_set_vdev_ies_per_band(struct mac_context *mac_ctx,
Naveen Rawata410c5a2016-09-19 14:22:33 -07004665 uint32_t *msg_buf)
4666{
4667 struct sir_set_vdev_ies_per_band *p_msg =
4668 (struct sir_set_vdev_ies_per_band *)msg_buf;
4669
4670 if (NULL == p_msg) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004671 pe_err("NULL p_msg");
Naveen Rawata410c5a2016-09-19 14:22:33 -07004672 return;
4673 }
4674
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004675 pe_debug("rcvd set vdev ie per band req vdev_id = %d",
Naveen Rawata410c5a2016-09-19 14:22:33 -07004676 p_msg->vdev_id);
4677 /* intentionally using NULL here so that self capabilty are sent */
4678 if (lim_send_ies_per_band(mac_ctx, NULL, p_msg->vdev_id) !=
4679 QDF_STATUS_SUCCESS)
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004680 pe_err("Unable to send HT/VHT Cap to FW");
Naveen Rawata410c5a2016-09-19 14:22:33 -07004681}
4682
4683/**
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07004684 * lim_process_set_pdev_IEs() - process the set pdev IE req
4685 * @mac_ctx: Pointer to Global MAC structure
4686 * @msg_buf: Pointer to the SME message buffer
4687 *
4688 * This function is called by limProcessMessageQueue(). This
4689 * function sets the PDEV IEs to the FW.
4690 *
4691 * Return: None
4692 */
Jeff Johnson83d6c112018-12-02 13:05:00 -08004693static void lim_process_set_pdev_IEs(struct mac_context *mac_ctx, uint32_t *msg_buf)
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07004694{
4695 struct sir_set_ht_vht_cfg *ht_vht_cfg;
4696
4697 ht_vht_cfg = (struct sir_set_ht_vht_cfg *)msg_buf;
4698
4699 if (NULL == ht_vht_cfg) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004700 pe_err("NULL ht_vht_cfg");
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07004701 return;
4702 }
4703
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004704 pe_debug("rcvd set pdev ht vht ie req with nss = %d",
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07004705 ht_vht_cfg->nss);
4706 lim_set_pdev_ht_ie(mac_ctx, ht_vht_cfg->pdev_id, ht_vht_cfg->nss);
4707
4708 if (IS_DOT11_MODE_VHT(ht_vht_cfg->dot11mode))
4709 lim_set_pdev_vht_ie(mac_ctx, ht_vht_cfg->pdev_id,
4710 ht_vht_cfg->nss);
4711}
4712
4713/**
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05304714 * lim_process_sme_update_access_policy_vendor_ie: function updates vendor IE
4715 *
4716 * access policy
4717 * @mac_ctx: pointer to mac context
4718 * @msg: message buffer
4719 *
4720 * function processes vendor IE and access policy from SME and updates PE
4721 *
4722 * session entry
4723 *
4724 * return: none
4725*/
4726static void lim_process_sme_update_access_policy_vendor_ie(
Jeff Johnson83d6c112018-12-02 13:05:00 -08004727 struct mac_context *mac_ctx,
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05304728 uint32_t *msg)
4729{
4730 struct sme_update_access_policy_vendor_ie *update_vendor_ie;
Jeff Johnson0f99bd82018-11-18 18:42:12 -08004731 struct pe_session *pe_session_entry;
Pragaspathi Thilagaraj9b7a1162018-05-07 16:28:13 +05304732 uint16_t num_bytes;
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05304733
4734 if (!msg) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004735 pe_err("Buffer is Pointing to NULL");
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05304736 return;
4737 }
4738 update_vendor_ie = (struct sme_update_access_policy_vendor_ie *) msg;
4739 pe_session_entry = pe_find_session_by_sme_session_id(mac_ctx,
4740 update_vendor_ie->sme_session_id);
4741
4742 if (!pe_session_entry) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004743 pe_err("Session does not exist for given sme session id(%hu)",
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05304744 update_vendor_ie->sme_session_id);
4745 return;
4746 }
4747 if (pe_session_entry->access_policy_vendor_ie)
4748 qdf_mem_free(pe_session_entry->access_policy_vendor_ie);
4749
4750 num_bytes = update_vendor_ie->ie[1] + 2;
4751 pe_session_entry->access_policy_vendor_ie = qdf_mem_malloc(num_bytes);
Arif Hussainf5b6c412018-10-10 19:41:09 -07004752 if (!pe_session_entry->access_policy_vendor_ie)
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05304753 return;
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05304754 qdf_mem_copy(pe_session_entry->access_policy_vendor_ie,
4755 &update_vendor_ie->ie[0], num_bytes);
4756
4757 pe_session_entry->access_policy = update_vendor_ie->access_policy;
4758}
4759
Sandeep Puligilla30bb8402018-09-23 22:01:08 -07004760#ifdef CONFIG_VDEV_SM
4761QDF_STATUS lim_sta_mlme_vdev_disconnect_bss(struct vdev_mlme_obj *vdev_mlme,
4762 uint16_t data_len, void *data)
4763{
Jeff Johnson83d6c112018-12-02 13:05:00 -08004764 struct mac_context *mac_ctx;
Sandeep Puligilla30bb8402018-09-23 22:01:08 -07004765 struct scheduler_msg *msg = (struct scheduler_msg *)data;
4766
4767 mac_ctx = cds_get_context(QDF_MODULE_ID_PE);
4768 if (!mac_ctx) {
4769 pe_err("mac_ctx is NULL");
4770 if (data)
4771 qdf_mem_free(data);
4772 return QDF_STATUS_E_INVAL;
4773 }
4774 pe_debug("VDEV Manager disconnect bss callback type:(%d)", msg->type);
4775
4776 switch (msg->type) {
4777 case eWNI_SME_DEAUTH_REQ:
4778 __lim_process_sme_deauth_req(mac_ctx,
4779 (uint32_t *)msg->bodyptr);
4780 break;
4781 case eWNI_SME_DISASSOC_CNF:
4782 case eWNI_SME_DEAUTH_CNF:
4783 __lim_process_sme_disassoc_cnf(mac_ctx,
4784 (uint32_t *)msg->bodyptr);
4785 break;
4786 case eWNI_SME_DISASSOC_REQ:
4787 __lim_process_sme_disassoc_req(mac_ctx,
4788 (uint32_t *)msg->bodyptr);
4789 break;
4790 default:
4791 pe_debug("Wrong message type received %d", msg->type);
4792 }
4793 return QDF_STATUS_SUCCESS;
4794}
4795#endif
4796
Jeff Johnson83d6c112018-12-02 13:05:00 -08004797static void lim_process_sme_disassoc_cnf(struct mac_context *mac_ctx,
Sandeep Puligilla30bb8402018-09-23 22:01:08 -07004798 struct scheduler_msg *msg)
4799{
4800#ifdef CONFIG_VDEV_SM
4801 tSirSmeDisassocCnf sme_disassoc_cnf;
Jeff Johnson209dfa02018-11-18 22:54:38 -08004802 struct pe_session *session;
Sandeep Puligilla30bb8402018-09-23 22:01:08 -07004803 uint8_t session_id;
4804 QDF_STATUS status;
4805
4806 qdf_mem_copy(&sme_disassoc_cnf, msg->bodyptr,
4807 sizeof(struct sSirSmeDisassocCnf));
4808
4809 session = pe_find_session_by_bssid(mac_ctx,
4810 sme_disassoc_cnf.bssid.bytes,
4811 &session_id);
4812
4813 if (LIM_IS_STA_ROLE(session)) {
4814 status = wlan_vdev_mlme_sm_deliver_evt(session->vdev,
4815 WLAN_VDEV_SM_EV_DOWN,
4816 sizeof(*msg),
4817 msg);
4818 } else {
4819 __lim_process_sme_disassoc_cnf(mac_ctx,
4820 (uint32_t *)msg->bodyptr);
4821 }
4822#else
4823 __lim_process_sme_disassoc_cnf(mac_ctx, (uint32_t *)msg->bodyptr);
4824#endif
4825}
4826
Jeff Johnson83d6c112018-12-02 13:05:00 -08004827static void lim_process_sme_disassoc_req(struct mac_context *mac_ctx,
Sandeep Puligilla30bb8402018-09-23 22:01:08 -07004828 struct scheduler_msg *msg)
4829{
4830#ifdef CONFIG_VDEV_SM
4831 tSirSmeDisassocReq disassoc_req;
Jeff Johnson209dfa02018-11-18 22:54:38 -08004832 struct pe_session *session;
Sandeep Puligilla30bb8402018-09-23 22:01:08 -07004833 uint8_t session_id;
4834 QDF_STATUS status;
4835
4836 qdf_mem_copy(&disassoc_req, msg->bodyptr, sizeof(tSirSmeDisassocReq));
4837
4838 session = pe_find_session_by_bssid(mac_ctx,
4839 disassoc_req.bssid.bytes,
4840 &session_id);
4841 if (LIM_IS_STA_ROLE(session)) {
4842 status = wlan_vdev_mlme_sm_deliver_evt(session->vdev,
4843 WLAN_VDEV_SM_EV_DOWN,
4844 sizeof(*msg),
4845 msg);
4846 } else {
4847 __lim_process_sme_disassoc_req(mac_ctx,
4848 (uint32_t *)msg->bodyptr);
4849 }
4850#else
4851 __lim_process_sme_disassoc_req(mac_ctx, (uint32_t *)msg->bodyptr);
4852#endif
4853}
4854
Jeff Johnson83d6c112018-12-02 13:05:00 -08004855static void lim_process_sme_deauth_req(struct mac_context *mac_ctx,
Sandeep Puligilla30bb8402018-09-23 22:01:08 -07004856 struct scheduler_msg *msg)
4857{
4858#ifdef CONFIG_VDEV_SM
4859 tSirSmeDeauthReq sme_deauth_req;
Jeff Johnson209dfa02018-11-18 22:54:38 -08004860 struct pe_session *session;
Sandeep Puligilla30bb8402018-09-23 22:01:08 -07004861 uint8_t session_id;
4862 QDF_STATUS status;
4863
4864 qdf_mem_copy(&sme_deauth_req, msg->bodyptr, sizeof(tSirSmeDeauthReq));
4865
4866 session = pe_find_session_by_bssid(mac_ctx,
4867 sme_deauth_req.bssid.bytes,
4868 &session_id);
4869 if (LIM_IS_STA_ROLE(session)) {
4870 status = wlan_vdev_mlme_sm_deliver_evt(session->vdev,
4871 WLAN_VDEV_SM_EV_DOWN,
4872 sizeof(*msg),
4873 msg);
4874 } else {
4875 __lim_process_sme_deauth_req(mac_ctx,
4876 (uint32_t *)msg->bodyptr);
4877 }
4878#else
4879 __lim_process_sme_deauth_req(mac_ctx, (uint32_t *)msg->bodyptr);
4880#endif
4881}
4882
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05304883/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004884 * lim_process_sme_req_messages()
4885 *
4886 ***FUNCTION:
4887 * This function is called by limProcessMessageQueue(). This
4888 * function processes SME request messages from HDD or upper layer
4889 * application.
4890 *
4891 ***LOGIC:
4892 *
4893 ***ASSUMPTIONS:
4894 *
4895 ***NOTE:
4896 *
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004897 * @param mac Pointer to Global MAC structure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004898 * @param msgType Indicates the SME message type
4899 * @param *pMsgBuf A pointer to the SME message buffer
4900 * @return Boolean - true - if pMsgBuf is consumed and can be freed.
4901 * false - if pMsgBuf is not to be freed.
4902 */
4903
Jeff Johnson83d6c112018-12-02 13:05:00 -08004904bool lim_process_sme_req_messages(struct mac_context *mac,
Rajeev Kumarfeb96382017-01-22 19:42:09 -08004905 struct scheduler_msg *pMsg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004906{
Jeff Johnson33142e62018-05-06 17:58:36 -07004907 bool bufConsumed = true; /* Set this flag to false within case block of any following message, that doesn't want pMsgBuf to be freed. */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004908 uint32_t *pMsgBuf = pMsg->bodyptr;
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004909
4910 pe_debug("LIM Received SME Message %s(%d) Global LimSmeState:%s(%d) Global LimMlmState: %s(%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004911 lim_msg_str(pMsg->type), pMsg->type,
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004912 lim_sme_state_str(mac->lim.gLimSmeState), mac->lim.gLimSmeState,
4913 lim_mlm_state_str(mac->lim.gLimMlmState), mac->lim.gLimMlmState);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004914
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004915 /* If no insert NOA required then execute the code below */
4916
4917 switch (pMsg->type) {
4918 case eWNI_SME_SYS_READY_IND:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004919 bufConsumed = __lim_process_sme_sys_ready_ind(mac, pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004920 break;
4921
4922 case eWNI_SME_START_BSS_REQ:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004923 bufConsumed = __lim_process_sme_start_bss_req(mac, pMsg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004924 break;
4925
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004926 case eWNI_SME_CLEAR_DFS_CHANNEL_LIST:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004927 __lim_process_clear_dfs_channel_list(mac, pMsg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004928 break;
4929 case eWNI_SME_JOIN_REQ:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004930 __lim_process_sme_join_req(mac, pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004931 break;
4932
4933 case eWNI_SME_REASSOC_REQ:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004934 __lim_process_sme_reassoc_req(mac, pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004935 break;
4936
4937 case eWNI_SME_DISASSOC_REQ:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004938 lim_process_sme_disassoc_req(mac, pMsg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004939 break;
4940
4941 case eWNI_SME_DISASSOC_CNF:
4942 case eWNI_SME_DEAUTH_CNF:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004943 lim_process_sme_disassoc_cnf(mac, pMsg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004944 break;
4945
4946 case eWNI_SME_DEAUTH_REQ:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004947 lim_process_sme_deauth_req(mac, pMsg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004948 break;
4949
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +05304950 case eWNI_SME_SEND_DISASSOC_FRAME:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004951 __lim_process_send_disassoc_frame(mac, pMsgBuf);
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +05304952 break;
4953
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004954 case eWNI_SME_SETCONTEXT_REQ:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004955 __lim_process_sme_set_context_req(mac, pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004956 break;
4957
4958 case eWNI_SME_STOP_BSS_REQ:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004959 bufConsumed = __lim_process_sme_stop_bss_req(mac, pMsg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004960 break;
4961
4962 case eWNI_SME_ASSOC_CNF:
4963 if (pMsg->type == eWNI_SME_ASSOC_CNF)
Srinivas Girigowda28fb0122017-03-26 22:21:20 -07004964 pe_debug("Received ASSOC_CNF message");
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004965 __lim_process_sme_assoc_cnf_new(mac, pMsg->type,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004966 pMsgBuf);
4967 break;
4968
4969 case eWNI_SME_ADDTS_REQ:
Srinivas Girigowda28fb0122017-03-26 22:21:20 -07004970 pe_debug("Received ADDTS_REQ message");
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004971 __lim_process_sme_addts_req(mac, pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004972 break;
4973
4974 case eWNI_SME_DELTS_REQ:
Srinivas Girigowda28fb0122017-03-26 22:21:20 -07004975 pe_debug("Received DELTS_REQ message");
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004976 __lim_process_sme_delts_req(mac, pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004977 break;
4978
4979 case SIR_LIM_ADDTS_RSP_TIMEOUT:
Srinivas Girigowda28fb0122017-03-26 22:21:20 -07004980 pe_debug("Received SIR_LIM_ADDTS_RSP_TIMEOUT message");
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004981 lim_process_sme_addts_rsp_timeout(mac, pMsg->bodyval);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004982 break;
4983
4984 case eWNI_SME_GET_STATISTICS_REQ:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004985 __lim_process_sme_get_statistics_request(mac, pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004986 /* HAL consumes pMsgBuf. It will be freed there. Set bufConsumed to false. */
4987 bufConsumed = false;
4988 break;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08004989#ifdef FEATURE_WLAN_ESE
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004990 case eWNI_SME_GET_TSM_STATS_REQ:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004991 __lim_process_sme_get_tsm_stats_request(mac, pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004992 bufConsumed = false;
4993 break;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08004994#endif /* FEATURE_WLAN_ESE */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004995 case eWNI_SME_GET_ASSOC_STAS_REQ:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004996 lim_process_sme_get_assoc_sta_info(mac, pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004997 break;
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05304998 case eWNI_SME_SESSION_UPDATE_PARAM:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004999 __lim_process_sme_session_update(mac, pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005000 break;
Selvaraj, Sridhar01741822016-08-30 18:26:19 +05305001 case eWNI_SME_ROAM_SCAN_OFFLOAD_REQ:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08005002 __lim_process_roam_scan_offload_req(mac, pMsgBuf);
Selvaraj, Sridhar01741822016-08-30 18:26:19 +05305003 bufConsumed = false;
5004 break;
Paul Zhang624f88d2018-11-07 15:29:45 +08005005 case eWNI_SME_ROAM_INVOKE:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08005006 lim_process_roam_invoke(mac, pMsgBuf);
Paul Zhang624f88d2018-11-07 15:29:45 +08005007 bufConsumed = false;
5008 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005009 case eWNI_SME_CHNG_MCC_BEACON_INTERVAL:
5010 /* Update the beaconInterval */
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08005011 __lim_process_sme_change_bi(mac, pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005012 break;
5013
5014#ifdef QCA_HT_2040_COEX
5015 case eWNI_SME_SET_HT_2040_MODE:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08005016 __lim_process_sme_set_ht2040_mode(mac, pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005017 break;
5018#endif
5019
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005020 case eWNI_SME_NEIGHBOR_REPORT_REQ_IND:
5021 case eWNI_SME_BEACON_REPORT_RESP_XMIT_IND:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08005022 __lim_process_report_message(mac, pMsg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005023 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005024
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005025 case eWNI_SME_FT_PRE_AUTH_REQ:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08005026 bufConsumed = (bool) lim_process_ft_pre_auth_req(mac, pMsg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005027 break;
5028 case eWNI_SME_FT_UPDATE_KEY:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08005029 lim_process_ft_update_key(mac, pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005030 break;
5031
5032 case eWNI_SME_FT_AGGR_QOS_REQ:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08005033 lim_process_ft_aggr_qos_req(mac, pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005034 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005035
5036 case eWNI_SME_REGISTER_MGMT_FRAME_REQ:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08005037 __lim_process_sme_register_mgmt_frame_req(mac, pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005038 break;
5039#ifdef FEATURE_WLAN_TDLS
5040 case eWNI_SME_TDLS_SEND_MGMT_REQ:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08005041 lim_process_sme_tdls_mgmt_send_req(mac, pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005042 break;
5043 case eWNI_SME_TDLS_ADD_STA_REQ:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08005044 lim_process_sme_tdls_add_sta_req(mac, pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005045 break;
5046 case eWNI_SME_TDLS_DEL_STA_REQ:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08005047 lim_process_sme_tdls_del_sta_req(mac, pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005048 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005049#endif
5050 case eWNI_SME_RESET_AP_CAPS_CHANGED:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08005051 __lim_process_sme_reset_ap_caps_change(mac, pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005052 break;
5053
5054 case eWNI_SME_CHANNEL_CHANGE_REQ:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08005055 lim_process_sme_channel_change_request(mac, pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005056 break;
5057
5058 case eWNI_SME_START_BEACON_REQ:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08005059 lim_process_sme_start_beacon_req(mac, pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005060 break;
5061
5062 case eWNI_SME_DFS_BEACON_CHAN_SW_IE_REQ:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08005063 lim_process_sme_dfs_csa_ie_request(mac, pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005064 break;
5065
5066 case eWNI_SME_UPDATE_ADDITIONAL_IES:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08005067 lim_process_update_add_ies(mac, pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005068 break;
5069
5070 case eWNI_SME_MODIFY_ADDITIONAL_IES:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08005071 lim_process_modify_add_ies(mac, pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005072 break;
5073 case eWNI_SME_SET_HW_MODE_REQ:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08005074 lim_process_set_hw_mode(mac, pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005075 break;
5076 case eWNI_SME_NSS_UPDATE_REQ:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08005077 lim_process_nss_update_request(mac, pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005078 break;
5079 case eWNI_SME_SET_DUAL_MAC_CFG_REQ:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08005080 lim_process_set_dual_mac_cfg_req(mac, pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005081 break;
5082 case eWNI_SME_SET_IE_REQ:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08005083 lim_process_set_ie_req(mac, pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005084 break;
Abhishek Singh7996eb72015-12-30 17:24:02 +05305085 case eWNI_SME_REGISTER_MGMT_FRAME_CB:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08005086 lim_register_mgmt_frame_ind_cb(mac, pMsgBuf);
Abhishek Singh7996eb72015-12-30 17:24:02 +05305087 break;
Abhishek Singh518323d2015-10-19 17:42:01 +05305088 case eWNI_SME_EXT_CHANGE_CHANNEL:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08005089 lim_process_ext_change_channel(mac, pMsgBuf);
Abhishek Singh518323d2015-10-19 17:42:01 +05305090 break;
Archana Ramachandrana20ef812015-11-13 16:12:13 -08005091 case eWNI_SME_SET_ANTENNA_MODE_REQ:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08005092 lim_process_set_antenna_mode_req(mac, pMsgBuf);
Archana Ramachandrana20ef812015-11-13 16:12:13 -08005093 break;
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07005094 case eWNI_SME_PDEV_SET_HT_VHT_IE:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08005095 lim_process_set_pdev_IEs(mac, pMsgBuf);
Naveen Rawata410c5a2016-09-19 14:22:33 -07005096 break;
5097 case eWNI_SME_SET_VDEV_IES_PER_BAND:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08005098 lim_process_set_vdev_ies_per_band(mac, pMsgBuf);
Naveen Rawata410c5a2016-09-19 14:22:33 -07005099 break;
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05305100 case eWNI_SME_UPDATE_ACCESS_POLICY_VENDOR_IE:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08005101 lim_process_sme_update_access_policy_vendor_ie(mac, pMsgBuf);
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05305102 break;
Naveen Rawat8029a402017-06-01 10:54:19 -07005103 case eWNI_SME_UPDATE_CONFIG:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08005104 lim_process_sme_update_config(mac,
Naveen Rawat8029a402017-06-01 10:54:19 -07005105 (struct update_config *)pMsgBuf);
5106 break;
Kiran Kumar Lokere08195ef2018-01-17 19:25:15 -08005107 case eWNI_SME_SET_ADDBA_ACCEPT:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08005108 lim_process_sme_set_addba_accept(mac,
Kiran Kumar Lokere08195ef2018-01-17 19:25:15 -08005109 (struct sme_addba_accept *)pMsgBuf);
5110 break;
Arif Hussaineb8ba362018-03-07 19:15:13 -08005111 case eWNI_SME_UPDATE_EDCA_PROFILE:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08005112 lim_process_sme_update_edca_params(mac, pMsg->bodyval);
Arif Hussaineb8ba362018-03-07 19:15:13 -08005113 break;
Kiran Kumar Lokerefba20632018-07-05 16:51:27 -07005114 case WNI_SME_UPDATE_MU_EDCA_PARAMS:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08005115 lim_process_sme_update_mu_edca_params(mac, pMsg->bodyval);
Kiran Kumar Lokerefba20632018-07-05 16:51:27 -07005116 break;
Kiran Kumar Lokereee205772018-09-27 00:27:27 -07005117 case WNI_SME_CFG_ACTION_FRM_HE_TB_PPDU:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08005118 lim_process_sme_cfg_action_frm_in_tb_ppdu(mac,
Kiran Kumar Lokereee205772018-09-27 00:27:27 -07005119 (struct sir_cfg_action_frm_tb_ppdu *)pMsgBuf);
5120 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005121 default:
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305122 qdf_mem_free((void *)pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005123 pMsg->bodyptr = NULL;
5124 break;
5125 } /* switch (msgType) */
5126
5127 return bufConsumed;
5128} /*** end lim_process_sme_req_messages() ***/
5129
5130/**
5131 * lim_process_sme_start_beacon_req()
5132 *
5133 ***FUNCTION:
5134 * This function is called by limProcessMessageQueue(). This
5135 * function processes SME request messages from HDD or upper layer
5136 * application.
5137 *
5138 ***LOGIC:
5139 *
5140 ***ASSUMPTIONS:
5141 *
5142 ***NOTE:
5143 *
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08005144 * @param mac Pointer to Global MAC structure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005145 * @param msgType Indicates the SME message type
5146 * @param *pMsgBuf A pointer to the SME message buffer
5147 * @return Boolean - true - if pMsgBuf is consumed and can be freed.
5148 * false - if pMsgBuf is not to be freed.
5149 */
Jeff Johnson83d6c112018-12-02 13:05:00 -08005150static void lim_process_sme_start_beacon_req(struct mac_context *mac, uint32_t *pMsg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005151{
5152 tpSirStartBeaconIndication pBeaconStartInd;
Jeff Johnsonb5c13332018-12-03 09:54:51 -08005153 struct pe_session *pe_session;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005154 uint8_t sessionId; /* PE sessionID */
5155
5156 if (pMsg == NULL) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07005157 pe_err("Buffer is Pointing to NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005158 return;
5159 }
5160
5161 pBeaconStartInd = (tpSirStartBeaconIndication) pMsg;
Jeff Johnsonb5c13332018-12-03 09:54:51 -08005162 pe_session = pe_find_session_by_bssid(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005163 pBeaconStartInd->bssid,
5164 &sessionId);
Jeff Johnsonb5c13332018-12-03 09:54:51 -08005165 if (pe_session == NULL) {
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08005166 lim_print_mac_addr(mac, pBeaconStartInd->bssid, LOGE);
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07005167 pe_err("Session does not exist for given bssId");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005168 return;
5169 }
5170
5171 if (pBeaconStartInd->beaconStartStatus == true) {
5172 /*
5173 * Currently this Indication comes from SAP
5174 * to start Beacon Tx on a DFS channel
5175 * since beaconing has to be done on DFS
5176 * channel only after CAC WAIT is completed.
5177 * On a DFS Channel LIM does not start beacon
5178 * Tx right after the WMA_ADD_BSS_RSP.
5179 */
Jeff Johnsonb5c13332018-12-03 09:54:51 -08005180 lim_apply_configuration(mac, pe_session);
Abhishek Singh4294f802017-08-10 16:37:07 +05305181 QDF_TRACE(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005182 FL("Start Beacon with ssid %s Ch %d"),
Jeff Johnsonb5c13332018-12-03 09:54:51 -08005183 pe_session->ssId.ssId,
5184 pe_session->currentOperChannel);
5185 lim_send_beacon(mac, pe_session);
5186 lim_enable_obss_detection_config(mac, pe_session);
5187 lim_send_obss_color_collision_cfg(mac, pe_session,
Arif Hussain05fb4872018-01-03 16:02:55 -08005188 OBSS_COLOR_COLLISION_DETECTION);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005189 } else {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07005190 pe_err("Invalid Beacon Start Indication");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005191 return;
5192 }
5193}
5194
5195/**
5196 * lim_process_sme_channel_change_request() - process sme ch change req
5197 *
5198 * @mac_ctx: Pointer to Global MAC structure
5199 * @msg_buf: pointer to the SME message buffer
5200 *
5201 * This function is called to process SME_CHANNEL_CHANGE_REQ message
5202 *
5203 * Return: None
5204 */
Jeff Johnson83d6c112018-12-02 13:05:00 -08005205static void lim_process_sme_channel_change_request(struct mac_context *mac_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005206 uint32_t *msg_buf)
5207{
5208 tpSirChanChangeRequest ch_change_req;
Jeff Johnson209dfa02018-11-18 22:54:38 -08005209 struct pe_session *session_entry;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005210 uint8_t session_id; /* PE session_id */
Amar Singhala297bfa2015-10-15 15:07:29 -07005211 int8_t max_tx_pwr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005212
5213 if (msg_buf == NULL) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07005214 pe_err("msg_buf is NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005215 return;
5216 }
5217 ch_change_req = (tpSirChanChangeRequest)msg_buf;
5218
5219 max_tx_pwr = cfg_get_regulatory_max_transmit_power(mac_ctx,
5220 ch_change_req->targetChannel);
5221
5222 if ((ch_change_req->messageType != eWNI_SME_CHANNEL_CHANGE_REQ) ||
5223 (max_tx_pwr == WMA_MAX_TXPOWER_INVALID)) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07005224 pe_err("Invalid Request/max_tx_pwr");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005225 return;
5226 }
5227
5228 session_entry = pe_find_session_by_bssid(mac_ctx,
5229 ch_change_req->bssid, &session_id);
5230 if (session_entry == NULL) {
5231 lim_print_mac_addr(mac_ctx, ch_change_req->bssid, LOGE);
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07005232 pe_err("Session does not exist for given bssId");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005233 return;
5234 }
5235
Manjunathappa Prakash34fda792018-02-07 18:23:42 -08005236 if ((session_entry->currentOperChannel ==
5237 ch_change_req->targetChannel) &&
5238 (session_entry->ch_width == ch_change_req->ch_width)) {
5239 pe_err("Target channel and mode is same as current channel and mode channel %d and mode %d",
5240 session_entry->currentOperChannel, session_entry->ch_width);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005241 return;
5242 }
5243
5244 if (LIM_IS_AP_ROLE(session_entry))
5245 session_entry->channelChangeReasonCode =
5246 LIM_SWITCH_CHANNEL_SAP_DFS;
5247 else
5248 session_entry->channelChangeReasonCode =
5249 LIM_SWITCH_CHANNEL_OPERATION;
5250
Bala Venkateshb39ed152017-12-26 19:35:27 +05305251 pe_debug("switch old chnl %d to new chnl %d, ch_bw %d, nw_type %d, dot11mode %d",
5252 session_entry->currentOperChannel,
5253 ch_change_req->targetChannel,
5254 ch_change_req->ch_width,
5255 ch_change_req->nw_type,
5256 ch_change_req->dot11mode);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005257
5258 /* Store the New Channel Params in session_entry */
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08005259 session_entry->ch_width = ch_change_req->ch_width;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005260 session_entry->ch_center_freq_seg0 =
5261 ch_change_req->center_freq_seg_0;
5262 session_entry->ch_center_freq_seg1 =
5263 ch_change_req->center_freq_seg_1;
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08005264 session_entry->htSecondaryChannelOffset = ch_change_req->sec_ch_offset;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005265 session_entry->htSupportedChannelWidthSet =
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08005266 (ch_change_req->ch_width ? 1 : 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005267 session_entry->htRecommendedTxWidthSet =
5268 session_entry->htSupportedChannelWidthSet;
5269 session_entry->currentOperChannel =
5270 ch_change_req->targetChannel;
5271 session_entry->limRFBand =
5272 lim_get_rf_band(session_entry->currentOperChannel);
Abhishek Singh20a8e442018-09-12 15:50:44 +05305273 session_entry->cac_duration_ms = ch_change_req->cac_duration_ms;
5274 session_entry->dfs_regdomain = ch_change_req->dfs_regdomain;
5275 session_entry->maxTxPower = max_tx_pwr;
Vignesh Viswanathan153ae932018-04-11 14:24:13 +05305276
5277 /* Update the global beacon filter */
5278 lim_update_bcn_probe_filter(mac_ctx, session_entry);
5279
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005280 /* Initialize 11h Enable Flag */
gaolez76d2a162017-03-21 19:23:58 +08005281 if (CHAN_HOP_ALL_BANDS_ENABLE ||
Abhinav Kumard4d6eb72018-12-04 20:30:37 +05305282 session_entry->limRFBand == BAND_5G)
5283 session_entry->lim11hEnable =
5284 mac_ctx->mlme_cfg->gen.enabled_11h;
5285 else
5286 session_entry->lim11hEnable = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005287
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005288 session_entry->dot11mode = ch_change_req->dot11mode;
Bala Venkateshb39ed152017-12-26 19:35:27 +05305289 session_entry->nwType = ch_change_req->nw_type;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305290 qdf_mem_copy(&session_entry->rateSet,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005291 &ch_change_req->operational_rateset,
5292 sizeof(session_entry->rateSet));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305293 qdf_mem_copy(&session_entry->extRateSet,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005294 &ch_change_req->extended_rateset,
5295 sizeof(session_entry->extRateSet));
Abhishek Singh20a8e442018-09-12 15:50:44 +05305296
5297#ifdef CONFIG_VDEV_SM
Abhishek Singha063f1c2018-09-19 11:37:51 +05305298 mlme_set_chan_switch_in_progress(session_entry->vdev, true);
Abhishek Singh20a8e442018-09-12 15:50:44 +05305299 if (wlan_vdev_mlme_get_state(session_entry->vdev) ==
5300 WLAN_VDEV_S_DFS_CAC_WAIT)
5301 wlan_vdev_mlme_sm_deliver_evt(session_entry->vdev,
5302 WLAN_VDEV_SM_EV_RADAR_DETECTED,
5303 sizeof(*session_entry),
5304 session_entry);
5305 else
5306 wlan_vdev_mlme_sm_deliver_evt(session_entry->vdev,
5307 WLAN_VDEV_SM_EV_CSA_COMPLETE,
5308 sizeof(*session_entry),
5309 session_entry);
5310
5311
5312#else
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005313 lim_set_channel(mac_ctx, ch_change_req->targetChannel,
5314 session_entry->ch_center_freq_seg0,
5315 session_entry->ch_center_freq_seg1,
5316 session_entry->ch_width,
Arif Hussain671a1902017-03-17 09:08:32 -07005317 max_tx_pwr, session_entry->peSessionId,
5318 ch_change_req->cac_duration_ms,
5319 ch_change_req->dfs_regdomain);
Abhishek Singh20a8e442018-09-12 15:50:44 +05305320#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005321}
5322
5323/******************************************************************************
5324* lim_start_bss_update_add_ie_buffer()
5325*
5326***FUNCTION:
5327* This function checks the src buffer and its length and then malloc for
5328* dst buffer update the same
5329*
5330***LOGIC:
5331*
5332***ASSUMPTIONS:
5333*
5334***NOTE:
5335*
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08005336* @param mac Pointer to Global MAC structure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005337* @param **pDstData_buff A pointer to pointer of uint8_t dst buffer
5338* @param *pDstDataLen A pointer to pointer of uint16_t dst buffer length
5339* @param *pSrcData_buff A pointer of uint8_t src buffer
5340* @param srcDataLen src buffer length
5341******************************************************************************/
5342
5343static void
Jeff Johnson83d6c112018-12-02 13:05:00 -08005344lim_start_bss_update_add_ie_buffer(struct mac_context *mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005345 uint8_t **pDstData_buff,
5346 uint16_t *pDstDataLen,
5347 uint8_t *pSrcData_buff, uint16_t srcDataLen)
5348{
5349
5350 if (srcDataLen > 0 && pSrcData_buff != NULL) {
5351 *pDstDataLen = srcDataLen;
5352
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305353 *pDstData_buff = qdf_mem_malloc(*pDstDataLen);
Arif Hussainf5b6c412018-10-10 19:41:09 -07005354 if (!*pDstData_buff)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005355 return;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305356 qdf_mem_copy(*pDstData_buff, pSrcData_buff, *pDstDataLen);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005357 } else {
5358 *pDstData_buff = NULL;
5359 *pDstDataLen = 0;
5360 }
5361}
5362
5363/******************************************************************************
5364* lim_update_add_ie_buffer()
5365*
5366***FUNCTION:
5367* This function checks the src buffer and length if src buffer length more
5368* than dst buffer length then free the dst buffer and malloc for the new src
5369* length, and update the dst buffer and length. But if dst buffer is bigger
5370* than src buffer length then it just update the dst buffer and length
5371*
5372***LOGIC:
5373*
5374***ASSUMPTIONS:
5375*
5376***NOTE:
5377*
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08005378* @param mac Pointer to Global MAC structure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005379* @param **pDstData_buff A pointer to pointer of uint8_t dst buffer
5380* @param *pDstDataLen A pointer to pointer of uint16_t dst buffer length
5381* @param *pSrcData_buff A pointer of uint8_t src buffer
5382* @param srcDataLen src buffer length
5383******************************************************************************/
5384
5385static void
Jeff Johnson83d6c112018-12-02 13:05:00 -08005386lim_update_add_ie_buffer(struct mac_context *mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005387 uint8_t **pDstData_buff,
5388 uint16_t *pDstDataLen,
5389 uint8_t *pSrcData_buff, uint16_t srcDataLen)
5390{
5391
5392 if (NULL == pSrcData_buff) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07005393 pe_err("src buffer is null");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005394 return;
5395 }
5396
5397 if (srcDataLen > *pDstDataLen) {
5398 *pDstDataLen = srcDataLen;
5399 /* free old buffer */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305400 qdf_mem_free(*pDstData_buff);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005401 /* allocate a new */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305402 *pDstData_buff = qdf_mem_malloc(*pDstDataLen);
Arif Hussainf5b6c412018-10-10 19:41:09 -07005403 if (!*pDstData_buff) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005404 *pDstDataLen = 0;
5405 return;
5406 }
5407 }
5408
5409 /* copy the content of buffer into dst buffer
5410 */
5411 *pDstDataLen = srcDataLen;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305412 qdf_mem_copy(*pDstData_buff, pSrcData_buff, *pDstDataLen);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005413
5414}
5415
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08005416/**
5417 * lim_update_ibss_prop_add_ies() - update IBSS prop IE
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08005418 * @mac : Pointer to Global MAC structure
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08005419 * @pDstData_buff : A pointer to pointer of dst buffer
5420 * @pDstDataLen : A pointer to pointer of dst buffer length
5421 * @pModifyIE : A pointer to tSirModifyIE
5422 *
5423 * This function replaces previous ibss prop_ie with new ibss prop_ie.
5424 *
5425 * Return:
5426 * True or false depending upon whether IE is updated or not
5427 */
5428static bool
Jeff Johnson83d6c112018-12-02 13:05:00 -08005429lim_update_ibss_prop_add_ies(struct mac_context *mac, uint8_t **pDstData_buff,
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08005430 uint16_t *pDstDataLen, tSirModifyIE *pModifyIE)
5431{
Hong Shi1553d692016-09-28 12:16:19 +08005432 int32_t oui_length;
5433 uint8_t *ibss_ie = NULL;
5434 uint8_t *vendor_ie;
5435#define MAC_VENDOR_OUI "\x00\x16\x32"
5436#define MAC_VENDOR_SIZE 3
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08005437
5438 ibss_ie = pModifyIE->pIEBuffer;
5439 oui_length = pModifyIE->oui_length;
5440
5441 if ((0 == oui_length) || (NULL == ibss_ie)) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07005442 pe_err("Invalid set IBSS vendor IE command length %d",
5443 oui_length);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08005444 return false;
5445 }
5446
Hong Shi1553d692016-09-28 12:16:19 +08005447 /*
5448 * Why replace only beacon OUI data here:
5449 * 1. other ie (such as wpa) shall not be overwritten here.
5450 * 2. per spec, beacon oui ie might be set twice and original one
5451 * shall be updated.
5452 */
Naveen Rawat08db88f2017-09-08 15:07:48 -07005453 vendor_ie = (uint8_t *)wlan_get_vendor_ie_ptr_from_oui(MAC_VENDOR_OUI,
Hong Shi1553d692016-09-28 12:16:19 +08005454 MAC_VENDOR_SIZE, *pDstData_buff, *pDstDataLen);
5455 if (vendor_ie) {
5456 QDF_ASSERT((vendor_ie[1] + 2) == pModifyIE->ieBufferlength);
5457 qdf_mem_copy(vendor_ie, pModifyIE->pIEBuffer,
5458 pModifyIE->ieBufferlength);
5459 } else {
Naveen Rawat668dee32017-09-29 14:39:40 -07005460 uint16_t new_length;
5461 uint8_t *new_ptr;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08005462
Naveen Rawat668dee32017-09-29 14:39:40 -07005463 /*
5464 * check for uint16 overflow before using sum of two numbers as
5465 * length of size to malloc
5466 */
5467 if (USHRT_MAX - pModifyIE->ieBufferlength < *pDstDataLen) {
5468 pe_err("U16 overflow due to %d + %d",
5469 pModifyIE->ieBufferlength, *pDstDataLen);
5470 return false;
5471 }
5472
5473 new_length = pModifyIE->ieBufferlength + *pDstDataLen;
5474 new_ptr = qdf_mem_malloc(new_length);
Arif Hussainf5b6c412018-10-10 19:41:09 -07005475 if (!new_ptr)
Hong Shi1553d692016-09-28 12:16:19 +08005476 return false;
Hong Shi1553d692016-09-28 12:16:19 +08005477 qdf_mem_copy(new_ptr, *pDstData_buff, *pDstDataLen);
5478 qdf_mem_copy(&new_ptr[*pDstDataLen], pModifyIE->pIEBuffer,
5479 pModifyIE->ieBufferlength);
5480 qdf_mem_free(*pDstData_buff);
5481 *pDstDataLen = new_length;
5482 *pDstData_buff = new_ptr;
5483 }
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08005484 return true;
5485}
5486
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005487/*
5488* lim_process_modify_add_ies() - process modify additional IE req.
5489*
5490* @mac_ctx: Pointer to Global MAC structure
5491* @msg_buf: pointer to the SME message buffer
5492*
5493* This function update the PE buffers for additional IEs.
5494*
5495* Return: None
5496*/
Jeff Johnson83d6c112018-12-02 13:05:00 -08005497static void lim_process_modify_add_ies(struct mac_context *mac_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005498 uint32_t *msg_buf)
5499{
5500 tpSirModifyIEsInd modify_add_ies;
Jeff Johnson209dfa02018-11-18 22:54:38 -08005501 struct pe_session *session_entry;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005502 uint8_t session_id;
5503 bool ret = false;
5504 tSirAddIeParams *add_ie_params;
5505
5506 if (msg_buf == NULL) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07005507 pe_err("msg_buf is NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005508 return;
5509 }
5510
5511 modify_add_ies = (tpSirModifyIEsInd)msg_buf;
5512 /* Incoming message has smeSession, use BSSID to find PE session */
5513 session_entry = pe_find_session_by_bssid(mac_ctx,
Srinivas Girigowda34b634c2015-11-18 22:22:01 -08005514 modify_add_ies->modifyIE.bssid.bytes, &session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005515
5516 if (NULL == session_entry) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07005517 pe_err("Session not found for given bssid"
5518 MAC_ADDRESS_STR,
Srinivas Girigowda34b634c2015-11-18 22:22:01 -08005519 MAC_ADDR_ARRAY(modify_add_ies->modifyIE.bssid.bytes));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005520 goto end;
5521 }
5522 if ((0 == modify_add_ies->modifyIE.ieBufferlength) ||
5523 (0 == modify_add_ies->modifyIE.ieIDLen) ||
5524 (NULL == modify_add_ies->modifyIE.pIEBuffer)) {
Jeff Johnson11bd4f32017-09-18 08:15:17 -07005525 pe_err("Invalid request pIEBuffer %pK ieBufferlength %d ieIDLen %d ieID %d. update Type %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005526 modify_add_ies->modifyIE.pIEBuffer,
5527 modify_add_ies->modifyIE.ieBufferlength,
5528 modify_add_ies->modifyIE.ieID,
5529 modify_add_ies->modifyIE.ieIDLen,
5530 modify_add_ies->updateType);
5531 goto end;
5532 }
5533 add_ie_params = &session_entry->addIeParams;
5534 switch (modify_add_ies->updateType) {
5535 case eUPDATE_IE_PROBE_RESP:
5536 /* Probe resp */
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08005537 if (LIM_IS_IBSS_ROLE(session_entry)) {
5538 lim_update_ibss_prop_add_ies(mac_ctx,
5539 &add_ie_params->probeRespData_buff,
5540 &add_ie_params->probeRespDataLen,
5541 &modify_add_ies->modifyIE);
5542 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005543 break;
5544 case eUPDATE_IE_ASSOC_RESP:
5545 /* assoc resp IE */
5546 if (add_ie_params->assocRespDataLen == 0) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305547 QDF_TRACE(QDF_MODULE_ID_PE,
5548 QDF_TRACE_LEVEL_ERROR, FL(
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005549 "assoc resp add ie not present %d"),
5550 add_ie_params->assocRespDataLen);
5551 }
5552 /* search through the buffer and modify the IE */
5553 break;
5554 case eUPDATE_IE_PROBE_BCN:
5555 /*probe beacon IE */
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08005556 if (LIM_IS_IBSS_ROLE(session_entry)) {
5557 ret = lim_update_ibss_prop_add_ies(mac_ctx,
5558 &add_ie_params->probeRespBCNData_buff,
5559 &add_ie_params->probeRespBCNDataLen,
5560 &modify_add_ies->modifyIE);
5561 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005562 if (ret == true && modify_add_ies->modifyIE.notify) {
5563 lim_handle_param_update(mac_ctx,
5564 modify_add_ies->updateType);
5565 }
5566 break;
5567 default:
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07005568 pe_err("unhandled buffer type %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005569 modify_add_ies->updateType);
5570 break;
5571 }
5572end:
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305573 qdf_mem_free(modify_add_ies->modifyIE.pIEBuffer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005574 modify_add_ies->modifyIE.pIEBuffer = NULL;
5575}
5576
5577/*
5578* lim_process_update_add_ies() - process additional IE update req
5579*
5580* @mac_ctx: Pointer to Global MAC structure
5581* @msg_buf: pointer to the SME message buffer
5582*
5583* This function update the PE buffers for additional IEs.
5584*
5585* Return: None
5586*/
Jeff Johnson83d6c112018-12-02 13:05:00 -08005587static void lim_process_update_add_ies(struct mac_context *mac_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005588 uint32_t *msg_buf)
5589{
5590 tpSirUpdateIEsInd update_add_ies = (tpSirUpdateIEsInd)msg_buf;
5591 uint8_t session_id;
Jeff Johnson209dfa02018-11-18 22:54:38 -08005592 struct pe_session *session_entry;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005593 tSirAddIeParams *addn_ie;
5594 uint16_t new_length = 0;
5595 uint8_t *new_ptr = NULL;
5596 tSirUpdateIE *update_ie;
5597
5598 if (msg_buf == NULL) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07005599 pe_err("msg_buf is NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005600 return;
5601 }
5602 update_ie = &update_add_ies->updateIE;
5603 /* incoming message has smeSession, use BSSID to find PE session */
5604 session_entry = pe_find_session_by_bssid(mac_ctx,
Srinivas Girigowda8b983962015-11-18 22:14:34 -08005605 update_ie->bssid.bytes, &session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005606
5607 if (NULL == session_entry) {
Yeshwanth Sriram Guntukacbe61442018-08-23 18:08:44 +05305608 pe_debug("Session not found for given bssid"
5609 MAC_ADDRESS_STR,
5610 MAC_ADDR_ARRAY(update_ie->bssid.bytes));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005611 goto end;
5612 }
5613 addn_ie = &session_entry->addIeParams;
5614 /* if len is 0, upper layer requested freeing of buffer */
5615 if (0 == update_ie->ieBufferlength) {
5616 switch (update_add_ies->updateType) {
5617 case eUPDATE_IE_PROBE_RESP:
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305618 qdf_mem_free(addn_ie->probeRespData_buff);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005619 addn_ie->probeRespData_buff = NULL;
5620 addn_ie->probeRespDataLen = 0;
5621 break;
5622 case eUPDATE_IE_ASSOC_RESP:
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305623 qdf_mem_free(addn_ie->assocRespData_buff);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005624 addn_ie->assocRespData_buff = NULL;
5625 addn_ie->assocRespDataLen = 0;
5626 break;
5627 case eUPDATE_IE_PROBE_BCN:
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305628 qdf_mem_free(addn_ie->probeRespBCNData_buff);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005629 addn_ie->probeRespBCNData_buff = NULL;
5630 addn_ie->probeRespBCNDataLen = 0;
5631
5632 if (update_ie->notify)
5633 lim_handle_param_update(mac_ctx,
5634 update_add_ies->updateType);
5635 break;
5636 default:
5637 break;
5638 }
5639 return;
5640 }
5641 switch (update_add_ies->updateType) {
5642 case eUPDATE_IE_PROBE_RESP:
5643 if (update_ie->append) {
5644 /*
5645 * In case of append, allocate new memory
Varun Reddy Yeturu84637fc2017-10-02 11:52:37 -07005646 * with combined length.
5647 * Multiple back to back append commands
5648 * can lead to a huge length.So, check
5649 * for the validity of the length.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005650 */
Varun Reddy Yeturu84637fc2017-10-02 11:52:37 -07005651 if (addn_ie->probeRespDataLen >
5652 (USHRT_MAX - update_ie->ieBufferlength)) {
5653 pe_err("IE Length overflow, curr:%d, new:%d",
5654 addn_ie->probeRespDataLen,
5655 update_ie->ieBufferlength);
5656 goto end;
5657 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005658 new_length = update_ie->ieBufferlength +
5659 addn_ie->probeRespDataLen;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305660 new_ptr = qdf_mem_malloc(new_length);
Arif Hussainf5b6c412018-10-10 19:41:09 -07005661 if (!new_ptr)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005662 goto end;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005663 /* append buffer to end of local buffers */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305664 qdf_mem_copy(new_ptr, addn_ie->probeRespData_buff,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005665 addn_ie->probeRespDataLen);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305666 qdf_mem_copy(&new_ptr[addn_ie->probeRespDataLen],
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005667 update_ie->pAdditionIEBuffer,
5668 update_ie->ieBufferlength);
5669 /* free old memory */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305670 qdf_mem_free(addn_ie->probeRespData_buff);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005671 /* adjust length accordingly */
5672 addn_ie->probeRespDataLen = new_length;
5673 /* save refernece of local buffer in PE session */
5674 addn_ie->probeRespData_buff = new_ptr;
5675 goto end;
5676 }
5677 lim_update_add_ie_buffer(mac_ctx, &addn_ie->probeRespData_buff,
5678 &addn_ie->probeRespDataLen,
5679 update_ie->pAdditionIEBuffer,
5680 update_ie->ieBufferlength);
5681 break;
5682 case eUPDATE_IE_ASSOC_RESP:
5683 /* assoc resp IE */
5684 lim_update_add_ie_buffer(mac_ctx, &addn_ie->assocRespData_buff,
5685 &addn_ie->assocRespDataLen,
5686 update_ie->pAdditionIEBuffer,
5687 update_ie->ieBufferlength);
5688 break;
5689 case eUPDATE_IE_PROBE_BCN:
5690 /* probe resp Bcn IE */
5691 lim_update_add_ie_buffer(mac_ctx,
5692 &addn_ie->probeRespBCNData_buff,
5693 &addn_ie->probeRespBCNDataLen,
5694 update_ie->pAdditionIEBuffer,
5695 update_ie->ieBufferlength);
5696 if (update_ie->notify)
5697 lim_handle_param_update(mac_ctx,
5698 update_add_ies->updateType);
5699 break;
5700 default:
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07005701 pe_err("unhandled buffer type %d", update_add_ies->updateType);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005702 break;
5703 }
5704end:
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305705 qdf_mem_free(update_ie->pAdditionIEBuffer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005706 update_ie->pAdditionIEBuffer = NULL;
5707}
5708
5709/**
Abhishek Singh518323d2015-10-19 17:42:01 +05305710 * send_extended_chan_switch_action_frame()- function to send ECSA
5711 * action frame for each sta connected to SAP/GO and AP in case of
5712 * STA .
5713 * @mac_ctx: pointer to global mac structure
5714 * @new_channel: new channel to switch to.
5715 * @ch_bandwidth: BW of channel to calculate op_class
5716 * @session_entry: pe session
5717 *
5718 * This function is called to send ECSA frame for STA/CLI and SAP/GO.
5719 *
5720 * Return: void
5721 */
5722
Jeff Johnson83d6c112018-12-02 13:05:00 -08005723static void send_extended_chan_switch_action_frame(struct mac_context *mac_ctx,
Abhishek Singh518323d2015-10-19 17:42:01 +05305724 uint16_t new_channel, uint8_t ch_bandwidth,
Jeff Johnson209dfa02018-11-18 22:54:38 -08005725 struct pe_session *session_entry)
Abhishek Singh518323d2015-10-19 17:42:01 +05305726{
5727 uint16_t op_class;
5728 uint8_t switch_mode = 0, i;
5729 tpDphHashNode psta;
gaoleze2920bd2017-03-21 17:38:42 +08005730 uint8_t switch_count;
Abhishek Singh518323d2015-10-19 17:42:01 +05305731
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07005732 op_class = wlan_reg_dmn_get_opclass_from_channel(
Abhishek Singh518323d2015-10-19 17:42:01 +05305733 mac_ctx->scan.countryCodeCurrent,
5734 new_channel,
5735 ch_bandwidth);
5736
5737 if (LIM_IS_AP_ROLE(session_entry) &&
5738 (mac_ctx->sap.SapDfsInfo.disable_dfs_ch_switch == false))
gaolez76d2a162017-03-21 19:23:58 +08005739 switch_mode = session_entry->gLimChannelSwitch.switchMode;
Abhishek Singh518323d2015-10-19 17:42:01 +05305740
gaoleze2920bd2017-03-21 17:38:42 +08005741 switch_count = session_entry->gLimChannelSwitch.switchCount;
5742
Abhishek Singh518323d2015-10-19 17:42:01 +05305743 if (LIM_IS_AP_ROLE(session_entry)) {
gaolez3b07a2c2017-03-22 12:59:17 +08005744 for (i = 0; i <= mac_ctx->lim.maxStation; i++) {
Abhishek Singh518323d2015-10-19 17:42:01 +05305745 psta =
5746 session_entry->dph.dphHashTable.pDphNodeArray + i;
5747 if (psta && psta->added)
5748 lim_send_extended_chan_switch_action_frame(
5749 mac_ctx,
5750 psta->staAddr,
5751 switch_mode, op_class, new_channel,
gaoleze2920bd2017-03-21 17:38:42 +08005752 switch_count, session_entry);
Abhishek Singh518323d2015-10-19 17:42:01 +05305753 }
5754 } else if (LIM_IS_STA_ROLE(session_entry)) {
5755 lim_send_extended_chan_switch_action_frame(mac_ctx,
5756 session_entry->bssId,
5757 switch_mode, op_class, new_channel,
gaoleze2920bd2017-03-21 17:38:42 +08005758 switch_count, session_entry);
Abhishek Singh518323d2015-10-19 17:42:01 +05305759 }
5760
5761}
5762
Jeff Johnson83d6c112018-12-02 13:05:00 -08005763void lim_send_chan_switch_action_frame(struct mac_context *mac_ctx,
gaolez76d2a162017-03-21 19:23:58 +08005764 uint16_t new_channel,
5765 uint8_t ch_bandwidth,
Jeff Johnson209dfa02018-11-18 22:54:38 -08005766 struct pe_session *session_entry)
gaolez76d2a162017-03-21 19:23:58 +08005767{
5768 uint16_t op_class;
5769 uint8_t switch_mode = 0, i;
5770 uint8_t switch_count;
5771 tpDphHashNode psta;
5772 tpDphHashNode dph_node_array_ptr;
5773
5774 dph_node_array_ptr = session_entry->dph.dphHashTable.pDphNodeArray;
5775
5776 op_class = wlan_reg_dmn_get_opclass_from_channel(
5777 mac_ctx->scan.countryCodeCurrent,
5778 new_channel, ch_bandwidth);
5779
5780 if (LIM_IS_AP_ROLE(session_entry) &&
5781 (false == mac_ctx->sap.SapDfsInfo.disable_dfs_ch_switch))
5782 switch_mode = session_entry->gLimChannelSwitch.switchMode;
5783
5784 switch_count = session_entry->gLimChannelSwitch.switchCount;
5785
5786 if (LIM_IS_AP_ROLE(session_entry)) {
5787 for (i = 0; i < mac_ctx->lim.maxStation; i++) {
5788 psta = dph_node_array_ptr + i;
5789 if (!(psta && psta->added))
5790 continue;
5791 if (session_entry->lim_non_ecsa_cap_num == 0)
5792 lim_send_extended_chan_switch_action_frame
5793 (mac_ctx, psta->staAddr, switch_mode,
5794 op_class, new_channel, switch_count,
5795 session_entry);
5796 else
5797 lim_send_channel_switch_mgmt_frame
5798 (mac_ctx, psta->staAddr, switch_mode,
5799 new_channel, switch_count,
5800 session_entry);
5801 }
5802 } else if (LIM_IS_STA_ROLE(session_entry)) {
5803 lim_send_extended_chan_switch_action_frame
5804 (mac_ctx, session_entry->bssId, switch_mode, op_class,
5805 new_channel, switch_count, session_entry);
5806 }
5807}
5808
5809/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005810 * lim_process_sme_dfs_csa_ie_request() - process sme dfs csa ie req
5811 *
5812 * @mac_ctx: Pointer to Global MAC structure
5813 * @msg_buf: pointer to the SME message buffer
5814 *
5815 * This function processes SME request messages from HDD or upper layer
5816 * application.
5817 *
5818 * Return: None
5819 */
Jeff Johnson83d6c112018-12-02 13:05:00 -08005820static void lim_process_sme_dfs_csa_ie_request(struct mac_context *mac_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005821 uint32_t *msg_buf)
5822{
5823 tpSirDfsCsaIeRequest dfs_csa_ie_req;
Jeff Johnson209dfa02018-11-18 22:54:38 -08005824 struct pe_session *session_entry = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005825 uint8_t session_id;
5826 tLimWiderBWChannelSwitchInfo *wider_bw_ch_switch;
Amar Singhal22995112016-01-22 10:42:33 -08005827 enum offset_t ch_offset;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005828
5829 if (msg_buf == NULL) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07005830 pe_err("Buffer is Pointing to NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005831 return;
5832 }
5833
5834 dfs_csa_ie_req = (tSirDfsCsaIeRequest *)msg_buf;
5835 session_entry = pe_find_session_by_bssid(mac_ctx,
5836 dfs_csa_ie_req->bssid, &session_id);
5837 if (session_entry == NULL) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07005838 pe_err("Session not found for given BSSID" MAC_ADDRESS_STR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005839 MAC_ADDR_ARRAY(dfs_csa_ie_req->bssid));
5840 return;
5841 }
5842
5843 if (session_entry->valid && !LIM_IS_AP_ROLE(session_entry)) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07005844 pe_err("Invalid SystemRole %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005845 GET_LIM_SYSTEM_ROLE(session_entry));
5846 return;
5847 }
5848
5849 /* target channel */
5850 session_entry->gLimChannelSwitch.primaryChannel =
5851 dfs_csa_ie_req->targetChannel;
5852
5853 /* Channel switch announcement needs to be included in beacon */
5854 session_entry->dfsIncludeChanSwIe = true;
gaoleze2920bd2017-03-21 17:38:42 +08005855 session_entry->gLimChannelSwitch.switchCount =
5856 dfs_csa_ie_req->ch_switch_beacon_cnt;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005857 session_entry->gLimChannelSwitch.ch_width =
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08005858 dfs_csa_ie_req->ch_params.ch_width;
Chandrasekaran Manishekar4fcb7f52016-03-07 19:09:20 +05305859 session_entry->gLimChannelSwitch.sec_ch_offset =
5860 dfs_csa_ie_req->ch_params.sec_ch_offset;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005861 if (mac_ctx->sap.SapDfsInfo.disable_dfs_ch_switch == false)
gaolez76d2a162017-03-21 19:23:58 +08005862 session_entry->gLimChannelSwitch.switchMode =
5863 dfs_csa_ie_req->ch_switch_mode;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005864
5865 /*
5866 * Validate if SAP is operating HT or VHT mode and set the Channel
5867 * Switch Wrapper element with the Wide Band Switch subelement.
5868 */
5869 if (true != session_entry->vhtCapability)
5870 goto skip_vht;
5871
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005872 /* Now encode the Wider Ch BW element depending on the ch width */
5873 wider_bw_ch_switch = &session_entry->gLimWiderBWChannelSwitch;
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08005874 switch (dfs_csa_ie_req->ch_params.ch_width) {
5875 case CH_WIDTH_20MHZ:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005876 /*
5877 * Wide channel BW sublement in channel wrapper element is not
5878 * required in case of 20 Mhz operation. Currently It is set
5879 * only set in case of 40/80 Mhz Operation.
5880 */
5881 session_entry->dfsIncludeChanWrapperIe = false;
5882 wider_bw_ch_switch->newChanWidth =
5883 WNI_CFG_VHT_CHANNEL_WIDTH_20_40MHZ;
5884 break;
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08005885 case CH_WIDTH_40MHZ:
5886 session_entry->dfsIncludeChanWrapperIe = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005887 wider_bw_ch_switch->newChanWidth =
5888 WNI_CFG_VHT_CHANNEL_WIDTH_20_40MHZ;
5889 break;
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08005890 case CH_WIDTH_80MHZ:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005891 session_entry->dfsIncludeChanWrapperIe = true;
5892 wider_bw_ch_switch->newChanWidth =
5893 WNI_CFG_VHT_CHANNEL_WIDTH_80MHZ;
5894 break;
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08005895 case CH_WIDTH_160MHZ:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005896 session_entry->dfsIncludeChanWrapperIe = true;
5897 wider_bw_ch_switch->newChanWidth =
5898 WNI_CFG_VHT_CHANNEL_WIDTH_160MHZ;
5899 break;
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08005900 case CH_WIDTH_80P80MHZ:
5901 session_entry->dfsIncludeChanWrapperIe = true;
5902 wider_bw_ch_switch->newChanWidth =
5903 WNI_CFG_VHT_CHANNEL_WIDTH_80_PLUS_80MHZ;
Sandeep Puligilla2111d3c2016-02-03 01:46:15 -08005904 /*
5905 * This is not applicable for 20/40/80 Mhz.
5906 * Only used when we support 80+80 Mhz operation.
5907 * In case of 80+80 Mhz, this parameter indicates
5908 * center channel frequency index of 80 Mhz channel of
5909 * frequency segment 1.
5910 */
5911 wider_bw_ch_switch->newCenterChanFreq1 =
5912 dfs_csa_ie_req->ch_params.center_freq_seg1;
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08005913 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005914 default:
5915 session_entry->dfsIncludeChanWrapperIe = false;
5916 /*
5917 * Need to handle 80+80 Mhz Scenario. When 80+80 is supported
5918 * set the gLimWiderBWChannelSwitch.newChanWidth to 3
5919 */
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07005920 pe_err("Invalid Channel Width");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005921 break;
5922 }
5923 /* Fetch the center channel based on the channel width */
5924 wider_bw_ch_switch->newCenterChanFreq0 =
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08005925 dfs_csa_ie_req->ch_params.center_freq_seg0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005926skip_vht:
5927 /* Send CSA IE request from here */
Pragaspathi Thilagaraj934275c2018-08-07 14:55:35 +05305928 lim_send_dfs_chan_sw_ie_update(mac_ctx, session_entry);
Chandrasekaran, Manishekardc351562016-01-11 19:28:52 +05305929
5930 if (dfs_csa_ie_req->ch_params.ch_width == CH_WIDTH_80MHZ)
5931 ch_offset = BW80;
5932 else
5933 ch_offset = dfs_csa_ie_req->ch_params.sec_ch_offset;
5934
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07005935 pe_debug("IE count:%d chan:%d width:%d wrapper:%d ch_offset:%d",
Chandrasekaran, Manishekardc351562016-01-11 19:28:52 +05305936 session_entry->gLimChannelSwitch.switchCount,
5937 session_entry->gLimChannelSwitch.primaryChannel,
5938 session_entry->gLimChannelSwitch.ch_width,
5939 session_entry->dfsIncludeChanWrapperIe,
5940 ch_offset);
5941
gaolez76d2a162017-03-21 19:23:58 +08005942 /* Send ECSA/CSA Action frame after updating the beacon */
5943 if (CHAN_HOP_ALL_BANDS_ENABLE)
5944 lim_send_chan_switch_action_frame(mac_ctx,
5945 session_entry->gLimChannelSwitch.primaryChannel,
5946 ch_offset, session_entry);
5947 else
5948 send_extended_chan_switch_action_frame(mac_ctx,
5949 session_entry->gLimChannelSwitch.primaryChannel,
5950 ch_offset, session_entry);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005951}
5952
5953/**
Abhishek Singh518323d2015-10-19 17:42:01 +05305954 * lim_process_ext_change_channel()- function to send ECSA
5955 * action frame for STA/CLI .
5956 * @mac_ctx: pointer to global mac structure
5957 * @msg: params from sme for new channel.
5958 *
5959 * This function is called to send ECSA frame for STA/CLI.
5960 *
5961 * Return: void
5962 */
5963
Jeff Johnson83d6c112018-12-02 13:05:00 -08005964static void lim_process_ext_change_channel(struct mac_context *mac_ctx,
Abhishek Singh518323d2015-10-19 17:42:01 +05305965 uint32_t *msg)
5966{
5967 struct sir_sme_ext_cng_chan_req *ext_chng_channel =
5968 (struct sir_sme_ext_cng_chan_req *) msg;
Jeff Johnson209dfa02018-11-18 22:54:38 -08005969 struct pe_session *session_entry = NULL;
Abhishek Singh518323d2015-10-19 17:42:01 +05305970
5971 if (NULL == msg) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07005972 pe_err("Buffer is Pointing to NULL");
Abhishek Singh518323d2015-10-19 17:42:01 +05305973 return;
5974 }
5975 session_entry =
5976 pe_find_session_by_sme_session_id(mac_ctx,
5977 ext_chng_channel->session_id);
5978 if (NULL == session_entry) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07005979 pe_err("Session not found for given session %d",
Abhishek Singh518323d2015-10-19 17:42:01 +05305980 ext_chng_channel->session_id);
5981 return;
5982 }
5983 if (LIM_IS_AP_ROLE(session_entry)) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07005984 pe_err("not an STA/CLI session");
Abhishek Singh518323d2015-10-19 17:42:01 +05305985 return;
5986 }
5987 send_extended_chan_switch_action_frame(mac_ctx,
5988 ext_chng_channel->new_channel,
5989 0, session_entry);
5990}
5991
5992/**
Abhishek Singhfc740be2018-10-12 11:34:26 +05305993 * lim_nss_update_rsp() - send NSS update response to SME
5994 * @mac_ctx Pointer to Global MAC structure
5995 * @vdev_id: vdev id
5996 * @status: nss update status
5997 *
5998 * Return: None
5999 */
Jeff Johnson83d6c112018-12-02 13:05:00 -08006000static void lim_nss_update_rsp(struct mac_context *mac_ctx,
Abhishek Singhfc740be2018-10-12 11:34:26 +05306001 uint8_t vdev_id, QDF_STATUS status)
6002{
6003 struct scheduler_msg msg = {0};
6004 struct sir_bcn_update_rsp *nss_rsp;
6005 QDF_STATUS qdf_status;
6006
6007 nss_rsp = qdf_mem_malloc(sizeof(*nss_rsp));
6008 if (!nss_rsp) {
6009 pe_err("AllocateMemory failed for nss_rsp");
6010 return;
6011 }
6012
6013 nss_rsp->vdev_id = vdev_id;
6014 nss_rsp->status = status;
6015 nss_rsp->reason = REASON_NSS_UPDATE;
6016
6017 msg.type = eWNI_SME_NSS_UPDATE_RSP;
6018 msg.bodyptr = nss_rsp;
6019 msg.bodyval = 0;
6020 qdf_status = scheduler_post_message(QDF_MODULE_ID_PE, QDF_MODULE_ID_SME,
6021 QDF_MODULE_ID_SME, &msg);
6022 if (QDF_IS_STATUS_ERROR(qdf_status)) {
6023 pe_err("Failed to post eWNI_SME_NSS_UPDATE_RSP");
6024 qdf_mem_free(nss_rsp);
6025 }
6026}
6027
Jeff Johnson83d6c112018-12-02 13:05:00 -08006028void lim_send_bcn_rsp(struct mac_context *mac_ctx, tpSendbeaconParams rsp)
Abhishek Singhfc740be2018-10-12 11:34:26 +05306029{
6030 if (!rsp) {
6031 pe_err("rsp is NULL");
6032 return;
6033 }
6034
6035 pe_debug("Send beacon resp status %d for reason %d",
6036 rsp->status, rsp->reason);
6037
6038 if (rsp->reason == REASON_NSS_UPDATE)
6039 lim_nss_update_rsp(mac_ctx, rsp->vdev_id, rsp->status);
6040}
6041
6042/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006043 * lim_process_nss_update_request() - process sme nss update req
6044 *
6045 * @mac_ctx: Pointer to Global MAC structure
6046 * @msg_buf: pointer to the SME message buffer
6047 *
6048 * This function processes SME request messages from HDD or upper layer
6049 * application.
6050 *
6051 * Return: None
6052 */
Jeff Johnson83d6c112018-12-02 13:05:00 -08006053static void lim_process_nss_update_request(struct mac_context *mac_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006054 uint32_t *msg_buf)
6055{
6056 struct sir_nss_update_request *nss_update_req_ptr;
Jeff Johnson209dfa02018-11-18 22:54:38 -08006057 struct pe_session *session_entry = NULL;
Abhishek Singhfc740be2018-10-12 11:34:26 +05306058 QDF_STATUS status = QDF_STATUS_E_FAILURE;
6059 uint8_t vdev_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006060
Abhishek Singhfc740be2018-10-12 11:34:26 +05306061 if (!msg_buf) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07006062 pe_err("Buffer is Pointing to NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006063 return;
6064 }
6065
6066 nss_update_req_ptr = (struct sir_nss_update_request *)msg_buf;
Abhishek Singhfc740be2018-10-12 11:34:26 +05306067 vdev_id = nss_update_req_ptr->vdev_id;
Chandrasekaran, Manishekar5738eb02016-02-02 12:22:00 +05306068 session_entry = pe_find_session_by_sme_session_id(mac_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006069 nss_update_req_ptr->vdev_id);
Abhishek Singhfc740be2018-10-12 11:34:26 +05306070 if (!session_entry) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07006071 pe_err("Session not found for given session_id %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006072 nss_update_req_ptr->vdev_id);
Abhishek Singhfc740be2018-10-12 11:34:26 +05306073 goto end;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006074 }
6075
6076 if (session_entry->valid && !LIM_IS_AP_ROLE(session_entry)) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07006077 pe_err("Invalid SystemRole %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006078 GET_LIM_SYSTEM_ROLE(session_entry));
Abhishek Singhfc740be2018-10-12 11:34:26 +05306079 goto end;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006080 }
6081
6082 /* populate nss field in the beacon */
6083 session_entry->gLimOperatingMode.present = 1;
6084 session_entry->gLimOperatingMode.rxNSS = nss_update_req_ptr->new_nss;
Ganesh Kondabattini5e0ac2a2017-05-16 14:29:32 +05306085 session_entry->gLimOperatingMode.chanWidth = session_entry->ch_width;
6086
6087 if ((nss_update_req_ptr->new_nss == NSS_1x1_MODE) &&
6088 (session_entry->ch_width > CH_WIDTH_80MHZ))
6089 session_entry->gLimOperatingMode.chanWidth = CH_WIDTH_80MHZ;
6090
Abhishek Singhfc740be2018-10-12 11:34:26 +05306091 pe_debug("ch width %d Rx NSS %d",
6092 session_entry->gLimOperatingMode.chanWidth,
6093 session_entry->gLimOperatingMode.rxNSS);
Ganesh Kondabattini5e0ac2a2017-05-16 14:29:32 +05306094
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006095 /* Send nss update request from here */
Abhishek Singhfc740be2018-10-12 11:34:26 +05306096 status = sch_set_fixed_beacon_fields(mac_ctx, session_entry);
6097 if (QDF_IS_STATUS_ERROR(status)) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07006098 pe_err("Unable to set op mode IE in beacon");
Abhishek Singhfc740be2018-10-12 11:34:26 +05306099 goto end;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006100 }
6101
Abhishek Singhfc740be2018-10-12 11:34:26 +05306102 status = lim_send_beacon_ind(mac_ctx, session_entry, REASON_NSS_UPDATE);
6103 if (QDF_IS_STATUS_SUCCESS(status))
6104 return;
6105
6106 pe_err("Unable to send beacon");
6107end:
6108 /*
6109 * send resp only in case of failure,
6110 * success case response will be from wma.
6111 */
6112 lim_nss_update_rsp(mac_ctx, vdev_id, status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006113}
6114
6115/**
6116 * lim_process_set_ie_req() - process sme set IE request
6117 *
6118 * @mac_ctx: Pointer to Global MAC structure
6119 * @msg_buf: pointer to the SME message buffer
6120 *
6121 * This function processes SME request messages from HDD or upper layer
6122 * application.
6123 *
6124 * Return: None
6125 */
Jeff Johnson83d6c112018-12-02 13:05:00 -08006126static void lim_process_set_ie_req(struct mac_context *mac_ctx, uint32_t *msg_buf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006127{
6128 struct send_extcap_ie *msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306129 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006130
6131 if (msg_buf == NULL) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07006132 pe_err("Buffer is Pointing to NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006133 return;
6134 }
6135
6136 msg = (struct send_extcap_ie *)msg_buf;
6137 status = lim_send_ext_cap_ie(mac_ctx, msg->session_id, NULL, false);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306138 if (QDF_STATUS_SUCCESS != status)
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07006139 pe_err("Unable to send ExtCap to FW");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006140
6141}
Kiran Kumar Lokeree6476b22017-10-16 23:40:32 -07006142
6143#ifdef WLAN_FEATURE_11AX_BSS_COLOR
Arif Hussain05fb4872018-01-03 16:02:55 -08006144
6145/**
6146 * obss_color_collision_process_color_disable() - Disable bss color
6147 * @mac_ctx: Pointer to Global MAC structure
6148 * @session: pointer to session
6149 *
6150 * This function will disbale bss color.
6151 *
6152 * Return: None
6153 */
Jeff Johnson83d6c112018-12-02 13:05:00 -08006154static void obss_color_collision_process_color_disable(struct mac_context *mac_ctx,
Jeff Johnson209dfa02018-11-18 22:54:38 -08006155 struct pe_session *session)
Arif Hussain05fb4872018-01-03 16:02:55 -08006156{
6157 tUpdateBeaconParams beacon_params;
6158
6159 if (!session) {
6160 pe_err("Invalid session");
6161 return;
6162 }
6163
6164 if (session->valid && !LIM_IS_AP_ROLE(session)) {
6165 pe_err("Invalid SystemRole %d",
6166 GET_LIM_SYSTEM_ROLE(session));
6167 return;
6168 }
6169
6170 if (session->bss_color_changing == 1) {
6171 pe_warn("%d: color change in progress", session->smeSessionId);
6172 /* Continue color collision detection */
6173 lim_send_obss_color_collision_cfg(mac_ctx, session,
6174 OBSS_COLOR_COLLISION_DETECTION);
6175 return;
6176 }
6177
6178 if (session->he_op.bss_col_disabled == 1) {
6179 pe_warn("%d: bss color already disabled",
6180 session->smeSessionId);
6181 /* Continue free color detection */
6182 lim_send_obss_color_collision_cfg(mac_ctx, session,
6183 OBSS_COLOR_FREE_SLOT_AVAILABLE);
6184 return;
6185 }
6186
6187 qdf_mem_zero(&beacon_params, sizeof(beacon_params));
6188 beacon_params.paramChangeBitmap |= PARAM_BSS_COLOR_CHANGED;
6189 session->he_op.bss_col_disabled = 1;
Arif Hussain05fb4872018-01-03 16:02:55 -08006190 beacon_params.bss_color_disabled = 1;
Arif Hussain2f2d3512018-03-06 12:37:03 -08006191 beacon_params.bss_color = session->he_op.bss_color;
Arif Hussain05fb4872018-01-03 16:02:55 -08006192
6193 if (sch_set_fixed_beacon_fields(mac_ctx, session) !=
Jeff Johnson0301ecb2018-06-29 09:36:23 -07006194 QDF_STATUS_SUCCESS) {
Arif Hussain05fb4872018-01-03 16:02:55 -08006195 pe_err("Unable to set op mode IE in beacon");
6196 return;
6197 }
6198
6199 lim_send_beacon_params(mac_ctx, &beacon_params, session);
6200 lim_send_obss_color_collision_cfg(mac_ctx, session,
6201 OBSS_COLOR_FREE_SLOT_AVAILABLE);
6202}
6203
6204/**
6205 * obss_color_collision_process_color_change() - Process bss color change
6206 * @mac_ctx: Pointer to Global MAC structure
6207 * @session: pointer to session
6208 * @obss_color_info: obss color collision/free slot indication info
6209 *
6210 * This function selects new color ib case of bss color collision.
6211 *
6212 * Return: None
6213 */
Jeff Johnson83d6c112018-12-02 13:05:00 -08006214static void obss_color_collision_process_color_change(struct mac_context *mac_ctx,
Jeff Johnson209dfa02018-11-18 22:54:38 -08006215 struct pe_session *session,
Arif Hussain05fb4872018-01-03 16:02:55 -08006216 struct wmi_obss_color_collision_info *obss_color_info)
6217{
6218 int i, num_bss_color = 0;
6219 uint32_t bss_color_bitmap;
6220 uint8_t bss_color_index_array[MAX_BSS_COLOR_VALUE];
6221 uint32_t rand_byte = 0;
6222 struct sir_set_he_bss_color he_bss_color;
6223 bool is_color_collision = false;
6224
6225
6226 if (session->bss_color_changing == 1) {
6227 pe_err("%d: color change in progress", session->smeSessionId);
6228 return;
6229 }
6230
6231 if (!session->he_op.bss_col_disabled) {
6232 if (session->he_op.bss_color < 32)
6233 is_color_collision = (obss_color_info->
6234 obss_color_bitmap_bit0to31 >>
6235 session->he_op.bss_color) & 0x01;
6236 else
6237 is_color_collision = (obss_color_info->
6238 obss_color_bitmap_bit32to63 >>
6239 (session->he_op.bss_color -
Arif Hussain9e8c5612018-04-12 16:35:48 -07006240 32)) & 0x01;
Arif Hussain05fb4872018-01-03 16:02:55 -08006241 if (!is_color_collision) {
6242 pe_err("%d: color collision not found, curr_color: %d",
6243 session->smeSessionId,
6244 session->he_op.bss_color);
6245 return;
6246 }
6247 }
6248
6249 bss_color_bitmap = obss_color_info->obss_color_bitmap_bit0to31;
6250
6251 /* Skip color zero */
6252 bss_color_bitmap = bss_color_bitmap >> 1;
6253 for (i = 0; (i < 31) && (num_bss_color < MAX_BSS_COLOR_VALUE); i++) {
6254 if (!(bss_color_bitmap & 0x01)) {
6255 bss_color_index_array[num_bss_color] = i + 1;
6256 num_bss_color++;
6257 }
6258 bss_color_bitmap = bss_color_bitmap >> 1;
6259 }
6260
6261 bss_color_bitmap = obss_color_info->obss_color_bitmap_bit32to63;
6262 for (i = 0; (i < 32) && (num_bss_color < MAX_BSS_COLOR_VALUE); i++) {
6263 if (!(bss_color_bitmap & 0x01)) {
6264 bss_color_index_array[num_bss_color] = i + 32;
6265 num_bss_color++;
6266 }
6267 bss_color_bitmap = bss_color_bitmap >> 1;
6268 }
6269
6270 if (num_bss_color) {
6271 qdf_get_random_bytes((void *) &rand_byte, 1);
6272 i = (rand_byte + qdf_mc_timer_get_system_ticks()) %
6273 num_bss_color;
6274 pe_debug("New bss color = %d", bss_color_index_array[i]);
6275 he_bss_color.session_id = obss_color_info->vdev_id;
6276 he_bss_color.bss_color = bss_color_index_array[i];
6277 lim_process_set_he_bss_color(mac_ctx,
6278 (uint32_t *)&he_bss_color);
6279 } else {
6280 pe_err("Unable to find bss color from bitmasp");
6281 if (obss_color_info->evt_type ==
6282 OBSS_COLOR_FREE_SLOT_TIMER_EXPIRY &&
6283 session->obss_color_collision_dec_evt ==
6284 OBSS_COLOR_FREE_SLOT_TIMER_EXPIRY)
6285 /* In dot11BSSColorCollisionAPPeriod and
6286 * timer expired, time to disable bss color.
6287 */
6288 obss_color_collision_process_color_disable(mac_ctx,
6289 session);
6290 else
6291 /*
6292 * Enter dot11BSSColorCollisionAPPeriod period.
6293 */
6294 lim_send_obss_color_collision_cfg(mac_ctx, session,
6295 OBSS_COLOR_FREE_SLOT_TIMER_EXPIRY);
6296 }
6297}
6298
Jeff Johnson83d6c112018-12-02 13:05:00 -08006299void lim_process_set_he_bss_color(struct mac_context *mac_ctx, uint32_t *msg_buf)
Kiran Kumar Lokeree6476b22017-10-16 23:40:32 -07006300{
6301 struct sir_set_he_bss_color *bss_color;
Jeff Johnson209dfa02018-11-18 22:54:38 -08006302 struct pe_session *session_entry = NULL;
Kiran Kumar Lokeree6476b22017-10-16 23:40:32 -07006303 tUpdateBeaconParams beacon_params;
6304
6305 if (!msg_buf) {
6306 pe_err("Buffer is Pointing to NULL");
6307 return;
6308 }
6309
6310 bss_color = (struct sir_set_he_bss_color *)msg_buf;
6311 session_entry = pe_find_session_by_sme_session_id(mac_ctx,
6312 bss_color->session_id);
6313 if (!session_entry) {
6314 pe_err("Session not found for given session_id %d",
6315 bss_color->session_id);
6316 return;
6317 }
6318
6319 if (session_entry->valid && !LIM_IS_AP_ROLE(session_entry)) {
6320 pe_err("Invalid SystemRole %d",
6321 GET_LIM_SYSTEM_ROLE(session_entry));
6322 return;
6323 }
6324
6325 if (bss_color->bss_color == session_entry->he_op.bss_color) {
6326 pe_err("No change in BSS color, current BSS color %d",
6327 bss_color->bss_color);
6328 return;
6329 }
6330 qdf_mem_zero(&beacon_params, sizeof(beacon_params));
6331 beacon_params.paramChangeBitmap |= PARAM_BSS_COLOR_CHANGED;
6332 session_entry->he_op.bss_col_disabled = 1;
6333 session_entry->he_bss_color_change.countdown =
6334 BSS_COLOR_SWITCH_COUNTDOWN;
6335 session_entry->he_bss_color_change.new_color = bss_color->bss_color;
Arif Hussain2f2d3512018-03-06 12:37:03 -08006336 beacon_params.bss_color_disabled = 1;
6337 beacon_params.bss_color = session_entry->he_op.bss_color;
Kiran Kumar Lokeree6476b22017-10-16 23:40:32 -07006338 session_entry->bss_color_changing = 1;
6339
6340 if (sch_set_fixed_beacon_fields(mac_ctx, session_entry) !=
Jeff Johnson0301ecb2018-06-29 09:36:23 -07006341 QDF_STATUS_SUCCESS) {
Kiran Kumar Lokeree6476b22017-10-16 23:40:32 -07006342 pe_err("Unable to set op mode IE in beacon");
6343 return;
6344 }
6345
6346 lim_send_beacon_params(mac_ctx, &beacon_params, session_entry);
Arif Hussain05fb4872018-01-03 16:02:55 -08006347 lim_send_obss_color_collision_cfg(mac_ctx, session_entry,
6348 OBSS_COLOR_COLLISION_DETECTION_DISABLE);
6349}
6350
Jeff Johnson83d6c112018-12-02 13:05:00 -08006351void lim_send_obss_color_collision_cfg(struct mac_context *mac_ctx,
Jeff Johnson209dfa02018-11-18 22:54:38 -08006352 struct pe_session *session,
Arif Hussain05fb4872018-01-03 16:02:55 -08006353 enum wmi_obss_color_collision_evt_type
6354 event_type)
6355{
6356 struct wmi_obss_color_collision_cfg_param *cfg_param;
6357 struct scheduler_msg msg = {0};
6358
6359 if (!session) {
6360 pe_err("Invalid session");
6361 return;
6362 }
6363
6364 if (!session->he_capable ||
6365 !session->is_session_obss_color_collision_det_enabled) {
6366 pe_debug("%d: obss color det not enabled, he_cap:%d, sup:%d:%d",
6367 session->smeSessionId, session->he_capable,
6368 session->is_session_obss_color_collision_det_enabled,
6369 mac_ctx->lim.global_obss_color_collision_det_offload);
6370 return;
6371 }
6372
6373 cfg_param = qdf_mem_malloc(sizeof(*cfg_param));
Arif Hussainf5b6c412018-10-10 19:41:09 -07006374 if (!cfg_param)
Arif Hussain05fb4872018-01-03 16:02:55 -08006375 return;
Arif Hussain05fb4872018-01-03 16:02:55 -08006376
6377 pe_debug("%d: sending event:%d", session->smeSessionId, event_type);
6378 qdf_mem_zero(cfg_param, sizeof(*cfg_param));
6379 cfg_param->vdev_id = session->smeSessionId;
6380 cfg_param->evt_type = event_type;
6381 if (LIM_IS_AP_ROLE(session))
6382 cfg_param->detection_period_ms =
6383 OBSS_COLOR_COLLISION_DETECTION_AP_PERIOD_MS;
6384 else
6385 cfg_param->detection_period_ms =
6386 OBSS_COLOR_COLLISION_DETECTION_STA_PERIOD_MS;
6387
6388 cfg_param->scan_period_ms = OBSS_COLOR_COLLISION_SCAN_PERIOD_MS;
6389 if (event_type == OBSS_COLOR_FREE_SLOT_TIMER_EXPIRY)
6390 cfg_param->free_slot_expiry_time_ms =
6391 OBSS_COLOR_COLLISION_FREE_SLOT_EXPIRY_MS;
6392
6393 msg.type = WMA_OBSS_COLOR_COLLISION_REQ;
6394 msg.bodyptr = cfg_param;
6395 msg.reserved = 0;
6396
gaurank kathpalia3a7f25b2018-08-28 16:26:39 +05306397 if (QDF_IS_STATUS_ERROR(scheduler_post_message(QDF_MODULE_ID_PE,
6398 QDF_MODULE_ID_WMA,
6399 QDF_MODULE_ID_WMA,
6400 &msg))) {
Arif Hussain05fb4872018-01-03 16:02:55 -08006401 pe_err("Failed to post WMA_OBSS_COLOR_COLLISION_REQ to WMA");
6402 qdf_mem_free(cfg_param);
6403 } else {
6404 session->obss_color_collision_dec_evt = event_type;
6405 }
6406}
6407
Jeff Johnson83d6c112018-12-02 13:05:00 -08006408void lim_process_obss_color_collision_info(struct mac_context *mac_ctx,
Arif Hussain05fb4872018-01-03 16:02:55 -08006409 uint32_t *msg_buf)
6410{
6411 struct wmi_obss_color_collision_info *obss_color_info;
Jeff Johnson209dfa02018-11-18 22:54:38 -08006412 struct pe_session *session;
Arif Hussain05fb4872018-01-03 16:02:55 -08006413
6414 if (!msg_buf) {
6415 pe_err("Buffer is Pointing to NULL");
6416 return;
6417 }
6418
6419 obss_color_info = (struct wmi_obss_color_collision_info *)msg_buf;
6420 session = pe_find_session_by_sme_session_id(mac_ctx,
6421 obss_color_info->vdev_id);
6422 if (!session) {
6423 pe_err("Session not found for given session_id %d",
6424 obss_color_info->vdev_id);
6425 return;
6426 }
6427
6428 pe_debug("vdev_id:%d, evt:%d:%d, 0to31:0x%x, 32to63:0x%x, cap:%d:%d:%d",
6429 obss_color_info->vdev_id,
6430 obss_color_info->evt_type,
6431 session->obss_color_collision_dec_evt,
6432 obss_color_info->obss_color_bitmap_bit0to31,
6433 obss_color_info->obss_color_bitmap_bit32to63,
6434 session->he_capable,
6435 session->is_session_obss_color_collision_det_enabled,
6436 mac_ctx->lim.global_obss_color_collision_det_offload);
6437
6438 if (!session->he_capable ||
6439 !session->is_session_obss_color_collision_det_enabled) {
6440 return;
6441 }
6442
6443 switch (obss_color_info->evt_type) {
6444 case OBSS_COLOR_COLLISION_DETECTION_DISABLE:
6445 pe_err("%d: FW disabled obss color det. he_cap:%d, sup:%d:%d",
6446 session->smeSessionId, session->he_capable,
6447 session->is_session_obss_color_collision_det_enabled,
6448 mac_ctx->lim.global_obss_color_collision_det_offload);
6449 session->is_session_obss_color_collision_det_enabled = false;
6450 return;
6451 case OBSS_COLOR_FREE_SLOT_AVAILABLE:
6452 case OBSS_COLOR_COLLISION_DETECTION:
6453 case OBSS_COLOR_FREE_SLOT_TIMER_EXPIRY:
6454 if (session->valid && !LIM_IS_AP_ROLE(session)) {
6455 pe_debug("Invalid System Role %d",
6456 GET_LIM_SYSTEM_ROLE(session));
6457 return;
6458 }
6459
6460 if (session->obss_color_collision_dec_evt !=
6461 obss_color_info->evt_type) {
6462 pe_debug("%d: Wrong event: %d, skiping",
6463 obss_color_info->vdev_id,
6464 obss_color_info->evt_type);
6465 return;
6466 }
6467 obss_color_collision_process_color_change(mac_ctx, session,
6468 obss_color_info);
6469 break;
6470 default:
6471 pe_err("%d: Invalid event type %d",
6472 obss_color_info->vdev_id, obss_color_info->evt_type);
6473 return;
6474 }
Kiran Kumar Lokeree6476b22017-10-16 23:40:32 -07006475}
6476#endif
Abhishek Singh20a8e442018-09-12 15:50:44 +05306477
6478#ifdef CONFIG_VDEV_SM
Jeff Johnson83d6c112018-12-02 13:05:00 -08006479void lim_send_csa_restart_req(struct mac_context *mac_ctx, uint8_t vdev_id)
Abhishek Singh20a8e442018-09-12 15:50:44 +05306480{
Jeff Johnson209dfa02018-11-18 22:54:38 -08006481 struct pe_session *session;
Abhishek Singh20a8e442018-09-12 15:50:44 +05306482
6483 session = pe_find_session_by_sme_session_id(mac_ctx, vdev_id);
6484
6485 if (!session) {
6486 pe_err("session not found for vdev id %d", vdev_id);
6487 return;
6488 }
6489
6490 wlan_vdev_mlme_sm_deliver_evt(session->vdev,
6491 WLAN_VDEV_SM_EV_CSA_RESTART,
6492 sizeof(*session), session);
6493}
6494#endif