blob: ca3fcf83e3c6b991450ccf9353f643674ad64636 [file] [log] [blame]
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001/*
Kiran Kumar Lokere27026ae2018-03-09 11:38:19 -08002 * Copyright (c) 2011-2018 The Linux Foundation. All rights reserved.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003 *
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004 * Permission to use, copy, modify, and/or distribute this software for
5 * any purpose with or without fee is hereby granted, provided that the
6 * above copyright notice and this permission notice appear in all
7 * copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
10 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
11 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
12 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
13 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
14 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
15 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16 * PERFORMANCE OF THIS SOFTWARE.
17 */
18
19/*
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080020 *
21 * This file lim_process_assoc_rsp_frame.cc contains the code
22 * for processing Re/Association Response Frame.
23 * Author: Chandra Modumudi
24 * Date: 03/18/02
25 * History:-
26 * Date Modified by Modification Information
27 * --------------------------------------------------------------------
28 *
29 */
30
31#include "wni_api.h"
32#include "wni_cfg.h"
33#include "ani_global.h"
34#include "cfg_api.h"
35#include "sch_api.h"
36
37#include "utils_api.h"
38#include "lim_types.h"
39#include "lim_utils.h"
40#include "lim_assoc_utils.h"
41#include "lim_security_utils.h"
42#include "lim_ser_des_utils.h"
43#include "lim_sta_hash_api.h"
44#include "lim_send_messages.h"
Sridhar Selvaraj0d5d2c72017-08-17 17:30:01 +053045#include "lim_process_fils.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080046
Jeff Johnson9320c1e2018-12-02 13:09:20 -080047extern QDF_STATUS sch_beacon_edca_process(struct mac_context *mac,
Jeff Johnsonb5c13332018-12-03 09:54:51 -080048 tSirMacEdcaParamSetIE *edca, struct pe_session *pe_session);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080049
50/**
51 * lim_update_stads_htcap() - Updates station Descriptor HT capability
52 * @mac_ctx: Pointer to Global MAC structure
53 * @sta_ds: Station Descriptor in DPH
54 * @assoc_rsp: Pointer to Association Response Structure
Kanchanapally, Vidyullathae3062812015-05-22 17:28:57 +053055 * @session_entry : PE session Entry
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080056 *
57 * This function is called to Update the HT capabilities in
58 * Station Descriptor (dph) Details from
59 * Association / ReAssociation Response Frame
60 *
61 * Return: None
62 */
Jeff Johnson9320c1e2018-12-02 13:09:20 -080063static void lim_update_stads_htcap(struct mac_context *mac_ctx,
Kanchanapally, Vidyullathae3062812015-05-22 17:28:57 +053064 tpDphHashNode sta_ds, tpSirAssocRsp assoc_rsp,
Jeff Johnson82e779e2018-11-19 06:52:11 -080065 struct pe_session *session_entry)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080066{
67 uint16_t highest_rxrate = 0;
68 tDot11fIEHTCaps *ht_caps;
69
70 ht_caps = &assoc_rsp->HTCaps;
71 sta_ds->mlmStaContext.htCapability = assoc_rsp->HTCaps.present;
72 if (assoc_rsp->HTCaps.present) {
73 sta_ds->htGreenfield =
74 (uint8_t) ht_caps->greenField;
Kanchanapally, Vidyullathae3062812015-05-22 17:28:57 +053075 if (session_entry->htSupportedChannelWidthSet) {
76 sta_ds->htSupportedChannelWidthSet =
77 (uint8_t) (ht_caps->supportedChannelWidthSet ?
78 assoc_rsp->HTInfo.recommendedTxWidthSet :
79 ht_caps->supportedChannelWidthSet);
80 } else
81 sta_ds->htSupportedChannelWidthSet =
82 eHT_CHANNEL_WIDTH_20MHZ;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080083 sta_ds->htLsigTXOPProtection =
84 (uint8_t) ht_caps->lsigTXOPProtection;
85 sta_ds->htMIMOPSState =
86 (tSirMacHTMIMOPowerSaveState)ht_caps->mimoPowerSave;
87 sta_ds->htMaxAmsduLength =
88 (uint8_t) ht_caps->maximalAMSDUsize;
89 sta_ds->htAMpduDensity = ht_caps->mpduDensity;
90 sta_ds->htDsssCckRate40MHzSupport =
91 (uint8_t) ht_caps->dsssCckMode40MHz;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080092 sta_ds->htMaxRxAMpduFactor =
93 ht_caps->maxRxAMPDUFactor;
94 lim_fill_rx_highest_supported_rate(mac_ctx, &highest_rxrate,
95 ht_caps->supportedMCSSet);
96 sta_ds->supportedRates.rxHighestDataRate =
97 highest_rxrate;
98 /*
99 * This is for AP as peer STA and we are INFRA STA
100 *.We will put APs offset in dph node which is peer STA
101 */
102 sta_ds->htSecondaryChannelOffset =
103 (uint8_t) assoc_rsp->HTInfo.secondaryChannelOffset;
104 /*
105 * FIXME_AMPDU
106 * In the future, may need to check for
107 * "assoc.HTCaps.delayedBA"
108 * For now, it is IMMEDIATE BA only on ALL TID's
109 */
110 sta_ds->baPolicyFlag = 0xFF;
Kanchanapally, Vidyullathae3062812015-05-22 17:28:57 +0530111
112 /* Check if we have support for gShortGI20Mhz and
113 * gShortGI40Mhz from ini file
114 */
Sandeep Puligilla607f34a2016-05-25 14:37:47 -0700115 if (session_entry->htConfig.ht_sgi20)
Kanchanapally, Vidyullathae3062812015-05-22 17:28:57 +0530116 sta_ds->htShortGI20Mhz =
Sandeep Puligilla607f34a2016-05-25 14:37:47 -0700117 (uint8_t)assoc_rsp->HTCaps.shortGI20MHz;
118 else
119 sta_ds->htShortGI20Mhz = false;
Kanchanapally, Vidyullathae3062812015-05-22 17:28:57 +0530120
Sandeep Puligilla607f34a2016-05-25 14:37:47 -0700121 if (session_entry->htConfig.ht_sgi40)
Kanchanapally, Vidyullathae3062812015-05-22 17:28:57 +0530122 sta_ds->htShortGI40Mhz =
Sandeep Puligilla607f34a2016-05-25 14:37:47 -0700123 (uint8_t)assoc_rsp->HTCaps.shortGI40MHz;
124 else
125 sta_ds->htShortGI40Mhz = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800126 }
127}
128
129/**
130 * lim_update_assoc_sta_datas() - Updates station Descriptor
131 * mac_ctx: Pointer to Global MAC structure
132 * sta_ds: Station Descriptor in DPH
133 * assoc_rsp: Pointer to Association Response Structure
134 * session_entry : PE session Entry
135 *
136 * This function is called to Update the Station Descriptor (dph) Details from
137 * Association / ReAssociation Response Frame
138 *
139 * Return: None
140 */
Jeff Johnson9320c1e2018-12-02 13:09:20 -0800141void lim_update_assoc_sta_datas(struct mac_context *mac_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800142 tpDphHashNode sta_ds, tpSirAssocRsp assoc_rsp,
Jeff Johnson82e779e2018-11-19 06:52:11 -0800143 struct pe_session *session_entry)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800144{
145 uint32_t phy_mode;
146 bool qos_mode;
147 tDot11fIEVHTCaps *vht_caps = NULL;
Naveen Rawatd8feac12017-09-08 15:08:39 -0700148 tDot11fIEhe_cap *he_cap = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800149
150 lim_get_phy_mode(mac_ctx, &phy_mode, session_entry);
151 sta_ds->staType = STA_ENTRY_SELF;
152 limGetQosMode(session_entry, &qos_mode);
153 sta_ds->mlmStaContext.authType = session_entry->limCurrentAuthType;
154
155 /* Add capabilities information, rates and AID */
156 sta_ds->mlmStaContext.capabilityInfo = assoc_rsp->capabilityInfo;
157 sta_ds->shortPreambleEnabled =
158 (uint8_t) assoc_rsp->capabilityInfo.shortPreamble;
159
Jeff Johnson118a4a02018-05-06 00:14:15 -0700160 /* Update HT Capabilities only when the self mode supports HT */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800161 if (IS_DOT11_MODE_HT(session_entry->dot11mode))
Kanchanapally, Vidyullathae3062812015-05-22 17:28:57 +0530162 lim_update_stads_htcap(mac_ctx, sta_ds, assoc_rsp,
163 session_entry);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800164
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800165 if (assoc_rsp->VHTCaps.present)
166 vht_caps = &assoc_rsp->VHTCaps;
Kapil Gupta4b2efbb2016-10-03 13:07:20 +0530167 else if (assoc_rsp->vendor_vht_ie.VHTCaps.present)
168 vht_caps = &assoc_rsp->vendor_vht_ie.VHTCaps;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800169
170 if (IS_DOT11_MODE_VHT(session_entry->dot11mode)) {
171 if ((vht_caps != NULL) && vht_caps->present) {
172 sta_ds->mlmStaContext.vhtCapability =
173 vht_caps->present;
174 /*
175 * If 11ac is supported and if the peer is
176 * sending VHT capabilities,
177 * then htMaxRxAMpduFactor should be
178 * overloaded with VHT maxAMPDULenExp
179 */
180 sta_ds->htMaxRxAMpduFactor = vht_caps->maxAMPDULenExp;
181 if (session_entry->htSupportedChannelWidthSet) {
182 if (assoc_rsp->VHTOperation.present)
183 sta_ds->vhtSupportedChannelWidthSet =
184 assoc_rsp->VHTOperation.chanWidth;
185 else
186 sta_ds->vhtSupportedChannelWidthSet =
187 eHT_CHANNEL_WIDTH_40MHZ;
188 }
189 }
190 }
Krishna Kumaar Natarajand1cd56e2016-09-30 08:43:03 -0700191
192 if (IS_DOT11_MODE_HE(session_entry->dot11mode))
193 lim_update_stads_he_caps(sta_ds, assoc_rsp, session_entry);
194
195 if (lim_is_sta_he_capable(sta_ds))
Naveen Rawatd8feac12017-09-08 15:08:39 -0700196 he_cap = &assoc_rsp->he_cap;
Krishna Kumaar Natarajand1cd56e2016-09-30 08:43:03 -0700197
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800198 if (lim_populate_peer_rate_set(mac_ctx, &sta_ds->supportedRates,
199 assoc_rsp->HTCaps.supportedMCSSet,
200 false, session_entry,
Jeff Johnson0301ecb2018-06-29 09:36:23 -0700201 vht_caps, he_cap) != QDF_STATUS_SUCCESS) {
Nishank Aggarwal47444142017-03-24 15:31:15 +0530202 pe_err("could not get rateset and extended rate set");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800203 return;
204 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800205 sta_ds->vhtSupportedRxNss =
206 ((sta_ds->supportedRates.vhtRxMCSMap & MCSMAPMASK2x2)
207 == MCSMAPMASK2x2) ? 1 : 2;
Krishna Kumaar Natarajan0103ef82017-02-17 18:15:56 -0800208
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800209 /* If one of the rates is 11g rates, set the ERP mode. */
210 if ((phy_mode == WNI_CFG_PHY_MODE_11G) &&
211 sirIsArate(sta_ds->supportedRates.llaRates[0] & 0x7f))
212 sta_ds->erpEnabled = eHAL_SET;
213
214 /* Could not get prop rateset from CFG. Log error. */
215 sta_ds->qosMode = 0;
216 sta_ds->lleEnabled = 0;
217
218 /* update TSID to UP mapping */
219 if (qos_mode) {
220 if (assoc_rsp->edcaPresent) {
Jeff Johnson0301ecb2018-06-29 09:36:23 -0700221 QDF_STATUS status;
Srinivas Girigowda4d65ebe2017-10-13 21:41:42 -0700222
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800223 status =
224 sch_beacon_edca_process(mac_ctx,
225 &assoc_rsp->edca, session_entry);
Nishank Aggarwal47444142017-03-24 15:31:15 +0530226 pe_debug("Edca set update based on AssocRsp: status %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800227 status);
Jeff Johnson0301ecb2018-06-29 09:36:23 -0700228 if (status != QDF_STATUS_SUCCESS) {
Nishank Aggarwal47444142017-03-24 15:31:15 +0530229 pe_err("Edca error in AssocResp");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800230 } else {
231 /* update default tidmap based on ACM */
232 sta_ds->qosMode = 1;
233 sta_ds->lleEnabled = 1;
234 }
235 }
236 }
237
238 sta_ds->wmeEnabled = 0;
239 sta_ds->wsmEnabled = 0;
240 if (session_entry->limWmeEnabled && assoc_rsp->wmeEdcaPresent) {
Jeff Johnson0301ecb2018-06-29 09:36:23 -0700241 QDF_STATUS status;
Srinivas Girigowda4d65ebe2017-10-13 21:41:42 -0700242
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800243 status = sch_beacon_edca_process(mac_ctx, &assoc_rsp->edca,
244 session_entry);
Nishank Aggarwal47444142017-03-24 15:31:15 +0530245 pe_debug("WME Edca set update based on AssocRsp: status %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800246 status);
247
Jeff Johnson0301ecb2018-06-29 09:36:23 -0700248 if (status != QDF_STATUS_SUCCESS)
Nishank Aggarwal47444142017-03-24 15:31:15 +0530249 pe_err("WME Edca error in AssocResp - ignoring");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800250
251 else {
252 /* update default tidmap based on HashACM */
253 sta_ds->qosMode = 1;
254 sta_ds->wmeEnabled = 1;
255 }
256 } else {
257 /*
258 * We received assoc rsp from a legacy AP.
259 * So fill in the default local EDCA params.
260 * This is needed (refer to bug #14989) as we'll
261 * be passing the gLimEdcaParams to HAL in
262 * lim_process_sta_mlm_add_bss_rsp().
263 */
264 sch_set_default_edca_params(mac_ctx, session_entry);
265 }
266
267 if (qos_mode && (!sta_ds->qosMode) &&
268 sta_ds->mlmStaContext.htCapability) {
269 /*
270 * Enable QOS for all HT AP's even though WMM
271 * or 802.11E IE is not present
272 */
273 sta_ds->qosMode = 1;
274 sta_ds->wmeEnabled = 1;
275 }
276#ifdef WLAN_FEATURE_11W
277 if (session_entry->limRmfEnabled)
278 sta_ds->rmfEnabled = 1;
279#endif
280}
281
282/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800283 * lim_update_ric_data() - update session with ric data
284 * @mac_ctx: Pointer to Global MAC structure
285 * @session_entry: PE session handle
286 * @assoc_rsp: pointer to assoc response
287 *
288 * This function is called by lim_process_assoc_rsp_frame() to
289 * update PE session context with RIC data.
290 *
291 * Return: None
292 */
Jeff Johnson9320c1e2018-12-02 13:09:20 -0800293static void lim_update_ric_data(struct mac_context *mac_ctx,
Jeff Johnson82e779e2018-11-19 06:52:11 -0800294 struct pe_session *session_entry, tpSirAssocRsp assoc_rsp)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800295{
296 if (session_entry->ricData != NULL) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530297 qdf_mem_free(session_entry->ricData);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800298 session_entry->ricData = NULL;
Sreelakshmi Konamki3b8ba612015-12-02 18:13:22 +0530299 session_entry->RICDataLen = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800300 }
301 if (assoc_rsp->ricPresent) {
302 session_entry->RICDataLen =
303 assoc_rsp->num_RICData * sizeof(tDot11fIERICDataDesc);
Varun Reddy Yeturu61ce89c2015-11-01 07:57:39 -0800304 if (session_entry->RICDataLen) {
305 session_entry->ricData =
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530306 qdf_mem_malloc(session_entry->RICDataLen);
Arif Hussainf5b6c412018-10-10 19:41:09 -0700307 if (!session_entry->ricData)
Varun Reddy Yeturu61ce89c2015-11-01 07:57:39 -0800308 session_entry->RICDataLen = 0;
Arif Hussainf5b6c412018-10-10 19:41:09 -0700309 else
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530310 qdf_mem_copy(session_entry->ricData,
Varun Reddy Yeturu61ce89c2015-11-01 07:57:39 -0800311 &assoc_rsp->RICData[0],
312 session_entry->RICDataLen);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800313 } else {
Nishank Aggarwal47444142017-03-24 15:31:15 +0530314 pe_err("RIC data not present");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800315 }
316 } else {
Nishank Aggarwal47444142017-03-24 15:31:15 +0530317 pe_debug("Ric is not present");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800318 session_entry->RICDataLen = 0;
319 session_entry->ricData = NULL;
320 }
321 return;
322}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800323
324#ifdef FEATURE_WLAN_ESE
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800325/**
326 * lim_update_ese_tspec() - update session with Tspec info.
327 * @mac_ctx: Pointer to Global MAC structure
328 * @session_entry: PE session handle
329 * @assoc_rsp: pointer to assoc response
330 *
331 * This function is called by lim_process_assoc_rsp_frame() to
332 * update PE session context with Tspec data.
333 *
334 * Return: None
335 */
Jeff Johnson9320c1e2018-12-02 13:09:20 -0800336static void lim_update_ese_tspec(struct mac_context *mac_ctx,
Jeff Johnson82e779e2018-11-19 06:52:11 -0800337 struct pe_session *session_entry, tpSirAssocRsp assoc_rsp)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800338{
339 if (session_entry->tspecIes != NULL) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530340 qdf_mem_free(session_entry->tspecIes);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800341 session_entry->tspecIes = NULL;
Sreelakshmi Konamki3b8ba612015-12-02 18:13:22 +0530342 session_entry->tspecLen = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800343 }
344 if (assoc_rsp->tspecPresent) {
Nishank Aggarwal47444142017-03-24 15:31:15 +0530345 pe_debug("Tspec EID present in assoc rsp");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800346 session_entry->tspecLen =
347 assoc_rsp->num_tspecs * sizeof(tDot11fIEWMMTSPEC);
Varun Reddy Yeturu61ce89c2015-11-01 07:57:39 -0800348 if (session_entry->tspecLen) {
349 session_entry->tspecIes =
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530350 qdf_mem_malloc(session_entry->tspecLen);
Arif Hussainf5b6c412018-10-10 19:41:09 -0700351 if (!session_entry->tspecIes)
Varun Reddy Yeturu61ce89c2015-11-01 07:57:39 -0800352 session_entry->tspecLen = 0;
Arif Hussainf5b6c412018-10-10 19:41:09 -0700353 else
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530354 qdf_mem_copy(session_entry->tspecIes,
Varun Reddy Yeturu61ce89c2015-11-01 07:57:39 -0800355 &assoc_rsp->TSPECInfo[0],
356 session_entry->tspecLen);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800357 } else {
Nishank Aggarwal47444142017-03-24 15:31:15 +0530358 pe_err("TSPEC has Zero length");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800359 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800360 } else {
361 session_entry->tspecLen = 0;
362 session_entry->tspecIes = NULL;
Nishank Aggarwal47444142017-03-24 15:31:15 +0530363 pe_debug("Tspec EID *NOT* present in assoc rsp");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800364 }
365 return;
366}
367
368/**
369 * lim_update_ese_tsm() - update session with TSM info.
370 * @mac_ctx: Pointer to Global MAC structure
371 * @session_entry: PE session handle
372 * @assoc_rsp: pointer to assoc response
373 *
374 * This function is called by lim_process_assoc_rsp_frame() to
375 * update PE session context with TSM IE data and send
376 * eWNI_TSM_IE_IND to SME.
377 *
378 * Return: None
379 */
Jeff Johnson9320c1e2018-12-02 13:09:20 -0800380static void lim_update_ese_tsm(struct mac_context *mac_ctx,
Jeff Johnson82e779e2018-11-19 06:52:11 -0800381 struct pe_session *session_entry, tpSirAssocRsp assoc_rsp)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800382{
383 uint8_t cnt = 0;
384 tpEseTSMContext tsm_ctx;
385
Nishank Aggarwal47444142017-03-24 15:31:15 +0530386 pe_debug("TSM IE Present in Reassoc Rsp");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800387 /*
388 * Start the TSM timer only if the TSPEC
389 * Ie is present in the reassoc rsp
390 */
391 if (!assoc_rsp->tspecPresent) {
Nishank Aggarwal47444142017-03-24 15:31:15 +0530392 pe_err("TSM present but TSPEC IE not present");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800393 return;
394 }
395 tsm_ctx = &session_entry->eseContext.tsm;
396 /* Find the TSPEC IE with VO user priority */
397 for (cnt = 0; cnt < assoc_rsp->num_tspecs; cnt++) {
398 if (upToAc(assoc_rsp->TSPECInfo[cnt].user_priority) ==
399 EDCA_AC_VO) {
400 tsm_ctx->tid =
401 assoc_rsp->TSPECInfo[cnt].user_priority;
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530402 qdf_mem_copy(&tsm_ctx->tsmInfo,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800403 &assoc_rsp->tsmIE, sizeof(tSirMacESETSMIE));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800404 lim_send_sme_tsm_ie_ind(mac_ctx,
405 session_entry, assoc_rsp->tsmIE.tsid,
406 assoc_rsp->tsmIE.state,
407 assoc_rsp->tsmIE.msmt_interval);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800408 if (tsm_ctx->tsmInfo.state)
409 tsm_ctx->tsmMetrics.RoamingCount++;
410 break;
411 }
412 }
413}
414#endif
415
416/**
417 * lim_update_stads_ext_cap() - update sta ds with ext cap
418 * @mac_ctx: Pointer to Global MAC structure
419 * @session_entry: PE session handle
420 * @assoc_rsp: pointer to assoc response
421 *
422 * This function is called by lim_process_assoc_rsp_frame() to
423 * update STA DS with ext capablities.
424 *
425 * Return: None
426 */
Jeff Johnson9320c1e2018-12-02 13:09:20 -0800427static void lim_update_stads_ext_cap(struct mac_context *mac_ctx,
Jeff Johnson82e779e2018-11-19 06:52:11 -0800428 struct pe_session *session_entry, tpSirAssocRsp assoc_rsp,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800429 tpDphHashNode sta_ds)
430{
431 struct s_ext_cap *ext_cap;
Srinivas Girigowda4d65ebe2017-10-13 21:41:42 -0700432
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800433 if (!assoc_rsp->ExtCap.present) {
434 sta_ds->timingMeasCap = 0;
435#ifdef FEATURE_WLAN_TDLS
436 session_entry->tdls_prohibited = false;
437 session_entry->tdls_chan_swit_prohibited = false;
438#endif
Nishank Aggarwal47444142017-03-24 15:31:15 +0530439 pe_debug("ExtCap not present");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800440 return;
441 }
442
443 ext_cap = (struct s_ext_cap *)assoc_rsp->ExtCap.bytes;
444 lim_set_stads_rtt_cap(sta_ds, ext_cap, mac_ctx);
445#ifdef FEATURE_WLAN_TDLS
446 session_entry->tdls_prohibited = ext_cap->tdls_prohibited;
447 session_entry->tdls_chan_swit_prohibited =
448 ext_cap->tdls_chan_swit_prohibited;
Nishank Aggarwal47444142017-03-24 15:31:15 +0530449 pe_debug("ExtCap: tdls_prohibited: %d tdls_chan_swit_prohibited: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800450 ext_cap->tdls_prohibited,
451 ext_cap->tdls_chan_swit_prohibited);
452#endif
Varun Reddy Yeturu4f849e52018-06-15 18:08:37 -0700453 lim_set_peer_twt_cap(session_entry, ext_cap);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800454}
455
456/**
Varun Reddy Yeturu32de0e42016-04-15 14:25:59 +0530457 * lim_stop_reassoc_retry_timer() - Cleanup after reassoc response is received
458 * @mac_ctx: Global MAC context
459 *
460 * Stop the reassoc retry timer and release the stored reassoc request.
461 *
462 * Return: None
463 */
Jeff Johnson9320c1e2018-12-02 13:09:20 -0800464static void lim_stop_reassoc_retry_timer(struct mac_context *mac_ctx)
Varun Reddy Yeturu32de0e42016-04-15 14:25:59 +0530465{
466 mac_ctx->lim.reAssocRetryAttempt = 0;
Jeff Johnsonb5c13332018-12-03 09:54:51 -0800467 if ((NULL != mac_ctx->lim.pe_session)
Varun Reddy Yeturu32de0e42016-04-15 14:25:59 +0530468 && (NULL !=
Jeff Johnsonb5c13332018-12-03 09:54:51 -0800469 mac_ctx->lim.pe_session->pLimMlmReassocRetryReq)) {
Varun Reddy Yeturu32de0e42016-04-15 14:25:59 +0530470 qdf_mem_free(
Jeff Johnsonb5c13332018-12-03 09:54:51 -0800471 mac_ctx->lim.pe_session->pLimMlmReassocRetryReq);
472 mac_ctx->lim.pe_session->pLimMlmReassocRetryReq = NULL;
Varun Reddy Yeturu32de0e42016-04-15 14:25:59 +0530473 }
474 lim_deactivate_and_change_timer(mac_ctx, eLIM_REASSOC_FAIL_TIMER);
475}
476
477/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800478 * lim_process_assoc_rsp_frame() - Processes assoc response
479 * @mac_ctx: Pointer to Global MAC structure
480 * @rx_packet_info - A pointer to Rx packet info structure
481 * @sub_type - Indicates whether it is Association Response (=0) or
482 * Reassociation Response (=1) frame
483 *
484 * This function is called by limProcessMessageQueue() upon
485 * Re/Association Response frame reception.
486 *
487 * Return: None
488 */
489
490void
Jeff Johnson9320c1e2018-12-02 13:09:20 -0800491lim_process_assoc_rsp_frame(struct mac_context *mac_ctx,
Jeff Johnson82e779e2018-11-19 06:52:11 -0800492 uint8_t *rx_pkt_info, uint8_t subtype, struct pe_session *session_entry)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800493{
494 uint8_t *body;
495 uint16_t caps, ie_len;
496 uint32_t frame_len;
497 tSirMacAddr current_bssid;
498 tpSirMacMgmtHdr hdr = NULL;
499 tSirMacCapabilityInfo mac_capab;
500 tpDphHashNode sta_ds;
501 tpSirAssocRsp assoc_rsp;
502 tLimMlmAssocCnf assoc_cnf;
503 tSchBeaconStruct *beacon;
504#ifdef WLAN_FEATURE_ROAM_OFFLOAD
505 uint8_t sme_sessionid = 0;
gaurank kathpalia14e2f912017-08-31 14:51:45 +0530506 struct csr_roam_session *roam_session;
Varun Reddy Yeturubbbbe232016-02-29 14:01:57 -0800507#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800508 /* Initialize status code to success. */
Varun Reddy Yeturubbbbe232016-02-29 14:01:57 -0800509 if (lim_is_roam_synch_in_progress(session_entry))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800510 hdr = (tpSirMacMgmtHdr) mac_ctx->roam.pReassocResp;
511 else
Varun Reddy Yeturubbbbe232016-02-29 14:01:57 -0800512 hdr = WMA_GET_RX_MAC_HEADER(rx_pkt_info);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800513#ifdef WLAN_FEATURE_ROAM_OFFLOAD
514 sme_sessionid = session_entry->smeSessionId;
515#endif
516 assoc_cnf.resultCode = eSIR_SME_SUCCESS;
517 /* Update PE session Id */
518 assoc_cnf.sessionId = session_entry->peSessionId;
519 if (hdr == NULL) {
Nishank Aggarwal47444142017-03-24 15:31:15 +0530520 pe_err("LFR3: Reassoc response packet header is NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800521 return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800522 }
523
Abhinav Kumar50d4dc72018-06-15 16:35:50 +0530524 pe_debug("received Re/Assoc: %d resp on sessionid: %d systemrole: %d"
Srinivas Girigowda2b5d47c2017-03-29 00:28:46 -0700525 " and mlmstate: %d RSSI: %d from "MAC_ADDRESS_STR, subtype,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800526 session_entry->peSessionId, GET_LIM_SYSTEM_ROLE(session_entry),
527 session_entry->limMlmState,
Deepak Dhamdhere68929ec2015-08-05 15:16:35 -0700528 (uint) abs((int8_t) WMA_GET_RX_RSSI_NORMALIZED(rx_pkt_info)),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800529 MAC_ADDR_ARRAY(hdr->sa));
530
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530531 beacon = qdf_mem_malloc(sizeof(tSchBeaconStruct));
Arif Hussainf5b6c412018-10-10 19:41:09 -0700532 if (!beacon)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800533 return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800534
Rajeev Kumarbe5d7fd2016-04-15 14:35:12 -0700535 if (LIM_IS_AP_ROLE(session_entry)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800536 /*
537 * Should not have received Re/Association
538 * Response frame on AP. Log error
539 */
Jeff Johnson4ceed382018-05-06 16:24:57 -0700540 pe_err("Should not received Re/Assoc Response in role: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800541 GET_LIM_SYSTEM_ROLE(session_entry));
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530542 qdf_mem_free(beacon);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800543 return;
544 }
Varun Reddy Yeturubbbbe232016-02-29 14:01:57 -0800545 if (lim_is_roam_synch_in_progress(session_entry)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800546 hdr = (tpSirMacMgmtHdr) mac_ctx->roam.pReassocResp;
547 frame_len = mac_ctx->roam.reassocRespLen - SIR_MAC_HDR_LEN_3A;
548 } else {
Varun Reddy Yeturubbbbe232016-02-29 14:01:57 -0800549 hdr = WMA_GET_RX_MAC_HEADER(rx_pkt_info);
550 frame_len = WMA_GET_RX_PAYLOAD_LEN(rx_pkt_info);
551 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800552 if (((subtype == LIM_ASSOC) &&
553 (session_entry->limMlmState != eLIM_MLM_WT_ASSOC_RSP_STATE)) ||
554 ((subtype == LIM_REASSOC) &&
Varun Reddy Yeturubbbbe232016-02-29 14:01:57 -0800555 !lim_is_roam_synch_in_progress(session_entry) &&
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800556 ((session_entry->limMlmState != eLIM_MLM_WT_REASSOC_RSP_STATE)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800557 && (session_entry->limMlmState !=
558 eLIM_MLM_WT_FT_REASSOC_RSP_STATE)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800559 ))) {
560 /* Received unexpected Re/Association Response frame */
Jeff Johnson47d75242018-05-12 15:58:53 -0700561 pe_debug("Received Re/Assoc rsp in unexpected state: %d on session: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800562 session_entry->limMlmState, session_entry->peSessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800563 if (!hdr->fc.retry) {
564 if (!(mac_ctx->lim.retry_packet_cnt & 0xf)) {
Nishank Aggarwal47444142017-03-24 15:31:15 +0530565 pe_err("recvd Re/Assoc rsp:not a retry frame");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800566 lim_print_mlm_state(mac_ctx, LOGE,
567 session_entry->limMlmState);
568 } else {
569 mac_ctx->lim.retry_packet_cnt++;
570 }
571 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530572 qdf_mem_free(beacon);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800573 return;
574 }
575 sir_copy_mac_addr(current_bssid, session_entry->bssId);
576 if (subtype == LIM_ASSOC) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530577 if (qdf_mem_cmp
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800578 (hdr->sa, current_bssid, sizeof(tSirMacAddr))) {
579 /*
580 * Received Association Response frame from an entity
581 * other than one to which request was initiated.
582 * Ignore this and wait until Assoc Failure Timeout
583 */
Nishank Aggarwal47444142017-03-24 15:31:15 +0530584 pe_warn("received AssocRsp from unexpected peer "MAC_ADDRESS_STR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800585 MAC_ADDR_ARRAY(hdr->sa));
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530586 qdf_mem_free(beacon);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800587 return;
588 }
589 } else {
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530590 if (qdf_mem_cmp
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800591 (hdr->sa, session_entry->limReAssocbssId,
592 sizeof(tSirMacAddr))) {
593 /*
594 * Received Reassociation Response frame from an entity
595 * other than one to which request was initiated.
596 * Ignore this and wait until Reassoc Failure Timeout.
597 */
Nishank Aggarwal47444142017-03-24 15:31:15 +0530598 pe_warn("received ReassocRsp from unexpected peer "MAC_ADDRESS_STR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800599 MAC_ADDR_ARRAY(hdr->sa));
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530600 qdf_mem_free(beacon);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800601 return;
602 }
603 }
604
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530605 assoc_rsp = qdf_mem_malloc(sizeof(*assoc_rsp));
Arif Hussainf5b6c412018-10-10 19:41:09 -0700606 if (!assoc_rsp) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530607 qdf_mem_free(beacon);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800608 return;
609 }
610 /* Get pointer to Re/Association Response frame body */
Varun Reddy Yeturubbbbe232016-02-29 14:01:57 -0800611 if (lim_is_roam_synch_in_progress(session_entry))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800612 body = mac_ctx->roam.pReassocResp + SIR_MAC_HDR_LEN_3A;
613 else
Varun Reddy Yeturubbbbe232016-02-29 14:01:57 -0800614 body = WMA_GET_RX_MPDU_DATA(rx_pkt_info);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800615 /* parse Re/Association Response frame. */
Sridhar Selvaraj0d5d2c72017-08-17 17:30:01 +0530616 if (sir_convert_assoc_resp_frame2_struct(mac_ctx, session_entry, body,
Jeff Johnson0301ecb2018-06-29 09:36:23 -0700617 frame_len, assoc_rsp) == QDF_STATUS_E_FAILURE) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530618 qdf_mem_free(assoc_rsp);
Nishank Aggarwal47444142017-03-24 15:31:15 +0530619 pe_err("Parse error Assoc resp subtype: %d" "length: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800620 frame_len, subtype);
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530621 qdf_mem_free(beacon);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800622 return;
623 }
624
625 if (!assoc_rsp->suppRatesPresent) {
Sandeep Puligilla1f1e4002018-08-18 12:15:01 -0700626 pe_debug("assoc response does not have supported rate set");
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530627 qdf_mem_copy(&assoc_rsp->supportedRates,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800628 &session_entry->rateSet,
629 sizeof(tSirMacRateSet));
630 }
631
632 assoc_cnf.protStatusCode = assoc_rsp->statusCode;
633 if (session_entry->assocRsp != NULL) {
Nishank Aggarwal47444142017-03-24 15:31:15 +0530634 pe_warn("session_entry->assocRsp is not NULL freeing it and setting NULL");
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530635 qdf_mem_free(session_entry->assocRsp);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800636 session_entry->assocRsp = NULL;
Sreelakshmi Konamki3b8ba612015-12-02 18:13:22 +0530637 session_entry->assocRspLen = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800638 }
639
yeshwanth sriram guntukad716a412017-07-18 17:25:32 +0530640 if (frame_len) {
641 session_entry->assocRsp = qdf_mem_malloc(frame_len);
Arif Hussainf5b6c412018-10-10 19:41:09 -0700642 if (session_entry->assocRsp) {
yeshwanth sriram guntukad716a412017-07-18 17:25:32 +0530643 /*
644 * Store the Assoc response. This is sent
645 * to csr/hdd in join cnf response.
646 */
647 qdf_mem_copy(session_entry->assocRsp, body, frame_len);
648 session_entry->assocRspLen = frame_len;
649 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800650 }
651
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800652 lim_update_ric_data(mac_ctx, session_entry, assoc_rsp);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800653
654#ifdef WLAN_FEATURE_ROAM_OFFLOAD
655 roam_session =
656 &mac_ctx->roam.roamSession[sme_sessionid];
657 if (assoc_rsp->FTInfo.R0KH_ID.present) {
658 roam_session->ftSmeContext.r0kh_id_len =
659 assoc_rsp->FTInfo.R0KH_ID.num_PMK_R0_ID;
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530660 qdf_mem_copy(roam_session->ftSmeContext.r0kh_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800661 assoc_rsp->FTInfo.R0KH_ID.PMK_R0_ID,
662 roam_session->ftSmeContext.r0kh_id_len);
663 } else {
664 roam_session->ftSmeContext.r0kh_id_len = 0;
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530665 qdf_mem_zero(roam_session->ftSmeContext.r0kh_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800666 SIR_ROAM_R0KH_ID_MAX_LEN);
667 }
668#endif
669
670#ifdef FEATURE_WLAN_ESE
671 lim_update_ese_tspec(mac_ctx, session_entry, assoc_rsp);
672#endif
673
674 if (assoc_rsp->capabilityInfo.ibss) {
675 /*
676 * Received Re/Association Response from peer
677 * with IBSS capability set.
678 * Ignore the frame and wait until Re/assoc
679 * failure timeout.
680 */
Nishank Aggarwal47444142017-03-24 15:31:15 +0530681 pe_err("received Re/AssocRsp frame with IBSS capability");
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530682 qdf_mem_free(assoc_rsp);
683 qdf_mem_free(beacon);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800684 return;
685 }
686
687 if (cfg_get_capability_info(mac_ctx, &caps, session_entry)
Jeff Johnson0301ecb2018-06-29 09:36:23 -0700688 != QDF_STATUS_SUCCESS) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530689 qdf_mem_free(assoc_rsp);
690 qdf_mem_free(beacon);
Nishank Aggarwal47444142017-03-24 15:31:15 +0530691 pe_err("could not retrieve Capabilities");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800692 return;
693 }
694 lim_copy_u16((uint8_t *) &mac_capab, caps);
695
696 /* Stop Association failure timer */
697 if (subtype == LIM_ASSOC)
698 lim_deactivate_and_change_timer(mac_ctx, eLIM_ASSOC_FAIL_TIMER);
Varun Reddy Yeturu32de0e42016-04-15 14:25:59 +0530699 else
700 lim_stop_reassoc_retry_timer(mac_ctx);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800701
Abhishek Singhf3756fc2017-06-28 16:04:06 +0530702 if (eSIR_MAC_XS_FRAME_LOSS_POOR_CHANNEL_RSSI_STATUS ==
703 assoc_rsp->statusCode &&
704 assoc_rsp->rssi_assoc_rej.present)
705 lim_assoc_rej_add_to_rssi_based_reject_list(mac_ctx,
706 &assoc_rsp->rssi_assoc_rej, hdr->sa,
707 WMA_GET_RX_RSSI_NORMALIZED(rx_pkt_info));
708
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800709 if (assoc_rsp->statusCode != eSIR_MAC_SUCCESS_STATUS
710#ifdef WLAN_FEATURE_11W
Selvaraj, Sridhar88015a12016-09-16 20:33:21 +0530711 && (!session_entry->limRmfEnabled ||
Krunal Soni3b7f7332015-11-12 10:54:30 -0800712 assoc_rsp->statusCode != eSIR_MAC_TRY_AGAIN_LATER)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800713#endif
714 ) {
715 /*
716 *Re/Association response was received
717 * either with failure code.
718 */
Nishank Aggarwal47444142017-03-24 15:31:15 +0530719 pe_err("received Re/AssocRsp frame failure code: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800720 assoc_rsp->statusCode);
721 /*
722 * Need to update 'association failure' error counter
723 * along with STATUS CODE
724 * Return Assoc confirm to SME with received failure code
725 */
726 assoc_cnf.resultCode = eSIR_SME_ASSOC_REFUSED;
727 /* Delete Pre-auth context for the associated BSS */
728 if (lim_search_pre_auth_list(mac_ctx, hdr->sa))
729 lim_delete_pre_auth_node(mac_ctx, hdr->sa);
730 goto assocReject;
731 } else if ((assoc_rsp->aid & 0x3FFF) > 2007) {
732 /*
733 * Re/Association response was received
734 * with invalid AID value
735 */
Nishank Aggarwal47444142017-03-24 15:31:15 +0530736 pe_err("received Re/AssocRsp frame with invalid aid: %X",
737 assoc_rsp->aid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800738 assoc_cnf.resultCode = eSIR_SME_INVALID_ASSOC_RSP_RXED;
739 assoc_cnf.protStatusCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
740 /* Send advisory Disassociation frame to AP */
741 lim_send_disassoc_mgmt_frame(mac_ctx,
742 eSIR_MAC_UNSPEC_FAILURE_REASON,
743 hdr->sa, session_entry, false);
744 goto assocReject;
745 }
Sridhar Selvaraj0d5d2c72017-08-17 17:30:01 +0530746
747 /*
748 * If it is FILS connection, check is FILS params are matching
749 * with Authentication stage.
750 */
751 if (!lim_verify_fils_params_assoc_rsp(mac_ctx, session_entry,
752 assoc_rsp, &assoc_cnf)) {
753 pe_err("FILS params doesnot match");
754 assoc_cnf.resultCode = eSIR_SME_INVALID_ASSOC_RSP_RXED;
755 assoc_cnf.protStatusCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
756 /* Send advisory Disassociation frame to AP */
757 lim_send_disassoc_mgmt_frame(mac_ctx,
758 eSIR_MAC_UNSPEC_FAILURE_REASON,
759 hdr->sa, session_entry, false);
760 goto assocReject;
761 }
762
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800763 /*
764 * Association Response received with success code
765 * Set the link state to POSTASSOC now that we have received
766 * assoc/reassoc response
767 * NOTE: for BTAMP case, it is being handled in
768 * lim_process_mlm_assoc_req
769 */
770#ifdef WLAN_FEATURE_11W
Krunal Soni3b7f7332015-11-12 10:54:30 -0800771 if (session_entry->limRmfEnabled &&
772 assoc_rsp->statusCode == eSIR_MAC_TRY_AGAIN_LATER) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800773 if (assoc_rsp->TimeoutInterval.present &&
774 (assoc_rsp->TimeoutInterval.timeoutType ==
775 SIR_MAC_TI_TYPE_ASSOC_COMEBACK)) {
776 uint16_t timeout_value =
777 assoc_rsp->TimeoutInterval.timeoutValue;
778 if (timeout_value < 10) {
779 /*
780 * if this value is less than 10 then our timer
781 * will fail to start and due to this we will
782 * never re-attempt. Better modify the timer
783 * value here.
784 */
785 timeout_value = 10;
786 }
Nishank Aggarwal47444142017-03-24 15:31:15 +0530787 pe_debug("ASSOC res with eSIR_MAC_TRY_AGAIN_LATER recvd.Starting timer to wait timeout: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800788 timeout_value);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530789 if (QDF_STATUS_SUCCESS !=
Anurag Chouhan210db072016-02-22 18:42:15 +0530790 qdf_mc_timer_start(
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800791 &session_entry->pmfComebackTimer,
792 timeout_value)) {
Nishank Aggarwal47444142017-03-24 15:31:15 +0530793 pe_err("Failed to start comeback timer");
Padma, Santhosh Kumardcba34f2016-08-08 18:10:14 +0530794
795 assoc_cnf.resultCode = eSIR_SME_ASSOC_REFUSED;
796 assoc_cnf.protStatusCode =
797 eSIR_MAC_UNSPEC_FAILURE_STATUS;
798
799 /*
800 * Delete Pre-auth context for the
801 * associated BSS
802 */
803 if (lim_search_pre_auth_list(mac_ctx, hdr->sa))
804 lim_delete_pre_auth_node(mac_ctx,
805 hdr->sa);
806
807 goto assocReject;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800808 }
809 } else {
Nishank Aggarwal47444142017-03-24 15:31:15 +0530810 pe_warn("ASSOC resp with try again event recvd, but try again time interval IE is wrong");
Padma, Santhosh Kumardcba34f2016-08-08 18:10:14 +0530811
812 assoc_cnf.resultCode = eSIR_SME_ASSOC_REFUSED;
813 assoc_cnf.protStatusCode =
814 eSIR_MAC_UNSPEC_FAILURE_STATUS;
815
816 /* Delete Pre-auth context for the associated BSS */
817 if (lim_search_pre_auth_list(mac_ctx, hdr->sa))
818 lim_delete_pre_auth_node(mac_ctx, hdr->sa);
819
820 goto assocReject;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800821 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530822 qdf_mem_free(beacon);
823 qdf_mem_free(assoc_rsp);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800824 return;
825 }
826#endif
Rajeev Kumarbe5d7fd2016-04-15 14:35:12 -0700827 if (!lim_is_roam_synch_in_progress(session_entry)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800828 if (lim_set_link_state
829 (mac_ctx, eSIR_LINK_POSTASSOC_STATE,
830 session_entry->bssId,
831 session_entry->selfMacAddr, NULL,
Jeff Johnson0301ecb2018-06-29 09:36:23 -0700832 NULL) != QDF_STATUS_SUCCESS) {
Nishank Aggarwal47444142017-03-24 15:31:15 +0530833 pe_err("Set link state to POSTASSOC failed");
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530834 qdf_mem_free(beacon);
835 qdf_mem_free(assoc_rsp);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800836 return;
837 }
838 }
yeshwanth sriram guntuka58bbcf82017-02-21 12:16:04 +0530839
840 if (assoc_rsp->QosMapSet.present)
841 qdf_mem_copy(&session_entry->QosMapSet,
842 &assoc_rsp->QosMapSet, sizeof(tSirQosMapSet));
Srinivas Girigowdaeff16d92018-09-12 14:56:29 -0700843 else
yeshwanth sriram guntuka58bbcf82017-02-21 12:16:04 +0530844 qdf_mem_zero(&session_entry->QosMapSet, sizeof(tSirQosMapSet));
845
846 if (assoc_rsp->obss_scanparams.present)
847 lim_update_obss_scanparams(session_entry,
848 &assoc_rsp->obss_scanparams);
849
Abhishek Singhdd2cb572017-08-11 11:10:19 +0530850 lim_diag_event_report(mac_ctx, WLAN_PE_DIAG_ROAM_ASSOC_COMP_EVENT,
Jeff Johnson0301ecb2018-06-29 09:36:23 -0700851 session_entry, assoc_rsp->statusCode ? QDF_STATUS_E_FAILURE :
852 QDF_STATUS_SUCCESS, assoc_rsp->statusCode);
Abhishek Singhdd2cb572017-08-11 11:10:19 +0530853
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800854 if (subtype == LIM_REASSOC) {
Nishank Aggarwal47444142017-03-24 15:31:15 +0530855 pe_debug("Successfully Reassociated with BSS");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800856#ifdef FEATURE_WLAN_ESE
857 if (assoc_rsp->tsmPresent)
858 lim_update_ese_tsm(mac_ctx, session_entry, assoc_rsp);
859#endif
860 if (session_entry->pLimMlmJoinReq) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530861 qdf_mem_free(session_entry->pLimMlmJoinReq);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800862 session_entry->pLimMlmJoinReq = NULL;
863 }
864
865 session_entry->limAssocResponseData = (void *)assoc_rsp;
866 /*
867 * Store the ReAssocRsp Frame in DphTable
868 * to be used during processing DelSta and
869 * DelBss to send AddBss again
870 */
871 sta_ds =
872 dph_get_hash_entry(mac_ctx, DPH_STA_HASH_INDEX_PEER,
873 &session_entry->dph.dphHashTable);
874
875 if (!sta_ds) {
Nishank Aggarwal47444142017-03-24 15:31:15 +0530876 pe_err("could not get hash entry at DPH for");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800877 lim_print_mac_addr(mac_ctx, hdr->sa, LOGE);
878 assoc_cnf.resultCode =
879 eSIR_SME_INVALID_ASSOC_RSP_RXED;
880 assoc_cnf.protStatusCode =
881 eSIR_MAC_UNSPEC_FAILURE_STATUS;
882
883 /* Send advisory Disassociation frame to AP */
884 lim_send_disassoc_mgmt_frame(mac_ctx,
885 eSIR_MAC_UNSPEC_FAILURE_REASON, hdr->sa,
886 session_entry, false);
887 goto assocReject;
888 }
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -0800889 if ((session_entry->limMlmState ==
890 eLIM_MLM_WT_FT_REASSOC_RSP_STATE) ||
Varun Reddy Yeturubbbbe232016-02-29 14:01:57 -0800891 lim_is_roam_synch_in_progress(session_entry)) {
Nishank Aggarwal47444142017-03-24 15:31:15 +0530892 pe_debug("Sending self sta");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800893 lim_update_assoc_sta_datas(mac_ctx, sta_ds, assoc_rsp,
894 session_entry);
yeshwanth sriram guntuka58bbcf82017-02-21 12:16:04 +0530895 lim_update_stads_ext_cap(mac_ctx, session_entry,
896 assoc_rsp, sta_ds);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800897 /* Store assigned AID for TIM processing */
898 session_entry->limAID = assoc_rsp->aid & 0x3FFF;
899 /* Downgrade the EDCA parameters if needed */
900 lim_set_active_edca_params(mac_ctx,
901 session_entry->gLimEdcaParams,
902 session_entry);
903 /* Send the active EDCA parameters to HAL */
Varun Reddy Yeturubbbbe232016-02-29 14:01:57 -0800904 if (!lim_is_roam_synch_in_progress(session_entry)) {
905 lim_send_edca_params(mac_ctx,
906 session_entry->gLimEdcaParamsActive,
Kiran Kumar Lokere27026ae2018-03-09 11:38:19 -0800907 sta_ds->bssId, false);
Varun Reddy Yeturubbbbe232016-02-29 14:01:57 -0800908 lim_add_ft_sta_self(mac_ctx,
909 (assoc_rsp->aid & 0x3FFF),
910 session_entry);
911 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530912 qdf_mem_free(beacon);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800913 return;
914 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800915
916 /*
917 * If we're re-associating to the same BSS,
918 * we don't want to invoke delete STA, delete
919 * BSS, as that would remove the already
920 * established TSPEC. Just go ahead and re-add
921 * the BSS, STA with new capability information.
922 * However, if we're re-associating to a different
923 * BSS, then follow thru with del STA, del BSS,
924 * add BSS, add STA.
925 */
926 if (sir_compare_mac_addr(session_entry->bssId,
927 session_entry->limReAssocbssId))
928 lim_handle_add_bss_in_re_assoc_context(mac_ctx, sta_ds,
929 session_entry);
930 else {
931 /*
932 * reset the uapsd mask settings since
933 * we're re-associating to new AP
934 */
935 session_entry->gUapsdPerAcDeliveryEnableMask = 0;
936 session_entry->gUapsdPerAcTriggerEnableMask = 0;
937
938 if (lim_cleanup_rx_path(mac_ctx, sta_ds, session_entry)
Jeff Johnson0301ecb2018-06-29 09:36:23 -0700939 != QDF_STATUS_SUCCESS) {
Nishank Aggarwal47444142017-03-24 15:31:15 +0530940 pe_err("Could not cleanup the rx path");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800941 goto assocReject;
942 }
943 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530944 qdf_mem_free(beacon);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800945 return;
946 }
Nishank Aggarwal47444142017-03-24 15:31:15 +0530947 pe_debug("Successfully Associated with BSS " MAC_ADDRESS_STR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800948 MAC_ADDR_ARRAY(hdr->sa));
949#ifdef FEATURE_WLAN_ESE
950 if (session_entry->eseContext.tsm.tsmInfo.state)
951 session_entry->eseContext.tsm.tsmMetrics.RoamingCount = 0;
952#endif
953 /* Store assigned AID for TIM processing */
954 session_entry->limAID = assoc_rsp->aid & 0x3FFF;
955
956 /* STA entry was created during pre-assoc state. */
957 sta_ds = dph_get_hash_entry(mac_ctx, DPH_STA_HASH_INDEX_PEER,
958 &session_entry->dph.dphHashTable);
959 if (sta_ds == NULL) {
960 /* Could not add hash table entry */
Nishank Aggarwal47444142017-03-24 15:31:15 +0530961 pe_err("could not get hash entry at DPH");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800962 lim_print_mac_addr(mac_ctx, hdr->sa, LOGE);
963 assoc_cnf.resultCode = eSIR_SME_RESOURCES_UNAVAILABLE;
964 assoc_cnf.protStatusCode = eSIR_SME_SUCCESS;
965 lim_post_sme_message(mac_ctx, LIM_MLM_ASSOC_CNF,
966 (uint32_t *) &assoc_cnf);
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530967 qdf_mem_free(assoc_rsp);
968 qdf_mem_free(beacon);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800969 return;
970 }
971 /* Delete Pre-auth context for the associated BSS */
972 if (lim_search_pre_auth_list(mac_ctx, hdr->sa))
973 lim_delete_pre_auth_node(mac_ctx, hdr->sa);
974
975 lim_update_assoc_sta_datas(mac_ctx, sta_ds, assoc_rsp, session_entry);
976 /*
977 * Extract the AP capabilities from the beacon that
978 * was received earlier
979 */
980 ie_len = lim_get_ielen_from_bss_description(
981 &session_entry->pLimJoinReq->bssDescription);
982 lim_extract_ap_capabilities(mac_ctx,
983 (uint8_t *) session_entry->pLimJoinReq->bssDescription.ieFields,
984 ie_len,
985 beacon);
986
Kiran Kumar Lokeref54b8552018-07-10 00:53:38 -0700987 if (lim_is_session_he_capable(session_entry)) {
Kiran Kumar Lokereb52cfc82018-10-08 21:54:38 -0700988 session_entry->mu_edca_present = assoc_rsp->mu_edca_present;
989 if (session_entry->mu_edca_present) {
990 pe_debug("Save MU EDCA params to session");
991 session_entry->ap_mu_edca_params[EDCA_AC_BE] =
992 assoc_rsp->mu_edca.acbe;
993 session_entry->ap_mu_edca_params[EDCA_AC_BK] =
994 assoc_rsp->mu_edca.acbk;
995 session_entry->ap_mu_edca_params[EDCA_AC_VI] =
996 assoc_rsp->mu_edca.acvi;
997 session_entry->ap_mu_edca_params[EDCA_AC_VO] =
998 assoc_rsp->mu_edca.acvo;
Kiran Kumar Lokeref54b8552018-07-10 00:53:38 -0700999 }
Kiran Kumar Lokere27026ae2018-03-09 11:38:19 -08001000
1001 }
1002
Selvaraj, Sridhare01e0732016-09-13 12:45:22 +05301003 if (beacon->VHTCaps.present)
1004 sta_ds->parsed_ies.vht_caps = beacon->VHTCaps;
1005 if (beacon->HTCaps.present)
1006 sta_ds->parsed_ies.ht_caps = beacon->HTCaps;
1007 if (beacon->hs20vendor_ie.present)
1008 sta_ds->parsed_ies.hs20vendor_ie = beacon->hs20vendor_ie;
1009 if (beacon->HTInfo.present)
1010 sta_ds->parsed_ies.ht_operation = beacon->HTInfo;
1011 if (beacon->VHTOperation.present)
1012 sta_ds->parsed_ies.vht_operation = beacon->VHTOperation;
Anurag Chouhan5de8d172016-07-13 14:44:28 +05301013
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001014 if (mac_ctx->lim.gLimProtectionControl !=
Pragaspathi Thilagaraj1ee76002018-09-18 21:38:51 +05301015 MLME_FORCE_POLICY_PROTECTION_DISABLE)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001016 lim_decide_sta_protection_on_assoc(mac_ctx, beacon,
Pragaspathi Thilagaraj1ee76002018-09-18 21:38:51 +05301017 session_entry);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001018
1019 if (beacon->erpPresent) {
1020 if (beacon->erpIEInfo.barkerPreambleMode)
1021 session_entry->beaconParams.fShortPreamble = false;
1022 else
1023 session_entry->beaconParams.fShortPreamble = true;
1024 }
1025
1026#ifdef FEATURE_WLAN_DIAG_SUPPORT
1027 lim_diag_event_report(mac_ctx, WLAN_PE_DIAG_CONNECTED, session_entry,
Jeff Johnson0301ecb2018-06-29 09:36:23 -07001028 QDF_STATUS_SUCCESS, QDF_STATUS_SUCCESS);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001029#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001030 lim_update_stads_ext_cap(mac_ctx, session_entry, assoc_rsp, sta_ds);
1031 /* Update the BSS Entry, this entry was added during preassoc. */
Jeff Johnson0301ecb2018-06-29 09:36:23 -07001032 if (QDF_STATUS_SUCCESS == lim_sta_send_add_bss(mac_ctx, assoc_rsp,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001033 beacon,
1034 &session_entry->pLimJoinReq->bssDescription, true,
1035 session_entry)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301036 qdf_mem_free(assoc_rsp);
1037 qdf_mem_free(beacon);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001038 return;
1039 } else {
Nishank Aggarwal47444142017-03-24 15:31:15 +05301040 pe_err("could not update the bss entry");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001041 assoc_cnf.resultCode = eSIR_SME_RESOURCES_UNAVAILABLE;
1042 assoc_cnf.protStatusCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
1043 }
1044
1045assocReject:
1046 if ((subtype == LIM_ASSOC)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001047 || ((subtype == LIM_REASSOC)
1048 && (session_entry->limMlmState ==
Deepak Dhamdhere262d95a2016-01-10 16:36:53 -08001049 eLIM_MLM_WT_FT_REASSOC_RSP_STATE))) {
Nishank Aggarwal47444142017-03-24 15:31:15 +05301050 pe_err("Assoc Rejected by the peer mlmestate: %d sessionid: %d Reason: %d MACADDR:"
1051 MAC_ADDRESS_STR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001052 session_entry->limMlmState,
1053 session_entry->peSessionId,
1054 assoc_cnf.resultCode, MAC_ADDR_ARRAY(hdr->sa));
1055 session_entry->limMlmState = eLIM_MLM_IDLE_STATE;
1056 MTRACE(mac_trace(mac_ctx, TRACE_CODE_MLM_STATE,
1057 session_entry->peSessionId,
1058 session_entry->limMlmState));
1059 if (session_entry->pLimMlmJoinReq) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301060 qdf_mem_free(session_entry->pLimMlmJoinReq);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001061 session_entry->pLimMlmJoinReq = NULL;
1062 }
1063 if (subtype == LIM_ASSOC) {
1064 lim_post_sme_message(mac_ctx, LIM_MLM_ASSOC_CNF,
1065 (uint32_t *) &assoc_cnf);
Deepak Dhamdhere262d95a2016-01-10 16:36:53 -08001066 } else {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001067 assoc_cnf.resultCode = eSIR_SME_FT_REASSOC_FAILURE;
1068 lim_post_sme_message(mac_ctx, LIM_MLM_REASSOC_CNF,
1069 (uint32_t *)&assoc_cnf);
1070 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001071 } else {
1072 lim_restore_pre_reassoc_state(mac_ctx,
1073 eSIR_SME_REASSOC_REFUSED,
1074 assoc_cnf.protStatusCode,
1075 session_entry);
1076 }
1077
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301078 qdf_mem_free(beacon);
1079 qdf_mem_free(assoc_rsp);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001080 return;
1081}