1 /*
2 * currBss.c
3 *
4 * Copyright(c) 1998 - 2009 Texas Instruments. All rights reserved.
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 *
11 * * Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * * Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in
15 * the documentation and/or other materials provided with the
16 * distribution.
17 * * Neither the name Texas Instruments nor the names of its
18 * contributors may be used to endorse or promote products derived
19 * from this software without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 */
33
34 /** \file currBss.c
35 * \brief Current BSS info
36 *
37 * \see currBss.h
38 */
39
40 /****************************************************************************
41 * *
42 * MODULE: Current BSS *
43 * PURPOSE: *
44 * Roaming ability of eSTA is implemented by Roaming Manager Component and
45 * described in "Roaming Manager module LLD" document, and by
46 * AP Connection module. AP Connection module implemented as two sub-modules.
47 * The major one is AP Connection, that is responsible for:
48 * - providing Roaming Manager with access to other parts of WLAN Driver,
49 * - implementing low levels of roaming mechanism.
50 * Current BSS sub-module takes care of:
51 * - maintaining database of current AP info,
52 * - providing access to database of current AP info.
53 * The Current BSS represents the BSS we are currently connected to.
54 * Among other parameters, it holds the capabilities of the current AP,
55 * its ID and its quality.
56 * When FW indicates 'Out of Sync' event, Current BSS module is responsible
57 * for awaking the device, sending unicast Probe request, waiting for
58 * response and - in case FW comes to the conclusion that there was
59 * no response - for triggering "Beacon missed" to AP Connection module.
60 * In eSTA5.0 FW updates and checks the quality of the connection with
61 * current AP. Current BSS module is responsible to handle event of type
62 * 'Low RSSI' from FW. Third type of roaming event reported by FW is
63 * 'Consecutive no ack on TX", and it is handled as well by Current
64 * BSS module.Upon reception of any roaming event from FW, Current BSS
65 * module is transferring this event to the AP Connection module in case
66 * of BSS connection, or to SME module in case of IBSS connection.
67 * When WLAN driver is working in IBSS mode, Current BSS module is holding
68 * the parameters of BSS (channel, band, SSID etc.).
69 * *
70 ****************************************************************************/
71
72 #define __FILE_ID__ FILE_ID_65
73 #include "currBss.h"
74 #include "currBssApi.h"
75 #include "osApi.h"
76 #include "report.h"
77 #include "802_11Defs.h"
78 #include "DataCtrl_Api.h"
79 #include "qosMngr_API.h"
80 #include "regulatoryDomainApi.h"
81 #include "apConn.h"
82 #include "scanMngrApi.h"
83 #include "MacServices_api.h"
84 #include "smeApi.h"
85 #include "sme.h"
86 #include "TWDriver.h"
87 #include "EvHandler.h"
88 #include "DrvMainModules.h"
89 #include "siteMgrApi.h"
90 #include "roamingMngrTypes.h"
91
92 /* Constants */
93 #define TRIGGER_LOW_RSSI_PACING 1000
94 #define TRIGGER_LOW_SNR_PACING 1000
95 #define TRIGGER_BG_SCAN_PACING 10
96 #define TRIGGER_BG_SCAN_HYSTERESIS 3
97 static const TI_UINT32 KEEP_ALIVE_NULL_DATA_INDEX = 3;
98
99 /* Enumerations */
100
101
102 /* Typedefs */
103
104 typedef TI_UINT8 (*currBSS_beaconRxCallb_t) (TI_HANDLE hModule, TI_UINT64 staTSF, TI_UINT8 dtimCount);
105
106
107 /* Structures */
108
109
110 /* Internal functions prototypes */
111
112 static void currBSS_lowRssiThrCrossed(currBSS_t *hCurrBSS, TI_UINT8 *data, TI_UINT8 dataLength);
113 static void currBSS_lowSnrThrCrossed(currBSS_t *hCurrBSS, TI_UINT8 *data, TI_UINT8 dataLength);
114 static void currBSS_BackgroundScanQuality(TI_HANDLE hCurrBSS, TI_UINT8 *data, TI_UINT8 dataLength);
115 static void currBSS_consecTxErrors(currBSS_t *hCurrBSS, TI_UINT8 *data, TI_UINT8 dataLength);
116 static void currBSS_BssLost (currBSS_t *hCurrBSS, TI_UINT8 *data, TI_UINT8 dataLength);
117 static void currBSS_reportRoamingEvent(currBSS_t *hCurrBSS, apConn_roamingTrigger_e roamingEventType, roamingEventData_u *pRoamingEventData);
118 static void currBSS_updateBSSLoss(currBSS_t *pCurrBSS);
119
120 static TI_STATUS currBss_HandleTriggerEvent(TI_HANDLE hCurrBSS, TI_UINT8 *data, TI_UINT8 dataLength, TI_UINT8 eventID);
121 static triggerDesc_t* currBss_findEmptyUserTrigger(TI_HANDLE hCurrBSS, TI_UINT16 clientID, TI_UINT8* triggerIdx);
122 static void currBSS_RssiSnrTrigger0 (TI_HANDLE hCurrBSS, TI_UINT8 *data, TI_UINT8 dataLength);
123 static void currBSS_RssiSnrTrigger1 (TI_HANDLE hCurrBSS, TI_UINT8 *data, TI_UINT8 dataLength);
124 static void currBSS_RssiSnrTrigger2 (TI_HANDLE hCurrBSS, TI_UINT8 *data, TI_UINT8 dataLength);
125 static void currBSS_RssiSnrTrigger3 (TI_HANDLE hCurrBSS, TI_UINT8 *data, TI_UINT8 dataLength);
126 static void currBSS_RssiSnrTrigger4 (TI_HANDLE hCurrBSS, TI_UINT8 *data, TI_UINT8 dataLength);
127 static void currBSS_RssiSnrTrigger5 (TI_HANDLE hCurrBSS, TI_UINT8 *data, TI_UINT8 dataLength);
128 static void currBSS_RssiSnrTrigger6 (TI_HANDLE hCurrBSS, TI_UINT8 *data, TI_UINT8 dataLength);
129 static void currBSS_RssiSnrTrigger7 (TI_HANDLE hCurrBSS, TI_UINT8 *data, TI_UINT8 dataLength);
130
131 /* Public functions implementation */
132
133
134
135 /**
136 *
137 * currBSS_create
138 *
139 * \b Description:
140 *
141 * Create the Current BSS context: allocate memory for internal variables
142 *
143 * \b ARGS:
144 *
145 * I - hOS - the handle to the OS object
146 *
147 * \b RETURNS:
148 *
149 * TI_OK on success, TI_NOK on failure.
150 *
151 * \sa
152 */
currBSS_create(TI_HANDLE hOs)153 TI_HANDLE currBSS_create(TI_HANDLE hOs)
154 {
155 currBSS_t *pCurrBss;
156
157 if ((pCurrBss = os_memoryAlloc(hOs, sizeof(currBSS_t))) != NULL)
158 {
159 pCurrBss->hOs = hOs;
160
161 return pCurrBss;
162 }
163 else /* Failed to allocate control block */
164 {
165 WLAN_OS_REPORT(("FATAL ERROR: currBSS_create(): Error allocating cb - aborting\n"));
166 return NULL;
167 }
168 }
169
170
171 /**
172 *
173 * currBSS_unload
174 *
175 * \b Description:
176 *
177 * Finish Current BSS module work.
178 *
179 * \b ARGS:
180 *
181 *
182 * \b RETURNS:
183 *
184 * TI_OK on success, TI_NOK on failure.
185 *
186 * \sa
187 */
currBSS_unload(TI_HANDLE hCurrBSS)188 TI_STATUS currBSS_unload(TI_HANDLE hCurrBSS)
189 {
190 currBSS_t *pCurrBSS;
191
192 if (hCurrBSS != NULL)
193 {
194 pCurrBSS = (currBSS_t *)hCurrBSS;
195
196 /* Free pre-allocated control block */
197 os_memoryFree(pCurrBSS->hOs, pCurrBSS, sizeof(currBSS_t));
198 }
199 return TI_OK;
200 }
201
202
203 /**
204 *
205 * currBSS_init
206 *
207 * \b Description:
208 *
209 * Get other modules handles.
210 *
211 * \b ARGS:
212 *
213 * I pStadHandles - The driver modules handles
214 *
215 * \b RETURNS:
216 *
217 * void
218 *
219 * \sa
220 */
currBSS_init(TStadHandlesList * pStadHandles)221 void currBSS_init (TStadHandlesList *pStadHandles)
222 {
223 currBSS_t *pCurrBSS = (currBSS_t *)(pStadHandles->hCurrBss);
224 int i=0;
225
226 pCurrBSS->hAPConn = pStadHandles->hAPConnection;
227 pCurrBSS->hTWD = pStadHandles->hTWD;
228 pCurrBSS->hMlme = pStadHandles->hMlmeSm;
229 pCurrBSS->hPowerMngr = pStadHandles->hPowerMgr;
230 pCurrBSS->hSme = pStadHandles->hSme;
231 pCurrBSS->hSiteMgr = pStadHandles->hSiteMgr;
232 pCurrBSS->hReport = pStadHandles->hReport;
233 pCurrBSS->hScanMngr = pStadHandles->hScanMngr;
234 pCurrBSS->hEvHandler = pStadHandles->hEvHandler;
235 pCurrBSS->hTxCtrl = pStadHandles->hTxCtrl;
236
237 for (i=0; i< MAX_NUM_OF_RSSI_SNR_TRIGGERS ; i++)
238 {
239 pCurrBSS->aTriggersDesc[i].clientID = 0;
240 pCurrBSS->aTriggersDesc[i].fCB = NULL;
241 pCurrBSS->aTriggersDesc[i].hCB = NULL;
242 pCurrBSS->aTriggersDesc[i].WasRegisteredByApp = TI_FALSE;
243
244 }
245 }
246
247
248 /**
249 *
250 * currBSS_SetDefaults
251 *
252 * \b Description:
253 *
254 * Prepare Current BSS module to work
255 *
256 * \b ARGS:
257 *
258 * I - hCurrBSS - Current BSS handle \n
259 *
260 * \b RETURNS:
261 *
262 * TI_OK on success, TI_NOK on failure.
263 *
264 * \sa
265 */
currBSS_SetDefaults(TI_HANDLE hCurrBSS,TCurrBssInitParams * pInitParams)266 TI_STATUS currBSS_SetDefaults (TI_HANDLE hCurrBSS, TCurrBssInitParams *pInitParams)
267 {
268 currBSS_t *pCurrBSS = (currBSS_t *)hCurrBSS;
269 TRroamingTriggerParams params;
270 RssiSnrTriggerCfg_t tTriggerCfg;
271
272 /* save the roaming operational mode */
273 pCurrBSS->RoamingOperationalMode = pInitParams->RoamingOperationalMode;
274
275 /* Registration succeeded, continue with init procedure */
276 pCurrBSS->band = RADIO_BAND_2_4_GHZ;
277 pCurrBSS->channel = 0;
278 pCurrBSS->isConnected = TI_FALSE;
279 pCurrBSS->type = BSS_ANY;
280 pCurrBSS->currAPInfo.RSSI = 0;
281 pCurrBSS->bUseSGParams = TI_FALSE;
282 pCurrBSS->uDefaultKeepAlivePeriod = pInitParams->uNullDataKeepAlivePeriod;
283
284
285 /* register the static callbacks */
286 TWD_RegisterEvent(pCurrBSS->hTWD,TWD_OWN_EVENT_RSSI_SNR_TRIGGER_0,(void*) currBSS_RssiSnrTrigger0, pCurrBSS);
287 TWD_RegisterEvent(pCurrBSS->hTWD,TWD_OWN_EVENT_RSSI_SNR_TRIGGER_1,(void*) currBSS_RssiSnrTrigger1, pCurrBSS);
288 TWD_RegisterEvent(pCurrBSS->hTWD,TWD_OWN_EVENT_RSSI_SNR_TRIGGER_2,(void*) currBSS_RssiSnrTrigger2, pCurrBSS);
289 TWD_RegisterEvent(pCurrBSS->hTWD,TWD_OWN_EVENT_RSSI_SNR_TRIGGER_3,(void*) currBSS_RssiSnrTrigger3, pCurrBSS);
290 TWD_RegisterEvent(pCurrBSS->hTWD,TWD_OWN_EVENT_RSSI_SNR_TRIGGER_4,(void*) currBSS_RssiSnrTrigger4, pCurrBSS);
291 TWD_RegisterEvent(pCurrBSS->hTWD,TWD_OWN_EVENT_RSSI_SNR_TRIGGER_5,(void*) currBSS_RssiSnrTrigger5, pCurrBSS);
292 TWD_RegisterEvent(pCurrBSS->hTWD,TWD_OWN_EVENT_RSSI_SNR_TRIGGER_6,(void*) currBSS_RssiSnrTrigger6, pCurrBSS);
293 TWD_RegisterEvent(pCurrBSS->hTWD,TWD_OWN_EVENT_RSSI_SNR_TRIGGER_7,(void*) currBSS_RssiSnrTrigger7, pCurrBSS);
294
295 if (ROAMING_OPERATIONAL_MODE_AUTO == pCurrBSS->RoamingOperationalMode)
296 {
297 /* Configure and enable the Low RSSI, the Low SNR and the Missed beacon events */
298 currBSS_RegisterTriggerEvent(hCurrBSS, TWD_OWN_EVENT_RSSI_SNR_TRIGGER_0, 0, (void*)currBSS_lowRssiThrCrossed, hCurrBSS);
299 currBSS_RegisterTriggerEvent(hCurrBSS, TWD_OWN_EVENT_RSSI_SNR_TRIGGER_1, 0, (void*)currBSS_lowSnrThrCrossed, hCurrBSS);
300 currBSS_RegisterTriggerEvent(hCurrBSS, TWD_OWN_EVENT_RSSI_SNR_TRIGGER_4, 0, (void*)currBSS_BackgroundScanQuality, hCurrBSS);
301
302 pCurrBSS->lowRssiThreshold = RSSI_DEFAULT_THRESHOLD;
303 tTriggerCfg.index = TRIGGER_EVENT_LOW_RSSI;
304 tTriggerCfg.threshold = pCurrBSS->lowRssiThreshold;
305 tTriggerCfg.pacing = TRIGGER_LOW_RSSI_PACING;
306 tTriggerCfg.metric = METRIC_EVENT_RSSI_BEACON;
307 tTriggerCfg.type = RX_QUALITY_EVENT_LEVEL;
308 tTriggerCfg.direction = RSSI_EVENT_DIR_LOW;
309 tTriggerCfg.hystersis = 0;
310 tTriggerCfg.enable = TI_TRUE;
311 TWD_CfgRssiSnrTrigger (pCurrBSS->hTWD, &tTriggerCfg);
312
313 pCurrBSS->lowSnrThreshold = SNR_DEFAULT_THRESHOLD;
314 tTriggerCfg.index = TRIGGER_EVENT_LOW_SNR;
315 tTriggerCfg.threshold = pCurrBSS->lowSnrThreshold;
316 tTriggerCfg.pacing = TRIGGER_LOW_SNR_PACING;
317 tTriggerCfg.metric = METRIC_EVENT_SNR_BEACON;
318 tTriggerCfg.type = RX_QUALITY_EVENT_LEVEL;
319 tTriggerCfg.direction = RSSI_EVENT_DIR_LOW;
320 tTriggerCfg.hystersis = 0;
321 tTriggerCfg.enable = TI_TRUE;
322 TWD_CfgRssiSnrTrigger (pCurrBSS->hTWD, &tTriggerCfg);
323
324 pCurrBSS->highQualityForBkgrdScan = RSSI_DEFAULT_THRESHOLD;
325 pCurrBSS->lowQualityForBkgrdScan = RSSI_DEFAULT_THRESHOLD;
326 tTriggerCfg.index = TRIGGER_EVENT_BG_SCAN;
327 tTriggerCfg.threshold = pCurrBSS->lowQualityForBkgrdScan;
328 tTriggerCfg.pacing = TRIGGER_BG_SCAN_PACING;
329 tTriggerCfg.metric = METRIC_EVENT_RSSI_DATA;
330 tTriggerCfg.type = RX_QUALITY_EVENT_EDGE;
331 tTriggerCfg.direction = RSSI_EVENT_DIR_BIDIR;
332 tTriggerCfg.hystersis = TRIGGER_BG_SCAN_HYSTERESIS;
333 tTriggerCfg.enable = TI_TRUE;
334 TWD_CfgRssiSnrTrigger (pCurrBSS->hTWD, &tTriggerCfg);
335
336 /* Register for 'BSS-Loss' event */
337 TWD_RegisterEvent (pCurrBSS->hTWD, TWD_OWN_EVENT_BSS_LOSE, (void *)currBSS_BssLost, pCurrBSS);
338 TWD_EnableEvent (pCurrBSS->hTWD, TWD_OWN_EVENT_BSS_LOSE);
339
340 /* save last configured value for handling Soft Gemini changes */
341 pCurrBSS->numExpectedTbttForBSSLoss = OUT_OF_SYNC_DEFAULT_THRESHOLD;
342 params.TsfMissThreshold = OUT_OF_SYNC_DEFAULT_THRESHOLD;
343 params.BssLossTimeout = NO_BEACON_DEFAULT_TIMEOUT;
344 TWD_CfgConnMonitParams (pCurrBSS->hTWD, ¶ms);
345
346 /* Register for 'Consec. Tx error' */
347 TWD_RegisterEvent (pCurrBSS->hTWD, TWD_OWN_EVENT_MAX_TX_RETRY, (void *)currBSS_consecTxErrors, pCurrBSS);
348 TWD_EnableEvent (pCurrBSS->hTWD, TWD_OWN_EVENT_MAX_TX_RETRY);
349
350 pCurrBSS->maxTxRetryThreshold = NO_ACK_DEFAULT_THRESHOLD;
351 params.maxTxRetry = NO_ACK_DEFAULT_THRESHOLD;
352 TWD_CfgMaxTxRetry (pCurrBSS->hTWD, ¶ms);
353 }
354
355 return TI_OK;
356 }
357
358
359 /**
360 *
361 * currBSS_updateRoamingTriggers
362 *
363 * \b Description:
364 *
365 * Configure parameter of Current BSS
366 *
367 * \b ARGS:
368 *
369 * I - hCurrBSS - Current BSS handle \n
370 * I - params - pointer to datablock of roaming threshols \n
371 *
372 * \b RETURNS:
373 *
374 * TI_OK on success, TI_NOK on failure.
375 *
376 * \sa
377 */
currBSS_updateRoamingTriggers(TI_HANDLE hCurrBSS,roamingMngrThresholdsConfig_t * params)378 TI_STATUS currBSS_updateRoamingTriggers (TI_HANDLE hCurrBSS, roamingMngrThresholdsConfig_t *params)
379 {
380 currBSS_t *pCurrBSS = (currBSS_t *)hCurrBSS;
381 TRroamingTriggerParams roamingTriggersParams;
382 RssiSnrTriggerCfg_t tTriggerCfg;
383
384 if (pCurrBSS->lowRssiThreshold != params->lowRssiThreshold)
385 {
386 pCurrBSS->lowRssiThreshold = params->lowRssiThreshold;
387
388 tTriggerCfg.index = TRIGGER_EVENT_LOW_RSSI;
389 tTriggerCfg.threshold = pCurrBSS->lowRssiThreshold;
390 tTriggerCfg.pacing = TRIGGER_LOW_RSSI_PACING;
391 tTriggerCfg.metric = METRIC_EVENT_RSSI_BEACON;
392 tTriggerCfg.type = RX_QUALITY_EVENT_LEVEL;
393 tTriggerCfg.direction = RSSI_EVENT_DIR_LOW;
394 tTriggerCfg.hystersis = 0;
395 tTriggerCfg.enable = TI_TRUE;
396
397 TWD_CfgRssiSnrTrigger (pCurrBSS->hTWD, &tTriggerCfg);
398 }
399
400 if (pCurrBSS->lowSnrThreshold != params->lowSnrThreshold)
401 {
402 pCurrBSS->lowSnrThreshold = params->lowSnrThreshold;
403
404 tTriggerCfg.index = TRIGGER_EVENT_LOW_SNR;
405 tTriggerCfg.threshold = pCurrBSS->lowSnrThreshold;
406 tTriggerCfg.pacing = TRIGGER_LOW_SNR_PACING;
407 tTriggerCfg.metric = METRIC_EVENT_SNR_BEACON;
408 tTriggerCfg.type = RX_QUALITY_EVENT_LEVEL;
409 tTriggerCfg.direction = RSSI_EVENT_DIR_LOW;
410 tTriggerCfg.hystersis = 0;
411 tTriggerCfg.enable = TI_TRUE;
412
413 TWD_CfgRssiSnrTrigger (pCurrBSS->hTWD, &tTriggerCfg);
414 }
415
416 if (pCurrBSS->lowQualityForBkgrdScan != params->lowQualityForBackgroungScanCondition)
417 {
418 pCurrBSS->lowQualityForBkgrdScan = params->lowQualityForBackgroungScanCondition;
419 tTriggerCfg.index = TRIGGER_EVENT_BG_SCAN;
420 tTriggerCfg.threshold = pCurrBSS->lowQualityForBkgrdScan;
421 tTriggerCfg.pacing = TRIGGER_BG_SCAN_PACING;
422 tTriggerCfg.metric = METRIC_EVENT_RSSI_DATA;
423 tTriggerCfg.type = RX_QUALITY_EVENT_EDGE;
424 tTriggerCfg.direction = RSSI_EVENT_DIR_BIDIR;
425 tTriggerCfg.hystersis = TRIGGER_BG_SCAN_HYSTERESIS;
426 tTriggerCfg.enable = TI_TRUE;
427
428 TWD_CfgRssiSnrTrigger (pCurrBSS->hTWD, &tTriggerCfg);
429 }
430
431 if (pCurrBSS->numExpectedTbttForBSSLoss != params->numExpectedTbttForBSSLoss)
432 {
433 /* save last configured value for handling Soft Gemini changes */
434 pCurrBSS->numExpectedTbttForBSSLoss = params->numExpectedTbttForBSSLoss;
435 /* Configure TWD with 'No BSS' thresholds (Same as the other parameters but in a special
436 function for the Soft Gemini module consideration) */
437 currBSS_updateBSSLoss(pCurrBSS);
438 }
439
440 /* Configure TWD with 'Consecutive NACK' thresholds */
441 if (pCurrBSS->maxTxRetryThreshold != params->dataRetryThreshold)
442 {
443 pCurrBSS->maxTxRetryThreshold = params->dataRetryThreshold;
444 roamingTriggersParams.maxTxRetry = pCurrBSS->maxTxRetryThreshold;
445 TWD_CfgMaxTxRetry (pCurrBSS->hTWD, &roamingTriggersParams);
446 }
447
448 pCurrBSS->highQualityForBkgrdScan = params->normalQualityForBackgroungScanCondition;
449
450 return TI_OK;
451 }
452
453 /**
454 *
455 * currBSS_getRoamingParams
456 *
457 * \b Description:
458 *
459 * Retrieves the roaming triggers stored in the CurrBSS module.
460 *
461 * \b ARGS:
462 *
463 * I - hCurrBSS - Current BSS handle \n
464 * O - aNumExpectedTbttForBSSLoss - Current BSS handle \n
465 * O - aLowQualityForBackgroungScanCondition - Current BSS handle \n
466 * O - aNormalQualityForBackgroungScanCondition - Current BSS handle \n
467 *
468 * \b RETURNS:
469 *
470 * TI_OK on success, TI_NOK on failure.
471 *
472 * \sa
473 */
currBSS_getRoamingParams(TI_HANDLE hCurrBSS,TI_UINT8 * aNumExpectedTbttForBSSLoss,TI_INT8 * aLowQualityForBackgroungScanCondition,TI_INT8 * aNormalQualityForBackgroungScanCondition)474 TI_STATUS currBSS_getRoamingParams(TI_HANDLE hCurrBSS,
475 TI_UINT8 * aNumExpectedTbttForBSSLoss,
476 TI_INT8 * aLowQualityForBackgroungScanCondition,
477 TI_INT8 * aNormalQualityForBackgroungScanCondition)
478 {
479 currBSS_t * pCurrBSS = (currBSS_t *) hCurrBSS;
480
481 *aNumExpectedTbttForBSSLoss = pCurrBSS->numExpectedTbttForBSSLoss;
482 *aLowQualityForBackgroungScanCondition = pCurrBSS->lowQualityForBkgrdScan;
483 *aNormalQualityForBackgroungScanCondition = pCurrBSS->highQualityForBkgrdScan;
484
485 return TI_OK;
486 }
487
488 /**
489 *
490 * currBSS_SGconfigureBSSLoss
491 *
492 * \b Description:
493 *
494 * This function is called by the Soft Gemini module in order to enable/disable the use of
495 * the compensation value for the BSSLoss count , and the percent of increasing that value
496 * It also set the new parameter to the FW (with another generic function)
497 * The compensation is needed since BT activity might over-run recieved beacons
498 *
499 *
500 * \b ARGS:
501 *
502 * I - hCurrBSS - Current BSS handle \n
503 * SGcompensationPercent - percent of increasing the BSSLoss value to the FW \n
504 * bUseSGParams - whether to use the SG compensation
505 *
506 * \b RETURNS:
507 *
508 * -
509 *
510 * \sa
511 */
512
currBSS_SGconfigureBSSLoss(TI_HANDLE hCurrBSS,TI_UINT32 SGcompensationPercent,TI_BOOL bUseSGParams)513 void currBSS_SGconfigureBSSLoss(TI_HANDLE hCurrBSS,
514 TI_UINT32 SGcompensationPercent , TI_BOOL bUseSGParams)
515 {
516 currBSS_t *pCurrBSS = (currBSS_t *)hCurrBSS;
517
518 pCurrBSS->bUseSGParams = bUseSGParams;
519 pCurrBSS->SGcompensationPercent = SGcompensationPercent;
520
521 TRACE1(pCurrBSS->hReport, REPORT_SEVERITY_INFORMATION, "CurrBSS_SGConf: SG =%d\n", pCurrBSS->bUseSGParams);
522
523 /* update the change of BSSLoss in the FW */
524 currBSS_updateBSSLoss(pCurrBSS);
525 }
526
527 /**
528 *
529 * currBSS_updateBSSLoss
530 *
531 * \b Description:
532 *
533 * This function updates only BSS Loss parameter , we need it to be able to consider the
534 * Soft Gemini status , and change the parameter according to it
535 *
536 * \b ARGS:
537 *
538 * I - pCurrBSS - Current BSS handle \n
539 *
540 * \b RETURNS:
541 *
542 * -
543 *
544 * \sa
545 */
currBSS_updateBSSLoss(currBSS_t * pCurrBSS)546 void currBSS_updateBSSLoss(currBSS_t *pCurrBSS)
547 {
548 TRroamingTriggerParams roamingTriggersParams;
549
550 /* In Ad-Hoc we use default parameter */
551 if (pCurrBSS->type == BSS_INDEPENDENT)
552 {
553 roamingTriggersParams.TsfMissThreshold = OUT_OF_SYNC_IBSS_THRESHOLD;
554 }
555 else /* In Infra we use the saved parameter */
556 {
557 roamingTriggersParams.TsfMissThreshold = pCurrBSS->numExpectedTbttForBSSLoss;
558 }
559
560 roamingTriggersParams.BssLossTimeout = NO_BEACON_DEFAULT_TIMEOUT;
561
562 TRACE2(pCurrBSS->hReport, REPORT_SEVERITY_INFORMATION, ": SG=%d, Band=%d\n", pCurrBSS->bUseSGParams, pCurrBSS->currAPInfo.band);
563
564
565 /* if Soft Gemini is enabled - increase the BSSLoss value (because BT activity might over-run beacons) */
566 if ((pCurrBSS->bUseSGParams) && (pCurrBSS->currAPInfo.band == RADIO_BAND_2_4_GHZ))
567 {
568 roamingTriggersParams.TsfMissThreshold = (roamingTriggersParams.TsfMissThreshold *
569 (100 + pCurrBSS->SGcompensationPercent)) / 100;
570
571 TRACE2(pCurrBSS->hReport, REPORT_SEVERITY_INFORMATION, ": old value = %d, new value (for SG compensation) = %d\n", pCurrBSS->numExpectedTbttForBSSLoss,roamingTriggersParams.TsfMissThreshold);
572 }
573
574 TWD_CfgConnMonitParams (pCurrBSS->hTWD, &roamingTriggersParams);
575 }
576
577 /**
578 *
579 * currBSS_swChFinished
580 *
581 * \b Description:
582 *
583 * Called when switch channel process is complete in order to reset RSSI calculations
584 *
585 * \b ARGS:
586 *
587 * I - hCurrBSS - Current BSS handle \n
588 *
589 * \b RETURNS:
590 *
591 * -
592 *
593 * \sa
594 */
currBSS_restartRssiCounting(TI_HANDLE hCurrBSS)595 void currBSS_restartRssiCounting(TI_HANDLE hCurrBSS)
596 {
597 currBSS_t *pCurrBSS = (currBSS_t *)hCurrBSS;
598
599 pCurrBSS->currAPInfo.RSSI = 0;
600 }
601
602 /**
603 *
604 * currBSS_getBssInfo
605 *
606 * \b Description:
607 *
608 * Get parameter of Current BSS
609 *
610 * \b ARGS:
611 *
612 * I - hCurrBSS - Current BSS handle \n
613 *
614 * \b RETURNS:
615 *
616 * pointer to current BSS info block.
617 *
618 * \sa
619 */
currBSS_getBssInfo(TI_HANDLE hCurrBSS)620 bssEntry_t *currBSS_getBssInfo(TI_HANDLE hCurrBSS)
621 {
622 currBSS_t *pCurrBSS = (currBSS_t *)hCurrBSS;
623
624 /* Return pointer to current AP info */
625 return &(pCurrBSS->currAPInfo);
626 }
627
628
629 /**
630 *
631 * currBSS_probRespReceivedCallb
632 *
633 * \b Description:
634 *
635 * Callback function, provided to MLME module. Called each time Probe response received.
636 * This function verifies that the Probe response was sent by current AP, and then
637 * updates current AP database.
638 *
639 * \b ARGS:
640 *
641 * I - hCurrBSS - Current BSS handle \n
642 *
643 * \b RETURNS:
644 *
645 * TI_OK on success, TI_NOK on failure.
646 *
647 * \sa
648 */
currBSS_probRespReceivedCallb(TI_HANDLE hCurrBSS,TRxAttr * pRxAttr,TMacAddr * bssid,mlmeFrameInfo_t * pFrameInfo,TI_UINT8 * dataBuffer,TI_UINT16 bufLength)649 TI_STATUS currBSS_probRespReceivedCallb(TI_HANDLE hCurrBSS,
650 TRxAttr *pRxAttr,
651 TMacAddr *bssid,
652 mlmeFrameInfo_t *pFrameInfo,
653 TI_UINT8 *dataBuffer,
654 TI_UINT16 bufLength)
655 {
656 currBSS_t *pCurrBSS = (currBSS_t *)hCurrBSS;
657 paramInfo_t *pParam;
658
659 pParam = (paramInfo_t *)os_memoryAlloc(pCurrBSS->hOs, sizeof(paramInfo_t));
660 if (!pParam)
661 return TI_NOK;
662
663 pParam->paramType = SITE_MGR_CURRENT_BSSID_PARAM;
664 siteMgr_getParam(pCurrBSS->hSiteMgr, pParam);
665
666 if (pCurrBSS->isConnected && MAC_EQUAL (pParam->content.siteMgrDesiredBSSID, *bssid))
667 {
668 siteMgr_updateSite(pCurrBSS->hSiteMgr, bssid, pFrameInfo, pRxAttr->channel, (ERadioBand)pRxAttr->band, TI_FALSE);
669 /* Save the IE part of the Probe Response buffer in the site table */
670 siteMgr_saveProbeRespBuffer(pCurrBSS->hSiteMgr, bssid, (TI_UINT8 *)dataBuffer, bufLength);
671 }
672 os_memoryFree(pCurrBSS->hOs, pParam, sizeof(paramInfo_t));
673 return TI_OK;
674 }
675
676
677
678 /**
679 *
680 * currBSS_beaconReceivedCallb
681 *
682 * \b Description:
683 *
684 * Callback function, provided to MLME module. Called each time Beacon received.
685 * This function verifies that the Probe response was sent by current AP, and then
686 * updates current AP database.
687 *
688 * \b ARGS:
689 *
690 * I - hCurrBSS - Current BSS handle \n
691 *
692 * \b RETURNS:
693 *
694 * TI_OK on success, TI_NOK on failure.
695 *
696 * \sa
697 */
currBSS_beaconReceivedCallb(TI_HANDLE hCurrBSS,TRxAttr * pRxAttr,TMacAddr * bssid,mlmeFrameInfo_t * pFrameInfo,TI_UINT8 * dataBuffer,TI_UINT16 bufLength)698 TI_STATUS currBSS_beaconReceivedCallb(TI_HANDLE hCurrBSS,
699 TRxAttr *pRxAttr,
700 TMacAddr *bssid,
701 mlmeFrameInfo_t *pFrameInfo,
702 TI_UINT8 *dataBuffer,
703 TI_UINT16 bufLength)
704 {
705 currBSS_t *pCurrBSS = (currBSS_t *)hCurrBSS;
706 paramInfo_t *pParam;
707 ScanBssType_enum bssType;
708
709 pParam = (paramInfo_t *)os_memoryAlloc(pCurrBSS->hOs, sizeof(paramInfo_t));
710 if (!pParam)
711 return TI_NOK;
712
713 bssType = ((pFrameInfo->content.iePacket.capabilities >> CAP_ESS_SHIFT) & CAP_ESS_MASK) ? BSS_INFRASTRUCTURE : BSS_INDEPENDENT;
714 pParam->paramType = SITE_MGR_CURRENT_BSSID_PARAM;
715 siteMgr_getParam(pCurrBSS->hSiteMgr, pParam);
716
717 if (pCurrBSS->isConnected && MAC_EQUAL(pParam->content.siteMgrDesiredBSSID, *bssid))
718 {
719 siteMgr_updateSite(pCurrBSS->hSiteMgr, bssid, pFrameInfo, pRxAttr->channel, (ERadioBand)pRxAttr->band, TI_FALSE);
720 /* Save the IE part of the beacon buffer in the site table */
721 siteMgr_saveBeaconBuffer(pCurrBSS->hSiteMgr, bssid, (TI_UINT8 *)dataBuffer, bufLength);
722 }
723 else if(pCurrBSS->isConnected && (bssType==BSS_INDEPENDENT))
724 {
725 siteMgr_IbssMerge(pCurrBSS->hSiteMgr, pParam->content.siteMgrDesiredBSSID, *bssid,
726 pFrameInfo, pRxAttr->channel, (ERadioBand)pRxAttr->band);
727 siteMgr_saveBeaconBuffer(pCurrBSS->hSiteMgr, bssid, (TI_UINT8 *)dataBuffer, bufLength);
728 }
729 os_memoryFree(pCurrBSS->hOs, pParam, sizeof(paramInfo_t));
730 return TI_OK;
731 }
732
733
734 /**
735 *
736 * currBSS_updateConnectedState
737 *
738 * \b Description:
739 *
740 * This function is called when FW recovery performed.
741 *
742 * \b ARGS:
743 *
744 * I - hCurrBSS - Current BSS handle \n
745 * I - isConnected - TI_TRUE or TI_FALSE \n
746 * I - type - IBSS or EBSS \n
747 *
748 * \b RETURNS:
749 *
750 * -
751 *
752 * \sa
753 */
currBSS_updateConnectedState(TI_HANDLE hCurrBSS,TI_BOOL isConnected,ScanBssType_e type)754 void currBSS_updateConnectedState(TI_HANDLE hCurrBSS, TI_BOOL isConnected, ScanBssType_e type)
755 {
756 currBSS_t *pCurrBSS = (currBSS_t *)hCurrBSS;
757
758 pCurrBSS->type = type;
759 pCurrBSS->isConnected = isConnected;
760
761 if (isConnected)
762 {
763 /*** Store the info of current AP ***/
764 paramInfo_t *pParam;
765
766 pParam = (paramInfo_t *)os_memoryAlloc(pCurrBSS->hOs, sizeof(paramInfo_t));
767 if (!pParam)
768 return;
769
770 /* BSSID */
771 pParam->paramType = SITE_MGR_CURRENT_BSSID_PARAM;
772 siteMgr_getParam(pCurrBSS->hSiteMgr, pParam);
773 MAC_COPY (pCurrBSS->currAPInfo.BSSID, pParam->content.siteMgrDesiredBSSID);
774
775 /* Rx rate */
776 pParam->paramType = SITE_MGR_LAST_RX_RATE_PARAM;
777 siteMgr_getParam(pCurrBSS->hSiteMgr, pParam);
778 pCurrBSS->currAPInfo.rxRate = pParam->content.ctrlDataCurrentBasicRate;
779
780 /* Band */
781 pParam->paramType = SITE_MGR_RADIO_BAND_PARAM;
782 siteMgr_getParam(pCurrBSS->hSiteMgr, pParam);
783 pCurrBSS->currAPInfo.band = pParam->content.siteMgrRadioBand;
784
785 /* Channel */
786 pParam->paramType = SITE_MGR_CURRENT_CHANNEL_PARAM;
787 siteMgr_getParam(pCurrBSS->hSiteMgr, pParam);
788 pCurrBSS->currAPInfo.channel = pParam->content.siteMgrCurrentChannel;
789
790 /* Last Rx Tsf */
791 pParam->paramType = SITE_MGR_CURRENT_TSF_TIME_STAMP;
792 siteMgr_getParam(pCurrBSS->hSiteMgr, pParam);
793 os_memoryCopy(pCurrBSS->hOs, &pCurrBSS->currAPInfo.lastRxTSF,
794 pParam->content.siteMgrCurrentTsfTimeStamp, sizeof(pCurrBSS->currAPInfo.lastRxTSF));
795
796 /* Beacon interval */
797 pParam->paramType = SITE_MGR_BEACON_INTERVAL_PARAM;
798 siteMgr_getParam(pCurrBSS->hSiteMgr, pParam);
799 pCurrBSS->currAPInfo.beaconInterval = pParam->content.beaconInterval;
800
801 /* Capability */
802 pParam->paramType = SITE_MGR_SITE_CAPABILITY_PARAM;
803 siteMgr_getParam(pCurrBSS->hSiteMgr,pParam);
804 pCurrBSS->currAPInfo.capabilities = pParam->content.siteMgrSiteCapability;
805 pParam->paramType = SITE_MGR_CURRENT_TSF_TIME_STAMP;
806 siteMgr_getParam(pCurrBSS->hSiteMgr, pParam);
807
808 /* pCurrBSS->currAPInfo.lastRxHostTimestamp = *((TI_UINT64 *)(pIEs->TimeStamp));*/ /* TBD*/
809 os_memoryCopy(pCurrBSS->hOs, &pCurrBSS->currAPInfo.lastRxHostTimestamp, pParam->content.siteMgrCurrentTsfTimeStamp, sizeof(TI_UINT32));
810
811 pParam->paramType = SITE_MGR_LAST_BEACON_BUF_PARAM;
812 siteMgr_getParam(pCurrBSS->hSiteMgr, pParam);
813 pCurrBSS->currAPInfo.pBuffer = pParam->content.siteMgrLastBeacon.buffer;
814 pCurrBSS->currAPInfo.bufferLength = pParam->content.siteMgrLastBeacon.bufLength;
815 pCurrBSS->currAPInfo.resultType = (pParam->content.siteMgrLastBeacon.isBeacon) ? SCAN_RFT_BEACON : SCAN_RFT_PROBE_RESPONSE;
816
817 /* Set BSS Loss to Fw - note that it depends on the Connection type - (Infa/IBSS) */
818 currBSS_updateBSSLoss(pCurrBSS);
819
820 if(type == BSS_INFRASTRUCTURE)
821 {
822 TI_UINT32 uKeepAlivePreiod = pCurrBSS->uDefaultKeepAlivePeriod * 1000; /* convert to ms */
823 TSetTemplate tKeepAliveTemplate;
824 TKeepAliveParams tKeepAliveParams;
825
826 /*
827 * only configure the null-data keepa-live message if the interval is valid
828 * (either the default interval or the one from teh XCC IE)
829 */
830 if (0 != uKeepAlivePreiod)
831 {
832 TRACE0(pCurrBSS->hReport, REPORT_SEVERITY_INFORMATION , "currBSS_updateConnectedState: Configuring null-data keep-alive");
833
834 /* build null-data template */
835 tKeepAliveTemplate.ptr = &(pCurrBSS->keepAliveBuffer[ 0 ]);
836 if ( TI_OK != txCtrlServ_buildNullFrame (pCurrBSS->hTxCtrl,
837 tKeepAliveTemplate.ptr, &(tKeepAliveTemplate.len)))
838 {
839 TRACE0(pCurrBSS->hReport, REPORT_SEVERITY_ERROR , "currBSS_updateConnectedState: error building null data frame\n");
840
841 }
842
843 /* configure null-data template */
844 tKeepAliveTemplate.type = KEEP_ALIVE_TEMPLATE;
845 tKeepAliveTemplate.index = KEEP_ALIVE_NULL_DATA_INDEX;
846 tKeepAliveTemplate.uRateMask = RATE_MASK_UNSPECIFIED;
847 TWD_CmdTemplate (pCurrBSS->hTWD, &tKeepAliveTemplate, NULL, NULL);
848
849 /* configure paramters */
850 tKeepAliveParams.index = KEEP_ALIVE_NULL_DATA_INDEX;
851 tKeepAliveParams.enaDisFlag = TI_TRUE; /* enabled */
852 tKeepAliveParams.trigType = KEEP_ALIVE_TRIG_TYPE_NO_TX;
853 tKeepAliveParams.interval = uKeepAlivePreiod;
854 TWD_CfgKeepAlive (pCurrBSS->hTWD, &tKeepAliveParams);
855 }
856 }
857 os_memoryFree(pCurrBSS->hOs, pParam, sizeof(paramInfo_t));
858 }
859 else
860 {
861 if(type == BSS_INFRASTRUCTURE)
862 {
863 TKeepAliveParams tKeepAliveParams;
864
865 /* disable NULL-data keep-palive template */
866 tKeepAliveParams.index = KEEP_ALIVE_NULL_DATA_INDEX;
867 tKeepAliveParams.enaDisFlag = TI_FALSE; /* disabled */
868 tKeepAliveParams.interval = 1000; /* minimum accepted by the FW */
869 tKeepAliveParams.trigType = KEEP_ALIVE_TRIG_TYPE_NO_TX;
870 TWD_CfgKeepAlive (pCurrBSS->hTWD, &tKeepAliveParams);
871
872 }
873 }
874 }
875
876
877 /**
878 *
879 * currBSS_BssLost
880 *
881 * \b Description:
882 *
883 * Callback function, called upon BSS-Loss event from FW.
884 *
885 * \b ARGS:
886 *
887 * I - hCurrBSS - Current BSS handle \n
888 *
889 * \b RETURNS:
890 *
891 * void
892 *
893 * \sa
894 */
currBSS_BssLost(currBSS_t * hCurrBSS,TI_UINT8 * data,TI_UINT8 dataLength)895 static void currBSS_BssLost (currBSS_t *hCurrBSS,
896 TI_UINT8 *data,
897 TI_UINT8 dataLength)
898 {
899 currBSS_reportRoamingEvent(hCurrBSS, ROAMING_TRIGGER_BSS_LOSS, NULL);
900 }
901
902
903 /**
904 *
905 * currBSS_consecTxErrors
906 *
907 * \b Description:
908 *
909 * Callback function, provided to HAL module.
910 *
911 * \b ARGS:
912 *
913 * I - pCurrBSS - Current BSS handle \n
914 *
915 * \b RETURNS:
916 *
917 * TI_OK on success, TI_NOK on failure.
918 *
919 * \sa
920 */
currBSS_consecTxErrors(currBSS_t * hCurrBSS,TI_UINT8 * data,TI_UINT8 dataLength)921 static void currBSS_consecTxErrors(currBSS_t *hCurrBSS,
922 TI_UINT8 *data,
923 TI_UINT8 dataLength)
924 {
925 currBSS_reportRoamingEvent(hCurrBSS, ROAMING_TRIGGER_MAX_TX_RETRIES, NULL);
926 }
927
928
929 /**
930 *
931 * currBSS_lowRssiThrCrossed
932 *
933 * \b Description:
934 *
935 * Callback function, provided to HAL module.
936 *
937 * \b ARGS:
938 *
939 * I - pCurrBSS - Current BSS handle \n
940 *
941 * \b RETURNS:
942 *
943 * TI_OK on success, TI_NOK on failure.
944 *
945 * \sa
946 */
currBSS_lowRssiThrCrossed(currBSS_t * hCurrBSS,TI_UINT8 * data,TI_UINT8 dataLength)947 static void currBSS_lowRssiThrCrossed(currBSS_t *hCurrBSS,
948 TI_UINT8 *data,
949 TI_UINT8 dataLength)
950 {
951 currBSS_reportRoamingEvent(hCurrBSS, ROAMING_TRIGGER_LOW_QUALITY, NULL);
952 }
953
954
955 /**
956 *
957 * currBSS_lowSnrThrCrossed
958 *
959 * \b Description:
960 *
961 * Callback function, provided to HAL module.
962 *
963 * \b ARGS:
964 *
965 * I - pCurrBSS - Current BSS handle \n
966 *
967 * \b RETURNS:
968 *
969 * TI_OK on success, TI_NOK on failure.
970 *
971 * \sa
972 */
currBSS_lowSnrThrCrossed(currBSS_t * hCurrBSS,TI_UINT8 * data,TI_UINT8 dataLength)973 static void currBSS_lowSnrThrCrossed(currBSS_t *hCurrBSS,
974 TI_UINT8 *data,
975 TI_UINT8 dataLength)
976 {
977 currBSS_reportRoamingEvent(hCurrBSS, ROAMING_TRIGGER_LOW_SNR, NULL);
978 }
979
980 /**
981 *
982 * currBSS_reportRoamingEvent
983 *
984 * \b Description:
985 *
986 * This function checks the mode of Current BSS module.
987 * If connected to EBSS, it reports roaming event to AP Connection.
988 *
989 * \b ARGS:
990 *
991 * I - pCurrBSS - Current BSS handle \n
992 * I - roamingEventType - Roaming trigger to report \n
993 *
994 * \b RETURNS:
995 *
996 * TI_OK on success, TI_NOK on failure.
997 *
998 * \sa
999 */
currBSS_reportRoamingEvent(currBSS_t * pCurrBSS,apConn_roamingTrigger_e roamingEventType,roamingEventData_u * pRoamingEventData)1000 static void currBSS_reportRoamingEvent(currBSS_t *pCurrBSS,
1001 apConn_roamingTrigger_e roamingEventType,
1002 roamingEventData_u *pRoamingEventData)
1003 {
1004 TRACE1(pCurrBSS->hReport, REPORT_SEVERITY_INFORMATION, "currBSS_reportRoamingEvent: trigger %d\n", roamingEventType);
1005
1006 if (pCurrBSS->isConnected)
1007 {
1008 if (pCurrBSS->type == BSS_INFRASTRUCTURE)
1009 {
1010 apConn_reportRoamingEvent(pCurrBSS->hAPConn, roamingEventType, pRoamingEventData);
1011 }
1012 else /* IBSS */
1013 {
1014 if( roamingEventType == ROAMING_TRIGGER_BSS_LOSS )
1015 {
1016 /* If in IBSS call the SME restart function, this logic issues a DISCONNECT
1017 * event and tries to connect to other STA or establish self connection.
1018 */
1019 sme_Restart (pCurrBSS->hSme);
1020 }
1021 }
1022 }
1023 }
1024
1025
1026 /**
1027 *
1028 * currBSS_GetDefaultKeepAlivePeriod
1029 *
1030 * \b Description:
1031 *
1032 * Get DefaultKeepAlivePeriod parameter value.
1033 *
1034 * \b ARGS:
1035 *
1036 * I - hCurrBSS - Current BSS handle \n
1037 * I - uDefaultKeepAlivePeriod - The value \n
1038 *
1039 * \b RETURNS:
1040 *
1041 * None.
1042 *
1043 * \sa
1044 */
currBSS_GetDefaultKeepAlivePeriod(TI_HANDLE hCurrBSS,TI_UINT8 * uKeepAlivePeriod)1045 void currBSS_GetDefaultKeepAlivePeriod (TI_HANDLE hCurrBSS, TI_UINT8* uKeepAlivePeriod)
1046 {
1047 currBSS_t *pCurrBSS = (currBSS_t *)hCurrBSS;
1048
1049 *uKeepAlivePeriod = pCurrBSS->uDefaultKeepAlivePeriod;
1050 }
1051
1052
1053 /**
1054 *
1055 * currBSS_BackgroundScanQuality
1056 *
1057 * \b Description:
1058 *
1059 * Called be EventMBox upon Background Scan Quality Trigger.
1060 *
1061 * \b ARGS:
1062 *
1063 * I - hCurrBSS - Current BSS handle \n
1064 *
1065 * \b RETURNS:
1066 *
1067 * None.
1068 *
1069 * \sa
1070 */
currBSS_BackgroundScanQuality(TI_HANDLE hCurrBSS,TI_UINT8 * data,TI_UINT8 dataLength)1071 static void currBSS_BackgroundScanQuality(TI_HANDLE hCurrBSS,
1072 TI_UINT8 *data,
1073 TI_UINT8 dataLength)
1074 {
1075 currBSS_t *pCurrBSS = (currBSS_t *)hCurrBSS;
1076 TI_UINT8 averageRssi = *data;
1077 paramInfo_t *pParam;
1078
1079 TRACE1(pCurrBSS->hReport, REPORT_SEVERITY_INFORMATION, "BackgroundScanQuality Event: RSSI = %d\n", averageRssi );
1080
1081 /* Report to AP Connection about reaching RSSI low or normal (high) threshold */
1082 if (averageRssi < pCurrBSS->lowQualityForBkgrdScan)
1083 {
1084 apConn_reportRoamingEvent(pCurrBSS->hAPConn, ROAMING_TRIGGER_LOW_QUALITY_FOR_BG_SCAN, NULL);
1085 }
1086 else
1087 {
1088 apConn_reportRoamingEvent(pCurrBSS->hAPConn, ROAMING_TRIGGER_NORMAL_QUALITY_FOR_BG_SCAN, NULL);
1089 }
1090
1091 /* Update RSSI: */
1092 pCurrBSS->currAPInfo.RSSI = averageRssi;
1093
1094 /* Update Site Table in order to represent the RSSI of current AP correctly in the utility */
1095 pParam = (paramInfo_t *)os_memoryAlloc(pCurrBSS->hOs, sizeof(paramInfo_t));
1096 if (!pParam)
1097 return;
1098 pParam->paramType = SITE_MGR_CURRENT_SIGNAL_PARAM;
1099 pParam->content.siteMgrCurrentSignal.rssi = averageRssi;
1100 siteMgr_setParam(pCurrBSS->hSiteMgr, pParam);
1101 os_memoryFree(pCurrBSS->hOs, pParam, sizeof(paramInfo_t));
1102 }
1103
1104 /* EMP specific functions - lior*/
1105
1106
1107 /**
1108 *
1109 * currBss_findEmptyUserTrigger
1110 *
1111 * \b Description:
1112 *
1113 * Called be EventMBox upon Background Scan Quality Trigger.
1114 *
1115 * \b ARGS:
1116 *
1117 * I - hCurrBSS - Current BSS handle \n
1118 *
1119 * \b RETURNS:
1120 *
1121 * None.
1122 *
1123 * \sa
1124 */
currBss_findEmptyUserTrigger(TI_HANDLE hCurrBSS,TI_UINT16 clientID,TI_UINT8 * triggerIdx)1125 static triggerDesc_t* currBss_findEmptyUserTrigger(TI_HANDLE hCurrBSS, TI_UINT16 clientID, TI_UINT8* triggerIdx)
1126 {
1127 currBSS_t *pCurrBSS = (currBSS_t *)hCurrBSS;
1128 TI_UINT8 i=0;
1129
1130 for (i=0; i< MAX_NUM_OF_RSSI_SNR_TRIGGERS ; i++)
1131 {
1132 if (clientID == pCurrBSS->aTriggersDesc[i].clientID || /* if the same client ID found, overwrite this trigger*/
1133 (pCurrBSS->aTriggersDesc[i].WasRegisteredByApp == TI_FALSE && pCurrBSS->aTriggersDesc[i].fCB == NULL))
1134 {
1135 *triggerIdx = i;
1136 return &pCurrBSS->aTriggersDesc[i];
1137 }
1138 }
1139
1140 return NULL;
1141 }
1142
1143
1144 /**
1145 * \fn currBSS_RegisterTriggerEvent
1146 * \brief register the event in the currBss static table.
1147 *
1148 * \Args:
1149 * \param hCurrBSS - Current BSS handle
1150 * \param triggerID - The RSSI/SNR trigger ID as defined in the TWD. this arg is the table index.
1151 * \param clientID - The client ID, '0' value means internal driver module client
1152 * \param fCB - the trigger event handler. NULL value will be set for external app registration.
1153 * \return >= 0 if the empty Trigger event ID (index table) has been found and occupied
1154 else -1 to signal an error
1155 * \sa
1156 */
currBSS_RegisterTriggerEvent(TI_HANDLE hCurrBSS,TI_UINT8 triggerID,TI_UINT16 clientID,void * fCB,TI_HANDLE hCB)1157 TI_INT8 currBSS_RegisterTriggerEvent (TI_HANDLE hCurrBSS, TI_UINT8 triggerID,TI_UINT16 clientID, void* fCB, TI_HANDLE hCB)
1158 {
1159 currBSS_t *pCurrBSS = (currBSS_t *)hCurrBSS;
1160 triggerDesc_t *pEmptyTrigger;
1161 TI_UINT8 emptyTriggerIdx = 0;
1162
1163 if (triggerID >= MAX_NUM_OF_RSSI_SNR_TRIGGERS)
1164 {
1165 TRACE1(pCurrBSS->hReport, REPORT_SEVERITY_ERROR , "currBSS_RegisterTriggerEvent: triggerID=%d is not in legal range \n", triggerID);
1166 return -1;
1167 }
1168
1169 TRACE3(pCurrBSS->hReport, REPORT_SEVERITY_INFORMATION, "currBSS_RegisterTriggerEvent: triggerID=%d, clientID=%d , fCB=%d. \n",triggerID, clientID ,fCB);
1170
1171 if(clientID > 0) /* this event is registered by application */
1172 {
1173 pEmptyTrigger = currBss_findEmptyUserTrigger(hCurrBSS, clientID, &emptyTriggerIdx);
1174 if (pEmptyTrigger != NULL)
1175 {
1176 pEmptyTrigger->clientID = clientID;
1177 pEmptyTrigger->fCB = NULL;
1178 pEmptyTrigger->hCB = NULL;
1179 pEmptyTrigger->WasRegisteredByApp = TI_TRUE;
1180 }
1181 else
1182 {
1183 TRACE0(pCurrBSS->hReport, REPORT_SEVERITY_ERROR , "currBSS_RegisterTriggerEvent: Table is full!. no Empty trigger is available! \n");
1184 return -1;
1185 }
1186 }
1187 else
1188 {
1189 pCurrBSS->aTriggersDesc[triggerID].clientID = 0;
1190 pCurrBSS->aTriggersDesc[triggerID].fCB = fCB;
1191 pCurrBSS->aTriggersDesc[triggerID].hCB = hCB;
1192 pCurrBSS->aTriggersDesc[triggerID].WasRegisteredByApp = TI_FALSE;
1193 }
1194
1195 TWD_EnableEvent (pCurrBSS->hTWD, triggerID);
1196 return emptyTriggerIdx;
1197 }
1198
1199
1200
1201
1202 /**
1203 * \fn currBss_HandleTriggerEvent
1204 * \brief called by the user trigger event callbcack.
1205 *
1206 * \Args:
1207 * \param hCurrBSS - Current BSS handle
1208 * \param data - The event data
1209 * \param dataLength - The event data length
1210 * \param eventID - The event ID
1211 * \return TI_STATUS
1212 * \sa
1213 */
currBss_HandleTriggerEvent(TI_HANDLE hCurrBSS,TI_UINT8 * data,TI_UINT8 dataLength,TI_UINT8 eventID)1214 static TI_STATUS currBss_HandleTriggerEvent(TI_HANDLE hCurrBSS, TI_UINT8 *data, TI_UINT8 dataLength, TI_UINT8 eventID)
1215 {
1216 triggerDesc_t *pTrigger;
1217 triggerDataEx_t triggerInfo;
1218 currBSS_t *pCurrBSS = (currBSS_t *)hCurrBSS;
1219
1220 TRACE1(pCurrBSS->hReport ,REPORT_SEVERITY_INFORMATION, "currBss_HandleTriggerEvent(). eventID =%d \n",eventID);
1221
1222 if (eventID < MAX_NUM_OF_RSSI_SNR_TRIGGERS)
1223 {
1224 pTrigger = &pCurrBSS->aTriggersDesc[eventID];
1225 }
1226 else
1227 {
1228 return TI_NOK;
1229 }
1230
1231 if (TI_FALSE == pTrigger->WasRegisteredByApp)
1232 {
1233 ((TCurrBssDataCb)pTrigger->fCB)(pTrigger->hCB, data, dataLength);
1234 }
1235 else
1236 {
1237 triggerInfo.pData = data;
1238 triggerInfo.dataLength = dataLength;
1239 triggerInfo.clientID = pTrigger->clientID;
1240 EvHandlerSendEvent(pCurrBSS->hEvHandler, IPC_EVENT_RSSI_SNR_TRIGGER, (TI_UINT8*)&triggerInfo, sizeof(triggerDataEx_t));
1241 }
1242
1243 return TI_OK;
1244 }
1245
1246 /**
1247 * \fn currBSS_RssiSnrTrigger0-7
1248 * \brief User Defined Trigger 0-7 callbacks
1249 *
1250 * Called by EventMBox upon User Defined Trigger 0 - 7.
1251 *
1252 * \note
1253 * \param hCurrBSS - Current BSS handle
1254 * \param data - The event data
1255 * \param dataLength - The event data length
1256 * \return void
1257 * \sa
1258 */
1259
currBSS_RssiSnrTrigger0(TI_HANDLE hCurrBSS,TI_UINT8 * data,TI_UINT8 dataLength)1260 static void currBSS_RssiSnrTrigger0 (TI_HANDLE hCurrBSS, TI_UINT8 *data, TI_UINT8 dataLength)
1261 {
1262 TI_UINT8 eventID = TWD_OWN_EVENT_RSSI_SNR_TRIGGER_0;
1263 currBss_HandleTriggerEvent (hCurrBSS, data, dataLength, eventID);
1264 }
currBSS_RssiSnrTrigger1(TI_HANDLE hCurrBSS,TI_UINT8 * data,TI_UINT8 dataLength)1265 static void currBSS_RssiSnrTrigger1 (TI_HANDLE hCurrBSS, TI_UINT8 *data, TI_UINT8 dataLength)
1266 {
1267 TI_UINT8 eventID = TWD_OWN_EVENT_RSSI_SNR_TRIGGER_1;
1268 currBss_HandleTriggerEvent (hCurrBSS, data, dataLength, eventID);
1269 }
currBSS_RssiSnrTrigger2(TI_HANDLE hCurrBSS,TI_UINT8 * data,TI_UINT8 dataLength)1270 static void currBSS_RssiSnrTrigger2 (TI_HANDLE hCurrBSS, TI_UINT8 *data, TI_UINT8 dataLength)
1271 {
1272 TI_UINT8 eventID = TWD_OWN_EVENT_RSSI_SNR_TRIGGER_2;
1273 currBss_HandleTriggerEvent (hCurrBSS, data, dataLength, eventID);
1274 }
currBSS_RssiSnrTrigger3(TI_HANDLE hCurrBSS,TI_UINT8 * data,TI_UINT8 dataLength)1275 static void currBSS_RssiSnrTrigger3 (TI_HANDLE hCurrBSS, TI_UINT8 *data, TI_UINT8 dataLength)
1276 {
1277 TI_UINT8 eventID = TWD_OWN_EVENT_RSSI_SNR_TRIGGER_3;
1278 currBss_HandleTriggerEvent (hCurrBSS, data, dataLength, eventID);
1279 }
currBSS_RssiSnrTrigger4(TI_HANDLE hCurrBSS,TI_UINT8 * data,TI_UINT8 dataLength)1280 static void currBSS_RssiSnrTrigger4 (TI_HANDLE hCurrBSS, TI_UINT8 *data, TI_UINT8 dataLength)
1281 {
1282 TI_UINT8 eventID = TWD_OWN_EVENT_RSSI_SNR_TRIGGER_4;
1283 currBss_HandleTriggerEvent (hCurrBSS, data, dataLength, eventID);
1284 }
currBSS_RssiSnrTrigger5(TI_HANDLE hCurrBSS,TI_UINT8 * data,TI_UINT8 dataLength)1285 static void currBSS_RssiSnrTrigger5 (TI_HANDLE hCurrBSS, TI_UINT8 *data, TI_UINT8 dataLength)
1286 {
1287 TI_UINT8 eventID = TWD_OWN_EVENT_RSSI_SNR_TRIGGER_5;
1288 currBss_HandleTriggerEvent (hCurrBSS, data, dataLength, eventID);
1289 }
currBSS_RssiSnrTrigger6(TI_HANDLE hCurrBSS,TI_UINT8 * data,TI_UINT8 dataLength)1290 static void currBSS_RssiSnrTrigger6 (TI_HANDLE hCurrBSS, TI_UINT8 *data, TI_UINT8 dataLength)
1291 {
1292 TI_UINT8 eventID = TWD_OWN_EVENT_RSSI_SNR_TRIGGER_6;
1293 currBss_HandleTriggerEvent (hCurrBSS, data, dataLength, eventID);
1294 }
currBSS_RssiSnrTrigger7(TI_HANDLE hCurrBSS,TI_UINT8 * data,TI_UINT8 dataLength)1295 static void currBSS_RssiSnrTrigger7 (TI_HANDLE hCurrBSS, TI_UINT8 *data, TI_UINT8 dataLength)
1296 {
1297 TI_UINT8 eventID = TWD_OWN_EVENT_RSSI_SNR_TRIGGER_7;
1298 currBss_HandleTriggerEvent (hCurrBSS, data, dataLength, eventID);
1299 }
1300
1301
currBSS_BssLossThresholdCrossed(TI_HANDLE hCurrBSS,TI_UINT8 * data,TI_UINT8 dataLength)1302 static TI_STATUS currBSS_BssLossThresholdCrossed(TI_HANDLE hCurrBSS, TI_UINT8 *data, TI_UINT8 dataLength)
1303 {
1304 currBSS_t *pCurrBSS = (currBSS_t *)hCurrBSS;
1305 triggerDataEx_t triggerInfo;
1306
1307 triggerInfo.pData = data;
1308 triggerInfo.dataLength = dataLength;
1309 triggerInfo.clientID = pCurrBSS->BssLossClientID;
1310 EvHandlerSendEvent(pCurrBSS->hEvHandler, IPC_EVENT_BSS_LOSS, (TI_UINT8*)&triggerInfo, sizeof(triggerDataEx_t));
1311
1312 currBSS_reportRoamingEvent(hCurrBSS, ROAMING_TRIGGER_BSS_LOSS, NULL);
1313 return TI_OK;
1314 }
1315
currBSS_MaxTxRetryThresholdCrossed(TI_HANDLE hCurrBSS,TI_UINT8 * data,TI_UINT8 dataLength)1316 static TI_STATUS currBSS_MaxTxRetryThresholdCrossed(TI_HANDLE hCurrBSS, TI_UINT8 *data, TI_UINT8 dataLength)
1317 {
1318 currBSS_t *pCurrBSS = (currBSS_t *)hCurrBSS;
1319 triggerDataEx_t triggerInfo;
1320
1321 triggerInfo.pData = data;
1322 triggerInfo.dataLength = dataLength;
1323 triggerInfo.clientID = pCurrBSS->TxRetryClientID;
1324 EvHandlerSendEvent(pCurrBSS->hEvHandler, IPC_EVENT_TX_RETRY_FALIURE, (TI_UINT8*)&triggerInfo, sizeof(triggerDataEx_t));
1325
1326 currBSS_reportRoamingEvent(hCurrBSS, ROAMING_TRIGGER_BSS_LOSS, NULL);
1327 return TI_OK;
1328 }
1329
1330
1331
currBss_registerBssLossEvent(TI_HANDLE hCurrBSS,TI_UINT32 uNumOfBeacons,TI_UINT16 uClientID)1332 TI_STATUS currBss_registerBssLossEvent(TI_HANDLE hCurrBSS,TI_UINT32 uNumOfBeacons, TI_UINT16 uClientID)
1333 {
1334 TRroamingTriggerParams params;
1335 currBSS_t *pCurrBSS = (currBSS_t *)hCurrBSS;
1336
1337 TRACE2(pCurrBSS->hReport,REPORT_SEVERITY_INFORMATION , "currBss_registerBssLossEvent() uNumOfBeacons=%d,uClientID =%d \n", uNumOfBeacons,uClientID );
1338
1339 /* Register for 'BSS-Loss' event */
1340 TWD_RegisterEvent (pCurrBSS->hTWD, TWD_OWN_EVENT_BSS_LOSE, (void *)currBSS_BssLossThresholdCrossed, pCurrBSS);
1341 TWD_EnableEvent (pCurrBSS->hTWD, TWD_OWN_EVENT_BSS_LOSE);
1342
1343 /* save the client ID for this event registration */
1344 pCurrBSS->BssLossClientID = uClientID;
1345
1346 pCurrBSS->numExpectedTbttForBSSLoss = uNumOfBeacons;
1347 params.TsfMissThreshold = uNumOfBeacons; /* number of missing beacon allowed before out-of-sync event is issued*/
1348 params.BssLossTimeout = NO_BEACON_DEFAULT_TIMEOUT;
1349 TWD_CfgConnMonitParams (pCurrBSS->hTWD, ¶ms);
1350
1351 return TI_OK;
1352 }
1353
currBss_registerTxRetryEvent(TI_HANDLE hCurrBSS,TI_UINT8 uMaxTxRetryThreshold,TI_UINT16 uClientID)1354 TI_STATUS currBss_registerTxRetryEvent(TI_HANDLE hCurrBSS,TI_UINT8 uMaxTxRetryThreshold, TI_UINT16 uClientID)
1355 {
1356 TRroamingTriggerParams params;
1357 currBSS_t *pCurrBSS = (currBSS_t *)hCurrBSS;
1358
1359 TRACE2(pCurrBSS->hReport,REPORT_SEVERITY_INFORMATION , "currBss_registerTxRetryEvent() uMaxTxRetryThreshold=%d,uClientID =%d \n", uMaxTxRetryThreshold,uClientID );
1360 /* Register for 'Consec. Tx error' */
1361 TWD_RegisterEvent (pCurrBSS->hTWD, TWD_OWN_EVENT_MAX_TX_RETRY, (void *)currBSS_MaxTxRetryThresholdCrossed, pCurrBSS);
1362 TWD_EnableEvent (pCurrBSS->hTWD, TWD_OWN_EVENT_MAX_TX_RETRY);
1363
1364 pCurrBSS->maxTxRetryThreshold = uMaxTxRetryThreshold;
1365 params.maxTxRetry = uMaxTxRetryThreshold;
1366 TWD_CfgMaxTxRetry (pCurrBSS->hTWD, ¶ms);
1367
1368 return TI_OK;
1369 }
1370
1371
1372
1373
1374
currBSS_setParam(TI_HANDLE hCurrBSS,paramInfo_t * pParam)1375 TI_STATUS currBSS_setParam(TI_HANDLE hCurrBSS, paramInfo_t *pParam)
1376 {
1377 currBSS_t *pCurrBSS = (currBSS_t *)hCurrBSS;
1378 TI_STATUS status = TI_OK;
1379
1380 if (pParam == NULL)
1381 {
1382 TRACE0(pCurrBSS->hReport, REPORT_SEVERITY_ERROR , " currBSS_setParam(): pParam is NULL!\n");
1383 return TI_NOK;
1384 }
1385
1386 TRACE1(pCurrBSS->hReport,REPORT_SEVERITY_INFORMATION , "currBSS_setParam() %X \n", pParam->paramType);
1387
1388 switch (pParam->paramType)
1389 {
1390 case CURR_BSS_REGISTER_LINK_QUALITY_EVENT_PARAM:
1391 {
1392 TUserDefinedQualityTrigger *pUserTrigger = &pParam->content.rssiSnrTrigger;
1393 RssiSnrTriggerCfg_t tTriggerCfg;
1394 TI_INT8 triggerID = 0;
1395
1396 TRACE8(pCurrBSS->hReport, REPORT_SEVERITY_INFORMATION , "currBSS_setParam - USER_DEFINED_TRIGGER: \n index = %d, \n threshold = %d, \n pacing = %d, \n metric = %d, \n type = %d, \n direction = %d, \n hystersis = %d, \n enable = %d \n",pUserTrigger->uIndex,pUserTrigger->iThreshold,pUserTrigger->uPacing,pUserTrigger->uMetric,pUserTrigger->uType,pUserTrigger->uDirection,pUserTrigger->uHystersis,pUserTrigger->uEnable);
1397 /* Copy from user structure to driver structure */
1398 tTriggerCfg.index = pUserTrigger->uIndex;
1399 tTriggerCfg.threshold = pUserTrigger->iThreshold;
1400 tTriggerCfg.pacing = pUserTrigger->uPacing;
1401 tTriggerCfg.metric = pUserTrigger->uMetric;
1402 tTriggerCfg.type = pUserTrigger->uType;
1403 tTriggerCfg.direction = pUserTrigger->uDirection;
1404 tTriggerCfg.hystersis = pUserTrigger->uHystersis;
1405 tTriggerCfg.enable = pUserTrigger->uEnable;
1406
1407 /* the registration request is not from EMP (clientID must be greater than 0)
1408 so it is probably external user mode application like the CLI that sends always '0' as client ID*/
1409 if (pUserTrigger->uClientID == 0)
1410 {
1411 pUserTrigger->uClientID = pUserTrigger->uIndex + 1; /* use the index (starting from '0') as positive client ID*/
1412 }
1413 /* Register the event and enable it before configuration. */
1414 triggerID = currBSS_RegisterTriggerEvent(hCurrBSS, (TI_UINT8)0, pUserTrigger->uClientID, (void*)0, hCurrBSS);
1415
1416 if (triggerID < 0)
1417 {
1418 TRACE0(pCurrBSS->hReport, REPORT_SEVERITY_ERROR , "currBSS_setParam: RSSI/SNR user trigger registration FAILED!! \n");
1419 return TI_NOK;
1420 }
1421 else
1422 {
1423 tTriggerCfg.index = (uint8)triggerID; /* the index is used for the eventMBox triggerID mapping*/
1424 }
1425 /* Send user defined trigger to FW (the related FW events are handled by the currBSS) */
1426 status = TWD_CfgRssiSnrTrigger (pCurrBSS->hTWD, &tTriggerCfg);
1427
1428 }
1429 break;
1430
1431 default:
1432 TRACE1(pCurrBSS->hReport, REPORT_SEVERITY_ERROR, "currBSS_setParam bad param= %X\n", pParam->paramType);
1433 break;
1434 }
1435
1436 return status;
1437 }
1438
1439
currBSS_getParam(TI_HANDLE hCurrBSS,paramInfo_t * pParam)1440 TI_STATUS currBSS_getParam(TI_HANDLE hCurrBSS, paramInfo_t *pParam)
1441 {
1442 return TI_NOK;
1443 }
1444
currBss_DbgPrintTriggersTable(TI_HANDLE hCurrBSS)1445 void currBss_DbgPrintTriggersTable(TI_HANDLE hCurrBSS)
1446 {
1447 #ifdef REPORT_LOG
1448 int i=0;
1449 currBSS_t *pCurrBSS = (currBSS_t *)hCurrBSS;
1450
1451 WLAN_OS_REPORT(("\n ------------------- Triggers Table -------------------------- \n"));
1452
1453 for (i=0; i< MAX_NUM_OF_RSSI_SNR_TRIGGERS ; i++)
1454 {
1455 WLAN_OS_REPORT(("\n TriggerIdx[%d]: clientID=%d , fCB=%d, WasRegisteredByApp=%d. \n",
1456 i,
1457 pCurrBSS->aTriggersDesc[i].clientID,
1458 pCurrBSS->aTriggersDesc[i].fCB,
1459 pCurrBSS->aTriggersDesc[i].WasRegisteredByApp));
1460 }
1461 WLAN_OS_REPORT(("\n --------------------------------------------------------------- \n"));
1462 #endif
1463 }
1464