blob: 8d228502455d37381a384b76bd1304f0f21d37bb [file] [log] [blame]
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001/*
Paul Zhangc3fc0a82018-01-09 16:38:20 +08002 * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003 *
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004 * Permission to use, copy, modify, and/or distribute this software for
5 * any purpose with or without fee is hereby granted, provided that the
6 * above copyright notice and this permission notice appear in all
7 * copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
10 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
11 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
12 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
13 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
14 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
15 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16 * PERFORMANCE OF THIS SOFTWARE.
17 */
18
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080019/**=========================================================================
20
21 \brief implementation for PE 11r VoWiFi FT Protocol
22
23 ========================================================================*/
24
25/* $Header$ */
26
27/*--------------------------------------------------------------------------
28 Include Files
29 ------------------------------------------------------------------------*/
30#include <lim_send_messages.h>
31#include <lim_types.h>
32#include <lim_ft.h>
33#include <lim_ft_defs.h>
34#include <lim_utils.h>
35#include <lim_prop_exts_utils.h>
36#include <lim_assoc_utils.h>
37#include <lim_session.h>
38#include <lim_admit_control.h>
39#include "wmm_apsd.h"
Deepak Dhamdhered97bfb32015-10-11 15:16:18 -070040#include "wma.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080041
Jeff Johnson9320c1e2018-12-02 13:09:20 -080042extern void lim_send_set_sta_key_req(struct mac_context *mac,
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053043 tLimMlmSetKeysReq * pMlmSetKeysReq,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080044 uint16_t staIdx,
45 uint8_t defWEPIdx,
Jeff Johnsonb5c13332018-12-03 09:54:51 -080046 struct pe_session *pe_session, bool sendRsp);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080047
48/*--------------------------------------------------------------------------
49 Initialize the FT variables.
50 ------------------------------------------------------------------------*/
Jeff Johnson9320c1e2018-12-02 13:09:20 -080051void lim_ft_open(struct mac_context *mac, struct pe_session *pe_session)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080052{
Jeff Johnsonb5c13332018-12-03 09:54:51 -080053 if (pe_session)
54 qdf_mem_set(&pe_session->ftPEContext, sizeof(tftPEContext),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080055 0);
56}
57
Jeff Johnson9320c1e2018-12-02 13:09:20 -080058void lim_ft_cleanup_all_ft_sessions(struct mac_context *mac)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080059{
60 /* Wrapper function to cleanup all FT sessions */
61 int i;
62
Jeff Johnson35592fc2018-11-22 11:36:10 -080063 for (i = 0; i < mac->lim.maxBssId; i++) {
64 if (true == mac->lim.gpSession[i].valid) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080065 /* The session is valid, may have FT data */
Jeff Johnson35592fc2018-11-22 11:36:10 -080066 lim_ft_cleanup(mac, &mac->lim.gpSession[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080067 }
68 }
69}
70
Jeff Johnson9320c1e2018-12-02 13:09:20 -080071void lim_ft_cleanup(struct mac_context *mac, struct pe_session *pe_session)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080072{
Jeff Johnsonb5c13332018-12-03 09:54:51 -080073 if (NULL == pe_session) {
74 pe_err("pe_session is NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080075 return;
76 }
77
78 /* Nothing to be done if the session is not in STA mode */
Jeff Johnsonb5c13332018-12-03 09:54:51 -080079 if (!LIM_IS_STA_ROLE(pe_session)) {
80 pe_err("pe_session is not in STA mode");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080081 return;
82 }
83
Jeff Johnsonb5c13332018-12-03 09:54:51 -080084 if (NULL != pe_session->ftPEContext.pFTPreAuthReq) {
Jeff Johnson11bd4f32017-09-18 08:15:17 -070085 pe_debug("Freeing pFTPreAuthReq: %pK",
Jeff Johnsonb5c13332018-12-03 09:54:51 -080086 pe_session->ftPEContext.pFTPreAuthReq);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080087 if (NULL !=
Jeff Johnsonb5c13332018-12-03 09:54:51 -080088 pe_session->ftPEContext.pFTPreAuthReq->
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080089 pbssDescription) {
Jeff Johnsonb5c13332018-12-03 09:54:51 -080090 qdf_mem_free(pe_session->ftPEContext.pFTPreAuthReq->
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080091 pbssDescription);
Jeff Johnsonb5c13332018-12-03 09:54:51 -080092 pe_session->ftPEContext.pFTPreAuthReq->
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080093 pbssDescription = NULL;
94 }
Jeff Johnsonb5c13332018-12-03 09:54:51 -080095 qdf_mem_free(pe_session->ftPEContext.pFTPreAuthReq);
96 pe_session->ftPEContext.pFTPreAuthReq = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080097 }
98
Jeff Johnsonb5c13332018-12-03 09:54:51 -080099 if (pe_session->ftPEContext.pAddBssReq) {
100 qdf_mem_free(pe_session->ftPEContext.pAddBssReq);
101 pe_session->ftPEContext.pAddBssReq = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800102 }
103
Jeff Johnsonb5c13332018-12-03 09:54:51 -0800104 if (pe_session->ftPEContext.pAddStaReq) {
105 qdf_mem_free(pe_session->ftPEContext.pAddStaReq);
106 pe_session->ftPEContext.pAddStaReq = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800107 }
108
109 /* The session is being deleted, cleanup the contents */
Jeff Johnsonb5c13332018-12-03 09:54:51 -0800110 qdf_mem_set(&pe_session->ftPEContext, sizeof(tftPEContext), 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800111}
112
Varun Reddy Yeturubbbbe232016-02-29 14:01:57 -0800113#if defined(WLAN_FEATURE_HOST_ROAM) || defined(WLAN_FEATURE_ROAM_OFFLOAD)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800114/*------------------------------------------------------------------
115 *
116 * Create the new Add Bss Req to the new AP.
117 * This will be used when we are ready to FT to the new AP.
118 * The newly created ft Session entry is passed to this function
119 *
120 *------------------------------------------------------------------*/
Jeff Johnson9320c1e2018-12-02 13:09:20 -0800121void lim_ft_prepare_add_bss_req(struct mac_context *mac,
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800122 uint8_t updateEntry, struct pe_session *ft_session,
Varun Reddy Yeturubbbbe232016-02-29 14:01:57 -0800123 tpSirBssDescription bssDescription)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800124{
125 tpAddBssParams pAddBssParams = NULL;
126 tAddStaParams *sta_ctx;
127 uint8_t chanWidthSupp = 0;
128 tSchBeaconStruct *pBeaconStruct;
129
130 /* Nothing to be done if the session is not in STA mode */
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800131 if (!LIM_IS_STA_ROLE(ft_session)) {
Jeff Johnsonb5c13332018-12-03 09:54:51 -0800132 pe_err("pe_session is not in STA mode");
Varun Reddy Yeturubbbbe232016-02-29 14:01:57 -0800133 return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800134 }
135
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530136 pBeaconStruct = qdf_mem_malloc(sizeof(tSchBeaconStruct));
Arif Hussainf5b6c412018-10-10 19:41:09 -0700137 if (!pBeaconStruct)
Varun Reddy Yeturubbbbe232016-02-29 14:01:57 -0800138 return;
Arif Hussainf5b6c412018-10-10 19:41:09 -0700139
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800140 /* Package SIR_HAL_ADD_BSS_REQ message parameters */
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530141 pAddBssParams = qdf_mem_malloc(sizeof(tAddBssParams));
Arif Hussainf5b6c412018-10-10 19:41:09 -0700142 if (!pAddBssParams) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530143 qdf_mem_free(pBeaconStruct);
Varun Reddy Yeturubbbbe232016-02-29 14:01:57 -0800144 return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800145 }
146
Jeff Johnson35592fc2018-11-22 11:36:10 -0800147 lim_extract_ap_capabilities(mac, (uint8_t *) bssDescription->ieFields,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800148 lim_get_ielen_from_bss_description(bssDescription),
149 pBeaconStruct);
150
Jeff Johnson35592fc2018-11-22 11:36:10 -0800151 if (mac->lim.gLimProtectionControl !=
Pragaspathi Thilagaraj1ee76002018-09-18 21:38:51 +0530152 MLME_FORCE_POLICY_PROTECTION_DISABLE)
Jeff Johnson35592fc2018-11-22 11:36:10 -0800153 lim_decide_sta_protection_on_assoc(mac, pBeaconStruct,
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800154 ft_session);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800155
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530156 qdf_mem_copy(pAddBssParams->bssId, bssDescription->bssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800157 sizeof(tSirMacAddr));
158
159 /* Fill in tAddBssParams selfMacAddr */
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800160 qdf_mem_copy(pAddBssParams->selfMacAddr, ft_session->selfMacAddr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800161 sizeof(tSirMacAddr));
162
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800163 pAddBssParams->bssType = ft_session->bssType;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800164 pAddBssParams->operMode = BSS_OPERATIONAL_MODE_STA;
165
166 pAddBssParams->beaconInterval = bssDescription->beaconInterval;
167
168 pAddBssParams->dtimPeriod = pBeaconStruct->tim.dtimPeriod;
169 pAddBssParams->updateBss = updateEntry;
170
171 pAddBssParams->reassocReq = true;
172
173 pAddBssParams->cfParamSet.cfpCount = pBeaconStruct->cfParamSet.cfpCount;
174 pAddBssParams->cfParamSet.cfpPeriod =
175 pBeaconStruct->cfParamSet.cfpPeriod;
176 pAddBssParams->cfParamSet.cfpMaxDuration =
177 pBeaconStruct->cfParamSet.cfpMaxDuration;
178 pAddBssParams->cfParamSet.cfpDurRemaining =
179 pBeaconStruct->cfParamSet.cfpDurRemaining;
180
181 pAddBssParams->rateSet.numRates =
182 pBeaconStruct->supportedRates.numRates;
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530183 qdf_mem_copy(pAddBssParams->rateSet.rate,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800184 pBeaconStruct->supportedRates.rate,
185 pBeaconStruct->supportedRates.numRates);
186
187 pAddBssParams->nwType = bssDescription->nwType;
188
189 pAddBssParams->shortSlotTimeSupported =
190 (uint8_t) pBeaconStruct->capabilityInfo.shortSlotTime;
191 pAddBssParams->llaCoexist =
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800192 (uint8_t) ft_session->beaconParams.llaCoexist;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800193 pAddBssParams->llbCoexist =
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800194 (uint8_t) ft_session->beaconParams.llbCoexist;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800195 pAddBssParams->llgCoexist =
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800196 (uint8_t) ft_session->beaconParams.llgCoexist;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800197 pAddBssParams->ht20Coexist =
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800198 (uint8_t) ft_session->beaconParams.ht20Coexist;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800199#ifdef WLAN_FEATURE_11W
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800200 pAddBssParams->rmfEnabled = ft_session->limRmfEnabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800201#endif
202
203 /* Use the advertised capabilities from the received beacon/PR */
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800204 if (IS_DOT11_MODE_HT(ft_session->dot11mode) &&
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800205 (pBeaconStruct->HTCaps.present)) {
206 pAddBssParams->htCapable = pBeaconStruct->HTCaps.present;
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530207 qdf_mem_copy(&pAddBssParams->staContext.capab_info,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800208 &pBeaconStruct->capabilityInfo,
209 sizeof(pAddBssParams->staContext.capab_info));
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530210 qdf_mem_copy(&pAddBssParams->staContext.ht_caps,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800211 (uint8_t *) &pBeaconStruct->HTCaps +
212 sizeof(uint8_t),
213 sizeof(pAddBssParams->staContext.ht_caps));
214
215 if (pBeaconStruct->HTInfo.present) {
216 pAddBssParams->htOperMode =
217 (tSirMacHTOperatingMode) pBeaconStruct->HTInfo.
218 opMode;
219 pAddBssParams->dualCTSProtection =
220 (uint8_t) pBeaconStruct->HTInfo.dualCTSProtection;
221
Jeff Johnson35592fc2018-11-22 11:36:10 -0800222 chanWidthSupp = lim_get_ht_capability(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800223 eHT_SUPPORTED_CHANNEL_WIDTH_SET,
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800224 ft_session);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800225 if ((pBeaconStruct->HTCaps.supportedChannelWidthSet) &&
226 (chanWidthSupp)) {
227 pAddBssParams->ch_width = (uint8_t)
228 pBeaconStruct->HTInfo.recommendedTxWidthSet;
229 if (pBeaconStruct->HTInfo.secondaryChannelOffset ==
230 PHY_DOUBLE_CHANNEL_LOW_PRIMARY)
231 pAddBssParams->ch_center_freq_seg0 =
232 bssDescription->channelId + 2;
233 else if (pBeaconStruct->HTInfo.secondaryChannelOffset ==
234 PHY_DOUBLE_CHANNEL_HIGH_PRIMARY)
235 pAddBssParams->ch_center_freq_seg0 =
236 bssDescription->channelId - 2;
237 } else {
238 pAddBssParams->ch_width = CH_WIDTH_20MHZ;
239 pAddBssParams->ch_center_freq_seg0 = 0;
240 }
241 pAddBssParams->llnNonGFCoexist =
242 (uint8_t) pBeaconStruct->HTInfo.nonGFDevicesPresent;
243 pAddBssParams->fLsigTXOPProtectionFullSupport =
244 (uint8_t) pBeaconStruct->HTInfo.
245 lsigTXOPProtectionFullSupport;
246 pAddBssParams->fRIFSMode =
247 pBeaconStruct->HTInfo.rifsMode;
248 }
249 }
250
251 pAddBssParams->currentOperChannel = bssDescription->channelId;
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800252 ft_session->htSecondaryChannelOffset =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800253 pBeaconStruct->HTInfo.secondaryChannelOffset;
254 sta_ctx = &pAddBssParams->staContext;
255
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800256 if (ft_session->vhtCapability &&
257 ft_session->vhtCapabilityPresentInBeacon) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800258 pAddBssParams->vhtCapable = pBeaconStruct->VHTCaps.present;
259 if (pBeaconStruct->VHTOperation.chanWidth && chanWidthSupp) {
260 pAddBssParams->ch_width =
261 pBeaconStruct->VHTOperation.chanWidth + 1;
262 pAddBssParams->ch_center_freq_seg0 =
263 pBeaconStruct->VHTOperation.chanCenterFreqSeg1;
264 pAddBssParams->ch_center_freq_seg1 =
265 pBeaconStruct->VHTOperation.chanCenterFreqSeg2;
266 }
267 pAddBssParams->staContext.vht_caps =
268 ((pBeaconStruct->VHTCaps.maxMPDULen <<
269 SIR_MAC_VHT_CAP_MAX_MPDU_LEN) |
270 (pBeaconStruct->VHTCaps.supportedChannelWidthSet <<
271 SIR_MAC_VHT_CAP_SUPP_CH_WIDTH_SET) |
272 (pBeaconStruct->VHTCaps.ldpcCodingCap <<
273 SIR_MAC_VHT_CAP_LDPC_CODING_CAP) |
274 (pBeaconStruct->VHTCaps.shortGI80MHz <<
275 SIR_MAC_VHT_CAP_SHORTGI_80MHZ) |
276 (pBeaconStruct->VHTCaps.shortGI160and80plus80MHz <<
277 SIR_MAC_VHT_CAP_SHORTGI_160_80_80MHZ) |
278 (pBeaconStruct->VHTCaps.txSTBC <<
279 SIR_MAC_VHT_CAP_TXSTBC) |
280 (pBeaconStruct->VHTCaps.rxSTBC <<
281 SIR_MAC_VHT_CAP_RXSTBC) |
282 (pBeaconStruct->VHTCaps.suBeamFormerCap <<
283 SIR_MAC_VHT_CAP_SU_BEAMFORMER_CAP) |
284 (pBeaconStruct->VHTCaps.suBeamformeeCap <<
285 SIR_MAC_VHT_CAP_SU_BEAMFORMEE_CAP) |
286 (pBeaconStruct->VHTCaps.csnofBeamformerAntSup <<
287 SIR_MAC_VHT_CAP_CSN_BEAMORMER_ANT_SUP) |
288 (pBeaconStruct->VHTCaps.numSoundingDim <<
289 SIR_MAC_VHT_CAP_NUM_SOUNDING_DIM) |
290 (pBeaconStruct->VHTCaps.muBeamformerCap <<
291 SIR_MAC_VHT_CAP_NUM_BEAM_FORMER_CAP) |
292 (pBeaconStruct->VHTCaps.muBeamformeeCap <<
293 SIR_MAC_VHT_CAP_NUM_BEAM_FORMEE_CAP) |
294 (pBeaconStruct->VHTCaps.vhtTXOPPS <<
295 SIR_MAC_VHT_CAP_TXOPPS) |
296 (pBeaconStruct->VHTCaps.htcVHTCap <<
297 SIR_MAC_VHT_CAP_HTC_CAP) |
298 (pBeaconStruct->VHTCaps.maxAMPDULenExp <<
299 SIR_MAC_VHT_CAP_MAX_AMDU_LEN_EXPO) |
300 (pBeaconStruct->VHTCaps.vhtLinkAdaptCap <<
301 SIR_MAC_VHT_CAP_LINK_ADAPT_CAP) |
302 (pBeaconStruct->VHTCaps.rxAntPattern <<
303 SIR_MAC_VHT_CAP_RX_ANTENNA_PATTERN) |
304 (pBeaconStruct->VHTCaps.txAntPattern <<
305 SIR_MAC_VHT_CAP_TX_ANTENNA_PATTERN) |
306 (pBeaconStruct->VHTCaps.reserved1 <<
307 SIR_MAC_VHT_CAP_RESERVED2));
308 } else {
309 pAddBssParams->vhtCapable = 0;
310 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800311
Nishank Aggarwal8b805bb2017-03-23 14:50:18 +0530312 pe_debug("SIR_HAL_ADD_BSS_REQ with channel: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800313 pAddBssParams->currentOperChannel);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800314
315 /* Populate the STA-related parameters here */
316 /* Note that the STA here refers to the AP */
317 {
318 pAddBssParams->staContext.staType = STA_ENTRY_OTHER;
319
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530320 qdf_mem_copy(pAddBssParams->staContext.bssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800321 bssDescription->bssId, sizeof(tSirMacAddr));
322 pAddBssParams->staContext.listenInterval =
323 bssDescription->beaconInterval;
324
325 pAddBssParams->staContext.assocId = 0;
326 pAddBssParams->staContext.uAPSD = 0;
327 pAddBssParams->staContext.maxSPLen = 0;
328 pAddBssParams->staContext.shortPreambleSupported =
329 (uint8_t) pBeaconStruct->capabilityInfo.shortPreamble;
330 pAddBssParams->staContext.updateSta = updateEntry;
331 pAddBssParams->staContext.encryptType =
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800332 ft_session->encryptType;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800333#ifdef WLAN_FEATURE_11W
334 pAddBssParams->staContext.rmfEnabled =
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800335 ft_session->limRmfEnabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800336#endif
337
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800338 if (IS_DOT11_MODE_HT(ft_session->dot11mode) &&
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800339 (pBeaconStruct->HTCaps.present)) {
340 pAddBssParams->staContext.us32MaxAmpduDuration = 0;
341 pAddBssParams->staContext.htCapable = 1;
342 pAddBssParams->staContext.greenFieldCapable =
343 (uint8_t) pBeaconStruct->HTCaps.greenField;
344 pAddBssParams->staContext.lsigTxopProtection =
345 (uint8_t) pBeaconStruct->HTCaps.lsigTXOPProtection;
346 if ((pBeaconStruct->HTCaps.supportedChannelWidthSet) &&
347 (chanWidthSupp)) {
348 pAddBssParams->staContext.ch_width = (uint8_t)
349 pBeaconStruct->HTInfo.recommendedTxWidthSet;
350 } else {
351 pAddBssParams->staContext.ch_width =
352 CH_WIDTH_20MHZ;
353 }
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800354 if (ft_session->vhtCapability &&
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800355 IS_BSS_VHT_CAPABLE(pBeaconStruct->VHTCaps)) {
356 pAddBssParams->staContext.vhtCapable = 1;
357 if ((pBeaconStruct->VHTCaps.suBeamFormerCap ||
358 pBeaconStruct->VHTCaps.muBeamformerCap) &&
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800359 ft_session->vht_config.su_beam_formee)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800360 sta_ctx->vhtTxBFCapable
361 = 1;
362 if (pBeaconStruct->VHTCaps.suBeamformeeCap &&
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800363 ft_session->vht_config.su_beam_former)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800364 sta_ctx->enable_su_tx_bformer = 1;
365 }
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800366 if (lim_is_session_he_capable(ft_session) &&
Naveen Rawatd8feac12017-09-08 15:08:39 -0700367 pBeaconStruct->he_cap.present)
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800368 lim_intersect_ap_he_caps(ft_session,
Krishna Kumaar Natarajan0103ef82017-02-17 18:15:56 -0800369 pAddBssParams, pBeaconStruct, NULL);
370
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800371 if ((pBeaconStruct->HTCaps.supportedChannelWidthSet) &&
372 (chanWidthSupp)) {
373 sta_ctx->ch_width = (uint8_t)
374 pBeaconStruct->HTInfo.recommendedTxWidthSet;
375 if (pAddBssParams->staContext.vhtCapable &&
376 pBeaconStruct->VHTOperation.chanWidth)
377 sta_ctx->ch_width =
378 pBeaconStruct->VHTOperation.chanWidth
379 + 1;
380 } else {
381 pAddBssParams->staContext.ch_width =
382 CH_WIDTH_20MHZ;
383 }
384 pAddBssParams->staContext.mimoPS =
385 (tSirMacHTMIMOPowerSaveState) pBeaconStruct->HTCaps.
386 mimoPowerSave;
387 pAddBssParams->staContext.maxAmsduSize =
388 (uint8_t) pBeaconStruct->HTCaps.maximalAMSDUsize;
389 pAddBssParams->staContext.maxAmpduDensity =
390 pBeaconStruct->HTCaps.mpduDensity;
391 pAddBssParams->staContext.fDsssCckMode40Mhz =
392 (uint8_t) pBeaconStruct->HTCaps.dsssCckMode40MHz;
393 pAddBssParams->staContext.fShortGI20Mhz =
394 (uint8_t) pBeaconStruct->HTCaps.shortGI20MHz;
395 pAddBssParams->staContext.fShortGI40Mhz =
396 (uint8_t) pBeaconStruct->HTCaps.shortGI40MHz;
397 pAddBssParams->staContext.maxAmpduSize =
398 pBeaconStruct->HTCaps.maxRxAMPDUFactor;
399
400 if (pBeaconStruct->HTInfo.present)
401 pAddBssParams->staContext.rifsMode =
402 pBeaconStruct->HTInfo.rifsMode;
403 }
404
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800405 if ((ft_session->limWmeEnabled
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800406 && pBeaconStruct->wmeEdcaPresent)
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800407 || (ft_session->limQosEnabled
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800408 && pBeaconStruct->edcaPresent))
409 pAddBssParams->staContext.wmmEnabled = 1;
410 else
411 pAddBssParams->staContext.wmmEnabled = 0;
412
413 pAddBssParams->staContext.wpa_rsn = pBeaconStruct->rsnPresent;
414 /* For OSEN Connection AP does not advertise RSN or WPA IE
415 * so from the IEs we get from supplicant we get this info
416 * so for FW to transmit EAPOL message 4 we shall set
417 * wpa_rsn
418 */
419 pAddBssParams->staContext.wpa_rsn |=
420 (pBeaconStruct->wpaPresent << 1);
421 if ((!pAddBssParams->staContext.wpa_rsn)
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800422 && (ft_session->isOSENConnection))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800423 pAddBssParams->staContext.wpa_rsn = 1;
424 /* Update the rates */
Jeff Johnson35592fc2018-11-22 11:36:10 -0800425 lim_populate_peer_rate_set(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800426 &pAddBssParams->staContext.
427 supportedRates,
428 pBeaconStruct->HTCaps.supportedMCSSet,
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800429 false, ft_session,
Krishna Kumaar Natarajand1cd56e2016-09-30 08:43:03 -0700430 &pBeaconStruct->VHTCaps,
Naveen Rawatd8feac12017-09-08 15:08:39 -0700431 &pBeaconStruct->he_cap);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800432 }
433
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800434 pAddBssParams->maxTxPower = ft_session->maxTxPower;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800435
436#ifdef WLAN_FEATURE_11W
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800437 if (ft_session->limRmfEnabled) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800438 pAddBssParams->rmfEnabled = 1;
439 pAddBssParams->staContext.rmfEnabled = 1;
440 }
441#endif
442
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530443 pAddBssParams->status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800444 pAddBssParams->respReqd = true;
445
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800446 pAddBssParams->staContext.sessionId = ft_session->peSessionId;
447 pAddBssParams->staContext.smesessionId = ft_session->smeSessionId;
448 pAddBssParams->sessionId = ft_session->peSessionId;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800449
450 /* Set a new state for MLME */
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800451 if (!lim_is_roam_synch_in_progress(ft_session)) {
452 ft_session->limMlmState =
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -0800453 eLIM_MLM_WT_ADD_BSS_RSP_FT_REASSOC_STATE;
454 MTRACE(mac_trace
Jeff Johnson35592fc2018-11-22 11:36:10 -0800455 (mac, TRACE_CODE_MLM_STATE,
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800456 ft_session->peSessionId,
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -0800457 eLIM_MLM_WT_ADD_BSS_RSP_FT_REASSOC_STATE));
458 }
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800459 pAddBssParams->halPersona = (uint8_t) ft_session->pePersona;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800460
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800461 ft_session->ftPEContext.pAddBssReq = pAddBssParams;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800462
Nishank Aggarwal8b805bb2017-03-23 14:50:18 +0530463 pe_debug("Saving SIR_HAL_ADD_BSS_REQ for pre-auth ap");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800464
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530465 qdf_mem_free(pBeaconStruct);
Varun Reddy Yeturubbbbe232016-02-29 14:01:57 -0800466 return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800467}
Varun Reddy Yeturubbbbe232016-02-29 14:01:57 -0800468#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800469
Paul Zhangc3fc0a82018-01-09 16:38:20 +0800470#if defined(WLAN_FEATURE_ROAM_OFFLOAD)
Krunal Soni4bfecf62017-06-05 15:26:35 -0700471/**
472 * lim_fill_dot11mode() - to fill 802.11 mode in FT session
473 * @mac_ctx: pointer to mac ctx
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800474 * @ft_session: FT session
Jeff Johnsonb5c13332018-12-03 09:54:51 -0800475 * @pe_session: PE session
Krunal Soni4bfecf62017-06-05 15:26:35 -0700476 *
477 * This API fills FT session's dot11mode either from pe session or
478 * from CFG depending on the condition.
479 *
480 * Return: none
481 */
Jeff Johnson9320c1e2018-12-02 13:09:20 -0800482static void lim_fill_dot11mode(struct mac_context *mac_ctx,
Jeff Johnsonb5c13332018-12-03 09:54:51 -0800483 struct pe_session *ft_session, struct pe_session *pe_session)
Krunal Soni4bfecf62017-06-05 15:26:35 -0700484{
485 uint32_t self_dot11_mode;
486
Jeff Johnsonb5c13332018-12-03 09:54:51 -0800487 if (pe_session->ftPEContext.pFTPreAuthReq &&
Krunal Soni4bfecf62017-06-05 15:26:35 -0700488 !mac_ctx->roam.configParam.isRoamOffloadEnabled) {
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800489 ft_session->dot11mode =
Jeff Johnsonb5c13332018-12-03 09:54:51 -0800490 pe_session->ftPEContext.pFTPreAuthReq->dot11mode;
Krunal Soni4bfecf62017-06-05 15:26:35 -0700491 } else {
492 wlan_cfg_get_int(mac_ctx, WNI_CFG_DOT11_MODE, &self_dot11_mode);
493 pe_debug("selfDot11Mode: %d", self_dot11_mode);
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800494 ft_session->dot11mode = self_dot11_mode;
Krunal Soni4bfecf62017-06-05 15:26:35 -0700495 }
496}
Paul Zhangc3fc0a82018-01-09 16:38:20 +0800497#elif defined(WLAN_FEATURE_HOST_ROAM)
Krunal Soni4bfecf62017-06-05 15:26:35 -0700498/**
499 * lim_fill_dot11mode() - to fill 802.11 mode in FT session
500 * @mac_ctx: pointer to mac ctx
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800501 * @ft_session: FT session
Jeff Johnsonb5c13332018-12-03 09:54:51 -0800502 * @pe_session: PE session
Krunal Soni4bfecf62017-06-05 15:26:35 -0700503 *
504 * This API fills FT session's dot11mode either from pe session.
505 *
506 * Return: none
507 */
Jeff Johnson9320c1e2018-12-02 13:09:20 -0800508static void lim_fill_dot11mode(struct mac_context *mac_ctx,
Jeff Johnsonb5c13332018-12-03 09:54:51 -0800509 struct pe_session *ft_session, struct pe_session *pe_session)
Krunal Soni4bfecf62017-06-05 15:26:35 -0700510{
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800511 ft_session->dot11mode =
Jeff Johnsonb5c13332018-12-03 09:54:51 -0800512 pe_session->ftPEContext.pFTPreAuthReq->dot11mode;
Krunal Soni4bfecf62017-06-05 15:26:35 -0700513}
514#endif
515
Varun Reddy Yeturubbbbe232016-02-29 14:01:57 -0800516#if defined(WLAN_FEATURE_HOST_ROAM) || defined(WLAN_FEATURE_ROAM_OFFLOAD)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800517/*------------------------------------------------------------------
518 *
519 * Setup the new session for the pre-auth AP.
520 * Return the newly created session entry.
521 *
522 *------------------------------------------------------------------*/
Jeff Johnson9320c1e2018-12-02 13:09:20 -0800523void lim_fill_ft_session(struct mac_context *mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800524 tpSirBssDescription pbssDescription,
Jeff Johnsonb5c13332018-12-03 09:54:51 -0800525 struct pe_session *ft_session, struct pe_session *pe_session)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800526{
527 uint8_t currentBssUapsd;
Amar Singhala297bfa2015-10-15 15:07:29 -0700528 int8_t localPowerConstraint;
529 int8_t regMax;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800530 tSchBeaconStruct *pBeaconStruct;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800531 ePhyChanBondState cbEnabledMode;
532
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530533 pBeaconStruct = qdf_mem_malloc(sizeof(tSchBeaconStruct));
Arif Hussainf5b6c412018-10-10 19:41:09 -0700534 if (!pBeaconStruct)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800535 return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800536
Deepak Dhamdhere26bda452016-01-09 22:54:48 -0800537 /* Retrieve the session that was already created and update the entry */
Jeff Johnsonb5c13332018-12-03 09:54:51 -0800538 ft_session->limWmeEnabled = pe_session->limWmeEnabled;
539 ft_session->limQosEnabled = pe_session->limQosEnabled;
540 ft_session->limWsmEnabled = pe_session->limWsmEnabled;
541 ft_session->lim11hEnable = pe_session->lim11hEnable;
542 ft_session->isOSENConnection = pe_session->isOSENConnection;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800543
544 /* Fields to be filled later */
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800545 ft_session->pLimJoinReq = NULL;
Jeff Johnsonb5c13332018-12-03 09:54:51 -0800546 ft_session->smeSessionId = pe_session->smeSessionId;
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800547 ft_session->transactionId = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800548
Jeff Johnson35592fc2018-11-22 11:36:10 -0800549 lim_extract_ap_capabilities(mac, (uint8_t *) pbssDescription->ieFields,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800550 lim_get_ielen_from_bss_description(pbssDescription),
551 pBeaconStruct);
552
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800553 ft_session->rateSet.numRates =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800554 pBeaconStruct->supportedRates.numRates;
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800555 qdf_mem_copy(ft_session->rateSet.rate,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800556 pBeaconStruct->supportedRates.rate,
557 pBeaconStruct->supportedRates.numRates);
558
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800559 ft_session->extRateSet.numRates =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800560 pBeaconStruct->extendedRates.numRates;
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800561 qdf_mem_copy(ft_session->extRateSet.rate,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800562 pBeaconStruct->extendedRates.rate,
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800563 ft_session->extRateSet.numRates);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800564
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800565 ft_session->ssId.length = pBeaconStruct->ssId.length;
566 qdf_mem_copy(ft_session->ssId.ssId, pBeaconStruct->ssId.ssId,
567 ft_session->ssId.length);
Jeff Johnsonb5c13332018-12-03 09:54:51 -0800568 lim_fill_dot11mode(mac, ft_session, pe_session);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800569
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800570 pe_debug("dot11mode: %d", ft_session->dot11mode);
571 ft_session->vhtCapability =
572 (IS_DOT11_MODE_VHT(ft_session->dot11mode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800573 && IS_BSS_VHT_CAPABLE(pBeaconStruct->VHTCaps));
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800574 ft_session->htCapability =
575 (IS_DOT11_MODE_HT(ft_session->dot11mode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800576 && pBeaconStruct->HTCaps.present);
577
578 /* Copy The channel Id to the session Table */
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800579 ft_session->limReassocChannelId = pbssDescription->channelId;
580 ft_session->currentOperChannel = pbssDescription->channelId;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800581
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800582 ft_session->limRFBand = lim_get_rf_band(
583 ft_session->currentOperChannel);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800584
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800585 if (ft_session->limRFBand == BAND_2G) {
Jeff Johnson35592fc2018-11-22 11:36:10 -0800586 cbEnabledMode = mac->roam.configParam.channelBondingMode24GHz;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800587 } else {
Jeff Johnson35592fc2018-11-22 11:36:10 -0800588 cbEnabledMode = mac->roam.configParam.channelBondingMode5GHz;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800589 }
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800590 ft_session->htSupportedChannelWidthSet =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800591 (pBeaconStruct->HTInfo.present) ?
592 (cbEnabledMode && pBeaconStruct->HTInfo.recommendedTxWidthSet) : 0;
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800593 ft_session->htRecommendedTxWidthSet =
594 ft_session->htSupportedChannelWidthSet;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800595
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800596 if (IS_BSS_VHT_CAPABLE(pBeaconStruct->VHTCaps) &&
597 pBeaconStruct->VHTOperation.present &&
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800598 ft_session->vhtCapability) {
599 ft_session->vhtCapabilityPresentInBeacon = 1;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800600 } else {
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800601 ft_session->vhtCapabilityPresentInBeacon = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800602 }
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800603 if (ft_session->htRecommendedTxWidthSet) {
604 ft_session->ch_width = CH_WIDTH_40MHZ;
605 if (ft_session->vhtCapabilityPresentInBeacon &&
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800606 pBeaconStruct->VHTOperation.chanWidth) {
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800607 ft_session->ch_width =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800608 pBeaconStruct->VHTOperation.chanWidth + 1;
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800609 ft_session->ch_center_freq_seg0 =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800610 pBeaconStruct->VHTOperation.chanCenterFreqSeg1;
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800611 ft_session->ch_center_freq_seg1 =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800612 pBeaconStruct->VHTOperation.chanCenterFreqSeg2;
613 } else {
614 if (pBeaconStruct->HTInfo.secondaryChannelOffset ==
615 PHY_DOUBLE_CHANNEL_LOW_PRIMARY)
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800616 ft_session->ch_center_freq_seg0 =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800617 pbssDescription->channelId + 2;
618 else if (pBeaconStruct->HTInfo.secondaryChannelOffset ==
619 PHY_DOUBLE_CHANNEL_HIGH_PRIMARY)
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800620 ft_session->ch_center_freq_seg0 =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800621 pbssDescription->channelId - 2;
622 else
Nishank Aggarwal8b805bb2017-03-23 14:50:18 +0530623 pe_warn("Invalid sec ch offset");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800624 }
625 } else {
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800626 ft_session->ch_width = CH_WIDTH_20MHZ;
627 ft_session->ch_center_freq_seg0 = 0;
628 ft_session->ch_center_freq_seg1 = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800629 }
630
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800631 sir_copy_mac_addr(ft_session->selfMacAddr,
Jeff Johnsonb5c13332018-12-03 09:54:51 -0800632 pe_session->selfMacAddr);
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800633 sir_copy_mac_addr(ft_session->limReAssocbssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800634 pbssDescription->bssId);
Jeff Johnsonb5c13332018-12-03 09:54:51 -0800635 sir_copy_mac_addr(ft_session->prev_ap_bssid, pe_session->bssId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800636
637 /* Store beaconInterval */
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800638 ft_session->beaconParams.beaconInterval =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800639 pbssDescription->beaconInterval;
Jeff Johnsonb5c13332018-12-03 09:54:51 -0800640 ft_session->bssType = pe_session->bssType;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800641
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800642 ft_session->statypeForBss = STA_ENTRY_PEER;
643 ft_session->nwType = pbssDescription->nwType;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800644
645
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800646 if (ft_session->bssType == eSIR_INFRASTRUCTURE_MODE) {
647 ft_session->limSystemRole = eLIM_STA_ROLE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800648 } else {
Rajeev Kumar005895d2016-04-15 14:17:47 -0700649 /* Throw an error & return & make sure to delete the session */
Nishank Aggarwal8b805bb2017-03-23 14:50:18 +0530650 pe_warn("Invalid bss type");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800651 }
652
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800653 ft_session->limCurrentBssCaps = pbssDescription->capabilityInfo;
654 ft_session->limReassocBssCaps = pbssDescription->capabilityInfo;
Jeff Johnson35592fc2018-11-22 11:36:10 -0800655 if (mac->mlme_cfg->ht_caps.short_slot_time_enabled &&
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800656 SIR_MAC_GET_SHORT_SLOT_TIME(ft_session->limReassocBssCaps)) {
657 ft_session->shortSlotTimeSupported = true;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800658 }
659
Jeff Johnson35592fc2018-11-22 11:36:10 -0800660 regMax = cfg_get_regulatory_max_transmit_power(mac,
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800661 ft_session->
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800662 currentOperChannel);
663 localPowerConstraint = regMax;
Jeff Johnson35592fc2018-11-22 11:36:10 -0800664 lim_extract_ap_capability(mac, (uint8_t *) pbssDescription->ieFields,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800665 lim_get_ielen_from_bss_description(pbssDescription),
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800666 &ft_session->limCurrentBssQosCaps,
667 &ft_session->limCurrentBssPropCap, &currentBssUapsd,
668 &localPowerConstraint, ft_session);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800669
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800670 ft_session->limReassocBssQosCaps =
671 ft_session->limCurrentBssQosCaps;
672 ft_session->limReassocBssPropCap =
673 ft_session->limCurrentBssPropCap;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800674
Jeff Johnsonb5c13332018-12-03 09:54:51 -0800675 ft_session->is11Rconnection = pe_session->is11Rconnection;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800676#ifdef FEATURE_WLAN_ESE
Jeff Johnsonb5c13332018-12-03 09:54:51 -0800677 ft_session->isESEconnection = pe_session->isESEconnection;
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800678 ft_session->is_ese_version_ie_present =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800679 pBeaconStruct->is_ese_ver_ie_present;
680#endif
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800681 ft_session->isFastTransitionEnabled =
Jeff Johnsonb5c13332018-12-03 09:54:51 -0800682 pe_session->isFastTransitionEnabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800683
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800684 ft_session->isFastRoamIniFeatureEnabled =
Jeff Johnsonb5c13332018-12-03 09:54:51 -0800685 pe_session->isFastRoamIniFeatureEnabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800686
687#ifdef FEATURE_WLAN_ESE
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800688 ft_session->maxTxPower =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800689 lim_get_max_tx_power(regMax, localPowerConstraint,
Jeff Johnson35592fc2018-11-22 11:36:10 -0800690 mac->roam.configParam.nTxPowerCap);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800691#else
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800692 ft_session->maxTxPower = QDF_MIN(regMax, (localPowerConstraint));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800693#endif
694
Nishank Aggarwal8b805bb2017-03-23 14:50:18 +0530695 pe_debug("Reg max: %d local pwr: %d, ini tx pwr: %d max tx pwr: %d",
Deepak Dhamdhere26bda452016-01-09 22:54:48 -0800696 regMax, localPowerConstraint,
Jeff Johnson35592fc2018-11-22 11:36:10 -0800697 mac->roam.configParam.nTxPowerCap,
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800698 ft_session->maxTxPower);
Jeff Johnsonb5c13332018-12-03 09:54:51 -0800699 if (!lim_is_roam_synch_in_progress(pe_session)) {
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800700 ft_session->limPrevSmeState = ft_session->limSmeState;
701 ft_session->limSmeState = eLIM_SME_WT_REASSOC_STATE;
Jeff Johnson35592fc2018-11-22 11:36:10 -0800702 MTRACE(mac_trace(mac,
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -0800703 TRACE_CODE_SME_STATE,
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800704 ft_session->peSessionId,
705 ft_session->limSmeState));
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -0800706 }
Jeff Johnsonb5c13332018-12-03 09:54:51 -0800707 ft_session->encryptType = pe_session->encryptType;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800708#ifdef WLAN_FEATURE_11W
Jeff Johnsonb5c13332018-12-03 09:54:51 -0800709 ft_session->limRmfEnabled = pe_session->limRmfEnabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800710#endif
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800711 if ((ft_session->limRFBand == BAND_2G) &&
712 (ft_session->htSupportedChannelWidthSet ==
Sandeep Puligillae0875662016-02-12 16:09:21 -0800713 eHT_CHANNEL_WIDTH_40MHZ))
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800714 lim_init_obss_params(mac, ft_session);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800715
Jeff Johnsonb5c13332018-12-03 09:54:51 -0800716 ft_session->enableHtSmps = pe_session->enableHtSmps;
717 ft_session->htSmpsvalue = pe_session->htSmpsvalue;
Archana Ramachandran5482d6a2016-03-29 17:09:22 -0700718 /*
719 * By default supported NSS 1x1 is set to true
720 * and later on updated while determining session
721 * supported rates which is the intersection of
722 * self and peer rates
723 */
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800724 ft_session->supported_nss_1x1 = true;
Nishank Aggarwal8b805bb2017-03-23 14:50:18 +0530725 pe_debug("FT enable smps: %d mode: %d supported nss 1x1: %d",
Jeff Johnsonf3408a62018-12-01 22:47:27 -0800726 ft_session->enableHtSmps,
727 ft_session->htSmpsvalue,
728 ft_session->supported_nss_1x1);
Archana Ramachandran5482d6a2016-03-29 17:09:22 -0700729
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530730 qdf_mem_free(pBeaconStruct);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800731}
Varun Reddy Yeturubbbbe232016-02-29 14:01:57 -0800732#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800733
734/*------------------------------------------------------------------
735 *
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800736 * This function is called to process the update key request from SME
737 *
738 *------------------------------------------------------------------*/
Jeff Johnson9320c1e2018-12-02 13:09:20 -0800739bool lim_process_ft_update_key(struct mac_context *mac, uint32_t *pMsgBuf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800740{
741 tAddBssParams *pAddBssParams;
742 tSirFTUpdateKeyInfo *pKeyInfo;
Jeff Johnsonb5c13332018-12-03 09:54:51 -0800743 struct pe_session *pe_session;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800744 uint8_t sessionId;
745
746 /* Sanity Check */
Jeff Johnson35592fc2018-11-22 11:36:10 -0800747 if (mac == NULL || pMsgBuf == NULL) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800748 return false;
749 }
750
751 pKeyInfo = (tSirFTUpdateKeyInfo *) pMsgBuf;
752
Jeff Johnsonb5c13332018-12-03 09:54:51 -0800753 pe_session = pe_find_session_by_bssid(mac, pKeyInfo->bssid.bytes,
Srinivas Girigowdaf9d9dd42015-12-04 13:53:58 -0800754 &sessionId);
Jeff Johnsonb5c13332018-12-03 09:54:51 -0800755 if (NULL == pe_session) {
Nishank Aggarwal8b805bb2017-03-23 14:50:18 +0530756 pe_err("%s: Unable to find session for the following bssid",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800757 __func__);
Jeff Johnson35592fc2018-11-22 11:36:10 -0800758 lim_print_mac_addr(mac, pKeyInfo->bssid.bytes, LOGE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800759 return false;
760 }
761
762 /* Nothing to be done if the session is not in STA mode */
Jeff Johnsonb5c13332018-12-03 09:54:51 -0800763 if (!LIM_IS_STA_ROLE(pe_session)) {
764 pe_err("pe_session is not in STA mode");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800765 return false;
766 }
767
Jeff Johnsonb5c13332018-12-03 09:54:51 -0800768 if (NULL == pe_session->ftPEContext.pAddBssReq) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800769 /* AddBss Req is NULL, save the keys to configure them later. */
770 tpLimMlmSetKeysReq pMlmSetKeysReq =
Jeff Johnsonb5c13332018-12-03 09:54:51 -0800771 &pe_session->ftPEContext.PreAuthKeyInfo.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800772 extSetStaKeyParam;
773
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530774 qdf_mem_zero(pMlmSetKeysReq, sizeof(tLimMlmSetKeysReq));
Anurag Chouhanc5548422016-02-24 18:33:27 +0530775 qdf_copy_macaddr(&pMlmSetKeysReq->peer_macaddr,
Srinivas Girigowdaf9d9dd42015-12-04 13:53:58 -0800776 &pKeyInfo->bssid);
Jeff Johnsonb5c13332018-12-03 09:54:51 -0800777 pMlmSetKeysReq->sessionId = pe_session->peSessionId;
778 pMlmSetKeysReq->smesessionId = pe_session->smeSessionId;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800779 pMlmSetKeysReq->edType = pKeyInfo->keyMaterial.edType;
780 pMlmSetKeysReq->numKeys = pKeyInfo->keyMaterial.numKeys;
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530781 qdf_mem_copy((uint8_t *) &pMlmSetKeysReq->key,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800782 (uint8_t *) &pKeyInfo->keyMaterial.key,
783 sizeof(tSirKeys));
784
Jeff Johnsonb5c13332018-12-03 09:54:51 -0800785 pe_session->ftPEContext.PreAuthKeyInfo.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800786 extSetStaKeyParamValid = true;
787
Jeff Johnsonb5c13332018-12-03 09:54:51 -0800788 if (pe_session->ftPEContext.pAddStaReq == NULL) {
Nishank Aggarwal8b805bb2017-03-23 14:50:18 +0530789 pe_err("pAddStaReq is NULL");
Jeff Johnson35592fc2018-11-22 11:36:10 -0800790 lim_send_set_sta_key_req(mac, pMlmSetKeysReq, 0, 0,
Jeff Johnsonb5c13332018-12-03 09:54:51 -0800791 pe_session, false);
792 pe_session->ftPEContext.PreAuthKeyInfo.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800793 extSetStaKeyParamValid = false;
794 }
795 } else {
Jeff Johnsonb5c13332018-12-03 09:54:51 -0800796 pAddBssParams = pe_session->ftPEContext.pAddBssReq;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800797
798 /* Store the key information in the ADD BSS parameters */
799 pAddBssParams->extSetStaKeyParamValid = 1;
800 pAddBssParams->extSetStaKeyParam.encType =
801 pKeyInfo->keyMaterial.edType;
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530802 qdf_mem_copy((uint8_t *) &pAddBssParams->extSetStaKeyParam.key,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800803 (uint8_t *) &pKeyInfo->keyMaterial.key,
804 sizeof(tSirKeys));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800805
Wu Gao93816212018-08-31 16:49:54 +0800806 pAddBssParams->extSetStaKeyParam.singleTidRc =
Jeff Johnson35592fc2018-11-22 11:36:10 -0800807 (uint8_t)mac->mlme_cfg->sta.single_tid;
Nishank Aggarwal8b805bb2017-03-23 14:50:18 +0530808 pe_debug("Key valid: %d keyLength: %d",
Nishank Aggarwalabfd70b2017-03-11 16:48:25 +0530809 pAddBssParams->extSetStaKeyParamValid,
810 pAddBssParams->extSetStaKeyParam.key[0].keyLength);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800811
812 pAddBssParams->extSetStaKeyParam.staIdx = 0;
813
Nishank Aggarwal8b805bb2017-03-23 14:50:18 +0530814 pe_debug("BSSID: " MAC_ADDRESS_STR,
Nishank Aggarwalabfd70b2017-03-11 16:48:25 +0530815 MAC_ADDR_ARRAY(pKeyInfo->bssid.bytes));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800816
Anurag Chouhanc5548422016-02-24 18:33:27 +0530817 qdf_copy_macaddr(&pAddBssParams->extSetStaKeyParam.peer_macaddr,
Srinivas Girigowdaf9d9dd42015-12-04 13:53:58 -0800818 &pKeyInfo->bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800819
820 pAddBssParams->extSetStaKeyParam.sendRsp = false;
821
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800822 }
823 return true;
824}
825
Jeff Johnson4f9d4a22016-10-06 18:45:15 -0700826static void
Jeff Johnson9320c1e2018-12-02 13:09:20 -0800827lim_ft_send_aggr_qos_rsp(struct mac_context *mac, uint8_t rspReqd,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800828 tpAggrAddTsParams aggrQosRsp, uint8_t smesessionId)
829{
830 tpSirAggrQosRsp rsp;
831 int i = 0;
Srinivas Girigowda4d65ebe2017-10-13 21:41:42 -0700832
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800833 if (!rspReqd) {
834 return;
835 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530836 rsp = qdf_mem_malloc(sizeof(tSirAggrQosRsp));
Arif Hussainf5b6c412018-10-10 19:41:09 -0700837 if (!rsp)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800838 return;
Arif Hussainf5b6c412018-10-10 19:41:09 -0700839
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800840 rsp->messageType = eWNI_SME_FT_AGGR_QOS_RSP;
841 rsp->sessionId = smesessionId;
842 rsp->length = sizeof(*rsp);
843 rsp->aggrInfo.tspecIdx = aggrQosRsp->tspecIdx;
844 for (i = 0; i < SIR_QOS_NUM_AC_MAX; i++) {
845 if ((1 << i) & aggrQosRsp->tspecIdx) {
Naveen Rawat25735af2017-07-05 15:24:28 -0700846 if (QDF_IS_STATUS_SUCCESS(aggrQosRsp->status[i]))
847 rsp->aggrInfo.aggrRsp[i].status =
848 eSIR_MAC_SUCCESS_STATUS;
849 else
850 rsp->aggrInfo.aggrRsp[i].status =
851 eSIR_MAC_UNSPEC_FAILURE_STATUS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800852 rsp->aggrInfo.aggrRsp[i].tspec = aggrQosRsp->tspec[i];
853 }
854 }
Jeff Johnson35592fc2018-11-22 11:36:10 -0800855 lim_send_sme_aggr_qos_rsp(mac, rsp, smesessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800856 return;
857}
Varun Reddy Yeturudbbb9912016-02-10 14:32:50 -0800858
Jeff Johnson9320c1e2018-12-02 13:09:20 -0800859void lim_process_ft_aggr_qo_s_rsp(struct mac_context *mac,
Rajeev Kumarfeb96382017-01-22 19:42:09 -0800860 struct scheduler_msg *limMsg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800861{
862 tpAggrAddTsParams pAggrQosRspMsg = NULL;
863 tAddTsParams addTsParam = { 0 };
864 tpDphHashNode pSta = NULL;
865 uint16_t assocId = 0;
866 tSirMacAddr peerMacAddr;
867 uint8_t rspReqd = 1;
Jeff Johnsonb5c13332018-12-03 09:54:51 -0800868 struct pe_session *pe_session = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800869 int i = 0;
Srinivas Girigowda4d65ebe2017-10-13 21:41:42 -0700870
Nishank Aggarwal8b805bb2017-03-23 14:50:18 +0530871 pe_debug(" Received AGGR_QOS_RSP from HAL");
Jeff Johnson35592fc2018-11-22 11:36:10 -0800872 SET_LIM_PROCESS_DEFD_MESGS(mac, true);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800873 pAggrQosRspMsg = (tpAggrAddTsParams) (limMsg->bodyptr);
874 if (NULL == pAggrQosRspMsg) {
Nishank Aggarwal8b805bb2017-03-23 14:50:18 +0530875 pe_err("NULL pAggrQosRspMsg");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800876 return;
877 }
Jeff Johnsonb5c13332018-12-03 09:54:51 -0800878 pe_session =
Jeff Johnson35592fc2018-11-22 11:36:10 -0800879 pe_find_session_by_session_id(mac, pAggrQosRspMsg->sessionId);
Jeff Johnsonb5c13332018-12-03 09:54:51 -0800880 if (NULL == pe_session) {
Nishank Aggarwal8b805bb2017-03-23 14:50:18 +0530881 pe_err("Cant find session entry for %s", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800882 if (pAggrQosRspMsg != NULL) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530883 qdf_mem_free(pAggrQosRspMsg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800884 }
885 return;
886 }
Jeff Johnsonb5c13332018-12-03 09:54:51 -0800887 if (!LIM_IS_STA_ROLE(pe_session)) {
888 pe_err("pe_session is not in STA mode");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800889 return;
890 }
891 for (i = 0; i < HAL_QOS_NUM_AC_MAX; i++) {
892 if ((((1 << i) & pAggrQosRspMsg->tspecIdx)) &&
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530893 (pAggrQosRspMsg->status[i] != QDF_STATUS_SUCCESS)) {
Jeff Johnsonb5c13332018-12-03 09:54:51 -0800894 sir_copy_mac_addr(peerMacAddr, pe_session->bssId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800895 addTsParam.staIdx = pAggrQosRspMsg->staIdx;
896 addTsParam.sessionId = pAggrQosRspMsg->sessionId;
897 addTsParam.tspec = pAggrQosRspMsg->tspec[i];
898 addTsParam.tspecIdx = pAggrQosRspMsg->tspecIdx;
Jeff Johnson35592fc2018-11-22 11:36:10 -0800899 lim_send_delts_req_action_frame(mac, peerMacAddr, rspReqd,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800900 &addTsParam.tspec.tsinfo,
901 &addTsParam.tspec,
Jeff Johnsonb5c13332018-12-03 09:54:51 -0800902 pe_session);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800903 pSta =
Jeff Johnson35592fc2018-11-22 11:36:10 -0800904 dph_lookup_assoc_id(mac, addTsParam.staIdx, &assocId,
Jeff Johnsonb5c13332018-12-03 09:54:51 -0800905 &pe_session->dph.dphHashTable);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800906 if (pSta != NULL) {
Jeff Johnson35592fc2018-11-22 11:36:10 -0800907 lim_admit_control_delete_ts(mac, assocId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800908 &addTsParam.tspec.
909 tsinfo, NULL,
910 (uint8_t *) &
911 addTsParam.tspecIdx);
912 }
913 }
914 }
Jeff Johnson35592fc2018-11-22 11:36:10 -0800915 lim_ft_send_aggr_qos_rsp(mac, rspReqd, pAggrQosRspMsg,
Jeff Johnsonb5c13332018-12-03 09:54:51 -0800916 pe_session->smeSessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800917 if (pAggrQosRspMsg != NULL) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530918 qdf_mem_free(pAggrQosRspMsg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800919 }
920 return;
921}
Varun Reddy Yeturudbbb9912016-02-10 14:32:50 -0800922
Jeff Johnson9320c1e2018-12-02 13:09:20 -0800923QDF_STATUS lim_process_ft_aggr_qos_req(struct mac_context *mac, uint32_t *pMsgBuf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800924{
Rajeev Kumar37d478b2017-04-17 16:59:28 -0700925 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800926 tSirAggrQosReq *aggrQosReq = (tSirAggrQosReq *) pMsgBuf;
927 tpAggrAddTsParams pAggrAddTsParam;
Jeff Johnsonb5c13332018-12-03 09:54:51 -0800928 struct pe_session *pe_session = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800929 tpLimTspecInfo tspecInfo;
930 uint8_t ac;
931 tpDphHashNode pSta;
932 uint16_t aid;
933 uint8_t sessionId;
934 int i;
935
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530936 pAggrAddTsParam = qdf_mem_malloc(sizeof(tAggrAddTsParams));
Arif Hussainf5b6c412018-10-10 19:41:09 -0700937 if (!pAggrAddTsParam)
Jeff Johnson0301ecb2018-06-29 09:36:23 -0700938 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800939
Jeff Johnsonb5c13332018-12-03 09:54:51 -0800940 pe_session = pe_find_session_by_bssid(mac, aggrQosReq->bssid.bytes,
Srinivas Girigowda99faf482015-12-03 19:06:15 -0800941 &sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800942
Jeff Johnsonb5c13332018-12-03 09:54:51 -0800943 if (pe_session == NULL) {
Nishank Aggarwal8b805bb2017-03-23 14:50:18 +0530944 pe_err("psession Entry Null for sessionId: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800945 aggrQosReq->sessionId);
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530946 qdf_mem_free(pAggrAddTsParam);
Jeff Johnson0301ecb2018-06-29 09:36:23 -0700947 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800948 }
949
950 /* Nothing to be done if the session is not in STA mode */
Jeff Johnsonb5c13332018-12-03 09:54:51 -0800951 if (!LIM_IS_STA_ROLE(pe_session)) {
952 pe_err("pe_session is not in STA mode");
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530953 qdf_mem_free(pAggrAddTsParam);
Jeff Johnson0301ecb2018-06-29 09:36:23 -0700954 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800955 }
956
Jeff Johnson35592fc2018-11-22 11:36:10 -0800957 pSta = dph_lookup_hash_entry(mac, aggrQosReq->bssid.bytes, &aid,
Jeff Johnsonb5c13332018-12-03 09:54:51 -0800958 &pe_session->dph.dphHashTable);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800959 if (pSta == NULL) {
Nishank Aggarwal8b805bb2017-03-23 14:50:18 +0530960 pe_err("Station context not found - ignoring AddTsRsp");
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530961 qdf_mem_free(pAggrAddTsParam);
Jeff Johnson0301ecb2018-06-29 09:36:23 -0700962 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800963 }
964
Jeff Johnsonb5c13332018-12-03 09:54:51 -0800965 pAggrAddTsParam->staIdx = pe_session->staId;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800966 /* Fill in the sessionId specific to PE */
967 pAggrAddTsParam->sessionId = sessionId;
968 pAggrAddTsParam->tspecIdx = aggrQosReq->aggrInfo.tspecIdx;
Jeff Johnsonb5c13332018-12-03 09:54:51 -0800969 pAggrAddTsParam->vdev_id = pe_session->smeSessionId;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800970
971 for (i = 0; i < HAL_QOS_NUM_AC_MAX; i++) {
972 if (aggrQosReq->aggrInfo.tspecIdx & (1 << i)) {
973 tSirMacTspecIE *pTspec =
974 &aggrQosReq->aggrInfo.aggrAddTsInfo[i].tspec;
975 /* Since AddTS response was successful, check for the PSB flag
976 * and directional flag inside the TS Info field.
977 * An AC is trigger enabled AC if the PSB subfield is set to 1
978 * in the uplink direction.
979 * An AC is delivery enabled AC if the PSB subfield is set to 1
980 * in the downlink direction.
981 * An AC is trigger and delivery enabled AC if the PSB subfield
982 * is set to 1 in the bi-direction field.
983 */
984 if (pTspec->tsinfo.traffic.psb == 1) {
Jeff Johnson35592fc2018-11-22 11:36:10 -0800985 lim_set_tspec_uapsd_mask_per_session(mac,
Jeff Johnsonb5c13332018-12-03 09:54:51 -0800986 pe_session,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800987 &pTspec->
988 tsinfo,
989 SET_UAPSD_MASK);
990 } else {
Jeff Johnson35592fc2018-11-22 11:36:10 -0800991 lim_set_tspec_uapsd_mask_per_session(mac,
Jeff Johnsonb5c13332018-12-03 09:54:51 -0800992 pe_session,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800993 &pTspec->
994 tsinfo,
995 CLEAR_UAPSD_MASK);
996 }
997 /*
998 * ADDTS success, so AC is now admitted.
999 * We shall now use the default
1000 * EDCA parameters as advertised by AP and
1001 * send the updated EDCA params
1002 * to HAL.
1003 */
1004 ac = upToAc(pTspec->tsinfo.traffic.userPrio);
1005 if (pTspec->tsinfo.traffic.direction ==
1006 SIR_MAC_DIRECTION_UPLINK) {
Jeff Johnsonb5c13332018-12-03 09:54:51 -08001007 pe_session->
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001008 gAcAdmitMask
1009 [SIR_MAC_DIRECTION_UPLINK] |=
1010 (1 << ac);
1011 } else if (pTspec->tsinfo.traffic.direction ==
1012 SIR_MAC_DIRECTION_DNLINK) {
Jeff Johnsonb5c13332018-12-03 09:54:51 -08001013 pe_session->
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001014 gAcAdmitMask
1015 [SIR_MAC_DIRECTION_DNLINK] |=
1016 (1 << ac);
1017 } else if (pTspec->tsinfo.traffic.direction ==
1018 SIR_MAC_DIRECTION_BIDIR) {
Jeff Johnsonb5c13332018-12-03 09:54:51 -08001019 pe_session->
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001020 gAcAdmitMask
1021 [SIR_MAC_DIRECTION_UPLINK] |=
1022 (1 << ac);
Jeff Johnsonb5c13332018-12-03 09:54:51 -08001023 pe_session->
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001024 gAcAdmitMask
1025 [SIR_MAC_DIRECTION_DNLINK] |=
1026 (1 << ac);
1027 }
Jeff Johnson35592fc2018-11-22 11:36:10 -08001028 lim_set_active_edca_params(mac,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08001029 pe_session->gLimEdcaParams,
1030 pe_session);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001031
Jeff Johnson35592fc2018-11-22 11:36:10 -08001032 lim_send_edca_params(mac,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08001033 pe_session->gLimEdcaParamsActive,
Kiran Kumar Lokere27026ae2018-03-09 11:38:19 -08001034 pSta->bssId, false);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001035
Jeff Johnson0301ecb2018-06-29 09:36:23 -07001036 if (QDF_STATUS_SUCCESS !=
Jeff Johnson35592fc2018-11-22 11:36:10 -08001037 lim_tspec_add(mac, pSta->staAddr, pSta->assocId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001038 pTspec, 0, &tspecInfo)) {
Nishank Aggarwal8b805bb2017-03-23 14:50:18 +05301039 pe_err("Adding entry in lim Tspec Table failed");
Jeff Johnson35592fc2018-11-22 11:36:10 -08001040 mac->lim.gLimAddtsSent = false;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301041 qdf_mem_free(pAggrAddTsParam);
Jeff Johnson0301ecb2018-06-29 09:36:23 -07001042 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001043 }
1044
1045 pAggrAddTsParam->tspec[i] =
1046 aggrQosReq->aggrInfo.aggrAddTsInfo[i].tspec;
1047 }
1048 }
1049
1050#ifdef WLAN_FEATURE_ROAM_OFFLOAD
Jeff Johnson35592fc2018-11-22 11:36:10 -08001051 if (!mac->mlme_cfg->lfr.lfr3_roaming_offload ||
1052 (mac->mlme_cfg->lfr.lfr3_roaming_offload &&
Jeff Johnsonb5c13332018-12-03 09:54:51 -08001053 !pe_session->is11Rconnection))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001054#endif
1055 {
1056 msg.type = WMA_AGGR_QOS_REQ;
1057 msg.bodyptr = pAggrAddTsParam;
1058 msg.bodyval = 0;
1059
1060 /* We need to defer any incoming messages until we get a
1061 * WMA_AGGR_QOS_RSP from HAL.
1062 */
Jeff Johnson35592fc2018-11-22 11:36:10 -08001063 SET_LIM_PROCESS_DEFD_MESGS(mac, false);
Jeff Johnsonb5c13332018-12-03 09:54:51 -08001064 MTRACE(mac_trace_msg_tx(mac, pe_session->peSessionId, msg.type));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001065
Jeff Johnson35592fc2018-11-22 11:36:10 -08001066 if (QDF_STATUS_SUCCESS != wma_post_ctrl_msg(mac, &msg)) {
Nishank Aggarwal8b805bb2017-03-23 14:50:18 +05301067 pe_warn("wma_post_ctrl_msg() failed");
Jeff Johnson35592fc2018-11-22 11:36:10 -08001068 SET_LIM_PROCESS_DEFD_MESGS(mac, true);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301069 qdf_mem_free(pAggrAddTsParam);
Jeff Johnson0301ecb2018-06-29 09:36:23 -07001070 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001071 }
1072 }
1073#ifdef WLAN_FEATURE_ROAM_OFFLOAD
1074 else {
1075 /* Implies it is a LFR3.0 based 11r connection
Jeff Johnson47d75242018-05-12 15:58:53 -07001076 * so donot send add ts request to firmware since it
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001077 * already has the RIC IEs */
1078
1079 /* Send the Aggr QoS response to SME */
Jeff Johnson35592fc2018-11-22 11:36:10 -08001080 lim_ft_send_aggr_qos_rsp(mac, true, pAggrAddTsParam,
Jeff Johnsonb5c13332018-12-03 09:54:51 -08001081 pe_session->smeSessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001082 if (pAggrAddTsParam != NULL) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301083 qdf_mem_free(pAggrAddTsParam);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001084 }
1085 }
1086#endif
1087
Jeff Johnson0301ecb2018-06-29 09:36:23 -07001088 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001089}