blob: a3d8ef423d58c20e211dd4e28894f37f22136304 [file] [log] [blame]
Jeff Johnson295189b2012-06-20 16:38:30 -07001/*
yeshwanth sriram guntukac1046a52017-04-25 16:34:50 +05302 * Copyright (c) 2012-2017 The Linux Foundation. All rights reserved.
Kiet Lam842dad02014-02-18 18:44:02 -08003 *
4 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
5 *
6 *
7 * Permission to use, copy, modify, and/or distribute this software for
8 * any purpose with or without fee is hereby granted, provided that the
9 * above copyright notice and this permission notice appear in all
10 * copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
13 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
14 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
15 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
16 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
17 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
18 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19 * PERFORMANCE OF THIS SOFTWARE.
Gopichand Nakkala92f07d82013-01-08 21:16:34 -080020 */
Kiet Lam842dad02014-02-18 18:44:02 -080021
Gopichand Nakkala92f07d82013-01-08 21:16:34 -080022/*
Kiet Lam842dad02014-02-18 18:44:02 -080023 * This file was originally distributed by Qualcomm Atheros, Inc.
24 * under proprietary terms before Copyright ownership was assigned
25 * to the Linux Foundation.
26 */
27
28/*
Jeff Johnson295189b2012-06-20 16:38:30 -070029 * This file limProcessProbeReqFrame.cc contains the code
30 * for processing Probe Request Frame.
31 * Author: Chandra Modumudi
32 * Date: 02/28/02
33 * History:-
34 * Date Modified by Modification Information
35 * --------------------------------------------------------------------
36 *
37 */
38
Satyanarayana Dash6f438272015-03-03 18:01:06 +053039#include "wniCfg.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070040#include "aniGlobal.h"
41#include "cfgApi.h"
42
43#include "utilsApi.h"
44#include "limTypes.h"
45#include "limUtils.h"
46#include "limAssocUtils.h"
47#include "limSerDesUtils.h"
48#include "parserApi.h"
49#include "limSession.h"
50
51#ifdef WLAN_FEATURE_P2P_INTERNAL
52void limSendP2PProbeResponse(tpAniSirGlobal pMac, tANI_U8 *pBd,
53 tpPESession psessionEntry);
54#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070055void
56
57limSendSmeProbeReqInd(tpAniSirGlobal pMac,
58 tSirMacAddr peerMacAddr,
59 tANI_U8 *pProbeReqIE,
60 tANI_U32 ProbeReqIELen,
61 tpPESession psessionEntry);
62
63/**
64 * limGetWPSPBCSessions
65 *
66 *FUNCTION:
67 * This function is called to query the WPS PBC overlap
68 *
69 *LOGIC:
70 * This function check WPS PBC probe request link list for PBC overlap
71 *
72 *ASSUMPTIONS:
73 *
74 *
75 *NOTE:
76 *
77 * @param pMac Pointer to Global MAC structure
78 * @param addr A pointer to probe request source MAC addresss
79 * @param uuid_e A pointer to UUIDE element of WPS IE in WPS PBC probe request
80 * @param psessionEntry A pointer to station PE session
81 *
82 * @return None
83 */
84
85void limGetWPSPBCSessions(tpAniSirGlobal pMac, tANI_U8 *addr,
86 tANI_U8 *uuid_e, eWPSPBCOverlap *overlap,
87 tpPESession psessionEntry)
88{
89 int count = 0;
90 tSirWPSPBCSession *pbc;
91 tANI_TIMESTAMP curTime;
92
93 curTime = (tANI_TIMESTAMP)(palGetTickCount(pMac->hHdd) / PAL_TICKS_PER_SECOND);
94
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +053095 vos_mem_set((tANI_U8 *)addr, sizeof(tSirMacAddr), 0);
96 vos_mem_set((tANI_U8 *)uuid_e, SIR_WPS_UUID_LEN, 0);
Jeff Johnson295189b2012-06-20 16:38:30 -070097
98 for (pbc = psessionEntry->pAPWPSPBCSession; pbc; pbc = pbc->next) {
99
100 if (curTime > pbc->timestamp + SIR_WPS_PBC_WALK_TIME)
101 break;
102
103 count++;
104 if(count > 1)
105 break;
106
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530107 vos_mem_copy((tANI_U8 *)addr, (tANI_U8 *)pbc->addr, sizeof(tSirMacAddr));
108 vos_mem_copy((tANI_U8 *)uuid_e, (tANI_U8 *)pbc->uuid_e, SIR_WPS_UUID_LEN);
Jeff Johnson295189b2012-06-20 16:38:30 -0700109 }
110
111 if (count > 1)
112 {
113 *overlap = eSAP_WPSPBC_OVERLAP_IN120S; // Overlap
114 }
115 else if(count == 0)
116 {
117 *overlap = eSAP_WPSPBC_NO_WPSPBC_PROBE_REQ_IN120S; // no WPS probe request in 120 second
118 } else
119 {
120 *overlap = eSAP_WPSPBC_ONE_WPSPBC_PROBE_REQ_IN120S; // One WPS probe request in 120 second
121 }
122
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700123 PELOGE(limLog(pMac, LOGE, FL("overlap = %d"), *overlap);)
Jeff Johnson295189b2012-06-20 16:38:30 -0700124 PELOGE(sirDumpBuf(pMac, SIR_LIM_MODULE_ID, LOGE, addr, sizeof(tSirMacAddr));)
125 PELOGE(sirDumpBuf(pMac, SIR_LIM_MODULE_ID, LOGE, uuid_e, SIR_WPS_UUID_LEN);)
126
127 return;
128}
129
130/**
131 * limRemoveTimeoutPBCsessions
132 *
133 *FUNCTION:
134 * This function is called to remove the WPS PBC probe request entires from specific entry to end.
135 *
136 *LOGIC:
137 *
138 *
139 *ASSUMPTIONS:
140 *
141 *
142 *NOTE:
143 *
144 * @param pMac Pointer to Global MAC structure
145 * @param pbc The beginning entry in WPS PBC probe request link list
146 *
147 * @return None
148 */
149static void limRemoveTimeoutPBCsessions(tpAniSirGlobal pMac, tSirWPSPBCSession *pbc)
150{
151 tSirWPSPBCSession *prev;
152
153 while (pbc) {
154 prev = pbc;
155 pbc = pbc->next;
156
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700157 PELOG4(limLog(pMac, LOG4, FL("WPS PBC sessions remove"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700158 PELOG4(sirDumpBuf(pMac, SIR_LIM_MODULE_ID, LOG4, prev->addr, sizeof(tSirMacAddr));)
159 PELOG4(sirDumpBuf(pMac, SIR_LIM_MODULE_ID, LOG4, prev->uuid_e, SIR_WPS_UUID_LEN);)
160
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530161 vos_mem_free(prev);
Jeff Johnson295189b2012-06-20 16:38:30 -0700162 }
163}
164
165void limRemovePBCSessions(tpAniSirGlobal pMac, tSirMacAddr pRemoveMac,tpPESession psessionEntry)
166{
167 tSirWPSPBCSession *pbc, *prev = NULL;
168 prev = pbc = psessionEntry->pAPWPSPBCSession;
169
170 while (pbc) {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530171 if (vos_mem_compare((tANI_U8 *)pbc->addr,
172 (tANI_U8 *)pRemoveMac, sizeof(tSirMacAddr))) {
Jeff Johnson295189b2012-06-20 16:38:30 -0700173 prev->next = pbc->next;
174 if (pbc == psessionEntry->pAPWPSPBCSession)
175 psessionEntry->pAPWPSPBCSession = pbc->next;
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530176 vos_mem_free(pbc);
Jeff Johnson295189b2012-06-20 16:38:30 -0700177 return;
178 }
179 prev = pbc;
180 pbc = pbc->next;
181 }
182
183}
184
185/**
186 * limUpdatePBCSessionEntry
187 *
188 *FUNCTION:
189 * This function is called when probe request with WPS PBC IE is received
190 *
191 *LOGIC:
192 * This function add the WPS PBC probe request in the WPS PBC probe request link list
193 * The link list is in decreased time order of probe request that is received.
194 * The entry that is more than 120 second is removed.
195 *
196 *ASSUMPTIONS:
197 *
198 *
199 *NOTE:
200 *
201 * @param pMac Pointer to Global MAC structure
202 * @param addr A pointer to probe request source MAC addresss
203 * @param uuid_e A pointer to UUIDE element of WPS IE
204 * @param psessionEntry A pointer to station PE session
205 *
206 * @return None
207 */
208
209static void limUpdatePBCSessionEntry(tpAniSirGlobal pMac,
210 tANI_U8 *addr, tANI_U8 *uuid_e,
211 tpPESession psessionEntry)
212{
213 tSirWPSPBCSession *pbc, *prev = NULL;
214
215 tANI_TIMESTAMP curTime;
216
217 curTime = (tANI_TIMESTAMP)(palGetTickCount(pMac->hHdd) / PAL_TICKS_PER_SECOND);
218
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700219 PELOG4(limLog(pMac, LOG4, FL("Receive WPS probe reques curTime=%d"), curTime);)
Jeff Johnson295189b2012-06-20 16:38:30 -0700220 PELOG4(sirDumpBuf(pMac, SIR_LIM_MODULE_ID, LOG4, addr, sizeof(tSirMacAddr));)
221 PELOG4(sirDumpBuf(pMac, SIR_LIM_MODULE_ID, LOG4, uuid_e, SIR_WPS_UUID_LEN);)
222
223 pbc = psessionEntry->pAPWPSPBCSession;
224
225 while (pbc) {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530226 if (vos_mem_compare((tANI_U8 *)pbc->addr, (tANI_U8 *)addr, sizeof(tSirMacAddr)) &&
227 vos_mem_compare((tANI_U8 *)pbc->uuid_e, (tANI_U8 *)uuid_e, SIR_WPS_UUID_LEN)) {
Jeff Johnson295189b2012-06-20 16:38:30 -0700228 if (prev)
229 prev->next = pbc->next;
230 else
231 psessionEntry->pAPWPSPBCSession = pbc->next;
232 break;
233 }
234 prev = pbc;
235 pbc = pbc->next;
236 }
237
238 if (!pbc) {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530239 pbc = vos_mem_malloc(sizeof(tSirWPSPBCSession));
240 if ( NULL == pbc )
Jeff Johnson295189b2012-06-20 16:38:30 -0700241 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700242 PELOGE(limLog(pMac, LOGE, FL("memory allocate failed!"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700243 return;
244 }
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530245 vos_mem_copy((tANI_U8 *)pbc->addr, (tANI_U8 *)addr, sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -0700246
247 if (uuid_e)
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530248 vos_mem_copy((tANI_U8 *)pbc->uuid_e, (tANI_U8 *)uuid_e, SIR_WPS_UUID_LEN);
Jeff Johnson295189b2012-06-20 16:38:30 -0700249 }
250
251 pbc->next = psessionEntry->pAPWPSPBCSession;
252 psessionEntry->pAPWPSPBCSession = pbc;
253 pbc->timestamp = curTime;
254
255 /* remove entries that have timed out */
256 prev = pbc;
257 pbc = pbc->next;
258
259 while (pbc) {
260 if (curTime > pbc->timestamp + SIR_WPS_PBC_WALK_TIME) {
261 prev->next = NULL;
262 limRemoveTimeoutPBCsessions(pMac, pbc);
263 break;
264 }
265 prev = pbc;
266 pbc = pbc->next;
267 }
268}
269#if 0
270/**
271 * limWPSPBCTimeout
272 *
273 *FUNCTION:
274 * This function is called when WPS PBC enrtries clean up timer is expired
275 *
276 *LOGIC:
277 * This function remove all the entryies that more than 120 second old
278 *
279 *ASSUMPTIONS:
280 *
281 *
282 *NOTE:
283 *
284 * @param pMac Pointer to Global MAC structure
285 * @param psessionEntry A pointer to station PE session
286 *
287 * @return None
288 */
289
290void limWPSPBCTimeout(tpAniSirGlobal pMac, tpPESession psessionEntry)
291{
292 tANI_TIMESTAMP curTime;
293 tSirWPSPBCSession *pbc, *prev = NULL;
294
295 curTime = (tANI_TIMESTAMP)(palGetTickCount(pMac->hHdd) / PAL_TICKS_PER_SECOND);
296
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700297 PELOG3(limLog(pMac, LOG3, FL("WPS PBC cleanup timeout curTime=%d"), curTime);)
Jeff Johnson295189b2012-06-20 16:38:30 -0700298
299 prev = psessionEntry->pAPWPSPBCSession;
300 if(prev)
301 pbc = prev->next;
302 else
303 return;
304
305 while (pbc) {
306 if (curTime > pbc->timestamp + SIR_WPS_PBC_WALK_TIME) {
307 prev->next = NULL;
308 limRemoveTimeoutPBCsessions(pMac, pbc);
309 break;
310 }
311 prev = pbc;
312 pbc = pbc->next;
313 }
314
315 if(prev)
316 {
317 if (curTime > prev->timestamp + SIR_WPS_PBC_WALK_TIME) {
318 psessionEntry->pAPWPSPBCSession = NULL;
319 limRemoveTimeoutPBCsessions(pMac, prev);
320 }
321 }
322
323}
324#endif
325/**
326 * limWPSPBCClose
327 *
328 *FUNCTION:
329 * This function is called when BSS is closed
330 *
331 *LOGIC:
332 * This function remove all the WPS PBC entries
333 *
334 *ASSUMPTIONS:
335 *
336 *
337 *NOTE:
338 *
339 * @param pMac Pointer to Global MAC structure
340 * @param psessionEntry A pointer to station PE session
341 *
342 * @return None
343 */
344
345void limWPSPBCClose(tpAniSirGlobal pMac, tpPESession psessionEntry)
346{
347
348 limRemoveTimeoutPBCsessions(pMac, psessionEntry->pAPWPSPBCSession);
349
350}
Jeff Johnson295189b2012-06-20 16:38:30 -0700351
352/**
353 * limCheck11bRates
354 *
355 *FUNCTION:
356 * This function is called by limProcessProbeReqFrame() upon
357 * Probe Request frame reception.
358 *
359 *LOGIC:
360 * This function check 11b rates in supportedRates and extendedRates rates
361 *
362 *NOTE:
363 *
364 * @param rate
365 *
366 * @return BOOLEAN
367 */
368
369tANI_BOOLEAN limCheck11bRates(tANI_U8 rate)
370{
371 if ( ( 0x02 == (rate))
372 || ( 0x04 == (rate))
373 || ( 0x0b == (rate))
374 || ( 0x16 == (rate))
375 )
376 {
377 return TRUE;
378 }
379 return FALSE;
380}
381
382/**
383 * limProcessProbeReqFrame
384 *
385 *FUNCTION:
386 * This function is called by limProcessMessageQueue() upon
387 * Probe Request frame reception.
388 *
389 *LOGIC:
390 * This function processes received Probe Request frame and responds
391 * with Probe Response.
392 * Only AP or STA in IBSS mode that sent last Beacon will respond to
393 * Probe Request.
394 *
395 *ASSUMPTIONS:
396 * 1. AP or STA in IBSS mode that sent last Beacon will always respond
397 * to Probe Request received with broadcast SSID.
398 *
399 *NOTE:
400 * 1. Dunno what to do with Rates received in Probe Request frame
401 * 2. Frames with out-of-order fields/IEs are dropped.
402 *
403 * @param pMac Pointer to Global MAC structure
404 * @param *pRxPacketInfo A pointer to Buffer descriptor + associated PDUs
405 *
406 * @return None
407 */
408
409void
410limProcessProbeReqFrame(tpAniSirGlobal pMac, tANI_U8 *pRxPacketInfo,tpPESession psessionEntry)
411{
412 tANI_U8 *pBody;
413 tpSirMacMgmtHdr pHdr;
414 tANI_U32 frameLen;
415 tSirProbeReq probeReq;
416 tAniSSID ssId;
417 tSirMsgQ msgQ;
418 tSirSmeProbeReq *pSirSmeProbeReq;
419 tANI_U32 wpsApEnable=0, tmp;
420
421 do{
422 // Don't send probe responses if disabled
423 if (pMac->lim.gLimProbeRespDisableFlag)
424 break;
425
Ashish Agarwala25ad0d2012-12-10 14:45:07 -0800426 // Don't send probe response if P2P go is scanning till scan come to idle state.
427 if((psessionEntry->pePersona == VOS_P2P_GO_MODE) && ((pMac->lim.gpLimRemainOnChanReq )
428 || (pMac->lim.gLimHalScanState != eLIM_HAL_IDLE_SCAN_STATE)))
429 {
Ashish Agarwal7dbccce2012-12-13 14:42:33 -0800430 limLog(pMac, LOG3,
Kaushik, Sushant96ac9d72013-12-11 19:28:10 +0530431 FL("While GO is scanning, don't send probe response"
432 " on diff channel"));
Ashish Agarwala25ad0d2012-12-10 14:45:07 -0800433 break;
434 }
Ashish Agarwala25ad0d2012-12-10 14:45:07 -0800435
Jeff Johnson295189b2012-06-20 16:38:30 -0700436 pHdr = WDA_GET_RX_MAC_HEADER(pRxPacketInfo);
437
438 if ( (psessionEntry->limSystemRole == eLIM_AP_ROLE) ||
439 (psessionEntry->limSystemRole == eLIM_BT_AMP_AP_ROLE)||
440 (psessionEntry->limSystemRole == eLIM_BT_AMP_STA_ROLE)||
441 ( (psessionEntry->limSystemRole == eLIM_STA_IN_IBSS_ROLE) &&
442 (WDA_GET_RX_BEACON_SENT(pRxPacketInfo)) ) )
443 {
444 frameLen = WDA_GET_RX_PAYLOAD_LEN(pRxPacketInfo);
445
446 PELOG3(limLog(pMac, LOG3, FL("Received Probe Request %d bytes from "), frameLen);
447 limPrintMacAddr(pMac, pHdr->sa, LOG3);)
448
449 // Get pointer to Probe Request frame body
450 pBody = WDA_GET_RX_MPDU_DATA(pRxPacketInfo);
451
452 // Parse Probe Request frame
453 if (sirConvertProbeReqFrame2Struct(pMac, pBody, frameLen, &probeReq)==eSIR_FAILURE)
454 {
Kaushik, Sushant96ac9d72013-12-11 19:28:10 +0530455 PELOGW(limLog(pMac, LOGE, FL("Parse error ProbeRequest,"
456 " length=%d, SA is:" MAC_ADDRESS_STR),
457 frameLen,MAC_ADDR_ARRAY(pHdr->sa));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700458 pMac->sys.probeError++;
459 break;
460 }
461 else
462 {
Jeff Johnson295189b2012-06-20 16:38:30 -0700463 if (psessionEntry->pePersona == VOS_P2P_GO_MODE)
464 {
465 tANI_U8 i = 0, rate_11b = 0, other_rates = 0;
466 // Check 11b rates in supported rates
467 for ( i = 0 ; i < probeReq.supportedRates.numRates;
468 i++ )
469 {
470 if (limCheck11bRates(probeReq.supportedRates.rate[i] & 0x7f))
471 {
472 rate_11b++;
473 }
474 else
475 {
476 other_rates++;
477 }
478 }
479
480 // Check 11b rates in extended rates
481 for ( i = 0 ; i < probeReq.extendedRates.numRates; i++ )
482 {
483 if (limCheck11bRates(probeReq.extendedRates.rate[i] & 0x7f))
484 {
485 rate_11b++;
486 }
487 else
488 {
489 other_rates++;
490 }
491 }
492
493 if ( (rate_11b > 0) && (other_rates == 0) )
494 {
495 PELOG3(limLog(pMac, LOG3,
496 FL("Received a probe request frame with only 11b rates, SA is: "));
497 limPrintMacAddr(pMac, pHdr->sa, LOG3);)
498 return;
499 }
500 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700501 if ((psessionEntry->limSystemRole == eLIM_AP_ROLE))
502 {
503
504 if ( (psessionEntry->APWPSIEs.SirWPSProbeRspIE.FieldPresent &
505 SIR_WPS_PROBRSP_VER_PRESENT) &&
506 (probeReq.wscIePresent == 1) &&
507 (probeReq.probeReqWscIeInfo.DevicePasswordID.id ==
508 WSC_PASSWD_ID_PUSH_BUTTON) &&
509 (probeReq.probeReqWscIeInfo.UUID_E.present == 1))
510 {
511 if(psessionEntry->fwdWPSPBCProbeReq)
512 {
513 PELOG4(sirDumpBuf(pMac, SIR_LIM_MODULE_ID, LOG4,
514 pHdr->sa, sizeof(tSirMacAddr));)
515 PELOG4(sirDumpBuf(pMac, SIR_LIM_MODULE_ID, LOG4, pBody, frameLen);)
516 limSendSmeProbeReqInd(pMac, pHdr->sa, pBody, frameLen, psessionEntry);
517 }
518 else
519 {
520 limUpdatePBCSessionEntry(pMac,
521 pHdr->sa, probeReq.probeReqWscIeInfo.UUID_E.uuid, psessionEntry);
522 }
523 }
524 }
525 else
526 {
Jeff Johnson295189b2012-06-20 16:38:30 -0700527 if (wlan_cfgGetInt(pMac, (tANI_U16) WNI_CFG_WPS_ENABLE, &tmp) != eSIR_SUCCESS)
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700528 limLog(pMac, LOGP,"Failed to cfg get id %d", WNI_CFG_WPS_ENABLE );
Jeff Johnson295189b2012-06-20 16:38:30 -0700529
530 wpsApEnable = tmp & WNI_CFG_WPS_ENABLE_AP;
531 if ((wpsApEnable) &&
532 (probeReq.wscIePresent == 1) &&
533 (probeReq.probeReqWscIeInfo.DevicePasswordID.id == WSC_PASSWD_ID_PUSH_BUTTON))
534 {
535 // send the probe req to WSM when it is from a PBC station
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530536 pSirSmeProbeReq = vos_mem_malloc(sizeof(tSirSmeProbeReq));
537 if ( NULL == pSirSmeProbeReq )
Jeff Johnson295189b2012-06-20 16:38:30 -0700538 {
539 // Log error
540 limLog(pMac, LOGP,
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530541 FL("call to AllocateMemory failed for eWNI_SME_PROBE_REQ"));
Jeff Johnson295189b2012-06-20 16:38:30 -0700542 return;
543 }
544 msgQ.type = eWNI_SME_PROBE_REQ;
545 msgQ.bodyval = 0;
546 msgQ.bodyptr = pSirSmeProbeReq;
Jeff Johnson295189b2012-06-20 16:38:30 -0700547
548 pSirSmeProbeReq->messageType = eWNI_SME_PROBE_REQ;
549 pSirSmeProbeReq->length = sizeof(tSirSmeProbeReq);
Jeff Johnson295189b2012-06-20 16:38:30 -0700550 pSirSmeProbeReq->sessionId = psessionEntry->smeSessionId;
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530551 vos_mem_copy(pSirSmeProbeReq->peerMacAddr, pHdr->sa, sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -0700552 pSirSmeProbeReq->devicePasswdId = probeReq.probeReqWscIeInfo.DevicePasswordID.id;
Konamki, Sreelakshmi824f93e2015-07-31 12:55:48 +0530553 MTRACE(macTrace(pMac, TRACE_CODE_TX_SME_MSG,
554 psessionEntry->peSessionId, msgQ.type));
Jeff Johnson295189b2012-06-20 16:38:30 -0700555 if (limSysProcessMmhMsgApi(pMac, &msgQ, ePROT) != eSIR_SUCCESS){
556 PELOG3(limLog(pMac, LOG3, FL("couldnt send the probe req to wsm "));)
557 }
558 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700559 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700560 }
561
562 ssId.length = psessionEntry->ssId.length;
563 /* Copy the SSID from sessio entry to local variable */
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530564 vos_mem_copy(ssId.ssId,
565 psessionEntry->ssId.ssId,
566 psessionEntry->ssId.length);
Jeff Johnson295189b2012-06-20 16:38:30 -0700567
568 // Compare received SSID with current SSID. If they
569 // match, reply with Probe Response.
570 if (probeReq.ssId.length)
571 {
572 if (!ssId.length)
573 goto multipleSSIDcheck;
574
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530575 if (vos_mem_compare((tANI_U8 *) &ssId,
Jeff Johnson295189b2012-06-20 16:38:30 -0700576 (tANI_U8 *) &(probeReq.ssId), (tANI_U8) (ssId.length + 1)) )
577 {
578 limSendProbeRspMgmtFrame(pMac, pHdr->sa, &ssId, DPH_USE_MGMT_STAID,
579 DPH_NON_KEEPALIVE_FRAME, psessionEntry,
580 probeReq.p2pIePresent);
581 break;
582 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700583 else if (psessionEntry->pePersona == VOS_P2P_GO_MODE)
584 {
585 tANI_U8 direct_ssid[7] = "DIRECT-";
586 tANI_U8 direct_ssid_len = 7;
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530587 if (vos_mem_compare((tANI_U8 *) &direct_ssid,
Jeff Johnson295189b2012-06-20 16:38:30 -0700588 (tANI_U8 *) &(probeReq.ssId.ssId), (tANI_U8) (direct_ssid_len)) )
589 {
590 limSendProbeRspMgmtFrame(pMac, pHdr->sa, &ssId, DPH_USE_MGMT_STAID,
591 DPH_NON_KEEPALIVE_FRAME, psessionEntry,
592 probeReq.p2pIePresent);
593 break;
594 }
595 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700596 else
597 {
598 PELOG3(limLog(pMac, LOG3,
599 FL("Ignoring ProbeReq frame with unmatched SSID received from "));
600 limPrintMacAddr(pMac, pHdr->sa, LOG3);)
601 pMac->sys.probeBadSsid++;
602 }
603 }
604 else
605 {
Jeff Johnson295189b2012-06-20 16:38:30 -0700606 {
Abhishek Singh01c73d12015-03-12 15:13:44 +0530607 if ((VOS_P2P_GO_MODE == psessionEntry->pePersona) &&
608 pMac->miracastVendorConfig)
609 return;
610
Jeff Johnson295189b2012-06-20 16:38:30 -0700611 // Broadcast SSID in the Probe Request.
612 // Reply with SSID we're configured with.
Jeff Johnson295189b2012-06-20 16:38:30 -0700613 //Turn off the SSID length to 0 if hidden SSID feature is present
614 if(psessionEntry->ssidHidden)
615 /*We are returning from here as probe request contains the broadcast SSID.
616 So no need to send the probe resp*/
617 //ssId.length = 0;
618 return;
Jeff Johnson295189b2012-06-20 16:38:30 -0700619 limSendProbeRspMgmtFrame(pMac, pHdr->sa, &ssId, DPH_USE_MGMT_STAID,
620 DPH_NON_KEEPALIVE_FRAME, psessionEntry,
621 probeReq.p2pIePresent);
622 }
623 break;
624 }
625multipleSSIDcheck:
Jeff Johnson295189b2012-06-20 16:38:30 -0700626 {
627 PELOG3(limLog(pMac, LOG3,
628 FL("Ignoring ProbeReq frame with unmatched SSID received from "));
629 limPrintMacAddr(pMac, pHdr->sa, LOG3);)
630 pMac->sys.probeBadSsid++;
631 }
632 }
633 else
634 {
635 // Ignore received Probe Request frame
636 PELOG3(limLog(pMac, LOG3, FL("Ignoring Probe Request frame received from "));
637 limPrintMacAddr(pMac, pHdr->sa, LOG3);)
638 pMac->sys.probeIgnore++;
639 break;
640 }
641 }while(0);
642
643 return;
644} /*** end limProcessProbeReqFrame() ***/
645
646/**
647 * limIndicateProbeReqToHDD
648 *
649 *FUNCTION:
650 * This function is called by limProcessProbeReqFrame_multiple_BSS() upon
651 * Probe Request frame reception.
652 *
653 *LOGIC:
654 * This function processes received Probe Request frame and Pass
655 * Probe Request Frame to HDD.
656 *
657 * @param pMac Pointer to Global MAC structure
658 * @param *pBd A pointer to Buffer descriptor + associated PDUs
659 * @param psessionEntry A pointer to PE session
660 *
661 * @return None
662 */
663
Jeff Johnson295189b2012-06-20 16:38:30 -0700664static void
665limIndicateProbeReqToHDD(tpAniSirGlobal pMac, tANI_U8 *pBd,
666 tpPESession psessionEntry)
667{
Agarwal Ashishae800dd2015-06-24 12:44:48 +0530668 limLog( pMac, LOG1, FL("Received a probe request frame"));
Jeff Johnson295189b2012-06-20 16:38:30 -0700669
Jeff Johnson295189b2012-06-20 16:38:30 -0700670 //send the probe req to SME.
Rashmi Ramanna0d0adec2014-02-05 20:35:37 +0530671 limSendSmeMgmtFrameInd( pMac, psessionEntry->smeSessionId, pBd,
yeshwanth sriram guntukac1046a52017-04-25 16:34:50 +0530672 psessionEntry, WDA_GET_RX_RSSI_DB(pBd));
Jeff Johnson295189b2012-06-20 16:38:30 -0700673#ifdef WLAN_FEATURE_P2P_INTERNAL
674 limSendP2PProbeResponse(pMac, pBd, psessionEntry);
675#endif
676} /*** end limIndicateProbeReqToHDD() ***/
Jeff Johnson295189b2012-06-20 16:38:30 -0700677
678/**
679 * limProcessProbeReqFrame_multiple_BSS
680 *
681 *FUNCTION:
682 * This function is called by limProcessMessageQueue() upon
683 * Probe Request frame reception.
684 *
685 *LOGIC:
686 * This function call limIndicateProbeReqToHDD function to indicate
687 * Probe Request frame to HDD. It also call limProcessProbeReqFrame
688 * function which process received Probe Request frame and responds
689 * with Probe Response.
690 *
691 * @param pMac Pointer to Global MAC structure
692 * @param *pBd A pointer to Buffer descriptor + associated PDUs
693 * @param psessionEntry A pointer to PE session
694 *
695 * @return None
696 */
697
698void
699limProcessProbeReqFrame_multiple_BSS(tpAniSirGlobal pMac, tANI_U8 *pBd, tpPESession psessionEntry)
700{
701 tANI_U8 i;
702
703 if (psessionEntry != NULL)
704 {
Jeff Johnson295189b2012-06-20 16:38:30 -0700705 if ((eLIM_AP_ROLE == psessionEntry->limSystemRole)
706#ifdef WLAN_FEATURE_P2P_INTERNAL
707 || (psessionEntry->limSystemRole == eLIM_P2P_DEVICE_ROLE)
708#endif
709 )
710 {
711 limIndicateProbeReqToHDD(pMac, pBd, psessionEntry);
712 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700713 limProcessProbeReqFrame(pMac,pBd,psessionEntry);
714 return;
715 }
716
717 for(i =0; i < pMac->lim.maxBssId;i++)
718 {
719 psessionEntry = peFindSessionBySessionId(pMac,i);
720 if ( (psessionEntry != NULL) )
721 {
Jeff Johnson295189b2012-06-20 16:38:30 -0700722 if ((eLIM_AP_ROLE == psessionEntry->limSystemRole)
723#ifdef WLAN_FEATURE_P2P_INTERNAL
724 || (psessionEntry->limSystemRole == eLIM_P2P_DEVICE_ROLE)
725#endif
726 )
727 {
728 limIndicateProbeReqToHDD(pMac, pBd, psessionEntry);
729 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700730 if ( (eLIM_AP_ROLE == psessionEntry->limSystemRole) ||
731 (eLIM_STA_IN_IBSS_ROLE == psessionEntry->limSystemRole) ||
732 (eLIM_BT_AMP_AP_ROLE == psessionEntry->limSystemRole) ||
733 (eLIM_BT_AMP_STA_ROLE == psessionEntry->limSystemRole)
734 )
735 {
736 limProcessProbeReqFrame(pMac,pBd,psessionEntry);
737 }
738 }
739 }
740
741} /*** end limProcessProbeReqFrame_multiple_BSS() ***/
742
Jeff Johnson295189b2012-06-20 16:38:30 -0700743/**
744 * limSendSmeProbeReqInd()
745 *
746 *FUNCTION:
747 * This function is to send
748 * eWNI_SME_WPS_PBC_PROBE_REQ_IND message to host
749 *
750 *PARAMS:
751 *
752 *LOGIC:
753 *
754 *ASSUMPTIONS:
755 * NA
756 *
757 *NOTE:
758 * This function is used for sending eWNI_SME_WPS_PBC_PROBE_REQ_IND
759 * to host.
760 *
761 * @param peerMacAddr Indicates the peer MAC addr that the probe request
762 * is generated.
763 * @param pProbeReqIE pointer to RAW probe request IE
764 * @param ProbeReqIELen The length of probe request IE.
765 * @param psessionEntry A pointer to PE session
766 *
767 * @return None
768 */
769void
770limSendSmeProbeReqInd(tpAniSirGlobal pMac,
771 tSirMacAddr peerMacAddr,
772 tANI_U8 *pProbeReqIE,
773 tANI_U32 ProbeReqIELen,
774 tpPESession psessionEntry)
775{
776 tSirSmeProbeReqInd *pSirSmeProbeReqInd;
777 tSirMsgQ msgQ;
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530778
779 pSirSmeProbeReqInd = vos_mem_malloc(sizeof(tSirSmeProbeReqInd));
780 if ( NULL == pSirSmeProbeReqInd )
Jeff Johnson295189b2012-06-20 16:38:30 -0700781 {
782 // Log error
783 limLog(pMac, LOGP,
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530784 FL("call to AllocateMemory failed for eWNI_SME_PROBE_REQ"));
Jeff Johnson295189b2012-06-20 16:38:30 -0700785 return;
786 }
787
788 msgQ.type = eWNI_SME_WPS_PBC_PROBE_REQ_IND;
789 msgQ.bodyval = 0;
790 msgQ.bodyptr = pSirSmeProbeReqInd;
791
792 pSirSmeProbeReqInd->messageType = eWNI_SME_WPS_PBC_PROBE_REQ_IND;
793 pSirSmeProbeReqInd->length = sizeof(tSirSmeProbeReq);
794 pSirSmeProbeReqInd->sessionId = psessionEntry->smeSessionId;
795
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530796 vos_mem_copy(pSirSmeProbeReqInd->bssId, psessionEntry->bssId, sizeof(tSirMacAddr));
797 vos_mem_copy(pSirSmeProbeReqInd->WPSPBCProbeReq.peerMacAddr, peerMacAddr, sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -0700798
Konamki, Sreelakshmi824f93e2015-07-31 12:55:48 +0530799 MTRACE(macTrace(pMac, TRACE_CODE_TX_SME_MSG, psessionEntry->peSessionId,
800 msgQ.type));
Jeff Johnson295189b2012-06-20 16:38:30 -0700801 pSirSmeProbeReqInd->WPSPBCProbeReq.probeReqIELen = (tANI_U16)ProbeReqIELen;
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530802 vos_mem_copy(pSirSmeProbeReqInd->WPSPBCProbeReq.probeReqIE, pProbeReqIE, ProbeReqIELen);
Jeff Johnson295189b2012-06-20 16:38:30 -0700803
804 if (limSysProcessMmhMsgApi(pMac, &msgQ, ePROT) != eSIR_SUCCESS){
805 PELOGE(limLog(pMac, LOGE, FL("couldnt send the probe req to hdd"));)
806 }
807
808} /*** end limSendSmeProbeReqInd() ***/
Jeff Johnson295189b2012-06-20 16:38:30 -0700809#ifdef WLAN_FEATURE_P2P_INTERNAL
810void limSendP2PProbeResponse(tpAniSirGlobal pMac, tANI_U8 *pBd,
811 tpPESession psessionEntry)
812{
813 tAniSSID ssId = { P2P_WILDCARD_SSID_LEN, P2P_WILDCARD_SSID };
814 tANI_U8 *pBody;
815 tpSirMacMgmtHdr pHdr;
816 tANI_U32 frameLen;
817 tSirProbeReq probeReq;
818
819 pHdr = WDA_GET_RX_MAC_HEADER(pBd);
820 // Get pointer to Probe Request frame body
821 pBody = WDA_GET_RX_MPDU_DATA(pBd);
822
823 if( (pBody[0] == 0) && (pBody[1] == ssId.length) &&
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530824 (vos_mem_compare(ssId.ssId, pBody + 2,
Jeff Johnson295189b2012-06-20 16:38:30 -0700825 ssId.length)))
826 {
827 // Parse Probe Request frame
828 frameLen = WDA_GET_RX_PAYLOAD_LEN(pBd);
829 if (eSIR_FAILURE == sirConvertProbeReqFrame2Struct(pMac, pBody, frameLen, &probeReq))
830 {
831 PELOGW(limLog(pMac, LOGW, FL("Parse error ProbeRequest, length=%d, SA is:"), frameLen);)
832 limPrintMacAddr(pMac, pHdr->sa, LOGW);
833 pMac->sys.probeError++;
834 return;
835 }
836
837 if (psessionEntry->pePersona == VOS_P2P_GO_MODE)
838 {
839 ssId.length = psessionEntry->ssId.length;
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530840 vos_mem_copy(ssId.ssId, psessionEntry->ssId.ssId,psessionEntry->ssId.length);
Jeff Johnson295189b2012-06-20 16:38:30 -0700841 limSendProbeRspMgmtFrame(pMac, pHdr->sa, &ssId, DPH_USE_MGMT_STAID, DPH_NON_KEEPALIVE_FRAME,
842 psessionEntry, probeReq.p2pIePresent );
843 }
844 else
845 {
846 limSendProbeRspMgmtFrame(pMac, pHdr->sa, &ssId, DPH_USE_MGMT_STAID, DPH_NON_KEEPALIVE_FRAME,
847 psessionEntry, probeReq.p2pIePresent );
848 }
849 }
850}
851#endif //#ifdef WLAN_FEATURE_P2P_INTERNAL