blob: 905e7c40f2f490c4ab1377458284276f2b5b6676 [file] [log] [blame]
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001/*
Abhishek Singh5432c352019-01-02 17:11:44 +05302 * Copyright (c) 2012-2019 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"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080033#include "sir_api.h"
34#include "sch_api.h"
35#include "utils_api.h"
36#include "lim_types.h"
37#include "lim_utils.h"
38#include "lim_assoc_utils.h"
39#include "lim_security_utils.h"
40#include "lim_ser_des_utils.h"
41#include "lim_sme_req_utils.h"
42#include "lim_ibss_peer_mgmt.h"
43#include "lim_admit_control.h"
44#include "dph_hash_table.h"
45#include "lim_send_messages.h"
46#include "lim_api.h"
47#include "wmm_apsd.h"
48#include "sir_mac_prot_def.h"
Krishna Kumaar Natarajanf599c6e2015-11-03 11:44:03 -080049#include "rrm_api.h"
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070050#include "nan_datapath.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080051#include "sap_api.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080052#include <lim_ft.h>
Naveen Rawat3b6068c2016-04-14 19:01:06 -070053#include "cds_regdomain.h"
Rajeev Kumar Sirasanagandla1a21bf62019-04-08 15:28:57 +053054#include <wlan_reg_services_api.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"
Liangwei Dongb677b9e2019-03-26 05:02:23 -040057#include <wlan_crypto_global_api.h>
Paul Zhangd2315472017-02-22 10:02:50 +080058
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080059/* SME REQ processing function templates */
Jeff Johnson83d6c112018-12-02 13:05:00 -080060static bool __lim_process_sme_sys_ready_ind(struct mac_context *, uint32_t *);
61static bool __lim_process_sme_start_bss_req(struct mac_context *,
Rajeev Kumarfeb96382017-01-22 19:42:09 -080062 struct scheduler_msg *pMsg);
Jeff Johnson83d6c112018-12-02 13:05:00 -080063static void __lim_process_sme_disassoc_req(struct mac_context *, uint32_t *);
64static void __lim_process_sme_disassoc_cnf(struct mac_context *, uint32_t *);
65static void __lim_process_sme_deauth_req(struct mac_context *, uint32_t *);
66static void __lim_process_sme_set_context_req(struct mac_context *, uint32_t *);
67static bool __lim_process_sme_stop_bss_req(struct mac_context *,
Rajeev Kumarfeb96382017-01-22 19:42:09 -080068 struct scheduler_msg *pMsg);
Jeff Johnson83d6c112018-12-02 13:05:00 -080069static void lim_process_sme_channel_change_request(struct mac_context *mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080070 uint32_t *pMsg);
Jeff Johnson83d6c112018-12-02 13:05:00 -080071static void lim_process_sme_start_beacon_req(struct mac_context *mac, uint32_t *pMsg);
72static void lim_process_sme_dfs_csa_ie_request(struct mac_context *mac, uint32_t *pMsg);
73static void lim_process_nss_update_request(struct mac_context *mac, uint32_t *pMsg);
74static void lim_process_set_ie_req(struct mac_context *mac, uint32_t *pMsg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080075
Jeff Johnson83d6c112018-12-02 13:05:00 -080076static void lim_start_bss_update_add_ie_buffer(struct mac_context *mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080077 uint8_t **pDstData_buff,
78 uint16_t *pDstDataLen,
79 uint8_t *pSrcData_buff,
80 uint16_t srcDataLen);
81
Jeff Johnson83d6c112018-12-02 13:05:00 -080082static void lim_update_add_ie_buffer(struct mac_context *mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080083 uint8_t **pDstData_buff,
84 uint16_t *pDstDataLen,
85 uint8_t *pSrcData_buff, uint16_t srcDataLen);
Jeff Johnson83d6c112018-12-02 13:05:00 -080086static bool lim_update_ibss_prop_add_ies(struct mac_context *mac,
Rajeev Kumar8e3e2832015-11-06 16:02:54 -080087 uint8_t **pDstData_buff,
88 uint16_t *pDstDataLen,
89 tSirModifyIE *pModifyIE);
Jeff Johnson83d6c112018-12-02 13:05:00 -080090static void lim_process_modify_add_ies(struct mac_context *mac, uint32_t *pMsg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080091
Jeff Johnson83d6c112018-12-02 13:05:00 -080092static void lim_process_update_add_ies(struct mac_context *mac, uint32_t *pMsg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080093
Jeff Johnson83d6c112018-12-02 13:05:00 -080094static void lim_process_ext_change_channel(struct mac_context *mac_ctx,
Abhishek Singh518323d2015-10-19 17:42:01 +053095 uint32_t *msg);
96
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080097/**
98 * lim_process_set_hw_mode() - Send set HW mode command to WMA
99 * @mac: Globacl MAC pointer
100 * @msg: Message containing the hw mode index
101 *
102 * Send the set HW mode command to WMA
103 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530104 * Return: QDF_STATUS_SUCCESS if message posting is successful
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800105 */
Jeff Johnson83d6c112018-12-02 13:05:00 -0800106static QDF_STATUS lim_process_set_hw_mode(struct mac_context *mac, uint32_t *msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800107{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530108 QDF_STATUS status = QDF_STATUS_SUCCESS;
Rajeev Kumar37d478b2017-04-17 16:59:28 -0700109 struct scheduler_msg message = {0};
Tushnim Bhattacharyya66348bd2017-03-09 15:02:10 -0800110 struct policy_mgr_hw_mode *req_msg;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800111 uint32_t len;
112 struct s_sir_set_hw_mode *buf;
Rajeev Kumar37d478b2017-04-17 16:59:28 -0700113 struct scheduler_msg resp_msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800114 struct sir_set_hw_mode_resp *param;
115
116 buf = (struct s_sir_set_hw_mode *) msg;
117 if (!buf) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -0700118 pe_err("Set HW mode param is NULL");
Abhishek Singhd93a0b22018-10-30 17:04:56 +0530119 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800120 /* To free the active command list */
121 goto fail;
122 }
123
124 len = sizeof(*req_msg);
125
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530126 req_msg = qdf_mem_malloc(len);
Abhishek Singhd93a0b22018-10-30 17:04:56 +0530127 if (!req_msg) {
128 pe_debug("failed to allocate memory");
129 status = QDF_STATUS_E_NOMEM;
130 goto fail;
131 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800132
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800133 req_msg->hw_mode_index = buf->set_hw.hw_mode_index;
Chandrasekaran, Manishekaref70c0d2015-10-20 19:54:55 +0530134 req_msg->reason = buf->set_hw.reason;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800135 /* Other parameters are not needed for WMA */
136
Rajeev Kumarf7d84422017-01-21 15:45:44 -0800137 message.bodyptr = req_msg;
138 message.type = SIR_HAL_PDEV_SET_HW_MODE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800139
Srinivas Girigowda15b355e2017-03-26 21:51:00 -0700140 pe_debug("Posting SIR_HAL_SOC_SET_HW_MOD to WMA");
gaurank kathpalia3a7f25b2018-08-28 16:26:39 +0530141 status = scheduler_post_message(QDF_MODULE_ID_PE,
142 QDF_MODULE_ID_WMA,
143 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530144 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -0700145 pe_err("scheduler_post_msg failed!(err=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800146 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530147 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800148 goto fail;
149 }
150 return status;
151fail:
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530152 param = qdf_mem_malloc(sizeof(*param));
Arif Hussainf5b6c412018-10-10 19:41:09 -0700153 if (!param)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530154 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800155 param->status = SET_HW_MODE_STATUS_ECANCELED;
156 param->cfgd_hw_mode_index = 0;
157 param->num_vdev_mac_entries = 0;
158 resp_msg.type = eWNI_SME_SET_HW_MODE_RESP;
159 resp_msg.bodyptr = param;
160 resp_msg.bodyval = 0;
Jeff Johnsona5abe272019-01-06 12:52:02 -0800161 lim_sys_process_mmh_msg_api(mac, &resp_msg);
Abhishek Singhd93a0b22018-10-30 17:04:56 +0530162 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800163}
164
165/**
166 * lim_process_set_dual_mac_cfg_req() - Set dual mac config command to WMA
167 * @mac: Global MAC pointer
168 * @msg: Message containing the dual mac config parameter
169 *
170 * Send the set dual mac config command to WMA
171 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530172 * Return: QDF_STATUS_SUCCESS if message posting is successful
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800173 */
Jeff Johnson83d6c112018-12-02 13:05:00 -0800174static QDF_STATUS lim_process_set_dual_mac_cfg_req(struct mac_context *mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800175 uint32_t *msg)
176{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530177 QDF_STATUS status = QDF_STATUS_SUCCESS;
Rajeev Kumar37d478b2017-04-17 16:59:28 -0700178 struct scheduler_msg message = {0};
Srinivas Girigowdaeb6ecf32018-02-15 17:04:22 -0800179 struct policy_mgr_dual_mac_config *req_msg;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800180 uint32_t len;
181 struct sir_set_dual_mac_cfg *buf;
Rajeev Kumar37d478b2017-04-17 16:59:28 -0700182 struct scheduler_msg resp_msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800183 struct sir_dual_mac_config_resp *param;
184
185 buf = (struct sir_set_dual_mac_cfg *) msg;
186 if (!buf) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -0700187 pe_err("Set Dual mac config is NULL");
Abhishek Singhd93a0b22018-10-30 17:04:56 +0530188 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800189 /* To free the active command list */
190 goto fail;
191 }
192
193 len = sizeof(*req_msg);
194
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530195 req_msg = qdf_mem_malloc(len);
Abhishek Singhd93a0b22018-10-30 17:04:56 +0530196 if (!req_msg) {
197 pe_debug("failed to allocate memory");
198 status = QDF_STATUS_E_NOMEM;
199 goto fail;
200 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800201
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800202 req_msg->scan_config = buf->set_dual_mac.scan_config;
203 req_msg->fw_mode_config = buf->set_dual_mac.fw_mode_config;
204 /* Other parameters are not needed for WMA */
205
Rajeev Kumarf7d84422017-01-21 15:45:44 -0800206 message.bodyptr = req_msg;
207 message.type = SIR_HAL_PDEV_DUAL_MAC_CFG_REQ;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800208
Srinivas Girigowda15b355e2017-03-26 21:51:00 -0700209 pe_debug("Post SIR_HAL_PDEV_DUAL_MAC_CFG_REQ to WMA: %x %x",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800210 req_msg->scan_config, req_msg->fw_mode_config);
gaurank kathpalia3a7f25b2018-08-28 16:26:39 +0530211 status = scheduler_post_message(QDF_MODULE_ID_PE,
212 QDF_MODULE_ID_WMA,
213 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530214 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -0700215 pe_err("scheduler_post_msg failed!(err=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800216 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530217 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800218 goto fail;
219 }
220 return status;
221fail:
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530222 param = qdf_mem_malloc(sizeof(*param));
Arif Hussainf5b6c412018-10-10 19:41:09 -0700223 if (!param)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530224 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800225 param->status = SET_HW_MODE_STATUS_ECANCELED;
226 resp_msg.type = eWNI_SME_SET_DUAL_MAC_CFG_RESP;
227 resp_msg.bodyptr = param;
228 resp_msg.bodyval = 0;
Jeff Johnsona5abe272019-01-06 12:52:02 -0800229 lim_sys_process_mmh_msg_api(mac, &resp_msg);
Abhishek Singhd93a0b22018-10-30 17:04:56 +0530230 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800231}
232
233/**
Archana Ramachandrana20ef812015-11-13 16:12:13 -0800234 * lim_process_set_antenna_mode_req() - Set antenna mode command
235 * to WMA
236 * @mac: Global MAC pointer
237 * @msg: Message containing the antenna mode parameter
238 *
239 * Send the set antenna mode command to WMA
240 *
241 * Return: QDF_STATUS_SUCCESS if message posting is successful
242 */
Jeff Johnson83d6c112018-12-02 13:05:00 -0800243static QDF_STATUS lim_process_set_antenna_mode_req(struct mac_context *mac,
Archana Ramachandrana20ef812015-11-13 16:12:13 -0800244 uint32_t *msg)
245{
246 QDF_STATUS status = QDF_STATUS_SUCCESS;
Rajeev Kumar37d478b2017-04-17 16:59:28 -0700247 struct scheduler_msg message = {0};
Archana Ramachandrana20ef812015-11-13 16:12:13 -0800248 struct sir_antenna_mode_param *req_msg;
249 struct sir_set_antenna_mode *buf;
Rajeev Kumar37d478b2017-04-17 16:59:28 -0700250 struct scheduler_msg resp_msg = {0};
Archana Ramachandrana20ef812015-11-13 16:12:13 -0800251 struct sir_antenna_mode_resp *param;
252
253 buf = (struct sir_set_antenna_mode *) msg;
254 if (!buf) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -0700255 pe_err("Set antenna mode is NULL");
Abhishek Singhd93a0b22018-10-30 17:04:56 +0530256 status = QDF_STATUS_E_INVAL;
Archana Ramachandrana20ef812015-11-13 16:12:13 -0800257 /* To free the active command list */
258 goto fail;
259 }
260
261 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Abhishek Singhd93a0b22018-10-30 17:04:56 +0530262 if (!req_msg) {
263 pe_debug("failed to allocate memory");
264 status = QDF_STATUS_E_NOMEM;
265 goto fail;
266 }
Archana Ramachandrana20ef812015-11-13 16:12:13 -0800267
268 req_msg->num_rx_chains = buf->set_antenna_mode.num_rx_chains;
269 req_msg->num_tx_chains = buf->set_antenna_mode.num_tx_chains;
270
Rajeev Kumarf7d84422017-01-21 15:45:44 -0800271 message.bodyptr = req_msg;
272 message.type = SIR_HAL_SOC_ANTENNA_MODE_REQ;
Archana Ramachandrana20ef812015-11-13 16:12:13 -0800273
Srinivas Girigowda15b355e2017-03-26 21:51:00 -0700274 pe_debug("Post SIR_HAL_SOC_ANTENNA_MODE_REQ to WMA: %d %d",
Archana Ramachandrana20ef812015-11-13 16:12:13 -0800275 req_msg->num_rx_chains,
276 req_msg->num_tx_chains);
gaurank kathpalia3a7f25b2018-08-28 16:26:39 +0530277 status = scheduler_post_message(QDF_MODULE_ID_PE,
278 QDF_MODULE_ID_WMA,
279 QDF_MODULE_ID_WMA, &message);
Archana Ramachandrana20ef812015-11-13 16:12:13 -0800280 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -0700281 pe_err("scheduler_post_msg failed!(err=%d)",
Archana Ramachandrana20ef812015-11-13 16:12:13 -0800282 status);
283 qdf_mem_free(req_msg);
284 goto fail;
285 }
286 return status;
287fail:
288 param = qdf_mem_malloc(sizeof(*param));
Arif Hussainf5b6c412018-10-10 19:41:09 -0700289 if (!param)
Archana Ramachandrana20ef812015-11-13 16:12:13 -0800290 return QDF_STATUS_E_NOMEM;
Archana Ramachandrana20ef812015-11-13 16:12:13 -0800291 param->status = SET_ANTENNA_MODE_STATUS_ECANCELED;
292 resp_msg.type = eWNI_SME_SET_ANTENNA_MODE_RESP;
293 resp_msg.bodyptr = param;
294 resp_msg.bodyval = 0;
Jeff Johnsona5abe272019-01-06 12:52:02 -0800295 lim_sys_process_mmh_msg_api(mac, &resp_msg);
Abhishek Singhd93a0b22018-10-30 17:04:56 +0530296 return status;
Archana Ramachandrana20ef812015-11-13 16:12:13 -0800297}
298
299/**
Jeff Johnsonf86e45b2019-02-03 11:17:14 -0800300 * __lim_is_sme_assoc_cnf_valid() -- Validate ASSOC_CNF message
301 * @assoc_cnf: Pointer to Received ASSOC_CNF message
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800302 *
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800303 * This function is called by __lim_process_sme_assoc_cnf_new() upon
304 * receiving SME_ASSOC_CNF.
305 *
Jeff Johnsonf86e45b2019-02-03 11:17:14 -0800306 * Return: true when received SME_ASSOC_CNF is formatted correctly
307 * false otherwise
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800308 */
Jeff Johnsonf86e45b2019-02-03 11:17:14 -0800309static bool __lim_is_sme_assoc_cnf_valid(struct assoc_cnf *assoc_cnf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800310{
Jeff Johnsonf86e45b2019-02-03 11:17:14 -0800311 if (qdf_is_macaddr_group(&assoc_cnf->peer_macaddr))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800312 return false;
Jeff Johnsonf86e45b2019-02-03 11:17:14 -0800313
314 return true;
315}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800316
317/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800318 * __lim_is_defered_msg_for_radar() - Defers the message if radar is detected
319 * @mac_ctx: Pointer to Global MAC structure
320 * @message: Pointer to message posted from SME to LIM.
321 *
322 * Has role only if 11h is enabled. Not used on STA side.
323 * Defers the message if radar is detected.
324 *
325 * Return: true, if defered otherwise return false.
326 */
327static bool
Jeff Johnson83d6c112018-12-02 13:05:00 -0800328__lim_is_defered_msg_for_radar(struct mac_context *mac_ctx,
Rajeev Kumarfeb96382017-01-22 19:42:09 -0800329 struct scheduler_msg *message)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800330{
331 /*
332 * fRadarDetCurOperChan will be set only if we
333 * detect radar in current operating channel and
334 * System Role == AP ROLE
335 *
336 * TODO: Need to take care radar detection.
337 *
338 * if (LIM_IS_RADAR_DETECTED(mac_ctx))
339 */
340 if (0) {
341 if (lim_defer_msg(mac_ctx, message) != TX_SUCCESS) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -0700342 pe_err("Could not defer Msg: %d", message->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800343 return false;
344 }
Srinivas Girigowda15b355e2017-03-26 21:51:00 -0700345 pe_debug("Defer the message, in learn mode type: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800346 message->type);
347 return true;
348 }
349 return false;
350}
351
352/**
353 * __lim_process_sme_sys_ready_ind () - Process ready indication from WMA
Jeff Johnsonb3b2de22018-11-21 21:19:01 -0800354 * @mac: Global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800355 * @pMsgBuf: Message from WMA
356 *
357 * handles the notification from HDD. PE just forwards this message to HAL.
358 *
359 * Return: true-Posting to HAL failed, so PE will consume the buffer.
360 * false-Posting to HAL successful, so HAL will consume the buffer.
361 */
362
Jeff Johnson47e4b552019-02-01 23:12:25 -0800363static bool __lim_process_sme_sys_ready_ind(struct mac_context *mac,
364 uint32_t *pMsgBuf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800365{
Rajeev Kumar37d478b2017-04-17 16:59:28 -0700366 struct scheduler_msg msg = {0};
Jeff Johnson47e4b552019-02-01 23:12:25 -0800367 struct sme_ready_req *ready_req = (struct sme_ready_req *) pMsgBuf;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800368
369 msg.type = WMA_SYS_READY_IND;
370 msg.reserved = 0;
371 msg.bodyptr = pMsgBuf;
372 msg.bodyval = 0;
373
Jeff Johnsonb3b2de22018-11-21 21:19:01 -0800374 if (ANI_DRIVER_TYPE(mac) != QDF_DRIVER_TYPE_MFG) {
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -0800375 ready_req->pe_roam_synch_cb = pe_roam_synch_callback;
Pragaspathi Thilagarajb0176502019-04-26 02:33:13 +0530376 ready_req->pe_disconnect_cb = pe_disconnect_callback;
Jeff Johnsonb3b2de22018-11-21 21:19:01 -0800377 pe_register_mgmt_rx_frm_callback(mac);
378 pe_register_callbacks_with_wma(mac, ready_req);
379 mac->lim.sme_msg_callback = ready_req->sme_msg_cb;
380 mac->lim.stop_roaming_callback = ready_req->stop_roaming_cb;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800381 }
Srinivas Girigowda15b355e2017-03-26 21:51:00 -0700382
383 pe_debug("sending WMA_SYS_READY_IND msg to HAL");
Jeff Johnsonb3b2de22018-11-21 21:19:01 -0800384 MTRACE(mac_trace_msg_tx(mac, NO_SESSION, msg.type));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800385
Jeff Johnsonb3b2de22018-11-21 21:19:01 -0800386 if (QDF_STATUS_SUCCESS != wma_post_ctrl_msg(mac, &msg)) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -0700387 pe_err("wma_post_ctrl_msg failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800388 return true;
389 }
390 return false;
391}
392
Abhinav Kumar4d1f9f42019-05-07 13:14:49 +0530393#ifdef WLAN_BCN_RECV_FEATURE
394/**
395 * lim_register_bcn_report_send_cb() - Register bcn receive start
396 * indication handler callback
397 * @mac: Pointer to Global MAC structure
398 * @msg: A pointer to the SME message buffer
399 *
400 * Once driver gets QCA_NL80211_VENDOR_SUBCMD_BEACON_REPORTING vendor
401 * command with attribute for start only. LIM layer register a sme
402 * callback through this function.
403 *
404 * Return: None.
405 */
406static void lim_register_bcn_report_send_cb(struct mac_context *mac,
407 struct scheduler_msg *msg)
408{
409 if (!msg) {
410 pe_err("Invalid message");
411 return;
412 }
413
414 mac->lim.sme_bcn_rcv_callback = msg->callback;
415}
416#else
417static inline
418void lim_register_bcn_report_send_cb(struct mac_context *mac,
419 struct scheduler_msg *msg)
420{
421}
422#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800423/**
424 *lim_configure_ap_start_bss_session() - Configure the AP Start BSS in session.
425 *@mac_ctx: Pointer to Global MAC structure
426 *@session: A pointer to session entry
427 *@sme_start_bss_req: Start BSS Request from upper layers.
428 *
429 * This function is used to configure the start bss parameters
430 * in to the session.
431 *
432 * Return: None.
433 */
434static void
Jeff Johnson704b8912019-02-02 14:38:14 -0800435lim_configure_ap_start_bss_session(struct mac_context *mac_ctx,
436 struct pe_session *session,
437 struct start_bss_req *sme_start_bss_req)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800438{
439 session->limSystemRole = eLIM_AP_ROLE;
440 session->privacy = sme_start_bss_req->privacy;
441 session->fwdWPSPBCProbeReq = sme_start_bss_req->fwdWPSPBCProbeReq;
442 session->authType = sme_start_bss_req->authType;
443 /* Store the DTIM period */
444 session->dtimPeriod = (uint8_t) sme_start_bss_req->dtimPeriod;
445 /* Enable/disable UAPSD */
446 session->apUapsdEnable = sme_start_bss_req->apUapsdEnable;
Pragaspathi Thilagaraje64714a2019-05-23 00:46:25 +0530447 if (session->opmode == QDF_P2P_GO_MODE) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800448 session->proxyProbeRspEn = 0;
449 } else {
450 /*
451 * To detect PBC overlap in SAP WPS mode,
452 * Host handles Probe Requests.
453 */
454 if (SAP_WPS_DISABLED == sme_start_bss_req->wps_state)
455 session->proxyProbeRspEn = 1;
456 else
457 session->proxyProbeRspEn = 0;
458 }
459 session->ssidHidden = sme_start_bss_req->ssidHidden;
460 session->wps_state = sme_start_bss_req->wps_state;
461 session->sap_dot11mc = sme_start_bss_req->sap_dot11mc;
Kapil Gupta4b2efbb2016-10-03 13:07:20 +0530462 session->vendor_vht_sap =
463 sme_start_bss_req->vendor_vht_sap;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800464 lim_get_short_slot_from_phy_mode(mac_ctx, session, session->gLimPhyMode,
465 &session->shortSlotTimeSupported);
466 session->isCoalesingInIBSSAllowed =
467 sme_start_bss_req->isCoalesingInIBSSAllowed;
468
Jiachao Wu712d4fd2017-08-23 16:52:34 +0800469 session->beacon_tx_rate = sme_start_bss_req->beacon_tx_rate;
470
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800471}
472
473/**
Abhishek Singhdfa69c32018-08-30 15:39:34 +0530474 * lim_send_start_vdev_req() - send vdev start request
475 *@session: pe session
476 *@mlm_start_req: vdev start req
477 *
478 * Return: QDF_STATUS
479 */
Abhishek Singh3d30a3b2018-09-12 15:49:18 +0530480static QDF_STATUS
Jeff Johnson209dfa02018-11-18 22:54:38 -0800481lim_send_start_vdev_req(struct pe_session *session, tLimMlmStartReq *mlm_start_req)
Abhishek Singh3d30a3b2018-09-12 15:49:18 +0530482{
483 return wlan_vdev_mlme_sm_deliver_evt(session->vdev,
484 WLAN_VDEV_SM_EV_START,
485 sizeof(*mlm_start_req),
486 mlm_start_req);
487}
Abhishek Singhdfa69c32018-08-30 15:39:34 +0530488
489/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800490 * __lim_handle_sme_start_bss_request() - process SME_START_BSS_REQ message
491 *@mac_ctx: Pointer to Global MAC structure
492 *@msg_buf: A pointer to the SME message buffer
493 *
494 * This function is called to process SME_START_BSS_REQ message
495 * from HDD or upper layer application.
496 *
497 * Return: None
498 */
499static void
Jeff Johnson83d6c112018-12-02 13:05:00 -0800500__lim_handle_sme_start_bss_request(struct mac_context *mac_ctx, uint32_t *msg_buf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800501{
502 uint16_t size;
503 uint32_t val = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800504 tSirMacChanNum channel_number;
505 tLimMlmStartReq *mlm_start_req = NULL;
Jeff Johnson704b8912019-02-02 14:38:14 -0800506 struct start_bss_req *sme_start_bss_req = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800507 tSirResultCodes ret_code = eSIR_SME_SUCCESS;
508 /* Flag Used in case of IBSS to Auto generate BSSID. */
509 uint32_t auto_gen_bssid = false;
510 uint8_t session_id;
Jeff Johnson209dfa02018-11-18 22:54:38 -0800511 struct pe_session *session = NULL;
Krunal Sonib37bb352016-12-20 14:12:21 -0800512 uint8_t sme_session_id = 0xFF;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800513 uint32_t chanwidth;
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -0700514 struct vdev_type_nss *vdev_type_nss;
Abhishek Singhdfa69c32018-08-30 15:39:34 +0530515 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800516
517/* FEATURE_WLAN_DIAG_SUPPORT */
518#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM
519 /*
520 * Since the session is not created yet, sending NULL.
521 * The response should have the correct state.
522 */
523 lim_diag_event_report(mac_ctx, WLAN_PE_DIAG_START_BSS_REQ_EVENT,
524 NULL, 0, 0);
525#endif /* FEATURE_WLAN_DIAG_SUPPORT */
526
Srinivas Girigowda15b355e2017-03-26 21:51:00 -0700527 pe_debug("Received START_BSS_REQ");
Jeff Johnson704b8912019-02-02 14:38:14 -0800528 size = sizeof(*sme_start_bss_req);
Krunal Sonib37bb352016-12-20 14:12:21 -0800529 sme_start_bss_req = qdf_mem_malloc(size);
Arif Hussainf5b6c412018-10-10 19:41:09 -0700530 if (!sme_start_bss_req) {
Krunal Sonib37bb352016-12-20 14:12:21 -0800531 ret_code = eSIR_SME_RESOURCES_UNAVAILABLE;
532 goto free;
533 }
Jeff Johnson704b8912019-02-02 14:38:14 -0800534 qdf_mem_copy(sme_start_bss_req, msg_buf, size);
Krunal Sonib37bb352016-12-20 14:12:21 -0800535 sme_session_id = sme_start_bss_req->sessionId;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800536
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800537 if ((mac_ctx->lim.gLimSmeState == eLIM_SME_OFFLINE_STATE) ||
538 (mac_ctx->lim.gLimSmeState == eLIM_SME_IDLE_STATE)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800539 if (!lim_is_sme_start_bss_req_valid(mac_ctx,
540 sme_start_bss_req)) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -0700541 pe_warn("Received invalid eWNI_SME_START_BSS_REQ");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800542 ret_code = eSIR_SME_INVALID_PARAMETERS;
543 goto free;
544 }
545
546 /*
547 * This is the place where PE is going to create a session.
548 * If session is not existed, then create a new session
549 */
550 session = pe_find_session_by_bssid(mac_ctx,
Srinivas Girigowdad8af4a62015-11-18 16:51:16 -0800551 sme_start_bss_req->bssid.bytes, &session_id);
Jeff Johnson8e9530b2019-03-18 13:41:42 -0700552 if (session) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -0700553 pe_warn("Session Already exists for given BSSID");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800554 ret_code = eSIR_SME_BSS_ALREADY_STARTED_OR_JOINED;
555 session = NULL;
556 goto free;
557 } else {
558 session = pe_create_session(mac_ctx,
Srinivas Girigowdad8af4a62015-11-18 16:51:16 -0800559 sme_start_bss_req->bssid.bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800560 &session_id, mac_ctx->lim.maxStation,
Rajeev Kumar Sirasanagandlae3b59912018-08-24 15:53:31 +0530561 sme_start_bss_req->bssType,
562 sme_start_bss_req->sessionId);
563 if (!session) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -0700564 pe_warn("Session Can not be created");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800565 ret_code = eSIR_SME_RESOURCES_UNAVAILABLE;
566 goto free;
567 }
Vignesh Viswanathanb3dbbc82018-04-06 00:06:27 +0530568
569 /* Update the beacon/probe filter in mac_ctx */
570 lim_set_bcn_probe_filter(mac_ctx, session,
571 &sme_start_bss_req->ssId,
572 sme_start_bss_req->channelId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800573 }
574
Deepak Dhamdheree2dd5442016-05-27 15:05:51 -0700575 if (QDF_NDI_MODE != sme_start_bss_req->bssPersona) {
576 /* Probe resp add ie */
577 lim_start_bss_update_add_ie_buffer(mac_ctx,
Jeff Johnson21aac3a2019-02-02 14:26:13 -0800578 &session->add_ie_params.probeRespData_buff,
579 &session->add_ie_params.probeRespDataLen,
580 sme_start_bss_req->add_ie_params.
Deepak Dhamdheree2dd5442016-05-27 15:05:51 -0700581 probeRespData_buff,
Jeff Johnson21aac3a2019-02-02 14:26:13 -0800582 sme_start_bss_req->add_ie_params.
Deepak Dhamdheree2dd5442016-05-27 15:05:51 -0700583 probeRespDataLen);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800584
Deepak Dhamdheree2dd5442016-05-27 15:05:51 -0700585 /* Probe Beacon add ie */
586 lim_start_bss_update_add_ie_buffer(mac_ctx,
Jeff Johnson21aac3a2019-02-02 14:26:13 -0800587 &session->add_ie_params.probeRespBCNData_buff,
588 &session->add_ie_params.probeRespBCNDataLen,
589 sme_start_bss_req->add_ie_params.
Deepak Dhamdheree2dd5442016-05-27 15:05:51 -0700590 probeRespBCNData_buff,
Jeff Johnson21aac3a2019-02-02 14:26:13 -0800591 sme_start_bss_req->add_ie_params.
Deepak Dhamdheree2dd5442016-05-27 15:05:51 -0700592 probeRespBCNDataLen);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800593
Deepak Dhamdheree2dd5442016-05-27 15:05:51 -0700594 /* Assoc resp IE */
595 lim_start_bss_update_add_ie_buffer(mac_ctx,
Jeff Johnson21aac3a2019-02-02 14:26:13 -0800596 &session->add_ie_params.assocRespData_buff,
597 &session->add_ie_params.assocRespDataLen,
598 sme_start_bss_req->add_ie_params.
Deepak Dhamdheree2dd5442016-05-27 15:05:51 -0700599 assocRespData_buff,
Jeff Johnson21aac3a2019-02-02 14:26:13 -0800600 sme_start_bss_req->add_ie_params.
Deepak Dhamdheree2dd5442016-05-27 15:05:51 -0700601 assocRespDataLen);
602 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800603 /* Store the session related params in newly created session */
604 session->pLimStartBssReq = sme_start_bss_req;
Jeff Johnsonbe119e62019-02-02 12:30:26 -0800605 session->ht_config = sme_start_bss_req->ht_config;
606 session->vht_config = sme_start_bss_req->vht_config;
Sandeep Puligilla98917432016-06-10 13:50:28 -0700607
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800608 sir_copy_mac_addr(session->selfMacAddr,
Srinivas Girigowdad8af4a62015-11-18 16:51:16 -0800609 sme_start_bss_req->self_macaddr.bytes);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800610
611 /* Copy SSID to session table */
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530612 qdf_mem_copy((uint8_t *) &session->ssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800613 (uint8_t *) &sme_start_bss_req->ssId,
614 (sme_start_bss_req->ssId.length + 1));
615
616 session->bssType = sme_start_bss_req->bssType;
617
618 session->nwType = sme_start_bss_req->nwType;
619
620 session->beaconParams.beaconInterval =
621 sme_start_bss_req->beaconInterval;
622
623 /* Store the channel number in session Table */
624 session->currentOperChannel =
625 sme_start_bss_req->channelId;
626
627 /* Store Persona */
Pragaspathi Thilagaraje64714a2019-05-23 00:46:25 +0530628 session->opmode = sme_start_bss_req->bssPersona;
Abhishek Singh4294f802017-08-10 16:37:07 +0530629 QDF_TRACE(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_DEBUG,
Pragaspathi Thilagaraje64714a2019-05-23 00:46:25 +0530630 FL("PE PERSONA=%d"), session->opmode);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800631
632 /* Update the phymode */
633 session->gLimPhyMode = sme_start_bss_req->nwType;
634
635 session->maxTxPower =
Wu Gao5c3d94b2019-01-17 21:15:54 +0800636 lim_get_regulatory_max_transmit_power(mac_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800637 session->currentOperChannel);
638 /* Store the dot 11 mode in to the session Table */
639 session->dot11mode = sme_start_bss_req->dot11mode;
640#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
641 session->cc_switch_mode =
642 sme_start_bss_req->cc_switch_mode;
643#endif
644 session->htCapability =
645 IS_DOT11_MODE_HT(session->dot11mode);
646 session->vhtCapability =
647 IS_DOT11_MODE_VHT(session->dot11mode);
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -0800648
Srinivas Girigowda28fb0122017-03-26 22:21:20 -0700649 pe_debug("HT[%d], VHT[%d]",
Krishna Kumaar Natarajan0103ef82017-02-17 18:15:56 -0800650 session->htCapability, session->vhtCapability);
651
652 if (IS_DOT11_MODE_HE(session->dot11mode)) {
653 lim_update_session_he_capable(mac_ctx, session);
654 lim_copy_bss_he_cap(session, sme_start_bss_req);
655 }
656
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800657 session->txLdpcIniFeatureEnabled =
658 sme_start_bss_req->txLdpcIniFeatureEnabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800659#ifdef WLAN_FEATURE_11W
660 session->limRmfEnabled =
661 sme_start_bss_req->pmfCapable ? 1 : 0;
Srinivas Girigowda15b355e2017-03-26 21:51:00 -0700662 pe_debug("Session RMF enabled: %d", session->limRmfEnabled);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800663#endif
664
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530665 qdf_mem_copy((void *)&session->rateSet,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800666 (void *)&sme_start_bss_req->operationalRateSet,
667 sizeof(tSirMacRateSet));
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530668 qdf_mem_copy((void *)&session->extRateSet,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800669 (void *)&sme_start_bss_req->extendedRateSet,
670 sizeof(tSirMacRateSet));
671
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -0700672 if (IS_5G_CH(session->currentOperChannel))
673 vdev_type_nss = &mac_ctx->vdev_type_nss_5g;
674 else
675 vdev_type_nss = &mac_ctx->vdev_type_nss_2g;
676
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800677 switch (sme_start_bss_req->bssType) {
678 case eSIR_INFRA_AP_MODE:
679 lim_configure_ap_start_bss_session(mac_ctx, session,
680 sme_start_bss_req);
Pragaspathi Thilagaraje64714a2019-05-23 00:46:25 +0530681 if (session->opmode == QDF_SAP_MODE)
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -0700682 session->vdev_nss = vdev_type_nss->sap;
Krunal Soni53993f72016-07-08 18:20:03 -0700683 else
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -0700684 session->vdev_nss = vdev_type_nss->p2p_go;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800685 break;
686 case eSIR_IBSS_MODE:
687 session->limSystemRole = eLIM_STA_IN_IBSS_ROLE;
688 lim_get_short_slot_from_phy_mode(mac_ctx, session,
689 session->gLimPhyMode,
690 &session->shortSlotTimeSupported);
691
692 /*
693 * initialize to "OPEN".
694 * will be updated upon key installation
695 */
696 session->encryptType = eSIR_ED_NONE;
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -0700697 session->vdev_nss = vdev_type_nss->ibss;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800698
699 break;
Deepak Dhamdheree2dd5442016-05-27 15:05:51 -0700700 case eSIR_NDI_MODE:
701 session->limSystemRole = eLIM_NDI_ROLE;
702 break;
703
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800704
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800705 /*
706 * There is one more mode called auto mode.
707 * which is used no where
708 */
709
710 /* FORBUILD -TEMPFIX.. HOW TO use AUTO MODE????? */
711
712 default:
713 /* not used anywhere...used in scan function */
714 break;
715 }
716
Srinivas Girigowda15b355e2017-03-26 21:51:00 -0700717 pe_debug("persona - %d, nss - %d",
Pragaspathi Thilagaraje64714a2019-05-23 00:46:25 +0530718 session->opmode, session->vdev_nss);
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -0700719 session->nss = session->vdev_nss;
Abhinav Kumarb074f2f2018-09-15 15:32:11 +0530720 if (!mac_ctx->mlme_cfg->vht_caps.vht_cap_info.enable2x2)
Kiran Kumar Lokerebc6fb2f2018-05-09 19:04:11 -0700721 session->nss = 1;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800722 /*
Rajeev Kumarc9a50e72016-04-15 15:18:42 -0700723 * Allocate memory for the array of
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800724 * parsed (Re)Assoc request structure
725 */
Rajeev Kumarc9a50e72016-04-15 15:18:42 -0700726 if (sme_start_bss_req->bssType == eSIR_INFRA_AP_MODE) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800727 session->parsedAssocReq =
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530728 qdf_mem_malloc(session->dph.dphHashTable.
Rajeev Kumarc9a50e72016-04-15 15:18:42 -0700729 size * sizeof(tpSirAssocReq));
Arif Hussainf5b6c412018-10-10 19:41:09 -0700730 if (!session->parsedAssocReq) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800731 ret_code = eSIR_SME_RESOURCES_UNAVAILABLE;
732 goto free;
733 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800734 }
735
Deepak Dhamdheree2dd5442016-05-27 15:05:51 -0700736 if (!sme_start_bss_req->channelId &&
737 sme_start_bss_req->bssType != eSIR_NDI_MODE) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -0700738 pe_err("Received invalid eWNI_SME_START_BSS_REQ");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800739 ret_code = eSIR_SME_INVALID_PARAMETERS;
740 goto free;
741 }
742 channel_number = sme_start_bss_req->channelId;
743#ifdef QCA_HT_2040_COEX
744 if (sme_start_bss_req->obssEnabled)
745 session->htSupportedChannelWidthSet =
746 session->htCapability;
747 else
748#endif
749 session->htSupportedChannelWidthSet =
750 (sme_start_bss_req->sec_ch_offset) ? 1 : 0;
751 session->htSecondaryChannelOffset =
752 sme_start_bss_req->sec_ch_offset;
753 session->htRecommendedTxWidthSet =
754 (session->htSecondaryChannelOffset) ? 1 : 0;
Abhishek Singh4294f802017-08-10 16:37:07 +0530755 QDF_TRACE(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800756 FL("cbMode %u"), sme_start_bss_req->cbMode);
Krishna Kumaar Natarajan0103ef82017-02-17 18:15:56 -0800757 if (lim_is_session_he_capable(session) ||
758 session->vhtCapability || session->htCapability) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800759 chanwidth = sme_start_bss_req->vht_channel_width;
Srinivas Girigowda15b355e2017-03-26 21:51:00 -0700760 pe_debug("vht_channel_width %u htSupportedChannelWidthSet %d",
Sandeep Puligillafade9b72016-02-01 12:41:54 -0800761 sme_start_bss_req->vht_channel_width,
762 session->htSupportedChannelWidthSet);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800763 session->ch_width = chanwidth;
764 if (session->htSupportedChannelWidthSet) {
765 session->ch_center_freq_seg0 =
766 sme_start_bss_req->center_freq_seg0;
767 session->ch_center_freq_seg1 =
768 sme_start_bss_req->center_freq_seg1;
769 } else {
770 session->ch_center_freq_seg0 = 0;
771 session->ch_center_freq_seg1 = 0;
772 }
773 }
Gaurank Kathpalia511634b2018-10-23 03:41:16 -0700774
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800775 if (session->vhtCapability &&
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -0800776 (session->ch_width > CH_WIDTH_80MHZ)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800777 session->nss = 1;
Srinivas Girigowda15b355e2017-03-26 21:51:00 -0700778 pe_debug("nss set to [%d]", session->nss);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800779 }
Srinivas Girigowda15b355e2017-03-26 21:51:00 -0700780 pe_debug("vht su tx bformer %d",
Krunal Soni53993f72016-07-08 18:20:03 -0700781 session->vht_config.su_beam_former);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800782
783 /* Delete pre-auth list if any */
784 lim_delete_pre_auth_list(mac_ctx);
785
786 /*
787 * keep the RSN/WPA IE information in PE Session Entry
788 * later will be using this to check when received (Re)Assoc req
789 */
790 lim_set_rs_nie_wp_aiefrom_sme_start_bss_req_message(mac_ctx,
791 &sme_start_bss_req->rsnIE, session);
792
Deepak Dhamdheree2dd5442016-05-27 15:05:51 -0700793 if (LIM_IS_AP_ROLE(session) ||
794 LIM_IS_IBSS_ROLE(session) ||
795 LIM_IS_NDI_ROLE(session)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800796 session->gLimProtectionControl =
797 sme_start_bss_req->protEnabled;
798 /*
799 * each byte will have the following info
800 * bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
801 * reserved reserved RIFS Lsig n-GF ht20 11g 11b
802 */
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530803 qdf_mem_copy((void *)&session->cfgProtection,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800804 (void *)&sme_start_bss_req->ht_capab,
805 sizeof(uint16_t));
806 /* Initialize WPS PBC session link list */
807 session->pAPWPSPBCSession = NULL;
808 }
809 /* Prepare and Issue LIM_MLM_START_REQ to MLM */
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530810 mlm_start_req = qdf_mem_malloc(sizeof(tLimMlmStartReq));
Arif Hussainf5b6c412018-10-10 19:41:09 -0700811 if (!mlm_start_req) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800812 ret_code = eSIR_SME_RESOURCES_UNAVAILABLE;
813 goto free;
814 }
815
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800816 /* Copy SSID to the MLM start structure */
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530817 qdf_mem_copy((uint8_t *) &mlm_start_req->ssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800818 (uint8_t *) &sme_start_bss_req->ssId,
819 sme_start_bss_req->ssId.length + 1);
820 mlm_start_req->ssidHidden = sme_start_bss_req->ssidHidden;
821 mlm_start_req->obssProtEnabled =
822 sme_start_bss_req->obssProtEnabled;
823
824 mlm_start_req->bssType = session->bssType;
825
826 /* Fill PE session Id from the session Table */
827 mlm_start_req->sessionId = session->peSessionId;
828
Deepak Dhamdheree2dd5442016-05-27 15:05:51 -0700829 if (mlm_start_req->bssType == eSIR_INFRA_AP_MODE ||
830 mlm_start_req->bssType == eSIR_NDI_MODE) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800831 /*
832 * Copy the BSSId from sessionTable to
833 * mlmStartReq struct
834 */
835 sir_copy_mac_addr(mlm_start_req->bssId, session->bssId);
836 } else {
837 /* ibss mode */
838 mac_ctx->lim.gLimIbssCoalescingHappened = false;
Manikandan Mohan2bd09772018-11-28 18:27:32 -0800839 auto_gen_bssid = mac_ctx->mlme_cfg->ibss.auto_bssid;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800840
841 if (!auto_gen_bssid) {
842 /*
843 * We're not auto generating BSSID.
844 * Instead, get it from session entry
845 */
846 sir_copy_mac_addr(mlm_start_req->bssId,
847 session->bssId);
848 /*
849 * Start IBSS group BSSID
850 * Auto Generating BSSID.
851 */
852 auto_gen_bssid = ((mlm_start_req->bssId[0] &
853 0x01) ? true : false);
854 }
855
856 if (auto_gen_bssid) {
857 /*
858 * if BSSID is not any uc id.
859 * then use locally generated BSSID.
860 * Autogenerate the BSSID
861 */
862 lim_get_random_bssid(mac_ctx,
863 mlm_start_req->bssId);
864 mlm_start_req->bssId[0] = 0x02;
865
866 /*
867 * Copy randomly generated BSSID
868 * to the session Table
869 */
870 sir_copy_mac_addr(session->bssId,
871 mlm_start_req->bssId);
872 }
873 }
874 /* store the channel num in mlmstart req structure */
875 mlm_start_req->channelNumber = session->currentOperChannel;
876 mlm_start_req->cbMode = sme_start_bss_req->cbMode;
877 mlm_start_req->beaconPeriod =
878 session->beaconParams.beaconInterval;
Arif Hussain671a1902017-03-17 09:08:32 -0700879 mlm_start_req->cac_duration_ms =
880 sme_start_bss_req->cac_duration_ms;
881 mlm_start_req->dfs_regdomain =
882 sme_start_bss_req->dfs_regdomain;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800883 if (LIM_IS_AP_ROLE(session)) {
884 mlm_start_req->dtimPeriod = session->dtimPeriod;
885 mlm_start_req->wps_state = session->wps_state;
886
887 } else {
Bala Venkatesh2fde2c62018-09-11 20:33:24 +0530888 val = mac_ctx->mlme_cfg->sap_cfg.dtim_interval;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800889 mlm_start_req->dtimPeriod = (uint8_t) val;
890 }
891
Karthik Kantamneni22dd0f62018-08-07 14:53:50 +0530892 mlm_start_req->cfParamSet.cfpPeriod =
893 mac_ctx->mlme_cfg->rates.cfp_period;
894 mlm_start_req->cfParamSet.cfpMaxDuration =
895 mac_ctx->mlme_cfg->rates.cfp_max_duration;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800896
897 /*
898 * this may not be needed anymore now,
899 * as rateSet is now included in the
900 * session entry and MLM has session context.
901 */
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530902 qdf_mem_copy((void *)&mlm_start_req->rateSet,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800903 (void *)&session->rateSet,
904 sizeof(tSirMacRateSet));
905
906 /* Now populate the 11n related parameters */
907 mlm_start_req->nwType = session->nwType;
908 mlm_start_req->htCapable = session->htCapability;
909
910 mlm_start_req->htOperMode = mac_ctx->lim.gHTOperMode;
911 /* Unused */
912 mlm_start_req->dualCTSProtection =
913 mac_ctx->lim.gHTDualCTSProtection;
914 mlm_start_req->txChannelWidthSet =
915 session->htRecommendedTxWidthSet;
916
917 session->limRFBand = lim_get_rf_band(channel_number);
918
919 /* Initialize 11h Enable Flag */
920 session->lim11hEnable = 0;
gaolez76d2a162017-03-21 19:23:58 +0800921 if (mlm_start_req->bssType != eSIR_IBSS_MODE &&
922 (CHAN_HOP_ALL_BANDS_ENABLE ||
Varun Reddy Yeturua48bc412017-11-17 15:33:35 -0800923 BAND_5G == session->limRFBand)) {
Abhinav Kumard4d6eb72018-12-04 20:30:37 +0530924 session->lim11hEnable =
925 mac_ctx->mlme_cfg->gen.enabled_11h;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800926
927 if (session->lim11hEnable &&
928 (eSIR_INFRA_AP_MODE ==
929 mlm_start_req->bssType)) {
Arif Hussain88d1fdd2018-09-26 16:12:24 -0700930 session->lim11hEnable =
931 mac_ctx->mlme_cfg->
932 dfs_cfg.dfs_master_capable;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800933 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800934 }
935
Wu Gao5f764082019-01-04 15:54:38 +0800936 if (!session->lim11hEnable)
937 mac_ctx->mlme_cfg->power.local_power_constraint = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800938
Jiachao Wu712d4fd2017-08-23 16:52:34 +0800939 mlm_start_req->beacon_tx_rate = session->beacon_tx_rate;
940
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800941 session->limPrevSmeState = session->limSmeState;
942 session->limSmeState = eLIM_SME_WT_START_BSS_STATE;
943 MTRACE(mac_trace
944 (mac_ctx, TRACE_CODE_SME_STATE,
945 session->peSessionId,
946 session->limSmeState));
947
Abhishek Singhdfa69c32018-08-30 15:39:34 +0530948 qdf_status = lim_send_start_vdev_req(session, mlm_start_req);
949 if (QDF_IS_STATUS_ERROR(qdf_status))
950 goto free;
Rajeev Kumar Sirasanagandla2f17f8d2018-10-03 17:24:20 +0530951 qdf_mem_free(mlm_start_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800952 return;
953 } else {
954
Srinivas Girigowda15b355e2017-03-26 21:51:00 -0700955 pe_err("Received unexpected START_BSS_REQ, in state %X",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800956 mac_ctx->lim.gLimSmeState);
957 ret_code = eSIR_SME_BSS_ALREADY_STARTED_OR_JOINED;
Krunal Sonib37bb352016-12-20 14:12:21 -0800958 goto free;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800959 } /* if (mac_ctx->lim.gLimSmeState == eLIM_SME_OFFLINE_STATE) */
960
961free:
Jeff Johnson8e9530b2019-03-18 13:41:42 -0700962 if ((session) &&
Krunal Sonib37bb352016-12-20 14:12:21 -0800963 (session->pLimStartBssReq == sme_start_bss_req)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800964 session->pLimStartBssReq = NULL;
965 }
Jeff Johnson8e9530b2019-03-18 13:41:42 -0700966 if (sme_start_bss_req)
Krunal Sonib37bb352016-12-20 14:12:21 -0800967 qdf_mem_free(sme_start_bss_req);
Jeff Johnson8e9530b2019-03-18 13:41:42 -0700968 if (mlm_start_req)
Krunal Sonib37bb352016-12-20 14:12:21 -0800969 qdf_mem_free(mlm_start_req);
Jeff Johnson8e9530b2019-03-18 13:41:42 -0700970 if (session) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800971 pe_delete_session(mac_ctx, session);
972 session = NULL;
973 }
974 lim_send_sme_start_bss_rsp(mac_ctx, eWNI_SME_START_BSS_RSP, ret_code,
Jeff Johnson9e3d8992019-02-20 20:11:48 -0800975 session, sme_session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800976}
977
978/**
979 * __lim_process_sme_start_bss_req() - Call handler to start BSS
980 *
Jeff Johnsonb3b2de22018-11-21 21:19:01 -0800981 * @mac: Global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800982 * @pMsg: Message pointer
983 *
984 * Wrapper for the function __lim_handle_sme_start_bss_request
985 * This message will be defered until softmac come out of
986 * scan mode or if we have detected radar on the current
987 * operating channel.
988 *
989 * return true - If we consumed the buffer
990 * false - If have defered the message.
991 */
Jeff Johnson83d6c112018-12-02 13:05:00 -0800992static bool __lim_process_sme_start_bss_req(struct mac_context *mac,
Rajeev Kumarfeb96382017-01-22 19:42:09 -0800993 struct scheduler_msg *pMsg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800994{
Abhishek Singh72a04bf2019-03-18 11:38:50 +0530995 if (__lim_is_defered_msg_for_radar(mac, pMsg)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800996 /**
997 * If message defered, buffer is not consumed yet.
998 * So return false
999 */
1000 return false;
1001 }
1002
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08001003 __lim_handle_sme_start_bss_request(mac, (uint32_t *) pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001004 return true;
1005}
1006
1007/**
1008 * lim_get_random_bssid()
1009 *
1010 * FUNCTION:This function is called to process generate the random number for bssid
1011 * This function is called to process SME_SCAN_REQ message
1012 * from HDD or upper layer application.
1013 *
1014 * LOGIC:
1015 *
1016 * ASSUMPTIONS:
1017 *
1018 * NOTE:
1019 * 1. geneartes the unique random number for bssid in ibss
1020 *
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08001021 * @param mac Pointer to Global MAC structure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001022 * @param *data Pointer to bssid buffer
1023 * @return None
1024 */
Jeff Johnson83d6c112018-12-02 13:05:00 -08001025void lim_get_random_bssid(struct mac_context *mac, uint8_t *data)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001026{
1027 uint32_t random[2];
Srinivas Girigowda4d65ebe2017-10-13 21:41:42 -07001028
Jeff Johnson3f4b1ed2019-03-07 11:23:56 -08001029 random[0] = qdf_mc_timer_get_system_ticks();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001030 random[0] |= (random[0] << 15);
1031 random[1] = random[0] >> 1;
Jeff Johnson3f4b1ed2019-03-07 11:23:56 -08001032 qdf_mem_copy(data, random, sizeof(tSirMacAddr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001033}
1034
Padma, Santhosh Kumarb8f65d92017-09-14 13:05:42 +05301035#ifdef WLAN_FEATURE_SAE
1036
1037/**
1038 * lim_update_sae_config()- This API update SAE session info to csr config
1039 * from join request.
1040 * @session: PE session
1041 * @sme_join_req: pointer to join request
1042 *
1043 * Return: None
1044 */
Jeff Johnson209dfa02018-11-18 22:54:38 -08001045static void lim_update_sae_config(struct pe_session *session,
Jeff Johnson701444f2019-02-02 22:35:13 -08001046 struct join_req *sme_join_req)
Padma, Santhosh Kumarb8f65d92017-09-14 13:05:42 +05301047{
1048 session->sae_pmk_cached = sme_join_req->sae_pmk_cached;
1049
Srinivas Girigowdacb7b8b82019-04-10 14:27:47 -07001050 pe_debug("pmk_cached %d for BSSID=" QDF_MAC_ADDR_STR,
Padma, Santhosh Kumarb8f65d92017-09-14 13:05:42 +05301051 session->sae_pmk_cached,
Srinivas Girigowda34fbba02019-04-08 12:07:44 -07001052 QDF_MAC_ADDR_ARRAY(sme_join_req->bssDescription.bssId));
Padma, Santhosh Kumarb8f65d92017-09-14 13:05:42 +05301053}
1054#else
Jeff Johnson209dfa02018-11-18 22:54:38 -08001055static inline void lim_update_sae_config(struct pe_session *session,
Jeff Johnson701444f2019-02-02 22:35:13 -08001056 struct join_req *sme_join_req)
Padma, Santhosh Kumarb8f65d92017-09-14 13:05:42 +05301057{}
1058#endif
1059
Sandeep Puligilla45e0c5e2018-09-21 00:38:23 -07001060/**
Jianmin Zhu09236602018-10-15 15:36:10 +08001061 * lim_send_join_req() - send vdev start request for assoc
Sandeep Puligilla45e0c5e2018-09-21 00:38:23 -07001062 *@session: pe session
1063 *@mlm_join_req: join req
1064 *
1065 * Return: QDF_STATUS
1066 */
Jeff Johnson209dfa02018-11-18 22:54:38 -08001067static QDF_STATUS lim_send_join_req(struct pe_session *session,
Sandeep Puligilla45e0c5e2018-09-21 00:38:23 -07001068 tLimMlmJoinReq *mlm_join_req)
1069{
Abhishek Singh254d5512018-10-30 12:17:05 +05301070 QDF_STATUS status;
1071
1072 status = mlme_set_assoc_type(session->vdev, VDEV_ASSOC);
1073 if (QDF_IS_STATUS_ERROR(status))
1074 return status;
1075
Sandeep Puligilla45e0c5e2018-09-21 00:38:23 -07001076 return wlan_vdev_mlme_sm_deliver_evt(session->vdev,
1077 WLAN_VDEV_SM_EV_START,
1078 sizeof(*mlm_join_req),
1079 mlm_join_req);
1080}
Sandeep Puligilla45e0c5e2018-09-21 00:38:23 -07001081
Jianmin Zhu09236602018-10-15 15:36:10 +08001082/**
1083 * lim_send_reassoc_req() - send vdev start request for reassoc
1084 *@session: pe session
1085 *@mlm_join_req: join req
1086 *
1087 * Return: QDF_STATUS
1088 */
Jeff Johnson209dfa02018-11-18 22:54:38 -08001089static QDF_STATUS lim_send_reassoc_req(struct pe_session *session,
Jianmin Zhu09236602018-10-15 15:36:10 +08001090 tLimMlmReassocReq *reassoc_req)
1091{
Abhishek Singh254d5512018-10-30 12:17:05 +05301092 QDF_STATUS status;
1093
1094 status = mlme_set_assoc_type(session->vdev, VDEV_REASSOC);
1095 if (QDF_IS_STATUS_ERROR(status))
1096 return status;
1097
Jianmin Zhu09236602018-10-15 15:36:10 +08001098 return wlan_vdev_mlme_sm_deliver_evt(session->vdev,
1099 WLAN_VDEV_SM_EV_START,
1100 sizeof(*reassoc_req),
1101 reassoc_req);
1102}
Jianmin Zhu09236602018-10-15 15:36:10 +08001103
1104/**
1105 * lim_send_ft_reassoc_req() - send vdev start request for ft_reassoc
1106 *@session: pe session
1107 *@mlm_join_req: join req
1108 *
1109 * Return: QDF_STATUS
1110 */
Jeff Johnson209dfa02018-11-18 22:54:38 -08001111static QDF_STATUS lim_send_ft_reassoc_req(struct pe_session *session,
Abhishek Singh254d5512018-10-30 12:17:05 +05301112 tLimMlmReassocReq *reassoc_req)
Jianmin Zhu09236602018-10-15 15:36:10 +08001113{
Abhishek Singh254d5512018-10-30 12:17:05 +05301114 QDF_STATUS status;
1115
1116 status = mlme_set_assoc_type(session->vdev, VDEV_FT_REASSOC);
1117 if (QDF_IS_STATUS_ERROR(status))
1118 return status;
1119
Jianmin Zhu09236602018-10-15 15:36:10 +08001120 return wlan_vdev_mlme_sm_deliver_evt(session->vdev,
1121 WLAN_VDEV_SM_EV_START,
Abhishek Singh254d5512018-10-30 12:17:05 +05301122 sizeof(*reassoc_req),
1123 reassoc_req);
Jianmin Zhu09236602018-10-15 15:36:10 +08001124}
Padma, Santhosh Kumarb8f65d92017-09-14 13:05:42 +05301125
Liangwei Dongb677b9e2019-03-26 05:02:23 -04001126#ifdef WLAN_FEATURE_11W
1127#ifdef WLAN_CONV_CRYPTO_IE_SUPPORT
1128/**
1129 * lim_set_rmf_enabled() - set rmf enabled
1130 * @mac: mac context
1131 * @session: pe session
1132 * @csr_join_req: csr join req
1133 *
1134 * Return: void
1135 */
1136static void lim_set_rmf_enabled(struct mac_context *mac,
1137 struct pe_session *session,
1138 struct join_req *csr_join_req)
1139{
1140 struct wlan_objmgr_vdev *vdev;
1141 uint16_t rsn_caps;
1142
1143 vdev = wlan_objmgr_get_vdev_by_id_from_psoc(mac->psoc,
1144 csr_join_req->sessionId,
1145 WLAN_LEGACY_SME_ID);
1146 if (!vdev) {
1147 pe_err("Invalid vdev");
1148 return;
1149 }
1150 rsn_caps = (uint16_t)wlan_crypto_get_param(vdev,
1151 WLAN_CRYPTO_PARAM_RSN_CAP);
1152 if (wlan_crypto_vdev_has_mgmtcipher(
1153 vdev,
1154 (1 << WLAN_CRYPTO_CIPHER_AES_GMAC) |
1155 (1 << WLAN_CRYPTO_CIPHER_AES_GMAC_256) |
1156 (1 << WLAN_CRYPTO_CIPHER_AES_CMAC)) &&
1157 (rsn_caps & WLAN_CRYPTO_RSN_CAP_MFP_ENABLED) &&
1158 (rsn_caps & WLAN_CRYPTO_RSN_CAP_MFP_REQUIRED))
1159 session->limRmfEnabled = 1;
1160
1161 wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
1162
1163 pe_debug("vdev %d limRmfEnabled %d rsn_caps 0x%x",
1164 csr_join_req->sessionId, session->limRmfEnabled,
1165 rsn_caps);
1166}
1167#else
1168/**
1169 * lim_set_rmf_enabled() - set rmf enabled
1170 * @mac: mac context
1171 * @session: pe session
1172 * @csr_join_req: csr join req
1173 *
1174 * Return: void
1175 */
1176static void lim_set_rmf_enabled(struct mac_context *mac,
1177 struct pe_session *session,
1178 struct join_req *csr_join_req)
1179{
1180 if ((eSIR_ED_AES_128_CMAC == csr_join_req->MgmtEncryptionType) ||
1181 (eSIR_ED_AES_GMAC_128 == csr_join_req->MgmtEncryptionType) ||
1182 (eSIR_ED_AES_GMAC_256 == csr_join_req->MgmtEncryptionType))
1183 session->limRmfEnabled = 1;
1184 else
1185 session->limRmfEnabled = 0;
1186
1187 pe_debug("mgmt encryption type %d limRmfEnabled %d",
1188 csr_join_req->MgmtEncryptionType, session->limRmfEnabled);
1189}
1190#endif
1191#else
1192/**
1193 * lim_set_rmf_enabled() - set rmf enabled
1194 * @mac: mac context
1195 * @session: pe session
1196 * @csr_join_req: csr join req
1197 *
1198 * Return: void
1199 */
1200static inline void lim_set_rmf_enabled(struct mac_context *mac,
1201 struct pe_session *session,
1202 struct join_req *csr_join_req)
1203
1204{
1205}
1206#endif
1207
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001208/**
1209 * __lim_process_sme_join_req() - process SME_JOIN_REQ message
1210 * @mac_ctx: Pointer to Global MAC structure
1211 * @msg_buf: A pointer to the SME message buffer
1212 *
1213 * This function is called to process SME_JOIN_REQ message
1214 * from HDD or upper layer application.
1215 *
1216 * Return: None
1217 */
1218static void
Jeff Johnson7fe61d82019-02-20 15:52:04 -08001219__lim_process_sme_join_req(struct mac_context *mac_ctx, void *msg_buf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001220{
Jeff Johnson7fe61d82019-02-20 15:52:04 -08001221 struct join_req *in_req = msg_buf;
Jeff Johnson701444f2019-02-02 22:35:13 -08001222 struct join_req *sme_join_req = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001223 tLimMlmJoinReq *mlm_join_req;
1224 tSirResultCodes ret_code = eSIR_SME_SUCCESS;
1225 uint32_t val = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001226 uint8_t session_id;
Jeff Johnson209dfa02018-11-18 22:54:38 -08001227 struct pe_session *session = NULL;
Nitesh Shah0102cac2016-07-13 14:38:30 +05301228 uint8_t sme_session_id = 0;
Amar Singhala297bfa2015-10-15 15:07:29 -07001229 int8_t local_power_constraint = 0, reg_max = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001230 uint16_t ie_len;
Naveen Rawat08db88f2017-09-08 15:07:48 -07001231 const uint8_t *vendor_ie;
Pragaspathi Thilagaraj1112c962019-05-23 23:45:38 +05301232 struct bss_description *bss_desc;
Abhishek Singh254d5512018-10-30 12:17:05 +05301233 QDF_STATUS status;
Rajeev Kumar Sirasanagandla1a21bf62019-04-08 15:28:57 +05301234 struct lim_max_tx_pwr_attr tx_pwr_attr = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001235
Arif Hussain995fcaf2016-07-18 11:28:22 -07001236 if (!mac_ctx || !msg_buf) {
1237 QDF_TRACE(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_ERROR,
1238 FL("JOIN REQ with invalid data"));
1239 return;
1240 }
1241
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001242/* FEATURE_WLAN_DIAG_SUPPORT */
1243#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM
1244 /*
1245 * Not sending any session, since it is not created yet.
1246 * The response whould have correct state.
1247 */
1248 lim_diag_event_report(mac_ctx, WLAN_PE_DIAG_JOIN_REQ_EVENT, NULL, 0, 0);
1249#endif /* FEATURE_WLAN_DIAG_SUPPORT */
1250
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001251 /*
1252 * Expect Join request in idle state.
1253 * Reassociate request is expected in link established state.
1254 */
1255
1256 /* Global SME and LIM states are not defined yet for BT-AMP Support */
1257 if (mac_ctx->lim.gLimSmeState == eLIM_SME_IDLE_STATE) {
Jeff Johnson7fe61d82019-02-20 15:52:04 -08001258 sme_join_req = qdf_mem_malloc(in_req->length);
Arif Hussainf5b6c412018-10-10 19:41:09 -07001259 if (!sme_join_req) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001260 ret_code = eSIR_SME_RESOURCES_UNAVAILABLE;
Nitesh Shah0102cac2016-07-13 14:38:30 +05301261 goto end;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001262 }
Jeff Johnson7fe61d82019-02-20 15:52:04 -08001263 qdf_mem_copy(sme_join_req, in_req, in_req->length);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001264
1265 if (!lim_is_sme_join_req_valid(mac_ctx, sme_join_req)) {
1266 /* Received invalid eWNI_SME_JOIN_REQ */
1267 /* Log the event */
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07001268 pe_warn("SessionId:%d JOIN REQ with invalid data",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001269 sme_join_req->sessionId);
1270 ret_code = eSIR_SME_INVALID_PARAMETERS;
1271 goto end;
1272 }
1273
Krishna Kumaar Natarajanf599c6e2015-11-03 11:44:03 -08001274 /*
1275 * Update the capability here itself as this is used in
1276 * lim_extract_ap_capability() below. If not updated issues
1277 * like not honoring power constraint on 1st association after
1278 * driver loading might occur.
1279 */
1280 lim_update_rrm_capability(mac_ctx, sme_join_req);
1281
Krunal Soni0acfdcd2016-03-09 12:03:06 -08001282 bss_desc = &sme_join_req->bssDescription;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001283 /* check for the existence of start BSS session */
Krunal Soni0acfdcd2016-03-09 12:03:06 -08001284 session = pe_find_session_by_bssid(mac_ctx, bss_desc->bssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001285 &session_id);
1286
Jeff Johnson8e9530b2019-03-18 13:41:42 -07001287 if (session) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07001288 pe_err("Session(%d) Already exists for BSSID: "
Srinivas Girigowdacb7b8b82019-04-10 14:27:47 -07001289 QDF_MAC_ADDR_STR " in limSmeState = %X",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001290 session_id,
Srinivas Girigowda34fbba02019-04-08 12:07:44 -07001291 QDF_MAC_ADDR_ARRAY(bss_desc->bssId),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001292 session->limSmeState);
1293
1294 if (session->limSmeState == eLIM_SME_LINK_EST_STATE &&
1295 session->smeSessionId == sme_join_req->sessionId) {
1296 /*
1297 * Received eWNI_SME_JOIN_REQ for same
1298 * BSS as currently associated.
1299 * Log the event and send success
1300 */
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07001301 pe_warn("SessionId: %d", session_id);
1302 pe_warn("JOIN_REQ for current joined BSS");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001303 /* Send Join success response to host */
1304 ret_code = eSIR_SME_ALREADY_JOINED_A_BSS;
1305 session = NULL;
1306 goto end;
1307 } else {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07001308 pe_err("JOIN_REQ not for current joined BSS");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001309 ret_code = eSIR_SME_REFUSED;
1310 session = NULL;
1311 goto end;
1312 }
1313 } else {
1314 /*
1315 * Session Entry does not exist for given BSSId
1316 * Try to Create a new session
1317 */
Krunal Soni0acfdcd2016-03-09 12:03:06 -08001318 session = pe_create_session(mac_ctx, bss_desc->bssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001319 &session_id, mac_ctx->lim.maxStation,
Rajeev Kumar Sirasanagandlae3b59912018-08-24 15:53:31 +05301320 eSIR_INFRASTRUCTURE_MODE,
1321 sme_join_req->sessionId);
Jeff Johnson8e9530b2019-03-18 13:41:42 -07001322 if (!session) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07001323 pe_err("Session Can not be created");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001324 ret_code = eSIR_SME_RESOURCES_UNAVAILABLE;
1325 goto end;
Vignesh Viswanathanb3dbbc82018-04-06 00:06:27 +05301326 } else {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07001327 pe_debug("SessionId:%d New session created",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001328 session_id);
Vignesh Viswanathanb3dbbc82018-04-06 00:06:27 +05301329 }
1330
1331 /* Update the beacon/probe filter in mac_ctx */
1332 lim_set_bcn_probe_filter(mac_ctx, session,
1333 &sme_join_req->ssId,
1334 bss_desc->channelId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001335 }
Deepak Dhamdhere612392c2016-08-28 02:56:51 -07001336 session->max_amsdu_num = sme_join_req->max_amsdu_num;
Arif Hussain6686c0b2018-08-21 18:21:05 -07001337 session->enable_session_twt_support =
1338 sme_join_req->enable_session_twt_support;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001339 /*
1340 * Store Session related parameters
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001341 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001342
1343 /* store the smejoin req handle in session table */
1344 session->pLimJoinReq = sme_join_req;
1345
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001346 /* Store beaconInterval */
1347 session->beaconParams.beaconInterval =
Krunal Soni0acfdcd2016-03-09 12:03:06 -08001348 bss_desc->beaconInterval;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001349
Jeff Johnsonbe119e62019-02-02 12:30:26 -08001350 session->ht_config = sme_join_req->ht_config;
1351 session->vht_config = sme_join_req->vht_config;
Sandeep Puligilla98917432016-06-10 13:50:28 -07001352
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001353 /* Copying of bssId is already done, while creating session */
1354 sir_copy_mac_addr(session->selfMacAddr,
1355 sme_join_req->selfMacAddr);
1356 session->bssType = sme_join_req->bsstype;
1357
1358 session->statypeForBss = STA_ENTRY_PEER;
1359 session->limWmeEnabled = sme_join_req->isWMEenabled;
1360 session->limQosEnabled = sme_join_req->isQosEnabled;
Abhishek Singhf78bd2d2016-04-27 16:47:56 +05301361 session->wps_registration = sme_join_req->wps_registration;
Kiran Kumar Lokere722dccd2018-02-23 13:23:52 -08001362 session->he_with_wep_tkip = sme_join_req->he_with_wep_tkip;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001363
Selvaraj, Sridhar05ea0792017-05-17 12:17:03 +05301364 session->enable_bcast_probe_rsp =
1365 sme_join_req->enable_bcast_probe_rsp;
1366
Jeff Johnson179fd8a2018-05-11 14:20:05 -07001367 /* Store vendor specific IE for CISCO AP */
Krunal Soni0acfdcd2016-03-09 12:03:06 -08001368 ie_len = (bss_desc->length + sizeof(bss_desc->length) -
Pragaspathi Thilagaraj1112c962019-05-23 23:45:38 +05301369 GET_FIELD_OFFSET(struct bss_description, ieFields));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001370
Naveen Rawat08db88f2017-09-08 15:07:48 -07001371 vendor_ie = wlan_get_vendor_ie_ptr_from_oui(
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001372 SIR_MAC_CISCO_OUI, SIR_MAC_CISCO_OUI_SIZE,
Krunal Soni0acfdcd2016-03-09 12:03:06 -08001373 ((uint8_t *)&bss_desc->ieFields), ie_len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001374
Jeff Johnson8e9530b2019-03-18 13:41:42 -07001375 if (vendor_ie) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07001376 pe_debug("Cisco vendor OUI present");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001377 session->isCiscoVendorAP = true;
1378 } else {
1379 session->isCiscoVendorAP = false;
1380 }
1381
1382 /* Copy the dot 11 mode in to the session table */
1383
1384 session->dot11mode = sme_join_req->dot11mode;
1385#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
1386 session->cc_switch_mode = sme_join_req->cc_switch_mode;
1387#endif
Krunal Soni0acfdcd2016-03-09 12:03:06 -08001388 session->nwType = bss_desc->nwType;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001389 session->enableAmpduPs = sme_join_req->enableAmpduPs;
1390 session->enableHtSmps = sme_join_req->enableHtSmps;
1391 session->htSmpsvalue = sme_join_req->htSmps;
Archana Ramachandranfec24812016-02-16 16:31:56 -08001392 session->send_smps_action =
1393 sme_join_req->send_smps_action;
Archana Ramachandran5482d6a2016-03-29 17:09:22 -07001394 /*
1395 * By default supported NSS 1x1 is set to true
1396 * and later on updated while determining session
1397 * supported rates which is the intersection of
1398 * self and peer rates
1399 */
1400 session->supported_nss_1x1 = true;
Abhishek Singh23edd1c2016-05-05 11:56:06 +05301401 /*Store Persona */
Pragaspathi Thilagaraje64714a2019-05-23 00:46:25 +05301402 session->opmode = sme_join_req->staPersona;
1403 pe_debug("enable Smps: %d mode: %d send action: %d supported nss 1x1: %d opmode %d cbMode %d",
1404 session->enableHtSmps, session->htSmpsvalue,
1405 session->send_smps_action, session->supported_nss_1x1,
1406 session->opmode, sme_join_req->cbMode);
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07001407
1408 /*Store Persona */
Pragaspathi Thilagaraje64714a2019-05-23 00:46:25 +05301409 session->opmode = sme_join_req->staPersona;
Abhishek Singh4294f802017-08-10 16:37:07 +05301410 QDF_TRACE(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_DEBUG,
Abhishek Singhb59f8d42017-07-31 14:42:47 +05301411 FL("PE PERSONA=%d cbMode %u nwType: %d dot11mode: %d force_24ghz_in_ht20 %d"),
Pragaspathi Thilagaraje64714a2019-05-23 00:46:25 +05301412 session->opmode, sme_join_req->cbMode,
Abhishek Singhb59f8d42017-07-31 14:42:47 +05301413 session->nwType, session->dot11mode,
1414 sme_join_req->force_24ghz_in_ht20);
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -08001415
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07001416 /* Copy The channel Id to the session Table */
1417 session->currentOperChannel = bss_desc->channelId;
Vignesh Viswanathand5a5f2e2018-06-01 15:35:51 +05301418
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001419 session->vhtCapability =
1420 IS_DOT11_MODE_VHT(session->dot11mode);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001421 if (session->vhtCapability) {
Pragaspathi Thilagaraje64714a2019-05-23 00:46:25 +05301422 if (session->opmode == QDF_STA_MODE) {
Krunal Soni53993f72016-07-08 18:20:03 -07001423 session->vht_config.su_beam_formee =
1424 sme_join_req->vht_config.su_beam_formee;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001425 } else {
Krunal Soni53993f72016-07-08 18:20:03 -07001426 session->vht_config.su_beam_formee = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001427 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001428 session->enableVhtpAid =
1429 sme_join_req->enableVhtpAid;
1430 session->enableVhtGid =
1431 sme_join_req->enableVhtGid;
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07001432 pe_debug("vht su bformer [%d]",
Krunal Soni53993f72016-07-08 18:20:03 -07001433 session->vht_config.su_beam_former);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001434 }
Krunal Soni53993f72016-07-08 18:20:03 -07001435
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07001436 pe_debug("vhtCapability: %d su_beam_formee: %d txbf_csn_value: %d su_tx_bformer %d",
Abhishek Singh23edd1c2016-05-05 11:56:06 +05301437 session->vhtCapability,
Krunal Soni53993f72016-07-08 18:20:03 -07001438 session->vht_config.su_beam_formee,
1439 session->vht_config.csnof_beamformer_antSup,
Krishna Kumaar Natarajan0103ef82017-02-17 18:15:56 -08001440 session->vht_config.su_beam_former);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001441 /*Phy mode */
Krunal Soni0acfdcd2016-03-09 12:03:06 -08001442 session->gLimPhyMode = bss_desc->nwType;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001443 handle_ht_capabilityand_ht_info(mac_ctx, session);
Abhishek Singhb59f8d42017-07-31 14:42:47 +05301444 session->force_24ghz_in_ht20 =
1445 sme_join_req->force_24ghz_in_ht20;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001446 /* cbMode is already merged value of peer and self -
1447 * done by csr in csr_get_cb_mode_from_ies */
1448 session->htSupportedChannelWidthSet =
1449 (sme_join_req->cbMode) ? 1 : 0;
1450 session->htRecommendedTxWidthSet =
1451 session->htSupportedChannelWidthSet;
1452 session->htSecondaryChannelOffset = sme_join_req->cbMode;
1453
1454 if (PHY_DOUBLE_CHANNEL_HIGH_PRIMARY == sme_join_req->cbMode) {
1455 session->ch_center_freq_seg0 =
1456 session->currentOperChannel - 2;
1457 session->ch_width = CH_WIDTH_40MHZ;
1458 } else if (PHY_DOUBLE_CHANNEL_LOW_PRIMARY ==
1459 sme_join_req->cbMode) {
1460 session->ch_center_freq_seg0 =
1461 session->currentOperChannel + 2;
1462 session->ch_width = CH_WIDTH_40MHZ;
1463 } else {
1464 session->ch_center_freq_seg0 = 0;
1465 session->ch_width = CH_WIDTH_20MHZ;
1466 }
1467
Naveen Rawataeca1b92017-10-16 16:55:31 -07001468 if (IS_DOT11_MODE_HE(session->dot11mode)) {
1469 lim_update_session_he_capable(mac_ctx, session);
1470 lim_copy_join_req_he_cap(session, sme_join_req);
1471 }
1472
1473
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001474 /* Record if management frames need to be protected */
Liangwei Dongb677b9e2019-03-26 05:02:23 -04001475 lim_set_rmf_enabled(mac_ctx, session, sme_join_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001476
1477#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM
Krunal Soni0acfdcd2016-03-09 12:03:06 -08001478 session->rssi = bss_desc->rssi;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001479#endif
1480
1481 /* Copy the SSID from smejoinreq to session entry */
1482 session->ssId.length = sme_join_req->ssId.length;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301483 qdf_mem_copy(session->ssId.ssId, sme_join_req->ssId.ssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001484 session->ssId.length);
1485
1486 /*
1487 * Determin 11r or ESE connection based on input from SME
1488 * which inturn is dependent on the profile the user wants
1489 * to connect to, So input is coming from supplicant
1490 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001491 session->is11Rconnection = sme_join_req->is11Rconnection;
Pragaspathi Thilagaraj0bd369d2019-04-08 00:07:53 +05301492 session->connected_akm = sme_join_req->akm;
Pragaspathi Thilagaraj54018e02019-04-25 01:32:17 +05301493 session->is_adaptive_11r_connection =
1494 sme_join_req->is_adaptive_11r_connection;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001495#ifdef FEATURE_WLAN_ESE
1496 session->isESEconnection = sme_join_req->isESEconnection;
1497#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001498 session->isFastTransitionEnabled =
1499 sme_join_req->isFastTransitionEnabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001500
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001501 session->isFastRoamIniFeatureEnabled =
1502 sme_join_req->isFastRoamIniFeatureEnabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001503 session->txLdpcIniFeatureEnabled =
1504 sme_join_req->txLdpcIniFeatureEnabled;
1505
Pragaspathi Thilagaraj5f510772019-03-12 18:06:01 +05301506 lim_update_fils_config(mac_ctx, session, sme_join_req);
Padma, Santhosh Kumarb8f65d92017-09-14 13:05:42 +05301507 lim_update_sae_config(session, sme_join_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001508 if (session->bssType == eSIR_INFRASTRUCTURE_MODE) {
1509 session->limSystemRole = eLIM_STA_ROLE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001510 } else {
1511 /*
1512 * Throw an error and return and make
1513 * sure to delete the session.
1514 */
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07001515 pe_err("recvd JOIN_REQ with invalid bss type %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001516 session->bssType);
1517 ret_code = eSIR_SME_INVALID_PARAMETERS;
1518 goto end;
1519 }
1520
1521 if (sme_join_req->addIEScan.length)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301522 qdf_mem_copy(&session->pLimJoinReq->addIEScan,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001523 &sme_join_req->addIEScan, sizeof(tSirAddie));
1524
1525 if (sme_join_req->addIEAssoc.length)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301526 qdf_mem_copy(&session->pLimJoinReq->addIEAssoc,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001527 &sme_join_req->addIEAssoc, sizeof(tSirAddie));
1528
1529 val = sizeof(tLimMlmJoinReq) +
1530 session->pLimJoinReq->bssDescription.length + 2;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301531 mlm_join_req = qdf_mem_malloc(val);
Arif Hussainf5b6c412018-10-10 19:41:09 -07001532 if (!mlm_join_req) {
Nitesh Shah0102cac2016-07-13 14:38:30 +05301533 ret_code = eSIR_SME_RESOURCES_UNAVAILABLE;
1534 goto end;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001535 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001536
1537 /* PE SessionId is stored as a part of JoinReq */
1538 mlm_join_req->sessionId = session->peSessionId;
1539
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001540 /* copy operational rate from session */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301541 qdf_mem_copy((void *)&session->rateSet,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001542 (void *)&sme_join_req->operationalRateSet,
1543 sizeof(tSirMacRateSet));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301544 qdf_mem_copy((void *)&session->extRateSet,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001545 (void *)&sme_join_req->extendedRateSet,
1546 sizeof(tSirMacRateSet));
1547 /*
1548 * this may not be needed anymore now, as rateSet is now
1549 * included in the session entry and MLM has session context.
1550 */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301551 qdf_mem_copy((void *)&mlm_join_req->operationalRateSet,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001552 (void *)&session->rateSet,
1553 sizeof(tSirMacRateSet));
1554
1555 session->encryptType = sme_join_req->UCEncryptionType;
1556
Vignesh Viswanathand5a5f2e2018-06-01 15:35:51 +05301557 session->supported_nss_1x1 = sme_join_req->supported_nss_1x1;
1558 session->vdev_nss = sme_join_req->vdev_nss;
1559 session->nss = sme_join_req->nss;
1560 session->nss_forced_1x1 = sme_join_req->nss_forced_1x1;
1561
1562 pe_debug("nss %d, vdev_nss %d, supported_nss_1x1 %d",
1563 session->nss,
1564 session->vdev_nss,
1565 session->supported_nss_1x1);
1566
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001567 mlm_join_req->bssDescription.length =
1568 session->pLimJoinReq->bssDescription.length;
1569
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301570 qdf_mem_copy((uint8_t *) &mlm_join_req->bssDescription.bssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001571 (uint8_t *)
1572 &session->pLimJoinReq->bssDescription.bssId,
1573 session->pLimJoinReq->bssDescription.length + 2);
1574
1575 session->limCurrentBssCaps =
1576 session->pLimJoinReq->bssDescription.capabilityInfo;
1577
Wu Gao5c3d94b2019-01-17 21:15:54 +08001578 reg_max = lim_get_regulatory_max_transmit_power(mac_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001579 session->currentOperChannel);
1580 local_power_constraint = reg_max;
1581
1582 lim_extract_ap_capability(mac_ctx,
1583 (uint8_t *)
1584 session->pLimJoinReq->bssDescription.ieFields,
1585 lim_get_ielen_from_bss_description(
1586 &session->pLimJoinReq->bssDescription),
1587 &session->limCurrentBssQosCaps,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001588 &session->gLimCurrentBssUapsd,
1589 &local_power_constraint, session);
1590
Rajeev Kumar Sirasanagandla1a21bf62019-04-08 15:28:57 +05301591 tx_pwr_attr.reg_max = reg_max;
1592 tx_pwr_attr.ap_tx_power = local_power_constraint;
1593 tx_pwr_attr.ini_tx_power =
1594 mac_ctx->mlme_cfg->power.max_tx_power;
1595 tx_pwr_attr.frequency =
1596 wlan_reg_get_channel_freq(mac_ctx->pdev,
1597 session->currentOperChannel);
1598
1599 session->maxTxPower = lim_get_max_tx_power(mac_ctx,
1600 &tx_pwr_attr);
Abhinav Kumard528d192018-03-09 17:31:12 +05301601 session->def_max_tx_pwr = session->maxTxPower;
Padma, Santhosh Kumar29df3622016-08-16 19:15:16 +05301602
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07001603 pe_debug("Reg max %d local power con %d max tx pwr %d",
Varun Reddy Yeturu0e3989a2016-04-15 13:30:42 +05301604 reg_max, local_power_constraint, session->maxTxPower);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001605
Agrawal Ashish1fdcbb62017-03-10 17:48:57 +05301606 if (sme_join_req->powerCap.maxTxPower > session->maxTxPower) {
1607 sme_join_req->powerCap.maxTxPower = session->maxTxPower;
1608 pe_debug("Update MaxTxPower in join Req to %d",
1609 sme_join_req->powerCap.maxTxPower);
1610 }
1611
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001612 if (session->gLimCurrentBssUapsd) {
1613 session->gUapsdPerAcBitmask =
1614 session->pLimJoinReq->uapsdPerAcBitmask;
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07001615 pe_debug("UAPSD flag for all AC - 0x%2x",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001616 session->gUapsdPerAcBitmask);
1617
1618 /* resetting the dynamic uapsd mask */
1619 session->gUapsdPerAcDeliveryEnableMask = 0;
1620 session->gUapsdPerAcTriggerEnableMask = 0;
1621 }
1622
1623 session->limRFBand =
1624 lim_get_rf_band(session->currentOperChannel);
1625
1626 /* Initialize 11h Enable Flag */
Abhinav Kumard4d6eb72018-12-04 20:30:37 +05301627 if (session->limRFBand == BAND_5G)
1628 session->lim11hEnable =
1629 mac_ctx->mlme_cfg->gen.enabled_11h;
1630 else
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001631 session->lim11hEnable = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001632 /*
1633 * To care of the scenario when STA transitions from
1634 * IBSS to Infrastructure mode.
1635 */
1636 mac_ctx->lim.gLimIbssCoalescingHappened = false;
1637
1638 session->limPrevSmeState = session->limSmeState;
1639 session->limSmeState = eLIM_SME_WT_JOIN_STATE;
1640 MTRACE(mac_trace(mac_ctx, TRACE_CODE_SME_STATE,
1641 session->peSessionId,
1642 session->limSmeState));
1643
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001644 /* Indicate whether spectrum management is enabled */
1645 session->spectrumMgtEnabled =
1646 sme_join_req->spectrumMgtIndicator;
Sandeep Puligilla01fcd3d2019-02-08 18:17:04 -08001647 /* Enable MBSSID only for station */
1648 session->is_mbssid_enabled = wma_is_mbssid_enabled();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001649
1650 /* Enable the spectrum management if this is a DFS channel */
1651 if (session->country_info_present &&
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07001652 lim_isconnected_on_dfs_channel(mac_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001653 session->currentOperChannel))
1654 session->spectrumMgtEnabled = true;
1655
1656 session->isOSENConnection = sme_join_req->isOSENConnection;
1657
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001658 /* Issue LIM_MLM_JOIN_REQ to MLM */
Abhishek Singh254d5512018-10-30 12:17:05 +05301659 status = lim_send_join_req(session, mlm_join_req);
1660 if (QDF_IS_STATUS_ERROR(status)) {
1661 qdf_mem_free(mlm_join_req);
1662 ret_code = eSIR_SME_REFUSED;
1663 goto end;
1664 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001665 return;
1666
1667 } else {
1668 /* Received eWNI_SME_JOIN_REQ un expected state */
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07001669 pe_err("received unexpected SME_JOIN_REQ in state %X",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001670 mac_ctx->lim.gLimSmeState);
1671 lim_print_sme_state(mac_ctx, LOGE, mac_ctx->lim.gLimSmeState);
1672 ret_code = eSIR_SME_UNEXPECTED_REQ_RESULT_CODE;
1673 session = NULL;
1674 goto end;
1675 }
1676
1677end:
Jeff Johnson7fe61d82019-02-20 15:52:04 -08001678 sme_session_id = in_req->sessionId;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001679
1680 if (sme_join_req) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301681 qdf_mem_free(sme_join_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001682 sme_join_req = NULL;
Jeff Johnson8e9530b2019-03-18 13:41:42 -07001683 if (session)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001684 session->pLimJoinReq = NULL;
1685 }
1686 if (ret_code != eSIR_SME_SUCCESS) {
Jeff Johnson8e9530b2019-03-18 13:41:42 -07001687 if (session) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001688 pe_delete_session(mac_ctx, session);
1689 session = NULL;
1690 }
1691 }
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07001692 pe_debug("Send failure status on sessionid: %d with ret_code: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001693 sme_session_id, ret_code);
1694 lim_send_sme_join_reassoc_rsp(mac_ctx, eWNI_SME_JOIN_RSP, ret_code,
Jeff Johnson27b98962019-02-20 20:53:08 -08001695 eSIR_MAC_UNSPEC_FAILURE_STATUS, session, sme_session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001696}
1697
Rajeev Kumar Sirasanagandla1a21bf62019-04-08 15:28:57 +05301698uint8_t lim_get_max_tx_power(struct mac_context *mac,
1699 struct lim_max_tx_pwr_attr *attr)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001700{
Rajeev Kumar Sirasanagandla1a21bf62019-04-08 15:28:57 +05301701 uint8_t max_tx_power = 0;
1702 uint8_t tx_power;
Srinivas Girigowda4d65ebe2017-10-13 21:41:42 -07001703
Rajeev Kumar Sirasanagandla1a21bf62019-04-08 15:28:57 +05301704 if (!attr)
1705 return 0;
1706
1707 if (wlan_reg_get_fcc_constraint(mac->pdev, attr->frequency))
1708 return attr->reg_max;
1709
1710 tx_power = QDF_MIN(attr->reg_max, attr->ap_tx_power);
1711 tx_power = QDF_MIN(tx_power, attr->ini_tx_power);
1712
1713 if (tx_power >= MIN_TX_PWR_CAP && tx_power <= MAX_TX_PWR_CAP)
1714 max_tx_power = tx_power;
1715 else if (tx_power < MIN_TX_PWR_CAP)
1716 max_tx_power = MIN_TX_PWR_CAP;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001717 else
Rajeev Kumar Sirasanagandla1a21bf62019-04-08 15:28:57 +05301718 max_tx_power = MAX_TX_PWR_CAP;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001719
Rajeev Kumar Sirasanagandla1a21bf62019-04-08 15:28:57 +05301720 return max_tx_power;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001721}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001722
1723/**
1724 * __lim_process_sme_reassoc_req() - process reassoc req
1725 *
1726 * @mac_ctx: Pointer to Global MAC structure
1727 * @msg_buf: pointer to the SME message buffer
1728 *
1729 * This function is called to process SME_REASSOC_REQ message
1730 * from HDD or upper layer application.
1731 *
1732 * Return: None
1733 */
1734
Jeff Johnson83d6c112018-12-02 13:05:00 -08001735static void __lim_process_sme_reassoc_req(struct mac_context *mac_ctx,
Jeff Johnson7fe61d82019-02-20 15:52:04 -08001736 void *msg_buf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001737{
1738 uint16_t caps;
1739 uint32_t val;
Jeff Johnson7fe61d82019-02-20 15:52:04 -08001740 struct join_req *in_req = msg_buf;
Jeff Johnson701444f2019-02-02 22:35:13 -08001741 struct join_req *reassoc_req;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001742 tLimMlmReassocReq *mlm_reassoc_req;
1743 tSirResultCodes ret_code = eSIR_SME_SUCCESS;
Jeff Johnson209dfa02018-11-18 22:54:38 -08001744 struct pe_session *session_entry = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001745 uint8_t session_id;
1746 uint8_t sme_session_id;
Amar Singhala297bfa2015-10-15 15:07:29 -07001747 int8_t local_pwr_constraint = 0, reg_max = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001748 uint32_t tele_bcn_en = 0;
Abhishek Singh254d5512018-10-30 12:17:05 +05301749 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001750
Jeff Johnson7fe61d82019-02-20 15:52:04 -08001751 sme_session_id = in_req->sessionId;
Jeff Johnson7fe61d82019-02-20 15:52:04 -08001752
1753 reassoc_req = qdf_mem_malloc(in_req->length);
Arif Hussainf5b6c412018-10-10 19:41:09 -07001754 if (!reassoc_req) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001755 ret_code = eSIR_SME_RESOURCES_UNAVAILABLE;
1756 goto end;
1757 }
Jeff Johnson7fe61d82019-02-20 15:52:04 -08001758 qdf_mem_copy(reassoc_req, in_req, in_req->length);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001759
Jeff Johnson701444f2019-02-02 22:35:13 -08001760 if (!lim_is_sme_join_req_valid(mac_ctx, reassoc_req)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001761 /*
1762 * Received invalid eWNI_SME_REASSOC_REQ
1763 */
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07001764 pe_warn("received SME_REASSOC_REQ with invalid data");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001765
1766 ret_code = eSIR_SME_INVALID_PARAMETERS;
1767 goto end;
1768 }
1769
1770 session_entry = pe_find_session_by_bssid(mac_ctx,
1771 reassoc_req->bssDescription.bssId,
1772 &session_id);
Jeff Johnson8e9530b2019-03-18 13:41:42 -07001773 if (!session_entry) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07001774 pe_err("Session does not exist for given bssId");
Varun Reddy Yeturu658b8022016-09-23 11:10:42 -07001775 lim_print_mac_addr(mac_ctx, reassoc_req->bssDescription.bssId,
1776 LOGE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001777 ret_code = eSIR_SME_INVALID_PARAMETERS;
Varun Reddy Yeturu658b8022016-09-23 11:10:42 -07001778 session_entry =
1779 pe_find_session_by_sme_session_id(mac_ctx,
1780 sme_session_id);
Jeff Johnson8e9530b2019-03-18 13:41:42 -07001781 if (session_entry)
Varun Reddy Yeturu658b8022016-09-23 11:10:42 -07001782 lim_handle_sme_join_result(mac_ctx,
1783 eSIR_SME_INVALID_PARAMETERS,
1784 eSIR_MAC_UNSPEC_FAILURE_STATUS,
1785 session_entry);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001786 goto end;
1787 }
1788#ifdef FEATURE_WLAN_DIAG_SUPPORT /* FEATURE_WLAN_DIAG_SUPPORT */
1789 lim_diag_event_report(mac_ctx, WLAN_PE_DIAG_REASSOC_REQ_EVENT,
Jeff Johnson0301ecb2018-06-29 09:36:23 -07001790 session_entry, QDF_STATUS_SUCCESS, QDF_STATUS_SUCCESS);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001791#endif /* FEATURE_WLAN_DIAG_SUPPORT */
1792 /* mac_ctx->lim.gpLimReassocReq = reassoc_req;//TO SUPPORT BT-AMP */
1793
1794 /* Store the reassoc handle in the session Table */
1795 session_entry->pLimReAssocReq = reassoc_req;
1796
1797 session_entry->dot11mode = reassoc_req->dot11mode;
1798 session_entry->vhtCapability =
1799 IS_DOT11_MODE_VHT(reassoc_req->dot11mode);
Archana Ramachandran20d2e232016-02-11 16:58:40 -08001800
Padma, Santhosh Kumar429553d2016-08-08 18:49:31 +05301801 if (session_entry->vhtCapability) {
Pragaspathi Thilagaraje64714a2019-05-23 00:46:25 +05301802 if (session_entry->opmode == QDF_STA_MODE) {
Padma, Santhosh Kumar429553d2016-08-08 18:49:31 +05301803 session_entry->vht_config.su_beam_formee =
1804 reassoc_req->vht_config.su_beam_formee;
1805 } else {
1806 reassoc_req->vht_config.su_beam_formee = 0;
1807 }
1808 session_entry->enableVhtpAid =
1809 reassoc_req->enableVhtpAid;
1810 session_entry->enableVhtGid =
1811 reassoc_req->enableVhtGid;
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07001812 pe_debug("vht su bformer [%d]", session_entry->vht_config.su_beam_former);
Padma, Santhosh Kumar429553d2016-08-08 18:49:31 +05301813 }
1814
Vignesh Viswanathand5a5f2e2018-06-01 15:35:51 +05301815 session_entry->supported_nss_1x1 = reassoc_req->supported_nss_1x1;
1816 session_entry->vdev_nss = reassoc_req->vdev_nss;
1817 session_entry->nss = reassoc_req->nss;
1818 session_entry->nss_forced_1x1 = reassoc_req->nss_forced_1x1;
1819
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07001820 pe_debug("vhtCapability: %d su_beam_formee: %d su_tx_bformer %d",
Padma, Santhosh Kumar429553d2016-08-08 18:49:31 +05301821 session_entry->vhtCapability,
1822 session_entry->vht_config.su_beam_formee,
1823 session_entry->vht_config.su_beam_former);
1824
Archana Ramachandran20d2e232016-02-11 16:58:40 -08001825 session_entry->enableHtSmps = reassoc_req->enableHtSmps;
1826 session_entry->htSmpsvalue = reassoc_req->htSmps;
Archana Ramachandranfec24812016-02-16 16:31:56 -08001827 session_entry->send_smps_action =
1828 reassoc_req->send_smps_action;
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07001829 pe_debug("enableHtSmps: %d htSmps: %d send action: %d supported nss 1x1: %d",
Archana Ramachandran20d2e232016-02-11 16:58:40 -08001830 session_entry->enableHtSmps,
Archana Ramachandranfec24812016-02-16 16:31:56 -08001831 session_entry->htSmpsvalue,
Archana Ramachandran5482d6a2016-03-29 17:09:22 -07001832 session_entry->send_smps_action,
1833 session_entry->supported_nss_1x1);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001834 /*
1835 * Reassociate request is expected
1836 * in link established state only.
1837 */
1838
1839 if (session_entry->limSmeState != eLIM_SME_LINK_EST_STATE) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001840 if (session_entry->limSmeState == eLIM_SME_WT_REASSOC_STATE) {
1841 /*
1842 * May be from 11r FT pre-auth. So lets check it
1843 * before we bail out
1844 */
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07001845 pe_debug("Session in reassoc state is %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001846 session_entry->peSessionId);
1847
1848 /* Make sure its our preauth bssid */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301849 if (qdf_mem_cmp(reassoc_req->bssDescription.bssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001850 session_entry->limReAssocbssId,
1851 6)) {
1852 lim_print_mac_addr(mac_ctx,
1853 reassoc_req->bssDescription.
1854 bssId, LOGE);
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07001855 pe_err("Unknown bssId in reassoc state");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001856 ret_code = eSIR_SME_INVALID_PARAMETERS;
1857 goto end;
1858 }
1859
Jianmin Zhu09236602018-10-15 15:36:10 +08001860 session_entry->smeSessionId = sme_session_id;
Abhishek Singh254d5512018-10-30 12:17:05 +05301861 mlm_reassoc_req =
1862 qdf_mem_malloc(sizeof(*mlm_reassoc_req));
1863 if (!mlm_reassoc_req) {
1864 ret_code = eSIR_SME_RESOURCES_UNAVAILABLE;
1865 goto end;
1866 }
1867
1868 /* Update PE sessionId */
1869 mlm_reassoc_req->sessionId = session_entry->peSessionId;
1870 status = lim_send_ft_reassoc_req(session_entry,
1871 mlm_reassoc_req);
1872 if (QDF_IS_STATUS_ERROR(status)) {
1873 qdf_mem_free(mlm_reassoc_req);
1874 ret_code = eSIR_SME_REFUSED;
1875 goto end;
1876 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001877 return;
1878 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001879 /*
1880 * Should not have received eWNI_SME_REASSOC_REQ
1881 */
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07001882 pe_err("received unexpected SME_REASSOC_REQ in state %X",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001883 session_entry->limSmeState);
1884 lim_print_sme_state(mac_ctx, LOGE, session_entry->limSmeState);
1885
1886 ret_code = eSIR_SME_UNEXPECTED_REQ_RESULT_CODE;
1887 goto end;
1888 }
1889
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301890 qdf_mem_copy(session_entry->limReAssocbssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001891 session_entry->pLimReAssocReq->bssDescription.bssId,
1892 sizeof(tSirMacAddr));
1893
1894 session_entry->limReassocChannelId =
1895 session_entry->pLimReAssocReq->bssDescription.channelId;
1896
1897 session_entry->reAssocHtSupportedChannelWidthSet =
1898 (session_entry->pLimReAssocReq->cbMode) ? 1 : 0;
1899 session_entry->reAssocHtRecommendedTxWidthSet =
1900 session_entry->reAssocHtSupportedChannelWidthSet;
1901 session_entry->reAssocHtSecondaryChannelOffset =
1902 session_entry->pLimReAssocReq->cbMode;
1903
1904 session_entry->limReassocBssCaps =
1905 session_entry->pLimReAssocReq->bssDescription.capabilityInfo;
Wu Gao5c3d94b2019-01-17 21:15:54 +08001906 reg_max = lim_get_regulatory_max_transmit_power(mac_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001907 session_entry->currentOperChannel);
1908 local_pwr_constraint = reg_max;
1909
1910 lim_extract_ap_capability(mac_ctx,
1911 (uint8_t *)session_entry->pLimReAssocReq->bssDescription.ieFields,
1912 lim_get_ielen_from_bss_description(
1913 &session_entry->pLimReAssocReq->bssDescription),
1914 &session_entry->limReassocBssQosCaps,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001915 &session_entry->gLimCurrentBssUapsd,
1916 &local_pwr_constraint, session_entry);
Anurag Chouhan6d760662016-02-20 16:05:43 +05301917 session_entry->maxTxPower = QDF_MIN(reg_max, (local_pwr_constraint));
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07001918 pe_err("Reg max = %d, local pwr constraint = %d, max tx = %d",
Varun Reddy Yeturu0e3989a2016-04-15 13:30:42 +05301919 reg_max, local_pwr_constraint, session_entry->maxTxPower);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001920 /* Copy the SSID from session entry to local variable */
1921 session_entry->limReassocSSID.length = reassoc_req->ssId.length;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301922 qdf_mem_copy(session_entry->limReassocSSID.ssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001923 reassoc_req->ssId.ssId,
1924 session_entry->limReassocSSID.length);
1925 if (session_entry->gLimCurrentBssUapsd) {
1926 session_entry->gUapsdPerAcBitmask =
1927 session_entry->pLimReAssocReq->uapsdPerAcBitmask;
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07001928 pe_debug("UAPSD flag for all AC - 0x%2x",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001929 session_entry->gUapsdPerAcBitmask);
1930 }
1931
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301932 mlm_reassoc_req = qdf_mem_malloc(sizeof(tLimMlmReassocReq));
Arif Hussainf5b6c412018-10-10 19:41:09 -07001933 if (!mlm_reassoc_req) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001934 ret_code = eSIR_SME_RESOURCES_UNAVAILABLE;
1935 goto end;
1936 }
1937
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301938 qdf_mem_copy(mlm_reassoc_req->peerMacAddr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001939 session_entry->limReAssocbssId, sizeof(tSirMacAddr));
1940
Wu Gao5c3d94b2019-01-17 21:15:54 +08001941 if (lim_get_capability_info(mac_ctx, &caps, session_entry) !=
1942 QDF_STATUS_SUCCESS)
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07001943 pe_err("could not retrieve Capabilities value");
Selvaraj, Sridharaf54e2e2016-06-24 12:25:02 +05301944
1945 lim_update_caps_info_for_bss(mac_ctx, &caps,
1946 reassoc_req->bssDescription.capabilityInfo);
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07001947 pe_debug("Capabilities info Reassoc: 0x%X", caps);
Selvaraj, Sridharaf54e2e2016-06-24 12:25:02 +05301948
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001949 mlm_reassoc_req->capabilityInfo = caps;
1950
1951 /* Update PE session_id */
1952 mlm_reassoc_req->sessionId = session_id;
1953
1954 /*
1955 * If telescopic beaconing is enabled, set listen interval to
Bala Venkatesh2fde2c62018-09-11 20:33:24 +05301956 * CFG_TELE_BCN_MAX_LI
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001957 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001958
Bala Venkatesh2fde2c62018-09-11 20:33:24 +05301959 tele_bcn_en = mac_ctx->mlme_cfg->sap_cfg.tele_bcn_wakeup_en;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001960
Bala Venkatesh2fde2c62018-09-11 20:33:24 +05301961 if (tele_bcn_en)
1962 val = mac_ctx->mlme_cfg->sap_cfg.tele_bcn_max_li;
1963 else
1964 val = mac_ctx->mlme_cfg->sap_cfg.listen_interval;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001965
1966 mlm_reassoc_req->listenInterval = (uint16_t) val;
1967
1968 /* Indicate whether spectrum management is enabled */
1969 session_entry->spectrumMgtEnabled = reassoc_req->spectrumMgtIndicator;
1970
1971 /* Enable the spectrum management if this is a DFS channel */
1972 if (session_entry->country_info_present &&
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07001973 lim_isconnected_on_dfs_channel(mac_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001974 session_entry->currentOperChannel))
1975 session_entry->spectrumMgtEnabled = true;
1976
1977 session_entry->limPrevSmeState = session_entry->limSmeState;
1978 session_entry->limSmeState = eLIM_SME_WT_REASSOC_STATE;
1979
1980 MTRACE(mac_trace(mac_ctx, TRACE_CODE_SME_STATE,
1981 session_entry->peSessionId,
1982 session_entry->limSmeState));
1983
Abhishek Singh254d5512018-10-30 12:17:05 +05301984 status = lim_send_reassoc_req(session_entry, mlm_reassoc_req);
1985 if (QDF_IS_STATUS_ERROR(status)) {
1986 qdf_mem_free(mlm_reassoc_req);
1987 ret_code = eSIR_SME_REFUSED;
1988 goto end;
1989 }
Jianmin Zhu09236602018-10-15 15:36:10 +08001990
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001991 return;
1992end:
1993 if (reassoc_req) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301994 qdf_mem_free(reassoc_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001995 if (session_entry)
1996 session_entry->pLimReAssocReq = NULL;
1997 }
1998
Jeff Johnson27b98962019-02-20 20:53:08 -08001999 if (session_entry)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002000 /*
Jeff Johnson27b98962019-02-20 20:53:08 -08002001 * error occurred after we determined the session so
2002 * extract session id from there, otherwise we'll use
2003 * the value already extracted from the message
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002004 */
2005 sme_session_id = session_entry->smeSessionId;
Jeff Johnson27b98962019-02-20 20:53:08 -08002006
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002007 /*
2008 * Send Reassoc failure response to host
2009 * (note session_entry may be NULL, but that's OK)
2010 */
2011 lim_send_sme_join_reassoc_rsp(mac_ctx, eWNI_SME_REASSOC_RSP,
2012 ret_code, eSIR_MAC_UNSPEC_FAILURE_STATUS,
Jeff Johnson27b98962019-02-20 20:53:08 -08002013 session_entry, sme_session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002014}
2015
2016bool send_disassoc_frame = 1;
2017/**
2018 * __lim_process_sme_disassoc_req()
2019 *
2020 ***FUNCTION:
2021 * This function is called to process SME_DISASSOC_REQ message
2022 * from HDD or upper layer application.
2023 *
2024 ***LOGIC:
2025 *
2026 ***ASSUMPTIONS:
2027 *
2028 ***NOTE:
2029 *
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002030 * @param mac Pointer to Global MAC structure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002031 * @param *pMsgBuf A pointer to the SME message buffer
2032 * @return None
2033 */
2034
Jeff Johnsonb3dfc3b2019-02-21 12:39:47 -08002035static void __lim_process_sme_disassoc_req(struct mac_context *mac,
2036 uint32_t *pMsgBuf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002037{
2038 uint16_t disassocTrigger, reasonCode;
2039 tLimMlmDisassocReq *pMlmDisassocReq;
2040 tSirResultCodes retCode = eSIR_SME_SUCCESS;
Jeff Johnsonca523f32019-02-03 18:05:59 -08002041 struct disassoc_req smeDisassocReq;
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002042 struct pe_session *pe_session = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002043 uint8_t sessionId;
2044 uint8_t smesessionId;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002045
Jeff Johnson8e9530b2019-03-18 13:41:42 -07002046 if (!pMsgBuf) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002047 pe_err("Buffer is Pointing to NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002048 return;
2049 }
2050
Jeff Johnsonca523f32019-02-03 18:05:59 -08002051 qdf_mem_copy(&smeDisassocReq, pMsgBuf, sizeof(struct disassoc_req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002052 smesessionId = smeDisassocReq.sessionId;
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002053 if (!lim_is_sme_disassoc_req_valid(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002054 &smeDisassocReq,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002055 pe_session)) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002056 pe_err("received invalid SME_DISASSOC_REQ message");
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002057 if (mac->lim.gLimRspReqd) {
2058 mac->lim.gLimRspReqd = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002059
2060 retCode = eSIR_SME_INVALID_PARAMETERS;
2061 disassocTrigger = eLIM_HOST_DISASSOC;
2062 goto sendDisassoc;
2063 }
2064
2065 return;
2066 }
2067
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002068 pe_session = pe_find_session_by_bssid(mac,
Srinivas Girigowda1a245362016-01-05 22:43:30 -08002069 smeDisassocReq.bssid.bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002070 &sessionId);
Jeff Johnson8e9530b2019-03-18 13:41:42 -07002071 if (!pe_session) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002072 pe_err("session does not exist for given bssId "
Srinivas Girigowdacb7b8b82019-04-10 14:27:47 -07002073 QDF_MAC_ADDR_STR,
Srinivas Girigowda34fbba02019-04-08 12:07:44 -07002074 QDF_MAC_ADDR_ARRAY(smeDisassocReq.bssid.bytes));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002075 retCode = eSIR_SME_INVALID_PARAMETERS;
2076 disassocTrigger = eLIM_HOST_DISASSOC;
2077 goto sendDisassoc;
2078 }
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002079 pe_debug("received DISASSOC_REQ message on sessionid %d Systemrole %d Reason: %u SmeState: %d from: "
Srinivas Girigowdacb7b8b82019-04-10 14:27:47 -07002080 QDF_MAC_ADDR_STR, smesessionId,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002081 GET_LIM_SYSTEM_ROLE(pe_session), smeDisassocReq.reasonCode,
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002082 mac->lim.gLimSmeState,
Srinivas Girigowda34fbba02019-04-08 12:07:44 -07002083 QDF_MAC_ADDR_ARRAY(smeDisassocReq.peer_macaddr.bytes));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002084
2085#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM /* FEATURE_WLAN_DIAG_SUPPORT */
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002086 lim_diag_event_report(mac, WLAN_PE_DIAG_DISASSOC_REQ_EVENT, pe_session,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002087 0, smeDisassocReq.reasonCode);
2088#endif /* FEATURE_WLAN_DIAG_SUPPORT */
2089
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002090 pe_session->smeSessionId = smesessionId;
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002091 pe_debug("ho_fail: %d ", smeDisassocReq.process_ho_fail);
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002092 pe_session->process_ho_fail = smeDisassocReq.process_ho_fail;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002093
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002094 switch (GET_LIM_SYSTEM_ROLE(pe_session)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002095 case eLIM_STA_ROLE:
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002096 switch (pe_session->limSmeState) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002097 case eLIM_SME_ASSOCIATED_STATE:
2098 case eLIM_SME_LINK_EST_STATE:
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002099 pe_debug("Rcvd SME_DISASSOC_REQ in limSmeState: %d ",
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002100 pe_session->limSmeState);
2101 pe_session->limPrevSmeState =
2102 pe_session->limSmeState;
2103 pe_session->limSmeState = eLIM_SME_WT_DISASSOC_STATE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002104 /* Delete all TDLS peers connected before leaving BSS */
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002105 lim_delete_tdls_peers(mac, pe_session);
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002106 MTRACE(mac_trace(mac, TRACE_CODE_SME_STATE,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002107 pe_session->peSessionId,
2108 pe_session->limSmeState));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002109 break;
2110
2111 case eLIM_SME_WT_DEAUTH_STATE:
2112 /* PE shall still process the DISASSOC_REQ and proceed with
2113 * link tear down even if it had already sent a DEAUTH_IND to
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002114 * to SME. mac->lim.gLimPrevSmeState shall remain the same as
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002115 * its been set when PE entered WT_DEAUTH_STATE.
2116 */
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002117 pe_session->limSmeState = eLIM_SME_WT_DISASSOC_STATE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002118 MTRACE(mac_trace
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002119 (mac, TRACE_CODE_SME_STATE,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002120 pe_session->peSessionId,
2121 pe_session->limSmeState));
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002122 pe_debug("Rcvd SME_DISASSOC_REQ while in SME_WT_DEAUTH_STATE");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002123 break;
2124
2125 case eLIM_SME_WT_DISASSOC_STATE:
Jeff Johnson47d75242018-05-12 15:58:53 -07002126 /* PE Received a Disassoc frame. Normally it gets DISASSOC_CNF but it
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002127 * received DISASSOC_REQ. Which means host is also trying to disconnect.
2128 * PE can continue processing DISASSOC_REQ and send the response instead
2129 * of failing the request. SME will anyway ignore DEAUTH_IND that was sent
2130 * for disassoc frame.
2131 *
2132 * It will send a disassoc, which is ok. However, we can use the global flag
2133 * sendDisassoc to not send disassoc frame.
2134 */
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002135 pe_debug("Rcvd SME_DISASSOC_REQ while in SME_WT_DISASSOC_STATE");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002136 break;
2137
2138 case eLIM_SME_JOIN_FAILURE_STATE: {
2139 /* Already in Disconnected State, return success */
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002140 pe_debug("Rcvd SME_DISASSOC_REQ while in eLIM_SME_JOIN_FAILURE_STATE");
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002141 if (mac->lim.gLimRspReqd) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002142 retCode = eSIR_SME_SUCCESS;
2143 disassocTrigger = eLIM_HOST_DISASSOC;
2144 goto sendDisassoc;
2145 }
2146 }
2147 break;
2148 default:
2149 /**
2150 * STA is not currently associated.
2151 * Log error and send response to host
2152 */
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002153 pe_err("received unexpected SME_DISASSOC_REQ in state %X",
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002154 pe_session->limSmeState);
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002155 lim_print_sme_state(mac, LOGE,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002156 pe_session->limSmeState);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002157
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002158 if (mac->lim.gLimRspReqd) {
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002159 if (pe_session->limSmeState !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002160 eLIM_SME_WT_ASSOC_STATE)
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002161 mac->lim.gLimRspReqd = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002162
2163 retCode = eSIR_SME_UNEXPECTED_REQ_RESULT_CODE;
2164 disassocTrigger = eLIM_HOST_DISASSOC;
2165 goto sendDisassoc;
2166 }
2167
2168 return;
2169 }
2170
2171 break;
2172
2173 case eLIM_AP_ROLE:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002174 /* Fall through */
2175 break;
2176
2177 case eLIM_STA_IN_IBSS_ROLE:
2178 default:
2179 /* eLIM_UNKNOWN_ROLE */
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002180 pe_err("received unexpected SME_DISASSOC_REQ for role %d",
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002181 GET_LIM_SYSTEM_ROLE(pe_session));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002182
2183 retCode = eSIR_SME_UNEXPECTED_REQ_RESULT_CODE;
2184 disassocTrigger = eLIM_HOST_DISASSOC;
2185 goto sendDisassoc;
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002186 } /* end switch (mac->lim.gLimSystemRole) */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002187
Edhar, Mahesh Kumare3c8d352015-11-16 12:03:45 +05302188 disassocTrigger = eLIM_HOST_DISASSOC;
2189 reasonCode = smeDisassocReq.reasonCode;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002190
2191 if (smeDisassocReq.doNotSendOverTheAir) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002192 pe_debug("do not send dissoc over the air");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002193 send_disassoc_frame = 0;
2194 }
2195 /* Trigger Disassociation frame to peer MAC entity */
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002196 pe_debug("Sending Disasscoc with disassoc Trigger"
2197 " : %d, reasonCode : %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002198 disassocTrigger, reasonCode);
2199
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302200 pMlmDisassocReq = qdf_mem_malloc(sizeof(tLimMlmDisassocReq));
Arif Hussainf5b6c412018-10-10 19:41:09 -07002201 if (!pMlmDisassocReq)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002202 return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002203
Anurag Chouhanc5548422016-02-24 18:33:27 +05302204 qdf_copy_macaddr(&pMlmDisassocReq->peer_macaddr,
Srinivas Girigowda1a245362016-01-05 22:43:30 -08002205 &smeDisassocReq.peer_macaddr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002206
2207 pMlmDisassocReq->reasonCode = reasonCode;
2208 pMlmDisassocReq->disassocTrigger = disassocTrigger;
2209
2210 /* Update PE session ID */
2211 pMlmDisassocReq->sessionId = sessionId;
2212
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002213 lim_post_mlm_message(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002214 LIM_MLM_DISASSOC_REQ, (uint32_t *) pMlmDisassocReq);
2215 return;
2216
2217sendDisassoc:
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002218 if (pe_session)
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002219 lim_send_sme_disassoc_ntf(mac,
Srinivas Girigowda1a245362016-01-05 22:43:30 -08002220 smeDisassocReq.peer_macaddr.bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002221 retCode,
2222 disassocTrigger,
Jeff Johnsonb82e6d72019-02-20 21:32:32 -08002223 1, smesessionId,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002224 pe_session);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002225 else
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002226 lim_send_sme_disassoc_ntf(mac,
Srinivas Girigowda1a245362016-01-05 22:43:30 -08002227 smeDisassocReq.peer_macaddr.bytes,
2228 retCode, disassocTrigger, 1,
Jeff Johnsonb82e6d72019-02-20 21:32:32 -08002229 smesessionId, NULL);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002230
2231} /*** end __lim_process_sme_disassoc_req() ***/
2232
2233/** -----------------------------------------------------------------
2234 \brief __lim_process_sme_disassoc_cnf() - Process SME_DISASSOC_CNF
2235
2236 This function is called to process SME_DISASSOC_CNF message
2237 from HDD or upper layer application.
2238
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002239 \param mac - global mac structure
Jeff Johnsonbddc03e2019-01-17 15:37:09 -08002240 \param sta - station dph hash node
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002241 \return none
2242 \sa
2243 ----------------------------------------------------------------- */
Jeff Johnson83d6c112018-12-02 13:05:00 -08002244void __lim_process_sme_disassoc_cnf(struct mac_context *mac, uint32_t *pMsgBuf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002245{
Jeff Johnson0837c442019-02-04 11:37:09 -08002246 struct disassoc_cnf smeDisassocCnf;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002247 uint16_t aid;
Jeff Johnsonbddc03e2019-01-17 15:37:09 -08002248 tpDphHashNode sta;
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002249 struct pe_session *pe_session;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002250 uint8_t sessionId;
Vignesh Viswanathan5b909f52018-05-15 20:13:35 +05302251 uint32_t *msg = NULL;
2252 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002253
Jeff Johnson0837c442019-02-04 11:37:09 -08002254 qdf_mem_copy(&smeDisassocCnf, pMsgBuf, sizeof(smeDisassocCnf));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002255
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002256 pe_session = pe_find_session_by_bssid(mac,
Srinivas Girigowda5f3c81a2016-01-04 21:47:19 -08002257 smeDisassocCnf.bssid.bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002258 &sessionId);
Jeff Johnson8e9530b2019-03-18 13:41:42 -07002259 if (!pe_session) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002260 pe_err("session does not exist for given bssId");
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002261 status = lim_prepare_disconnect_done_ind(mac, &msg,
Vignesh Viswanathanb2dcdd02018-05-24 11:48:12 +05302262 smeDisassocCnf.sme_session_id,
Vignesh Viswanathan5b909f52018-05-15 20:13:35 +05302263 eSIR_SME_INVALID_SESSION,
2264 NULL);
2265 if (QDF_IS_STATUS_SUCCESS(status))
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002266 lim_send_sme_disassoc_deauth_ntf(mac,
Vignesh Viswanathan5b909f52018-05-15 20:13:35 +05302267 QDF_STATUS_SUCCESS,
2268 (uint32_t *)msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002269 return;
2270 }
2271
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002272 if (!lim_is_sme_disassoc_cnf_valid(mac, &smeDisassocCnf, pe_session)) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002273 pe_err("received invalid SME_DISASSOC_CNF message");
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002274 status = lim_prepare_disconnect_done_ind(mac, &msg,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002275 pe_session->smeSessionId,
Vignesh Viswanathan5b909f52018-05-15 20:13:35 +05302276 eSIR_SME_INVALID_PARAMETERS,
2277 &smeDisassocCnf.bssid.bytes[0]);
2278 if (QDF_IS_STATUS_SUCCESS(status))
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002279 lim_send_sme_disassoc_deauth_ntf(mac,
Vignesh Viswanathan5b909f52018-05-15 20:13:35 +05302280 QDF_STATUS_SUCCESS,
2281 (uint32_t *)msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002282 return;
2283 }
2284#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM /* FEATURE_WLAN_DIAG_SUPPORT */
2285 if (smeDisassocCnf.messageType == eWNI_SME_DISASSOC_CNF)
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002286 lim_diag_event_report(mac, WLAN_PE_DIAG_DISASSOC_CNF_EVENT,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002287 pe_session,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002288 (uint16_t) smeDisassocCnf.statusCode, 0);
2289 else if (smeDisassocCnf.messageType == eWNI_SME_DEAUTH_CNF)
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002290 lim_diag_event_report(mac, WLAN_PE_DIAG_DEAUTH_CNF_EVENT,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002291 pe_session,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002292 (uint16_t) smeDisassocCnf.statusCode, 0);
2293#endif /* FEATURE_WLAN_DIAG_SUPPORT */
2294
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002295 switch (GET_LIM_SYSTEM_ROLE(pe_session)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002296 case eLIM_STA_ROLE:
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002297 if ((pe_session->limSmeState != eLIM_SME_IDLE_STATE) &&
2298 (pe_session->limSmeState != eLIM_SME_WT_DISASSOC_STATE)
2299 && (pe_session->limSmeState !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002300 eLIM_SME_WT_DEAUTH_STATE)) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002301 pe_err("received unexp SME_DISASSOC_CNF in state %X",
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002302 pe_session->limSmeState);
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002303 lim_print_sme_state(mac, LOGE,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002304 pe_session->limSmeState);
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002305 status = lim_prepare_disconnect_done_ind(mac, &msg,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002306 pe_session->smeSessionId,
Vignesh Viswanathanb2dcdd02018-05-24 11:48:12 +05302307 eSIR_SME_INVALID_STATE,
2308 &smeDisassocCnf.bssid.bytes[0]);
Vignesh Viswanathan5b909f52018-05-15 20:13:35 +05302309 if (QDF_IS_STATUS_SUCCESS(status))
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002310 lim_send_sme_disassoc_deauth_ntf(mac,
Vignesh Viswanathan5b909f52018-05-15 20:13:35 +05302311 QDF_STATUS_SUCCESS,
2312 (uint32_t *)msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002313 return;
2314 }
2315 break;
2316
2317 case eLIM_AP_ROLE:
2318 /* Fall through */
2319 break;
2320
2321 case eLIM_STA_IN_IBSS_ROLE:
2322 default: /* eLIM_UNKNOWN_ROLE */
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002323 pe_err("received unexpected SME_DISASSOC_CNF role %d",
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002324 GET_LIM_SYSTEM_ROLE(pe_session));
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002325 status = lim_prepare_disconnect_done_ind(mac, &msg,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002326 pe_session->smeSessionId,
Vignesh Viswanathan5b909f52018-05-15 20:13:35 +05302327 eSIR_SME_INVALID_STATE,
2328 &smeDisassocCnf.bssid.bytes[0]);
2329 if (QDF_IS_STATUS_SUCCESS(status))
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002330 lim_send_sme_disassoc_deauth_ntf(mac,
Vignesh Viswanathan5b909f52018-05-15 20:13:35 +05302331 QDF_STATUS_SUCCESS,
2332 (uint32_t *)msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002333 return;
2334 }
2335
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002336 if ((pe_session->limSmeState == eLIM_SME_WT_DISASSOC_STATE) ||
2337 (pe_session->limSmeState == eLIM_SME_WT_DEAUTH_STATE) ||
2338 LIM_IS_AP_ROLE(pe_session)) {
Jeff Johnsonbddc03e2019-01-17 15:37:09 -08002339 sta = dph_lookup_hash_entry(mac,
Srinivas Girigowda5f3c81a2016-01-04 21:47:19 -08002340 smeDisassocCnf.peer_macaddr.bytes, &aid,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002341 &pe_session->dph.dphHashTable);
Jeff Johnson8e9530b2019-03-18 13:41:42 -07002342 if (!sta) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002343 pe_err("DISASSOC_CNF for a STA with no context, addr= "
Srinivas Girigowdacb7b8b82019-04-10 14:27:47 -07002344 QDF_MAC_ADDR_STR,
Srinivas Girigowda34fbba02019-04-08 12:07:44 -07002345 QDF_MAC_ADDR_ARRAY(smeDisassocCnf.peer_macaddr.bytes));
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002346 status = lim_prepare_disconnect_done_ind(mac, &msg,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002347 pe_session->smeSessionId,
Himanshu Agarwald519b4a2018-03-27 15:36:09 +05302348 eSIR_SME_INVALID_PARAMETERS,
Vignesh Viswanathan5b909f52018-05-15 20:13:35 +05302349 &smeDisassocCnf.bssid.bytes[0]);
2350 if (QDF_IS_STATUS_SUCCESS(status))
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002351 lim_send_sme_disassoc_deauth_ntf(mac,
Vignesh Viswanathan5b909f52018-05-15 20:13:35 +05302352 QDF_STATUS_SUCCESS,
2353 (uint32_t *)msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002354 return;
2355 }
Masti, Narayanraddi21bde252015-10-09 19:39:47 +05302356
Jeff Johnsonbddc03e2019-01-17 15:37:09 -08002357 if ((sta->mlmStaContext.mlmState ==
Masti, Narayanraddi21bde252015-10-09 19:39:47 +05302358 eLIM_MLM_WT_DEL_STA_RSP_STATE) ||
Jeff Johnsonbddc03e2019-01-17 15:37:09 -08002359 (sta->mlmStaContext.mlmState ==
Arif Hussain5fa13782018-05-10 11:29:52 -07002360 eLIM_MLM_WT_DEL_BSS_RSP_STATE)) {
Srinivas Girigowdacb7b8b82019-04-10 14:27:47 -07002361 pe_err("No need of cleanup for addr:" QDF_MAC_ADDR_STR "as MLM state is %d",
Srinivas Girigowda34fbba02019-04-08 12:07:44 -07002362 QDF_MAC_ADDR_ARRAY(smeDisassocCnf.peer_macaddr.bytes),
Jeff Johnsonbddc03e2019-01-17 15:37:09 -08002363 sta->mlmStaContext.mlmState);
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002364 status = lim_prepare_disconnect_done_ind(mac, &msg,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002365 pe_session->smeSessionId,
Vignesh Viswanathanb2dcdd02018-05-24 11:48:12 +05302366 eSIR_SME_SUCCESS,
2367 NULL);
Vignesh Viswanathan5b909f52018-05-15 20:13:35 +05302368 if (QDF_IS_STATUS_SUCCESS(status))
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002369 lim_send_sme_disassoc_deauth_ntf(mac,
Vignesh Viswanathan5b909f52018-05-15 20:13:35 +05302370 QDF_STATUS_SUCCESS,
2371 (uint32_t *)msg);
Masti, Narayanraddi21bde252015-10-09 19:39:47 +05302372 return;
2373 }
2374
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002375 /* Delete FT session if there exists one */
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002376 lim_ft_cleanup_pre_auth_info(mac, pe_session);
Jeff Johnsonbddc03e2019-01-17 15:37:09 -08002377 lim_cleanup_rx_path(mac, sta, pe_session);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002378
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002379 lim_clean_up_disassoc_deauth_req(mac,
Srinivas Girigowda5f3c81a2016-01-04 21:47:19 -08002380 (char *)&smeDisassocCnf.peer_macaddr, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002381 }
2382
2383 return;
2384}
2385
2386/**
2387 * __lim_process_sme_deauth_req() - process sme deauth req
2388 * @mac_ctx: Pointer to Global MAC structure
2389 * @msg_buf: pointer to the SME message buffer
2390 *
2391 * This function is called to process SME_DEAUTH_REQ message
2392 * from HDD or upper layer application.
2393 *
2394 * Return: None
2395 */
2396
Jeff Johnson83d6c112018-12-02 13:05:00 -08002397static void __lim_process_sme_deauth_req(struct mac_context *mac_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002398 uint32_t *msg_buf)
2399{
2400 uint16_t deauth_trigger, reason_code;
2401 tLimMlmDeauthReq *mlm_deauth_req;
Jeff Johnson34c74b02019-02-04 12:34:51 -08002402 struct deauth_req sme_deauth_req;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002403 tSirResultCodes ret_code = eSIR_SME_SUCCESS;
Jeff Johnson209dfa02018-11-18 22:54:38 -08002404 struct pe_session *session_entry;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002405 uint8_t session_id; /* PE sessionId */
2406 uint8_t sme_session_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002407
Jeff Johnson34c74b02019-02-04 12:34:51 -08002408 qdf_mem_copy(&sme_deauth_req, msg_buf, sizeof(sme_deauth_req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002409 sme_session_id = sme_deauth_req.sessionId;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002410
2411 /*
2412 * We need to get a session first but we don't even know
2413 * if the message is correct.
2414 */
Srinivas Girigowda9efa10e2016-01-04 18:49:40 -08002415 session_entry = pe_find_session_by_bssid(mac_ctx,
2416 sme_deauth_req.bssid.bytes,
2417 &session_id);
Jeff Johnson8e9530b2019-03-18 13:41:42 -07002418 if (!session_entry) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002419 pe_err("session does not exist for given bssId");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002420 ret_code = eSIR_SME_INVALID_PARAMETERS;
2421 deauth_trigger = eLIM_HOST_DEAUTH;
2422 goto send_deauth;
2423 }
2424
2425 if (!lim_is_sme_deauth_req_valid(mac_ctx, &sme_deauth_req,
2426 session_entry)) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002427 pe_err("received invalid SME_DEAUTH_REQ message");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002428 mac_ctx->lim.gLimRspReqd = false;
2429
2430 ret_code = eSIR_SME_INVALID_PARAMETERS;
2431 deauth_trigger = eLIM_HOST_DEAUTH;
2432 goto send_deauth;
2433 }
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002434 pe_debug("received DEAUTH_REQ sessionid %d Systemrole %d reasoncode %u limSmestate %d from "
Srinivas Girigowdacb7b8b82019-04-10 14:27:47 -07002435 QDF_MAC_ADDR_STR, sme_session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002436 GET_LIM_SYSTEM_ROLE(session_entry), sme_deauth_req.reasonCode,
2437 session_entry->limSmeState,
Srinivas Girigowda34fbba02019-04-08 12:07:44 -07002438 QDF_MAC_ADDR_ARRAY(sme_deauth_req.peer_macaddr.bytes));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002439#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM /* FEATURE_WLAN_DIAG_SUPPORT */
2440 lim_diag_event_report(mac_ctx, WLAN_PE_DIAG_DEAUTH_REQ_EVENT,
2441 session_entry, 0, sme_deauth_req.reasonCode);
2442#endif /* FEATURE_WLAN_DIAG_SUPPORT */
2443
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002444 session_entry->smeSessionId = sme_session_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002445
2446 switch (GET_LIM_SYSTEM_ROLE(session_entry)) {
2447 case eLIM_STA_ROLE:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002448 switch (session_entry->limSmeState) {
2449 case eLIM_SME_ASSOCIATED_STATE:
2450 case eLIM_SME_LINK_EST_STATE:
Ganesh Kondabattini9d3d3b12017-03-15 16:20:19 +05302451 /* Delete all TDLS peers connected before leaving BSS */
2452 lim_delete_tdls_peers(mac_ctx, session_entry);
Abhinav Kumarac12c762018-05-02 13:51:02 +05302453 /* fallthrough */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002454 case eLIM_SME_WT_ASSOC_STATE:
2455 case eLIM_SME_JOIN_FAILURE_STATE:
2456 case eLIM_SME_IDLE_STATE:
2457 session_entry->limPrevSmeState =
2458 session_entry->limSmeState;
2459 session_entry->limSmeState = eLIM_SME_WT_DEAUTH_STATE;
2460 MTRACE(mac_trace(mac_ctx, TRACE_CODE_SME_STATE,
2461 session_entry->peSessionId,
2462 session_entry->limSmeState));
2463 /* Send Deauthentication request to MLM below */
2464 break;
2465 case eLIM_SME_WT_DEAUTH_STATE:
2466 case eLIM_SME_WT_DISASSOC_STATE:
2467 /*
Jeff Johnson47d75242018-05-12 15:58:53 -07002468 * PE Received a Deauth/Disassoc frame. Normally it get
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002469 * DEAUTH_CNF/DISASSOC_CNF but it received DEAUTH_REQ.
2470 * Which means host is also trying to disconnect.
2471 * PE can continue processing DEAUTH_REQ and send
2472 * the response instead of failing the request.
2473 * SME will anyway ignore DEAUTH_IND/DISASSOC_IND that
2474 * was sent for deauth/disassoc frame.
2475 */
2476 session_entry->limSmeState = eLIM_SME_WT_DEAUTH_STATE;
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002477 pe_debug("Rcvd SME_DEAUTH_REQ while in SME_WT_DEAUTH_STATE");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002478 break;
2479 default:
2480 /*
2481 * STA is not in a state to deauthenticate with
2482 * peer. Log error and send response to host.
2483 */
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002484 pe_err("received unexp SME_DEAUTH_REQ in state %X",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002485 session_entry->limSmeState);
2486 lim_print_sme_state(mac_ctx, LOGE,
2487 session_entry->limSmeState);
2488
2489 if (mac_ctx->lim.gLimRspReqd) {
2490 mac_ctx->lim.gLimRspReqd = false;
2491
2492 ret_code = eSIR_SME_STA_NOT_AUTHENTICATED;
2493 deauth_trigger = eLIM_HOST_DEAUTH;
2494
wadesong42968e92017-06-08 14:11:21 +08002495 /*
2496 * here we received deauth request from AP so
2497 * sme state is eLIM_SME_WT_DEAUTH_STATE.if we
2498 * have ISSUED delSta then mlm state should be
2499 * eLIM_MLM_WT_DEL_STA_RSP_STATE and ifwe got
2500 * delBSS rsp then mlm state should be
2501 * eLIM_MLM_IDLE_STATE so the below condition
2502 * captures the state where delSta not done
2503 * and firmware still in connected state.
2504 */
2505 if (session_entry->limSmeState ==
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002506 eLIM_SME_WT_DEAUTH_STATE &&
2507 session_entry->limMlmState !=
2508 eLIM_MLM_IDLE_STATE &&
2509 session_entry->limMlmState !=
2510 eLIM_MLM_WT_DEL_STA_RSP_STATE)
wadesong42968e92017-06-08 14:11:21 +08002511 ret_code = eSIR_SME_DEAUTH_STATUS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002512 goto send_deauth;
2513 }
2514 return;
2515 }
2516 break;
2517
2518 case eLIM_STA_IN_IBSS_ROLE:
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002519 pe_err("Deauth not allowed in IBSS");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002520 if (mac_ctx->lim.gLimRspReqd) {
2521 mac_ctx->lim.gLimRspReqd = false;
2522 ret_code = eSIR_SME_INVALID_PARAMETERS;
2523 deauth_trigger = eLIM_HOST_DEAUTH;
2524 goto send_deauth;
2525 }
2526 return;
2527 case eLIM_AP_ROLE:
2528 break;
2529 default:
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002530 pe_err("received unexpected SME_DEAUTH_REQ for role %X",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002531 GET_LIM_SYSTEM_ROLE(session_entry));
2532 if (mac_ctx->lim.gLimRspReqd) {
2533 mac_ctx->lim.gLimRspReqd = false;
2534 ret_code = eSIR_SME_INVALID_PARAMETERS;
2535 deauth_trigger = eLIM_HOST_DEAUTH;
2536 goto send_deauth;
2537 }
2538 return;
2539 } /* end switch (mac_ctx->lim.gLimSystemRole) */
2540
Yu Ouyang57c25532018-09-07 17:14:01 +08002541 if (sme_deauth_req.reasonCode == eLIM_LINK_MONITORING_DEAUTH &&
2542 session_entry->limSystemRole == eLIM_STA_ROLE) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002543 /* Deauthentication is triggered by Link Monitoring */
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002544 pe_debug("** Lost link with AP **");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002545 deauth_trigger = eLIM_LINK_MONITORING_DEAUTH;
2546 reason_code = eSIR_MAC_UNSPEC_FAILURE_REASON;
2547 } else {
2548 deauth_trigger = eLIM_HOST_DEAUTH;
2549 reason_code = sme_deauth_req.reasonCode;
2550 }
2551
2552 /* Trigger Deauthentication frame to peer MAC entity */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302553 mlm_deauth_req = qdf_mem_malloc(sizeof(tLimMlmDeauthReq));
Arif Hussainf5b6c412018-10-10 19:41:09 -07002554 if (!mlm_deauth_req) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002555 if (mac_ctx->lim.gLimRspReqd) {
2556 mac_ctx->lim.gLimRspReqd = false;
2557 ret_code = eSIR_SME_RESOURCES_UNAVAILABLE;
2558 deauth_trigger = eLIM_HOST_DEAUTH;
2559 goto send_deauth;
2560 }
2561 return;
2562 }
2563
Anurag Chouhanc5548422016-02-24 18:33:27 +05302564 qdf_copy_macaddr(&mlm_deauth_req->peer_macaddr,
Srinivas Girigowda9efa10e2016-01-04 18:49:40 -08002565 &sme_deauth_req.peer_macaddr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002566
2567 mlm_deauth_req->reasonCode = reason_code;
2568 mlm_deauth_req->deauthTrigger = deauth_trigger;
2569
2570 /* Update PE session Id */
2571 mlm_deauth_req->sessionId = session_id;
Sandeep Puligilla30bb8402018-09-23 22:01:08 -07002572 lim_process_mlm_deauth_req(mac_ctx, (uint32_t *)mlm_deauth_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002573
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002574 return;
2575
2576send_deauth:
Srinivas Girigowda9efa10e2016-01-04 18:49:40 -08002577 lim_send_sme_deauth_ntf(mac_ctx, sme_deauth_req.peer_macaddr.bytes,
2578 ret_code, deauth_trigger, 1,
Jeff Johnson953f99a2019-02-20 22:08:31 -08002579 sme_session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002580}
2581
2582/**
2583 * __lim_process_sme_set_context_req()
2584 *
2585 * @mac_ctx: Pointer to Global MAC structure
2586 * @msg_buf: pointer to the SME message buffer
2587 *
2588 * This function is called to process SME_SETCONTEXT_REQ message
2589 * from HDD or upper layer application.
2590 *
2591 * Return: None
2592 */
2593
2594static void
Jeff Johnsonb9a9a7d2019-02-05 11:47:05 -08002595__lim_process_sme_set_context_req(struct mac_context *mac_ctx,
2596 uint32_t *msg_buf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002597{
Jeff Johnsonb9a9a7d2019-02-05 11:47:05 -08002598 struct set_context_req *set_context_req;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002599 tLimMlmSetKeysReq *mlm_set_key_req;
Jeff Johnson209dfa02018-11-18 22:54:38 -08002600 struct pe_session *session_entry;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002601 uint8_t session_id; /* PE sessionID */
2602 uint8_t sme_session_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002603
Jeff Johnson8e9530b2019-03-18 13:41:42 -07002604 if (!msg_buf) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002605 pe_err("Buffer is Pointing to NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002606 return;
2607 }
2608
Jeff Johnsonb9a9a7d2019-02-05 11:47:05 -08002609 set_context_req = qdf_mem_malloc(sizeof(*set_context_req));
Arif Hussainf5b6c412018-10-10 19:41:09 -07002610 if (!set_context_req)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002611 return;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302612 qdf_mem_copy(set_context_req, msg_buf,
Jeff Johnsonb9a9a7d2019-02-05 11:47:05 -08002613 sizeof(*set_context_req));
Ashish Kumar Dhanotiya02137932019-02-26 21:43:32 +05302614
2615 qdf_mem_zero(msg_buf, sizeof(*set_context_req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002616 sme_session_id = set_context_req->sessionId;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002617
2618 if ((!lim_is_sme_set_context_req_valid(mac_ctx, set_context_req))) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002619 pe_warn("received invalid SME_SETCONTEXT_REQ message");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002620 goto end;
2621 }
2622
2623 if (set_context_req->keyMaterial.numKeys >
2624 SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002625 pe_err("numKeys:%d is more than SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002626 set_context_req->keyMaterial.numKeys);
2627 lim_send_sme_set_context_rsp(mac_ctx,
Srinivas Girigowdad5965c42015-12-04 13:43:16 -08002628 set_context_req->peer_macaddr, 1,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002629 eSIR_SME_INVALID_PARAMETERS, NULL,
Jeff Johnsonc80ed542019-02-21 06:24:57 -08002630 sme_session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002631 goto end;
2632 }
2633
2634 session_entry = pe_find_session_by_bssid(mac_ctx,
Srinivas Girigowdad5965c42015-12-04 13:43:16 -08002635 set_context_req->bssid.bytes, &session_id);
Jeff Johnson8e9530b2019-03-18 13:41:42 -07002636 if (!session_entry) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002637 pe_err("Session does not exist for given BSSID");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002638 lim_send_sme_set_context_rsp(mac_ctx,
Srinivas Girigowdad5965c42015-12-04 13:43:16 -08002639 set_context_req->peer_macaddr, 1,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002640 eSIR_SME_INVALID_PARAMETERS, NULL,
Jeff Johnsonc80ed542019-02-21 06:24:57 -08002641 sme_session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002642 goto end;
2643 }
2644#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM /* FEATURE_WLAN_DIAG_SUPPORT */
2645 lim_diag_event_report(mac_ctx, WLAN_PE_DIAG_SETCONTEXT_REQ_EVENT,
2646 session_entry, 0, 0);
2647#endif /* FEATURE_WLAN_DIAG_SUPPORT */
2648
Rajeev Kumarc9a50e72016-04-15 15:18:42 -07002649 if ((LIM_IS_STA_ROLE(session_entry) &&
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002650 (session_entry->limSmeState == eLIM_SME_LINK_EST_STATE)) ||
2651 ((LIM_IS_IBSS_ROLE(session_entry) ||
Rajeev Kumarc9a50e72016-04-15 15:18:42 -07002652 LIM_IS_AP_ROLE(session_entry)) &&
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002653 (session_entry->limSmeState == eLIM_SME_NORMAL_STATE))) {
2654 /* Trigger MLM_SETKEYS_REQ */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302655 mlm_set_key_req = qdf_mem_malloc(sizeof(tLimMlmSetKeysReq));
Arif Hussainf5b6c412018-10-10 19:41:09 -07002656 if (!mlm_set_key_req)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002657 goto end;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002658 mlm_set_key_req->edType = set_context_req->keyMaterial.edType;
2659 mlm_set_key_req->numKeys =
2660 set_context_req->keyMaterial.numKeys;
2661 if (mlm_set_key_req->numKeys >
2662 SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002663 pe_err("no.of keys exceeded max num of default keys limit");
Jingxiang Ge4168a232018-01-03 18:47:15 +08002664 qdf_mem_free(mlm_set_key_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002665 goto end;
2666 }
Anurag Chouhanc5548422016-02-24 18:33:27 +05302667 qdf_copy_macaddr(&mlm_set_key_req->peer_macaddr,
Srinivas Girigowdad5965c42015-12-04 13:43:16 -08002668 &set_context_req->peer_macaddr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002669
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302670 qdf_mem_copy((uint8_t *) &mlm_set_key_req->key,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002671 (uint8_t *) &set_context_req->keyMaterial.key,
2672 sizeof(tSirKeys) *
2673 (mlm_set_key_req->numKeys ? mlm_set_key_req->
2674 numKeys : 1));
2675
2676 mlm_set_key_req->sessionId = session_id;
2677 mlm_set_key_req->smesessionId = sme_session_id;
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002678 pe_debug("received SETCONTEXT_REQ message sessionId=%d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002679 mlm_set_key_req->sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002680
2681 if (((set_context_req->keyMaterial.edType == eSIR_ED_WEP40) ||
2682 (set_context_req->keyMaterial.edType == eSIR_ED_WEP104)) &&
2683 LIM_IS_AP_ROLE(session_entry)) {
2684 if (set_context_req->keyMaterial.key[0].keyLength) {
2685 uint8_t key_id;
Srinivas Girigowda4d65ebe2017-10-13 21:41:42 -07002686
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002687 key_id =
2688 set_context_req->keyMaterial.key[0].keyId;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302689 qdf_mem_copy((uint8_t *)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002690 &session_entry->WEPKeyMaterial[key_id],
2691 (uint8_t *) &set_context_req->keyMaterial,
2692 sizeof(tSirKeyMaterial));
2693 } else {
2694 uint32_t i;
Srinivas Girigowda4d65ebe2017-10-13 21:41:42 -07002695
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002696 for (i = 0; i < SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS;
2697 i++) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302698 qdf_mem_copy((uint8_t *)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002699 &mlm_set_key_req->key[i],
2700 (uint8_t *)session_entry->WEPKeyMaterial[i].key,
2701 sizeof(tSirKeys));
2702 }
2703 }
2704 }
2705 lim_post_mlm_message(mac_ctx, LIM_MLM_SETKEYS_REQ,
2706 (uint32_t *) mlm_set_key_req);
2707 } else {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002708 pe_err("rcvd unexpected SME_SETCONTEXT_REQ for role %d, state=%X",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002709 GET_LIM_SYSTEM_ROLE(session_entry),
2710 session_entry->limSmeState);
2711 lim_print_sme_state(mac_ctx, LOGE, session_entry->limSmeState);
2712
2713 lim_send_sme_set_context_rsp(mac_ctx,
Srinivas Girigowdad5965c42015-12-04 13:43:16 -08002714 set_context_req->peer_macaddr, 1,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002715 eSIR_SME_UNEXPECTED_REQ_RESULT_CODE,
Jeff Johnsonc80ed542019-02-21 06:24:57 -08002716 session_entry, sme_session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002717 }
2718end:
Ashish Kumar Dhanotiya02137932019-02-26 21:43:32 +05302719 qdf_mem_zero(set_context_req, sizeof(*set_context_req));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302720 qdf_mem_free(set_context_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002721 return;
2722}
2723
2724/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002725 * __lim_counter_measures()
2726 *
2727 * FUNCTION:
2728 * This function is called to "implement" MIC counter measure
2729 * and is *temporary* only
2730 *
2731 * LOGIC: on AP, disassoc all STA associated thru TKIP,
2732 * we don't do the proper STA disassoc sequence since the
Jeff Johnsond460e842018-05-11 13:25:53 -07002733 * BSS will be stopped anyway
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002734 *
2735 ***ASSUMPTIONS:
2736 *
2737 ***NOTE:
2738 *
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002739 * @param mac Pointer to Global MAC structure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002740 * @return None
2741 */
2742
Jeff Johnson83d6c112018-12-02 13:05:00 -08002743static void __lim_counter_measures(struct mac_context *mac, struct pe_session *pe_session)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002744{
Jeff Johnson2b511902018-11-20 09:40:23 -08002745 tSirMacAddr mac_addr = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
Srinivas Girigowda4d65ebe2017-10-13 21:41:42 -07002746
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002747 if (LIM_IS_AP_ROLE(pe_session))
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002748 lim_send_disassoc_mgmt_frame(mac, eSIR_MAC_MIC_FAILURE_REASON,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002749 mac_addr, pe_session, false);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002750};
2751
Jeff Johnson83d6c112018-12-02 13:05:00 -08002752void lim_send_stop_bss_failure_resp(struct mac_context *mac_ctx,
Jeff Johnson209dfa02018-11-18 22:54:38 -08002753 struct pe_session *session)
Abhishek Singh2904a6a2018-08-30 17:45:59 +05302754{
2755 session->limSmeState = session->limPrevSmeState;
2756
2757 MTRACE(mac_trace(mac_ctx, TRACE_CODE_SME_STATE, session->peSessionId,
2758 session->limSmeState));
2759
2760 lim_send_sme_rsp(mac_ctx, eWNI_SME_STOP_BSS_RSP,
Jeff Johnson41485c22019-02-21 11:00:30 -08002761 eSIR_SME_STOP_BSS_FAILURE, session->smeSessionId);
Abhishek Singh2904a6a2018-08-30 17:45:59 +05302762}
2763
Jeff Johnson209dfa02018-11-18 22:54:38 -08002764void lim_delete_all_peers(struct pe_session *session)
Abhishek Singh2904a6a2018-08-30 17:45:59 +05302765{
2766 uint8_t i = 0;
Jeff Johnson83d6c112018-12-02 13:05:00 -08002767 struct mac_context *mac_ctx = session->mac_ctx;
Abhishek Singh2904a6a2018-08-30 17:45:59 +05302768 tpDphHashNode sta_ds = NULL;
2769 QDF_STATUS status;
Abhishek Singh06522c52019-05-08 12:13:42 +05302770 tSirMacAddr bc_addr = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
2771
2772 /* IBSS and NDI doesn't send Disassoc frame */
2773 if (!LIM_IS_IBSS_ROLE(session) &&
2774 !LIM_IS_NDI_ROLE(session)) {
2775 pe_debug("stop_bss_reason: %d", session->stop_bss_reason);
2776 if (session->stop_bss_reason == eSIR_SME_MIC_COUNTER_MEASURES)
2777 __lim_counter_measures(mac_ctx, session);
2778 else
2779 lim_send_disassoc_mgmt_frame(mac_ctx,
2780 eSIR_MAC_DEAUTH_LEAVING_BSS_REASON,
2781 bc_addr, session, false);
2782 }
Abhishek Singh2904a6a2018-08-30 17:45:59 +05302783
2784 for (i = 1; i < session->dph.dphHashTable.size; i++) {
2785 sta_ds = dph_get_hash_entry(mac_ctx, i,
2786 &session->dph.dphHashTable);
2787 if (!sta_ds)
2788 continue;
2789 status = lim_del_sta(mac_ctx, sta_ds, false, session);
2790 if (QDF_STATUS_SUCCESS == status) {
2791 lim_delete_dph_hash_entry(mac_ctx, sta_ds->staAddr,
2792 sta_ds->assocId, session);
2793 lim_release_peer_idx(mac_ctx, sta_ds->assocId, session);
2794 } else {
2795 pe_err("lim_del_sta failed with Status: %d", status);
2796 QDF_ASSERT(0);
2797 }
2798 }
Jianmin Zhua9005b32018-12-06 21:30:45 +08002799 lim_disconnect_complete(session, false);
Abhishek Singh2904a6a2018-08-30 17:45:59 +05302800}
2801
Jeff Johnson209dfa02018-11-18 22:54:38 -08002802QDF_STATUS lim_sta_send_del_bss(struct pe_session *session)
Sandeep Puligilla30bb8402018-09-23 22:01:08 -07002803{
Jeff Johnson83d6c112018-12-02 13:05:00 -08002804 struct mac_context *mac_ctx = session->mac_ctx;
Sandeep Puligilla30bb8402018-09-23 22:01:08 -07002805 QDF_STATUS status = QDF_STATUS_E_FAILURE;
2806 tpDphHashNode sta_ds = NULL;
2807
2808 sta_ds = dph_get_hash_entry(mac_ctx, DPH_STA_HASH_INDEX_PEER,
2809 &session->dph.dphHashTable);
2810 if (!sta_ds) {
2811 pe_err("DPH Entry for STA is missing, failed to send delbss");
2812 goto end;
2813 }
2814
2815 status = lim_del_bss(mac_ctx, sta_ds, 0, session);
2816 if (QDF_IS_STATUS_ERROR(status))
Pragaspathi Thilagaraje05162d2019-05-23 13:10:46 +05302817 pe_err("delBss failed for bss %d", session->bss_idx);
Sandeep Puligilla30bb8402018-09-23 22:01:08 -07002818
2819end:
2820 return status;
2821}
2822
Jeff Johnson209dfa02018-11-18 22:54:38 -08002823QDF_STATUS lim_send_vdev_stop(struct pe_session *session)
Abhishek Singh2904a6a2018-08-30 17:45:59 +05302824{
Jeff Johnson83d6c112018-12-02 13:05:00 -08002825 struct mac_context *mac_ctx = session->mac_ctx;
Abhishek Singh2904a6a2018-08-30 17:45:59 +05302826 QDF_STATUS status;
2827
Pragaspathi Thilagaraje05162d2019-05-23 13:10:46 +05302828 status = lim_del_bss(mac_ctx, NULL, session->bss_idx, session);
Abhishek Singh2904a6a2018-08-30 17:45:59 +05302829
2830 if (QDF_IS_STATUS_ERROR(status)) {
Pragaspathi Thilagaraje05162d2019-05-23 13:10:46 +05302831 pe_err("delBss failed for bss %d", session->bss_idx);
Abhishek Singh2904a6a2018-08-30 17:45:59 +05302832 lim_send_stop_bss_failure_resp(mac_ctx, session);
2833 }
Abhishek Singhcaa61852018-09-12 15:50:04 +05302834
2835 return status;
Abhishek Singh2904a6a2018-08-30 17:45:59 +05302836}
2837
2838/**
2839 * lim_delete_peers_and_send_vdev_stop() -delete peers and send vdev stop
2840 * @session: session pointer
2841 *
2842 * Return None
2843 */
Jeff Johnson209dfa02018-11-18 22:54:38 -08002844static void lim_delete_peers_and_send_vdev_stop(struct pe_session *session)
Abhishek Singhcaa61852018-09-12 15:50:04 +05302845{
Jeff Johnson83d6c112018-12-02 13:05:00 -08002846 struct mac_context *mac_ctx = session->mac_ctx;
Abhishek Singhcaa61852018-09-12 15:50:04 +05302847 QDF_STATUS status;
2848
Abhishek Singhd5cf22d2019-01-08 19:51:09 +05302849 if (QDF_IS_STATUS_SUCCESS(
2850 wlan_vdev_is_restart_progress(session->vdev)))
Abhishek Singhc5a54082018-09-12 16:08:03 +05302851 status =
2852 wlan_vdev_mlme_sm_deliver_evt(session->vdev,
2853 WLAN_VDEV_SM_EV_RESTART_REQ_FAIL,
Abhishek Singhcaa61852018-09-12 15:50:04 +05302854 sizeof(*session), session);
Abhishek Singhc5a54082018-09-12 16:08:03 +05302855 else
2856 status = wlan_vdev_mlme_sm_deliver_evt(session->vdev,
2857 WLAN_VDEV_SM_EV_DOWN,
2858 sizeof(*session),
2859 session);
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05302860 if (QDF_IS_STATUS_ERROR(status))
Abhishek Singhcaa61852018-09-12 15:50:04 +05302861 lim_send_stop_bss_failure_resp(mac_ctx, session);
Abhishek Singhcaa61852018-09-12 15:50:04 +05302862}
Abhishek Singhcaa61852018-09-12 15:50:04 +05302863
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002864static void
Jeff Johnson83d6c112018-12-02 13:05:00 -08002865__lim_handle_sme_stop_bss_request(struct mac_context *mac, uint32_t *pMsgBuf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002866{
Jeff Johnson206721c2019-02-04 17:25:02 -08002867 struct stop_bss_req stop_bss_req;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002868 tLimSmeStates prevState;
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002869 struct pe_session *pe_session;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002870 uint8_t smesessionId;
2871 uint8_t sessionId;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002872
Jeff Johnson206721c2019-02-04 17:25:02 -08002873 qdf_mem_copy(&stop_bss_req, pMsgBuf, sizeof(stop_bss_req));
2874 smesessionId = stop_bss_req.sessionId;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002875
2876 if (!lim_is_sme_stop_bss_req_valid(pMsgBuf)) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002877 pe_warn("received invalid SME_STOP_BSS_REQ message");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002878 /* Send Stop BSS response to host */
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002879 lim_send_sme_rsp(mac, eWNI_SME_STOP_BSS_RSP,
Jeff Johnson41485c22019-02-21 11:00:30 -08002880 eSIR_SME_INVALID_PARAMETERS, smesessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002881 return;
2882 }
2883
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002884 pe_session = pe_find_session_by_bssid(mac,
Jeff Johnson206721c2019-02-04 17:25:02 -08002885 stop_bss_req.bssid.bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002886 &sessionId);
Jeff Johnson8e9530b2019-03-18 13:41:42 -07002887 if (!pe_session) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002888 pe_err("session does not exist for given BSSID");
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002889 lim_send_sme_rsp(mac, eWNI_SME_STOP_BSS_RSP,
Jeff Johnson41485c22019-02-21 11:00:30 -08002890 eSIR_SME_INVALID_PARAMETERS, smesessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002891 return;
2892 }
2893#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM /* FEATURE_WLAN_DIAG_SUPPORT */
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002894 lim_diag_event_report(mac, WLAN_PE_DIAG_STOP_BSS_REQ_EVENT, pe_session,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002895 0, 0);
2896#endif /* FEATURE_WLAN_DIAG_SUPPORT */
2897
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002898 if (pe_session->limSmeState != eLIM_SME_NORMAL_STATE || /* Added For BT -AMP Support */
2899 LIM_IS_STA_ROLE(pe_session)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002900 /**
2901 * Should not have received STOP_BSS_REQ in states
2902 * other than 'normal' state or on STA in Infrastructure
2903 * mode. Log error and return response to host.
2904 */
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002905 pe_err("received unexpected SME_STOP_BSS_REQ in state %X, for role %d",
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002906 pe_session->limSmeState,
2907 GET_LIM_SYSTEM_ROLE(pe_session));
2908 lim_print_sme_state(mac, LOGE, pe_session->limSmeState);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002909 /* / Send Stop BSS response to host */
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002910 lim_send_sme_rsp(mac, eWNI_SME_STOP_BSS_RSP,
Jeff Johnson41485c22019-02-21 11:00:30 -08002911 eSIR_SME_UNEXPECTED_REQ_RESULT_CODE,
2912 smesessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002913 return;
2914 }
2915
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002916 if (LIM_IS_AP_ROLE(pe_session))
2917 lim_wpspbc_close(mac, pe_session);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002918
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07002919 pe_debug("RECEIVED STOP_BSS_REQ with reason code=%d",
Jeff Johnson206721c2019-02-04 17:25:02 -08002920 stop_bss_req.reasonCode);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002921
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002922 prevState = pe_session->limSmeState;
2923 pe_session->limPrevSmeState = prevState;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002924
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002925 pe_session->limSmeState = eLIM_SME_IDLE_STATE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002926 MTRACE(mac_trace
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002927 (mac, TRACE_CODE_SME_STATE, pe_session->peSessionId,
2928 pe_session->limSmeState));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002929
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002930 pe_session->smeSessionId = smesessionId;
Abhishek Singh06522c52019-05-08 12:13:42 +05302931 pe_session->stop_bss_reason = stop_bss_req.reasonCode;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002932
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002933 if (!LIM_IS_NDI_ROLE(pe_session)) {
Deepak Dhamdhere13983f22016-05-31 19:06:09 -07002934 /* Free the buffer allocated in START_BSS_REQ */
Jeff Johnson21aac3a2019-02-02 14:26:13 -08002935 qdf_mem_free(pe_session->add_ie_params.probeRespData_buff);
2936 pe_session->add_ie_params.probeRespDataLen = 0;
2937 pe_session->add_ie_params.probeRespData_buff = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002938
Jeff Johnson21aac3a2019-02-02 14:26:13 -08002939 qdf_mem_free(pe_session->add_ie_params.assocRespData_buff);
2940 pe_session->add_ie_params.assocRespDataLen = 0;
2941 pe_session->add_ie_params.assocRespData_buff = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002942
Jeff Johnson21aac3a2019-02-02 14:26:13 -08002943 qdf_mem_free(pe_session->add_ie_params.probeRespBCNData_buff);
2944 pe_session->add_ie_params.probeRespBCNDataLen = 0;
2945 pe_session->add_ie_params.probeRespBCNData_buff = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002946
Deepak Dhamdhere13983f22016-05-31 19:06:09 -07002947 /*
2948 * lim_del_bss is also called as part of coalescing,
2949 * when we send DEL BSS followed by Add Bss msg.
2950 */
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002951 mac->lim.gLimIbssCoalescingHappened = false;
Deepak Dhamdhere13983f22016-05-31 19:06:09 -07002952 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002953
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002954 lim_delete_peers_and_send_vdev_stop(pe_session);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002955
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002956}
2957
2958/**
2959 * __lim_process_sme_stop_bss_req() - Process STOP_BSS from SME
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002960 * @mac: Global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002961 * @pMsg: Message from SME
2962 *
2963 * Wrapper for the function __lim_handle_sme_stop_bss_request
2964 * This message will be defered until softmac come out of
2965 * scan mode. Message should be handled even if we have
2966 * detected radar in the current operating channel.
2967 *
2968 * Return: true - If we consumed the buffer
2969 * false - If have defered the message.
2970 */
2971
Jeff Johnson83d6c112018-12-02 13:05:00 -08002972static bool __lim_process_sme_stop_bss_req(struct mac_context *mac,
Rajeev Kumarfeb96382017-01-22 19:42:09 -08002973 struct scheduler_msg *pMsg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002974{
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002975 __lim_handle_sme_stop_bss_request(mac, (uint32_t *) pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002976 return true;
2977} /*** end __lim_process_sme_stop_bss_req() ***/
2978
Jeff Johnson83d6c112018-12-02 13:05:00 -08002979void lim_process_sme_del_bss_rsp(struct mac_context *mac,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002980 uint32_t body, struct pe_session *pe_session)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002981{
2982
2983 (void)body;
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002984 SET_LIM_PROCESS_DEFD_MESGS(mac, true);
Jeff Johnsonb5c13332018-12-03 09:54:51 -08002985 lim_ibss_delete(mac, pe_session);
Jeff Johnsonace219d2018-12-01 15:56:26 -08002986 dph_hash_table_init(mac, &pe_session->dph.dphHashTable);
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08002987 lim_delete_pre_auth_list(mac);
2988 lim_send_sme_rsp(mac, eWNI_SME_STOP_BSS_RSP, eSIR_SME_SUCCESS,
Jeff Johnson41485c22019-02-21 11:00:30 -08002989 pe_session->smeSessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002990 return;
2991}
2992
2993/**
2994 * __lim_process_sme_assoc_cnf_new() - process sme assoc/reassoc cnf
2995 *
2996 * @mac_ctx: pointer to mac context
2997 * @msg_type: message type
2998 * @msg_buf: pointer to the SME message buffer
2999 *
3000 * This function handles SME_ASSOC_CNF/SME_REASSOC_CNF
3001 * in BTAMP AP.
3002 *
3003 * Return: None
3004 */
3005
Jeff Johnson83d6c112018-12-02 13:05:00 -08003006void __lim_process_sme_assoc_cnf_new(struct mac_context *mac_ctx, uint32_t msg_type,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003007 uint32_t *msg_buf)
3008{
Jeff Johnsonf86e45b2019-02-03 11:17:14 -08003009 struct assoc_cnf assoc_cnf;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003010 tpDphHashNode sta_ds = NULL;
Jeff Johnson209dfa02018-11-18 22:54:38 -08003011 struct pe_session *session_entry = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003012 uint8_t session_id;
3013 tpSirAssocReq assoc_req;
3014
Jeff Johnson8e9530b2019-03-18 13:41:42 -07003015 if (!msg_buf) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003016 pe_err("msg_buf is NULL");
Zhaoyang Liu132becc2019-03-15 13:49:58 +08003017 return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003018 }
3019
Jeff Johnsonf86e45b2019-02-03 11:17:14 -08003020 qdf_mem_copy(&assoc_cnf, msg_buf, sizeof(assoc_cnf));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003021 if (!__lim_is_sme_assoc_cnf_valid(&assoc_cnf)) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003022 pe_err("Received invalid SME_RE(ASSOC)_CNF message");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003023 goto end;
3024 }
3025
Srinivas Girigowdafb796d12016-01-05 23:04:28 -08003026 session_entry = pe_find_session_by_bssid(mac_ctx, assoc_cnf.bssid.bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003027 &session_id);
Jeff Johnson8e9530b2019-03-18 13:41:42 -07003028 if (!session_entry) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003029 pe_err("session does not exist for given bssId");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003030 goto end;
3031 }
3032
Rajeev Kumarc9a50e72016-04-15 15:18:42 -07003033 if ((!LIM_IS_AP_ROLE(session_entry)) ||
Abhishek Singh72a04bf2019-03-18 11:38:50 +05303034 (session_entry->limSmeState != eLIM_SME_NORMAL_STATE)) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003035 pe_err("Rcvd unexpected msg %X in state %X, in role %X",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003036 msg_type, session_entry->limSmeState,
3037 GET_LIM_SYSTEM_ROLE(session_entry));
3038 goto end;
3039 }
3040 sta_ds = dph_get_hash_entry(mac_ctx, assoc_cnf.aid,
3041 &session_entry->dph.dphHashTable);
Jeff Johnson8e9530b2019-03-18 13:41:42 -07003042 if (!sta_ds) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003043 pe_err("Rcvd invalid msg %X due to no STA ctx, aid %d, peer",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003044 msg_type, assoc_cnf.aid);
Abhishek Singh5d8d7332017-08-10 15:15:24 +05303045 lim_print_mac_addr(mac_ctx, assoc_cnf.peer_macaddr.bytes, LOGE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003046
3047 /*
3048 * send a DISASSOC_IND message to WSM to make sure
3049 * the state in WSM and LIM is the same
3050 */
Srinivas Girigowdafb796d12016-01-05 23:04:28 -08003051 lim_send_sme_disassoc_ntf(mac_ctx, assoc_cnf.peer_macaddr.bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003052 eSIR_SME_STA_NOT_ASSOCIATED,
3053 eLIM_PEER_ENTITY_DISASSOC, assoc_cnf.aid,
3054 session_entry->smeSessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003055 session_entry);
3056 goto end;
3057 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303058 if (qdf_mem_cmp((uint8_t *)sta_ds->staAddr,
Srinivas Girigowdafb796d12016-01-05 23:04:28 -08003059 (uint8_t *) assoc_cnf.peer_macaddr.bytes,
Anurag Chouhan6d760662016-02-20 16:05:43 +05303060 QDF_MAC_ADDR_SIZE)) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003061 pe_debug("peerMacAddr mismatched for aid %d, peer ",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003062 assoc_cnf.aid);
Abhishek Singh5d8d7332017-08-10 15:15:24 +05303063 lim_print_mac_addr(mac_ctx, assoc_cnf.peer_macaddr.bytes, LOGD);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003064 goto end;
3065 }
3066
3067 if ((sta_ds->mlmStaContext.mlmState != eLIM_MLM_WT_ASSOC_CNF_STATE) ||
3068 ((sta_ds->mlmStaContext.subType == LIM_ASSOC) &&
3069 (msg_type != eWNI_SME_ASSOC_CNF)) ||
3070 ((sta_ds->mlmStaContext.subType == LIM_REASSOC) &&
3071 (msg_type != eWNI_SME_ASSOC_CNF))) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003072 pe_debug("not in MLM_WT_ASSOC_CNF_STATE, for aid %d, peer"
3073 "StaD mlmState: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003074 assoc_cnf.aid, sta_ds->mlmStaContext.mlmState);
Abhishek Singh5d8d7332017-08-10 15:15:24 +05303075 lim_print_mac_addr(mac_ctx, assoc_cnf.peer_macaddr.bytes, LOGD);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003076 goto end;
3077 }
3078 /*
3079 * Deactivate/delet CNF_WAIT timer since ASSOC_CNF
3080 * has been received
3081 */
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003082 pe_debug("Received SME_ASSOC_CNF. Delete Timer");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003083 lim_deactivate_and_change_per_sta_id_timer(mac_ctx,
3084 eLIM_CNF_WAIT_TIMER, sta_ds->assocId);
3085
3086 if (assoc_cnf.statusCode == eSIR_SME_SUCCESS) {
3087 /*
3088 * In BTAMP-AP, PE already finished the WMA_ADD_STA sequence
3089 * when it had received Assoc Request frame. Now, PE just needs
3090 * to send association rsp frame to the requesting BTAMP-STA.
3091 */
3092 sta_ds->mlmStaContext.mlmState =
3093 eLIM_MLM_LINK_ESTABLISHED_STATE;
Min Liu0daa0982019-02-01 17:50:44 +08003094 sta_ds->mlmStaContext.owe_ie = assoc_cnf.owe_ie;
3095 sta_ds->mlmStaContext.owe_ie_len = assoc_cnf.owe_ie_len;
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003096 pe_debug("sending Assoc Rsp frame to STA (assoc id=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003097 sta_ds->assocId);
Jeff Johnson0301ecb2018-06-29 09:36:23 -07003098 lim_send_assoc_rsp_mgmt_frame(mac_ctx, QDF_STATUS_SUCCESS,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003099 sta_ds->assocId, sta_ds->staAddr,
3100 sta_ds->mlmStaContext.subType, sta_ds,
3101 session_entry);
Min Liu0daa0982019-02-01 17:50:44 +08003102 sta_ds->mlmStaContext.owe_ie = NULL;
3103 sta_ds->mlmStaContext.owe_ie_len = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003104 goto end;
3105 } else {
Srinivas Dasari397ae402019-01-26 13:46:28 +05303106 uint8_t add_pre_auth_context = true;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003107 /*
3108 * SME_ASSOC_CNF status is non-success, so STA is not allowed
3109 * to be associated since the HAL sta entry is created for
3110 * denied STA we need to remove this HAL entry.
3111 * So to do that set updateContext to 1
3112 */
Pragaspathi Thilagarajcb58bbc2019-05-23 15:34:51 +05303113 enum mac_status_code mac_status_code =
Srinivas Dasari5f528202019-02-11 17:29:43 +05303114 eSIR_MAC_UNSPEC_FAILURE_STATUS;
3115
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003116 if (!sta_ds->mlmStaContext.updateContext)
3117 sta_ds->mlmStaContext.updateContext = 1;
Srinivas Dasari5f528202019-02-11 17:29:43 +05303118 pe_debug("Recv Assoc Cnf, status Code : %d(assoc id=%d) Reason code: %d",
3119 assoc_cnf.statusCode, sta_ds->assocId,
3120 assoc_cnf.mac_status_code);
3121 if (assoc_cnf.mac_status_code)
3122 mac_status_code = assoc_cnf.mac_status_code;
Srinivas Dasari397ae402019-01-26 13:46:28 +05303123 if (assoc_cnf.mac_status_code == eSIR_MAC_INVALID_PMKID ||
3124 assoc_cnf.mac_status_code ==
3125 eSIR_MAC_AUTH_ALGO_NOT_SUPPORTED_STATUS)
3126 add_pre_auth_context = false;
3127
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003128 lim_reject_association(mac_ctx, sta_ds->staAddr,
3129 sta_ds->mlmStaContext.subType,
Srinivas Dasari397ae402019-01-26 13:46:28 +05303130 add_pre_auth_context,
3131 sta_ds->mlmStaContext.authType,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003132 sta_ds->assocId, true,
Srinivas Dasari5f528202019-02-11 17:29:43 +05303133 mac_status_code,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003134 session_entry);
3135 }
3136end:
Jeff Johnson8e9530b2019-03-18 13:41:42 -07003137 if (((session_entry) && (sta_ds)) &&
3138 (session_entry->parsedAssocReq[sta_ds->assocId])) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003139 assoc_req = (tpSirAssocReq)
3140 session_entry->parsedAssocReq[sta_ds->assocId];
3141 if (assoc_req->assocReqFrame) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303142 qdf_mem_free(assoc_req->assocReqFrame);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003143 assoc_req->assocReqFrame = NULL;
3144 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303145 qdf_mem_free(session_entry->parsedAssocReq[sta_ds->assocId]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003146 session_entry->parsedAssocReq[sta_ds->assocId] = NULL;
3147 }
Min Liu0daa0982019-02-01 17:50:44 +08003148 qdf_mem_free(assoc_cnf.owe_ie);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003149}
3150
Jeff Johnson83d6c112018-12-02 13:05:00 -08003151static void __lim_process_sme_addts_req(struct mac_context *mac, uint32_t *pMsgBuf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003152{
Jeff Johnsonbddc03e2019-01-17 15:37:09 -08003153 tpDphHashNode sta;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003154 tSirMacAddr peerMac;
3155 tpSirAddtsReq pSirAddts;
3156 uint32_t timeout;
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003157 struct pe_session *pe_session;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003158 uint8_t sessionId; /* PE sessionId */
3159 uint8_t smesessionId;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003160
Jeff Johnson8e9530b2019-03-18 13:41:42 -07003161 if (!pMsgBuf) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003162 pe_err("Buffer is Pointing to NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003163 return;
3164 }
3165
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003166 pSirAddts = (tpSirAddtsReq) pMsgBuf;
Jeff Johnson7fe61d82019-02-20 15:52:04 -08003167 smesessionId = pSirAddts->sessionId;
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003168 pe_session = pe_find_session_by_bssid(mac, pSirAddts->bssid.bytes,
Srinivas Girigowdaaeb33322015-12-04 10:54:07 -08003169 &sessionId);
Jeff Johnson8e9530b2019-03-18 13:41:42 -07003170 if (!pe_session) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003171 pe_err("Session Does not exist for given bssId");
Jeff Johnson07819492019-02-21 09:34:02 -08003172 lim_send_sme_addts_rsp(mac, pSirAddts->rspReqd,
3173 QDF_STATUS_E_FAILURE,
yeshwanth sriram guntuka8fa6fa32017-03-23 13:59:22 +05303174 NULL, pSirAddts->req.tspec,
Jeff Johnson07819492019-02-21 09:34:02 -08003175 smesessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003176 return;
3177 }
3178#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM /* FEATURE_WLAN_DIAG_SUPPORT */
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003179 lim_diag_event_report(mac, WLAN_PE_DIAG_ADDTS_REQ_EVENT, pe_session, 0,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003180 0);
3181#endif /* FEATURE_WLAN_DIAG_SUPPORT */
3182
3183 /* if sta
3184 * - verify assoc state
3185 * - send addts request to ap
3186 * - wait for addts response from ap
3187 * if ap, just ignore with error log
3188 */
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003189 pe_debug("Received SME_ADDTS_REQ (TSid %d, UP %d)",
3190 pSirAddts->req.tspec.tsinfo.traffic.tsid,
3191 pSirAddts->req.tspec.tsinfo.traffic.userPrio);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003192
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003193 if (!LIM_IS_STA_ROLE(pe_session)) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003194 pe_err("AddTs received on AP - ignoring");
Sreelakshmi Konamki2972b6e2017-07-17 12:10:36 +05303195 goto send_failure_addts_rsp;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003196 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003197
Jeff Johnsonbddc03e2019-01-17 15:37:09 -08003198 sta =
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003199 dph_get_hash_entry(mac, DPH_STA_HASH_INDEX_PEER,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003200 &pe_session->dph.dphHashTable);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003201
Jeff Johnson8e9530b2019-03-18 13:41:42 -07003202 if (!sta) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003203 pe_err("Cannot find AP context for addts req");
Sreelakshmi Konamki2972b6e2017-07-17 12:10:36 +05303204 goto send_failure_addts_rsp;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003205 }
3206
Jeff Johnsonbddc03e2019-01-17 15:37:09 -08003207 if ((!sta->valid) || (sta->mlmStaContext.mlmState !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003208 eLIM_MLM_LINK_ESTABLISHED_STATE)) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003209 pe_err("AddTs received in invalid MLM state");
Sreelakshmi Konamki2972b6e2017-07-17 12:10:36 +05303210 goto send_failure_addts_rsp;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003211 }
3212
3213 pSirAddts->req.wsmTspecPresent = 0;
3214 pSirAddts->req.wmeTspecPresent = 0;
3215 pSirAddts->req.lleTspecPresent = 0;
3216
Jeff Johnsonbddc03e2019-01-17 15:37:09 -08003217 if ((sta->wsmEnabled) &&
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003218 (pSirAddts->req.tspec.tsinfo.traffic.accessPolicy !=
3219 SIR_MAC_ACCESSPOLICY_EDCA))
3220 pSirAddts->req.wsmTspecPresent = 1;
Jeff Johnsonbddc03e2019-01-17 15:37:09 -08003221 else if (sta->wmeEnabled)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003222 pSirAddts->req.wmeTspecPresent = 1;
Jeff Johnsonbddc03e2019-01-17 15:37:09 -08003223 else if (sta->lleEnabled)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003224 pSirAddts->req.lleTspecPresent = 1;
3225 else {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003226 pe_warn("ADDTS_REQ ignore - qos is disabled");
Sreelakshmi Konamki2972b6e2017-07-17 12:10:36 +05303227 goto send_failure_addts_rsp;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003228 }
3229
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003230 if ((pe_session->limSmeState != eLIM_SME_ASSOCIATED_STATE) &&
3231 (pe_session->limSmeState != eLIM_SME_LINK_EST_STATE)) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003232 pe_err("AddTs received in invalid LIMsme state (%d)",
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003233 pe_session->limSmeState);
Sreelakshmi Konamki2972b6e2017-07-17 12:10:36 +05303234 goto send_failure_addts_rsp;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003235 }
3236
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003237 if (mac->lim.gLimAddtsSent) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003238 pe_err("Addts (token %d, tsid %d, up %d) is still pending",
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003239 mac->lim.gLimAddtsReq.req.dialogToken,
3240 mac->lim.gLimAddtsReq.req.tspec.tsinfo.traffic.tsid,
3241 mac->lim.gLimAddtsReq.req.tspec.tsinfo.traffic.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003242 userPrio);
Sreelakshmi Konamki2972b6e2017-07-17 12:10:36 +05303243 goto send_failure_addts_rsp;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003244 }
3245
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003246 sir_copy_mac_addr(peerMac, pe_session->bssId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003247
3248 /* save the addts request */
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003249 mac->lim.gLimAddtsSent = true;
3250 qdf_mem_copy((uint8_t *) &mac->lim.gLimAddtsReq,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003251 (uint8_t *) pSirAddts, sizeof(tSirAddtsReq));
3252
3253 /* ship out the message now */
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003254 lim_send_addts_req_action_frame(mac, peerMac, &pSirAddts->req,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003255 pe_session);
Abhishek Singh5d8d7332017-08-10 15:15:24 +05303256 pe_err("Sent ADDTS request");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003257 /* start a timer to wait for the response */
3258 if (pSirAddts->timeout)
3259 timeout = pSirAddts->timeout;
Arif Hussain43e09712018-09-18 19:31:57 -07003260 else
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003261 timeout = mac->mlme_cfg->timeouts.addts_rsp_timeout;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003262
3263 timeout = SYS_MS_TO_TICKS(timeout);
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003264 if (tx_timer_change(&mac->lim.limTimers.gLimAddtsRspTimer, timeout, 0)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003265 != TX_SUCCESS) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003266 pe_err("AddtsRsp timer change failed!");
Sreelakshmi Konamki2972b6e2017-07-17 12:10:36 +05303267 goto send_failure_addts_rsp;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003268 }
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003269 mac->lim.gLimAddtsRspTimerCount++;
3270 if (tx_timer_change_context(&mac->lim.limTimers.gLimAddtsRspTimer,
3271 mac->lim.gLimAddtsRspTimerCount) !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003272 TX_SUCCESS) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003273 pe_err("AddtsRsp timer change failed!");
Sreelakshmi Konamki2972b6e2017-07-17 12:10:36 +05303274 goto send_failure_addts_rsp;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003275 }
3276 MTRACE(mac_trace
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003277 (mac, TRACE_CODE_TIMER_ACTIVATE, pe_session->peSessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003278 eLIM_ADDTS_RSP_TIMER));
3279
3280 /* add the sessionId to the timer object */
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003281 mac->lim.limTimers.gLimAddtsRspTimer.sessionId = sessionId;
3282 if (tx_timer_activate(&mac->lim.limTimers.gLimAddtsRspTimer) !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003283 TX_SUCCESS) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003284 pe_err("AddtsRsp timer activation failed!");
Sreelakshmi Konamki2972b6e2017-07-17 12:10:36 +05303285 goto send_failure_addts_rsp;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003286 }
3287 return;
Sreelakshmi Konamki2972b6e2017-07-17 12:10:36 +05303288
3289send_failure_addts_rsp:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003290 lim_send_sme_addts_rsp(mac, pSirAddts->rspReqd, QDF_STATUS_E_FAILURE,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003291 pe_session, pSirAddts->req.tspec,
Jeff Johnson07819492019-02-21 09:34:02 -08003292 smesessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003293}
3294
Jeff Johnson83d6c112018-12-02 13:05:00 -08003295static void __lim_process_sme_delts_req(struct mac_context *mac, uint32_t *pMsgBuf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003296{
3297 tSirMacAddr peerMacAddr;
3298 uint8_t ac;
Jeff Johnson312348f2018-12-22 13:33:54 -08003299 struct mac_ts_info *pTsinfo;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003300 tpSirDeltsReq pDeltsReq = (tpSirDeltsReq) pMsgBuf;
Jeff Johnsonbddc03e2019-01-17 15:37:09 -08003301 tpDphHashNode sta = NULL;
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003302 struct pe_session *pe_session;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003303 uint8_t sessionId;
Jeff Johnson0301ecb2018-06-29 09:36:23 -07003304 uint32_t status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003305 uint8_t smesessionId;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003306
Jeff Johnson7fe61d82019-02-20 15:52:04 -08003307 smesessionId = pDeltsReq->sessionId;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003308
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003309 pe_session = pe_find_session_by_bssid(mac,
Srinivas Girigowdabab88932015-12-03 19:18:11 -08003310 pDeltsReq->bssid.bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003311 &sessionId);
Jeff Johnson8e9530b2019-03-18 13:41:42 -07003312 if (!pe_session) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003313 pe_err("Session Does not exist for given bssId");
Jeff Johnson0301ecb2018-06-29 09:36:23 -07003314 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003315 goto end;
3316 }
3317#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM /* FEATURE_WLAN_DIAG_SUPPORT */
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003318 lim_diag_event_report(mac, WLAN_PE_DIAG_DELTS_REQ_EVENT, pe_session, 0,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003319 0);
3320#endif /* FEATURE_WLAN_DIAG_SUPPORT */
3321
Jeff Johnson0301ecb2018-06-29 09:36:23 -07003322 if (QDF_STATUS_SUCCESS !=
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003323 lim_validate_delts_req(mac, pDeltsReq, peerMacAddr, pe_session)) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003324 pe_err("lim_validate_delts_req failed");
Jeff Johnson0301ecb2018-06-29 09:36:23 -07003325 status = QDF_STATUS_E_FAILURE;
Jeff Johnsonb2b63e02019-02-21 09:46:03 -08003326 lim_send_sme_delts_rsp(mac, pDeltsReq, QDF_STATUS_E_FAILURE,
3327 pe_session, smesessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003328 return;
3329 }
3330
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003331 pe_debug("Sent DELTS request to station with assocId = %d MacAddr = "
Srinivas Girigowdacb7b8b82019-04-10 14:27:47 -07003332 QDF_MAC_ADDR_STR,
Srinivas Girigowda34fbba02019-04-08 12:07:44 -07003333 pDeltsReq->aid, QDF_MAC_ADDR_ARRAY(peerMacAddr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003334
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003335 lim_send_delts_req_action_frame(mac, peerMacAddr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003336 pDeltsReq->req.wmeTspecPresent,
3337 &pDeltsReq->req.tsinfo,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003338 &pDeltsReq->req.tspec, pe_session);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003339
3340 pTsinfo =
3341 pDeltsReq->req.wmeTspecPresent ? &pDeltsReq->req.tspec.
3342 tsinfo : &pDeltsReq->req.tsinfo;
3343
3344 /* We've successfully send DELTS frame to AP. Update the
3345 * dynamic UAPSD mask. The AC for this TSPEC to be deleted
3346 * is no longer trigger enabled or delivery enabled
3347 */
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003348 lim_set_tspec_uapsd_mask_per_session(mac, pe_session,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003349 pTsinfo, CLEAR_UAPSD_MASK);
3350
3351 /* We're deleting the TSPEC, so this particular AC is no longer
3352 * admitted. PE needs to downgrade the EDCA
3353 * parameters(for the AC for which TS is being deleted) to the
3354 * next best AC for which ACM is not enabled, and send the
3355 * updated values to HAL.
3356 */
3357 ac = upToAc(pTsinfo->traffic.userPrio);
3358
3359 if (pTsinfo->traffic.direction == SIR_MAC_DIRECTION_UPLINK) {
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003360 pe_session->gAcAdmitMask[SIR_MAC_DIRECTION_UPLINK] &=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003361 ~(1 << ac);
3362 } else if (pTsinfo->traffic.direction ==
3363 SIR_MAC_DIRECTION_DNLINK) {
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003364 pe_session->gAcAdmitMask[SIR_MAC_DIRECTION_DNLINK] &=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003365 ~(1 << ac);
3366 } else if (pTsinfo->traffic.direction ==
3367 SIR_MAC_DIRECTION_BIDIR) {
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003368 pe_session->gAcAdmitMask[SIR_MAC_DIRECTION_UPLINK] &=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003369 ~(1 << ac);
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003370 pe_session->gAcAdmitMask[SIR_MAC_DIRECTION_DNLINK] &=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003371 ~(1 << ac);
3372 }
3373
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003374 lim_set_active_edca_params(mac, pe_session->gLimEdcaParams,
3375 pe_session);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003376
Jeff Johnsonbddc03e2019-01-17 15:37:09 -08003377 sta =
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003378 dph_get_hash_entry(mac, DPH_STA_HASH_INDEX_PEER,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003379 &pe_session->dph.dphHashTable);
Jeff Johnson8e9530b2019-03-18 13:41:42 -07003380 if (sta) {
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003381 lim_send_edca_params(mac, pe_session->gLimEdcaParamsActive,
Jeff Johnsonbddc03e2019-01-17 15:37:09 -08003382 sta->bssId, false);
Jeff Johnson0301ecb2018-06-29 09:36:23 -07003383 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003384 } else {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003385 pe_err("Self entry missing in Hash Table");
Jeff Johnson0301ecb2018-06-29 09:36:23 -07003386 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003387 }
3388#ifdef FEATURE_WLAN_ESE
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003389 lim_send_sme_tsm_ie_ind(mac, pe_session, 0, 0, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003390#endif
3391
3392 /* send an sme response back */
3393end:
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003394 lim_send_sme_delts_rsp(mac, pDeltsReq, QDF_STATUS_SUCCESS, pe_session,
Jeff Johnsonb2b63e02019-02-21 09:46:03 -08003395 smesessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003396}
3397
Jeff Johnson83d6c112018-12-02 13:05:00 -08003398void lim_process_sme_addts_rsp_timeout(struct mac_context *mac, uint32_t param)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003399{
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003400 /* fetch the pe_session based on the sessionId */
3401 struct pe_session *pe_session;
Srinivas Girigowda4d65ebe2017-10-13 21:41:42 -07003402
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003403 pe_session = pe_find_session_by_session_id(mac,
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003404 mac->lim.limTimers.gLimAddtsRspTimer.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003405 sessionId);
Jeff Johnson8e9530b2019-03-18 13:41:42 -07003406 if (!pe_session) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003407 pe_err("Session Does not exist for given sessionID");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003408 return;
3409 }
3410
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003411 if (!LIM_IS_STA_ROLE(pe_session)) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003412 pe_warn("AddtsRspTimeout in non-Sta role (%d)",
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003413 GET_LIM_SYSTEM_ROLE(pe_session));
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003414 mac->lim.gLimAddtsSent = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003415 return;
3416 }
3417
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003418 if (!mac->lim.gLimAddtsSent) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003419 pe_warn("AddtsRspTimeout but no AddtsSent");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003420 return;
3421 }
3422
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003423 if (param != mac->lim.gLimAddtsRspTimerCount) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003424 pe_err("Invalid AddtsRsp Timer count %d (exp %d)", param,
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003425 mac->lim.gLimAddtsRspTimerCount);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003426 return;
3427 }
3428 /* this a real response timeout */
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003429 mac->lim.gLimAddtsSent = false;
3430 mac->lim.gLimAddtsRspTimerCount++;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003431
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003432 lim_send_sme_addts_rsp(mac, true, eSIR_SME_ADDTS_RSP_TIMEOUT,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003433 pe_session, mac->lim.gLimAddtsReq.req.tspec,
Jeff Johnson07819492019-02-21 09:34:02 -08003434 pe_session->smeSessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003435}
3436
Naveen Rawatfa2a1002018-05-17 16:06:37 -07003437#ifndef QCA_SUPPORT_CP_STATS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003438/**
3439 * __lim_process_sme_get_statistics_request()
3440 *
3441 ***FUNCTION:
3442 *
3443 *
3444 ***NOTE:
3445 *
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003446 * @param mac Pointer to Global MAC structure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003447 * @param *pMsgBuf A pointer to the SME message buffer
3448 * @return None
3449 */
3450static void
Jeff Johnson83d6c112018-12-02 13:05:00 -08003451__lim_process_sme_get_statistics_request(struct mac_context *mac, uint32_t *pMsgBuf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003452{
3453 tpAniGetPEStatsReq pPEStatsReq;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07003454 struct scheduler_msg msgQ = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003455
3456 pPEStatsReq = (tpAniGetPEStatsReq) pMsgBuf;
3457
3458 msgQ.type = WMA_GET_STATISTICS_REQ;
3459
3460 msgQ.reserved = 0;
3461 msgQ.bodyptr = pMsgBuf;
3462 msgQ.bodyval = 0;
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003463 MTRACE(mac_trace_msg_tx(mac, NO_SESSION, msgQ.type));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003464
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003465 if (QDF_STATUS_SUCCESS != (wma_post_ctrl_msg(mac, &msgQ))) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303466 qdf_mem_free(pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003467 pMsgBuf = NULL;
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003468 pe_err("Unable to forward request");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003469 return;
3470 }
3471
3472 return;
3473}
Naveen Rawatfa2a1002018-05-17 16:06:37 -07003474#else
3475static void __lim_process_sme_get_statistics_request(
Jeff Johnson009c40f2018-11-05 09:54:37 -08003476 struct mac_context *mac_ctx, uint32_t *pMsgBuf) {}
Naveen Rawatfa2a1002018-05-17 16:06:37 -07003477#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003478
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08003479#ifdef FEATURE_WLAN_ESE
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003480/**
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08003481 * __lim_process_sme_get_tsm_stats_request() - get tsm stats request
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003482 *
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003483 * @mac: Pointer to Global MAC structure
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08003484 * @pMsgBuf: A pointer to the SME message buffer
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003485 *
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08003486 * Return: None
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003487 */
3488static void
Jeff Johnson83d6c112018-12-02 13:05:00 -08003489__lim_process_sme_get_tsm_stats_request(struct mac_context *mac, uint32_t *pMsgBuf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003490{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07003491 struct scheduler_msg msgQ = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003492
3493 msgQ.type = WMA_TSM_STATS_REQ;
3494 msgQ.reserved = 0;
3495 msgQ.bodyptr = pMsgBuf;
3496 msgQ.bodyval = 0;
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003497 MTRACE(mac_trace_msg_tx(mac, NO_SESSION, msgQ.type));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003498
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003499 if (QDF_STATUS_SUCCESS != (wma_post_ctrl_msg(mac, &msgQ))) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303500 qdf_mem_free(pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003501 pMsgBuf = NULL;
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003502 pe_err("Unable to forward request");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003503 return;
3504 }
3505}
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08003506#endif /* FEATURE_WLAN_ESE */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003507
Jeff Johnson83d6c112018-12-02 13:05:00 -08003508static void lim_process_sme_set_addba_accept(struct mac_context *mac_ctx,
Kiran Kumar Lokere08195ef2018-01-17 19:25:15 -08003509 struct sme_addba_accept *msg)
3510{
3511 if (!msg) {
3512 pe_err("Msg Buffer is NULL");
3513 return;
3514 }
3515 if (!msg->addba_accept)
3516 mac_ctx->reject_addba_req = 1;
3517 else
3518 mac_ctx->reject_addba_req = 0;
3519}
3520
Jeff Johnson83d6c112018-12-02 13:05:00 -08003521static void lim_process_sme_update_edca_params(struct mac_context *mac_ctx,
Arif Hussaineb8ba362018-03-07 19:15:13 -08003522 uint32_t sme_session_id)
3523{
Jeff Johnson209dfa02018-11-18 22:54:38 -08003524 struct pe_session *pe_session;
Arif Hussaineb8ba362018-03-07 19:15:13 -08003525 tpDphHashNode sta_ds_ptr;
3526
3527 pe_session = pe_find_session_by_sme_session_id(mac_ctx, sme_session_id);
3528 if (!pe_session) {
3529 pe_err("Session does not exist: sme_id %d", sme_session_id);
3530 return;
3531 }
Srinivas Girigowda5b86fbd2019-03-21 14:54:14 -07003532 pe_session->gLimEdcaParamsActive[QCA_WLAN_AC_BE].no_ack =
3533 mac_ctx->no_ack_policy_cfg[QCA_WLAN_AC_BE];
3534 pe_session->gLimEdcaParamsActive[QCA_WLAN_AC_BK].no_ack =
3535 mac_ctx->no_ack_policy_cfg[QCA_WLAN_AC_BK];
3536 pe_session->gLimEdcaParamsActive[QCA_WLAN_AC_VI].no_ack =
3537 mac_ctx->no_ack_policy_cfg[QCA_WLAN_AC_VI];
3538 pe_session->gLimEdcaParamsActive[QCA_WLAN_AC_VO].no_ack =
3539 mac_ctx->no_ack_policy_cfg[QCA_WLAN_AC_VO];
Arif Hussaineb8ba362018-03-07 19:15:13 -08003540 sta_ds_ptr = dph_get_hash_entry(mac_ctx, DPH_STA_HASH_INDEX_PEER,
3541 &pe_session->dph.dphHashTable);
3542 if (sta_ds_ptr)
3543 lim_send_edca_params(mac_ctx,
3544 pe_session->gLimEdcaParamsActive,
Kiran Kumar Lokere27026ae2018-03-09 11:38:19 -08003545 sta_ds_ptr->bssId, false);
Arif Hussaineb8ba362018-03-07 19:15:13 -08003546 else
3547 pe_err("Self entry missing in Hash Table");
3548}
3549
Jeff Johnson83d6c112018-12-02 13:05:00 -08003550static void lim_process_sme_update_mu_edca_params(struct mac_context *mac_ctx,
Kiran Kumar Lokerefba20632018-07-05 16:51:27 -07003551 uint32_t sme_session_id)
3552{
Jeff Johnson209dfa02018-11-18 22:54:38 -08003553 struct pe_session *pe_session;
Kiran Kumar Lokerefba20632018-07-05 16:51:27 -07003554 tpDphHashNode sta_ds_ptr;
3555
3556 pe_session = pe_find_session_by_sme_session_id(mac_ctx, sme_session_id);
3557 if (!pe_session) {
3558 pe_err("Session does not exist: sme_id %d", sme_session_id);
3559 return;
3560 }
3561 sta_ds_ptr = dph_get_hash_entry(mac_ctx, DPH_STA_HASH_INDEX_PEER,
3562 &pe_session->dph.dphHashTable);
3563 if (sta_ds_ptr)
3564 lim_send_edca_params(mac_ctx, mac_ctx->usr_mu_edca_params,
3565 sta_ds_ptr->bssId, true);
3566 else
3567 pe_err("Self entry missing in Hash Table");
3568}
3569
Kiran Kumar Lokereee205772018-09-27 00:27:27 -07003570static void
3571lim_process_sme_cfg_action_frm_in_tb_ppdu(struct mac_context *mac_ctx,
3572 struct sir_cfg_action_frm_tb_ppdu
3573 *msg)
3574{
3575 if (!msg) {
3576 pe_err("Buffer is NULL");
3577 return;
3578 }
3579
3580 lim_send_action_frm_tb_ppdu_cfg(mac_ctx, msg->session_id, msg->cfg);
3581}
3582
Jeff Johnson83d6c112018-12-02 13:05:00 -08003583static void lim_process_sme_update_config(struct mac_context *mac_ctx,
Naveen Rawat8029a402017-06-01 10:54:19 -07003584 struct update_config *msg)
3585{
Jeff Johnson209dfa02018-11-18 22:54:38 -08003586 struct pe_session *pe_session;
Naveen Rawat8029a402017-06-01 10:54:19 -07003587
3588 pe_debug("received eWNI_SME_UPDATE_HT_CONFIG message");
Jeff Johnson8e9530b2019-03-18 13:41:42 -07003589 if (!msg) {
Naveen Rawat8029a402017-06-01 10:54:19 -07003590 pe_err("Buffer is Pointing to NULL");
3591 return;
3592 }
3593
3594 pe_session = pe_find_session_by_sme_session_id(mac_ctx,
3595 msg->sme_session_id);
Jeff Johnson8e9530b2019-03-18 13:41:42 -07003596 if (!pe_session) {
Naveen Rawat8029a402017-06-01 10:54:19 -07003597 pe_warn("Session does not exist for given BSSID");
3598 return;
3599 }
3600
3601 switch (msg->capab) {
3602 case WNI_CFG_HT_CAP_INFO_ADVANCE_CODING:
Jeff Johnsonbe119e62019-02-02 12:30:26 -08003603 pe_session->ht_config.ht_rx_ldpc = msg->value;
Naveen Rawat8029a402017-06-01 10:54:19 -07003604 break;
3605 case WNI_CFG_HT_CAP_INFO_TX_STBC:
Jeff Johnsonbe119e62019-02-02 12:30:26 -08003606 pe_session->ht_config.ht_tx_stbc = msg->value;
Naveen Rawat8029a402017-06-01 10:54:19 -07003607 break;
3608 case WNI_CFG_HT_CAP_INFO_RX_STBC:
Jeff Johnsonbe119e62019-02-02 12:30:26 -08003609 pe_session->ht_config.ht_rx_stbc = msg->value;
Naveen Rawat8029a402017-06-01 10:54:19 -07003610 break;
3611 case WNI_CFG_HT_CAP_INFO_SHORT_GI_20MHZ:
Jeff Johnsonbe119e62019-02-02 12:30:26 -08003612 pe_session->ht_config.ht_sgi20 = msg->value;
Naveen Rawat8029a402017-06-01 10:54:19 -07003613 break;
3614 case WNI_CFG_HT_CAP_INFO_SHORT_GI_40MHZ:
Jeff Johnsonbe119e62019-02-02 12:30:26 -08003615 pe_session->ht_config.ht_sgi40 = msg->value;
Naveen Rawat8029a402017-06-01 10:54:19 -07003616 break;
3617 }
3618
3619 if (LIM_IS_AP_ROLE(pe_session)) {
3620 sch_set_fixed_beacon_fields(mac_ctx, pe_session);
Abhishek Singhfc740be2018-10-12 11:34:26 +05303621 lim_send_beacon_ind(mac_ctx, pe_session, REASON_CONFIG_UPDATE);
Naveen Rawat8029a402017-06-01 10:54:19 -07003622 }
3623}
3624
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003625void
Jeff Johnson83d6c112018-12-02 13:05:00 -08003626lim_send_vdev_restart(struct mac_context *mac,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003627 struct pe_session *pe_session, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003628{
3629 tpHalHiddenSsidVdevRestart pHalHiddenSsidVdevRestart = NULL;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07003630 struct scheduler_msg msgQ = {0};
Jeff Johnson0301ecb2018-06-29 09:36:23 -07003631 QDF_STATUS retCode = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003632
Jeff Johnson8e9530b2019-03-18 13:41:42 -07003633 if (!pe_session) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003634 pe_err("Invalid parameters");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003635 return;
3636 }
3637
3638 pHalHiddenSsidVdevRestart =
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303639 qdf_mem_malloc(sizeof(tHalHiddenSsidVdevRestart));
Arif Hussainf5b6c412018-10-10 19:41:09 -07003640 if (!pHalHiddenSsidVdevRestart)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003641 return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003642
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003643 pHalHiddenSsidVdevRestart->ssidHidden = pe_session->ssidHidden;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003644 pHalHiddenSsidVdevRestart->sessionId = sessionId;
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003645 pHalHiddenSsidVdevRestart->pe_session_id = pe_session->peSessionId;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003646
3647 msgQ.type = WMA_HIDDEN_SSID_VDEV_RESTART;
3648 msgQ.bodyptr = pHalHiddenSsidVdevRestart;
3649 msgQ.bodyval = 0;
3650
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003651 retCode = wma_post_ctrl_msg(mac, &msgQ);
Jeff Johnson0301ecb2018-06-29 09:36:23 -07003652 if (QDF_STATUS_SUCCESS != retCode) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003653 pe_err("wma_post_ctrl_msg() failed");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303654 qdf_mem_free(pHalHiddenSsidVdevRestart);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003655 }
3656}
3657
Selvaraj, Sridhar01741822016-08-30 18:26:19 +05303658/**
3659 * __lim_process_roam_scan_offload_req() - Process Roam scan offload from csr
3660 * @mac_ctx: Pointer to Global MAC structure
3661 * @msg_buf: Pointer to SME message buffer
3662 *
3663 * Return: None
3664 */
Jeff Johnson83d6c112018-12-02 13:05:00 -08003665static void __lim_process_roam_scan_offload_req(struct mac_context *mac_ctx,
Selvaraj, Sridhar01741822016-08-30 18:26:19 +05303666 uint32_t *msg_buf)
3667{
Jeff Johnson209dfa02018-11-18 22:54:38 -08003668 struct pe_session *pe_session;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07003669 struct scheduler_msg wma_msg = {0};
Jeff Johnson0301ecb2018-06-29 09:36:23 -07003670 QDF_STATUS status;
Jeff Johnsone6da4b02019-02-06 22:22:04 -08003671 struct roam_offload_scan_req *req_buffer;
Selvaraj, Sridhar01741822016-08-30 18:26:19 +05303672 uint16_t local_ie_len;
3673 uint8_t *local_ie_buf;
3674
Jeff Johnsone6da4b02019-02-06 22:22:04 -08003675 req_buffer = (struct roam_offload_scan_req *)msg_buf;
Selvaraj, Sridhar01741822016-08-30 18:26:19 +05303676 pe_session = pe_find_session_by_sme_session_id(mac_ctx,
3677 req_buffer->sessionId);
3678
3679 local_ie_buf = qdf_mem_malloc(MAX_DEFAULT_SCAN_IE_LEN);
3680 if (!local_ie_buf) {
gaurank kathpalia6d25c972019-03-07 20:25:28 +05303681 qdf_mem_zero(req_buffer, sizeof(*req_buffer));
Manikandan Mohan41e2d6f2017-04-10 16:17:39 +05303682 qdf_mem_free(req_buffer);
Selvaraj, Sridhar01741822016-08-30 18:26:19 +05303683 return;
3684 }
3685
3686 local_ie_len = req_buffer->assoc_ie.length;
3687 /* Update ext cap IE if present */
3688 if (local_ie_len &&
Arif Hussain963331b2016-10-27 22:59:01 -07003689 !lim_update_ext_cap_ie(mac_ctx, req_buffer->assoc_ie.addIEdata,
3690 local_ie_buf, &local_ie_len)) {
3691 if (local_ie_len <
Arif Hussainc2bb4402016-10-25 15:24:08 -07003692 QDF_ARRAY_SIZE(req_buffer->assoc_ie.addIEdata)) {
3693 req_buffer->assoc_ie.length = local_ie_len;
3694 qdf_mem_copy(req_buffer->assoc_ie.addIEdata,
3695 local_ie_buf, local_ie_len);
3696 }
Selvaraj, Sridhar01741822016-08-30 18:26:19 +05303697 }
3698 qdf_mem_free(local_ie_buf);
3699
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05303700 if (pe_session)
3701 lim_update_fils_rik(pe_session, req_buffer);
3702
Selvaraj, Sridhar01741822016-08-30 18:26:19 +05303703 wma_msg.type = WMA_ROAM_SCAN_OFFLOAD_REQ;
3704 wma_msg.bodyptr = req_buffer;
3705
3706 status = wma_post_ctrl_msg(mac_ctx, &wma_msg);
Jeff Johnson0301ecb2018-06-29 09:36:23 -07003707 if (QDF_STATUS_SUCCESS != status) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003708 pe_err("Posting WMA_ROAM_SCAN_OFFLOAD_REQ failed");
gaurank kathpalia6d25c972019-03-07 20:25:28 +05303709 qdf_mem_zero(req_buffer, sizeof(*req_buffer));
Selvaraj, Sridhar01741822016-08-30 18:26:19 +05303710 qdf_mem_free(req_buffer);
3711 }
3712}
3713
Paul Zhang624f88d2018-11-07 15:29:45 +08003714#ifdef WLAN_FEATURE_ROAM_OFFLOAD
3715/**
3716 * lim_process_roam_invoke() - process the Roam Invoke req
3717 * @mac_ctx: Pointer to Global MAC structure
3718 * @msg_buf: Pointer to the SME message buffer
3719 *
3720 * This function is called by limProcessMessageQueue(). This function sends the
3721 * ROAM_INVOKE command to WMA.
3722 *
3723 * Return: None
3724 */
Jeff Johnson83d6c112018-12-02 13:05:00 -08003725static void lim_process_roam_invoke(struct mac_context *mac_ctx,
Paul Zhang624f88d2018-11-07 15:29:45 +08003726 uint32_t *msg_buf)
3727{
3728 struct scheduler_msg msg = {0};
3729 QDF_STATUS status;
3730
3731 msg.type = SIR_HAL_ROAM_INVOKE;
3732 msg.bodyptr = msg_buf;
3733 msg.reserved = 0;
3734
3735 status = wma_post_ctrl_msg(mac_ctx, &msg);
3736 if (QDF_STATUS_SUCCESS != status)
3737 pe_err("Not able to post SIR_HAL_ROAM_INVOKE to WMA");
3738}
3739#else
Jeff Johnson83d6c112018-12-02 13:05:00 -08003740static void lim_process_roam_invoke(struct mac_context *mac_ctx,
Paul Zhang624f88d2018-11-07 15:29:45 +08003741 uint32_t *msg_buf)
3742{
3743 qdf_mem_free(msg_buf);
3744}
3745#endif
3746
Jeff Johnson83d6c112018-12-02 13:05:00 -08003747static void lim_handle_update_ssid_hidden(struct mac_context *mac_ctx,
Jeff Johnson209dfa02018-11-18 22:54:38 -08003748 struct pe_session *session, uint8_t ssid_hidden)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003749{
Kiran Kumar Lokere5798bfa2017-04-27 20:49:39 -07003750 pe_debug("rcvd HIDE_SSID message old HIDE_SSID: %d new HIDE_SSID: %d",
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003751 session->ssidHidden, ssid_hidden);
3752
Kiran Kumar Lokere5798bfa2017-04-27 20:49:39 -07003753 if (ssid_hidden != session->ssidHidden) {
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05303754 session->ssidHidden = ssid_hidden;
Kiran Kumar Lokere5798bfa2017-04-27 20:49:39 -07003755 } else {
3756 pe_debug("Dont process HIDE_SSID msg with existing setting");
Selvaraj, Sridhara0083c42016-06-22 22:15:43 +05303757 return;
3758 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003759
Abhishek Singh6c681f42018-09-12 15:52:36 +05303760 ap_mlme_set_hidden_ssid_restart_in_progress(session->vdev, true);
3761 wlan_vdev_mlme_sm_deliver_evt(session->vdev,
3762 WLAN_VDEV_SM_EV_FW_VDEV_RESTART,
3763 sizeof(*session), session);
Jianmin Zhua9005b32018-12-06 21:30:45 +08003764}
Jianmin Zhua9005b32018-12-06 21:30:45 +08003765
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05303766/**
3767 * __lim_process_sme_session_update - process SME session update msg
3768 *
3769 * @mac_ctx: Pointer to global mac context
3770 * @msg_buf: Pointer to the received message buffer
3771 *
3772 * Return: None
3773 */
Jeff Johnson83d6c112018-12-02 13:05:00 -08003774static void __lim_process_sme_session_update(struct mac_context *mac_ctx,
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05303775 uint32_t *msg_buf)
3776{
3777 struct sir_update_session_param *msg;
Jeff Johnson209dfa02018-11-18 22:54:38 -08003778 struct pe_session *session;
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05303779
3780 if (!msg_buf) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003781 pe_err("Buffer is Pointing to NULL");
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05303782 return;
3783 }
3784
3785 msg = (struct sir_update_session_param *) msg_buf;
3786
3787 session = pe_find_session_by_sme_session_id(mac_ctx, msg->session_id);
3788 if (!session) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003789 pe_warn("Session does not exist for given sessionId %d",
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05303790 msg->session_id);
3791 return;
3792 }
3793
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003794 pe_debug("received SME Session update for %d val %d",
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05303795 msg->param_type, msg->param_val);
3796 switch (msg->param_type) {
3797 case SIR_PARAM_SSID_HIDDEN:
3798 lim_handle_update_ssid_hidden(mac_ctx, session, msg->param_val);
3799 break;
Selvaraj, Sridharac4fcf32016-09-28 12:57:32 +05303800 case SIR_PARAM_IGNORE_ASSOC_DISALLOWED:
3801 session->ignore_assoc_disallowed = msg->param_val;
3802 break;
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05303803 default:
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003804 pe_err("Unknown session param");
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05303805 break;
3806 }
3807}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003808
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003809/*
3810 Update the beacon Interval dynamically if beaconInterval is different in MCC
3811 */
Jeff Johnson2482c792019-02-06 14:24:07 -08003812static void __lim_process_sme_change_bi(struct mac_context *mac,
3813 uint32_t *pMsgBuf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003814{
Jeff Johnson2482c792019-02-06 14:24:07 -08003815 struct change_bi_params *pChangeBIParams;
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003816 struct pe_session *pe_session;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003817 uint8_t sessionId = 0;
3818 tUpdateBeaconParams beaconParams;
3819
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003820 pe_debug("received Update Beacon Interval message");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003821
Jeff Johnson8e9530b2019-03-18 13:41:42 -07003822 if (!pMsgBuf) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003823 pe_err("Buffer is Pointing to NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003824 return;
3825 }
3826
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303827 qdf_mem_zero(&beaconParams, sizeof(tUpdateBeaconParams));
Jeff Johnson2482c792019-02-06 14:24:07 -08003828 pChangeBIParams = (struct change_bi_params *)pMsgBuf;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003829
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003830 pe_session = pe_find_session_by_bssid(mac,
Srinivas Girigowda8e717d32015-11-24 15:54:33 -08003831 pChangeBIParams->bssid.bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003832 &sessionId);
Jeff Johnson8e9530b2019-03-18 13:41:42 -07003833 if (!pe_session) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003834 pe_err("Session does not exist for given BSSID");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003835 return;
3836 }
3837
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003838 /*Update pe_session Beacon Interval */
3839 if (pe_session->beaconParams.beaconInterval !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003840 pChangeBIParams->beaconInterval) {
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003841 pe_session->beaconParams.beaconInterval =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003842 pChangeBIParams->beaconInterval;
3843 }
3844
3845 /*Update sch beaconInterval */
Jeff Johnsonac057412019-01-06 11:08:55 -08003846 if (mac->sch.beacon_interval !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003847 pChangeBIParams->beaconInterval) {
Jeff Johnsonac057412019-01-06 11:08:55 -08003848 mac->sch.beacon_interval =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003849 pChangeBIParams->beaconInterval;
3850
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003851 pe_debug("LIM send update BeaconInterval Indication: %d",
3852 pChangeBIParams->beaconInterval);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003853
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003854 if (false == mac->sap.SapDfsInfo.is_dfs_cac_timer_running) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003855 /* Update beacon */
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003856 sch_set_fixed_beacon_fields(mac, pe_session);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003857
Pragaspathi Thilagaraje05162d2019-05-23 13:10:46 +05303858 beaconParams.bss_idx = pe_session->bss_idx;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003859 /* Set change in beacon Interval */
3860 beaconParams.beaconInterval =
3861 pChangeBIParams->beaconInterval;
3862 beaconParams.paramChangeBitmap =
3863 PARAM_BCN_INTERVAL_CHANGED;
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003864 lim_send_beacon_params(mac, &beaconParams, pe_session);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003865 }
3866 }
3867
3868 return;
Jeff Johnson2482c792019-02-06 14:24:07 -08003869} /*** end __lim_process_sme_change_bi() ***/
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003870
3871#ifdef QCA_HT_2040_COEX
Jeff Johnson83d6c112018-12-02 13:05:00 -08003872static void __lim_process_sme_set_ht2040_mode(struct mac_context *mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003873 uint32_t *pMsgBuf)
3874{
Jeff Johnsonb2c72c02019-02-06 21:32:23 -08003875 struct set_ht2040_mode *pSetHT2040Mode;
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003876 struct pe_session *pe_session;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003877 uint8_t sessionId = 0;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07003878 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003879 tUpdateVHTOpMode *pHtOpMode = NULL;
3880 uint16_t staId = 0;
Jeff Johnsonbddc03e2019-01-17 15:37:09 -08003881 tpDphHashNode sta = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003882
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003883 pe_debug("received Set HT 20/40 mode message");
Jeff Johnson8e9530b2019-03-18 13:41:42 -07003884 if (!pMsgBuf) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003885 pe_err("Buffer is Pointing to NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003886 return;
3887 }
3888
Jeff Johnsonb2c72c02019-02-06 21:32:23 -08003889 pSetHT2040Mode = (struct set_ht2040_mode *) pMsgBuf;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003890
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003891 pe_session = pe_find_session_by_bssid(mac,
Srinivas Girigowdac52474d2015-11-24 15:49:31 -08003892 pSetHT2040Mode->bssid.bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003893 &sessionId);
Jeff Johnson8e9530b2019-03-18 13:41:42 -07003894 if (!pe_session) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003895 pe_debug("Session does not exist for given BSSID");
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003896 lim_print_mac_addr(mac, pSetHT2040Mode->bssid.bytes, LOGD);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003897 return;
3898 }
3899
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003900 pe_debug("Update session entry for cbMod=%d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003901 pSetHT2040Mode->cbMode);
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003902 /*Update pe_session HT related fields */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003903 switch (pSetHT2040Mode->cbMode) {
3904 case PHY_SINGLE_CHANNEL_CENTERED:
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003905 pe_session->htSecondaryChannelOffset =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003906 PHY_SINGLE_CHANNEL_CENTERED;
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003907 pe_session->htRecommendedTxWidthSet = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003908 if (pSetHT2040Mode->obssEnabled)
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003909 pe_session->htSupportedChannelWidthSet
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003910 = eHT_CHANNEL_WIDTH_40MHZ;
3911 else
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003912 pe_session->htSupportedChannelWidthSet
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003913 = eHT_CHANNEL_WIDTH_20MHZ;
3914 break;
3915 case PHY_DOUBLE_CHANNEL_LOW_PRIMARY:
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003916 pe_session->htSecondaryChannelOffset =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003917 PHY_DOUBLE_CHANNEL_LOW_PRIMARY;
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003918 pe_session->htRecommendedTxWidthSet = 1;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003919 break;
3920 case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY:
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003921 pe_session->htSecondaryChannelOffset =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003922 PHY_DOUBLE_CHANNEL_HIGH_PRIMARY;
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003923 pe_session->htRecommendedTxWidthSet = 1;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003924 break;
3925 default:
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003926 pe_err("Invalid cbMode");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003927 return;
3928 }
3929
3930 /* Update beacon */
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003931 sch_set_fixed_beacon_fields(mac, pe_session);
3932 lim_send_beacon_ind(mac, pe_session, REASON_SET_HT2040);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003933
3934 /* update OP Mode for each associated peer */
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003935 for (staId = 0; staId < pe_session->dph.dphHashTable.size; staId++) {
Jeff Johnsonbddc03e2019-01-17 15:37:09 -08003936 sta = dph_get_hash_entry(mac, staId,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003937 &pe_session->dph.dphHashTable);
Jeff Johnson8e9530b2019-03-18 13:41:42 -07003938 if (!sta)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003939 continue;
3940
Jeff Johnsonbddc03e2019-01-17 15:37:09 -08003941 if (sta->valid && sta->htSupportedChannelWidthSet) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303942 pHtOpMode = qdf_mem_malloc(sizeof(tUpdateVHTOpMode));
Arif Hussainf5b6c412018-10-10 19:41:09 -07003943 if (!pHtOpMode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003944 return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003945 pHtOpMode->opMode =
Jeff Johnsonb5c13332018-12-03 09:54:51 -08003946 (pe_session->htSecondaryChannelOffset ==
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003947 PHY_SINGLE_CHANNEL_CENTERED) ?
3948 eHT_CHANNEL_WIDTH_20MHZ : eHT_CHANNEL_WIDTH_40MHZ;
3949 pHtOpMode->staId = staId;
Jeff Johnsonbddc03e2019-01-17 15:37:09 -08003950 qdf_mem_copy(pHtOpMode->peer_mac, &sta->staAddr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003951 sizeof(tSirMacAddr));
3952 pHtOpMode->smesessionId = sessionId;
3953
3954 msg.type = WMA_UPDATE_OP_MODE;
3955 msg.reserved = 0;
3956 msg.bodyptr = pHtOpMode;
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003957 if (!QDF_IS_STATUS_SUCCESS
gaurank kathpalia3a7f25b2018-08-28 16:26:39 +05303958 (scheduler_post_message(QDF_MODULE_ID_PE,
3959 QDF_MODULE_ID_WMA,
3960 QDF_MODULE_ID_WMA,
3961 &msg))) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003962 pe_err("Not able to post WMA_UPDATE_OP_MODE message to WMA");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303963 qdf_mem_free(pHtOpMode);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003964 return;
3965 }
Jeff Johnson47d75242018-05-12 15:58:53 -07003966 pe_debug("Notified FW about OP mode: %d for staId=%d",
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003967 pHtOpMode->opMode, staId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003968
3969 } else
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07003970 pe_debug("station %d does not support HT40", staId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003971 }
3972
3973 return;
3974}
3975#endif
3976
3977/* -------------------------------------------------------------------- */
3978/**
3979 * __lim_process_report_message
3980 *
3981 * FUNCTION: Processes the next received Radio Resource Management message
3982 *
3983 * LOGIC:
3984 *
3985 * ASSUMPTIONS:
3986 *
3987 * NOTE:
3988 *
3989 * @param None
3990 * @return None
3991 */
3992
Jeff Johnson83d6c112018-12-02 13:05:00 -08003993static void __lim_process_report_message(struct mac_context *mac,
Rajeev Kumarfeb96382017-01-22 19:42:09 -08003994 struct scheduler_msg *pMsg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003995{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003996 switch (pMsg->type) {
3997 case eWNI_SME_NEIGHBOR_REPORT_REQ_IND:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08003998 rrm_process_neighbor_report_req(mac, pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003999 break;
4000 case eWNI_SME_BEACON_REPORT_RESP_XMIT_IND:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004001 rrm_process_beacon_report_xmit(mac, pMsg->bodyptr);
Krishna Kumaar Natarajanf599c6e2015-11-03 11:44:03 -08004002 break;
4003 default:
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004004 pe_err("Invalid msg type: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004005 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004006}
4007
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004008/* -------------------------------------------------------------------- */
4009/**
4010 * lim_send_set_max_tx_power_req
4011 *
4012 * FUNCTION: Send SIR_HAL_SET_MAX_TX_POWER_REQ message to change the max tx power.
4013 *
4014 * LOGIC:
4015 *
4016 * ASSUMPTIONS:
4017 *
4018 * NOTE:
4019 *
4020 * @param txPower txPower to be set.
Jeff Johnsonb5c13332018-12-03 09:54:51 -08004021 * @param pe_session session entry.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004022 * @return None
4023 */
Jeff Johnson0301ecb2018-06-29 09:36:23 -07004024QDF_STATUS
Jeff Johnson83d6c112018-12-02 13:05:00 -08004025lim_send_set_max_tx_power_req(struct mac_context *mac, int8_t txPower,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08004026 struct pe_session *pe_session)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004027{
4028 tpMaxTxPowerParams pMaxTxParams = NULL;
Jeff Johnson0301ecb2018-06-29 09:36:23 -07004029 QDF_STATUS retCode = QDF_STATUS_SUCCESS;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07004030 struct scheduler_msg msgQ = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004031
Jeff Johnson8e9530b2019-03-18 13:41:42 -07004032 if (!pe_session) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004033 pe_err("Invalid parameters");
Jeff Johnson0301ecb2018-06-29 09:36:23 -07004034 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004035 }
4036
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304037 pMaxTxParams = qdf_mem_malloc(sizeof(tMaxTxPowerParams));
Arif Hussainf5b6c412018-10-10 19:41:09 -07004038 if (!pMaxTxParams)
Jeff Johnson0301ecb2018-06-29 09:36:23 -07004039 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004040 pMaxTxParams->power = txPower;
Jeff Johnsonb5c13332018-12-03 09:54:51 -08004041 qdf_mem_copy(pMaxTxParams->bssId.bytes, pe_session->bssId,
Anurag Chouhan6d760662016-02-20 16:05:43 +05304042 QDF_MAC_ADDR_SIZE);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304043 qdf_mem_copy(pMaxTxParams->selfStaMacAddr.bytes,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08004044 pe_session->selfMacAddr,
Anurag Chouhan6d760662016-02-20 16:05:43 +05304045 QDF_MAC_ADDR_SIZE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004046
4047 msgQ.type = WMA_SET_MAX_TX_POWER_REQ;
4048 msgQ.bodyptr = pMaxTxParams;
4049 msgQ.bodyval = 0;
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004050 pe_debug("Post WMA_SET_MAX_TX_POWER_REQ to WMA");
Jeff Johnsonb5c13332018-12-03 09:54:51 -08004051 MTRACE(mac_trace_msg_tx(mac, pe_session->peSessionId, msgQ.type));
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004052 retCode = wma_post_ctrl_msg(mac, &msgQ);
Jeff Johnson0301ecb2018-06-29 09:36:23 -07004053 if (QDF_STATUS_SUCCESS != retCode) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004054 pe_err("wma_post_ctrl_msg() failed");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304055 qdf_mem_free(pMaxTxParams);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004056 }
4057 return retCode;
4058}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004059
4060/**
4061 * __lim_process_sme_register_mgmt_frame_req() - process sme reg mgmt frame req
4062 *
4063 * @mac_ctx: Pointer to Global MAC structure
4064 * @msg_buf: pointer to the SME message buffer
4065 *
4066 * This function is called to process eWNI_SME_REGISTER_MGMT_FRAME_REQ message
4067 * from SME. It Register this information within PE.
4068 *
4069 * Return: None
4070 */
Jeff Johnson83d6c112018-12-02 13:05:00 -08004071static void __lim_process_sme_register_mgmt_frame_req(struct mac_context *mac_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004072 uint32_t *msg_buf)
4073{
Anurag Chouhanffb21542016-02-17 14:33:03 +05304074 QDF_STATUS qdf_status;
Jeff Johnson78f7a182019-02-01 22:45:41 -08004075 struct register_mgmt_frame *sme_req =
4076 (struct register_mgmt_frame *)msg_buf;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004077 struct mgmt_frm_reg_info *lim_mgmt_regn = NULL;
4078 struct mgmt_frm_reg_info *next = NULL;
4079 bool match = false;
4080
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004081 pe_debug("registerFrame %d, frameType %d, matchLen %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004082 sme_req->registerFrame, sme_req->frameType,
4083 sme_req->matchLen);
4084 /* First check whether entry exists already */
Anurag Chouhana37b5b72016-02-21 14:53:42 +05304085 qdf_mutex_acquire(&mac_ctx->lim.lim_frame_register_lock);
Anurag Chouhanffb21542016-02-17 14:33:03 +05304086 qdf_list_peek_front(&mac_ctx->lim.gLimMgmtFrameRegistratinQueue,
4087 (qdf_list_node_t **) &lim_mgmt_regn);
Anurag Chouhana37b5b72016-02-21 14:53:42 +05304088 qdf_mutex_release(&mac_ctx->lim.lim_frame_register_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004089
Jeff Johnson8e9530b2019-03-18 13:41:42 -07004090 while (lim_mgmt_regn) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004091 if (lim_mgmt_regn->frameType != sme_req->frameType)
4092 goto skip_match;
4093 if (sme_req->matchLen) {
4094 if ((lim_mgmt_regn->matchLen == sme_req->matchLen) &&
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304095 (!qdf_mem_cmp(lim_mgmt_regn->matchData,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004096 sme_req->matchData,
4097 lim_mgmt_regn->matchLen))) {
4098 /* found match! */
4099 match = true;
4100 break;
4101 }
4102 } else {
4103 /* found match! */
4104 match = true;
4105 break;
4106 }
4107skip_match:
Anurag Chouhana37b5b72016-02-21 14:53:42 +05304108 qdf_mutex_acquire(&mac_ctx->lim.lim_frame_register_lock);
Anurag Chouhanffb21542016-02-17 14:33:03 +05304109 qdf_status = qdf_list_peek_next(
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004110 &mac_ctx->lim.gLimMgmtFrameRegistratinQueue,
Anurag Chouhanffb21542016-02-17 14:33:03 +05304111 (qdf_list_node_t *)lim_mgmt_regn,
4112 (qdf_list_node_t **)&next);
Anurag Chouhana37b5b72016-02-21 14:53:42 +05304113 qdf_mutex_release(&mac_ctx->lim.lim_frame_register_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004114 lim_mgmt_regn = next;
4115 next = NULL;
4116 }
4117 if (match) {
Anurag Chouhana37b5b72016-02-21 14:53:42 +05304118 qdf_mutex_acquire(&mac_ctx->lim.lim_frame_register_lock);
Naveen Rawat1a3dac62016-10-25 12:44:57 -07004119 if (QDF_STATUS_SUCCESS ==
4120 qdf_list_remove_node(
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004121 &mac_ctx->lim.gLimMgmtFrameRegistratinQueue,
Naveen Rawat1a3dac62016-10-25 12:44:57 -07004122 (qdf_list_node_t *)lim_mgmt_regn))
4123 qdf_mem_free(lim_mgmt_regn);
Anurag Chouhana37b5b72016-02-21 14:53:42 +05304124 qdf_mutex_release(&mac_ctx->lim.lim_frame_register_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004125 }
4126
4127 if (sme_req->registerFrame) {
4128 lim_mgmt_regn =
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304129 qdf_mem_malloc(sizeof(struct mgmt_frm_reg_info) +
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004130 sme_req->matchLen);
Jeff Johnson8e9530b2019-03-18 13:41:42 -07004131 if (lim_mgmt_regn) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004132 lim_mgmt_regn->frameType = sme_req->frameType;
4133 lim_mgmt_regn->matchLen = sme_req->matchLen;
4134 lim_mgmt_regn->sessionId = sme_req->sessionId;
4135 if (sme_req->matchLen) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304136 qdf_mem_copy(lim_mgmt_regn->matchData,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004137 sme_req->matchData,
4138 sme_req->matchLen);
4139 }
Anurag Chouhana37b5b72016-02-21 14:53:42 +05304140 qdf_mutex_acquire(
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004141 &mac_ctx->lim.lim_frame_register_lock);
Anurag Chouhanffb21542016-02-17 14:33:03 +05304142 qdf_list_insert_front(&mac_ctx->lim.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004143 gLimMgmtFrameRegistratinQueue,
4144 &lim_mgmt_regn->node);
Anurag Chouhana37b5b72016-02-21 14:53:42 +05304145 qdf_mutex_release(
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004146 &mac_ctx->lim.lim_frame_register_lock);
4147 }
4148 }
4149 return;
4150}
4151
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004152static void
Jeff Johnson83d6c112018-12-02 13:05:00 -08004153__lim_process_sme_reset_ap_caps_change(struct mac_context *mac, uint32_t *pMsgBuf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004154{
4155 tpSirResetAPCapsChange pResetCapsChange;
Jeff Johnsonb5c13332018-12-03 09:54:51 -08004156 struct pe_session *pe_session;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004157 uint8_t sessionId = 0;
Srinivas Girigowda4d65ebe2017-10-13 21:41:42 -07004158
Jeff Johnson8e9530b2019-03-18 13:41:42 -07004159 if (!pMsgBuf) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004160 pe_err("Buffer is Pointing to NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004161 return;
4162 }
4163
4164 pResetCapsChange = (tpSirResetAPCapsChange) pMsgBuf;
Jeff Johnsonb5c13332018-12-03 09:54:51 -08004165 pe_session =
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004166 pe_find_session_by_bssid(mac, pResetCapsChange->bssId.bytes,
Srinivas Girigowda40567b92015-09-24 15:17:25 -07004167 &sessionId);
Jeff Johnson8e9530b2019-03-18 13:41:42 -07004168 if (!pe_session) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004169 pe_err("Session does not exist for given BSSID");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004170 return;
4171 }
4172
Jeff Johnsonb5c13332018-12-03 09:54:51 -08004173 pe_session->limSentCapsChangeNtf = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004174 return;
4175}
4176
4177/**
Abhishek Singh7996eb72015-12-30 17:24:02 +05304178 * lim_register_mgmt_frame_ind_cb() - Save the Management frame
4179 * indication callback in PE.
4180 * @mac_ptr: Mac pointer
4181 * @msg_buf: Msg pointer containing the callback
4182 *
4183 * This function is used save the Management frame
4184 * indication callback in PE.
4185 *
4186 * Return: None
4187 */
Jeff Johnson83d6c112018-12-02 13:05:00 -08004188static void lim_register_mgmt_frame_ind_cb(struct mac_context *mac_ctx,
Abhishek Singh7996eb72015-12-30 17:24:02 +05304189 uint32_t *msg_buf)
4190{
4191 struct sir_sme_mgmt_frame_cb_req *sme_req =
4192 (struct sir_sme_mgmt_frame_cb_req *)msg_buf;
4193
Jeff Johnson8e9530b2019-03-18 13:41:42 -07004194 if (!msg_buf) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004195 pe_err("msg_buf is null");
Abhishek Singh7996eb72015-12-30 17:24:02 +05304196 return;
4197 }
4198 if (sme_req->callback)
4199 mac_ctx->mgmt_frame_ind_cb =
4200 (sir_mgmt_frame_ind_callback)sme_req->callback;
4201 else
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004202 pe_err("sme_req->callback is null");
Abhishek Singh7996eb72015-12-30 17:24:02 +05304203}
4204
4205/**
Jeff Johnson0e1e7682019-02-20 13:36:04 -08004206 *__lim_process_send_disassoc_frame() - processes send disassoc frame request
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +05304207 * @mac_ctx: pointer to mac context
Jeff Johnson0e1e7682019-02-20 13:36:04 -08004208 * @msg_buf: request message buffer
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +05304209 *
Jeff Johnson0e1e7682019-02-20 13:36:04 -08004210 * Process a request from SME to send a disassoc frame
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +05304211 *
Jeff Johnson0e1e7682019-02-20 13:36:04 -08004212 * Return: none
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +05304213 */
Jeff Johnson83d6c112018-12-02 13:05:00 -08004214static void __lim_process_send_disassoc_frame(struct mac_context *mac_ctx,
Jeff Johnson0e1e7682019-02-20 13:36:04 -08004215 void *msg_buf)
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +05304216{
Jeff Johnson0e1e7682019-02-20 13:36:04 -08004217 struct sme_send_disassoc_frm_req *req = msg_buf;
4218 struct pe_session *session_entry;
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +05304219
Jeff Johnson0e1e7682019-02-20 13:36:04 -08004220 if (!req) {
4221 pe_err("NULL req");
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +05304222 return;
4223 }
4224
Srinivas Girigowdab971ba22019-03-04 15:56:28 -08004225 if ((IEEE80211_IS_MULTICAST(req->peer_mac) &&
Srinivas Girigowda380affc2019-03-04 15:31:51 -08004226 !QDF_IS_ADDR_BROADCAST(req->peer_mac))) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004227 pe_err("received invalid SME_DISASSOC_REQ message");
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +05304228 return;
4229 }
4230
Jeff Johnson0e1e7682019-02-20 13:36:04 -08004231 session_entry = pe_find_session_by_sme_session_id(mac_ctx,
4232 req->session_id);
4233 if (!session_entry) {
4234 pe_err("session does not exist for given bssId "
Srinivas Girigowdacb7b8b82019-04-10 14:27:47 -07004235 QDF_MAC_ADDR_STR, QDF_MAC_ADDR_ARRAY(req->peer_mac));
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +05304236 return;
4237 }
4238
Jeff Johnson0e1e7682019-02-20 13:36:04 -08004239 pe_debug("msg_type->%d len->%d sess_id->%d mac->"
Srinivas Girigowdacb7b8b82019-04-10 14:27:47 -07004240 QDF_MAC_ADDR_STR " reason->%d wait_for_ack->%d",
Jeff Johnson0e1e7682019-02-20 13:36:04 -08004241 req->msg_type, req->length, req->session_id,
Srinivas Girigowda34fbba02019-04-08 12:07:44 -07004242 QDF_MAC_ADDR_ARRAY(req->peer_mac), req->reason, req->wait_for_ack);
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +05304243
Jeff Johnson0e1e7682019-02-20 13:36:04 -08004244 lim_send_disassoc_mgmt_frame(mac_ctx, req->reason, req->peer_mac,
4245 session_entry, req->wait_for_ack);
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +05304246}
4247
4248/**
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07004249 * lim_set_pdev_ht_ie() - sends the set HT IE req to FW
4250 * @mac_ctx: Pointer to Global MAC structure
4251 * @pdev_id: pdev id to set the IE.
4252 * @nss: Nss values to prepare the HT IE.
4253 *
4254 * Prepares the HT IE with self capabilities for different
4255 * Nss values and sends the set HT IE req to FW.
4256 *
4257 * Return: None
4258 */
Jeff Johnson83d6c112018-12-02 13:05:00 -08004259static void lim_set_pdev_ht_ie(struct mac_context *mac_ctx, uint8_t pdev_id,
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07004260 uint8_t nss)
4261{
4262 struct set_ie_param *ie_params;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07004263 struct scheduler_msg msg = {0};
Jeff Johnson0301ecb2018-06-29 09:36:23 -07004264 QDF_STATUS rc = QDF_STATUS_SUCCESS;
Naveen Rawat08db88f2017-09-08 15:07:48 -07004265 const uint8_t *p_ie = NULL;
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07004266 tHtCaps *p_ht_cap;
4267 int i;
4268
Kiran Kumar Lokere78790202016-09-16 14:09:50 -07004269 for (i = 1; i <= nss; i++) {
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07004270 ie_params = qdf_mem_malloc(sizeof(*ie_params));
Arif Hussainf5b6c412018-10-10 19:41:09 -07004271 if (!ie_params)
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07004272 return;
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07004273 ie_params->nss = i;
4274 ie_params->pdev_id = pdev_id;
4275 ie_params->ie_type = DOT11_HT_IE;
4276 /* 2 for IE len and EID */
4277 ie_params->ie_len = 2 + sizeof(tHtCaps);
4278 ie_params->ie_ptr = qdf_mem_malloc(ie_params->ie_len);
Arif Hussainf5b6c412018-10-10 19:41:09 -07004279 if (!ie_params->ie_ptr) {
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07004280 qdf_mem_free(ie_params);
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07004281 return;
4282 }
Srinivas Girigowda61771262019-04-01 11:55:19 -07004283 *ie_params->ie_ptr = WLAN_ELEMID_HTCAP_ANA;
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07004284 *(ie_params->ie_ptr + 1) = ie_params->ie_len - 2;
4285 lim_set_ht_caps(mac_ctx, NULL, ie_params->ie_ptr,
4286 ie_params->ie_len);
4287
4288 if (NSS_1x1_MODE == i) {
Naveen Rawat08db88f2017-09-08 15:07:48 -07004289 p_ie = wlan_get_ie_ptr_from_eid(DOT11F_EID_HTCAPS,
4290 ie_params->ie_ptr, ie_params->ie_len);
Jeff Johnson8e9530b2019-03-18 13:41:42 -07004291 if (!p_ie) {
Kiran Kumar Lokere53981332016-05-02 18:12:11 -07004292 qdf_mem_free(ie_params->ie_ptr);
4293 qdf_mem_free(ie_params);
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004294 pe_err("failed to get IE ptr");
Kiran Kumar Lokere53981332016-05-02 18:12:11 -07004295 return;
4296 }
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07004297 p_ht_cap = (tHtCaps *)&p_ie[2];
4298 p_ht_cap->supportedMCSSet[1] = 0;
4299 p_ht_cap->txSTBC = 0;
4300 }
4301
4302 msg.type = WMA_SET_PDEV_IE_REQ;
4303 msg.bodyptr = ie_params;
4304 msg.bodyval = 0;
4305
4306 rc = wma_post_ctrl_msg(mac_ctx, &msg);
Jeff Johnson0301ecb2018-06-29 09:36:23 -07004307 if (rc != QDF_STATUS_SUCCESS) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004308 pe_err("wma_post_ctrl_msg() return failure");
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07004309 qdf_mem_free(ie_params->ie_ptr);
4310 qdf_mem_free(ie_params);
4311 return;
4312 }
4313 }
4314}
4315
4316/**
4317 * lim_set_pdev_vht_ie() - sends the set VHT IE to req FW
4318 * @mac_ctx: Pointer to Global MAC structure
4319 * @pdev_id: pdev id to set the IE.
4320 * @nss: Nss values to prepare the VHT IE.
4321 *
4322 * Prepares the VHT IE with self capabilities for different
4323 * Nss values and sends the set VHT IE req to FW.
4324 *
4325 * Return: None
4326 */
Jeff Johnson83d6c112018-12-02 13:05:00 -08004327static void lim_set_pdev_vht_ie(struct mac_context *mac_ctx, uint8_t pdev_id,
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07004328 uint8_t nss)
4329{
4330 struct set_ie_param *ie_params;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07004331 struct scheduler_msg msg = {0};
Jeff Johnson0301ecb2018-06-29 09:36:23 -07004332 QDF_STATUS rc = QDF_STATUS_SUCCESS;
Naveen Rawat08db88f2017-09-08 15:07:48 -07004333 const uint8_t *p_ie = NULL;
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07004334 tSirMacVHTCapabilityInfo *vht_cap;
4335 int i;
4336 tSirVhtMcsInfo *vht_mcs;
4337
Kiran Kumar Lokere78790202016-09-16 14:09:50 -07004338 for (i = 1; i <= nss; i++) {
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07004339 ie_params = qdf_mem_malloc(sizeof(*ie_params));
Arif Hussainf5b6c412018-10-10 19:41:09 -07004340 if (!ie_params)
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07004341 return;
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07004342 ie_params->nss = i;
4343 ie_params->pdev_id = pdev_id;
4344 ie_params->ie_type = DOT11_VHT_IE;
4345 /* 2 for IE len and EID */
4346 ie_params->ie_len = 2 + sizeof(tSirMacVHTCapabilityInfo) +
4347 sizeof(tSirVhtMcsInfo);
4348 ie_params->ie_ptr = qdf_mem_malloc(ie_params->ie_len);
Arif Hussainf5b6c412018-10-10 19:41:09 -07004349 if (!ie_params->ie_ptr) {
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07004350 qdf_mem_free(ie_params);
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07004351 return;
4352 }
Srinivas Girigowda61771262019-04-01 11:55:19 -07004353 *ie_params->ie_ptr = WLAN_ELEMID_VHTCAP;
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07004354 *(ie_params->ie_ptr + 1) = ie_params->ie_len - 2;
4355 lim_set_vht_caps(mac_ctx, NULL, ie_params->ie_ptr,
4356 ie_params->ie_len);
4357
4358 if (NSS_1x1_MODE == i) {
Naveen Rawat08db88f2017-09-08 15:07:48 -07004359 p_ie = wlan_get_ie_ptr_from_eid(DOT11F_EID_VHTCAPS,
4360 ie_params->ie_ptr, ie_params->ie_len);
Jeff Johnson8e9530b2019-03-18 13:41:42 -07004361 if (!p_ie) {
Kiran Kumar Lokere53981332016-05-02 18:12:11 -07004362 qdf_mem_free(ie_params->ie_ptr);
4363 qdf_mem_free(ie_params);
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004364 pe_err("failed to get IE ptr");
Kiran Kumar Lokere53981332016-05-02 18:12:11 -07004365 return;
4366 }
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07004367 vht_cap = (tSirMacVHTCapabilityInfo *)&p_ie[2];
4368 vht_cap->txSTBC = 0;
4369 vht_mcs =
4370 (tSirVhtMcsInfo *)&p_ie[2 +
4371 sizeof(tSirMacVHTCapabilityInfo)];
4372 vht_mcs->rxMcsMap |= DISABLE_NSS2_MCS;
4373 vht_mcs->rxHighest =
4374 VHT_RX_HIGHEST_SUPPORTED_DATA_RATE_1_1;
4375 vht_mcs->txMcsMap |= DISABLE_NSS2_MCS;
4376 vht_mcs->txHighest =
4377 VHT_TX_HIGHEST_SUPPORTED_DATA_RATE_1_1;
4378 }
4379 msg.type = WMA_SET_PDEV_IE_REQ;
4380 msg.bodyptr = ie_params;
4381 msg.bodyval = 0;
4382
4383 rc = wma_post_ctrl_msg(mac_ctx, &msg);
Jeff Johnson0301ecb2018-06-29 09:36:23 -07004384 if (rc != QDF_STATUS_SUCCESS) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004385 pe_err("wma_post_ctrl_msg failure");
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07004386 qdf_mem_free(ie_params->ie_ptr);
4387 qdf_mem_free(ie_params);
4388 return;
4389 }
4390 }
4391}
4392
4393/**
Naveen Rawata410c5a2016-09-19 14:22:33 -07004394 * lim_process_set_vdev_ies_per_band() - process the set vdev IE req
4395 * @mac_ctx: Pointer to Global MAC structure
4396 * @msg_buf: Pointer to the SME message buffer
4397 *
4398 * This function is called by limProcessMessageQueue(). This function sets the
4399 * VDEV IEs to the FW.
4400 *
4401 * Return: None
4402 */
Jeff Johnson83d6c112018-12-02 13:05:00 -08004403static void lim_process_set_vdev_ies_per_band(struct mac_context *mac_ctx,
Naveen Rawata410c5a2016-09-19 14:22:33 -07004404 uint32_t *msg_buf)
4405{
4406 struct sir_set_vdev_ies_per_band *p_msg =
4407 (struct sir_set_vdev_ies_per_band *)msg_buf;
4408
Jeff Johnson8e9530b2019-03-18 13:41:42 -07004409 if (!p_msg) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004410 pe_err("NULL p_msg");
Naveen Rawata410c5a2016-09-19 14:22:33 -07004411 return;
4412 }
4413
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004414 pe_debug("rcvd set vdev ie per band req vdev_id = %d",
Naveen Rawata410c5a2016-09-19 14:22:33 -07004415 p_msg->vdev_id);
4416 /* intentionally using NULL here so that self capabilty are sent */
4417 if (lim_send_ies_per_band(mac_ctx, NULL, p_msg->vdev_id) !=
4418 QDF_STATUS_SUCCESS)
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004419 pe_err("Unable to send HT/VHT Cap to FW");
Naveen Rawata410c5a2016-09-19 14:22:33 -07004420}
4421
4422/**
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07004423 * lim_process_set_pdev_IEs() - process the set pdev IE req
4424 * @mac_ctx: Pointer to Global MAC structure
4425 * @msg_buf: Pointer to the SME message buffer
4426 *
4427 * This function is called by limProcessMessageQueue(). This
4428 * function sets the PDEV IEs to the FW.
4429 *
4430 * Return: None
4431 */
Jeff Johnson83d6c112018-12-02 13:05:00 -08004432static void lim_process_set_pdev_IEs(struct mac_context *mac_ctx, uint32_t *msg_buf)
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07004433{
4434 struct sir_set_ht_vht_cfg *ht_vht_cfg;
4435
4436 ht_vht_cfg = (struct sir_set_ht_vht_cfg *)msg_buf;
4437
Jeff Johnson8e9530b2019-03-18 13:41:42 -07004438 if (!ht_vht_cfg) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004439 pe_err("NULL ht_vht_cfg");
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07004440 return;
4441 }
4442
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004443 pe_debug("rcvd set pdev ht vht ie req with nss = %d",
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07004444 ht_vht_cfg->nss);
4445 lim_set_pdev_ht_ie(mac_ctx, ht_vht_cfg->pdev_id, ht_vht_cfg->nss);
4446
4447 if (IS_DOT11_MODE_VHT(ht_vht_cfg->dot11mode))
4448 lim_set_pdev_vht_ie(mac_ctx, ht_vht_cfg->pdev_id,
4449 ht_vht_cfg->nss);
4450}
4451
4452/**
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05304453 * lim_process_sme_update_access_policy_vendor_ie: function updates vendor IE
4454 *
4455 * access policy
4456 * @mac_ctx: pointer to mac context
4457 * @msg: message buffer
4458 *
4459 * function processes vendor IE and access policy from SME and updates PE
4460 *
4461 * session entry
4462 *
4463 * return: none
4464*/
4465static void lim_process_sme_update_access_policy_vendor_ie(
Jeff Johnson83d6c112018-12-02 13:05:00 -08004466 struct mac_context *mac_ctx,
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05304467 uint32_t *msg)
4468{
4469 struct sme_update_access_policy_vendor_ie *update_vendor_ie;
Jeff Johnson0f99bd82018-11-18 18:42:12 -08004470 struct pe_session *pe_session_entry;
Pragaspathi Thilagaraj9b7a1162018-05-07 16:28:13 +05304471 uint16_t num_bytes;
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05304472
4473 if (!msg) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004474 pe_err("Buffer is Pointing to NULL");
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05304475 return;
4476 }
4477 update_vendor_ie = (struct sme_update_access_policy_vendor_ie *) msg;
4478 pe_session_entry = pe_find_session_by_sme_session_id(mac_ctx,
4479 update_vendor_ie->sme_session_id);
4480
4481 if (!pe_session_entry) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004482 pe_err("Session does not exist for given sme session id(%hu)",
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05304483 update_vendor_ie->sme_session_id);
4484 return;
4485 }
4486 if (pe_session_entry->access_policy_vendor_ie)
4487 qdf_mem_free(pe_session_entry->access_policy_vendor_ie);
4488
4489 num_bytes = update_vendor_ie->ie[1] + 2;
4490 pe_session_entry->access_policy_vendor_ie = qdf_mem_malloc(num_bytes);
Arif Hussainf5b6c412018-10-10 19:41:09 -07004491 if (!pe_session_entry->access_policy_vendor_ie)
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05304492 return;
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05304493 qdf_mem_copy(pe_session_entry->access_policy_vendor_ie,
4494 &update_vendor_ie->ie[0], num_bytes);
4495
4496 pe_session_entry->access_policy = update_vendor_ie->access_policy;
4497}
4498
Sandeep Puligilla30bb8402018-09-23 22:01:08 -07004499QDF_STATUS lim_sta_mlme_vdev_disconnect_bss(struct vdev_mlme_obj *vdev_mlme,
4500 uint16_t data_len, void *data)
4501{
Jeff Johnson83d6c112018-12-02 13:05:00 -08004502 struct mac_context *mac_ctx;
Sandeep Puligilla30bb8402018-09-23 22:01:08 -07004503 struct scheduler_msg *msg = (struct scheduler_msg *)data;
4504
4505 mac_ctx = cds_get_context(QDF_MODULE_ID_PE);
4506 if (!mac_ctx) {
4507 pe_err("mac_ctx is NULL");
4508 if (data)
4509 qdf_mem_free(data);
4510 return QDF_STATUS_E_INVAL;
4511 }
4512 pe_debug("VDEV Manager disconnect bss callback type:(%d)", msg->type);
4513
4514 switch (msg->type) {
4515 case eWNI_SME_DEAUTH_REQ:
4516 __lim_process_sme_deauth_req(mac_ctx,
4517 (uint32_t *)msg->bodyptr);
4518 break;
4519 case eWNI_SME_DISASSOC_CNF:
4520 case eWNI_SME_DEAUTH_CNF:
4521 __lim_process_sme_disassoc_cnf(mac_ctx,
4522 (uint32_t *)msg->bodyptr);
4523 break;
4524 case eWNI_SME_DISASSOC_REQ:
4525 __lim_process_sme_disassoc_req(mac_ctx,
4526 (uint32_t *)msg->bodyptr);
4527 break;
4528 default:
4529 pe_debug("Wrong message type received %d", msg->type);
4530 }
4531 return QDF_STATUS_SUCCESS;
4532}
Jianmin Zhu3c50e402018-12-04 18:52:54 +08004533
4534static void lim_process_disconnect_sta(struct pe_session *session,
4535 struct scheduler_msg *msg)
4536{
Abhishek Singhd5cf22d2019-01-08 19:51:09 +05304537 if (QDF_IS_STATUS_SUCCESS(
4538 wlan_vdev_is_restart_progress(session->vdev)))
Jianmin Zhu3c50e402018-12-04 18:52:54 +08004539 wlan_vdev_mlme_sm_deliver_evt(session->vdev,
4540 WLAN_VDEV_SM_EV_RESTART_REQ_FAIL,
4541 sizeof(*msg), msg);
4542 else
4543 wlan_vdev_mlme_sm_deliver_evt(session->vdev,
4544 WLAN_VDEV_SM_EV_DOWN,
4545 sizeof(*msg), msg);
4546}
Sandeep Puligilla30bb8402018-09-23 22:01:08 -07004547
Jeff Johnson83d6c112018-12-02 13:05:00 -08004548static void lim_process_sme_disassoc_cnf(struct mac_context *mac_ctx,
Sandeep Puligilla30bb8402018-09-23 22:01:08 -07004549 struct scheduler_msg *msg)
4550{
Jeff Johnson0837c442019-02-04 11:37:09 -08004551 struct disassoc_cnf sme_disassoc_cnf;
Jeff Johnson209dfa02018-11-18 22:54:38 -08004552 struct pe_session *session;
Sandeep Puligilla30bb8402018-09-23 22:01:08 -07004553 uint8_t session_id;
sheenam monga449a4722019-04-08 15:22:19 +05304554 uint32_t *err_msg = NULL;
4555 QDF_STATUS status;
Sandeep Puligilla30bb8402018-09-23 22:01:08 -07004556
Jeff Johnson0837c442019-02-04 11:37:09 -08004557 qdf_mem_copy(&sme_disassoc_cnf, msg->bodyptr, sizeof(sme_disassoc_cnf));
Sandeep Puligilla30bb8402018-09-23 22:01:08 -07004558
4559 session = pe_find_session_by_bssid(mac_ctx,
4560 sme_disassoc_cnf.bssid.bytes,
4561 &session_id);
sheenam monga449a4722019-04-08 15:22:19 +05304562 if (!session) {
4563 pe_err("session not found for bssid:%pM",
4564 sme_disassoc_cnf.bssid.bytes);
4565 status = lim_prepare_disconnect_done_ind
4566 (mac_ctx, &err_msg,
4567 sme_disassoc_cnf.sme_session_id,
4568 eSIR_SME_INVALID_SESSION,
4569 NULL);
4570
4571 if (QDF_IS_STATUS_SUCCESS(status))
4572 lim_send_sme_disassoc_deauth_ntf(mac_ctx,
4573 QDF_STATUS_SUCCESS,
4574 err_msg);
4575 return;
4576 }
Sandeep Puligilla30bb8402018-09-23 22:01:08 -07004577
Jianmin Zhu3c50e402018-12-04 18:52:54 +08004578 if (LIM_IS_STA_ROLE(session))
4579 lim_process_disconnect_sta(session, msg);
4580 else
Sandeep Puligilla30bb8402018-09-23 22:01:08 -07004581 __lim_process_sme_disassoc_cnf(mac_ctx,
4582 (uint32_t *)msg->bodyptr);
Sandeep Puligilla30bb8402018-09-23 22:01:08 -07004583}
4584
Jeff Johnson83d6c112018-12-02 13:05:00 -08004585static void lim_process_sme_disassoc_req(struct mac_context *mac_ctx,
Sandeep Puligilla30bb8402018-09-23 22:01:08 -07004586 struct scheduler_msg *msg)
4587{
Jeff Johnsonca523f32019-02-03 18:05:59 -08004588 struct disassoc_req disassoc_req;
Jeff Johnson209dfa02018-11-18 22:54:38 -08004589 struct pe_session *session;
Sandeep Puligilla30bb8402018-09-23 22:01:08 -07004590 uint8_t session_id;
Sandeep Puligilla30bb8402018-09-23 22:01:08 -07004591
Jeff Johnsonca523f32019-02-03 18:05:59 -08004592 qdf_mem_copy(&disassoc_req, msg->bodyptr, sizeof(struct disassoc_req));
Sandeep Puligilla30bb8402018-09-23 22:01:08 -07004593
4594 session = pe_find_session_by_bssid(mac_ctx,
4595 disassoc_req.bssid.bytes,
4596 &session_id);
sheenam monga449a4722019-04-08 15:22:19 +05304597 if (!session) {
4598 pe_err("session not found for bssid:%pM",
4599 disassoc_req.bssid.bytes);
4600 lim_send_sme_disassoc_ntf(mac_ctx,
4601 disassoc_req.peer_macaddr.bytes,
4602 eSIR_SME_INVALID_PARAMETERS,
4603 eLIM_HOST_DISASSOC, 1,
4604 disassoc_req.sessionId, NULL);
4605
4606 return;
4607 }
4608
Jianmin Zhu3c50e402018-12-04 18:52:54 +08004609 if (LIM_IS_STA_ROLE(session))
4610 lim_process_disconnect_sta(session, msg);
4611 else
Sandeep Puligilla30bb8402018-09-23 22:01:08 -07004612 __lim_process_sme_disassoc_req(mac_ctx,
4613 (uint32_t *)msg->bodyptr);
Sandeep Puligilla30bb8402018-09-23 22:01:08 -07004614}
4615
Jeff Johnson83d6c112018-12-02 13:05:00 -08004616static void lim_process_sme_deauth_req(struct mac_context *mac_ctx,
Sandeep Puligilla30bb8402018-09-23 22:01:08 -07004617 struct scheduler_msg *msg)
4618{
Jeff Johnson34c74b02019-02-04 12:34:51 -08004619 struct deauth_req sme_deauth_req;
Jeff Johnson209dfa02018-11-18 22:54:38 -08004620 struct pe_session *session;
Sandeep Puligilla30bb8402018-09-23 22:01:08 -07004621 uint8_t session_id;
Sandeep Puligilla30bb8402018-09-23 22:01:08 -07004622
Jeff Johnson34c74b02019-02-04 12:34:51 -08004623 qdf_mem_copy(&sme_deauth_req, msg->bodyptr, sizeof(sme_deauth_req));
Sandeep Puligilla30bb8402018-09-23 22:01:08 -07004624
4625 session = pe_find_session_by_bssid(mac_ctx,
4626 sme_deauth_req.bssid.bytes,
4627 &session_id);
sheenam monga449a4722019-04-08 15:22:19 +05304628 if (!session) {
4629 pe_err("session not found for bssid:%pM",
4630 sme_deauth_req.bssid.bytes);
4631 lim_send_sme_deauth_ntf(mac_ctx,
4632 sme_deauth_req.peer_macaddr.bytes,
4633 eSIR_SME_INVALID_PARAMETERS,
4634 eLIM_HOST_DEAUTH, 1,
4635 sme_deauth_req.sessionId);
4636
4637 return;
4638 }
4639
Jianmin Zhu3c50e402018-12-04 18:52:54 +08004640 if (LIM_IS_STA_ROLE(session))
4641 lim_process_disconnect_sta(session, msg);
4642 else
Sandeep Puligilla30bb8402018-09-23 22:01:08 -07004643 __lim_process_sme_deauth_req(mac_ctx,
4644 (uint32_t *)msg->bodyptr);
Sandeep Puligilla30bb8402018-09-23 22:01:08 -07004645}
4646
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05304647/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004648 * lim_process_sme_req_messages()
4649 *
4650 ***FUNCTION:
4651 * This function is called by limProcessMessageQueue(). This
4652 * function processes SME request messages from HDD or upper layer
4653 * application.
4654 *
4655 ***LOGIC:
4656 *
4657 ***ASSUMPTIONS:
4658 *
4659 ***NOTE:
4660 *
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004661 * @param mac Pointer to Global MAC structure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004662 * @param msgType Indicates the SME message type
4663 * @param *pMsgBuf A pointer to the SME message buffer
4664 * @return Boolean - true - if pMsgBuf is consumed and can be freed.
4665 * false - if pMsgBuf is not to be freed.
4666 */
4667
Jeff Johnson83d6c112018-12-02 13:05:00 -08004668bool lim_process_sme_req_messages(struct mac_context *mac,
Rajeev Kumarfeb96382017-01-22 19:42:09 -08004669 struct scheduler_msg *pMsg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004670{
Jeff Johnson33142e62018-05-06 17:58:36 -07004671 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 -08004672 uint32_t *pMsgBuf = pMsg->bodyptr;
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004673
4674 pe_debug("LIM Received SME Message %s(%d) Global LimSmeState:%s(%d) Global LimMlmState: %s(%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004675 lim_msg_str(pMsg->type), pMsg->type,
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004676 lim_sme_state_str(mac->lim.gLimSmeState), mac->lim.gLimSmeState,
4677 lim_mlm_state_str(mac->lim.gLimMlmState), mac->lim.gLimMlmState);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004678
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004679 /* If no insert NOA required then execute the code below */
4680
4681 switch (pMsg->type) {
4682 case eWNI_SME_SYS_READY_IND:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004683 bufConsumed = __lim_process_sme_sys_ready_ind(mac, pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004684 break;
4685
4686 case eWNI_SME_START_BSS_REQ:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004687 bufConsumed = __lim_process_sme_start_bss_req(mac, pMsg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004688 break;
4689
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004690 case eWNI_SME_JOIN_REQ:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004691 __lim_process_sme_join_req(mac, pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004692 break;
4693
4694 case eWNI_SME_REASSOC_REQ:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004695 __lim_process_sme_reassoc_req(mac, pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004696 break;
4697
4698 case eWNI_SME_DISASSOC_REQ:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004699 lim_process_sme_disassoc_req(mac, pMsg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004700 break;
4701
4702 case eWNI_SME_DISASSOC_CNF:
4703 case eWNI_SME_DEAUTH_CNF:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004704 lim_process_sme_disassoc_cnf(mac, pMsg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004705 break;
4706
4707 case eWNI_SME_DEAUTH_REQ:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004708 lim_process_sme_deauth_req(mac, pMsg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004709 break;
4710
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +05304711 case eWNI_SME_SEND_DISASSOC_FRAME:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004712 __lim_process_send_disassoc_frame(mac, pMsgBuf);
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +05304713 break;
4714
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004715 case eWNI_SME_SETCONTEXT_REQ:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004716 __lim_process_sme_set_context_req(mac, pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004717 break;
4718
4719 case eWNI_SME_STOP_BSS_REQ:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004720 bufConsumed = __lim_process_sme_stop_bss_req(mac, pMsg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004721 break;
4722
4723 case eWNI_SME_ASSOC_CNF:
4724 if (pMsg->type == eWNI_SME_ASSOC_CNF)
Srinivas Girigowda28fb0122017-03-26 22:21:20 -07004725 pe_debug("Received ASSOC_CNF message");
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004726 __lim_process_sme_assoc_cnf_new(mac, pMsg->type,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004727 pMsgBuf);
4728 break;
4729
4730 case eWNI_SME_ADDTS_REQ:
Srinivas Girigowda28fb0122017-03-26 22:21:20 -07004731 pe_debug("Received ADDTS_REQ message");
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004732 __lim_process_sme_addts_req(mac, pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004733 break;
4734
4735 case eWNI_SME_DELTS_REQ:
Srinivas Girigowda28fb0122017-03-26 22:21:20 -07004736 pe_debug("Received DELTS_REQ message");
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004737 __lim_process_sme_delts_req(mac, pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004738 break;
4739
4740 case SIR_LIM_ADDTS_RSP_TIMEOUT:
Srinivas Girigowda28fb0122017-03-26 22:21:20 -07004741 pe_debug("Received SIR_LIM_ADDTS_RSP_TIMEOUT message");
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004742 lim_process_sme_addts_rsp_timeout(mac, pMsg->bodyval);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004743 break;
4744
4745 case eWNI_SME_GET_STATISTICS_REQ:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004746 __lim_process_sme_get_statistics_request(mac, pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004747 /* HAL consumes pMsgBuf. It will be freed there. Set bufConsumed to false. */
4748 bufConsumed = false;
4749 break;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08004750#ifdef FEATURE_WLAN_ESE
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004751 case eWNI_SME_GET_TSM_STATS_REQ:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004752 __lim_process_sme_get_tsm_stats_request(mac, pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004753 bufConsumed = false;
4754 break;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08004755#endif /* FEATURE_WLAN_ESE */
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05304756 case eWNI_SME_SESSION_UPDATE_PARAM:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004757 __lim_process_sme_session_update(mac, pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004758 break;
Selvaraj, Sridhar01741822016-08-30 18:26:19 +05304759 case eWNI_SME_ROAM_SCAN_OFFLOAD_REQ:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004760 __lim_process_roam_scan_offload_req(mac, pMsgBuf);
Selvaraj, Sridhar01741822016-08-30 18:26:19 +05304761 bufConsumed = false;
4762 break;
Paul Zhang624f88d2018-11-07 15:29:45 +08004763 case eWNI_SME_ROAM_INVOKE:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004764 lim_process_roam_invoke(mac, pMsgBuf);
Paul Zhang624f88d2018-11-07 15:29:45 +08004765 bufConsumed = false;
4766 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004767 case eWNI_SME_CHNG_MCC_BEACON_INTERVAL:
4768 /* Update the beaconInterval */
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004769 __lim_process_sme_change_bi(mac, pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004770 break;
4771
4772#ifdef QCA_HT_2040_COEX
4773 case eWNI_SME_SET_HT_2040_MODE:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004774 __lim_process_sme_set_ht2040_mode(mac, pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004775 break;
4776#endif
4777
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004778 case eWNI_SME_NEIGHBOR_REPORT_REQ_IND:
4779 case eWNI_SME_BEACON_REPORT_RESP_XMIT_IND:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004780 __lim_process_report_message(mac, pMsg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004781 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004782
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004783 case eWNI_SME_FT_PRE_AUTH_REQ:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004784 bufConsumed = (bool) lim_process_ft_pre_auth_req(mac, pMsg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004785 break;
4786 case eWNI_SME_FT_UPDATE_KEY:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004787 lim_process_ft_update_key(mac, pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004788 break;
4789
4790 case eWNI_SME_FT_AGGR_QOS_REQ:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004791 lim_process_ft_aggr_qos_req(mac, pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004792 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004793
4794 case eWNI_SME_REGISTER_MGMT_FRAME_REQ:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004795 __lim_process_sme_register_mgmt_frame_req(mac, pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004796 break;
4797#ifdef FEATURE_WLAN_TDLS
4798 case eWNI_SME_TDLS_SEND_MGMT_REQ:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004799 lim_process_sme_tdls_mgmt_send_req(mac, pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004800 break;
4801 case eWNI_SME_TDLS_ADD_STA_REQ:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004802 lim_process_sme_tdls_add_sta_req(mac, pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004803 break;
4804 case eWNI_SME_TDLS_DEL_STA_REQ:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004805 lim_process_sme_tdls_del_sta_req(mac, pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004806 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004807#endif
4808 case eWNI_SME_RESET_AP_CAPS_CHANGED:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004809 __lim_process_sme_reset_ap_caps_change(mac, pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004810 break;
4811
4812 case eWNI_SME_CHANNEL_CHANGE_REQ:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004813 lim_process_sme_channel_change_request(mac, pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004814 break;
4815
4816 case eWNI_SME_START_BEACON_REQ:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004817 lim_process_sme_start_beacon_req(mac, pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004818 break;
4819
4820 case eWNI_SME_DFS_BEACON_CHAN_SW_IE_REQ:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004821 lim_process_sme_dfs_csa_ie_request(mac, pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004822 break;
4823
4824 case eWNI_SME_UPDATE_ADDITIONAL_IES:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004825 lim_process_update_add_ies(mac, pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004826 break;
4827
4828 case eWNI_SME_MODIFY_ADDITIONAL_IES:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004829 lim_process_modify_add_ies(mac, pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004830 break;
4831 case eWNI_SME_SET_HW_MODE_REQ:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004832 lim_process_set_hw_mode(mac, pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004833 break;
4834 case eWNI_SME_NSS_UPDATE_REQ:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004835 lim_process_nss_update_request(mac, pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004836 break;
4837 case eWNI_SME_SET_DUAL_MAC_CFG_REQ:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004838 lim_process_set_dual_mac_cfg_req(mac, pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004839 break;
4840 case eWNI_SME_SET_IE_REQ:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004841 lim_process_set_ie_req(mac, pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004842 break;
Abhishek Singh7996eb72015-12-30 17:24:02 +05304843 case eWNI_SME_REGISTER_MGMT_FRAME_CB:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004844 lim_register_mgmt_frame_ind_cb(mac, pMsgBuf);
Abhishek Singh7996eb72015-12-30 17:24:02 +05304845 break;
Abhishek Singh518323d2015-10-19 17:42:01 +05304846 case eWNI_SME_EXT_CHANGE_CHANNEL:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004847 lim_process_ext_change_channel(mac, pMsgBuf);
Abhishek Singh518323d2015-10-19 17:42:01 +05304848 break;
Archana Ramachandrana20ef812015-11-13 16:12:13 -08004849 case eWNI_SME_SET_ANTENNA_MODE_REQ:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004850 lim_process_set_antenna_mode_req(mac, pMsgBuf);
Archana Ramachandrana20ef812015-11-13 16:12:13 -08004851 break;
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07004852 case eWNI_SME_PDEV_SET_HT_VHT_IE:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004853 lim_process_set_pdev_IEs(mac, pMsgBuf);
Naveen Rawata410c5a2016-09-19 14:22:33 -07004854 break;
4855 case eWNI_SME_SET_VDEV_IES_PER_BAND:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004856 lim_process_set_vdev_ies_per_band(mac, pMsgBuf);
Naveen Rawata410c5a2016-09-19 14:22:33 -07004857 break;
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05304858 case eWNI_SME_UPDATE_ACCESS_POLICY_VENDOR_IE:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004859 lim_process_sme_update_access_policy_vendor_ie(mac, pMsgBuf);
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05304860 break;
Naveen Rawat8029a402017-06-01 10:54:19 -07004861 case eWNI_SME_UPDATE_CONFIG:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004862 lim_process_sme_update_config(mac,
Naveen Rawat8029a402017-06-01 10:54:19 -07004863 (struct update_config *)pMsgBuf);
4864 break;
Kiran Kumar Lokere08195ef2018-01-17 19:25:15 -08004865 case eWNI_SME_SET_ADDBA_ACCEPT:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004866 lim_process_sme_set_addba_accept(mac,
Kiran Kumar Lokere08195ef2018-01-17 19:25:15 -08004867 (struct sme_addba_accept *)pMsgBuf);
4868 break;
Arif Hussaineb8ba362018-03-07 19:15:13 -08004869 case eWNI_SME_UPDATE_EDCA_PROFILE:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004870 lim_process_sme_update_edca_params(mac, pMsg->bodyval);
Arif Hussaineb8ba362018-03-07 19:15:13 -08004871 break;
Kiran Kumar Lokerefba20632018-07-05 16:51:27 -07004872 case WNI_SME_UPDATE_MU_EDCA_PARAMS:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004873 lim_process_sme_update_mu_edca_params(mac, pMsg->bodyval);
Kiran Kumar Lokerefba20632018-07-05 16:51:27 -07004874 break;
Kiran Kumar Lokereee205772018-09-27 00:27:27 -07004875 case WNI_SME_CFG_ACTION_FRM_HE_TB_PPDU:
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004876 lim_process_sme_cfg_action_frm_in_tb_ppdu(mac,
Kiran Kumar Lokereee205772018-09-27 00:27:27 -07004877 (struct sir_cfg_action_frm_tb_ppdu *)pMsgBuf);
4878 break;
Abhinav Kumar4d1f9f42019-05-07 13:14:49 +05304879 case WNI_SME_REGISTER_BCN_REPORT_SEND_CB:
4880 lim_register_bcn_report_send_cb(mac, pMsg);
4881 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004882 default:
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304883 qdf_mem_free((void *)pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004884 pMsg->bodyptr = NULL;
4885 break;
4886 } /* switch (msgType) */
4887
4888 return bufConsumed;
4889} /*** end lim_process_sme_req_messages() ***/
4890
4891/**
4892 * lim_process_sme_start_beacon_req()
4893 *
4894 ***FUNCTION:
4895 * This function is called by limProcessMessageQueue(). This
4896 * function processes SME request messages from HDD or upper layer
4897 * application.
4898 *
4899 ***LOGIC:
4900 *
4901 ***ASSUMPTIONS:
4902 *
4903 ***NOTE:
4904 *
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004905 * @param mac Pointer to Global MAC structure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004906 * @param msgType Indicates the SME message type
4907 * @param *pMsgBuf A pointer to the SME message buffer
4908 * @return Boolean - true - if pMsgBuf is consumed and can be freed.
4909 * false - if pMsgBuf is not to be freed.
4910 */
Jeff Johnson83d6c112018-12-02 13:05:00 -08004911static void lim_process_sme_start_beacon_req(struct mac_context *mac, uint32_t *pMsg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004912{
4913 tpSirStartBeaconIndication pBeaconStartInd;
Jeff Johnsonb5c13332018-12-03 09:54:51 -08004914 struct pe_session *pe_session;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004915 uint8_t sessionId; /* PE sessionID */
4916
Jeff Johnson8e9530b2019-03-18 13:41:42 -07004917 if (!pMsg) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004918 pe_err("Buffer is Pointing to NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004919 return;
4920 }
4921
4922 pBeaconStartInd = (tpSirStartBeaconIndication) pMsg;
Jeff Johnsonb5c13332018-12-03 09:54:51 -08004923 pe_session = pe_find_session_by_bssid(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004924 pBeaconStartInd->bssid,
4925 &sessionId);
Jeff Johnson8e9530b2019-03-18 13:41:42 -07004926 if (!pe_session) {
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08004927 lim_print_mac_addr(mac, pBeaconStartInd->bssid, LOGE);
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004928 pe_err("Session does not exist for given bssId");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004929 return;
4930 }
4931
4932 if (pBeaconStartInd->beaconStartStatus == true) {
4933 /*
4934 * Currently this Indication comes from SAP
4935 * to start Beacon Tx on a DFS channel
4936 * since beaconing has to be done on DFS
4937 * channel only after CAC WAIT is completed.
4938 * On a DFS Channel LIM does not start beacon
4939 * Tx right after the WMA_ADD_BSS_RSP.
4940 */
Jeff Johnsonb5c13332018-12-03 09:54:51 -08004941 lim_apply_configuration(mac, pe_session);
Abhishek Singh4294f802017-08-10 16:37:07 +05304942 QDF_TRACE(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004943 FL("Start Beacon with ssid %s Ch %d"),
Jeff Johnsonb5c13332018-12-03 09:54:51 -08004944 pe_session->ssId.ssId,
4945 pe_session->currentOperChannel);
4946 lim_send_beacon(mac, pe_session);
4947 lim_enable_obss_detection_config(mac, pe_session);
4948 lim_send_obss_color_collision_cfg(mac, pe_session,
Arif Hussain05fb4872018-01-03 16:02:55 -08004949 OBSS_COLOR_COLLISION_DETECTION);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004950 } else {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004951 pe_err("Invalid Beacon Start Indication");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004952 return;
4953 }
4954}
4955
Jianmin Zhua9005b32018-12-06 21:30:45 +08004956static void lim_change_channel(
4957 struct mac_context *mac_ctx,
4958 struct pe_session *session_entry)
4959{
4960 mlme_set_chan_switch_in_progress(session_entry->vdev, true);
4961 if (wlan_vdev_mlme_get_state(session_entry->vdev) ==
4962 WLAN_VDEV_S_DFS_CAC_WAIT)
4963 wlan_vdev_mlme_sm_deliver_evt(session_entry->vdev,
4964 WLAN_VDEV_SM_EV_RADAR_DETECTED,
4965 sizeof(*session_entry),
4966 session_entry);
4967 else
4968 wlan_vdev_mlme_sm_deliver_evt(session_entry->vdev,
4969 WLAN_VDEV_SM_EV_CSA_COMPLETE,
4970 sizeof(*session_entry),
4971 session_entry);
4972}
Jianmin Zhua9005b32018-12-06 21:30:45 +08004973
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004974/**
4975 * lim_process_sme_channel_change_request() - process sme ch change req
4976 *
4977 * @mac_ctx: Pointer to Global MAC structure
4978 * @msg_buf: pointer to the SME message buffer
4979 *
4980 * This function is called to process SME_CHANNEL_CHANGE_REQ message
4981 *
4982 * Return: None
4983 */
Jeff Johnson83d6c112018-12-02 13:05:00 -08004984static void lim_process_sme_channel_change_request(struct mac_context *mac_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004985 uint32_t *msg_buf)
4986{
4987 tpSirChanChangeRequest ch_change_req;
Jeff Johnson209dfa02018-11-18 22:54:38 -08004988 struct pe_session *session_entry;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004989 uint8_t session_id; /* PE session_id */
Amar Singhala297bfa2015-10-15 15:07:29 -07004990 int8_t max_tx_pwr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004991
Jeff Johnson8e9530b2019-03-18 13:41:42 -07004992 if (!msg_buf) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07004993 pe_err("msg_buf is NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004994 return;
4995 }
4996 ch_change_req = (tpSirChanChangeRequest)msg_buf;
4997
Wu Gao5c3d94b2019-01-17 21:15:54 +08004998 max_tx_pwr = lim_get_regulatory_max_transmit_power(
4999 mac_ctx, ch_change_req->targetChannel);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005000
5001 if ((ch_change_req->messageType != eWNI_SME_CHANNEL_CHANGE_REQ) ||
5002 (max_tx_pwr == WMA_MAX_TXPOWER_INVALID)) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07005003 pe_err("Invalid Request/max_tx_pwr");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005004 return;
5005 }
5006
5007 session_entry = pe_find_session_by_bssid(mac_ctx,
5008 ch_change_req->bssid, &session_id);
Jeff Johnson8e9530b2019-03-18 13:41:42 -07005009 if (!session_entry) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005010 lim_print_mac_addr(mac_ctx, ch_change_req->bssid, LOGE);
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07005011 pe_err("Session does not exist for given bssId");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005012 return;
5013 }
5014
Manjunathappa Prakash34fda792018-02-07 18:23:42 -08005015 if ((session_entry->currentOperChannel ==
5016 ch_change_req->targetChannel) &&
5017 (session_entry->ch_width == ch_change_req->ch_width)) {
5018 pe_err("Target channel and mode is same as current channel and mode channel %d and mode %d",
5019 session_entry->currentOperChannel, session_entry->ch_width);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005020 return;
5021 }
5022
5023 if (LIM_IS_AP_ROLE(session_entry))
5024 session_entry->channelChangeReasonCode =
5025 LIM_SWITCH_CHANNEL_SAP_DFS;
5026 else
5027 session_entry->channelChangeReasonCode =
5028 LIM_SWITCH_CHANNEL_OPERATION;
5029
Bala Venkateshb39ed152017-12-26 19:35:27 +05305030 pe_debug("switch old chnl %d to new chnl %d, ch_bw %d, nw_type %d, dot11mode %d",
5031 session_entry->currentOperChannel,
5032 ch_change_req->targetChannel,
5033 ch_change_req->ch_width,
5034 ch_change_req->nw_type,
5035 ch_change_req->dot11mode);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005036
5037 /* Store the New Channel Params in session_entry */
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08005038 session_entry->ch_width = ch_change_req->ch_width;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005039 session_entry->ch_center_freq_seg0 =
5040 ch_change_req->center_freq_seg_0;
5041 session_entry->ch_center_freq_seg1 =
5042 ch_change_req->center_freq_seg_1;
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08005043 session_entry->htSecondaryChannelOffset = ch_change_req->sec_ch_offset;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005044 session_entry->htSupportedChannelWidthSet =
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08005045 (ch_change_req->ch_width ? 1 : 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005046 session_entry->htRecommendedTxWidthSet =
5047 session_entry->htSupportedChannelWidthSet;
5048 session_entry->currentOperChannel =
5049 ch_change_req->targetChannel;
5050 session_entry->limRFBand =
5051 lim_get_rf_band(session_entry->currentOperChannel);
Abhishek Singh20a8e442018-09-12 15:50:44 +05305052 session_entry->cac_duration_ms = ch_change_req->cac_duration_ms;
5053 session_entry->dfs_regdomain = ch_change_req->dfs_regdomain;
5054 session_entry->maxTxPower = max_tx_pwr;
Vignesh Viswanathan153ae932018-04-11 14:24:13 +05305055
5056 /* Update the global beacon filter */
5057 lim_update_bcn_probe_filter(mac_ctx, session_entry);
5058
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005059 /* Initialize 11h Enable Flag */
gaolez76d2a162017-03-21 19:23:58 +08005060 if (CHAN_HOP_ALL_BANDS_ENABLE ||
Abhinav Kumard4d6eb72018-12-04 20:30:37 +05305061 session_entry->limRFBand == BAND_5G)
5062 session_entry->lim11hEnable =
5063 mac_ctx->mlme_cfg->gen.enabled_11h;
5064 else
5065 session_entry->lim11hEnable = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005066
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005067 session_entry->dot11mode = ch_change_req->dot11mode;
Bala Venkateshb39ed152017-12-26 19:35:27 +05305068 session_entry->nwType = ch_change_req->nw_type;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305069 qdf_mem_copy(&session_entry->rateSet,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005070 &ch_change_req->operational_rateset,
5071 sizeof(session_entry->rateSet));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305072 qdf_mem_copy(&session_entry->extRateSet,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005073 &ch_change_req->extended_rateset,
5074 sizeof(session_entry->extRateSet));
Abhishek Singh20a8e442018-09-12 15:50:44 +05305075
Jianmin Zhua9005b32018-12-06 21:30:45 +08005076 lim_change_channel(mac_ctx, session_entry);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005077}
5078
5079/******************************************************************************
5080* lim_start_bss_update_add_ie_buffer()
5081*
5082***FUNCTION:
5083* This function checks the src buffer and its length and then malloc for
5084* dst buffer update the same
5085*
5086***LOGIC:
5087*
5088***ASSUMPTIONS:
5089*
5090***NOTE:
5091*
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08005092* @param mac Pointer to Global MAC structure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005093* @param **pDstData_buff A pointer to pointer of uint8_t dst buffer
5094* @param *pDstDataLen A pointer to pointer of uint16_t dst buffer length
5095* @param *pSrcData_buff A pointer of uint8_t src buffer
5096* @param srcDataLen src buffer length
5097******************************************************************************/
5098
5099static void
Jeff Johnson83d6c112018-12-02 13:05:00 -08005100lim_start_bss_update_add_ie_buffer(struct mac_context *mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005101 uint8_t **pDstData_buff,
5102 uint16_t *pDstDataLen,
5103 uint8_t *pSrcData_buff, uint16_t srcDataLen)
5104{
5105
Jeff Johnson8e9530b2019-03-18 13:41:42 -07005106 if (srcDataLen > 0 && pSrcData_buff) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005107 *pDstDataLen = srcDataLen;
5108
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305109 *pDstData_buff = qdf_mem_malloc(*pDstDataLen);
Arif Hussainf5b6c412018-10-10 19:41:09 -07005110 if (!*pDstData_buff)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005111 return;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305112 qdf_mem_copy(*pDstData_buff, pSrcData_buff, *pDstDataLen);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005113 } else {
5114 *pDstData_buff = NULL;
5115 *pDstDataLen = 0;
5116 }
5117}
5118
5119/******************************************************************************
5120* lim_update_add_ie_buffer()
5121*
5122***FUNCTION:
5123* This function checks the src buffer and length if src buffer length more
5124* than dst buffer length then free the dst buffer and malloc for the new src
5125* length, and update the dst buffer and length. But if dst buffer is bigger
5126* than src buffer length then it just update the dst buffer and length
5127*
5128***LOGIC:
5129*
5130***ASSUMPTIONS:
5131*
5132***NOTE:
5133*
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08005134* @param mac Pointer to Global MAC structure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005135* @param **pDstData_buff A pointer to pointer of uint8_t dst buffer
5136* @param *pDstDataLen A pointer to pointer of uint16_t dst buffer length
5137* @param *pSrcData_buff A pointer of uint8_t src buffer
5138* @param srcDataLen src buffer length
5139******************************************************************************/
5140
5141static void
Jeff Johnson83d6c112018-12-02 13:05:00 -08005142lim_update_add_ie_buffer(struct mac_context *mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005143 uint8_t **pDstData_buff,
5144 uint16_t *pDstDataLen,
5145 uint8_t *pSrcData_buff, uint16_t srcDataLen)
5146{
5147
Jeff Johnson8e9530b2019-03-18 13:41:42 -07005148 if (!pSrcData_buff) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07005149 pe_err("src buffer is null");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005150 return;
5151 }
5152
5153 if (srcDataLen > *pDstDataLen) {
5154 *pDstDataLen = srcDataLen;
5155 /* free old buffer */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305156 qdf_mem_free(*pDstData_buff);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005157 /* allocate a new */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305158 *pDstData_buff = qdf_mem_malloc(*pDstDataLen);
Arif Hussainf5b6c412018-10-10 19:41:09 -07005159 if (!*pDstData_buff) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005160 *pDstDataLen = 0;
5161 return;
5162 }
5163 }
5164
5165 /* copy the content of buffer into dst buffer
5166 */
5167 *pDstDataLen = srcDataLen;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305168 qdf_mem_copy(*pDstData_buff, pSrcData_buff, *pDstDataLen);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005169
5170}
5171
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08005172/**
5173 * lim_update_ibss_prop_add_ies() - update IBSS prop IE
Jeff Johnsonb3b2de22018-11-21 21:19:01 -08005174 * @mac : Pointer to Global MAC structure
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08005175 * @pDstData_buff : A pointer to pointer of dst buffer
5176 * @pDstDataLen : A pointer to pointer of dst buffer length
5177 * @pModifyIE : A pointer to tSirModifyIE
5178 *
5179 * This function replaces previous ibss prop_ie with new ibss prop_ie.
5180 *
5181 * Return:
5182 * True or false depending upon whether IE is updated or not
5183 */
5184static bool
Jeff Johnson83d6c112018-12-02 13:05:00 -08005185lim_update_ibss_prop_add_ies(struct mac_context *mac, uint8_t **pDstData_buff,
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08005186 uint16_t *pDstDataLen, tSirModifyIE *pModifyIE)
5187{
Hong Shi1553d692016-09-28 12:16:19 +08005188 int32_t oui_length;
5189 uint8_t *ibss_ie = NULL;
5190 uint8_t *vendor_ie;
5191#define MAC_VENDOR_OUI "\x00\x16\x32"
5192#define MAC_VENDOR_SIZE 3
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08005193
5194 ibss_ie = pModifyIE->pIEBuffer;
5195 oui_length = pModifyIE->oui_length;
5196
Jeff Johnson8e9530b2019-03-18 13:41:42 -07005197 if ((0 == oui_length) || (!ibss_ie)) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07005198 pe_err("Invalid set IBSS vendor IE command length %d",
5199 oui_length);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08005200 return false;
5201 }
5202
Hong Shi1553d692016-09-28 12:16:19 +08005203 /*
5204 * Why replace only beacon OUI data here:
5205 * 1. other ie (such as wpa) shall not be overwritten here.
5206 * 2. per spec, beacon oui ie might be set twice and original one
5207 * shall be updated.
5208 */
Naveen Rawat08db88f2017-09-08 15:07:48 -07005209 vendor_ie = (uint8_t *)wlan_get_vendor_ie_ptr_from_oui(MAC_VENDOR_OUI,
Hong Shi1553d692016-09-28 12:16:19 +08005210 MAC_VENDOR_SIZE, *pDstData_buff, *pDstDataLen);
5211 if (vendor_ie) {
5212 QDF_ASSERT((vendor_ie[1] + 2) == pModifyIE->ieBufferlength);
5213 qdf_mem_copy(vendor_ie, pModifyIE->pIEBuffer,
5214 pModifyIE->ieBufferlength);
5215 } else {
Naveen Rawat668dee32017-09-29 14:39:40 -07005216 uint16_t new_length;
5217 uint8_t *new_ptr;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08005218
Naveen Rawat668dee32017-09-29 14:39:40 -07005219 /*
5220 * check for uint16 overflow before using sum of two numbers as
5221 * length of size to malloc
5222 */
5223 if (USHRT_MAX - pModifyIE->ieBufferlength < *pDstDataLen) {
5224 pe_err("U16 overflow due to %d + %d",
5225 pModifyIE->ieBufferlength, *pDstDataLen);
5226 return false;
5227 }
5228
5229 new_length = pModifyIE->ieBufferlength + *pDstDataLen;
5230 new_ptr = qdf_mem_malloc(new_length);
Arif Hussainf5b6c412018-10-10 19:41:09 -07005231 if (!new_ptr)
Hong Shi1553d692016-09-28 12:16:19 +08005232 return false;
Hong Shi1553d692016-09-28 12:16:19 +08005233 qdf_mem_copy(new_ptr, *pDstData_buff, *pDstDataLen);
5234 qdf_mem_copy(&new_ptr[*pDstDataLen], pModifyIE->pIEBuffer,
5235 pModifyIE->ieBufferlength);
5236 qdf_mem_free(*pDstData_buff);
5237 *pDstDataLen = new_length;
5238 *pDstData_buff = new_ptr;
5239 }
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08005240 return true;
5241}
5242
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005243/*
5244* lim_process_modify_add_ies() - process modify additional IE req.
5245*
5246* @mac_ctx: Pointer to Global MAC structure
5247* @msg_buf: pointer to the SME message buffer
5248*
5249* This function update the PE buffers for additional IEs.
5250*
5251* Return: None
5252*/
Jeff Johnson83d6c112018-12-02 13:05:00 -08005253static void lim_process_modify_add_ies(struct mac_context *mac_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005254 uint32_t *msg_buf)
5255{
5256 tpSirModifyIEsInd modify_add_ies;
Jeff Johnson209dfa02018-11-18 22:54:38 -08005257 struct pe_session *session_entry;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005258 uint8_t session_id;
5259 bool ret = false;
Jeff Johnson90542e52019-02-02 13:59:56 -08005260 struct add_ie_params *add_ie_params;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005261
Jeff Johnson8e9530b2019-03-18 13:41:42 -07005262 if (!msg_buf) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07005263 pe_err("msg_buf is NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005264 return;
5265 }
5266
5267 modify_add_ies = (tpSirModifyIEsInd)msg_buf;
5268 /* Incoming message has smeSession, use BSSID to find PE session */
5269 session_entry = pe_find_session_by_bssid(mac_ctx,
Srinivas Girigowda34b634c2015-11-18 22:22:01 -08005270 modify_add_ies->modifyIE.bssid.bytes, &session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005271
Jeff Johnson8e9530b2019-03-18 13:41:42 -07005272 if (!session_entry) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07005273 pe_err("Session not found for given bssid"
Srinivas Girigowdacb7b8b82019-04-10 14:27:47 -07005274 QDF_MAC_ADDR_STR,
Srinivas Girigowda34fbba02019-04-08 12:07:44 -07005275 QDF_MAC_ADDR_ARRAY(modify_add_ies->modifyIE.bssid.bytes));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005276 goto end;
5277 }
5278 if ((0 == modify_add_ies->modifyIE.ieBufferlength) ||
5279 (0 == modify_add_ies->modifyIE.ieIDLen) ||
Jeff Johnson8e9530b2019-03-18 13:41:42 -07005280 (!modify_add_ies->modifyIE.pIEBuffer)) {
Jeff Johnson11bd4f32017-09-18 08:15:17 -07005281 pe_err("Invalid request pIEBuffer %pK ieBufferlength %d ieIDLen %d ieID %d. update Type %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005282 modify_add_ies->modifyIE.pIEBuffer,
5283 modify_add_ies->modifyIE.ieBufferlength,
5284 modify_add_ies->modifyIE.ieID,
5285 modify_add_ies->modifyIE.ieIDLen,
5286 modify_add_ies->updateType);
5287 goto end;
5288 }
Jeff Johnson21aac3a2019-02-02 14:26:13 -08005289 add_ie_params = &session_entry->add_ie_params;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005290 switch (modify_add_ies->updateType) {
5291 case eUPDATE_IE_PROBE_RESP:
5292 /* Probe resp */
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08005293 if (LIM_IS_IBSS_ROLE(session_entry)) {
5294 lim_update_ibss_prop_add_ies(mac_ctx,
5295 &add_ie_params->probeRespData_buff,
5296 &add_ie_params->probeRespDataLen,
5297 &modify_add_ies->modifyIE);
5298 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005299 break;
5300 case eUPDATE_IE_ASSOC_RESP:
5301 /* assoc resp IE */
5302 if (add_ie_params->assocRespDataLen == 0) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305303 QDF_TRACE(QDF_MODULE_ID_PE,
5304 QDF_TRACE_LEVEL_ERROR, FL(
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005305 "assoc resp add ie not present %d"),
5306 add_ie_params->assocRespDataLen);
5307 }
5308 /* search through the buffer and modify the IE */
5309 break;
5310 case eUPDATE_IE_PROBE_BCN:
5311 /*probe beacon IE */
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08005312 if (LIM_IS_IBSS_ROLE(session_entry)) {
5313 ret = lim_update_ibss_prop_add_ies(mac_ctx,
5314 &add_ie_params->probeRespBCNData_buff,
5315 &add_ie_params->probeRespBCNDataLen,
5316 &modify_add_ies->modifyIE);
5317 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005318 if (ret == true && modify_add_ies->modifyIE.notify) {
5319 lim_handle_param_update(mac_ctx,
5320 modify_add_ies->updateType);
5321 }
5322 break;
5323 default:
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07005324 pe_err("unhandled buffer type %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005325 modify_add_ies->updateType);
5326 break;
5327 }
5328end:
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305329 qdf_mem_free(modify_add_ies->modifyIE.pIEBuffer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005330 modify_add_ies->modifyIE.pIEBuffer = NULL;
5331}
5332
5333/*
5334* lim_process_update_add_ies() - process additional IE update req
5335*
5336* @mac_ctx: Pointer to Global MAC structure
5337* @msg_buf: pointer to the SME message buffer
5338*
5339* This function update the PE buffers for additional IEs.
5340*
5341* Return: None
5342*/
Jeff Johnson83d6c112018-12-02 13:05:00 -08005343static void lim_process_update_add_ies(struct mac_context *mac_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005344 uint32_t *msg_buf)
5345{
5346 tpSirUpdateIEsInd update_add_ies = (tpSirUpdateIEsInd)msg_buf;
5347 uint8_t session_id;
Jeff Johnson209dfa02018-11-18 22:54:38 -08005348 struct pe_session *session_entry;
Jeff Johnson90542e52019-02-02 13:59:56 -08005349 struct add_ie_params *addn_ie;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005350 uint16_t new_length = 0;
5351 uint8_t *new_ptr = NULL;
5352 tSirUpdateIE *update_ie;
5353
Jeff Johnson8e9530b2019-03-18 13:41:42 -07005354 if (!msg_buf) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07005355 pe_err("msg_buf is NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005356 return;
5357 }
5358 update_ie = &update_add_ies->updateIE;
5359 /* incoming message has smeSession, use BSSID to find PE session */
5360 session_entry = pe_find_session_by_bssid(mac_ctx,
Srinivas Girigowda8b983962015-11-18 22:14:34 -08005361 update_ie->bssid.bytes, &session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005362
Jeff Johnson8e9530b2019-03-18 13:41:42 -07005363 if (!session_entry) {
Yeshwanth Sriram Guntukacbe61442018-08-23 18:08:44 +05305364 pe_debug("Session not found for given bssid"
Srinivas Girigowdacb7b8b82019-04-10 14:27:47 -07005365 QDF_MAC_ADDR_STR,
Srinivas Girigowda34fbba02019-04-08 12:07:44 -07005366 QDF_MAC_ADDR_ARRAY(update_ie->bssid.bytes));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005367 goto end;
5368 }
Jeff Johnson21aac3a2019-02-02 14:26:13 -08005369 addn_ie = &session_entry->add_ie_params;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005370 /* if len is 0, upper layer requested freeing of buffer */
5371 if (0 == update_ie->ieBufferlength) {
5372 switch (update_add_ies->updateType) {
5373 case eUPDATE_IE_PROBE_RESP:
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305374 qdf_mem_free(addn_ie->probeRespData_buff);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005375 addn_ie->probeRespData_buff = NULL;
5376 addn_ie->probeRespDataLen = 0;
5377 break;
5378 case eUPDATE_IE_ASSOC_RESP:
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305379 qdf_mem_free(addn_ie->assocRespData_buff);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005380 addn_ie->assocRespData_buff = NULL;
5381 addn_ie->assocRespDataLen = 0;
5382 break;
5383 case eUPDATE_IE_PROBE_BCN:
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305384 qdf_mem_free(addn_ie->probeRespBCNData_buff);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005385 addn_ie->probeRespBCNData_buff = NULL;
5386 addn_ie->probeRespBCNDataLen = 0;
5387
5388 if (update_ie->notify)
5389 lim_handle_param_update(mac_ctx,
5390 update_add_ies->updateType);
5391 break;
5392 default:
5393 break;
5394 }
5395 return;
5396 }
5397 switch (update_add_ies->updateType) {
5398 case eUPDATE_IE_PROBE_RESP:
5399 if (update_ie->append) {
5400 /*
5401 * In case of append, allocate new memory
Varun Reddy Yeturu84637fc2017-10-02 11:52:37 -07005402 * with combined length.
5403 * Multiple back to back append commands
5404 * can lead to a huge length.So, check
5405 * for the validity of the length.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005406 */
Varun Reddy Yeturu84637fc2017-10-02 11:52:37 -07005407 if (addn_ie->probeRespDataLen >
5408 (USHRT_MAX - update_ie->ieBufferlength)) {
5409 pe_err("IE Length overflow, curr:%d, new:%d",
5410 addn_ie->probeRespDataLen,
5411 update_ie->ieBufferlength);
5412 goto end;
5413 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005414 new_length = update_ie->ieBufferlength +
5415 addn_ie->probeRespDataLen;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305416 new_ptr = qdf_mem_malloc(new_length);
Arif Hussainf5b6c412018-10-10 19:41:09 -07005417 if (!new_ptr)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005418 goto end;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005419 /* append buffer to end of local buffers */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305420 qdf_mem_copy(new_ptr, addn_ie->probeRespData_buff,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005421 addn_ie->probeRespDataLen);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305422 qdf_mem_copy(&new_ptr[addn_ie->probeRespDataLen],
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005423 update_ie->pAdditionIEBuffer,
5424 update_ie->ieBufferlength);
5425 /* free old memory */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305426 qdf_mem_free(addn_ie->probeRespData_buff);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005427 /* adjust length accordingly */
5428 addn_ie->probeRespDataLen = new_length;
5429 /* save refernece of local buffer in PE session */
5430 addn_ie->probeRespData_buff = new_ptr;
5431 goto end;
5432 }
5433 lim_update_add_ie_buffer(mac_ctx, &addn_ie->probeRespData_buff,
5434 &addn_ie->probeRespDataLen,
5435 update_ie->pAdditionIEBuffer,
5436 update_ie->ieBufferlength);
5437 break;
5438 case eUPDATE_IE_ASSOC_RESP:
5439 /* assoc resp IE */
5440 lim_update_add_ie_buffer(mac_ctx, &addn_ie->assocRespData_buff,
5441 &addn_ie->assocRespDataLen,
5442 update_ie->pAdditionIEBuffer,
5443 update_ie->ieBufferlength);
5444 break;
5445 case eUPDATE_IE_PROBE_BCN:
5446 /* probe resp Bcn IE */
5447 lim_update_add_ie_buffer(mac_ctx,
5448 &addn_ie->probeRespBCNData_buff,
5449 &addn_ie->probeRespBCNDataLen,
5450 update_ie->pAdditionIEBuffer,
5451 update_ie->ieBufferlength);
5452 if (update_ie->notify)
5453 lim_handle_param_update(mac_ctx,
5454 update_add_ies->updateType);
5455 break;
5456 default:
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07005457 pe_err("unhandled buffer type %d", update_add_ies->updateType);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005458 break;
5459 }
5460end:
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305461 qdf_mem_free(update_ie->pAdditionIEBuffer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005462 update_ie->pAdditionIEBuffer = NULL;
5463}
5464
5465/**
Abhishek Singh518323d2015-10-19 17:42:01 +05305466 * send_extended_chan_switch_action_frame()- function to send ECSA
5467 * action frame for each sta connected to SAP/GO and AP in case of
5468 * STA .
5469 * @mac_ctx: pointer to global mac structure
5470 * @new_channel: new channel to switch to.
5471 * @ch_bandwidth: BW of channel to calculate op_class
5472 * @session_entry: pe session
5473 *
5474 * This function is called to send ECSA frame for STA/CLI and SAP/GO.
5475 *
5476 * Return: void
5477 */
5478
Jeff Johnson83d6c112018-12-02 13:05:00 -08005479static void send_extended_chan_switch_action_frame(struct mac_context *mac_ctx,
Abhishek Singh518323d2015-10-19 17:42:01 +05305480 uint16_t new_channel, uint8_t ch_bandwidth,
Jeff Johnson209dfa02018-11-18 22:54:38 -08005481 struct pe_session *session_entry)
Abhishek Singh518323d2015-10-19 17:42:01 +05305482{
5483 uint16_t op_class;
5484 uint8_t switch_mode = 0, i;
5485 tpDphHashNode psta;
gaoleze2920bd2017-03-21 17:38:42 +08005486 uint8_t switch_count;
Abhishek Singh518323d2015-10-19 17:42:01 +05305487
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07005488 op_class = wlan_reg_dmn_get_opclass_from_channel(
Abhishek Singh518323d2015-10-19 17:42:01 +05305489 mac_ctx->scan.countryCodeCurrent,
5490 new_channel,
5491 ch_bandwidth);
5492
5493 if (LIM_IS_AP_ROLE(session_entry) &&
5494 (mac_ctx->sap.SapDfsInfo.disable_dfs_ch_switch == false))
gaolez76d2a162017-03-21 19:23:58 +08005495 switch_mode = session_entry->gLimChannelSwitch.switchMode;
Abhishek Singh518323d2015-10-19 17:42:01 +05305496
gaoleze2920bd2017-03-21 17:38:42 +08005497 switch_count = session_entry->gLimChannelSwitch.switchCount;
5498
Abhishek Singh518323d2015-10-19 17:42:01 +05305499 if (LIM_IS_AP_ROLE(session_entry)) {
gaolez3b07a2c2017-03-22 12:59:17 +08005500 for (i = 0; i <= mac_ctx->lim.maxStation; i++) {
Abhishek Singh518323d2015-10-19 17:42:01 +05305501 psta =
5502 session_entry->dph.dphHashTable.pDphNodeArray + i;
5503 if (psta && psta->added)
5504 lim_send_extended_chan_switch_action_frame(
5505 mac_ctx,
5506 psta->staAddr,
5507 switch_mode, op_class, new_channel,
gaoleze2920bd2017-03-21 17:38:42 +08005508 switch_count, session_entry);
Abhishek Singh518323d2015-10-19 17:42:01 +05305509 }
5510 } else if (LIM_IS_STA_ROLE(session_entry)) {
5511 lim_send_extended_chan_switch_action_frame(mac_ctx,
5512 session_entry->bssId,
5513 switch_mode, op_class, new_channel,
gaoleze2920bd2017-03-21 17:38:42 +08005514 switch_count, session_entry);
Abhishek Singh518323d2015-10-19 17:42:01 +05305515 }
5516
5517}
5518
Jeff Johnson83d6c112018-12-02 13:05:00 -08005519void lim_send_chan_switch_action_frame(struct mac_context *mac_ctx,
gaolez76d2a162017-03-21 19:23:58 +08005520 uint16_t new_channel,
5521 uint8_t ch_bandwidth,
Jeff Johnson209dfa02018-11-18 22:54:38 -08005522 struct pe_session *session_entry)
gaolez76d2a162017-03-21 19:23:58 +08005523{
5524 uint16_t op_class;
5525 uint8_t switch_mode = 0, i;
5526 uint8_t switch_count;
5527 tpDphHashNode psta;
5528 tpDphHashNode dph_node_array_ptr;
5529
5530 dph_node_array_ptr = session_entry->dph.dphHashTable.pDphNodeArray;
5531
5532 op_class = wlan_reg_dmn_get_opclass_from_channel(
5533 mac_ctx->scan.countryCodeCurrent,
5534 new_channel, ch_bandwidth);
5535
5536 if (LIM_IS_AP_ROLE(session_entry) &&
5537 (false == mac_ctx->sap.SapDfsInfo.disable_dfs_ch_switch))
5538 switch_mode = session_entry->gLimChannelSwitch.switchMode;
5539
5540 switch_count = session_entry->gLimChannelSwitch.switchCount;
5541
5542 if (LIM_IS_AP_ROLE(session_entry)) {
5543 for (i = 0; i < mac_ctx->lim.maxStation; i++) {
5544 psta = dph_node_array_ptr + i;
5545 if (!(psta && psta->added))
5546 continue;
5547 if (session_entry->lim_non_ecsa_cap_num == 0)
5548 lim_send_extended_chan_switch_action_frame
5549 (mac_ctx, psta->staAddr, switch_mode,
5550 op_class, new_channel, switch_count,
5551 session_entry);
5552 else
5553 lim_send_channel_switch_mgmt_frame
5554 (mac_ctx, psta->staAddr, switch_mode,
5555 new_channel, switch_count,
5556 session_entry);
5557 }
5558 } else if (LIM_IS_STA_ROLE(session_entry)) {
5559 lim_send_extended_chan_switch_action_frame
5560 (mac_ctx, session_entry->bssId, switch_mode, op_class,
5561 new_channel, switch_count, session_entry);
5562 }
5563}
5564
5565/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005566 * lim_process_sme_dfs_csa_ie_request() - process sme dfs csa ie req
5567 *
5568 * @mac_ctx: Pointer to Global MAC structure
5569 * @msg_buf: pointer to the SME message buffer
5570 *
5571 * This function processes SME request messages from HDD or upper layer
5572 * application.
5573 *
5574 * Return: None
5575 */
Jeff Johnson83d6c112018-12-02 13:05:00 -08005576static void lim_process_sme_dfs_csa_ie_request(struct mac_context *mac_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005577 uint32_t *msg_buf)
5578{
5579 tpSirDfsCsaIeRequest dfs_csa_ie_req;
Jeff Johnson209dfa02018-11-18 22:54:38 -08005580 struct pe_session *session_entry = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005581 uint8_t session_id;
5582 tLimWiderBWChannelSwitchInfo *wider_bw_ch_switch;
Amar Singhal22995112016-01-22 10:42:33 -08005583 enum offset_t ch_offset;
Abhishek Singh8c54e382019-03-19 17:43:43 +05305584 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005585
Jeff Johnson8e9530b2019-03-18 13:41:42 -07005586 if (!msg_buf) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07005587 pe_err("Buffer is Pointing to NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005588 return;
5589 }
5590
5591 dfs_csa_ie_req = (tSirDfsCsaIeRequest *)msg_buf;
5592 session_entry = pe_find_session_by_bssid(mac_ctx,
5593 dfs_csa_ie_req->bssid, &session_id);
Jeff Johnson8e9530b2019-03-18 13:41:42 -07005594 if (!session_entry) {
Srinivas Girigowdacb7b8b82019-04-10 14:27:47 -07005595 pe_err("Session not found for given BSSID" QDF_MAC_ADDR_STR,
Srinivas Girigowda34fbba02019-04-08 12:07:44 -07005596 QDF_MAC_ADDR_ARRAY(dfs_csa_ie_req->bssid));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005597 return;
5598 }
5599
5600 if (session_entry->valid && !LIM_IS_AP_ROLE(session_entry)) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07005601 pe_err("Invalid SystemRole %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005602 GET_LIM_SYSTEM_ROLE(session_entry));
5603 return;
5604 }
5605
5606 /* target channel */
5607 session_entry->gLimChannelSwitch.primaryChannel =
5608 dfs_csa_ie_req->targetChannel;
5609
5610 /* Channel switch announcement needs to be included in beacon */
5611 session_entry->dfsIncludeChanSwIe = true;
gaoleze2920bd2017-03-21 17:38:42 +08005612 session_entry->gLimChannelSwitch.switchCount =
5613 dfs_csa_ie_req->ch_switch_beacon_cnt;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005614 session_entry->gLimChannelSwitch.ch_width =
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08005615 dfs_csa_ie_req->ch_params.ch_width;
Chandrasekaran Manishekar4fcb7f52016-03-07 19:09:20 +05305616 session_entry->gLimChannelSwitch.sec_ch_offset =
5617 dfs_csa_ie_req->ch_params.sec_ch_offset;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005618 if (mac_ctx->sap.SapDfsInfo.disable_dfs_ch_switch == false)
gaolez76d2a162017-03-21 19:23:58 +08005619 session_entry->gLimChannelSwitch.switchMode =
5620 dfs_csa_ie_req->ch_switch_mode;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005621
5622 /*
5623 * Validate if SAP is operating HT or VHT mode and set the Channel
5624 * Switch Wrapper element with the Wide Band Switch subelement.
5625 */
5626 if (true != session_entry->vhtCapability)
5627 goto skip_vht;
5628
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005629 /* Now encode the Wider Ch BW element depending on the ch width */
5630 wider_bw_ch_switch = &session_entry->gLimWiderBWChannelSwitch;
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08005631 switch (dfs_csa_ie_req->ch_params.ch_width) {
5632 case CH_WIDTH_20MHZ:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005633 /*
5634 * Wide channel BW sublement in channel wrapper element is not
5635 * required in case of 20 Mhz operation. Currently It is set
5636 * only set in case of 40/80 Mhz Operation.
5637 */
5638 session_entry->dfsIncludeChanWrapperIe = false;
5639 wider_bw_ch_switch->newChanWidth =
5640 WNI_CFG_VHT_CHANNEL_WIDTH_20_40MHZ;
5641 break;
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08005642 case CH_WIDTH_40MHZ:
5643 session_entry->dfsIncludeChanWrapperIe = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005644 wider_bw_ch_switch->newChanWidth =
5645 WNI_CFG_VHT_CHANNEL_WIDTH_20_40MHZ;
5646 break;
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08005647 case CH_WIDTH_80MHZ:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005648 session_entry->dfsIncludeChanWrapperIe = true;
5649 wider_bw_ch_switch->newChanWidth =
5650 WNI_CFG_VHT_CHANNEL_WIDTH_80MHZ;
5651 break;
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08005652 case CH_WIDTH_160MHZ:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005653 session_entry->dfsIncludeChanWrapperIe = true;
5654 wider_bw_ch_switch->newChanWidth =
5655 WNI_CFG_VHT_CHANNEL_WIDTH_160MHZ;
5656 break;
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08005657 case CH_WIDTH_80P80MHZ:
5658 session_entry->dfsIncludeChanWrapperIe = true;
5659 wider_bw_ch_switch->newChanWidth =
5660 WNI_CFG_VHT_CHANNEL_WIDTH_80_PLUS_80MHZ;
Sandeep Puligilla2111d3c2016-02-03 01:46:15 -08005661 /*
5662 * This is not applicable for 20/40/80 Mhz.
5663 * Only used when we support 80+80 Mhz operation.
5664 * In case of 80+80 Mhz, this parameter indicates
5665 * center channel frequency index of 80 Mhz channel of
5666 * frequency segment 1.
5667 */
5668 wider_bw_ch_switch->newCenterChanFreq1 =
5669 dfs_csa_ie_req->ch_params.center_freq_seg1;
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08005670 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005671 default:
5672 session_entry->dfsIncludeChanWrapperIe = false;
5673 /*
5674 * Need to handle 80+80 Mhz Scenario. When 80+80 is supported
5675 * set the gLimWiderBWChannelSwitch.newChanWidth to 3
5676 */
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07005677 pe_err("Invalid Channel Width");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005678 break;
5679 }
5680 /* Fetch the center channel based on the channel width */
5681 wider_bw_ch_switch->newCenterChanFreq0 =
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08005682 dfs_csa_ie_req->ch_params.center_freq_seg0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005683skip_vht:
5684 /* Send CSA IE request from here */
Pragaspathi Thilagaraj934275c2018-08-07 14:55:35 +05305685 lim_send_dfs_chan_sw_ie_update(mac_ctx, session_entry);
Chandrasekaran, Manishekardc351562016-01-11 19:28:52 +05305686
Abhishek Singh8c54e382019-03-19 17:43:43 +05305687 /*
5688 * Wait for MAX_WAIT_FOR_BCN_TX_COMPLETE ms for tx complete for beacon.
5689 * If tx complete for beacon is received before this timer expire,
5690 * stop this timer and then this will be restarted for every beacon
5691 * interval until switchCount become 0 and bcn template with new
5692 * switchCount will be sent to firmware.
5693 * OR
5694 * If no tx complete for beacon is recived till this timer expire
5695 * this will be restarted for every beacon interval until switchCount
5696 * become 0 and bcn template with new switchCount will be sent to
5697 * firmware.
5698 */
5699 pe_debug("start ap_ecsa_timer for %d ms", MAX_WAIT_FOR_BCN_TX_COMPLETE);
5700 status = qdf_mc_timer_start(&session_entry->ap_ecsa_timer,
5701 MAX_WAIT_FOR_BCN_TX_COMPLETE);
5702 if (QDF_IS_STATUS_ERROR(status))
5703 pe_err("cannot start ap_ecsa_timer");
5704
Chandrasekaran, Manishekardc351562016-01-11 19:28:52 +05305705 if (dfs_csa_ie_req->ch_params.ch_width == CH_WIDTH_80MHZ)
5706 ch_offset = BW80;
5707 else
5708 ch_offset = dfs_csa_ie_req->ch_params.sec_ch_offset;
5709
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07005710 pe_debug("IE count:%d chan:%d width:%d wrapper:%d ch_offset:%d",
Chandrasekaran, Manishekardc351562016-01-11 19:28:52 +05305711 session_entry->gLimChannelSwitch.switchCount,
5712 session_entry->gLimChannelSwitch.primaryChannel,
5713 session_entry->gLimChannelSwitch.ch_width,
5714 session_entry->dfsIncludeChanWrapperIe,
5715 ch_offset);
5716
gaolez76d2a162017-03-21 19:23:58 +08005717 /* Send ECSA/CSA Action frame after updating the beacon */
5718 if (CHAN_HOP_ALL_BANDS_ENABLE)
5719 lim_send_chan_switch_action_frame(mac_ctx,
5720 session_entry->gLimChannelSwitch.primaryChannel,
5721 ch_offset, session_entry);
5722 else
5723 send_extended_chan_switch_action_frame(mac_ctx,
5724 session_entry->gLimChannelSwitch.primaryChannel,
5725 ch_offset, session_entry);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005726}
5727
5728/**
Abhishek Singh518323d2015-10-19 17:42:01 +05305729 * lim_process_ext_change_channel()- function to send ECSA
5730 * action frame for STA/CLI .
5731 * @mac_ctx: pointer to global mac structure
5732 * @msg: params from sme for new channel.
5733 *
5734 * This function is called to send ECSA frame for STA/CLI.
5735 *
5736 * Return: void
5737 */
5738
Jeff Johnson83d6c112018-12-02 13:05:00 -08005739static void lim_process_ext_change_channel(struct mac_context *mac_ctx,
Abhishek Singh518323d2015-10-19 17:42:01 +05305740 uint32_t *msg)
5741{
5742 struct sir_sme_ext_cng_chan_req *ext_chng_channel =
5743 (struct sir_sme_ext_cng_chan_req *) msg;
Jeff Johnson209dfa02018-11-18 22:54:38 -08005744 struct pe_session *session_entry = NULL;
Abhishek Singh518323d2015-10-19 17:42:01 +05305745
Jeff Johnson8e9530b2019-03-18 13:41:42 -07005746 if (!msg) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07005747 pe_err("Buffer is Pointing to NULL");
Abhishek Singh518323d2015-10-19 17:42:01 +05305748 return;
5749 }
5750 session_entry =
5751 pe_find_session_by_sme_session_id(mac_ctx,
5752 ext_chng_channel->session_id);
Jeff Johnson8e9530b2019-03-18 13:41:42 -07005753 if (!session_entry) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07005754 pe_err("Session not found for given session %d",
Abhishek Singh518323d2015-10-19 17:42:01 +05305755 ext_chng_channel->session_id);
5756 return;
5757 }
5758 if (LIM_IS_AP_ROLE(session_entry)) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07005759 pe_err("not an STA/CLI session");
Abhishek Singh518323d2015-10-19 17:42:01 +05305760 return;
5761 }
5762 send_extended_chan_switch_action_frame(mac_ctx,
5763 ext_chng_channel->new_channel,
5764 0, session_entry);
5765}
5766
5767/**
Abhishek Singhfc740be2018-10-12 11:34:26 +05305768 * lim_nss_update_rsp() - send NSS update response to SME
5769 * @mac_ctx Pointer to Global MAC structure
5770 * @vdev_id: vdev id
5771 * @status: nss update status
5772 *
5773 * Return: None
5774 */
Jeff Johnson83d6c112018-12-02 13:05:00 -08005775static void lim_nss_update_rsp(struct mac_context *mac_ctx,
Abhishek Singhfc740be2018-10-12 11:34:26 +05305776 uint8_t vdev_id, QDF_STATUS status)
5777{
5778 struct scheduler_msg msg = {0};
5779 struct sir_bcn_update_rsp *nss_rsp;
5780 QDF_STATUS qdf_status;
5781
5782 nss_rsp = qdf_mem_malloc(sizeof(*nss_rsp));
5783 if (!nss_rsp) {
5784 pe_err("AllocateMemory failed for nss_rsp");
5785 return;
5786 }
5787
5788 nss_rsp->vdev_id = vdev_id;
5789 nss_rsp->status = status;
5790 nss_rsp->reason = REASON_NSS_UPDATE;
5791
5792 msg.type = eWNI_SME_NSS_UPDATE_RSP;
5793 msg.bodyptr = nss_rsp;
5794 msg.bodyval = 0;
5795 qdf_status = scheduler_post_message(QDF_MODULE_ID_PE, QDF_MODULE_ID_SME,
5796 QDF_MODULE_ID_SME, &msg);
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05305797 if (QDF_IS_STATUS_ERROR(qdf_status))
Abhishek Singhfc740be2018-10-12 11:34:26 +05305798 qdf_mem_free(nss_rsp);
Abhishek Singhfc740be2018-10-12 11:34:26 +05305799}
5800
Jeff Johnson83d6c112018-12-02 13:05:00 -08005801void lim_send_bcn_rsp(struct mac_context *mac_ctx, tpSendbeaconParams rsp)
Abhishek Singhfc740be2018-10-12 11:34:26 +05305802{
5803 if (!rsp) {
5804 pe_err("rsp is NULL");
5805 return;
5806 }
5807
5808 pe_debug("Send beacon resp status %d for reason %d",
5809 rsp->status, rsp->reason);
5810
5811 if (rsp->reason == REASON_NSS_UPDATE)
5812 lim_nss_update_rsp(mac_ctx, rsp->vdev_id, rsp->status);
5813}
5814
5815/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005816 * lim_process_nss_update_request() - process sme nss update req
5817 *
5818 * @mac_ctx: Pointer to Global MAC structure
5819 * @msg_buf: pointer to the SME message buffer
5820 *
5821 * This function processes SME request messages from HDD or upper layer
5822 * application.
5823 *
5824 * Return: None
5825 */
Jeff Johnson83d6c112018-12-02 13:05:00 -08005826static void lim_process_nss_update_request(struct mac_context *mac_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005827 uint32_t *msg_buf)
5828{
5829 struct sir_nss_update_request *nss_update_req_ptr;
Jeff Johnson209dfa02018-11-18 22:54:38 -08005830 struct pe_session *session_entry = NULL;
Abhishek Singhfc740be2018-10-12 11:34:26 +05305831 QDF_STATUS status = QDF_STATUS_E_FAILURE;
5832 uint8_t vdev_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005833
Abhishek Singhfc740be2018-10-12 11:34:26 +05305834 if (!msg_buf) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07005835 pe_err("Buffer is Pointing to NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005836 return;
5837 }
5838
5839 nss_update_req_ptr = (struct sir_nss_update_request *)msg_buf;
Abhishek Singhfc740be2018-10-12 11:34:26 +05305840 vdev_id = nss_update_req_ptr->vdev_id;
Chandrasekaran, Manishekar5738eb02016-02-02 12:22:00 +05305841 session_entry = pe_find_session_by_sme_session_id(mac_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005842 nss_update_req_ptr->vdev_id);
Abhishek Singhfc740be2018-10-12 11:34:26 +05305843 if (!session_entry) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07005844 pe_err("Session not found for given session_id %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005845 nss_update_req_ptr->vdev_id);
Abhishek Singhfc740be2018-10-12 11:34:26 +05305846 goto end;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005847 }
5848
5849 if (session_entry->valid && !LIM_IS_AP_ROLE(session_entry)) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07005850 pe_err("Invalid SystemRole %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005851 GET_LIM_SYSTEM_ROLE(session_entry));
Abhishek Singhfc740be2018-10-12 11:34:26 +05305852 goto end;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005853 }
5854
5855 /* populate nss field in the beacon */
5856 session_entry->gLimOperatingMode.present = 1;
5857 session_entry->gLimOperatingMode.rxNSS = nss_update_req_ptr->new_nss;
Ganesh Kondabattini5e0ac2a2017-05-16 14:29:32 +05305858 session_entry->gLimOperatingMode.chanWidth = session_entry->ch_width;
5859
5860 if ((nss_update_req_ptr->new_nss == NSS_1x1_MODE) &&
5861 (session_entry->ch_width > CH_WIDTH_80MHZ))
5862 session_entry->gLimOperatingMode.chanWidth = CH_WIDTH_80MHZ;
5863
Abhishek Singhfc740be2018-10-12 11:34:26 +05305864 pe_debug("ch width %d Rx NSS %d",
5865 session_entry->gLimOperatingMode.chanWidth,
5866 session_entry->gLimOperatingMode.rxNSS);
Ganesh Kondabattini5e0ac2a2017-05-16 14:29:32 +05305867
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005868 /* Send nss update request from here */
Abhishek Singhfc740be2018-10-12 11:34:26 +05305869 status = sch_set_fixed_beacon_fields(mac_ctx, session_entry);
5870 if (QDF_IS_STATUS_ERROR(status)) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07005871 pe_err("Unable to set op mode IE in beacon");
Abhishek Singhfc740be2018-10-12 11:34:26 +05305872 goto end;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005873 }
5874
Abhishek Singhfc740be2018-10-12 11:34:26 +05305875 status = lim_send_beacon_ind(mac_ctx, session_entry, REASON_NSS_UPDATE);
5876 if (QDF_IS_STATUS_SUCCESS(status))
5877 return;
5878
5879 pe_err("Unable to send beacon");
5880end:
5881 /*
5882 * send resp only in case of failure,
5883 * success case response will be from wma.
5884 */
5885 lim_nss_update_rsp(mac_ctx, vdev_id, status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005886}
5887
5888/**
5889 * lim_process_set_ie_req() - process sme set IE request
5890 *
5891 * @mac_ctx: Pointer to Global MAC structure
5892 * @msg_buf: pointer to the SME message buffer
5893 *
5894 * This function processes SME request messages from HDD or upper layer
5895 * application.
5896 *
5897 * Return: None
5898 */
Jeff Johnson83d6c112018-12-02 13:05:00 -08005899static void lim_process_set_ie_req(struct mac_context *mac_ctx, uint32_t *msg_buf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005900{
5901 struct send_extcap_ie *msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305902 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005903
Jeff Johnson8e9530b2019-03-18 13:41:42 -07005904 if (!msg_buf) {
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07005905 pe_err("Buffer is Pointing to NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005906 return;
5907 }
5908
5909 msg = (struct send_extcap_ie *)msg_buf;
5910 status = lim_send_ext_cap_ie(mac_ctx, msg->session_id, NULL, false);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305911 if (QDF_STATUS_SUCCESS != status)
Srinivas Girigowda15b355e2017-03-26 21:51:00 -07005912 pe_err("Unable to send ExtCap to FW");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005913
5914}
Kiran Kumar Lokeree6476b22017-10-16 23:40:32 -07005915
5916#ifdef WLAN_FEATURE_11AX_BSS_COLOR
Arif Hussain05fb4872018-01-03 16:02:55 -08005917
5918/**
5919 * obss_color_collision_process_color_disable() - Disable bss color
5920 * @mac_ctx: Pointer to Global MAC structure
5921 * @session: pointer to session
5922 *
5923 * This function will disbale bss color.
5924 *
5925 * Return: None
5926 */
Jeff Johnson83d6c112018-12-02 13:05:00 -08005927static void obss_color_collision_process_color_disable(struct mac_context *mac_ctx,
Jeff Johnson209dfa02018-11-18 22:54:38 -08005928 struct pe_session *session)
Arif Hussain05fb4872018-01-03 16:02:55 -08005929{
5930 tUpdateBeaconParams beacon_params;
5931
5932 if (!session) {
5933 pe_err("Invalid session");
5934 return;
5935 }
5936
5937 if (session->valid && !LIM_IS_AP_ROLE(session)) {
5938 pe_err("Invalid SystemRole %d",
5939 GET_LIM_SYSTEM_ROLE(session));
5940 return;
5941 }
5942
5943 if (session->bss_color_changing == 1) {
5944 pe_warn("%d: color change in progress", session->smeSessionId);
5945 /* Continue color collision detection */
5946 lim_send_obss_color_collision_cfg(mac_ctx, session,
5947 OBSS_COLOR_COLLISION_DETECTION);
5948 return;
5949 }
5950
5951 if (session->he_op.bss_col_disabled == 1) {
5952 pe_warn("%d: bss color already disabled",
5953 session->smeSessionId);
5954 /* Continue free color detection */
5955 lim_send_obss_color_collision_cfg(mac_ctx, session,
5956 OBSS_COLOR_FREE_SLOT_AVAILABLE);
5957 return;
5958 }
5959
5960 qdf_mem_zero(&beacon_params, sizeof(beacon_params));
5961 beacon_params.paramChangeBitmap |= PARAM_BSS_COLOR_CHANGED;
5962 session->he_op.bss_col_disabled = 1;
Arif Hussain05fb4872018-01-03 16:02:55 -08005963 beacon_params.bss_color_disabled = 1;
Arif Hussain2f2d3512018-03-06 12:37:03 -08005964 beacon_params.bss_color = session->he_op.bss_color;
Arif Hussain05fb4872018-01-03 16:02:55 -08005965
5966 if (sch_set_fixed_beacon_fields(mac_ctx, session) !=
Jeff Johnson0301ecb2018-06-29 09:36:23 -07005967 QDF_STATUS_SUCCESS) {
Arif Hussain05fb4872018-01-03 16:02:55 -08005968 pe_err("Unable to set op mode IE in beacon");
5969 return;
5970 }
5971
5972 lim_send_beacon_params(mac_ctx, &beacon_params, session);
5973 lim_send_obss_color_collision_cfg(mac_ctx, session,
5974 OBSS_COLOR_FREE_SLOT_AVAILABLE);
5975}
5976
5977/**
5978 * obss_color_collision_process_color_change() - Process bss color change
5979 * @mac_ctx: Pointer to Global MAC structure
5980 * @session: pointer to session
5981 * @obss_color_info: obss color collision/free slot indication info
5982 *
5983 * This function selects new color ib case of bss color collision.
5984 *
5985 * Return: None
5986 */
Jeff Johnson83d6c112018-12-02 13:05:00 -08005987static void obss_color_collision_process_color_change(struct mac_context *mac_ctx,
Jeff Johnson209dfa02018-11-18 22:54:38 -08005988 struct pe_session *session,
Arif Hussain05fb4872018-01-03 16:02:55 -08005989 struct wmi_obss_color_collision_info *obss_color_info)
5990{
5991 int i, num_bss_color = 0;
5992 uint32_t bss_color_bitmap;
5993 uint8_t bss_color_index_array[MAX_BSS_COLOR_VALUE];
5994 uint32_t rand_byte = 0;
5995 struct sir_set_he_bss_color he_bss_color;
5996 bool is_color_collision = false;
5997
5998
5999 if (session->bss_color_changing == 1) {
6000 pe_err("%d: color change in progress", session->smeSessionId);
6001 return;
6002 }
6003
6004 if (!session->he_op.bss_col_disabled) {
6005 if (session->he_op.bss_color < 32)
6006 is_color_collision = (obss_color_info->
6007 obss_color_bitmap_bit0to31 >>
6008 session->he_op.bss_color) & 0x01;
6009 else
6010 is_color_collision = (obss_color_info->
6011 obss_color_bitmap_bit32to63 >>
6012 (session->he_op.bss_color -
Arif Hussain9e8c5612018-04-12 16:35:48 -07006013 32)) & 0x01;
Arif Hussain05fb4872018-01-03 16:02:55 -08006014 if (!is_color_collision) {
6015 pe_err("%d: color collision not found, curr_color: %d",
6016 session->smeSessionId,
6017 session->he_op.bss_color);
6018 return;
6019 }
6020 }
6021
6022 bss_color_bitmap = obss_color_info->obss_color_bitmap_bit0to31;
6023
6024 /* Skip color zero */
6025 bss_color_bitmap = bss_color_bitmap >> 1;
6026 for (i = 0; (i < 31) && (num_bss_color < MAX_BSS_COLOR_VALUE); i++) {
6027 if (!(bss_color_bitmap & 0x01)) {
6028 bss_color_index_array[num_bss_color] = i + 1;
6029 num_bss_color++;
6030 }
6031 bss_color_bitmap = bss_color_bitmap >> 1;
6032 }
6033
6034 bss_color_bitmap = obss_color_info->obss_color_bitmap_bit32to63;
6035 for (i = 0; (i < 32) && (num_bss_color < MAX_BSS_COLOR_VALUE); i++) {
6036 if (!(bss_color_bitmap & 0x01)) {
6037 bss_color_index_array[num_bss_color] = i + 32;
6038 num_bss_color++;
6039 }
6040 bss_color_bitmap = bss_color_bitmap >> 1;
6041 }
6042
6043 if (num_bss_color) {
6044 qdf_get_random_bytes((void *) &rand_byte, 1);
6045 i = (rand_byte + qdf_mc_timer_get_system_ticks()) %
6046 num_bss_color;
6047 pe_debug("New bss color = %d", bss_color_index_array[i]);
6048 he_bss_color.session_id = obss_color_info->vdev_id;
6049 he_bss_color.bss_color = bss_color_index_array[i];
6050 lim_process_set_he_bss_color(mac_ctx,
6051 (uint32_t *)&he_bss_color);
6052 } else {
6053 pe_err("Unable to find bss color from bitmasp");
6054 if (obss_color_info->evt_type ==
6055 OBSS_COLOR_FREE_SLOT_TIMER_EXPIRY &&
6056 session->obss_color_collision_dec_evt ==
6057 OBSS_COLOR_FREE_SLOT_TIMER_EXPIRY)
6058 /* In dot11BSSColorCollisionAPPeriod and
6059 * timer expired, time to disable bss color.
6060 */
6061 obss_color_collision_process_color_disable(mac_ctx,
6062 session);
6063 else
6064 /*
6065 * Enter dot11BSSColorCollisionAPPeriod period.
6066 */
6067 lim_send_obss_color_collision_cfg(mac_ctx, session,
6068 OBSS_COLOR_FREE_SLOT_TIMER_EXPIRY);
6069 }
6070}
6071
Jeff Johnson83d6c112018-12-02 13:05:00 -08006072void lim_process_set_he_bss_color(struct mac_context *mac_ctx, uint32_t *msg_buf)
Kiran Kumar Lokeree6476b22017-10-16 23:40:32 -07006073{
6074 struct sir_set_he_bss_color *bss_color;
Jeff Johnson209dfa02018-11-18 22:54:38 -08006075 struct pe_session *session_entry = NULL;
Kiran Kumar Lokeree6476b22017-10-16 23:40:32 -07006076 tUpdateBeaconParams beacon_params;
6077
6078 if (!msg_buf) {
6079 pe_err("Buffer is Pointing to NULL");
6080 return;
6081 }
6082
6083 bss_color = (struct sir_set_he_bss_color *)msg_buf;
6084 session_entry = pe_find_session_by_sme_session_id(mac_ctx,
6085 bss_color->session_id);
6086 if (!session_entry) {
6087 pe_err("Session not found for given session_id %d",
6088 bss_color->session_id);
6089 return;
6090 }
6091
6092 if (session_entry->valid && !LIM_IS_AP_ROLE(session_entry)) {
6093 pe_err("Invalid SystemRole %d",
6094 GET_LIM_SYSTEM_ROLE(session_entry));
6095 return;
6096 }
6097
6098 if (bss_color->bss_color == session_entry->he_op.bss_color) {
6099 pe_err("No change in BSS color, current BSS color %d",
6100 bss_color->bss_color);
6101 return;
6102 }
6103 qdf_mem_zero(&beacon_params, sizeof(beacon_params));
6104 beacon_params.paramChangeBitmap |= PARAM_BSS_COLOR_CHANGED;
6105 session_entry->he_op.bss_col_disabled = 1;
6106 session_entry->he_bss_color_change.countdown =
6107 BSS_COLOR_SWITCH_COUNTDOWN;
6108 session_entry->he_bss_color_change.new_color = bss_color->bss_color;
Arif Hussain2f2d3512018-03-06 12:37:03 -08006109 beacon_params.bss_color_disabled = 1;
6110 beacon_params.bss_color = session_entry->he_op.bss_color;
Kiran Kumar Lokeree6476b22017-10-16 23:40:32 -07006111 session_entry->bss_color_changing = 1;
6112
6113 if (sch_set_fixed_beacon_fields(mac_ctx, session_entry) !=
Jeff Johnson0301ecb2018-06-29 09:36:23 -07006114 QDF_STATUS_SUCCESS) {
Kiran Kumar Lokeree6476b22017-10-16 23:40:32 -07006115 pe_err("Unable to set op mode IE in beacon");
6116 return;
6117 }
6118
6119 lim_send_beacon_params(mac_ctx, &beacon_params, session_entry);
Arif Hussain05fb4872018-01-03 16:02:55 -08006120 lim_send_obss_color_collision_cfg(mac_ctx, session_entry,
6121 OBSS_COLOR_COLLISION_DETECTION_DISABLE);
6122}
6123
Jeff Johnson83d6c112018-12-02 13:05:00 -08006124void lim_send_obss_color_collision_cfg(struct mac_context *mac_ctx,
Jeff Johnson209dfa02018-11-18 22:54:38 -08006125 struct pe_session *session,
Arif Hussain05fb4872018-01-03 16:02:55 -08006126 enum wmi_obss_color_collision_evt_type
6127 event_type)
6128{
6129 struct wmi_obss_color_collision_cfg_param *cfg_param;
6130 struct scheduler_msg msg = {0};
6131
6132 if (!session) {
6133 pe_err("Invalid session");
6134 return;
6135 }
6136
6137 if (!session->he_capable ||
6138 !session->is_session_obss_color_collision_det_enabled) {
6139 pe_debug("%d: obss color det not enabled, he_cap:%d, sup:%d:%d",
6140 session->smeSessionId, session->he_capable,
6141 session->is_session_obss_color_collision_det_enabled,
Wu Gao5f764082019-01-04 15:54:38 +08006142 mac_ctx->mlme_cfg->obss_ht40.
6143 obss_color_collision_offload_enabled);
Arif Hussain05fb4872018-01-03 16:02:55 -08006144 return;
6145 }
6146
6147 cfg_param = qdf_mem_malloc(sizeof(*cfg_param));
Arif Hussainf5b6c412018-10-10 19:41:09 -07006148 if (!cfg_param)
Arif Hussain05fb4872018-01-03 16:02:55 -08006149 return;
Arif Hussain05fb4872018-01-03 16:02:55 -08006150
6151 pe_debug("%d: sending event:%d", session->smeSessionId, event_type);
6152 qdf_mem_zero(cfg_param, sizeof(*cfg_param));
6153 cfg_param->vdev_id = session->smeSessionId;
6154 cfg_param->evt_type = event_type;
6155 if (LIM_IS_AP_ROLE(session))
6156 cfg_param->detection_period_ms =
6157 OBSS_COLOR_COLLISION_DETECTION_AP_PERIOD_MS;
6158 else
6159 cfg_param->detection_period_ms =
6160 OBSS_COLOR_COLLISION_DETECTION_STA_PERIOD_MS;
6161
6162 cfg_param->scan_period_ms = OBSS_COLOR_COLLISION_SCAN_PERIOD_MS;
6163 if (event_type == OBSS_COLOR_FREE_SLOT_TIMER_EXPIRY)
6164 cfg_param->free_slot_expiry_time_ms =
6165 OBSS_COLOR_COLLISION_FREE_SLOT_EXPIRY_MS;
6166
6167 msg.type = WMA_OBSS_COLOR_COLLISION_REQ;
6168 msg.bodyptr = cfg_param;
6169 msg.reserved = 0;
6170
gaurank kathpalia3a7f25b2018-08-28 16:26:39 +05306171 if (QDF_IS_STATUS_ERROR(scheduler_post_message(QDF_MODULE_ID_PE,
6172 QDF_MODULE_ID_WMA,
6173 QDF_MODULE_ID_WMA,
6174 &msg))) {
Arif Hussain05fb4872018-01-03 16:02:55 -08006175 qdf_mem_free(cfg_param);
6176 } else {
6177 session->obss_color_collision_dec_evt = event_type;
6178 }
6179}
6180
Jeff Johnson83d6c112018-12-02 13:05:00 -08006181void lim_process_obss_color_collision_info(struct mac_context *mac_ctx,
Arif Hussain05fb4872018-01-03 16:02:55 -08006182 uint32_t *msg_buf)
6183{
6184 struct wmi_obss_color_collision_info *obss_color_info;
Jeff Johnson209dfa02018-11-18 22:54:38 -08006185 struct pe_session *session;
Arif Hussain05fb4872018-01-03 16:02:55 -08006186
6187 if (!msg_buf) {
6188 pe_err("Buffer is Pointing to NULL");
6189 return;
6190 }
6191
6192 obss_color_info = (struct wmi_obss_color_collision_info *)msg_buf;
6193 session = pe_find_session_by_sme_session_id(mac_ctx,
6194 obss_color_info->vdev_id);
6195 if (!session) {
6196 pe_err("Session not found for given session_id %d",
6197 obss_color_info->vdev_id);
6198 return;
6199 }
6200
6201 pe_debug("vdev_id:%d, evt:%d:%d, 0to31:0x%x, 32to63:0x%x, cap:%d:%d:%d",
6202 obss_color_info->vdev_id,
6203 obss_color_info->evt_type,
6204 session->obss_color_collision_dec_evt,
6205 obss_color_info->obss_color_bitmap_bit0to31,
6206 obss_color_info->obss_color_bitmap_bit32to63,
6207 session->he_capable,
6208 session->is_session_obss_color_collision_det_enabled,
Wu Gao5f764082019-01-04 15:54:38 +08006209 mac_ctx->mlme_cfg->obss_ht40.
6210 obss_color_collision_offload_enabled);
Arif Hussain05fb4872018-01-03 16:02:55 -08006211
6212 if (!session->he_capable ||
6213 !session->is_session_obss_color_collision_det_enabled) {
6214 return;
6215 }
6216
6217 switch (obss_color_info->evt_type) {
6218 case OBSS_COLOR_COLLISION_DETECTION_DISABLE:
6219 pe_err("%d: FW disabled obss color det. he_cap:%d, sup:%d:%d",
6220 session->smeSessionId, session->he_capable,
6221 session->is_session_obss_color_collision_det_enabled,
Wu Gao5f764082019-01-04 15:54:38 +08006222 mac_ctx->mlme_cfg->obss_ht40.
6223 obss_color_collision_offload_enabled);
Arif Hussain05fb4872018-01-03 16:02:55 -08006224 session->is_session_obss_color_collision_det_enabled = false;
6225 return;
6226 case OBSS_COLOR_FREE_SLOT_AVAILABLE:
6227 case OBSS_COLOR_COLLISION_DETECTION:
6228 case OBSS_COLOR_FREE_SLOT_TIMER_EXPIRY:
6229 if (session->valid && !LIM_IS_AP_ROLE(session)) {
6230 pe_debug("Invalid System Role %d",
6231 GET_LIM_SYSTEM_ROLE(session));
6232 return;
6233 }
6234
6235 if (session->obss_color_collision_dec_evt !=
6236 obss_color_info->evt_type) {
6237 pe_debug("%d: Wrong event: %d, skiping",
6238 obss_color_info->vdev_id,
6239 obss_color_info->evt_type);
6240 return;
6241 }
6242 obss_color_collision_process_color_change(mac_ctx, session,
6243 obss_color_info);
6244 break;
6245 default:
6246 pe_err("%d: Invalid event type %d",
6247 obss_color_info->vdev_id, obss_color_info->evt_type);
6248 return;
6249 }
Kiran Kumar Lokeree6476b22017-10-16 23:40:32 -07006250}
6251#endif
Abhishek Singh20a8e442018-09-12 15:50:44 +05306252
Jeff Johnson83d6c112018-12-02 13:05:00 -08006253void lim_send_csa_restart_req(struct mac_context *mac_ctx, uint8_t vdev_id)
Abhishek Singh20a8e442018-09-12 15:50:44 +05306254{
Jeff Johnson209dfa02018-11-18 22:54:38 -08006255 struct pe_session *session;
Abhishek Singh20a8e442018-09-12 15:50:44 +05306256
6257 session = pe_find_session_by_sme_session_id(mac_ctx, vdev_id);
6258
6259 if (!session) {
6260 pe_err("session not found for vdev id %d", vdev_id);
6261 return;
6262 }
6263
6264 wlan_vdev_mlme_sm_deliver_evt(session->vdev,
6265 WLAN_VDEV_SM_EV_CSA_RESTART,
6266 sizeof(*session), session);
6267}
Pragaspathi Thilagaraj30251ec2018-12-18 17:22:57 +05306268
Abhishek Singhbc4261f2019-03-14 13:21:57 +05306269void lim_continue_sta_csa_req(struct mac_context *mac_ctx, uint8_t vdev_id)
6270{
6271 pe_info("Continue CSA for STA vdev id %d", vdev_id);
6272 lim_process_channel_switch_timeout(mac_ctx);
6273}
6274
Pragaspathi Thilagaraj30251ec2018-12-18 17:22:57 +05306275void lim_add_roam_blacklist_ap(struct mac_context *mac_ctx,
6276 struct roam_blacklist_event *src_lst)
6277{
6278 uint32_t i;
gaurank kathpalia3ebc17b2019-05-29 10:25:09 +05306279 struct sir_rssi_disallow_lst entry;
Pragaspathi Thilagaraj30251ec2018-12-18 17:22:57 +05306280 struct roam_blacklist_timeout *blacklist;
Pragaspathi Thilagaraj30251ec2018-12-18 17:22:57 +05306281
6282 blacklist = &src_lst->roam_blacklist[0];
6283 for (i = 0; i < src_lst->num_entries; i++) {
Pragaspathi Thilagaraj30251ec2018-12-18 17:22:57 +05306284
gaurank kathpalia3ebc17b2019-05-29 10:25:09 +05306285 entry.bssid = blacklist->bssid;
6286 entry.retry_delay = blacklist->timeout;
6287 entry.time_during_rejection = blacklist->received_time;
Pragaspathi Thilagaraj30251ec2018-12-18 17:22:57 +05306288 /* set 0dbm as expected rssi for btm blaclisted entries */
gaurank kathpalia3ebc17b2019-05-29 10:25:09 +05306289 entry.expected_rssi = LIM_MIN_RSSI;
Jingxiang Gef95dc4d2019-02-26 14:20:31 +08006290
gaurank kathpalia3ebc17b2019-05-29 10:25:09 +05306291 /* Add this bssid to the rssi reject ap type in blacklist mgr */
6292 lim_add_bssid_to_reject_list(mac_ctx->pdev, &entry);
Pragaspathi Thilagaraj30251ec2018-12-18 17:22:57 +05306293 }
6294}