• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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, &params);
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, &params);
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, &params);
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, &params);
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