1 /****************************************************************************
2 **+-----------------------------------------------------------------------+**
3 **| |**
4 **| Copyright(c) 1998 - 2008 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 ****************************************************************************/
35
36 /** \file siteMgr.c
37 * \brief Site Manager implementation
38 *
39 * \see siteMgr.h
40 */
41
42 #include "report.h"
43 #include "osTIType.h"
44 #include "osApi.h"
45 #include "siteMgrApi.h"
46 #include "siteHash.h"
47 #include "smeApi.h"
48 #include "utils.h"
49 #include "connApi.h"
50 #include "mlmeSm.h"
51 #include "smeSmApi.h"
52 #include "DataCtrl_Api.h"
53 #include "regulatoryDomainApi.h"
54 #include "rsnApi.h"
55 #include "measurementMgrApi.h"
56 #include "qosMngr_API.h"
57 #include "PowerMgr_API.h"
58 #include "EvHandler.h"
59 #include "TI_IPC_Api.h"
60 #include "MacServices_api.h"
61 #include "whalHwDefs.h"
62 #include "apConn.h"
63 #include "currBss.h"
64 #include "PowerMgr.h"
65
66 #ifdef EXC_MODULE_INCLUDED
67 #include "excMngr.h"
68 #endif
69 #include "configMgr.h"
70
71 /* definitions */
72
73 #define JOIN_RATE_MASK_1M 0x01
74 #define JOIN_RATE_MASK_2M 0x02
75 #define JOIN_RATE_MASK_5_5M 0x04
76 #define JOIN_RATE_MASK_11M 0x08
77 #define JOIN_RATE_MASK_22M 0x10
78
79
80 #define SITE_MGR_INIT_BIT 1
81 #define TIMER_INIT_BIT 2
82 #define DESIRED_PARAMS_INIT_BIT 3
83 #define MGMT_PARAMS_INIT_BIT 4
84
85 #define BUILT_IN_TEST_PERIOD 500
86
87 #define KEEP_ALIVE_SEND_NULL_DATA_PERIOD 10000
88
89 #define SITE_MGR_IBSS_AGING_TIMEOUT_DEF 10 * 1000 /* 10 seconds */
90
91 #define DEAFULT_BEACON_FILTERING_NUM (10)
92
93 /* Reconfig constants */
94 #define SCAN_FAIL_THRESHOLD_FOR_RECONFIG 4 /* After 4 times we reset the 580 register and still no AP found - make recovery */
95 #define SCAN_FAIL_THRESHOLD_FOR_RESET_REG_580 90 /* After 90 times (45 seconds) and no AP found - reset the 580 register */
96 #define SCAN_FAIL_RECONFIG_ENABLED TRUE
97 #define SCAN_FAIL_RECONFIG_DISABLED FALSE
98
99 /* Local Macros */
100
101 #define UPDATE_BEACON_INTERVAL(pSite, pFrameInfo) pSite->beaconInterval = pFrameInfo->content.iePacket.beaconInerval
102
103 #define UPDATE_CAPABILITIES(pSite, pFrameInfo) pSite->capabilities = pFrameInfo->content.iePacket.capabilities
104
105 #define UPDATE_PRIVACY(pSite, pFrameInfo) pSite->privacy = ((pFrameInfo->content.iePacket.capabilities >> CAP_PRIVACY_SHIFT) & CAP_PRIVACY_MASK) ? TRUE : FALSE
106
107 #define UPDATE_AGILITY(pSite, pFrameInfo) pSite->agility = ((pFrameInfo->content.iePacket.capabilities >> CAP_AGILE_SHIFT) & CAP_AGILE_MASK) ? TRUE : FALSE
108
109 #define UPDATE_SLOT_TIME(pSite, pFrameInfo) pSite->newSlotTime = ((pFrameInfo->content.iePacket.capabilities >> CAP_SLOT_TIME_SHIFT) & CAP_SLOT_TIME_MASK) ? PHY_SLOT_TIME_SHORT : PHY_SLOT_TIME_LONG
110 #define UPDATE_PROTECTION(pSite, pFrameInfo) pSite->useProtection = (pFrameInfo->content.iePacket.useProtection)
111
112 #define UPDATE_SSID(pSite, pFrameInfo) if (pFrameInfo->content.iePacket.pSsid != NULL) { \
113 pSite->ssid.len = pFrameInfo->content.iePacket.pSsid->hdr.eleLen; \
114 os_memoryCopy(pSiteMgr->hOs, (void *)pSite->ssid.ssidString, (void *)pFrameInfo->content.iePacket.pSsid->serviceSetId, pFrameInfo->content.iePacket.pSsid->hdr.eleLen) ;}
115
116 #define UPDATE_CHANNEL(pSite, pFrameInfo, rxChannel) if (pFrameInfo->content.iePacket.pDSParamsSet == NULL) \
117 pSite->channel = rxChannel; \
118 else \
119 pSite->channel = pFrameInfo->content.iePacket.pDSParamsSet->currChannel;
120
121
122
123 #define UPDATE_DTIM_PERIOD(pSite, pFrameInfo) if (pFrameInfo->content.iePacket.pTIM != NULL) \
124 pSite->dtimPeriod = pFrameInfo->content.iePacket.pTIM->dtimPeriod
125
126 #define UPDATE_ATIM_WINDOW(pSite, pFrameInfo) if (pFrameInfo->content.iePacket.pIBSSParamsSet != NULL) \
127 pSite->atimWindow = pFrameInfo->content.iePacket.pIBSSParamsSet->atimWindow
128
129 #define UPDATE_BEACON_AP_TX_POWER(pSite, pFrameInfo) if (pFrameInfo->content.iePacket.TPCReport != NULL) \
130 pSite->APTxPower = pFrameInfo->content.iePacket.TPCReport->transmitPower
131
132 #define UPDATE_PROBE_AP_TX_POWER(pSite, pFrameInfo) if (pFrameInfo->content.iePacket.TPCReport != NULL) \
133 pSite->APTxPower = pFrameInfo->content.iePacket.TPCReport->transmitPower
134
135 #define UPDATE_BSS_TYPE(pSite, pFrameInfo) pSite->bssType = ((pFrameInfo->content.iePacket.capabilities >> CAP_ESS_SHIFT) & CAP_ESS_MASK) ? BSS_INFRASTRUCTURE : BSS_INDEPENDENT
136
137 #define UPDATE_LOCAL_TIME_STAMP(pSiteMgr, pSite, pFrameInfo) pSite->localTimeStamp = os_timeStampMs(pSiteMgr->hOs)
138
139 #define UPDATE_DTIM_TIME(pSiteMgr, pSite, pFrameInfo) pSite->dtimTimeStamp = os_timeStampMs(pSiteMgr->hOs)
140
141 /* Updated from beacons */
142 #define UPDATE_BEACON_MODULATION(pSite, pFrameInfo) pSite->beaconModulation = ((pFrameInfo->content.iePacket.capabilities >> CAP_PBCC_SHIFT) & CAP_PBCC_MASK) ? DRV_MODULATION_PBCC : DRV_MODULATION_CCK
143
144 /* Updated from probes */
145 #define UPDATE_PROBE_MODULATION(pSite, pFrameInfo) pSite->probeModulation = ((pFrameInfo->content.iePacket.capabilities >> CAP_PBCC_SHIFT) & CAP_PBCC_MASK) ? DRV_MODULATION_PBCC : DRV_MODULATION_CCK
146
147 #define UPDATE_BEACON_RECV(pSite) pSite->beaconRecv = TRUE
148
149 #define UPDATE_PROBE_RECV(pSite) pSite->probeRecv = TRUE
150
151
152 #define UPDATE_RSN_IE(pSite, pRsnIe, rsnIeLen) if (pRsnIe != NULL) { \
153 UINT8 length=0, index=0;\
154 pSite->rsnIeLen = rsnIeLen;\
155 while ((length < pSite->rsnIeLen) && (index<MAX_RSN_IE)){\
156 pSite->pRsnIe[index].hdr = pRsnIe->hdr;\
157 os_memoryCopy(pSiteMgr->hOs, (void *)pSite->pRsnIe[index].rsnIeData, (void *)pRsnIe->rsnIeData, pRsnIe->hdr.eleLen);\
158 length += (pRsnIe->hdr.eleLen+2); \
159 pRsnIe += 1; \
160 index++;}\
161 } \
162 else {pSite->rsnIeLen = 0;}
163
164 #define UPDATE_BEACON_TIMESTAMP(pSiteMgr, pSite, pFrameInfo) os_memoryCopy(pSiteMgr->hOs, pSite->tsfTimeStamp, (void *)pFrameInfo->content.iePacket.timestamp, TIME_STAMP_LEN)
165
166 #define SET_ENTRY_FLAG_IN_SITE_TABLE(pSite) pSite->Not_Received = 0
167
168
169
170
171 /* Local functions definitions*/
172
173 static void update_apsd(siteEntry_t *pSite, mlmeFrameInfo_t *pFrameInfo);
174
175 static void release_module(siteMgr_t *pSiteMgr, UINT32 initVec);
176
177 static void updateSiteInfo(siteMgr_t *pSiteMgr, mlmeFrameInfo_t *pFrameInfo, siteEntry_t *pSite, UINT8 rxChannel);
178
179 static void updateRates(siteMgr_t *pSiteMgr, siteEntry_t *pSite, mlmeFrameInfo_t *pFrameInfo);
180
181 static void updateBeaconQosParams(siteMgr_t *pSiteMgr, siteEntry_t *pSite, mlmeFrameInfo_t *pFrameInfo);
182
183 static void updateProbeQosParams(siteMgr_t *pSiteMgr, siteEntry_t *pSite, mlmeFrameInfo_t *pFrameInfo);
184
185 static void updatePreamble(siteMgr_t *pSiteMgr, siteEntry_t *pSite, mlmeFrameInfo_t *pFrameInfo);
186
187 static void updateFourX(siteMgr_t *pSiteMgr, siteEntry_t *pSite, mlmeFrameInfo_t *pFrameInfo);
188
189 static TI_STATUS getBssidList(siteMgr_t *pSiteMgr, OS_802_11_BSSID_LIST_EX *bssidList, UINT32* pLength, BOOL allVarIes);
190
191 static void getPrimarySiteDesc(siteMgr_t *pSiteMgr, OS_802_11_BSSID *pPrimarySiteDesc, BOOL supplyExtendedInfo);
192
193 static TI_STATUS getPrimaryBssid(siteMgr_t *pSiteMgr, OS_802_11_BSSID_EX *primaryBssid, UINT32 *pLength);
194
195 static rate_e translateRateMaskToValue(siteMgr_t *pSiteMgr, UINT32 rateMask);
196
197 static void getSupportedRateSet(siteMgr_t *pSiteMgr, rates_t *pRatesSet);
198
199 static TI_STATUS setSupportedRateSet(siteMgr_t *pSiteMgr, rates_t *pRatesSet);
200
201 static void validateDesiredTxRate(rate_e desiredTxRate,modulationType_e desiredModulation,UINT32 suppRates,UINT32 *bitMap,BOOL *txDesiredRateSupported);
202
203 static TI_STATUS calculateBssidListSize(siteMgr_t *pSiteMgr, UINT32 *pLength, BOOL allVarIes);
204
205 static void siteMgr_externalConfigurationParametersSet(TI_HANDLE hSiteMgr);
206
207
208 void siteMgr_gotFirstBcn(TI_HANDLE hSiteMgr);
209
210 /**************************************************************/
211 /* DEBUG CLI CRASH */
212 /**************************************************************/
213 static whalCtrl_joinBss_t joinParams;
214 static whalCtrl_setTemplate_t templateStruct;
215 static probeRspTemplate_t probeRspTemplate;
216 static nullDataTemplate_t nullDataTemplate;
217 static psPollTemplate_t psPollTemplate;
218 static QosNullDataTemplate_t QosNullDataTemplate;
219 /**************************************************************/
220
221 #define CHAN_FREQ_TABLE_SIZE (sizeof(ChanFreq) / sizeof(struct CHAN_FREQ))
222
223 struct CHAN_FREQ {
224 UINT8 chan;
225 UINT32 freq;
226 } ChanFreq[] = {
227 {1,2412000}, {2,2417000}, {3,2422000}, {4,2427000},
228 {5,2432000}, {6,2437000}, {7,2442000}, {8,2447000},
229 {9,2452000},
230 {10,2457000}, {11,2462000}, {12,2467000}, {13,2472000},
231 {14,2484000}, {36,5180000}, {40,5200000}, {44,5220000},
232 {48,5240000}, {52,5260000}, {56,5280000}, {60,5300000},
233 {64,5320000},
234 {100,5500000}, {104,5520000}, {108,5540000}, {112,5560000},
235 {116,5580000}, {120,5600000}, {124,5620000}, {128,5640000},
236 {132,5660000}, {136,5680000}, {140,5700000}, {149,5745000},
237 {153,5765000}, {157,5785000}, {161,5805000} };
238
239
240
Freq2Chan(UINT32 freq)241 static UINT8 Freq2Chan(UINT32 freq)
242 {
243 UINT32 i;
244
245 for(i=0; i<CHAN_FREQ_TABLE_SIZE; i++)
246 if(ChanFreq[i].freq == freq) return ChanFreq[i].chan;
247
248 return 0;
249 }
250
251
Chan2Freq(UINT8 chan)252 static UINT32 Chan2Freq(UINT8 chan)
253 {
254 UINT32 i;
255
256 for(i=0; i<CHAN_FREQ_TABLE_SIZE; i++)
257 if(ChanFreq[i].chan == chan) return ChanFreq[i].freq;
258
259 return 0;
260 }
261
262 /************************************************************************
263 * siteMgr_setTemporaryTxPower *
264 *************************************************************************
265 DESCRIPTION: This function is used to start the Tx Power Control adjust mechanism
266 in regulatoryDomain.
267
268 INPUT: bActivateTempFix - Whether the power should be adjusted
269 ************************************************************************/
siteMgr_setTemporaryTxPower(siteMgr_t * pSiteMgr,BOOL bActivateTempFix)270 void siteMgr_setTemporaryTxPower(siteMgr_t* pSiteMgr, BOOL bActivateTempFix)
271 {
272 paramInfo_t param;
273
274 WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
275 ("siteMgr_setTemporaryTxPower is = %s \n", (bActivateTempFix ? "ON" : "OFF")));
276
277 /* Set the temporary Power Level via the Regulatory Domain*/
278 param.paramType = REGULATORY_DOMAIN_TEMPORARY_TX_ATTENUATION_PARAM;
279 param.content.bActivateTempPowerFix = bActivateTempFix;
280 regulatoryDomain_setParam(pSiteMgr->hRegulatoryDomain,¶m);
281 }
282
283 /* Interface functions Implementation */
284
285
286 /*static void UPDATE_RSN_IE (siteMgr_t* pSiteMgr, siteEntry_t *pSite, dot11_RSN_t *pRsnIe, UINT8 rsnIeLen)
287 {
288
289 if (pRsnIe != NULL) {
290 UINT8 length=0, index=0;
291 pSite->rsnIeLen = rsnIeLen;
292 while ((length < pSite->rsnIeLen) && (index<MAX_RSN_IE)){
293 pSite->pRsnIe[index].hdr = pRsnIe->hdr;
294 os_memoryCopy(pSiteMgr->hOs, pSite->pRsnIe[index].rsnIeData, pRsnIe->rsnIeData, pRsnIe->hdr.eleLen);
295 length += (pRsnIe->hdr.eleLen+2);
296 pRsnIe += 1;
297 index++;}
298 }
299 else {pSite->rsnIeLen = 0;}
300 }*/
301 /************************************************************************
302 * siteMgr_create *
303 ************************************************************************
304 DESCRIPTION: Site manager module creation function, called by the config mgr in creation phase
305 performs the following:
306 - Allocate the site manager handle
307 - Allocate the desired & mgmt params structure
308
309 INPUT: hOs - Handle to OS
310
311
312 OUTPUT:
313
314
315 RETURN: Handle to the site manager module on success, NULL otherwise
316 ************************************************************************/
siteMgr_create(TI_HANDLE hOs)317 TI_HANDLE siteMgr_create(TI_HANDLE hOs)
318 {
319 siteMgr_t *pSiteMgr;
320 UINT32 initVec;
321
322 initVec = 0;
323
324 pSiteMgr = os_memoryAlloc(hOs, sizeof(siteMgr_t));
325 if (pSiteMgr == NULL)
326 return NULL;
327
328 os_memoryZero(hOs, pSiteMgr, sizeof(siteMgr_t));
329
330 initVec |= (1 << SITE_MGR_INIT_BIT);
331
332 pSiteMgr->pDesiredParams = os_memoryAlloc(hOs, sizeof(siteMgrInitParams_t));
333 if (pSiteMgr->pDesiredParams == NULL)
334 {
335 release_module(pSiteMgr, initVec);
336 return NULL;
337 }
338
339 initVec |= (1 << DESIRED_PARAMS_INIT_BIT);
340
341 pSiteMgr->pSitesMgmtParams = os_memoryAlloc(hOs, sizeof(sitesMgmtParams_t));
342 if (pSiteMgr->pSitesMgmtParams == NULL)
343 {
344 release_module(pSiteMgr, initVec);
345 return NULL;
346 }
347
348 initVec |= (1 << MGMT_PARAMS_INIT_BIT);
349
350 pSiteMgr->hOs = hOs;
351
352 return(pSiteMgr);
353 }
354
355
356
357 /************************************************************************
358 * siteMgr_config *
359 ************************************************************************
360 DESCRIPTION: Site manager module configuration function, called by the config mgr in configuration phase
361 performs the following:
362 - Reset & initiailzes local variables
363 - Init the handles to be used by the module
364
365 INPUT: hSiteMgr - site manager handle
366 List of handles to be used by the module
367 pSiteMgrInitParams - Init table of the module, contains the following:
368 - Parameters read from registry
369 - Chip parameters
370
371
372 OUTPUT:
373
374 RETURN: OK on success, NOK otherwise
375
376 ************************************************************************/
siteMgr_config(TI_HANDLE hSiteMgr,TI_HANDLE hConn,TI_HANDLE hSmeSm,TI_HANDLE hCtrlData,TI_HANDLE hRxData,TI_HANDLE hTxData,TI_HANDLE hRsn,TI_HANDLE hAuth,TI_HANDLE hAssoc,TI_HANDLE hHalCtrl,TI_HANDLE hMlmeSm,TI_HANDLE hRegulatoryDomain,TI_HANDLE hMeasurementMgr,TI_HANDLE hApConn,TI_HANDLE hCurrBss,TI_HANDLE hReport,TI_HANDLE hOs,TI_HANDLE hExcMngr,TI_HANDLE hQosMngr,TI_HANDLE thePowerMgrHandle,TI_HANDLE hScr,TI_HANDLE hEvHandler,TI_HANDLE hMacServices,siteMgrInitParams_t * pSiteMgrInitParams)377 TI_STATUS siteMgr_config( TI_HANDLE hSiteMgr,
378 TI_HANDLE hConn,
379 TI_HANDLE hSmeSm,
380 TI_HANDLE hCtrlData,
381 TI_HANDLE hRxData,
382 TI_HANDLE hTxData,
383 TI_HANDLE hRsn,
384 TI_HANDLE hAuth,
385 TI_HANDLE hAssoc,
386 TI_HANDLE hHalCtrl,
387 TI_HANDLE hMlmeSm,
388 TI_HANDLE hRegulatoryDomain,
389 TI_HANDLE hMeasurementMgr,
390 TI_HANDLE hApConn,
391 TI_HANDLE hCurrBss,
392 TI_HANDLE hReport,
393 TI_HANDLE hOs ,
394 TI_HANDLE hExcMngr,
395 TI_HANDLE hQosMngr,
396 TI_HANDLE thePowerMgrHandle,
397 TI_HANDLE hScr,
398 TI_HANDLE hEvHandler,
399 TI_HANDLE hMacServices,
400 siteMgrInitParams_t *pSiteMgrInitParams)
401 {
402 siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
403 UINT32 timestamp;
404 slotTime_e slotTime;
405 paramInfo_t saParam;
406 TI_STATUS status;
407
408 /* Init handles */
409 pSiteMgr->hConn = hConn;
410 pSiteMgr->hSmeSm = hSmeSm;
411 pSiteMgr->hHalCtrl = hHalCtrl;
412 pSiteMgr->hCtrlData = hCtrlData;
413 pSiteMgr->hRxData = hRxData;
414 pSiteMgr->hTxData = hTxData;
415 pSiteMgr->hRsn = hRsn;
416 pSiteMgr->hAuth = hAuth;
417 pSiteMgr->hAssoc = hAssoc;
418 pSiteMgr->hRegulatoryDomain = hRegulatoryDomain;
419 pSiteMgr->hMeasurementMgr = hMeasurementMgr;
420 pSiteMgr->hReport = hReport;
421 pSiteMgr->hOs = hOs;
422 pSiteMgr->hMlmeSm = hMlmeSm;
423 pSiteMgr->hAssoc = hAssoc;
424 pSiteMgr->hReport = hReport;
425 pSiteMgr->hExcMngr = hExcMngr;
426 pSiteMgr->hApConn = hApConn;
427 pSiteMgr->hCurrBss = hCurrBss;
428 pSiteMgr->hQosMngr = hQosMngr;
429 pSiteMgr->hPowerMgr = thePowerMgrHandle;
430 pSiteMgr->hScr = hScr;
431 pSiteMgr->hEvHandler = hEvHandler;
432 pSiteMgr->hMacServices = hMacServices;
433
434 /* Reset counter for Tx Power Control adjustment */
435 pSiteMgr->siteMgrTxPowerCheckTime = 0;
436
437 /* Init desired parameters */
438 os_memoryCopy(hOs, pSiteMgr->pDesiredParams, pSiteMgrInitParams, sizeof(siteMgrInitParams_t));
439
440 /* Init Beacon Filter Desired State */
441 pSiteMgr->beaconFilterParams.desiredState = pSiteMgrInitParams->beaconFilterParams.desiredState;
442 /* Init Beacon Filter numOfStored parameter */
443 pSiteMgr->beaconFilterParams.numOfStored = pSiteMgrInitParams->beaconFilterParams.numOfStored;
444
445 /* Init management params */
446 pSiteMgr->pSitesMgmtParams->dot11A_sitesTables.maxNumOfSites = MAX_SITES_A_BAND;
447 siteMgr_resetSiteTable(pSiteMgr,(siteTablesParams_t *)&pSiteMgr->pSitesMgmtParams->dot11A_sitesTables);
448 pSiteMgr->pSitesMgmtParams->dot11BG_sitesTables.maxNumOfSites = MAX_SITES_BG_BAND;
449 siteMgr_resetSiteTable(pSiteMgr,&pSiteMgr->pSitesMgmtParams->dot11BG_sitesTables);
450
451 /* calculate random BSSID for usage in IBSS */
452 timestamp = os_timeStampMs(pSiteMgr->hOs);
453 os_memoryCopy(pSiteMgr->hOs, (void *)&(pSiteMgr->ibssBssid.addr[0]), ×tamp, sizeof(UINT32));
454 pSiteMgr->ibssBssid.addr[0] = 0x00;
455 timestamp = os_timeStampMs(pSiteMgr->hOs);
456 os_memoryCopy(pSiteMgr->hOs, (void *)&(pSiteMgr->ibssBssid.addr[2]), ×tamp, sizeof(UINT32));
457
458 /* Get the Source MAC address in order to use it for AD-Hoc BSSID, solving Conexant ST issue for WiFi test */
459 saParam.paramType = CTRL_DATA_MAC_ADDRESS;
460 status = ctrlData_getParam(hCtrlData, &saParam);
461 if (status != OK)
462 {
463 WLAN_OS_REPORT(("\n ERROR !!! : siteMgr_config - Error in getting MAC address\n" ));
464 return NOK;
465 }
466 pSiteMgr->ibssBssid.addr[0] = 0x02;
467 pSiteMgr->ibssBssid.addr[1] = saParam.content.ctrlDataDeviceMacAddress.addr[1];
468 pSiteMgr->ibssBssid.addr[2] = saParam.content.ctrlDataDeviceMacAddress.addr[2];
469
470 pSiteMgr->keepAliveEnable = pSiteMgrInitParams->siteMgrDesiredkeepAliveEnable;
471 pSiteMgr->numOfBeaconFiltering = DEAFULT_BEACON_FILTERING_NUM;
472
473 switch(pSiteMgr->pDesiredParams->siteMgrRadioValues.siteMgr_radioType)
474 {
475 case MAXIM:
476 pSiteMgr->pDesiredParams->siteMgrRadioValues.pSiteMgr_selectedRadioValues =
477 &pSiteMgr->pDesiredParams->siteMgrRadioValues.siteMgr_maximRadioValues;
478 pSiteMgr->pDesiredParams->siteMgrSupportedBand = RADIO_BAND_2_4_GHZ;
479 WLAN_REPORT_INIT(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("MAXIM !!! \n"));
480
481 break;
482
483 case RFMD:
484 pSiteMgr->pDesiredParams->siteMgrRadioValues.pSiteMgr_selectedRadioValues =
485 &pSiteMgr->pDesiredParams->siteMgrRadioValues.siteMgr_rfmdRadioValues;
486 pSiteMgr->pDesiredParams->siteMgrSupportedBand = RADIO_BAND_2_4_GHZ;
487 WLAN_REPORT_INIT(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("RFMD !!! \n"));
488 break;
489
490 case RADIA_BG:
491 pSiteMgr->pDesiredParams->siteMgrRadioValues.pSiteMgr_selectedRadioValues =
492 &pSiteMgr->pDesiredParams->siteMgrRadioValues.siteMgr_radiaRadioValues;
493 pSiteMgr->pDesiredParams->siteMgrSupportedBand = RADIO_BAND_2_4_GHZ;
494 WLAN_REPORT_INIT(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("RADIA bg !!! \n"));
495 break;
496
497 case RADIA_ABG:
498 pSiteMgr->pDesiredParams->siteMgrRadioValues.pSiteMgr_selectedRadioValues =
499 &pSiteMgr->pDesiredParams->siteMgrRadioValues.siteMgr_radiaRadioValues;
500 pSiteMgr->pDesiredParams->siteMgrSupportedBand = RADIO_BAND_DUAL;
501 WLAN_REPORT_INIT(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("RADIA abg !!! \n"));
502
503 break;
504
505 default:
506 pSiteMgr->pDesiredParams->siteMgrRadioValues.pSiteMgr_selectedRadioValues = NULL;
507 WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
508 ("!!!.....UnKnown Radio Type !!!\n"));
509 }
510
511 pSiteMgr->beaconSentCount = 0;
512 pSiteMgr->pDesiredParams->siteMgrDesiredAtimWindow = 0;
513
514 if(pSiteMgr->pDesiredParams->siteMgrDesiredDot11Mode == DOT11_DUAL_MODE)
515 {
516 if(pSiteMgr->pDesiredParams->siteMgrSupportedBand == RADIO_BAND_DUAL)
517 {
518 pSiteMgr->siteMgrOperationalMode = DOT11_G_MODE;
519 pSiteMgr->radioBand = RADIO_BAND_2_4_GHZ;
520 slotTime = pSiteMgr->pDesiredParams->siteMgrDesiredSlotTime;
521 pSiteMgr->pSitesMgmtParams->pCurrentSiteTable = &pSiteMgr->pSitesMgmtParams->dot11BG_sitesTables;
522 }
523 else if(pSiteMgr->pDesiredParams->siteMgrSupportedBand == RADIO_BAND_2_4_GHZ)
524 {
525 pSiteMgr->pDesiredParams->siteMgrDesiredDot11Mode = DOT11_G_MODE;
526 pSiteMgr->siteMgrOperationalMode = DOT11_G_MODE;
527 pSiteMgr->radioBand = RADIO_BAND_2_4_GHZ;
528 slotTime = pSiteMgr->pDesiredParams->siteMgrDesiredSlotTime;
529 pSiteMgr->pSitesMgmtParams->pCurrentSiteTable = &pSiteMgr->pSitesMgmtParams->dot11BG_sitesTables;
530 }
531 else
532 {
533 pSiteMgr->pDesiredParams->siteMgrDesiredDot11Mode = DOT11_A_MODE;
534 pSiteMgr->siteMgrOperationalMode = DOT11_A_MODE;
535 pSiteMgr->radioBand = RADIO_BAND_5_0_GHZ;
536 slotTime = PHY_SLOT_TIME_SHORT;
537 pSiteMgr->pSitesMgmtParams->pCurrentSiteTable = (siteTablesParams_t *)&pSiteMgr->pSitesMgmtParams->dot11A_sitesTables;
538 }
539 }
540 else if(pSiteMgr->pDesiredParams->siteMgrDesiredDot11Mode == DOT11_G_MODE)
541 {
542 slotTime = pSiteMgr->pDesiredParams->siteMgrDesiredSlotTime;
543 pSiteMgr->radioBand = RADIO_BAND_2_4_GHZ;
544 if((pSiteMgr->pDesiredParams->siteMgrSupportedBand == RADIO_BAND_DUAL) ||
545 (pSiteMgr->pDesiredParams->siteMgrSupportedBand == RADIO_BAND_2_4_GHZ))
546 {
547 pSiteMgr->pSitesMgmtParams->pCurrentSiteTable = &pSiteMgr->pSitesMgmtParams->dot11BG_sitesTables;
548 pSiteMgr->siteMgrOperationalMode = pSiteMgr->pDesiredParams->siteMgrDesiredDot11Mode;
549
550 }
551 else
552 {
553 WLAN_OS_REPORT(("\nERROR !!!.....The radio doesn't support the desired dot11 mode !!! \n"));
554 return NOK;
555 }
556 }
557 else if(pSiteMgr->pDesiredParams->siteMgrDesiredDot11Mode == DOT11_B_MODE)
558 {
559 slotTime = PHY_SLOT_TIME_LONG;
560 pSiteMgr->radioBand = RADIO_BAND_2_4_GHZ;
561 if((pSiteMgr->pDesiredParams->siteMgrSupportedBand == RADIO_BAND_DUAL) ||
562 (pSiteMgr->pDesiredParams->siteMgrSupportedBand == RADIO_BAND_2_4_GHZ))
563 {
564 pSiteMgr->pSitesMgmtParams->pCurrentSiteTable = &pSiteMgr->pSitesMgmtParams->dot11BG_sitesTables;
565 pSiteMgr->siteMgrOperationalMode = pSiteMgr->pDesiredParams->siteMgrDesiredDot11Mode;
566 }
567 else
568 {
569 WLAN_OS_REPORT(("\nERROR !!!.....The radio doesn't support the desired dot11 mode !!! \n"));
570 return NOK;
571 }
572 }
573 else
574 {
575 slotTime = PHY_SLOT_TIME_SHORT;
576 pSiteMgr->radioBand = RADIO_BAND_5_0_GHZ;
577 if((pSiteMgr->pDesiredParams->siteMgrSupportedBand == RADIO_BAND_DUAL) ||
578 (pSiteMgr->pDesiredParams->siteMgrSupportedBand == RADIO_BAND_5_0_GHZ))
579 {
580 pSiteMgr->siteMgrOperationalMode = pSiteMgr->pDesiredParams->siteMgrDesiredDot11Mode;
581 pSiteMgr->pSitesMgmtParams->pCurrentSiteTable = (siteTablesParams_t *)&pSiteMgr->pSitesMgmtParams->dot11A_sitesTables;
582 }
583 else
584 {
585 WLAN_OS_REPORT(("\nERROR !!!.....The radio doesn't support the desired dot11 mode !!! \n"));
586 return NOK;
587 }
588 }
589
590
591 /* configure hal with common core-hal parameters */
592 whalCtrl_SetRadioBand(pSiteMgr->hHalCtrl, pSiteMgr->radioBand);
593 whalCtrl_SetSlotTime(pSiteMgr->hHalCtrl, slotTime);
594 siteMgr_ConfigRate(hSiteMgr);
595
596 WLAN_REPORT_INIT(hReport, SITE_MGR_MODULE_LOG,
597 (" SiteMgr - numOfElements = %d IETableSize = %d\n" , pSiteMgrInitParams->beaconFilterParams.numOfElements, pSiteMgrInitParams->beaconFilterParams.IETableSize)) ;
598 /*send the table regardless to the state*/
599 whalCtrl_SetBeaconFilterIETable(pSiteMgr->hHalCtrl ,(UINT8 *)&(pSiteMgrInitParams->beaconFilterParams.numOfElements), (UINT8 *)&(pSiteMgrInitParams->beaconFilterParams.IETable[0]) , (UINT8 *)&(pSiteMgrInitParams->beaconFilterParams.IETableSize)) ;
600
601 /* At start-up Set the Beacon Filter state as the User required */
602 whalCtrl_SetBeaconFiltering(pSiteMgr->hHalCtrl, pSiteMgrInitParams->beaconFilterParams.desiredState, pSiteMgr->beaconFilterParams.numOfStored);
603
604 pSiteMgr->pSitesMgmtParams->pPrevPrimarySite = NULL;
605
606 pSiteMgr->powerSaveLdMode = FALSE;
607
608 WLAN_REPORT_INIT(hReport, SITE_MGR_MODULE_LOG, (".....Site manager configured successfully\n"));
609
610 return OK;
611 }
612
613
614 /************************************************************************
615 * siteMgr_unLoad *
616 ************************************************************************
617 DESCRIPTION: site manager module unload function, called by the config mgr in the unlod phase
618 performs the following:
619 - Free all memory aloocated by the module
620
621 INPUT: hSiteMgr - site mgr handle.
622
623
624 OUTPUT:
625
626 RETURN: OK on success, NOK otherwise
627
628 ************************************************************************/
siteMgr_unLoad(TI_HANDLE hSiteMgr)629 TI_STATUS siteMgr_unLoad(TI_HANDLE hSiteMgr)
630 {
631 UINT32 initVec;
632 siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
633
634 if (!pSiteMgr)
635 return OK;
636
637 initVec = 0xFFFF;
638 release_module(pSiteMgr, initVec);
639
640 return OK;
641 }
642
643 /***********************************************************************
644 * siteMgr_setParam
645 ***********************************************************************
646 DESCRIPTION: site mgr set param function, called by the following:
647 - config mgr in order to set a parameter from the OS abstraction layer.
648 In this fuction, the site manager OS abstraction layer configures the site manager to the desired params.
649 Sometimes it requires a re scan, depending in the parameter type
650
651 INPUT: hSiteMgr - Connection handle.
652 pParam - Pointer to the parameter
653
654 OUTPUT:
655
656 RETURN: RE_SCAN_NEEDED if re scan needed, OK on success, NOK on failure
657
658 ************************************************************************/
659
siteMgr_setParam(TI_HANDLE hSiteMgr,paramInfo_t * pParam)660 TI_STATUS siteMgr_setParam(TI_HANDLE hSiteMgr,
661 paramInfo_t *pParam)
662 {
663 siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
664 siteEntry_t *pPrimarySite = pSiteMgr->pSitesMgmtParams->pPrimarySite;
665 OS_802_11_CONFIGURATION *pConfig;
666 UINT32 channel;
667 slotTime_e slotTime;
668
669 switch(pParam->paramType)
670 {
671 case SITE_MGR_CONFIGURATION_PARAM:
672 pConfig = pParam->content.pSiteMgrConfiguration;
673
674 /* for(channel = 0; channel < SITE_MGR_CHANNEL_MAX+1; channel++)
675 {
676 if(pConfig->channel == pSiteMgr->pDesiredParams->siteMgrFreq2ChannelTable[channel])
677 break;
678 }*/
679
680 channel = Freq2Chan(pConfig->Union.channel);
681
682 if(channel == 0 || channel > SITE_MGR_CHANNEL_MAX)
683 return PARAM_VALUE_NOT_VALID;
684 else
685 pConfig->Union.channel = channel;
686
687 if((pSiteMgr->pDesiredParams->siteMgrDesiredChannel != pConfig->Union.channel) ||
688 (pSiteMgr->pDesiredParams->siteMgrDesiredChannel != pConfig->Union.channel) ||
689 (pSiteMgr->pDesiredParams->siteMgrDesiredAtimWindow != pConfig->ATIMWindow))
690 {
691 pSiteMgr->pDesiredParams->siteMgrDesiredChannel = (UINT8)pConfig->Union.channel;
692 pSiteMgr->pDesiredParams->siteMgrDesiredBeaconInterval = (UINT16)pConfig->BeaconPeriod;
693 pSiteMgr->pDesiredParams->siteMgrDesiredAtimWindow = pConfig->ATIMWindow;
694 }
695
696 return OK;
697
698 case SITE_MGR_DESIRED_CHANNEL_PARAM:
699 if (pParam->content.siteMgrDesiredChannel > SITE_MGR_CHANNEL_MAX)
700 return PARAM_VALUE_NOT_VALID;
701
702 if (pSiteMgr->pDesiredParams->siteMgrDesiredChannel != pParam->content.siteMgrDesiredChannel)
703 pSiteMgr->pDesiredParams->siteMgrDesiredChannel = (UINT8)pParam->content.siteMgrDesiredChannel;
704 return OK;
705
706 case SITE_MGR_DESIRED_BSSID_PARAM:
707 os_memoryCopy(pSiteMgr->hOs, (void *)pSiteMgr->pDesiredParams->siteMgrDesiredBSSID.addr, (void *)pParam->content.siteMgrDesiredBSSID.addr, sizeof(macAddress_t));
708 #if 0
709 WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("Set BSSID = 0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x \n",
710 pSiteMgr->pDesiredParams->siteMgrDesiredBSSID.addr[0],
711 pSiteMgr->pDesiredParams->siteMgrDesiredBSSID.addr[1],
712 pSiteMgr->pDesiredParams->siteMgrDesiredBSSID.addr[2],
713 pSiteMgr->pDesiredParams->siteMgrDesiredBSSID.addr[3],
714 pSiteMgr->pDesiredParams->siteMgrDesiredBSSID.addr[4],
715 pSiteMgr->pDesiredParams->siteMgrDesiredBSSID.addr[5]));
716 #endif
717 return OK;
718
719
720
721 case SITE_MGR_DESIRED_SSID_PARAM:
722
723 WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
724 ("\nSet new SSID=%s (len=%d) \n",
725 pParam->content.siteMgrDesiredSSID.ssidString,
726 pParam->content.siteMgrDesiredSSID.len));
727
728 if (pParam->content.siteMgrDesiredSSID.len > MAX_SSID_LEN)
729 return PARAM_VALUE_NOT_VALID;
730
731 os_memoryCopy(pSiteMgr->hOs, &pSiteMgr->pDesiredParams->siteMgrDesiredSSID, &pParam->content.siteMgrDesiredSSID, sizeof(ssid_t));
732 /* only add null at the end of the string if the string length is less than 32 bytes and so we have one char left
733 TODO: another byte must be added, and the alignment change MUST be tested (esp. in CLI commands with ssid_t */
734 if ( MAX_SSID_LEN > pSiteMgr->pDesiredParams->siteMgrDesiredSSID.len )
735 {
736 pSiteMgr->pDesiredParams->siteMgrDesiredSSID.ssidString[pSiteMgr->pDesiredParams->siteMgrDesiredSSID.len] = '\0';
737 }
738
739 /* increase the random IBSS BSSID calculated during init */
740 pSiteMgr->ibssBssid.addr[MAC_ADDR_LEN - 1] ++;
741
742 if (utils_isJunkSSID(&pSiteMgr->pDesiredParams->siteMgrDesiredSSID))
743 {
744 rsn_removedDefKeys(pSiteMgr->hRsn);
745 }
746 return RE_SCAN_NEEDED;
747
748
749 case SITE_MGR_DESIRED_BSS_TYPE_PARAM:
750 WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
751 ("\nSet BssType = %d\n", pParam->content.siteMgrDesiredBSSType));
752 if (pParam->content.siteMgrDesiredBSSType > BSS_ANY)
753 return PARAM_VALUE_NOT_VALID;
754
755 if (pSiteMgr->pDesiredParams->siteMgrDesiredBSSType != pParam->content.siteMgrDesiredBSSType)
756 {
757 pSiteMgr->pDesiredParams->siteMgrDesiredBSSType = pParam->content.siteMgrDesiredBSSType;
758
759 /* If the new BSS type is NOT Ad_Hoc, We make sure that the rate masks are set to G */
760 if(pSiteMgr->pDesiredParams->siteMgrDesiredBSSType != BSS_INDEPENDENT)
761
762 {
763 pSiteMgr->siteMgrOperationalMode = DOT11_G_MODE;
764 siteMgr_ConfigRate(pSiteMgr);
765 }
766
767 /* If the new BSS type is Ad_Hoc, increase the random BSSID calculated during init */
768 if(pSiteMgr->pDesiredParams->siteMgrDesiredBSSType == BSS_INDEPENDENT)
769 {
770 pSiteMgr->ibssBssid.addr[MAC_ADDR_LEN - 1] ++;
771 }
772
773 /* go to B_ONLY Mode only if WiFI bit is Set*/
774 if (pSiteMgr->pDesiredParams->siteMgrWiFiAdhoc == TRUE)
775 { /* Configuration For AdHoc when using external configuration */
776 if(pSiteMgr->pDesiredParams->siteMgrExternalConfiguration == FALSE)
777 {
778 siteMgr_externalConfigurationParametersSet(hSiteMgr);
779 }
780 }
781 }
782
783 return OK;
784
785 case SITE_MGR_DESIRED_MODULATION_TYPE_PARAM:
786 if ((pParam->content.siteMgrDesiredModulationType < DRV_MODULATION_CCK) ||
787 (pParam->content.siteMgrDesiredModulationType > DRV_MODULATION_OFDM))
788 return PARAM_VALUE_NOT_VALID;
789
790 if (pSiteMgr->pDesiredParams->siteMgrDesiredModulationType != pParam->content.siteMgrDesiredModulationType)
791 {
792 pSiteMgr->pDesiredParams->siteMgrDesiredModulationType = pParam->content.siteMgrDesiredModulationType;
793 /* means that we are moving from non-pbcc network to pbcc */
794 if (pParam->content.siteMgrDesiredModulationType == DRV_MODULATION_PBCC)
795 return RE_SCAN_NEEDED;
796 return OK;
797 }
798 return OK;
799
800 case SITE_MGR_BEACON_RECV:
801 if (!pPrimarySite)
802 {
803 return NO_SITE_SELECTED_YET;
804 }
805 pPrimarySite->beaconRecv = pParam->content.siteMgrBeaconRecv;
806 return OK;
807
808
809 case SITE_MGR_DESIRED_BEACON_INTERVAL_PARAM:
810 if (pParam->content.siteMgrDesiredBeaconInterval < SITE_MGR_BEACON_INTERVAL_MIN)
811 return PARAM_VALUE_NOT_VALID;
812
813 if (pSiteMgr->pDesiredParams->siteMgrDesiredBeaconInterval != pParam->content.siteMgrDesiredBeaconInterval)
814 pSiteMgr->pDesiredParams->siteMgrDesiredBeaconInterval = pParam->content.siteMgrDesiredBeaconInterval;
815 return OK;
816
817 case SITE_MGR_DESIRED_PREAMBLE_TYPE_PARAM:
818 if ((pParam->content.siteMgrDesiredPreambleType != PREAMBLE_LONG) &&
819 (pParam->content.siteMgrDesiredPreambleType != PREAMBLE_SHORT))
820 return PARAM_VALUE_NOT_VALID;
821
822 if (pSiteMgr->pDesiredParams->siteMgrDesiredPreambleType != pParam->content.siteMgrDesiredPreambleType)
823 {
824 pSiteMgr->pDesiredParams->siteMgrDesiredPreambleType = pParam->content.siteMgrDesiredPreambleType;
825 }
826 return OK;
827
828 case SITE_MGR_DESIRED_SUPPORTED_RATE_SET_PARAM:
829 return setSupportedRateSet(pSiteMgr, &(pParam->content.siteMgrDesiredSupportedRateSet));
830
831 case SITE_MGR_DESIRED_DOT11_MODE_PARAM:
832 if(pParam->content.siteMgrDot11Mode > DOT11_MAX_MODE)
833 return PARAM_VALUE_NOT_VALID;
834
835 if(pSiteMgr->pDesiredParams->siteMgrDesiredDot11Mode != pParam->content.siteMgrDot11Mode)
836 {
837 pSiteMgr->pDesiredParams->siteMgrDesiredDot11Mode = pParam->content.siteMgrDot11Mode;
838
839 /* since the dot11ABAmode changed, the STA operational mode should be changed */
840 if(pSiteMgr->pDesiredParams->siteMgrDesiredDot11Mode == DOT11_DUAL_MODE)
841 {
842 if(pSiteMgr->pDesiredParams->siteMgrSupportedBand == RADIO_BAND_DUAL)
843 {
844 pSiteMgr->siteMgrOperationalMode = DOT11_G_MODE;
845 }
846 else if(pSiteMgr->pDesiredParams->siteMgrSupportedBand == RADIO_BAND_2_4_GHZ)
847 {
848 pSiteMgr->pDesiredParams->siteMgrDesiredDot11Mode = DOT11_G_MODE;
849 pSiteMgr->siteMgrOperationalMode = DOT11_G_MODE;
850 }
851 else
852 {
853 pSiteMgr->pDesiredParams->siteMgrDesiredDot11Mode = DOT11_G_MODE;
854 pSiteMgr->siteMgrOperationalMode = DOT11_A_MODE;
855 }
856
857 }
858 else
859 pSiteMgr->siteMgrOperationalMode = pSiteMgr->pDesiredParams->siteMgrDesiredDot11Mode;
860
861 /* configure HAL with new parameters update rates and select site table */
862 pSiteMgr->prevRadioBand = pSiteMgr->radioBand;
863 if(pSiteMgr->siteMgrOperationalMode == DOT11_A_MODE)
864 {
865 pSiteMgr->pSitesMgmtParams->pCurrentSiteTable = (siteTablesParams_t *)&pSiteMgr->pSitesMgmtParams->dot11A_sitesTables;
866 pSiteMgr->radioBand = RADIO_BAND_5_0_GHZ;
867 slotTime = PHY_SLOT_TIME_SHORT;
868 }
869 else if(pSiteMgr->siteMgrOperationalMode == DOT11_G_MODE)
870 {
871 pSiteMgr->pSitesMgmtParams->pCurrentSiteTable = &pSiteMgr->pSitesMgmtParams->dot11BG_sitesTables;
872 pSiteMgr->radioBand = RADIO_BAND_2_4_GHZ;
873 slotTime = pSiteMgr->pDesiredParams->siteMgrDesiredSlotTime;
874 }
875 else
876 {
877 pSiteMgr->pSitesMgmtParams->pCurrentSiteTable = &pSiteMgr->pSitesMgmtParams->dot11BG_sitesTables;
878 pSiteMgr->radioBand = RADIO_BAND_2_4_GHZ;
879 slotTime = PHY_SLOT_TIME_LONG;
880 }
881
882 if(pSiteMgr->prevRadioBand != pSiteMgr->radioBand)
883 siteMgr_bandParamsConfig(pSiteMgr, TRUE);
884
885 /* configure HAL */
886 whalCtrl_SetRadioBand(pSiteMgr->hHalCtrl, pSiteMgr->radioBand);
887 whalCtrl_SetSlotTime(pSiteMgr->hHalCtrl, slotTime);
888
889 /* If the BSS type is Ad_Hoc, increase the random BSSID calculated during init */
890 if(pSiteMgr->pDesiredParams->siteMgrDesiredBSSType == BSS_INDEPENDENT)
891 {
892 pSiteMgr->ibssBssid.addr[MAC_ADDR_LEN - 1] ++;
893 }
894
895 /*siteMgr_resetAllSiteTables(pSiteMgr); */
896 return RE_SCAN_NEEDED;
897 }
898 return OK;
899
900 case SITE_MGR_OPERATIONAL_MODE_PARAM:
901
902 if(pParam->content.siteMgrDot11OperationalMode < DOT11_B_MODE ||
903 pParam->content.siteMgrDot11OperationalMode > DOT11_G_MODE )
904 return PARAM_VALUE_NOT_VALID;
905
906 pSiteMgr->siteMgrOperationalMode = pParam->content.siteMgrDot11OperationalMode;
907 break;
908
909
910 case SITE_MGR_USE_DRAFT_NUM_PARAM:
911 if(pParam->content.siteMgrUseDraftNum != DRAFT_5_AND_EARLIER &&
912 pParam->content.siteMgrUseDraftNum != DRAFT_6_AND_LATER)
913 return PARAM_VALUE_NOT_VALID;
914
915 if(pSiteMgr->pDesiredParams->siteMgrUseDraftNum != pParam->content.siteMgrUseDraftNum)
916 {
917 pSiteMgr->pDesiredParams->siteMgrUseDraftNum = pParam->content.siteMgrUseDraftNum;
918 return RE_SCAN_NEEDED;
919 }
920 return OK;
921
922 case SITE_MGR_RADIO_BAND_PARAM:
923 if((INT8)pParam->content.siteMgrRadioBand < RADIO_BAND_2_4_GHZ ||
924 (INT8)pParam->content.siteMgrRadioBand > RADIO_BAND_DUAL )
925 return PARAM_VALUE_NOT_VALID;
926
927 pSiteMgr->prevRadioBand = pSiteMgr->radioBand;
928 pSiteMgr->radioBand = pParam->content.siteMgrRadioBand;
929 if(pSiteMgr->prevRadioBand != pSiteMgr->radioBand)
930 siteMgr_bandParamsConfig(pSiteMgr, FALSE);
931
932 break;
933
934 case SITE_MGR_DESIRED_SLOT_TIME_PARAM:
935 if(pParam->content.siteMgrSlotTime != PHY_SLOT_TIME_LONG &&
936 pParam->content.siteMgrSlotTime != PHY_SLOT_TIME_SHORT)
937 return PARAM_VALUE_NOT_VALID;
938
939 if(pSiteMgr->pDesiredParams->siteMgrDesiredSlotTime != pParam->content.siteMgrSlotTime)
940 {
941 if(pSiteMgr->siteMgrOperationalMode == DOT11_G_MODE)
942 {
943 pSiteMgr->pDesiredParams->siteMgrDesiredSlotTime = pParam->content.siteMgrSlotTime;
944 if(!pPrimarySite)
945 whalCtrl_SetSlotTime(pSiteMgr->hHalCtrl, pSiteMgr->pDesiredParams->siteMgrDesiredSlotTime);
946 else if(pPrimarySite->bssType != BSS_INFRASTRUCTURE)
947 whalCtrl_SetSlotTime(pSiteMgr->hHalCtrl, pSiteMgr->pDesiredParams->siteMgrDesiredSlotTime);
948 }
949
950 }
951 return OK;
952
953 case SITE_MGR_BEACON_FILTER_DESIRED_STATE_PARAM:
954 {
955 int desiredStateBeforeChange = pSiteMgr->beaconFilterParams.desiredState;
956
957 /* Set the New Desired User request of Beacon Filter */
958 pSiteMgr->beaconFilterParams.desiredState = pParam->content.siteMgrDesiredBeaconFilterState;
959
960 /* Check if the Desired mode has changed - If not no need to send the MIB to the FW */
961 if ( pSiteMgr->beaconFilterParams.desiredState == desiredStateBeforeChange )
962 {
963 WLAN_REPORT_DEBUG_CONTROL(pSiteMgr->hReport,
964 ("Beacon Filter already %s" , (TRUE == desiredStateBeforeChange)? "ENABLED":"DISABLED" ) );
965 break;
966 }
967
968 WLAN_REPORT_DEBUG_CONTROL(pSiteMgr->hReport,
969 ("\n New Beacon Filter Desired State is : %s pSiteMgr->beaconFilterParams.currentState %s\n" , ( TRUE == (pSiteMgr->beaconFilterParams.desiredState) )?"ENABLED":"DISABLED",( TRUE == (pSiteMgr->beaconFilterParams.currentState) )?"ENABLED":"DISABLED"));
970
971
972 /* Check if the new Desired state is TRUE then Also check the Current State and then if FALSEdo not send the MIB to FW*/
973 if ( (TRUE == pSiteMgr->beaconFilterParams.desiredState ) && (FALSE == pSiteMgr->beaconFilterParams.currentState ))
974 {
975 WLAN_REPORT_DEBUG_CONTROL(pSiteMgr->hReport,
976 ("\n New Beacon Filter Desired State is TRUE But Current State is DISABLED So the MIBwill be sent Later !!!!"));
977
978 }
979 /* In any other cases the User required Beacon Filter Configuration will be sent to FW immediately */
980 else
981 {
982 WLAN_REPORT_DEBUG_CONTROL(pSiteMgr->hReport,
983 ("\n New Sending Beacon Filter Desired State To FW !!!!"));
984
985 whalCtrl_SetBeaconFiltering(pSiteMgr->hHalCtrl, pSiteMgr->beaconFilterParams.desiredState, pSiteMgr->beaconFilterParams.numOfStored);
986 }
987
988
989 }
990
991 break;
992
993 case SITE_MGR_DISASSOCIATE_PARAM:
994 case SITE_MGR_DEAUTHENTICATE_PARAM:
995 if(!pPrimarySite)
996 return OK;
997
998 else { /* Set Junk SSID */
999 pSiteMgr->pDesiredParams->siteMgrDesiredSSID.len = 4;
1000 pSiteMgr->pDesiredParams->siteMgrDesiredSSID.ssidString[0]=1;
1001 pSiteMgr->pDesiredParams->siteMgrDesiredSSID.ssidString[1]=1;
1002 pSiteMgr->pDesiredParams->siteMgrDesiredSSID.ssidString[2]=1;
1003 pSiteMgr->pDesiredParams->siteMgrDesiredSSID.ssidString[3]=1;
1004 return RE_SCAN_NEEDED;
1005 }
1006
1007
1008 case SITE_MGR_BSSID_LIST_SCAN_PARAM:
1009 #if 0
1010 /* TODO - merge fix from WinCE version (and generalize it if time permits) */
1011 /* Must return NOK in each case the scan is not actually performed */
1012 if(!pPrimarySite)
1013 {
1014 WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
1015 ("Not connected to Network => do the BSSID_LIST_SCAN command\n"));
1016 smeSm_startScan(pSiteMgr->hSmeSm);
1017 }
1018
1019 param.paramType = RX_DATA_COUNTERS_PARAM;
1020 rxData_getParam(pSiteMgr->hRxData, ¶m);
1021
1022 /* get current received data frames counter */
1023 currRxPacketsCount = param.content.siteMgrTiWlanCounters.DirectedFramesRecv;
1024
1025 if((pSiteMgr->rxPacketsCount + 1) < currRxPacketsCount)
1026 {
1027 WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
1028 ("Traffic is active now => ignoring the BSSID_LIST_SCAN command\n"));
1029 return NOK;
1030 }
1031 else
1032 {
1033 WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
1034 ("Traffic is not active now => do the BSSID_LIST_SCAN command\n"));
1035 smeSm_startScan(pSiteMgr->hSmeSm);
1036
1037 }
1038 }
1039 #endif
1040 return OK;
1041
1042 case SITE_MGR_LAST_RX_RATE_PARAM:
1043 if (pPrimarySite != NULL)
1044 {
1045 pPrimarySite->rxRate = pParam->content.ctrlDataCurrentBasicRate;
1046 }
1047 break;
1048
1049 case SITE_MGR_CURRENT_CHANNEL_PARAM:
1050 if (!pPrimarySite)
1051 {
1052 return NO_SITE_SELECTED_YET;
1053 }
1054 pPrimarySite->channel = pParam->content.siteMgrCurrentChannel;
1055 break;
1056
1057 case SITE_MGR_CURRENT_SIGNAL_PARAM:
1058 if (!pPrimarySite)
1059 {
1060 return NO_SITE_SELECTED_YET;
1061 }
1062
1063 pPrimarySite->rssi = pParam->content.siteMgrCurrentSignal.rssi;
1064 break;
1065
1066 default:
1067 WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("Set param, Params is not supported, %d\n", pParam->paramType));
1068 return PARAM_NOT_SUPPORTED;
1069 }
1070
1071 return OK;
1072 }
1073
1074 /***********************************************************************
1075 * siteMgr_getParam
1076 ***********************************************************************
1077 DESCRIPTION: Site mgr get param function, called by the following:
1078 - config mgr in order to get a parameter from the OS abstraction layer.
1079 - From inside the dirver
1080
1081 INPUT: hSiteMgr - site mgr handle.
1082 pParam - Pointer to the parameter
1083
1084 OUTPUT:
1085
1086 RETURN: OK on success, NOK otherwise
1087
1088 ************************************************************************/
siteMgr_getParam(TI_HANDLE hSiteMgr,paramInfo_t * pParam)1089 TI_STATUS siteMgr_getParam(TI_HANDLE hSiteMgr,
1090 paramInfo_t *pParam)
1091 {
1092 siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
1093 siteEntry_t *pPrimarySite = pSiteMgr->pSitesMgmtParams->pPrimarySite;
1094 TI_STATUS status = OK;
1095 UINT8 siteEntryIndex;
1096 UINT32 dtimInterval;
1097 UINT32 delta;
1098 whalParamInfo_t whalParam;
1099
1100 switch(pParam->paramType)
1101 {
1102
1103 case SITE_MGR_CONFIGURATION_PARAM:
1104 pParam->content.pSiteMgrConfiguration->Length = sizeof(OS_802_11_CONFIGURATION);
1105 pParam->content.pSiteMgrConfiguration->ATIMWindow = pSiteMgr->pDesiredParams->siteMgrDesiredAtimWindow;
1106 pParam->content.pSiteMgrConfiguration->BeaconPeriod = pSiteMgr->pDesiredParams->siteMgrDesiredBeaconInterval;
1107 pParam->content.pSiteMgrConfiguration->Union.channel =
1108 Chan2Freq(pSiteMgr->pDesiredParams->siteMgrDesiredChannel);
1109 /*pSiteMgr->pDesiredParams->siteMgrFreq2ChannelTable[pSiteMgr->pDesiredParams->siteMgrDesiredChannel];*/
1110
1111 if(pPrimarySite) {
1112 pParam->content.pSiteMgrConfiguration->FHConfig.DwellTime = pPrimarySite->FHParams.dwellTime;
1113 pParam->content.pSiteMgrConfiguration->FHConfig.HopPattern = pPrimarySite->FHParams.hopPattern;
1114 pParam->content.pSiteMgrConfiguration->FHConfig.HopSet = pPrimarySite->FHParams.hopSet;
1115 }
1116 else {
1117 pParam->content.pSiteMgrConfiguration->FHConfig.DwellTime = 0;
1118 pParam->content.pSiteMgrConfiguration->FHConfig.HopPattern = 0;
1119 pParam->content.pSiteMgrConfiguration->FHConfig.HopSet = 0;
1120 }
1121
1122 pParam->content.pSiteMgrConfiguration->FHConfig.Length = sizeof(OS_802_11_CONFIGURATION_FH);
1123 break;
1124
1125 case SITE_MGR_DESIRED_CHANNEL_PARAM:
1126 pParam->content.siteMgrDesiredChannel = pSiteMgr->pDesiredParams->siteMgrDesiredChannel;
1127 break;
1128
1129 case SITE_MGR_DESIRED_BSSID_PARAM:
1130 os_memoryCopy(pSiteMgr->hOs, &pParam->content.siteMgrDesiredBSSID, &pSiteMgr->pDesiredParams->siteMgrDesiredBSSID, sizeof(macAddress_t));
1131 break;
1132
1133 case SITE_MGR_DESIRED_SSID_PARAM:
1134 os_memoryCopy(pSiteMgr->hOs, &pParam->content.siteMgrDesiredSSID, &pSiteMgr->pDesiredParams->siteMgrDesiredSSID, sizeof(ssid_t));
1135 break;
1136
1137 case SITE_MGR_DESIRED_BSS_TYPE_PARAM:
1138 pParam->content.siteMgrDesiredBSSType = pSiteMgr->pDesiredParams->siteMgrDesiredBSSType;
1139 break;
1140
1141 case SITE_MGR_DESIRED_SUPPORTED_RATE_SET_PARAM:
1142 getSupportedRateSet(pSiteMgr, &(pParam->content.siteMgrDesiredSupportedRateSet));
1143 break;
1144
1145 case SITE_MGR_DESIRED_MODULATION_TYPE_PARAM:
1146 pParam->content.siteMgrDesiredModulationType = pSiteMgr->pDesiredParams->siteMgrDesiredModulationType;
1147 break;
1148
1149 case SITE_MGR_DESIRED_BEACON_INTERVAL_PARAM:
1150 pParam->content.siteMgrDesiredBeaconInterval = pSiteMgr->pDesiredParams->siteMgrDesiredBeaconInterval;
1151 break;
1152
1153 case SITE_MGR_DESIRED_PREAMBLE_TYPE_PARAM:
1154 pParam->content.siteMgrDesiredPreambleType = pSiteMgr->pDesiredParams->siteMgrDesiredPreambleType;
1155 break;
1156
1157 case SITE_MGR_CURRENT_RADIO_TYPE_PARAM:
1158 pParam->content.siteMgrRadioType = pSiteMgr->pDesiredParams->siteMgrRadioValues.siteMgr_radioType;
1159 break;
1160
1161 case SITE_MGR_CURRENT_SIGNAL_PARAM:
1162 if (!pPrimarySite)
1163 {
1164 pParam->content.siteMgrCurrentSignal.rssi = 0;
1165 pParam->content.siteMgrCurrentSignal.snr = 0;
1166 return NO_SITE_SELECTED_YET;
1167 }
1168
1169 pParam->content.siteMgrCurrentSignal.rssi = pPrimarySite->rssi;
1170 pParam->content.siteMgrCurrentSignal.snr = pPrimarySite->snr;
1171 break;
1172
1173 case SITE_MGR_POWER_CONSTRAINT_PARAM:
1174 if (!pPrimarySite)
1175 {
1176 pParam->content.powerConstraint = 0;
1177 return NO_SITE_SELECTED_YET;
1178 }
1179 pParam->content.powerConstraint = pPrimarySite->powerConstraint;
1180 break;
1181
1182
1183 case SITE_MGR_DTIM_PERIOD_PARAM:
1184 if (!pPrimarySite)
1185 {
1186 pParam->content.siteMgrDtimPeriod = 0;
1187 return NO_SITE_SELECTED_YET;
1188 }
1189 pParam->content.siteMgrDtimPeriod = pPrimarySite->dtimPeriod;
1190 break;
1191
1192 case SITE_MGR_BEACON_RECV:
1193 if (!pPrimarySite)
1194 {
1195 pParam->content.siteMgrBeaconRecv = FALSE;
1196 return NO_SITE_SELECTED_YET;
1197 }
1198 pParam->content.siteMgrBeaconRecv = pPrimarySite->beaconRecv;
1199 break;
1200
1201
1202 case SITE_MGR_BEACON_INTERVAL_PARAM:
1203 if (!pPrimarySite)
1204 {
1205 pParam->content.beaconInterval = 0;
1206 return NO_SITE_SELECTED_YET;
1207 }
1208 pParam->content.beaconInterval = pPrimarySite->beaconInterval;
1209 break;
1210
1211 case SITE_MGR_AP_TX_POWER_PARAM:
1212 if (!pPrimarySite)
1213 {
1214 pParam->content.APTxPower = 0;
1215 return NO_SITE_SELECTED_YET;
1216 }
1217 pParam->content.APTxPower = pPrimarySite->APTxPower;
1218 break;
1219
1220 case SITE_MGR_SITE_CAPABILITY_PARAM:
1221 if (!pPrimarySite)
1222 {
1223 pParam->content.siteMgrSiteCapability = 0;
1224 return NO_SITE_SELECTED_YET;
1225 }
1226 pParam->content.siteMgrSiteCapability = pPrimarySite->capabilities;
1227 break;
1228
1229 case SITE_MGR_4X_PARAM:
1230 if(!pPrimarySite)
1231 return NO_SITE_SELECTED_YET;
1232
1233 pParam->content.siteMgrFourxParam = pPrimarySite->fourXsupported;
1234 break;
1235
1236 case SITE_MGR_CURRENT_CHANNEL_PARAM:
1237 if (!pPrimarySite)
1238 {
1239 pParam->content.siteMgrCurrentChannel = 0;
1240 return NO_SITE_SELECTED_YET;
1241 }
1242 pParam->content.siteMgrCurrentChannel = pPrimarySite->channel;
1243 break;
1244
1245 case SITE_MGR_CURRENT_SSID_PARAM:
1246 if (!pPrimarySite)
1247 {
1248 os_memoryZero(pSiteMgr->hOs, (void *)pParam->content.siteMgrCurrentSSID.ssidString, MAX_SSID_LEN);
1249 pParam->content.siteMgrCurrentSSID.len = 0;
1250 return NO_SITE_SELECTED_YET;
1251 }
1252 if(pPrimarySite->ssid.len == 0)
1253 WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("siteMgr_getParam: ssid length is zero, while primarySite is selected \n"));
1254 os_memoryCopy(pSiteMgr->hOs, &pParam->content.siteMgrCurrentSSID, &pPrimarySite->ssid, sizeof(ssid_t));
1255 break;
1256
1257
1258 case SITE_MGR_CURRENT_BSS_TYPE_PARAM:
1259 if (!pPrimarySite)
1260 {
1261 pParam->content.siteMgrCurrentBSSType = pSiteMgr->pDesiredParams->siteMgrDesiredBSSType;
1262 WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("Trying to get current BSS Type while no site is selected\n"));
1263
1264 }
1265 else{
1266 pParam->content.siteMgrCurrentBSSType = pPrimarySite->bssType;
1267 }
1268
1269 break;
1270
1271
1272 case SITE_MGR_CURRENT_RATE_PAIR_PARAM:
1273 if (!pPrimarySite)
1274 {
1275 pParam->content.siteMgrCurrentRateMask.basicRateMask = 0;
1276 pParam->content.siteMgrCurrentRateMask.supportedRateMask = 0;
1277 return NO_SITE_SELECTED_YET;
1278 }
1279 pParam->content.siteMgrCurrentRateMask.basicRateMask = pSiteMgr->pDesiredParams->siteMgrMatchedBasicRateMask;
1280 pParam->content.siteMgrCurrentRateMask.supportedRateMask = pSiteMgr->pDesiredParams->siteMgrMatchedSuppRateMask;
1281 WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
1282 ("SITE_MGR: bitmapBasicPrimary= 0x%X,bitMapBasicDesired = 0x%X,bitMapSuppPrimary = 0x%X, bitMapSuppDesired = 0x%X\n",
1283 pPrimarySite->rateMask.basicRateMask,pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.basicRateMask,
1284 pPrimarySite->rateMask.supportedRateMask,pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.supportedRateMask));
1285
1286 break;
1287
1288 case SITE_MGR_CURRENT_MODULATION_TYPE_PARAM:
1289 if (!pPrimarySite)
1290 {
1291 pParam->content.siteMgrCurrentModulationType = DRV_MODULATION_NONE;
1292 return NO_SITE_SELECTED_YET;
1293 }
1294 pParam->content.siteMgrCurrentModulationType = pSiteMgr->chosenModulation;
1295 break;
1296
1297 case SITE_MGR_NEXT_DTIM_TIME_STAMP_PARAM:
1298 if (!pPrimarySite)
1299 {
1300 pParam->content.siteMgrNextDtimTimeStamp = 0;
1301 return NO_SITE_SELECTED_YET;
1302 }
1303 /* Convert TBTT to msec (*1024/1000) */
1304 dtimInterval = (UINT32)pPrimarySite->beaconInterval * 1024 *
1305 (UINT32)pPrimarySite->dtimPeriod / 1000 ;
1306 delta = os_timeStampMs(pSiteMgr->hOs) - pPrimarySite->dtimTimeStamp;
1307 if(delta < dtimInterval)
1308 delta = 0;
1309 pParam->content.siteMgrNextDtimTimeStamp = pPrimarySite->dtimTimeStamp + dtimInterval + delta;
1310 WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
1311 ("Get DTIM - dtimTimeStamp=%d, dtimInterval=%d, delta=%d\n",
1312 pPrimarySite->dtimTimeStamp, dtimInterval, delta));
1313 break;
1314
1315 case SITE_MGR_DESIRED_SLOT_TIME_PARAM:
1316 pParam->content.siteMgrSlotTime = pSiteMgr->pDesiredParams->siteMgrDesiredSlotTime;
1317 break;
1318
1319 case SITE_MGR_CURRENT_SLOT_TIME_PARAM:
1320
1321 if(pSiteMgr->siteMgrOperationalMode == DOT11_G_MODE)
1322 {
1323 if(!pPrimarySite)
1324 pParam->content.siteMgrSlotTime = pSiteMgr->pDesiredParams->siteMgrDesiredSlotTime;
1325 else
1326 pParam->content.siteMgrSlotTime = pPrimarySite->currentSlotTime;
1327 }
1328 else if(pSiteMgr->siteMgrOperationalMode == DOT11_A_MODE)
1329 pParam->content.siteMgrSlotTime = PHY_SLOT_TIME_SHORT;
1330 else
1331 pParam->content.siteMgrSlotTime = PHY_SLOT_TIME_LONG;
1332
1333 break;
1334
1335 case SITE_MGR_BSSID_LIST_PARAM:
1336 if (pParam->paramLength == 0)
1337 {
1338
1339 calculateBssidListSize(pSiteMgr, &pParam->paramLength, FALSE);
1340
1341 return NOK;
1342 }
1343 else
1344 {
1345 status = getBssidList(pSiteMgr, pParam->content.pSiteMgrBssidList, &pParam->paramLength, FALSE);
1346 }
1347 break;
1348
1349 case SITE_MGR_BSSID_FULL_LIST_PARAM:
1350 if (pParam->paramLength == 0)
1351 {
1352
1353 calculateBssidListSize(pSiteMgr, &pParam->paramLength, TRUE);
1354
1355 return NOK;
1356 }
1357 else
1358 {
1359 status = getBssidList(pSiteMgr, pParam->content.pSiteMgrBssidList, &pParam->paramLength, TRUE);
1360 }
1361 break;
1362
1363 case SITE_MGR_LAST_BEACON_BUF_PARAM:
1364 if (pPrimarySite != NULL)
1365 {
1366 if (pPrimarySite->probeRecv)
1367 {
1368 pParam->content.siteMgrLastBeacon.isBeacon = FALSE;
1369 pParam->content.siteMgrLastBeacon.bufLength = pPrimarySite->probeRespLength;
1370 pParam->content.siteMgrLastBeacon.buffer = pPrimarySite->probeRespBuffer;
1371 }
1372 else
1373 {
1374 pParam->content.siteMgrLastBeacon.isBeacon = TRUE;
1375 pParam->content.siteMgrLastBeacon.bufLength = pPrimarySite->beaconLength;
1376 pParam->content.siteMgrLastBeacon.buffer = pPrimarySite->beaconBuffer;
1377 }
1378 }
1379 break;
1380
1381 case SITE_MGR_BEACON_FILTER_DESIRED_STATE_PARAM:
1382 {
1383 if ( NULL != pSiteMgr )
1384 {
1385 pParam->content.siteMgrDesiredBeaconFilterState = pSiteMgr->beaconFilterParams.desiredState;
1386 }
1387 else
1388 {
1389 WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG ,("pSite = NULL ! No info available"));
1390 }
1391 }
1392 break;
1393
1394 case SITE_MGR_GET_SELECTED_BSSID_INFO:
1395 getPrimarySiteDesc(pSiteMgr, pParam->content.pSiteMgrPrimarySiteDesc, FALSE);
1396 break;
1397
1398 case SITE_MGR_PRIMARY_SITE_PARAM:
1399 status = getPrimaryBssid(pSiteMgr, (OS_802_11_BSSID_EX *)pParam->content.pSiteMgrSelectedSiteInfo, &pParam->paramLength);
1400 break;
1401
1402
1403 case SITE_MGR_TI_WLAN_COUNTERS_PARAM:
1404 pParam->paramType = RX_DATA_COUNTERS_PARAM;
1405 rxData_getParam(pSiteMgr->hRxData, pParam);
1406
1407 whalParam.paramType = HAL_CTRL_COUNTERS_PARAM;
1408 whalCtrl_GetParam(pSiteMgr->hHalCtrl, &whalParam);
1409 pParam->content.siteMgrTiWlanCounters.RecvNoBuffer = whalParam.content.halCtrlCounters.RecvNoBuffer;
1410 pParam->content.siteMgrTiWlanCounters.FragmentsRecv = whalParam.content.halCtrlCounters.FragmentsRecv;
1411 pParam->content.siteMgrTiWlanCounters.FrameDuplicates = whalParam.content.halCtrlCounters.FrameDuplicates;
1412 pParam->content.siteMgrTiWlanCounters.FcsErrors = whalParam.content.halCtrlCounters.FcsErrors;
1413 pParam->content.siteMgrTiWlanCounters.RecvError = whalParam.content.halCtrlCounters.RecvError;
1414
1415 pParam->paramType = AUTH_COUNTERS_PARAM;
1416 auth_getParam(pSiteMgr->hAuth, pParam);
1417
1418 pParam->paramType = ASSOC_COUNTERS_PARAM;
1419 assoc_getParam(pSiteMgr->hAssoc, pParam);
1420 pParam->content.siteMgrTiWlanCounters.BeaconsXmit = pSiteMgr->beaconSentCount;
1421 break;
1422
1423 case SITE_MGR_EEPROM_VERSION_PARAM:
1424 os_memoryCopy(pSiteMgr->hOs, &(pParam->content.siteMgrEEpromVersion), &(pSiteMgr->pDesiredParams->siteMgrEEpromVersion), sizeof(e2Version_t));
1425 break;
1426
1427 case SITE_MGR_FIRMWARE_VERSION_PARAM:
1428 os_memoryCopy(pSiteMgr->hOs, &(pParam->content.siteMgrFwVersion), &(pSiteMgr->pDesiredParams->siteMgrFwVersion), FW_VERSION_LEN);
1429 break;
1430
1431 case SITE_MGR_DESIRED_TX_RATE_PARAM:
1432 pParam->content.siteMgrDesiredTxRate = hostToUtilityRate(pSiteMgr->pDesiredParams->siteMgrCurrentDesiredTxRate);
1433 break;
1434
1435 case SITE_MGR_CURRENT_TX_RATE_PARAM:
1436 /* Collect txAttr from control */
1437 { txData_attr_t txAttr;
1438
1439 ctrlData_getTxAttributes(pSiteMgr->hCtrlData, TX_DATA_DATA_MSDU, &txAttr, QOS_AC_BE);
1440
1441 pParam->content.siteMgrCurrentTxRate = hostToUtilityRate( txAttr.Rate );
1442 }
1443 break;
1444
1445 case SITE_MGR_DESIRED_DOT11_MODE_PARAM:
1446 pParam->content.siteMgrDot11Mode = pSiteMgr->pDesiredParams->siteMgrDesiredDot11Mode;
1447 break;
1448
1449 case SITE_MGR_NETWORK_TYPE_IN_USE:
1450 if (pPrimarySite)
1451 { /* Connected - return the current mode */
1452 pParam->content.siteMgrDot11Mode = pSiteMgr->siteMgrOperationalMode;
1453 }
1454 else
1455 { /* Disconnected - return the desired mode */
1456 pParam->content.siteMgrDot11Mode = pSiteMgr->pDesiredParams->siteMgrDesiredDot11Mode;
1457 }
1458 break;
1459
1460
1461 case SITE_MGR_OPERATIONAL_MODE_PARAM:
1462 pParam->content.siteMgrDot11OperationalMode = pSiteMgr->siteMgrOperationalMode;
1463 break;
1464
1465 case SITE_MGR_USE_DRAFT_NUM_PARAM:
1466 pParam->content.siteMgrUseDraftNum = pSiteMgr->pDesiredParams->siteMgrUseDraftNum;
1467 break;
1468
1469 case SITE_MGR_RADIO_BAND_PARAM:
1470 pParam->content.siteMgrRadioBand = pSiteMgr->radioBand;
1471 break;
1472
1473 case SITE_MGR_CURRENT_PREAMBLE_TYPE_PARAM:
1474 if (!pPrimarySite)
1475 return NO_SITE_SELECTED_YET;
1476
1477 pParam->content.siteMgrCurrentPreambleType = pPrimarySite->currentPreambleType;
1478 break;
1479
1480 case SITE_MGR_CURRENT_BSSID_PARAM:
1481 if (pPrimarySite != NULL)
1482 {
1483 os_memoryCopy(pSiteMgr->hOs, (void *)pParam->content.siteMgrDesiredBSSID.addr, (void *)pPrimarySite->bssid.addr, MAC_ADDR_LEN);
1484 }
1485 break;
1486
1487 case SITE_MGR_LAST_RX_RATE_PARAM:
1488 if (pPrimarySite != NULL)
1489 {
1490 pParam->content.ctrlDataCurrentBasicRate = pPrimarySite->rxRate;
1491 }
1492 break;
1493
1494 case SITE_MGR_PREV_SITE_BSSID_PARAM:
1495 if (pSiteMgr->pSitesMgmtParams->pPrevPrimarySite==NULL)
1496 {
1497 return NOK;
1498 }
1499 os_memoryCopy(pSiteMgr->hOs, (void *)pParam->content.siteMgrDesiredBSSID.addr, (void *)pSiteMgr->pSitesMgmtParams->pPrevPrimarySite->bssid.addr, MAC_ADDR_LEN);
1500 break;
1501
1502 case SITE_MGR_PREV_SITE_SSID_PARAM:
1503 if (pSiteMgr->pSitesMgmtParams->pPrevPrimarySite==NULL)
1504 {
1505 return NOK;
1506 }
1507 pParam->content.siteMgrDesiredSSID.len = pSiteMgr->pSitesMgmtParams->pPrevPrimarySite->ssid.len;
1508 os_memoryCopy(pSiteMgr->hOs, (void *)pParam->content.siteMgrDesiredSSID.ssidString, (void *)pSiteMgr->pSitesMgmtParams->pPrevPrimarySite->ssid.ssidString, pSiteMgr->pSitesMgmtParams->pPrevPrimarySite->ssid.len);
1509 break;
1510
1511 case SITE_MGR_PREV_SITE_CHANNEL_PARAM:
1512 if (pSiteMgr->pSitesMgmtParams->pPrevPrimarySite==NULL)
1513 {
1514 return NOK;
1515 }
1516 pParam->content.siteMgrDesiredChannel = pSiteMgr->pSitesMgmtParams->pPrevPrimarySite->channel;
1517 break;
1518
1519 case SITE_MGR_SITE_ENTRY_BY_INDEX:
1520 siteEntryIndex = pParam->content.siteMgrIndexOfDesiredSiteEntry;
1521 if(siteEntryIndex >= MAX_SITES_BG_BAND)
1522 {
1523 return NOK;
1524 }
1525 pParam->content.pSiteMgrDesiredSiteEntry =
1526 (UINT8*)(&(pSiteMgr->pSitesMgmtParams->pCurrentSiteTable->siteTable[siteEntryIndex]));
1527 break;
1528
1529 case SITE_MGR_CUR_NUM_OF_SITES:
1530 pParam->content.siteMgrNumberOfSites = pSiteMgr->pSitesMgmtParams->pCurrentSiteTable->numOfSites;
1531 break;
1532
1533 case SITE_MGR_CURRENT_TSF_TIME_STAMP:
1534 os_memoryCopy(pSiteMgr->hOs, pParam->content.siteMgrCurrentTsfTimeStamp,
1535 pSiteMgr->pSitesMgmtParams->pPrimarySite->tsfTimeStamp,
1536 TIME_STAMP_LEN);
1537 break;
1538
1539 case SITE_MGR_GET_AP_QOS_CAPABILITIES:
1540 if (!pPrimarySite)
1541 {
1542 pParam->content.qosApCapabilities.uQOSFlag = 0;
1543 pParam->content.qosApCapabilities.uAPSDFlag = 0;
1544 return NOT_CONNECTED;
1545 }
1546 pParam->content.qosApCapabilities.uQOSFlag = pPrimarySite->WMESupported;
1547 pParam->content.qosApCapabilities.uAPSDFlag = pPrimarySite->APSDSupport;
1548
1549 break;
1550
1551 default:
1552 {
1553 UINT8* ptr = NULL;
1554 WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("Get param, Params is not supported, %d\n", pParam->paramType));
1555 *ptr=3;
1556 }
1557
1558 return PARAM_NOT_SUPPORTED;
1559 }
1560
1561 return status;
1562 }
1563
1564
1565 /***********************************************************************
1566 * calculateHwGenTxRate
1567 ***********************************************************************
1568 DESCRIPTION: Service routine, which calculates the HW generated frames rate
1569 to be used.
1570
1571 INPUT: basicBitMap - bit map of basic rates
1572 mode - operating mode
1573
1574 OUTPUT:
1575
1576 RETURN: rate
1577
1578 ************************************************************************/
calculateHwGenTxRate(siteMgr_t * pSiteMgr,rate_e * rate)1579 void calculateHwGenTxRate(siteMgr_t *pSiteMgr, rate_e *rate)
1580 {
1581
1582 UINT32 rateBitMap = 0;
1583 modulationType_e modulation = DRV_MODULATION_NONE; /* Not used */
1584 mgmtCtrlTxRateOption_e mgmtCtrlTxRateOption = pSiteMgr->pDesiredParams->siteMgrRegstryDesiredMgmtCtrlTxRateOption;
1585 UINT32 mgmtCtrlDesiredTxRateBitMap = ((0x01) << (pSiteMgr->pDesiredParams->siteMgrRegstryDesiredMgmtCtrlTxRate -1));
1586
1587
1588 /* ratebitmap is the matched basic rate from the STA and AP */
1589 if (pSiteMgr->pSitesMgmtParams->pPrimarySite->channel == SPECIAL_BG_CHANNEL)
1590 {
1591 rateBitMap = (UINT16)getBasicRateMaskForSpecialBGchannel() ;
1592 }
1593 else
1594 {
1595 rateBitMap = pSiteMgr->pDesiredParams->siteMgrMatchedBasicRateMask;
1596 }
1597
1598 /* Check if the user request specific Rate */
1599 if(mgmtCtrlTxRateOption == SPECIFIC_TX_RATE)
1600 {
1601 /* If the required rate is included in the matched basic rate, this specific rate is the only one to use */
1602 if(rateBitMap & mgmtCtrlDesiredTxRateBitMap)
1603 {
1604 rateBitMap = mgmtCtrlDesiredTxRateBitMap;
1605 }
1606 else
1607 {
1608 /* If the specific required Tx Rate is not in the basic rate => Use Max basic rate */
1609 mgmtCtrlTxRateOption = MAX_BASIC_TX_RATE;
1610 }
1611 }
1612
1613 /* Now calculate HW Tx rate according to the rate bitmap */
1614 if(mgmtCtrlTxRateOption == MAX_BASIC_TX_RATE)
1615 getMaxRate(rateBitMap,rate,&modulation,pSiteMgr->siteMgrOperationalMode);
1616 else
1617 {
1618 /* If we are here , means: The mgmtCtrlTxRateOption is either MIN_BASIC_TX_RATE or SPECIFIC_TX_RATE. */
1619 getMinRate(rateBitMap,rate,&modulation,pSiteMgr->siteMgrOperationalMode);
1620
1621 }
1622 }
1623
1624
1625
1626
1627 /***********************************************************************
1628 * siteMgr_join
1629 ***********************************************************************
1630 DESCRIPTION: Called by the connection state machine in order to join a BSS.
1631 - If the BSS is infrastructure, sets a NULL data template to the HAL
1632 - If the BSS is IBSS, sets a probe response & beacon template to the HAL
1633 Call the HAL with the join parameters
1634
1635
1636 INPUT: hSiteMgr - site mgr handle.
1637 JoinCompleteCB - join command complete callback function ptr
1638 CB_handle - handle to pass to callback function
1639
1640 OUTPUT:
1641
1642 RETURN: OK on success, NOK otherwise
1643
1644 ************************************************************************/
siteMgr_join(TI_HANDLE hSiteMgr)1645 TI_STATUS siteMgr_join(TI_HANDLE hSiteMgr)
1646 {
1647 siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
1648 siteEntry_t *pPrimarySite = pSiteMgr->pSitesMgmtParams->pPrimarySite;
1649 rate_e rate;
1650 paramInfoPartial_t param;
1651
1652 if (pPrimarySite == NULL)
1653 {
1654 WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("Join BSS, Primary Site is NULL\n"));
1655 return OK;
1656 }
1657
1658 /* Configure the system according to parameters of Primary Site */
1659 systemConfig(pSiteMgr);
1660
1661 joinParams.bssType = pPrimarySite->bssType;
1662 joinParams.beaconInterval = pPrimarySite->beaconInterval;
1663 joinParams.dtimInterval = pPrimarySite->dtimPeriod;
1664 joinParams.pBSSID = (UINT8 *)&(pPrimarySite->bssid.addr);
1665 joinParams.pSSID = (UINT8 *)&(pPrimarySite->ssid.ssidString);
1666 joinParams.ssidLength = pPrimarySite->ssid.len;
1667
1668 joinParams.channel = pPrimarySite->channel;
1669
1670 if (joinParams.channel == SPECIAL_BG_CHANNEL)
1671 {
1672 joinParams.basicRateSet = (UINT16)getBasicRateMaskForSpecialBGchannel() ;
1673 joinParams.supportedRateSet = (UINT16)getSupportedRateMaskForSpecialBGchannel() ;
1674 }
1675 else /* != SPECIAL_BG_CHANNEL */
1676 {
1677 joinParams.basicRateSet = (UINT16)pSiteMgr->pDesiredParams->siteMgrMatchedBasicRateMask;
1678 joinParams.supportedRateSet = (UINT16)pSiteMgr->pDesiredParams->siteMgrMatchedSuppRateMask;
1679 }
1680 calculateHwGenTxRate(pSiteMgr, &rate);
1681 joinParams.hwGenCtrlTxRate = rate;
1682
1683 param.paramType = CTRL_DATA_CURRENT_PREAMBLE_TYPE_PARAM;
1684 ctrlData_getParamPartial(pSiteMgr->hCtrlData, ¶m);
1685 joinParams.preamble = param.content.ctrlDataCurrentPreambleType;
1686 /*set the preamble before the join*/
1687 whalCtrl_SetPreamble(pSiteMgr->hHalCtrl, joinParams.preamble);
1688
1689
1690
1691 /*
1692 * Set the radio band and the HW management Tx rate according to operational mode.
1693 * The HW management frames includes Beacon and Probe-Response (in IBSS).
1694 */
1695 if(pSiteMgr->siteMgrOperationalMode == DOT11_A_MODE)
1696 {
1697 joinParams.radioBand = RADIO_BAND_5_0_GHZ;
1698 joinParams.hwGenMgmtTxRate = DRV_RATE_6M;
1699 }
1700 else
1701 {
1702 joinParams.radioBand = RADIO_BAND_2_4_GHZ;
1703 joinParams.hwGenMgmtTxRate = DRV_RATE_2M;
1704 }
1705
1706 /* Now, Set templates to the HAL */
1707 if (pPrimarySite->bssType == BSS_INDEPENDENT)
1708 {
1709 templateStruct.pTemplate = (UINT8 *)&probeRspTemplate;
1710 templateStruct.templateType = PROBE_RESPONSE_TEMPLATE;
1711 buildProbeRspTemplate(pSiteMgr, &templateStruct);
1712 whalCtrl_SetTemplate(pSiteMgr->hHalCtrl, &templateStruct);
1713
1714 /* We don't have to build a beacon template, because it is equal to probe response,
1715 we only have to change the frame sup type */
1716 probeRspTemplate.hdr.fc = ENDIAN_HANDLE_WORD(DOT11_FC_BEACON);
1717 templateStruct.templateType = BEACON_TEMPLATE;
1718 whalCtrl_SetTemplate(pSiteMgr->hHalCtrl, &templateStruct);
1719 }
1720 else
1721 {
1722 templateStruct.pTemplate = (UINT8 *)&nullDataTemplate;
1723 templateStruct.templateType = NULL_DATA_TEMPLATE;
1724 buildNullTemplate(pSiteMgr, &templateStruct);
1725 whalCtrl_SetTemplate(pSiteMgr->hHalCtrl, &templateStruct);
1726
1727 /* Send PsPoll template to HAL */
1728 templateStruct.pTemplate = (UINT8 *)&psPollTemplate;
1729 templateStruct.templateType = PS_POLL_TEMPLATE;
1730 buildPsPollTemplate(pSiteMgr, &templateStruct);
1731 whalCtrl_SetTemplate(pSiteMgr->hHalCtrl, &templateStruct);
1732
1733 /* Set QOS Null data template to the firmware.
1734 Note: the AC to use with this template may change in QoS-manager. */
1735 templateStruct.pTemplate = (UINT8 *)&QosNullDataTemplate;
1736 templateStruct.templateType = QOS_NULL_DATA_TEMPLATE;
1737 buildQosNullDataTemplate(pSiteMgr, &templateStruct, 0);
1738 whalCtrl_SetTemplate(pSiteMgr->hHalCtrl, &templateStruct);
1739 }
1740
1741 /* Reset the Tx Power Control adjustment in RegulatoryDomain */
1742 siteMgr_setTemporaryTxPower(pSiteMgr, FALSE);
1743
1744 /*
1745 clear the beacon receive flag to indicates when receive a beacon after the join command.
1746 need for PowerMgr_startPS() - must be called only after join command and then only after
1747 receiving beacon of the primary site!
1748 */
1749 pPrimarySite->beaconReceiveAfterJoin = FALSE;
1750
1751 /* Stop Tx till geting Join Event complete */
1752 txData_disableTransmission(pSiteMgr->hTxData, DISABLE_IMMEDIATELY);
1753
1754 /* This is the forbidden period to enable the current state from the cli, even if desired state is TRUE */
1755 /* Also This is set to FALSE since the First Beaqcin shall be received for the Power Manager */
1756 pSiteMgr->beaconFilterParams.currentState = FALSE;
1757 whalCtrl_SetBeaconFiltering(pSiteMgr->hHalCtrl, FALSE, pSiteMgr->beaconFilterParams.numOfStored);
1758
1759 WLAN_REPORT_INFORMATION(pSiteMgr->hReport , SITE_MGR_MODULE_LOG , ("-- Beacon Filter Active Mode Disable Beacon Filtering !!! --\n"));
1760
1761 return (TI_STATUS)whalCtrl_JoinBss (((siteMgr_t *)hSiteMgr)->hHalCtrl, &joinParams);
1762 }
1763
1764 /***********************************************************************
1765 * siteMgr_forceInfraJoin
1766 ***********************************************************************
1767 DESCRIPTION: Called by the connection state machine in order to join a BSS.
1768 - If the BSS is infrastructure, sets a NULL data template to the HAL
1769 - If the BSS is IBSS, sets a probe response & beacon template to the HAL
1770 Call the HAL with the join parameters
1771
1772
1773 INPUT: hSiteMgr - site mgr handle.
1774 JoinCompleteCB - join command complete callback function ptr
1775 CB_handle - handle to pass to callback function
1776
1777 OUTPUT:
1778
1779 RETURN: OK on success, NOK otherwise
1780
1781 ************************************************************************/
siteMgr_forceInfraJoin(TI_HANDLE hSiteMgr)1782 TI_STATUS siteMgr_forceInfraJoin(TI_HANDLE hSiteMgr)
1783 {
1784 siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
1785 whalCtrl_joinBss_t joinParams;
1786 UINT8 junkBSSID[MAC_ADDR_LEN] = {0xAA,0xAA,0xAA,0xAA,0xAA,0xAA};
1787 UINT8 junkSSID[1] = {0x01};
1788
1789 WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("Force INFRA Join\n"));
1790
1791 joinParams.bssType = BSS_INFRASTRUCTURE;
1792 joinParams.beaconInterval = 200;
1793 joinParams.dtimInterval = 3;
1794 joinParams.pBSSID = (UINT8 *)junkBSSID;
1795 joinParams.pSSID = (UINT8 *)junkSSID;
1796 joinParams.ssidLength = 1;
1797
1798 joinParams.channel = 11;
1799
1800 joinParams.basicRateSet = (UINT16)pSiteMgr->pDesiredParams->siteMgrMatchedBasicRateMask;
1801 joinParams.supportedRateSet = (UINT16)pSiteMgr->pDesiredParams->siteMgrMatchedSuppRateMask;
1802
1803 joinParams.hwGenCtrlTxRate = DRV_RATE_2M;
1804 joinParams.hwGenMgmtTxRate = DRV_RATE_2M;
1805 joinParams.preamble = PREAMBLE_LONG;
1806
1807 if(pSiteMgr->siteMgrOperationalMode == DOT11_A_MODE)
1808 joinParams.radioBand = RADIO_BAND_5_0_GHZ;
1809 else
1810 joinParams.radioBand = RADIO_BAND_2_4_GHZ;
1811
1812 /* Stop Tx till geting Join Event complete */
1813 txData_disableTransmission(pSiteMgr->hTxData, DISABLE_IMMEDIATELY);
1814 return (TI_STATUS)whalCtrl_JoinBss (((siteMgr_t *)hSiteMgr)->hHalCtrl, &joinParams);
1815 }
1816
1817 /***********************************************************************
1818 * siteMgr_disJoin
1819 ***********************************************************************
1820 DESCRIPTION: Called by the connection state machine in order to dis join a BSS.
1821
1822
1823 INPUT: hSiteMgr - site mgr handle.
1824
1825 OUTPUT:
1826
1827 RETURN: OK on success, NOK otherwise
1828
1829 ************************************************************************/
siteMgr_disJoin(TI_HANDLE hSiteMgr)1830 TI_STATUS siteMgr_disJoin(TI_HANDLE hSiteMgr)
1831 {
1832 #if 0
1833 siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
1834 whalCtrl_joinBss_t joinParams;
1835 macAddress_t dummyMac = {0xDE, 0xAD, 0xBE, 0xEF, 0xDE, 0xAD};
1836 ssid_t dummySsid;
1837
1838 joinParams.bssType = BSS_INFRASTRUCTURE;
1839 joinParams.beaconInterval = SITE_MGR_BEACON_INTERVAL_DEF;
1840 joinParams.dtimInterval = 1;
1841 joinParams.channel = SITE_MGR_CHANNEL_DEF;
1842
1843 joinParams.pBSSID = (UINT8 *)&(dummyMac.addr);
1844
1845 dummySsid.len = 2;
1846 os_memoryCopy(pSiteMgr->hOs, dummySsid.ssidString, "TI_WLAN", 7);
1847 joinParams.pSSID = (UINT8 *)&(dummySsid.ssidString);
1848 joinParams.ssidLength = dummySsid.len;
1849
1850 joinParams.basicRateSet = buildRatesBitMap(pSiteMgr, SITE_MGR_DEF_RATE_SET_MAX_BASIC_DEF);
1851 joinParams.supportedRateSet = buildRatesBitMap(pSiteMgr, SITE_MGR_DEF_RATE_SET_MAX_ACTIVE_DEF);
1852
1853 return whalCtrl_JoinBss (((siteMgr_t *)hSiteMgr)->hHalCtrl, &joinParams);
1854 #else
1855 return OK;
1856 #endif
1857 }
1858
1859 /***********************************************************************
1860 * siteMgr_removeSelfSite
1861 ***********************************************************************
1862 DESCRIPTION: Called by the Self connection state machine in order to remove the self site from the site table.
1863 Remove the site entry form the table and reset the primary site pointer
1864
1865
1866 INPUT: hSiteMgr - site mgr handle.
1867
1868 OUTPUT:
1869
1870 RETURN: OK on success, NOK otherwise
1871
1872 ************************************************************************/
siteMgr_removeSelfSite(TI_HANDLE hSiteMgr)1873 TI_STATUS siteMgr_removeSelfSite(TI_HANDLE hSiteMgr)
1874 {
1875 siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
1876 siteTablesParams_t *currTable = pSiteMgr->pSitesMgmtParams->pCurrentSiteTable;
1877
1878 if(pSiteMgr->pSitesMgmtParams->pPrimarySite == NULL)
1879 {
1880 WLAN_REPORT_WARNING(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("Remove self site Failure, pointer is NULL\n\n"));
1881 return OK;
1882 }
1883
1884 if(pSiteMgr->pSitesMgmtParams->pPrimarySite->siteType != SITE_SELF)
1885 {
1886 WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("Remove self site Failure, site is not self\n\n"));
1887 return OK;
1888 }
1889
1890 removeSiteEntry(pSiteMgr, currTable, pSiteMgr->pSitesMgmtParams->pPrimarySite);
1891 pSiteMgr->pSitesMgmtParams->pPrimarySite = NULL;
1892
1893 return OK;
1894 }
1895
1896 /***********************************************************************
1897 * siteMgr_updateSite
1898 ***********************************************************************
1899 DESCRIPTION: Called by the MLME parser upon receiving a beacon or probe response.
1900 Performs the following:
1901 - Insert the site entry into the site hash table
1902 - Update the site information in the site table
1903 - If the site is the primary site, it handles the PBCC algorithm if needed
1904 - If the site is NULL (means it is the first frame received from this site)
1905 we update the site type to be regular
1906 - If the site type is self, we inform the self connection SM
1907 that another station joined the network we created
1908
1909
1910 INPUT: hSiteMgr - site mgr handle.
1911 bssid - BSSID received
1912 pFrameInfo - Frame content after the parsing
1913 rxChannel - The channel on which frame was received
1914 band - Band on which frame was received
1915 measuring - Determines whether the beacon or probe response
1916 has been received while a beacon measurement
1917 took place
1918
1919 OUTPUT:
1920
1921 RETURN: OK on success, NOK otherwise
1922
1923 ************************************************************************/
siteMgr_updateSite(TI_HANDLE hSiteMgr,macAddress_t * bssid,mlmeFrameInfo_t * pFrameInfo,UINT8 rxChannel,radioBand_e band,BOOL measuring)1924 TI_STATUS siteMgr_updateSite(TI_HANDLE hSiteMgr,
1925 macAddress_t *bssid,
1926 mlmeFrameInfo_t *pFrameInfo,
1927 UINT8 rxChannel,
1928 radioBand_e band,
1929 BOOL measuring)
1930 {
1931 siteEntry_t *pSite;
1932 siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
1933 paramInfo_t param;
1934
1935
1936 /* The following is not required, since the scanCncn is responsible to check
1937 the channels validity before scanning.
1938 The problem it caused was that when 802.11d is enabled,
1939 channels that are valid for Passive only, will not be updated.*/
1940 /*if (isChannelSupprted(pSiteMgr->hRegulatoryDomain , rxChannel) == FALSE)
1941 {
1942 WLAN_REPORT_WARNING(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
1943 ("Channel ERROR - try to register a site that its channel (=%d) isn't in the regulatory domain.\n\
1944 registration ABORTED!!!",
1945 rxChannel));
1946 return NOK;
1947 }*/
1948
1949
1950 pSite = findAndInsertSiteEntry(pSiteMgr, bssid, band);
1951
1952
1953
1954 if (pSite == NULL)
1955 {
1956 WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("Site Update failure, table is full, bssid: %X-%X-%X-%X-%X-%X\n", bssid->addr[0], bssid->addr[1], bssid->addr[2], bssid->addr[3], bssid->addr[4], bssid->addr[5]));
1957 return OK;
1958 }
1959
1960 updateSiteInfo(pSiteMgr, pFrameInfo, pSite, rxChannel);
1961
1962 if (measuring != FALSE)
1963 {
1964 pSite->detectedWhileMeasuring = TRUE;
1965 }
1966
1967 switch(pSite->siteType)
1968 {
1969 case SITE_PRIMARY:
1970 WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_UPDATE_MODULE_LOG, ("PRIMARY site updated, bssid: %X-%X-%X-%X-%X-%X\n\n", bssid->addr[0], bssid->addr[1], bssid->addr[2], bssid->addr[3], bssid->addr[4], bssid->addr[5]));
1971 if (pSiteMgr->pSitesMgmtParams->pPrimarySite == NULL)
1972 {
1973 WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("siteMgr_updateSite: Primary Site Is NULL\n"));
1974 pSite->siteType = SITE_REGULAR;
1975 break;
1976 }
1977 /* Now, if the following is TRUE we perform the PBCC algorithm: */
1978 /* If the BSS type is infrastructure, &&
1979 The chosen modulation is PBCC &&
1980 The beacon modulation is not NONE &&
1981 The current data modulation is different than the beacon modulation. */
1982 if ((pSite->bssType == BSS_INFRASTRUCTURE) &&
1983 (pSiteMgr->chosenModulation == DRV_MODULATION_PBCC) &&
1984 (pSite->beaconModulation != DRV_MODULATION_NONE) &&
1985 (pSiteMgr->currentDataModulation != pSite->beaconModulation))
1986 {
1987 pSiteMgr->currentDataModulation = pSite->beaconModulation;
1988 pbccAlgorithm(pSiteMgr);
1989 }
1990
1991 /* Now handle the slot time, first check if the slot time changed since the last
1992 setting to the HAL ,and if yes set the new value */
1993 if((pSiteMgr->siteMgrOperationalMode == DOT11_G_MODE) &&
1994 (pSite->bssType == BSS_INFRASTRUCTURE))
1995 {
1996 if (pSite->currentSlotTime != pSite->newSlotTime)
1997 {
1998 pSite->currentSlotTime = pSite->newSlotTime;
1999 whalCtrl_SetSlotTime(pSiteMgr->hHalCtrl, pSite->currentSlotTime);
2000 }
2001 }
2002
2003 /* Now handle the current protection status */
2004 if((pSiteMgr->siteMgrOperationalMode == DOT11_G_MODE) &&
2005 (pSite->bssType == BSS_INFRASTRUCTURE))
2006 {
2007 param.paramType = CTRL_DATA_CURRENT_PROTECTION_STATUS_PARAM;
2008 param.content.ctrlDataProtectionEnabled = pSite->useProtection;
2009 ctrlData_setParam(pSiteMgr->hCtrlData, ¶m);
2010 }
2011
2012 /* Now handle the current preamble type,
2013 if desired preamble type is long, the ctrl data param should not be changed */
2014 if((pSiteMgr->siteMgrOperationalMode == DOT11_G_MODE) &&
2015 (pSite->bssType == BSS_INFRASTRUCTURE) &&
2016 (pSiteMgr->pDesiredParams->siteMgrDesiredPreambleType != PREAMBLE_LONG))
2017 {
2018 param.paramType = CTRL_DATA_CURRENT_PREAMBLE_TYPE_PARAM;
2019 if((pSite->preambleAssRspCap == PREAMBLE_LONG) ||
2020 (pSite->barkerPreambleType == PREAMBLE_LONG))
2021 {
2022 param.content.ctrlDataCurrentPreambleType = PREAMBLE_LONG;
2023 }
2024 else
2025 param.content.ctrlDataCurrentPreambleType = PREAMBLE_SHORT;
2026
2027 ctrlData_setParam(pSiteMgr->hCtrlData, ¶m);
2028
2029 }
2030
2031 /*
2032 * NOTE: THIS MUST BE AFTER SETTING PREAMBLE TYPE
2033 */
2034 if (pSiteMgr->chosenModulation != DRV_MODULATION_PBCC)
2035 {
2036 if (pSiteMgr->pDesiredParams->siteMgrCurrentDesiredTxRate == DRV_RATE_AUTO)
2037 {
2038 param.paramType = CTRL_DATA_RATE_CONTROL_ENABLE_PARAM;
2039 param.content.ctrlDataRateControlEnable = TRUE;
2040 ctrlData_setParam(pSiteMgr->hCtrlData, ¶m);
2041 }
2042 else
2043 {
2044 param.paramType = CTRL_DATA_RATE_CONTROL_ENABLE_PARAM;
2045 param.content.ctrlDataRateControlEnable = FALSE;
2046 ctrlData_setParam(pSiteMgr->hCtrlData, ¶m);
2047 }
2048
2049 }
2050 break;
2051
2052 case SITE_NULL:
2053 pSite->siteType = SITE_REGULAR;
2054 WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_UPDATE_MODULE_LOG, ("REGULAR site added, bssid: %X-%X-%X-%X-%X-%X\n\n", bssid->addr[0], bssid->addr[1], bssid->addr[2], bssid->addr[3], bssid->addr[4], bssid->addr[5]));
2055 break;
2056
2057 case SITE_SELF:
2058 pSite->siteType = SITE_PRIMARY;
2059 WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("SELF ----> PRIMARY site , bssid: %X-%X-%X-%X-%X-%X\n\n", bssid->addr[0], bssid->addr[1], bssid->addr[2], bssid->addr[3], bssid->addr[4], bssid->addr[5]));
2060 conn_ibssStaJoined(pSiteMgr->hConn);
2061 break;
2062
2063 case SITE_REGULAR:
2064 WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_UPDATE_MODULE_LOG, ("REGULAR site updated, bssid: %X-%X-%X-%X-%X-%X\n\n", bssid->addr[0], bssid->addr[1], bssid->addr[2], bssid->addr[3], bssid->addr[4], bssid->addr[5]));
2065 break;
2066
2067 default:
2068 WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("Setting site type failure, bssid: %X-%X-%X-%X-%X-%X\n\n", bssid->addr[0], bssid->addr[1], bssid->addr[2], bssid->addr[3], bssid->addr[4], bssid->addr[5]));
2069 break;
2070 }
2071
2072 return OK;
2073 }
2074
2075 /***********************************************************************
2076 * siteMgr_start
2077 ***********************************************************************
2078 DESCRIPTION: Called by the SME SM in order to start the aging timer
2079
2080
2081 INPUT: hSiteMgr - site mgr handle.
2082
2083 OUTPUT:
2084
2085 RETURN: OK on success, NOK otherwise
2086
2087 ************************************************************************/
siteMgr_start(TI_HANDLE hSiteMgr)2088 TI_STATUS siteMgr_start(TI_HANDLE hSiteMgr)
2089 {
2090 siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
2091
2092 /* update timestamp each time aging started (needed for quiet scan) */
2093 if(pSiteMgr->pSitesMgmtParams->pPrimarySite)
2094 pSiteMgr->pSitesMgmtParams->pPrimarySite->localTimeStamp = os_timeStampMs(pSiteMgr->hOs);
2095
2096 return OK;
2097 }
2098
2099
2100 /***********************************************************************
2101 * siteMgr_stop
2102 ***********************************************************************
2103 DESCRIPTION: Called by the SME SM in order to stop site mgr timers
2104
2105
2106 INPUT: hSiteMgr - site mgr handle.
2107
2108 OUTPUT:
2109
2110 RETURN: OK on success, NOK otherwise
2111
2112 ************************************************************************/
siteMgr_stop(TI_HANDLE hSiteMgr)2113 TI_STATUS siteMgr_stop(TI_HANDLE hSiteMgr)
2114 {
2115
2116 return OK;
2117 }
2118
2119 /***********************************************************************
2120 * siteMgr_CheckRxSignalValidity
2121 ***********************************************************************
2122 DESCRIPTION: Called by the mlme_parserRecv when receiving managment frame
2123 Find the ste in the site table and validate that the
2124 RSSI of that site signal is not lower then -80DB + not lower
2125 then the exising site RSSI
2126
2127
2128 INPUT: hSiteMgr - site mgr handle.
2129 rxLevel - Rx level the frame received in
2130 bssid - BSSID of the frame
2131
2132 OUTPUT:
2133
2134 RETURN: OK / NOK
2135
2136 ************************************************************************/
siteMgr_CheckRxSignalValidity(TI_HANDLE hSiteMgr,INT8 rxLevel,UINT8 channel,macAddress_t * bssid)2137 TI_STATUS siteMgr_CheckRxSignalValidity(TI_HANDLE hSiteMgr,
2138 INT8 rxLevel,
2139 UINT8 channel,
2140 macAddress_t *bssid)
2141 {
2142 siteEntry_t *pSite;
2143 siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
2144
2145 pSite = NULL;
2146 pSite = findSiteEntry(pSiteMgr, bssid);
2147
2148 if (pSite != NULL)
2149 {
2150 if ((channel != pSite->channel) &&
2151 (rxLevel < pSite->rssi))
2152 { /* Ignore wrong packets with lower RSSI that were detect as
2153 ripples from different channels */
2154 WLAN_REPORT_WARNING(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
2155 ("siteMgr_CheckRxSignalValidity:Rx RSSI =%d, on channel=%d, is lower then given RSSI =%d on channel=%d, dropping it.\n",
2156 rxLevel, channel, pSite->rssi, pSite->channel));
2157 return NOK;
2158 }
2159 }
2160 return OK;
2161 }
2162
2163 /***********************************************************************
2164 * siteMgr_updateRxSignal
2165 ***********************************************************************
2166 DESCRIPTION: Called by the Rx data when receiving a frae in the RX
2167 Find the ste in the site table and updates the SNR and RSSI
2168
2169
2170 INPUT: hSiteMgr - site mgr handle.
2171 snr - SNR the frame received in
2172 rxLevel - Rx level the frame received in
2173 bssid - BSSID of the frame
2174
2175 OUTPUT:
2176
2177 RETURN: OK on success, NOK otherwise
2178
2179 ************************************************************************/
siteMgr_updateRxSignal(TI_HANDLE hSiteMgr,UINT8 snr,INT8 rxLevel,rate_e rate,macAddress_t * bssid,BOOL dataMsdu)2180 TI_STATUS siteMgr_updateRxSignal(TI_HANDLE hSiteMgr,
2181 UINT8 snr,
2182 INT8 rxLevel,
2183 rate_e rate,
2184 macAddress_t *bssid,
2185 BOOL dataMsdu)
2186 {
2187 siteEntry_t *pSite;
2188 siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
2189
2190 pSite = findSiteEntry(pSiteMgr, bssid);
2191
2192 if (pSite != NULL)
2193 {
2194 pSite->localTimeStamp = os_timeStampMs(pSiteMgr->hOs);
2195
2196 pSite->snr = snr;
2197
2198 /* We check the rate just for finding error case */
2199 switch(rate)
2200 {
2201 case DRV_RATE_1M:
2202 case DRV_RATE_2M:
2203 case DRV_RATE_5_5M:
2204 case DRV_RATE_11M:
2205 case DRV_RATE_22M:
2206 case DRV_RATE_6M:
2207 case DRV_RATE_9M:
2208 case DRV_RATE_12M:
2209 case DRV_RATE_18M:
2210 case DRV_RATE_24M:
2211 case DRV_RATE_36M:
2212 case DRV_RATE_48M:
2213 case DRV_RATE_54M:
2214 pSite->rxRate = rate;
2215 break;
2216 default:
2217 pSite->rxRate = (rate_e)0;
2218 WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
2219 ("siteMgr_updateRxSignal:Rx Rate is GARBAGE!\nRx Rate = %d\n", rate));
2220 break;
2221 }
2222 /* Is this is not a primary site, update rssi;
2223 For the Primary site, we store average RSSI that is counted and updated from Current BSS module */
2224 if (pSite->siteType != SITE_PRIMARY)
2225 {
2226 pSite->rssi = (INT8)rxLevel;
2227 }
2228 }
2229
2230 return OK;
2231 }
2232
2233
2234 /***********************************************************************
2235 * siteMgr_updatePrimarySiteFailStatus
2236 ***********************************************************************
2237 DESCRIPTION: Called by the SME SM when the connection with the primary site fails
2238 If the primary site is NULL, return.
2239
2240
2241 INPUT: hSiteMgr - site mgr handle.
2242 bRemoveSite - Whether to remove the site
2243
2244 OUTPUT:
2245
2246 RETURN: OK on success, NOK otherwise
2247
2248 ************************************************************************/
siteMgr_updatePrimarySiteFailStatus(TI_HANDLE hSiteMgr,BOOL bRemoveSite)2249 TI_STATUS siteMgr_updatePrimarySiteFailStatus(TI_HANDLE hSiteMgr,
2250 BOOL bRemoveSite)
2251 {
2252 siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
2253 siteTablesParams_t *currTable = pSiteMgr->pSitesMgmtParams->pCurrentSiteTable;
2254
2255 if (pSiteMgr->pSitesMgmtParams->pPrimarySite == NULL)
2256 return OK;
2257
2258 WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
2259 (" SITE MGR: bRemoveSite = %d \n", bRemoveSite));
2260
2261 if (bRemoveSite)
2262 {
2263 removeSiteEntry(pSiteMgr, currTable, pSiteMgr->pSitesMgmtParams->pPrimarySite);
2264 pSiteMgr->pSitesMgmtParams->pPrimarySite = NULL;
2265 }
2266 else /* Currently never used */
2267 {
2268 pSiteMgr->pSitesMgmtParams->pPrimarySite->failStatus = STATUS_UNSPECIFIED;
2269 pSiteMgr->pSitesMgmtParams->pPrimarySite->attemptsNumber++;
2270 pSiteMgr->pSitesMgmtParams->pPrimarySite->attemptsNumber &= 0x0F;
2271 }
2272
2273 return OK;
2274 }
2275
2276
2277
2278 /***********************************************************************
2279 * siteMgr_resetEventStatisticsHistory
2280 ***********************************************************************
2281 DESCRIPTION: Called by the SME SM when successing in establishing a connection with the primary site
2282 If thr primary site is NULL, return.
2283 Otherwise, reset the site rssi level
2284
2285 INPUT: hSiteMgr - site mgr handle.
2286
2287 OUTPUT:
2288
2289 RETURN: OK on success, NOK otherwise
2290
2291 ************************************************************************/
siteMgr_resetEventStatisticsHistory(TI_HANDLE hSiteMgr)2292 TI_STATUS siteMgr_resetEventStatisticsHistory(TI_HANDLE hSiteMgr)
2293 {
2294 siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
2295
2296 if (pSiteMgr->pSitesMgmtParams->pPrimarySite == NULL)
2297 {
2298 WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("siteMgr_resetPrimarySiteRssiPerLevelBeaconMissed: Primary Site Is NULL\n"));
2299 return OK;
2300 }
2301
2302 return OK;
2303 }
2304
2305
2306 /***********************************************************************
2307 * siteMgr_resetPrimarySiteAttemptsNumber
2308 ***********************************************************************
2309 DESCRIPTION: Called by the SME SM when successing in establishing a connection with the primary site
2310 If thr primary site is NULL, return.
2311 Otherwise, reset the site attemptsNumber counter.
2312
2313
2314 INPUT: hSiteMgr - site mgr handle.
2315
2316 OUTPUT:
2317
2318 RETURN: OK on success, NOK otherwise
2319
2320 ************************************************************************/
siteMgr_resetPrimarySiteAttemptsNumber(TI_HANDLE hSiteMgr)2321 TI_STATUS siteMgr_resetPrimarySiteAttemptsNumber(TI_HANDLE hSiteMgr)
2322 {
2323 siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
2324
2325 if (pSiteMgr->pSitesMgmtParams->pPrimarySite == NULL)
2326 {
2327 WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("siteMgr_resetPrimarySiteAttemptsNumber: Primary Site Is NULL\n"));
2328 return OK;
2329 }
2330 pSiteMgr->pSitesMgmtParams->pPrimarySite->attemptsNumber = 0;
2331
2332 return OK;
2333 }
2334
2335 /***********************************************************************
2336 * siteMgr_resetPrevPrimarySiteRssi
2337 ***********************************************************************
2338 DESCRIPTION: Called by the SME SM when successing in establishing a connection with the primary site
2339 If thr primary site is NULL, return.
2340 Otherwise, reset the site attemptsNumber counter.
2341
2342
2343 INPUT: hSiteMgr - site mgr handle.
2344
2345 OUTPUT:
2346
2347 RETURN: OK on success, NOK otherwise
2348
2349 ************************************************************************/
siteMgr_resetPrevPrimarySiteRssi(TI_HANDLE hSiteMgr)2350 TI_STATUS siteMgr_resetPrevPrimarySiteRssi(TI_HANDLE hSiteMgr)
2351 {
2352 siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
2353
2354 if (pSiteMgr->pSitesMgmtParams->pPrevPrimarySite == NULL)
2355 {
2356 WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
2357 ("Previous Primary Site Is NULL\n"));
2358 return OK;
2359 }
2360
2361 WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
2362 ("Resetting previous primary site RSSI\n"));
2363 /*
2364 pSiteMgr->pSitesMgmtParams->pPrevPrimarySite->rssi = 0;
2365 pSiteMgr->pSitesMgmtParams->pPrevPrimarySite->attemptsNumber = 0;
2366 */
2367
2368 return OK;
2369 }
2370
2371 /***********************************************************************
2372 * siteMgr_isCurrentBand24
2373 ***********************************************************************
2374 DESCRIPTION: The function checks the current operational mode and
2375 returns if the current band is 2.4Ghz or 5Ghz.
2376
2377 INPUT: hSiteMgr - site mgr handle.
2378
2379 OUTPUT:
2380
2381 RETURN: TRUE if current band is 2.4Ghz, FALSE otherwise.
2382
2383 ************************************************************************/
siteMgr_isCurrentBand24(TI_HANDLE hSiteMgr)2384 BOOL siteMgr_isCurrentBand24(TI_HANDLE hSiteMgr)
2385 {
2386 siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
2387
2388 if(pSiteMgr->siteMgrOperationalMode == DOT11_A_MODE)
2389 return FALSE;
2390
2391 return TRUE; /* 802.11b supports onlty 2.4G band */
2392
2393 }
2394
2395
2396 /***********************************************************************
2397 * siteMgr_isThereValidSSID
2398 ***********************************************************************
2399 DESCRIPTION: checks if a valid SSID exists
2400
2401 INPUT: hSiteMgr - site mgr handle.
2402
2403 OUTPUT:
2404
2405 RETURN: TRUE if valid SSID found, FALSE if not
2406
2407 ************************************************************************/
siteMgr_isThereValidSSID(TI_HANDLE hSiteMgr)2408 BOOL siteMgr_isThereValidSSID (TI_HANDLE hSiteMgr)
2409 {
2410 paramInfo_t param;
2411
2412 param.paramType = SITE_MGR_DESIRED_SSID_PARAM;
2413 siteMgr_getParam(hSiteMgr,¶m);
2414
2415 if((utils_isAnySSID(¶m.content.siteMgrDesiredSSID)) || (utils_isJunkSSID(¶m.content.siteMgrDesiredSSID)))
2416 return (FALSE);
2417 else
2418 return (TRUE);
2419 }
2420
2421 /***********************************************************************
2422 * removeEldestSite
2423 ***********************************************************************
2424 DESCRIPTION: Called by the select when trying to create an IBSS and site table is full
2425 Remove the eldest site from the table
2426
2427 INPUT: hSiteMgr - site mgr handle.
2428
2429 OUTPUT:
2430
2431 RETURN: OK on success, NOK otherwise
2432
2433 ************************************************************************/
removeEldestSite(siteMgr_t * pSiteMgr)2434 TI_STATUS removeEldestSite(siteMgr_t *pSiteMgr)
2435 {
2436 int i;
2437 siteEntry_t *pEldestSite = NULL, *pSiteTable = pSiteMgr->pSitesMgmtParams->pCurrentSiteTable->siteTable;
2438 siteTablesParams_t *currTable = pSiteMgr->pSitesMgmtParams->pCurrentSiteTable;
2439 UINT32 currentTimsStamp = os_timeStampMs(pSiteMgr->hOs);
2440 UINT32 biggestGap = 0;
2441
2442 for (i = 0; i < currTable->maxNumOfSites; i++)
2443 {
2444 if (biggestGap < ((UINT32)(currentTimsStamp - pSiteTable[i].localTimeStamp)))
2445 {
2446 biggestGap = ((UINT32)(currentTimsStamp - pSiteTable[i].localTimeStamp));
2447 pEldestSite = &(pSiteTable[i]);
2448 }
2449 }
2450
2451 removeSiteEntry(pSiteMgr, currTable, pEldestSite);
2452
2453 return OK;
2454 }
2455
2456
2457 /***********************************************************************
2458 * update_apsd
2459 ***********************************************************************
2460 DESCRIPTION: Sets the site APSD support flag according to the
2461 beacon's capabilities vector and the WME-params IE if exists.
2462
2463 INPUT: pSite - Pointer to the site entry in the site table
2464 pFrameInfo - Frame information after the parsing
2465
2466 OUTPUT: pSite->APSDSupport flag
2467
2468 RETURN:
2469
2470 ************************************************************************/
update_apsd(siteEntry_t * pSite,mlmeFrameInfo_t * pFrameInfo)2471 static void update_apsd(siteEntry_t *pSite, mlmeFrameInfo_t *pFrameInfo)
2472 {
2473 /* If WME-Params IE is not included in the beacon, set the APSD-Support flag
2474 only by the beacons capabilities bit map. */
2475 if (pFrameInfo->content.iePacket.WMEParams == NULL)
2476 pSite->APSDSupport = (((pFrameInfo->content.iePacket.capabilities >> CAP_APSD_SHIFT) & CAP_APSD_MASK) ? TRUE : FALSE);
2477
2478 /* Else, set the APSD-Support flag if either the capabilities APSD bit or the
2479 WME-Params APSD bit indicate so. */
2480 else
2481 pSite->APSDSupport = ((((pFrameInfo->content.iePacket.capabilities >> CAP_APSD_SHIFT) & CAP_APSD_MASK) ? TRUE : FALSE) ||
2482 (((pFrameInfo->content.iePacket.WMEParams->ACInfoField >> AP_QOS_INFO_UAPSD_SHIFT) & AP_QOS_INFO_UAPSD_MASK) ? TRUE : FALSE));
2483 }
2484
2485
2486 /***********************************************************************
2487 * release_module
2488 ***********************************************************************
2489 DESCRIPTION: Called by the un load function
2490 Go over the vector, for each bit that is set, release the corresponding module.
2491
2492 INPUT: pSiteMgr - site mgr handle.
2493 initVec - Vector that contains a bit set for each module thah had been initiualized
2494
2495 OUTPUT:
2496
2497 RETURN: OK on success, NOK otherwise
2498
2499 ************************************************************************/
release_module(siteMgr_t * pSiteMgr,UINT32 initVec)2500 static void release_module(siteMgr_t *pSiteMgr, UINT32 initVec)
2501 {
2502 if (initVec & (1 << MGMT_PARAMS_INIT_BIT))
2503 utils_nullMemoryFree(pSiteMgr->hOs, pSiteMgr->pSitesMgmtParams, sizeof(sitesMgmtParams_t));
2504
2505 if (initVec & (1 << DESIRED_PARAMS_INIT_BIT))
2506 utils_nullMemoryFree(pSiteMgr->hOs, pSiteMgr->pDesiredParams, sizeof(siteMgrInitParams_t));
2507
2508 if (initVec & (1 << SITE_MGR_INIT_BIT))
2509 utils_nullMemoryFree(pSiteMgr->hOs, pSiteMgr, sizeof(siteMgr_t));
2510
2511 initVec = 0;
2512 }
2513
2514
2515 /***********************************************************************
2516 * updateSiteInfo
2517 ***********************************************************************
2518 DESCRIPTION: Called upon receiving a beacon or probe response
2519 Go over the vector, for each bit that is set, release the corresponding module.
2520 Update theaite entry in the site table with the information received in the frame
2521
2522 INPUT: pSiteMgr - site mgr handle.
2523 pFrameInfo - Frame information after the parsing
2524 pSite - Pointer to the site entry in the site table
2525
2526 OUTPUT:
2527
2528 RETURN: OK on success, NOK otherwise
2529
2530 ************************************************************************/
updateSiteInfo(siteMgr_t * pSiteMgr,mlmeFrameInfo_t * pFrameInfo,siteEntry_t * pSite,UINT8 rxChannel)2531 static void updateSiteInfo(siteMgr_t *pSiteMgr, mlmeFrameInfo_t *pFrameInfo, siteEntry_t *pSite, UINT8 rxChannel)
2532 {
2533 paramInfo_t param;
2534 BOOL ssidUpdated;
2535
2536
2537 SET_ENTRY_FLAG_IN_SITE_TABLE(pSite);
2538 ssidUpdated = FALSE;
2539
2540 switch (pFrameInfo->subType)
2541 {
2542 case BEACON:
2543
2544 UPDATE_BEACON_INTERVAL(pSite, pFrameInfo);
2545
2546 UPDATE_CAPABILITIES(pSite, pFrameInfo);
2547
2548 if (utils_isIESSID_Broadcast(pFrameInfo->content.iePacket.pSsid) == FALSE)
2549 { /* And the SSID is not Broadcast */
2550 ssidUpdated = TRUE;
2551 UPDATE_SSID(pSite, pFrameInfo);
2552 }
2553
2554 if (ssidUpdated)
2555 {
2556 UPDATE_PRIVACY(pSite, pFrameInfo);
2557 }
2558
2559 update_apsd(pSite, pFrameInfo);
2560
2561 updatePreamble(pSiteMgr, pSite, pFrameInfo);
2562
2563 UPDATE_AGILITY(pSite, pFrameInfo);
2564
2565
2566 if(pSiteMgr->siteMgrOperationalMode == DOT11_G_MODE)
2567 {
2568 UPDATE_SLOT_TIME(pSite, pFrameInfo);
2569 UPDATE_PROTECTION(pSite, pFrameInfo);
2570 }
2571
2572 updateRates(pSiteMgr, pSite, pFrameInfo);
2573
2574 if ((pFrameInfo->content.iePacket.pDSParamsSet != NULL) &&
2575 (pFrameInfo->content.iePacket.pDSParamsSet->currChannel!=rxChannel))
2576 {
2577 WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
2578 ("updateSiteInfo, wrong CHANNELS:rxChannel=%d,currChannel=%d\n",
2579 rxChannel, pFrameInfo->content.iePacket.pDSParamsSet->currChannel));
2580 }
2581 else
2582 UPDATE_CHANNEL(pSite, pFrameInfo , rxChannel);
2583
2584
2585 UPDATE_BSS_TYPE(pSite, pFrameInfo);
2586
2587 if (pSite->bssType == BSS_INFRASTRUCTURE)
2588 UPDATE_DTIM_PERIOD(pSite, pFrameInfo);
2589
2590 UPDATE_ATIM_WINDOW(pSite, pFrameInfo);
2591
2592 UPDATE_BEACON_AP_TX_POWER(pSite, pFrameInfo);
2593
2594 /* Updating QoS params */
2595 updateBeaconQosParams(pSiteMgr, pSite, pFrameInfo);
2596
2597 /* updating CountryIE */
2598 if ((pFrameInfo->content.iePacket.country != NULL) &&
2599 (pFrameInfo->content.iePacket.country->hdr.eleLen != 0))
2600 {
2601 /* set the country info in the regulatory domain - If a different code was detected earlier
2602 the regDomain will ignore it */
2603 param.paramType = REGULATORY_DOMAIN_COUNTRY_PARAM;
2604 param.content.pCountry = (country_t *)pFrameInfo->content.iePacket.country;
2605 regulatoryDomain_setParam(pSiteMgr->hRegulatoryDomain,¶m);
2606 }
2607
2608 /* Checking if this beacon is a DTIM i.e. DTIM count is zero */
2609 if( (pFrameInfo->content.iePacket.pTIM != NULL) && (pFrameInfo->content.iePacket.pTIM->dtimCount == 0))
2610 {
2611 /* Update the DTIM beacon time */
2612 UPDATE_DTIM_TIME(pSiteMgr, pSite, pFrameInfo);
2613 }
2614
2615 UPDATE_LOCAL_TIME_STAMP(pSiteMgr, pSite, pFrameInfo);
2616
2617 UPDATE_BEACON_MODULATION(pSite, pFrameInfo);
2618
2619 /* If the BSS type is independent, the beacon & probe modulation are equal,
2620 It is important to update this field here for dynamic PBCC algorithm compatibility */
2621 if (pSite->bssType == BSS_INDEPENDENT)
2622 UPDATE_PROBE_MODULATION(pSite, pFrameInfo);
2623
2624
2625 if (pSite->siteType == SITE_PRIMARY)
2626 {
2627
2628 if (pSiteMgr->pSitesMgmtParams->pPrimarySite == NULL)
2629 {
2630 WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("updateSiteInfo: Primary Site Is NULL\n"));
2631 pSite->siteType = SITE_REGULAR;
2632 }
2633 else
2634 {
2635 /* If the site that we got the beacon on is the primary site - which means we are either trying */
2636 /* to connect to it or we are already connected - send the EVENT_GOT_BEACON to the conn module (through the SME module) */
2637 /* so the conn module will be aware of the beacon status of the site it's trying to connect to */
2638
2639 #ifdef EXC_MODULE_INCLUDED
2640 UINT8 ExternTxPower;
2641
2642 if (pFrameInfo->content.iePacket.cellTP != NULL)
2643 {
2644 ExternTxPower = pFrameInfo->content.iePacket.cellTP->power;
2645 }
2646 else /* Set to maximum possible. Note that we add +1 so that Dbm = 26 and not 25 */
2647 {
2648 ExternTxPower = MAX_TX_POWER / DBM_TO_TX_POWER_FACTOR + 1;
2649 }
2650
2651 param.paramType = REGULATORY_DOMAIN_EXTERN_TX_POWER_PREFERRED;
2652 param.content.ExternTxPowerPreferred = ExternTxPower;
2653 regulatoryDomain_setParam(pSiteMgr->hRegulatoryDomain, ¶m);
2654 #endif
2655
2656 /* Updating the Tx Power according to the received Power Constraint */
2657 if(pFrameInfo->content.iePacket.powerConstraint != NULL)
2658 { /* Checking if the recieved constraint is different from the one that is already known */
2659 if( pFrameInfo->content.iePacket.powerConstraint->powerConstraint != pSite->powerConstraint)
2660 { /* check if Spectrum Management is enabled */
2661 param.paramType = REGULATORY_DOMAIN_MANAGEMENT_CAPABILITY_ENABLED_PARAM;
2662 regulatoryDomain_getParam(pSiteMgr->hRegulatoryDomain,¶m);
2663 if(param.content.spectrumManagementEnabled)
2664 { /* setting power constraint */
2665 pSite->powerConstraint = pFrameInfo->content.iePacket.powerConstraint->powerConstraint;
2666 param.paramType = REGULATORY_DOMAIN_SET_POWER_CONSTRAINT_PARAM;
2667 param.content.powerConstraint = pSite->powerConstraint;
2668 regulatoryDomain_setParam(pSiteMgr->hRegulatoryDomain,¶m);
2669
2670 }
2671 }
2672 }
2673
2674 if (pSite->beaconReceiveAfterJoin == FALSE)
2675 {
2676 /*
2677 use for indicate to that it safe to call to PowerMgr_startPS() that can be call only
2678 after join command followed by beacon receive later.
2679 every join command the beaconReceiveAfterJoin flag is cleared therefor it will
2680 be true after the join command.
2681
2682 the right follow is: join --> receive primary site beacon --> PowerMgr_startPS().
2683
2684 Note: the beaconReceiveAfterJoin flag is in use for the SME path!
2685 */
2686 siteMgr_gotFirstBcn(pSiteMgr);
2687 /* set Hw not available now that the first beacon arrived */
2688 MacServices_powerAutho_AwakeRequiredUpdate(pSiteMgr->hMacServices, POWERAUTHO_AWAKE_NOT_REQUIRED, POWERAUTHO_AWAKE_REASON_FIRST_BEACON);
2689
2690 pSite->beaconReceiveAfterJoin = TRUE;
2691
2692 WLAN_REPORT_INFORMATION(pSiteMgr->hReport,
2693 SITE_MGR_MODULE_LOG,
2694 ("1st beacon after join command RECEIVED!!!\n"));
2695 }
2696
2697 }
2698 }
2699
2700 UPDATE_BEACON_RECV(pSite);
2701
2702 if (ssidUpdated)
2703 {
2704 dot11_RSN_t *pRsnIe = pFrameInfo->content.iePacket.pRsnIe;
2705 UINT8 rsnIeLen = pFrameInfo->content.iePacket.rsnIeLen;
2706 UPDATE_RSN_IE(pSite, pRsnIe, rsnIeLen);
2707 }
2708
2709
2710 UPDATE_BEACON_TIMESTAMP(pSiteMgr, pSite, pFrameInfo);
2711
2712 break;
2713
2714
2715 case PROBE_RESPONSE:
2716
2717 UPDATE_BEACON_INTERVAL(pSite, pFrameInfo);
2718
2719 UPDATE_CAPABILITIES(pSite, pFrameInfo);
2720
2721 ssidUpdated = TRUE;
2722 if (pSite->siteType == SITE_PRIMARY)
2723 { /* Primary SITE */
2724 if ((pFrameInfo->content.iePacket.pSsid != NULL) &&
2725 (pSiteMgr->pDesiredParams->siteMgrDesiredSSID.len>0))
2726 { /* There's a desired SSID*/
2727 if (os_memoryCompare(pSiteMgr->hOs, (UINT8*)(pSiteMgr->pDesiredParams->siteMgrDesiredSSID.ssidString),
2728 (UINT8*)(pFrameInfo->content.iePacket.pSsid->serviceSetId), pFrameInfo->content.iePacket.pSsid->hdr.eleLen)!=0)
2729 { /* Do not overwrite the primary site's SSID with a different than the desired SSID*/
2730 ssidUpdated = FALSE;
2731 }
2732
2733 }
2734 else if (pFrameInfo->content.iePacket.pSsid == NULL)
2735 {
2736 WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
2737 ("updateSiteInfo PROBE_RESP, pSsid=NULL\n"));
2738 }
2739 }
2740
2741 if (ssidUpdated)
2742 {
2743 UPDATE_SSID(pSite, pFrameInfo);
2744 UPDATE_PRIVACY(pSite, pFrameInfo);
2745 }
2746
2747 update_apsd(pSite, pFrameInfo);
2748
2749
2750 if(pSiteMgr->siteMgrOperationalMode == DOT11_G_MODE)
2751 {
2752 UPDATE_PROTECTION(pSite, pFrameInfo);
2753 }
2754
2755 updateFourX(pSiteMgr, pSite, pFrameInfo);
2756
2757 updatePreamble(pSiteMgr, pSite, pFrameInfo);
2758
2759 UPDATE_AGILITY(pSite, pFrameInfo);
2760
2761 updateRates(pSiteMgr, pSite, pFrameInfo);
2762
2763 if ((pFrameInfo->content.iePacket.pDSParamsSet != NULL) &&
2764 (pFrameInfo->content.iePacket.pDSParamsSet->currChannel!=rxChannel))
2765 {
2766 WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
2767 ("updateSiteInfo, wrong CHANNELS:rxChannel=%d,currChannel=%d\n",
2768 rxChannel, pFrameInfo->content.iePacket.pDSParamsSet->currChannel));
2769 }
2770 else
2771 UPDATE_CHANNEL(pSite, pFrameInfo, rxChannel);
2772
2773
2774 UPDATE_BSS_TYPE(pSite, pFrameInfo);
2775
2776 UPDATE_ATIM_WINDOW(pSite, pFrameInfo);
2777
2778 UPDATE_PROBE_AP_TX_POWER(pSite, pFrameInfo);
2779
2780 /* Updating WME params */
2781 updateProbeQosParams(pSiteMgr, pSite, pFrameInfo);
2782
2783
2784 /* updating CountryIE */
2785 if ((pFrameInfo->content.iePacket.country != NULL) &&
2786 (pFrameInfo->content.iePacket.country->hdr.eleLen != 0))
2787 {
2788 /* set the country info in the regulatory domain - If a different code was detected earlier
2789 the regDomain will ignore it */
2790 param.paramType = REGULATORY_DOMAIN_COUNTRY_PARAM;
2791 param.content.pCountry = (country_t *)pFrameInfo->content.iePacket.country;
2792 regulatoryDomain_setParam(pSiteMgr->hRegulatoryDomain,¶m);
2793 }
2794
2795 UPDATE_LOCAL_TIME_STAMP(pSiteMgr, pSite, pFrameInfo);
2796
2797 UPDATE_PROBE_MODULATION(pSite, pFrameInfo);
2798
2799 /* If the BSS type is independent, the beacon & probe modulation are equal,
2800 It is important to update this field here for dynamic PBCC algorithm compatibility */
2801 if (pSite->bssType == BSS_INDEPENDENT)
2802 UPDATE_BEACON_MODULATION(pSite, pFrameInfo);
2803
2804 UPDATE_PROBE_RECV(pSite);
2805
2806 if (ssidUpdated)
2807 {
2808 dot11_RSN_t *pRsnIe = pFrameInfo->content.iePacket.pRsnIe;
2809 UINT8 rsnIeLen = pFrameInfo->content.iePacket.rsnIeLen;
2810 UPDATE_RSN_IE(pSite, pRsnIe, rsnIeLen);
2811
2812 }
2813
2814 UPDATE_BEACON_TIMESTAMP(pSiteMgr, pSite, pFrameInfo);
2815
2816 break;
2817
2818 default:
2819 WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("Site Update failure, un known frame sub type %d\n\n", pFrameInfo->subType));
2820 break;
2821 }
2822 }
2823
2824
2825 /***********************************************************************
2826 * updateFourX
2827 ***********************************************************************
2828 DESCRIPTION: Called by the function 'updateSiteInfo()'
2829
2830 INPUT: pSiteMgr - site mgr handle.
2831 pFrameInfo - Frame information after the parsing
2832 pSite - Pointer to the site entry in the site table
2833
2834 OUTPUT:
2835
2836 RETURN:
2837
2838 ************************************************************************/
updateFourX(siteMgr_t * pSiteMgr,siteEntry_t * pSite,mlmeFrameInfo_t * pFrameInfo)2839 static void updateFourX(siteMgr_t *pSiteMgr, siteEntry_t *pSite, mlmeFrameInfo_t *pFrameInfo)
2840 {
2841 UINT8 ti_oui[] = TI_OUI;
2842
2843 /* It is done to overcome interop issues. We don't send AssocReq with 4x IE
2844 if ProbeReq without 4x IE was received previously */
2845 if (pFrameInfo->content.iePacket.fourXParams != NULL)
2846 {
2847 os_memoryCopy(pSiteMgr->hOs, &pSite->fourXParams, pFrameInfo->content.iePacket.fourXParams, pFrameInfo->content.iePacket.fourXParams->hdr.eleLen+sizeof( dot11_eleHdr_t));
2848
2849 if( (pSite->fourXParams.hdr.eleId != DOT11_4X_ELE_ID) ||
2850 (pSite->fourXParams.hdr.eleLen > DOT11_4X_MAX_LEN) ||
2851 (os_memoryCompare(pSiteMgr->hOs ,ti_oui, (PUINT8)pSite->fourXParams.fourXCapabilities, DOT11_OUI_LEN) != 0) )
2852 {
2853 pSite->fourXsupported = FALSE;
2854 }
2855 }
2856 else
2857 pSite->fourXsupported = FALSE;
2858 }
2859
2860 /***********************************************************************
2861 * updatePreamble
2862 ***********************************************************************
2863 DESCRIPTION: Called by the function 'updateSiteInfo()'
2864
2865 INPUT: pSiteMgr - site mgr handle.
2866 pFrameInfo - Frame information after the parsing
2867 pSite - Pointer to the site entry in the site table
2868
2869 OUTPUT:
2870
2871 RETURN:
2872
2873 ************************************************************************/
updatePreamble(siteMgr_t * pSiteMgr,siteEntry_t * pSite,mlmeFrameInfo_t * pFrameInfo)2874 static void updatePreamble(siteMgr_t *pSiteMgr, siteEntry_t *pSite, mlmeFrameInfo_t *pFrameInfo)
2875 {
2876 pSite->currentPreambleType = ((pFrameInfo->content.iePacket.capabilities >> CAP_PREAMBLE_SHIFT) & CAP_PREAMBLE_MASK) ? PREAMBLE_SHORT : PREAMBLE_LONG;
2877
2878 pSite->barkerPreambleType = pFrameInfo->content.iePacket.barkerPreambleMode;
2879 }
2880
2881 /***********************************************************************
2882 * updateBeaconQosParams
2883 ***********************************************************************
2884 DESCRIPTION: Called by the function 'updateSiteInfo()'
2885
2886 INPUT: pSiteMgr - site mgr handle.
2887 pFrameInfo - Frame information after the parsing
2888 pSite - Pointer to the site entry in the site table
2889
2890 OUTPUT:
2891
2892 RETURN:
2893
2894 ************************************************************************/
2895
updateBeaconQosParams(siteMgr_t * pSiteMgr,siteEntry_t * pSite,mlmeFrameInfo_t * pFrameInfo)2896 static void updateBeaconQosParams(siteMgr_t *pSiteMgr, siteEntry_t *pSite, mlmeFrameInfo_t *pFrameInfo)
2897 {
2898 /* Updating WME params */
2899 if (pFrameInfo->content.iePacket.WMEParams != NULL)
2900 {
2901 /* Checking if this is IE includes new WME Parameters */
2902 if(( ((pFrameInfo->content.iePacket.WMEParams->ACInfoField) & dot11_WME_ACINFO_MASK ) != pSite->lastWMEParameterCnt) ||
2903 (!pSite->WMESupported) )
2904 {
2905 pSite->WMESupported = TRUE;
2906
2907 /* Checking if this IE is information only or is a paremeters IE */
2908 if(pFrameInfo->content.iePacket.WMEParams->OUISubType == dot11_WME_OUI_SUB_TYPE_PARAMS_IE)
2909 {
2910 if(pSite->siteType == SITE_PRIMARY)
2911 {
2912 qosMngr_updateIEinfo(pSiteMgr->hQosMngr,(UINT8 *)(pFrameInfo->content.iePacket.WMEParams),WME);
2913 }
2914 /* updating the WME paraeters into the site table. */
2915 os_memoryCopy(pSiteMgr->hOs, &pSite->WMEParameters, &(pFrameInfo->content.iePacket.WMEParams->WME_ACParameteres), sizeof( ACParameters_t));
2916 pSite->lastWMEParameterCnt = (pFrameInfo->content.iePacket.WMEParams->ACInfoField) & dot11_WME_ACINFO_MASK;
2917 WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,("$$$$$$ WME parameters were updates according to beacon, cntSeq = %d\n",pSite->lastWMEParameterCnt));
2918 }
2919 }
2920 }else
2921 {
2922 pSite->WMESupported = FALSE;
2923 }
2924
2925 }
2926
2927 /***********************************************************************
2928 * updateProbeQosParams
2929 ***********************************************************************
2930 DESCRIPTION: Called by the function 'updateSiteInfo()'
2931
2932 INPUT: pSiteMgr - site mgr handle.
2933 pFrameInfo - Frame information after the parsing
2934 pSite - Pointer to the site entry in the site table
2935
2936 OUTPUT:
2937
2938 RETURN:
2939
2940 ************************************************************************/
updateProbeQosParams(siteMgr_t * pSiteMgr,siteEntry_t * pSite,mlmeFrameInfo_t * pFrameInfo)2941 static void updateProbeQosParams(siteMgr_t *pSiteMgr, siteEntry_t *pSite, mlmeFrameInfo_t *pFrameInfo)
2942 {
2943 /* Updating WME params */
2944 if (pFrameInfo->content.iePacket.WMEParams != NULL)
2945 {
2946 /* Checking if this is IE includes new WME Parameters */
2947 if(( ((pFrameInfo->content.iePacket.WMEParams->ACInfoField) & dot11_WME_ACINFO_MASK ) != pSite->lastWMEParameterCnt) ||
2948 (!pSite->WMESupported) )
2949 {
2950 pSite->WMESupported = TRUE;
2951
2952 /* Checking if this IE is information only or is a paremeters IE */
2953 if(pFrameInfo->content.iePacket.WMEParams->OUISubType == dot11_WME_OUI_SUB_TYPE_PARAMS_IE)
2954 {
2955 if(pSite->siteType == SITE_PRIMARY)
2956 {
2957 qosMngr_updateIEinfo(pSiteMgr->hQosMngr,(UINT8 *)(pFrameInfo->content.iePacket.WMEParams),WME);
2958 }
2959 /* updating the WME paraeters into the site table. */
2960 os_memoryCopy(pSiteMgr->hOs, &pSite->WMEParameters, &(pFrameInfo->content.iePacket.WMEParams->WME_ACParameteres), sizeof( ACParameters_t));
2961 pSite->lastWMEParameterCnt = (pFrameInfo->content.iePacket.WMEParams->ACInfoField) & dot11_WME_ACINFO_MASK;
2962 WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,("$$$$$$ WME parameters were updates according to probe response, cntSeq = %d\n",pSite->lastWMEParameterCnt));
2963 }
2964 }
2965 }else
2966 {
2967 pSite->WMESupported = FALSE;
2968 }
2969
2970 }
2971
2972 /***********************************************************************
2973 * updateRates
2974 ***********************************************************************
2975 DESCRIPTION: Called by the function 'updateSiteInfo()' in order to translate the rates received
2976 in the beacon or probe response to rate used by the driver. Perfoms the following:
2977 - Check the rates. validity. If rates are invalid, return
2978 - Get the max active rate & max basic rate, if invalid, return
2979 - Translate the max active rate and max basic rate from network rates to host rates.
2980 The max active & max basic rate are used by the driver from now on in all the processes:
2981 (selection, join, transmission, etc....)
2982
2983 INPUT: pSiteMgr - site mgr handle.
2984 pFrameInfo - Frame information after the parsing
2985 pSite - Pointer to the site entry in the site table
2986
2987 OUTPUT:
2988
2989 RETURN: OK on success, NOK otherwise
2990
2991 ************************************************************************/
updateRates(siteMgr_t * pSiteMgr,siteEntry_t * pSite,mlmeFrameInfo_t * pFrameInfo)2992 static void updateRates(siteMgr_t *pSiteMgr, siteEntry_t *pSite, mlmeFrameInfo_t *pFrameInfo)
2993 {
2994 UINT8 maxBasicRate = 0, maxActiveRate = 0;
2995 UINT32 bitMapExtSupp = 0;
2996 paramInfo_t param;
2997
2998 if (pFrameInfo->content.iePacket.pRates == NULL)
2999 {
3000 WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("updateRates, pRates=NULL, beacon & probeResp are: \n"));
3001 WLAN_REPORT_HEX_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
3002 (UINT8*)pFrameInfo->content.iePacket.pRates, pFrameInfo->content.iePacket.pRates->hdr.eleLen+2);
3003 WLAN_REPORT_HEX_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
3004 (UINT8*)pFrameInfo->content.iePacket.pRates, pFrameInfo->content.iePacket.pRates->hdr.eleLen+2);
3005 return;
3006 }
3007
3008 /* Update the rate elements */
3009 maxBasicRate = getMaxBasicRatefromString((UINT8 *)pFrameInfo->content.iePacket.pRates->rates,pFrameInfo->content.iePacket.pRates->hdr.eleLen, maxBasicRate);
3010 maxActiveRate = getMaxActiveRatefromString((UINT8 *)pFrameInfo->content.iePacket.pRates->rates,pFrameInfo->content.iePacket.pRates->hdr.eleLen, maxActiveRate);
3011
3012 if(pFrameInfo->content.iePacket.pExtRates)
3013 {
3014 maxBasicRate = getMaxBasicRatefromString((UINT8 *)pFrameInfo->content.iePacket.pExtRates->rates,pFrameInfo->content.iePacket.pExtRates->hdr.eleLen, maxBasicRate);
3015 maxActiveRate = getMaxActiveRatefromString((UINT8 *)pFrameInfo->content.iePacket.pExtRates->rates,pFrameInfo->content.iePacket.pExtRates->hdr.eleLen, maxActiveRate);
3016 }
3017
3018
3019 /*WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("1- maxBasicRate = 0x%X, maxActiveRate = 0x%X \n", maxBasicRate,maxActiveRate));*/
3020
3021 if (maxActiveRate == 0)
3022 maxActiveRate = maxBasicRate;
3023
3024 /* Now update it from network to host rates */
3025 pSite->maxBasicRate = networkToHostRate(maxBasicRate);
3026
3027 pSite->maxActiveRate = networkToHostRate(maxActiveRate);
3028 if (pSite->maxActiveRate == DRV_RATE_INVALID)
3029 WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("Network To Host Rate failure, no active network rate\n"));
3030
3031 if (pSite->maxBasicRate != DRV_RATE_INVALID)
3032 {
3033 if (pSite->maxActiveRate != DRV_RATE_INVALID)
3034 {
3035 pSite->maxActiveRate = MAX(pSite->maxActiveRate,pSite->maxBasicRate);
3036 }
3037 } else { /* in case some vendors don't specify basic rates */
3038 WLAN_REPORT_WARNING(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("Network To Host Rate failure, no basic network rate"));
3039 pSite->maxBasicRate = pSite->maxActiveRate;
3040 }
3041
3042 /* build rates bit map */
3043 networkStringToBitMapSuppRates((UINT32 *)&pSite->rateMask.supportedRateMask,
3044 (UINT8 *)pFrameInfo->content.iePacket.pRates->rates,
3045 pFrameInfo->content.iePacket.pRates->hdr.eleLen);
3046 networkStringToBitMapBasicRates((UINT32 *)&pSite->rateMask.basicRateMask,
3047 (UINT8 *)pFrameInfo->content.iePacket.pRates->rates,
3048 pFrameInfo->content.iePacket.pRates->hdr.eleLen);
3049
3050 if(pFrameInfo->content.iePacket.pExtRates)
3051 {
3052 networkStringToBitMapSuppRates(&bitMapExtSupp, (UINT8 *)pFrameInfo->content.iePacket.pExtRates->rates,
3053 pFrameInfo->content.iePacket.pExtRates->hdr.eleLen);
3054
3055 pSite->rateMask.supportedRateMask |= bitMapExtSupp;
3056
3057 networkStringToBitMapBasicRates(&bitMapExtSupp, (UINT8 *)pFrameInfo->content.iePacket.pExtRates->rates,
3058 pFrameInfo->content.iePacket.pExtRates->hdr.eleLen);
3059
3060 pSite->rateMask.basicRateMask |= bitMapExtSupp;
3061 }
3062
3063
3064 param.paramType = CTRL_DATA_CURRENT_SUPPORTED_RATE_MASK_PARAM;
3065 param.content.ctrlDataCurrentRateMask = pSite->rateMask.supportedRateMask;
3066 /* clear the 22Mbps bit in case the PBCC is not allowed */
3067 if(pSiteMgr->currentDataModulation != DRV_MODULATION_PBCC && pSiteMgr->currentDataModulation != DRV_MODULATION_OFDM)
3068 {
3069 param.content.ctrlDataCurrentRateMask &= ~DRV_RATE_MASK_22_PBCC;
3070 }
3071 ctrlData_setParam(pSiteMgr->hCtrlData, ¶m);
3072
3073 param.paramType = CTRL_DATA_CURRENT_BASIC_RATE_MASK_PARAM;
3074 param.content.ctrlDataBasicRateBitMask = pSite->rateMask.basicRateMask;
3075 ctrlData_setParam(pSiteMgr->hCtrlData, ¶m);
3076
3077
3078 /*WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("2- pSite->maxActiveRate = 0x%X, pSite->maxBasicRate = 0x%X \n", pSite->maxActiveRate,pSite->maxBasicRate));*/
3079
3080 }
3081
3082 /***********************************************************************
3083 * getBssidList
3084 ***********************************************************************
3085 DESCRIPTION: Called by the OS abstraction layer in order to get the BSSID list from the site table
3086
3087 INPUT: pSiteMgr - site mgr handle.
3088
3089 OUTPUT: bssidList - BSSID list pointer
3090
3091 RETURN:
3092
3093 ************************************************************************/
getBssidList(siteMgr_t * pSiteMgr,OS_802_11_BSSID_LIST_EX * bssidList,UINT32 * pLength,BOOL allVarIes)3094 static TI_STATUS getBssidList(siteMgr_t *pSiteMgr, OS_802_11_BSSID_LIST_EX *bssidList, UINT32 *pLength, BOOL allVarIes)
3095 {
3096 UINT8 siteTableIndex, tableIndex, i, index, rsnIeLength;
3097 siteEntry_t *pSiteEntry;
3098 OS_802_11_BSSID_EX *pBssid;
3099 OS_802_11_FIXED_IEs *pFixedIes;
3100 OS_802_11_VARIABLE_IEs *pVarIes;
3101
3102 UINT32 length;
3103 UINT8 *pData;
3104 UINT32 len, firstOFDMloc = 0;
3105 siteTablesParams_t *currTable;
3106 short numOfTables;
3107
3108 UINT8 *pDesiredIe;
3109 UINT8 *pSiteEntryIeBuffer;
3110 UINT16 ieLength;
3111
3112 UINT8 wpsOuiBuffer[DOT11_WPS_OUI_LEN+1]=DOT11_WPS_OUI;
3113
3114 #ifdef DBG_BSSIS_NAME_PRINT
3115 UINT8 tempName[33];
3116 #endif
3117
3118 numOfTables = NUM_OF_SITE_TABLE;
3119
3120
3121 bssidList->NumberOfItems = 0;
3122
3123 calculateBssidListSize(pSiteMgr, &length, allVarIes);
3124
3125 if (length > *pLength)
3126 {
3127 *pLength = length;
3128 return NOK;
3129 }
3130
3131 length = sizeof(OS_802_11_BSSID_LIST_EX) - sizeof(OS_802_11_BSSID_EX);
3132
3133 pData = (UINT8*)&bssidList->Bssid[0];
3134
3135 WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("Entering getBssidList, length = %d, pData = 0x%X\n", *pLength, (UINT32)pData));
3136
3137 currTable = pSiteMgr->pSitesMgmtParams->pCurrentSiteTable;
3138
3139 for (tableIndex = 0; tableIndex < numOfTables ; tableIndex++)
3140 {
3141 for (siteTableIndex = 0, i = 0; siteTableIndex < currTable->maxNumOfSites; siteTableIndex++)
3142 {
3143 pBssid = (OS_802_11_BSSID_EX*)pData;
3144
3145 pSiteEntry = &(currTable->siteTable[siteTableIndex]);
3146
3147 if (pSiteEntry->siteType == SITE_NULL)
3148 continue;
3149
3150
3151 /* MacAddress */
3152 os_memoryCopy(pSiteMgr->hOs, (void *)pBssid->MacAddress, (void *)&(pSiteEntry->bssid.addr), MAC_ADDR_LEN);
3153
3154
3155 /* Capabilities */
3156 pBssid->Union.Capabilities = pSiteEntry->capabilities;
3157
3158 /* SSID */
3159 /* This line is in order to prevent presantation problems at the utility. */
3160 os_memoryZero(pSiteMgr->hOs, &(pBssid->Ssid.Ssid), MAX_SSID_LEN);
3161 if (pSiteEntry->ssid.len > MAX_SSID_LEN)
3162 {
3163 pSiteEntry->ssid.len = MAX_SSID_LEN;
3164 }
3165 os_memoryCopy(pSiteMgr->hOs, (void *)pBssid->Ssid.Ssid, &(pSiteEntry->ssid.ssidString), pSiteEntry->ssid.len);
3166 pBssid->Ssid.SsidLength = pSiteEntry->ssid.len;
3167
3168 /* privacy */
3169 pBssid->Privacy = pSiteEntry->privacy;
3170
3171 /* RSSI */
3172
3173 pBssid->Rssi = (pSiteEntry->rssi);
3174
3175 pBssid->Configuration.Length = sizeof(OS_802_11_CONFIGURATION);
3176 pBssid->Configuration.BeaconPeriod = pSiteEntry->beaconInterval;
3177 pBssid->Configuration.ATIMWindow = pSiteEntry->atimWindow;
3178 pBssid->Configuration.Union.channel = Chan2Freq(pSiteEntry->channel);
3179
3180 pBssid->Configuration.FHConfig.Length = sizeof(OS_802_11_CONFIGURATION_FH);
3181 pBssid->Configuration.FHConfig.DwellTime = pSiteEntry->FHParams.dwellTime;
3182 pBssid->Configuration.FHConfig.HopPattern = pSiteEntry->FHParams.hopPattern;
3183 pBssid->Configuration.FHConfig.HopSet = pSiteEntry->FHParams.hopSet;
3184
3185 if (pSiteEntry->bssType == BSS_INDEPENDENT)
3186 pBssid->InfrastructureMode = os802_11IBSS;
3187 else
3188 pBssid->InfrastructureMode = os802_11Infrastructure;
3189
3190 /* SupportedRates */
3191 os_memoryZero(pSiteMgr->hOs, (void *)pBssid->SupportedRates, sizeof(OS_802_11_RATES_EX));
3192
3193 bitMapToNetworkStringRates(pSiteEntry->rateMask.supportedRateMask,
3194 pSiteEntry->rateMask.basicRateMask,
3195 (UINT8 *)pBssid->SupportedRates,
3196 &len, &firstOFDMloc);
3197
3198 /* set network type acording to band and rates */
3199 if (currTable == &pSiteMgr->pSitesMgmtParams->dot11BG_sitesTables)
3200 {
3201 if (firstOFDMloc == len)
3202 {
3203 pBssid->NetworkTypeInUse = os802_11DS;
3204 } else {
3205 pBssid->NetworkTypeInUse = os802_11OFDM24;
3206 }
3207 } else {
3208 pBssid->NetworkTypeInUse = os802_11OFDM5;
3209 }
3210
3211 pBssid->IELength = 0;
3212
3213 /* copy fixed IEs from site entry */
3214 pFixedIes = (OS_802_11_FIXED_IEs*)&pBssid->IEs[pBssid->IELength];
3215 os_memoryCopy(pSiteMgr->hOs, (void *)pFixedIes->TimeStamp, &pSiteEntry->localTimeStamp, sizeof(pSiteEntry->localTimeStamp));
3216 pFixedIes->BeaconInterval = pSiteEntry->beaconInterval;
3217 pFixedIes->Capabilities = pSiteEntry->capabilities;
3218 pBssid->IELength += sizeof(OS_802_11_FIXED_IEs);
3219 pVarIes = (OS_802_11_VARIABLE_IEs*)&pBssid->IEs[pBssid->IELength];
3220
3221 if (!allVarIes)
3222 { /* copy only several variable IEs */
3223
3224 /* copy SSID */
3225 pVarIes->ElementID = SSID_IE_ID;
3226 pVarIes->Length = pSiteEntry->ssid.len;
3227 os_memoryCopy(pSiteMgr->hOs, (void *)pVarIes->data, (void *)pSiteEntry->ssid.ssidString, pSiteEntry->ssid.len);
3228 pBssid->IELength += (pVarIes->Length + 2);
3229
3230 /* copy RATES */
3231 pVarIes = (OS_802_11_VARIABLE_IEs*)&pBssid->IEs[pBssid->IELength];
3232 pVarIes->ElementID = SUPPORTED_RATES_IE_ID;
3233 bitMapToNetworkStringRates(pSiteEntry->rateMask.supportedRateMask, pSiteEntry->rateMask.basicRateMask,
3234 (UINT8 *)pVarIes->data, &len, &firstOFDMloc);
3235 pVarIes->Length = len;
3236 pBssid->IELength += (pVarIes->Length + 2);
3237
3238 /* copy FH */
3239 pVarIes = (OS_802_11_VARIABLE_IEs*)&pBssid->IEs[pBssid->IELength];
3240 pVarIes->ElementID = FH_PARAMETER_SET_IE_ID;
3241 pVarIes->Length = DOT11_FH_PARAMS_ELE_LEN;
3242 os_memoryCopy(pSiteMgr->hOs, (void *)pVarIes->data, &pSiteEntry->FHParams.dwellTime, sizeof(pSiteEntry->FHParams.dwellTime));
3243 os_memoryCopy(pSiteMgr->hOs, (void *)&pVarIes->data[2], &pSiteEntry->FHParams.hopSet, sizeof(pSiteEntry->FHParams.hopSet));
3244 os_memoryCopy(pSiteMgr->hOs, (void *)&pVarIes->data[3], &pSiteEntry->FHParams.hopPattern, sizeof(pSiteEntry->FHParams.hopPattern));
3245 pVarIes->data[4] = 1;
3246 pBssid->IELength += (pVarIes->Length + 2);
3247
3248 /* copy DS */
3249 pVarIes = (OS_802_11_VARIABLE_IEs*)&pBssid->IEs[pBssid->IELength];
3250 pVarIes->ElementID = DS_PARAMETER_SET_IE_ID;
3251 pVarIes->Length = DOT11_DS_PARAMS_ELE_LEN;
3252 os_memoryCopy(pSiteMgr->hOs, (void *)pVarIes->data, &pSiteEntry->channel, DOT11_DS_PARAMS_ELE_LEN);
3253 pBssid->IELength += (pVarIes->Length + 2);
3254
3255 /* copy RSN information elements */
3256 rsnIeLength = 0;
3257 for (index=0; index<MAX_RSN_IE && pSiteEntry->pRsnIe[index].hdr.eleLen>0; index++)
3258 {
3259 pVarIes = (OS_802_11_VARIABLE_IEs*)&pBssid->IEs[pBssid->IELength+rsnIeLength];
3260 pVarIes->ElementID = pSiteEntry->pRsnIe[index].hdr.eleId;
3261 pVarIes->Length = pSiteEntry->pRsnIe[index].hdr.eleLen;
3262 os_memoryCopy(pSiteMgr->hOs, (void *)pVarIes->data, (void *)pSiteEntry->pRsnIe[index].rsnIeData, pSiteEntry->pRsnIe[index].hdr.eleLen);
3263 rsnIeLength += pSiteEntry->pRsnIe[index].hdr.eleLen+2;
3264 WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
3265 ("RSN IE ID=%d, Length=%x\n", pVarIes->ElementID, pVarIes->Length));
3266
3267 WLAN_REPORT_HEX_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, (UINT8 *)pVarIes->data,pVarIes->Length);
3268 }
3269
3270 pBssid->IELength += pSiteEntry->rsnIeLen;
3271
3272 /* create information element for the WME/EXC.
3273 Note that the existence of these IEs should be considered as a fact that the site supports this feature.
3274 by alcel
3275 */
3276 if (pSiteEntry->WMESupported)
3277 {
3278 /* oui */
3279 UINT8 ouiWME[3] = { 0x50,0xf2,0x01};
3280 dot11_WME_PARAM_t *pWMEParams;
3281
3282
3283 /* fill in the general element parameters */
3284
3285 pVarIes = (OS_802_11_VARIABLE_IEs*)&pBssid->IEs[pBssid->IELength];
3286 pVarIes->ElementID =DOT11_WME_ELE_ID;
3287 pVarIes->Length = DOT11_WME_PARAM_ELE_LEN;
3288
3289 WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
3290 ("WMESupported ID=%d, Length=%x\n", pVarIes->ElementID, pVarIes->Length));
3291
3292 /* fill in the specific element parameters */
3293 pWMEParams = (dot11_WME_PARAM_t *) pVarIes;
3294 os_memoryCopy(pSiteMgr->hOs,(void *)pWMEParams->OUI,ouiWME,3);
3295 pWMEParams->OUIType = dot11_WME_OUI_TYPE;
3296 pWMEParams->OUISubType = dot11_WME_OUI_SUB_TYPE_PARAMS_IE;
3297 pWMEParams->version = dot11_WME_VERSION;
3298 pWMEParams->ACInfoField = dot11_WME_ACINFO_MASK & pSiteEntry->lastWMEParameterCnt;
3299
3300 /* fill in the data */
3301
3302 os_memoryCopy(pSiteMgr->hOs,&(pWMEParams->WME_ACParameteres),&(pSiteEntry->WMEParameters),sizeof(ACParameters_t));
3303
3304
3305 /* update the general length */
3306
3307 pBssid->IELength += (pVarIes->Length + 2);
3308 }
3309
3310 /* copy WPS information elements */
3311
3312 if ((pSiteEntry->probeRecv) &&
3313 (pSiteEntry->siteType != SITE_PRIMARY))
3314 {
3315 pSiteEntryIeBuffer = pSiteEntry->probeRespBuffer;
3316 ieLength = pSiteEntry->probeRespLength;
3317 }
3318 else
3319 {
3320 pSiteEntryIeBuffer = pSiteEntry->beaconBuffer;
3321 ieLength = pSiteEntry->beaconLength;
3322 }
3323
3324 parseIeBuffer(pSiteMgr->hOs, pSiteEntryIeBuffer, ieLength, DOT11_WPS_ELE_ID, &pDesiredIe, wpsOuiBuffer, DOT11_WPS_OUI_LEN);
3325
3326 if (pDesiredIe)
3327 {
3328 pVarIes = (OS_802_11_VARIABLE_IEs*)&pBssid->IEs[pBssid->IELength];
3329 pVarIes->ElementID = DOT11_WPS_ELE_ID;
3330 pVarIes->Length = *((UINT8*)(pDesiredIe + 1));
3331 os_memoryCopy(pSiteMgr->hOs, (void *)pVarIes->data, (UINT8*)(pDesiredIe+2), pVarIes->Length);
3332
3333 pBssid->IELength += (pVarIes->Length + 2);
3334 }
3335 }
3336 else
3337 { /* Copy all variable IEs */
3338
3339 if ((pSiteEntry->probeRecv) &&
3340 (pSiteEntry->siteType != SITE_PRIMARY))
3341 {
3342 pSiteEntryIeBuffer = pSiteEntry->probeRespBuffer;
3343 ieLength = pSiteEntry->probeRespLength;
3344 }
3345 else
3346 {
3347 pSiteEntryIeBuffer = pSiteEntry->beaconBuffer;
3348 ieLength = pSiteEntry->beaconLength;
3349 }
3350 WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
3351 ("Copy all variable IEs Length=%x\n", ieLength));
3352 WLAN_REPORT_HEX_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
3353 pSiteEntryIeBuffer, ieLength);
3354
3355 os_memoryCopy(pSiteMgr->hOs, pVarIes, pSiteEntryIeBuffer, ieLength);
3356
3357 pBssid->IELength += ieLength;
3358 }
3359
3360 pBssid->Length = sizeof(OS_802_11_BSSID_EX) + pBssid->IELength - 1;
3361
3362 WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
3363 ("BSSID MAC = %x-%x-%x-%x-%x-%x\n",
3364 pBssid->MacAddress[0], pBssid->MacAddress[1], pBssid->MacAddress[2],
3365 pBssid->MacAddress[3], pBssid->MacAddress[4], pBssid->MacAddress[5]));
3366
3367 #ifdef DBG_BSSIS_NAME_PRINT
3368 os_memoryCopy(pSiteMgr->hOs, tempName, &pBssid->Ssid.Ssid[0], pBssid->Ssid.SsidLength);
3369 tempName[pBssid->Ssid.SsidLength] ='\0';
3370
3371 WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
3372 ("BSSID NAME = %s\n",tempName)) ;
3373 #endif
3374
3375
3376 /* make sure length is 4 bytes aligned */
3377 if (pBssid->Length % 4)
3378 {
3379 pBssid->Length += (4 - (pBssid->Length % 4));
3380 }
3381
3382 WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
3383 ("BSSID length after alignment = %d\n", pBssid->Length));
3384
3385 pData += pBssid->Length;
3386 length += pBssid->Length;
3387
3388
3389 i++;
3390 }
3391
3392 bssidList->NumberOfItems += i;
3393
3394 if(pSiteMgr->pDesiredParams->siteMgrDesiredDot11Mode == DOT11_DUAL_MODE)
3395 {
3396 /* change site table */
3397 if(currTable == &pSiteMgr->pSitesMgmtParams->dot11BG_sitesTables)
3398 currTable = (siteTablesParams_t *)&pSiteMgr->pSitesMgmtParams->dot11A_sitesTables;
3399 else
3400 currTable = &pSiteMgr->pSitesMgmtParams->dot11BG_sitesTables;
3401 }
3402 else
3403 break;
3404
3405 }
3406
3407
3408 WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
3409 ("Exiting getBssidList, site count = %i, length = %d, pData = 0x%X\n",
3410 bssidList->NumberOfItems, length, (UINT32)pData));
3411
3412 *pLength = length;
3413
3414 return OK;
3415 }
3416
3417 /***********************************************************************
3418 * getPrimaryBssid
3419 ***********************************************************************
3420 DESCRIPTION: Called by the OS abstraction layer in order to get the BSSID list from the site table
3421
3422 INPUT: pSiteMgr - site mgr handle.
3423
3424 OUTPUT: bssidList - BSSID list pointer
3425
3426 RETURN:
3427
3428 ************************************************************************/
getPrimaryBssid(siteMgr_t * pSiteMgr,OS_802_11_BSSID_EX * primaryBssid,UINT32 * pLength)3429 static TI_STATUS getPrimaryBssid(siteMgr_t *pSiteMgr, OS_802_11_BSSID_EX *primaryBssid, UINT32 *pLength)
3430 {
3431 siteEntry_t *pPrimarySite = pSiteMgr->pSitesMgmtParams->pPrimarySite;
3432 UINT32 len, firstOFDMloc = 0;
3433 OS_802_11_FIXED_IEs *pFixedIes;
3434 OS_802_11_VARIABLE_IEs *pVarIes;
3435 UINT32 length;
3436
3437
3438 if ((primaryBssid==NULL) || (pLength==NULL))
3439 {
3440 *pLength = 0;
3441 WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
3442 ("getPrimaryBssid, one of the ptr is NULL, primaryBssid=%p,pLength=%p \n",
3443 primaryBssid, pLength));
3444 return NOK;
3445
3446 }
3447
3448 if (pPrimarySite==NULL)
3449 {
3450 *pLength = 0;
3451 WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
3452 ("getPrimaryBssid, pPrimarySite is NULL \n"));
3453 return NOK;
3454
3455 }
3456 length = pPrimarySite->beaconLength + sizeof(OS_802_11_BSSID_EX) + sizeof(OS_802_11_FIXED_IEs);
3457 if (length > *pLength)
3458 {
3459 WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
3460 ("getPrimaryBssid, insufficient length, required length=%d, pLength=%d \n",
3461 length, *pLength));
3462 *pLength = length;
3463
3464 return NOK;
3465 }
3466
3467 WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("Entering getPrimaryBssid, length = %d\n", *pLength));
3468
3469 primaryBssid->Length = length;
3470 /* MacAddress */
3471 os_memoryCopy(pSiteMgr->hOs, (void *)primaryBssid->MacAddress, (void *)&(pPrimarySite->bssid.addr), MAC_ADDR_LEN);
3472
3473 /* Capabilities */
3474 primaryBssid->Union.Capabilities = pPrimarySite->capabilities;
3475
3476 /* SSID */
3477 os_memoryZero(pSiteMgr->hOs, &(primaryBssid->Ssid.Ssid), MAX_SSID_LEN);
3478 if (pPrimarySite->ssid.len > MAX_SSID_LEN)
3479 {
3480 pPrimarySite->ssid.len = MAX_SSID_LEN;
3481 }
3482 os_memoryCopy(pSiteMgr->hOs, (void *)primaryBssid->Ssid.Ssid, (void *)&(pPrimarySite->ssid.ssidString), pPrimarySite->ssid.len);
3483 primaryBssid->Ssid.SsidLength = pPrimarySite->ssid.len;
3484
3485 /* privacy */
3486 primaryBssid->Privacy = pPrimarySite->privacy;
3487
3488 /* RSSI */
3489 primaryBssid->Rssi = pPrimarySite->rssi;
3490
3491 /* NetworkTypeInUse & SupportedRates */
3492 /* SupportedRates */
3493 os_memoryZero(pSiteMgr->hOs, (void *)primaryBssid->SupportedRates, sizeof(OS_802_11_RATES_EX));
3494
3495 bitMapToNetworkStringRates(pPrimarySite->rateMask.supportedRateMask,
3496 pPrimarySite->rateMask.basicRateMask,
3497 (UINT8 *)primaryBssid->SupportedRates,
3498 &len, &firstOFDMloc);
3499
3500 /* set network type acording to band and rates */
3501 if (pPrimarySite->channel <= SITE_MGR_CHANNEL_B_G_MAX)
3502 {
3503 if (firstOFDMloc == len)
3504 {
3505 primaryBssid->NetworkTypeInUse = os802_11DS;
3506 } else {
3507 primaryBssid->NetworkTypeInUse = os802_11OFDM24;
3508 }
3509 } else {
3510 primaryBssid->NetworkTypeInUse = os802_11OFDM5;
3511 }
3512
3513 /* Configuration */
3514 primaryBssid->Configuration.Length = sizeof(OS_802_11_CONFIGURATION);
3515 primaryBssid->Configuration.BeaconPeriod = pPrimarySite->beaconInterval;
3516 primaryBssid->Configuration.ATIMWindow = pPrimarySite->atimWindow;
3517 primaryBssid->Configuration.Union.channel = Chan2Freq(pPrimarySite->channel);
3518
3519 primaryBssid->Configuration.FHConfig.Length = sizeof(OS_802_11_CONFIGURATION_FH);
3520 primaryBssid->Configuration.FHConfig.DwellTime = pPrimarySite->FHParams.dwellTime;
3521 primaryBssid->Configuration.FHConfig.HopPattern = pPrimarySite->FHParams.hopPattern;
3522 primaryBssid->Configuration.FHConfig.HopSet = pPrimarySite->FHParams.hopSet;
3523
3524 /* InfrastructureMode */
3525 if (pPrimarySite->bssType == BSS_INDEPENDENT)
3526 primaryBssid->InfrastructureMode = os802_11IBSS;
3527 else
3528 primaryBssid->InfrastructureMode = os802_11Infrastructure;
3529
3530
3531
3532 primaryBssid->IELength = 0;
3533
3534 /* copy fixed IEs from site entry */
3535 pFixedIes = (OS_802_11_FIXED_IEs*)&primaryBssid->IEs[primaryBssid->IELength];
3536 os_memoryCopy(pSiteMgr->hOs, (void *)pFixedIes->TimeStamp, (void *)&pPrimarySite->localTimeStamp, sizeof(pPrimarySite->localTimeStamp));
3537 pFixedIes->BeaconInterval = pPrimarySite->beaconInterval;
3538 pFixedIes->Capabilities = pPrimarySite->capabilities;
3539 primaryBssid->IELength += sizeof(OS_802_11_FIXED_IEs);
3540 pVarIes = (OS_802_11_VARIABLE_IEs*)&primaryBssid->IEs[primaryBssid->IELength];
3541
3542 /* Coppy all variable IEs */
3543 WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
3544 ("Coppy all variable beaconLength=%d, IELength=%d\n",
3545 pPrimarySite->beaconLength, primaryBssid->IELength));
3546 WLAN_REPORT_HEX_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
3547 pPrimarySite->beaconBuffer, pPrimarySite->beaconLength);
3548
3549 os_memoryCopy(pSiteMgr->hOs, pVarIes, pPrimarySite->beaconBuffer, pPrimarySite->beaconLength);
3550
3551 primaryBssid->IELength += pPrimarySite->beaconLength;
3552
3553
3554 primaryBssid->Length = sizeof(OS_802_11_BSSID_EX) + primaryBssid->IELength - 1;
3555
3556 WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
3557 ("BSSID MAC = %x-%x-%x-%x-%x-%x\n",
3558 primaryBssid->MacAddress[0], primaryBssid->MacAddress[1], primaryBssid->MacAddress[2],
3559 primaryBssid->MacAddress[3], primaryBssid->MacAddress[4], primaryBssid->MacAddress[5]));
3560
3561
3562 WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
3563 ("primaryBssid is\n"));
3564 WLAN_REPORT_HEX_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
3565 (UINT8*)primaryBssid, primaryBssid->Length);
3566
3567
3568 WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
3569 ("Exiting getBssidList, length =%d, IELength=%d \n",
3570 primaryBssid->Length,
3571 primaryBssid->IELength));
3572
3573 *pLength = primaryBssid->Length;
3574
3575 return OK;
3576 }
3577
3578 /***********************************************************************
3579 * siteMgr_printPrimarySiteDesc
3580 ***********************************************************************
3581 DESCRIPTION: Called by the OS abstraction layer in order to get the primary site description
3582
3583 INPUT: pSiteMgr - site mgr handle.
3584 supplyExtendedInfo - If OS_802_11_BSSID_EX structure should be used (extended info)
3585 (Assuming that if this function is called with TRUE, enough memory was allocated to hold the extended info)
3586
3587 OUTPUT: pPrimarySiteDesc - Primary site description pointer
3588
3589 RETURN:
3590
3591 ************************************************************************/
siteMgr_printPrimarySiteDesc(TI_HANDLE hSiteMgr)3592 void siteMgr_printPrimarySiteDesc(TI_HANDLE hSiteMgr )
3593 {
3594 siteMgr_t *pSiteMgr = (siteMgr_t*) hSiteMgr;
3595 #ifdef REPORT_LOG
3596 siteEntry_t *pPrimarySite = pSiteMgr->pSitesMgmtParams->pPrimarySite;
3597 macAddress_t *bssid = &pPrimarySite->bssid;
3598 #endif
3599
3600 WLAN_REPORT_INFORMATION( pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
3601 ("-- SSID = %s \n",pPrimarySite->ssid.ssidString) );
3602 WLAN_REPORT_INFORMATION( pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
3603 ("-- BSSID = %02X-%02X-%02X-%02X-%02X-%02X\n",
3604 bssid->addr[0], bssid->addr[1], bssid->addr[2],
3605 bssid->addr[3], bssid->addr[4], bssid->addr[5]) );
3606 }
3607
3608 /***********************************************************************
3609 * getPrimarySiteDesc
3610 ***********************************************************************
3611 DESCRIPTION: Called by the OS abstraction layer in order to get the primary site description
3612
3613 INPUT: pSiteMgr - site mgr handle.
3614 supplyExtendedInfo - If OS_802_11_BSSID_EX structure should be used (extended info)
3615 (Assuming that if this function is called with TRUE, enough memory was allocated to hold the extended info)
3616
3617 OUTPUT: pPrimarySiteDesc - Primary site description pointer
3618
3619 RETURN:
3620
3621 ************************************************************************/
getPrimarySiteDesc(siteMgr_t * pSiteMgr,OS_802_11_BSSID * pPrimarySiteDesc,BOOL supplyExtendedInfo)3622 static void getPrimarySiteDesc(siteMgr_t *pSiteMgr, OS_802_11_BSSID *pPrimarySiteDesc, BOOL supplyExtendedInfo)
3623 {
3624 siteEntry_t *pPrimarySite = pSiteMgr->pSitesMgmtParams->pPrimarySite;
3625 OS_802_11_BSSID_EX *pExPrimarySiteDesc = (OS_802_11_BSSID_EX *) pPrimarySiteDesc;
3626 UINT32 len, firstOFDMloc = 0;
3627 OS_802_11_FIXED_IEs *pFixedIes;
3628 OS_802_11_VARIABLE_IEs *pVarIes;
3629 UINT8 rsnIeLength,index;
3630 OS_802_11_RATES_EX SupportedRates;
3631
3632
3633 if (pPrimarySiteDesc == NULL)
3634 {
3635 return;
3636 }
3637 if (pPrimarySite == NULL)
3638 {
3639 os_memoryZero(pSiteMgr->hOs, pPrimarySiteDesc, sizeof(OS_802_11_BSSID));
3640 return;
3641 }
3642
3643 WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
3644 ("getPrimarySiteDesc - enter\n"));
3645
3646
3647 /* If an "extended" request has been made - update the length accordingly */
3648 if (supplyExtendedInfo == FALSE)
3649 pPrimarySiteDesc->Length = sizeof(OS_802_11_BSSID);
3650 else
3651 pPrimarySiteDesc->Length = sizeof(OS_802_11_BSSID_EX);
3652
3653 /* MacAddress */
3654 os_memoryCopy(pSiteMgr->hOs, (void *)pPrimarySiteDesc->MacAddress, (void *)&(pPrimarySite->bssid.addr), MAC_ADDR_LEN);
3655
3656 /* Capabilities */
3657 pPrimarySiteDesc->Union.Capabilities = pPrimarySite->capabilities;
3658
3659 /* SSID */
3660 os_memoryCopy(pSiteMgr->hOs, (void *)&(pPrimarySiteDesc->Ssid.Ssid[0]), (void *)&(pPrimarySite->ssid.ssidString[0]), pPrimarySite->ssid.len);
3661 pPrimarySiteDesc->Ssid.SsidLength = pPrimarySite->ssid.len;
3662
3663 /* privacy */
3664 pPrimarySiteDesc->Privacy = pPrimarySite->privacy;
3665
3666 /* RSSI */
3667
3668 pPrimarySiteDesc->Rssi = pPrimarySite->rssi;
3669
3670 bitMapToNetworkStringRates(pPrimarySite->rateMask.supportedRateMask,
3671 pPrimarySite->rateMask.basicRateMask,
3672 &SupportedRates[0],
3673 &len, &firstOFDMloc);
3674
3675 /* set network type acording to band and rates */
3676 if (pPrimarySite->channel <= SITE_MGR_CHANNEL_B_G_MAX)
3677 {
3678 if (firstOFDMloc == len)
3679 {
3680 pPrimarySiteDesc->NetworkTypeInUse = os802_11DS;
3681 } else {
3682 pPrimarySiteDesc->NetworkTypeInUse = os802_11OFDM24;
3683 }
3684 } else {
3685 pPrimarySiteDesc->NetworkTypeInUse = os802_11OFDM5;
3686 }
3687
3688
3689 pPrimarySiteDesc->Configuration.Length = sizeof(OS_802_11_CONFIGURATION);
3690 pPrimarySiteDesc->Configuration.BeaconPeriod = pPrimarySite->beaconInterval;
3691 pPrimarySiteDesc->Configuration.ATIMWindow = pPrimarySite->atimWindow;
3692 pPrimarySiteDesc->Configuration.Union.channel = pPrimarySite->channel;
3693
3694 pPrimarySiteDesc->Configuration.FHConfig.Length = sizeof(OS_802_11_CONFIGURATION_FH);
3695 pPrimarySiteDesc->Configuration.FHConfig.DwellTime = pPrimarySite->FHParams.dwellTime;
3696 pPrimarySiteDesc->Configuration.FHConfig.HopPattern = pPrimarySite->FHParams.hopPattern;
3697 pPrimarySiteDesc->Configuration.FHConfig.HopSet = pPrimarySite->FHParams.hopSet;
3698
3699 if (pPrimarySite->bssType == BSS_INDEPENDENT)
3700 pPrimarySiteDesc->InfrastructureMode = os802_11IBSS;
3701 else
3702 pPrimarySiteDesc->InfrastructureMode = os802_11Infrastructure;
3703
3704 /* SupportedRates */
3705 if (supplyExtendedInfo == FALSE)
3706 os_memoryZero(pSiteMgr->hOs, (void *)pPrimarySiteDesc->SupportedRates, sizeof(OS_802_11_RATES));
3707 else
3708 os_memoryZero(pSiteMgr->hOs, (void *)pPrimarySiteDesc->SupportedRates, sizeof(OS_802_11_RATES_EX));
3709
3710
3711 if (supplyExtendedInfo == FALSE)
3712 os_memoryCopy(pSiteMgr->hOs, (void *)pPrimarySiteDesc->SupportedRates, (void *)SupportedRates, sizeof(OS_802_11_RATES));
3713 else
3714 os_memoryCopy(pSiteMgr->hOs, (void *)pPrimarySiteDesc->SupportedRates, (void *)SupportedRates, sizeof(OS_802_11_RATES_EX));
3715
3716
3717 if (supplyExtendedInfo == TRUE)
3718 {
3719 pExPrimarySiteDesc->IELength = 0;
3720
3721 /* copy fixed IEs from site entry */
3722 pFixedIes = (OS_802_11_FIXED_IEs*)&pExPrimarySiteDesc->IEs[pExPrimarySiteDesc->IELength];
3723 os_memoryCopy(pSiteMgr->hOs, (void *)pFixedIes->TimeStamp, (void *)&pPrimarySite->localTimeStamp, sizeof(pPrimarySite->localTimeStamp));
3724 pFixedIes->BeaconInterval = pPrimarySite->beaconInterval;
3725 pFixedIes->Capabilities = pPrimarySite->capabilities;
3726 pExPrimarySiteDesc->IELength += sizeof(OS_802_11_FIXED_IEs);
3727
3728 /* copy variable IEs */
3729 /* copy SSID */
3730 pVarIes = (OS_802_11_VARIABLE_IEs*)&pExPrimarySiteDesc->IEs[pExPrimarySiteDesc->IELength];
3731 pVarIes->ElementID = SSID_IE_ID;
3732 pVarIes->Length = pPrimarySite->ssid.len;
3733 os_memoryCopy(pSiteMgr->hOs, (void *)pVarIes->data, (void *)pPrimarySite->ssid.ssidString, pPrimarySite->ssid.len);
3734 pExPrimarySiteDesc->IELength += (pVarIes->Length + 2);
3735
3736 /* copy RATES */
3737
3738 pVarIes = (OS_802_11_VARIABLE_IEs*)&pExPrimarySiteDesc->IEs[pExPrimarySiteDesc->IELength];
3739 pVarIes->ElementID = SUPPORTED_RATES_IE_ID;
3740 bitMapToNetworkStringRates(pPrimarySite->rateMask.supportedRateMask, pPrimarySite->rateMask.basicRateMask,
3741 (UINT8 *)pVarIes->data, &len, &firstOFDMloc);
3742 pVarIes->Length = len;
3743 pExPrimarySiteDesc->IELength += (pVarIes->Length + 2);
3744
3745 /* copy FH */
3746 pVarIes = (OS_802_11_VARIABLE_IEs*)&pExPrimarySiteDesc->IEs[pExPrimarySiteDesc->IELength];
3747 pVarIes->ElementID = FH_PARAMETER_SET_IE_ID;
3748 pVarIes->Length = DOT11_FH_PARAMS_ELE_LEN;
3749 os_memoryCopy(pSiteMgr->hOs, (void *)pVarIes->data, (void *)&pPrimarySite->FHParams.dwellTime, sizeof(pPrimarySite->FHParams.dwellTime));
3750 os_memoryCopy(pSiteMgr->hOs, (void *)&pVarIes->data[2], (void *)&pPrimarySite->FHParams.hopSet, sizeof(pPrimarySite->FHParams.hopSet));
3751 os_memoryCopy(pSiteMgr->hOs, (void *)&pVarIes->data[3], (void *)&pPrimarySite->FHParams.hopPattern, sizeof(pPrimarySite->FHParams.hopPattern));
3752 pVarIes->data[4] = 1;
3753 pExPrimarySiteDesc->IELength += (pVarIes->Length + 2);
3754
3755 /* copy DS */
3756 pVarIes = (OS_802_11_VARIABLE_IEs*)&pExPrimarySiteDesc->IEs[pExPrimarySiteDesc->IELength];
3757 pVarIes->ElementID = DS_PARAMETER_SET_IE_ID;
3758 pVarIes->Length = DOT11_DS_PARAMS_ELE_LEN;
3759 os_memoryCopy(pSiteMgr->hOs, (void *)pVarIes->data, (void *)&pPrimarySite->channel, DOT11_DS_PARAMS_ELE_LEN);
3760 pExPrimarySiteDesc->IELength += (pVarIes->Length + 2);
3761
3762 /* copy RSN information elements */
3763 rsnIeLength = 0;
3764 for (index=0; index<MAX_RSN_IE && pPrimarySite->pRsnIe[index].hdr.eleLen>0; index++)
3765 {
3766 pVarIes = (OS_802_11_VARIABLE_IEs*)&pExPrimarySiteDesc->IEs[pExPrimarySiteDesc->IELength+rsnIeLength];
3767 pVarIes->ElementID = pPrimarySite->pRsnIe[index].hdr.eleId;
3768 pVarIes->Length = pPrimarySite->pRsnIe[index].hdr.eleLen;
3769 os_memoryCopy(pSiteMgr->hOs, (void *)pVarIes->data, (void *)pPrimarySite->pRsnIe[index].rsnIeData, pPrimarySite->pRsnIe[index].hdr.eleLen);
3770 rsnIeLength += pPrimarySite->pRsnIe[index].hdr.eleLen+2;
3771 WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
3772 ("RSN IE ID=%d, Length=%x\n", pVarIes->ElementID, pVarIes->Length));
3773
3774 WLAN_REPORT_HEX_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, (UINT8 *)pVarIes->data,pVarIes->Length);
3775 }
3776
3777 pExPrimarySiteDesc->IELength += pPrimarySite->rsnIeLen;
3778
3779 pExPrimarySiteDesc->Length = sizeof(OS_802_11_BSSID_EX) + pExPrimarySiteDesc->IELength - 1;
3780
3781 WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
3782 ("BSSID MAC = %x-%x-%x-%x-%x-%x\n",
3783 pExPrimarySiteDesc->MacAddress[0], pExPrimarySiteDesc->MacAddress[1], pExPrimarySiteDesc->MacAddress[2],
3784 pExPrimarySiteDesc->MacAddress[3], pExPrimarySiteDesc->MacAddress[4], pExPrimarySiteDesc->MacAddress[5]));
3785
3786 WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
3787 ("pExPrimarySiteDesc length before alignment = %d\n", pExPrimarySiteDesc->Length));
3788
3789 /* make sure length is 4 bytes aligned */
3790 if (pExPrimarySiteDesc->Length % 4)
3791 {
3792 pExPrimarySiteDesc->Length += (4 - (pExPrimarySiteDesc->Length % 4));
3793 }
3794
3795 WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
3796 ("pExPrimarySiteDesc length after alignment = %d\n", pExPrimarySiteDesc->Length));
3797
3798 }
3799
3800 }
3801
3802
3803 /***********************************************************************
3804 * translateRateMaskToValue
3805 ***********************************************************************
3806 DESCRIPTION: Called by the function 'siteMgr_config()' in order to translate the rate mask read
3807 from registry to rate value
3808
3809 INPUT: pSiteMgr - site mgr handle.
3810 rateMask - Rate mask
3811
3812 OUTPUT: The rate after the translation
3813
3814 RETURN:
3815
3816 ************************************************************************/
translateRateMaskToValue(siteMgr_t * pSiteMgr,UINT32 rateMask)3817 static rate_e translateRateMaskToValue(siteMgr_t *pSiteMgr, UINT32 rateMask)
3818 {
3819 if (rateMask & DRV_RATE_MASK_54_OFDM)
3820 return DRV_RATE_54M;
3821 if (rateMask & DRV_RATE_MASK_48_OFDM)
3822 return DRV_RATE_48M;
3823 if (rateMask & DRV_RATE_MASK_36_OFDM)
3824 return DRV_RATE_36M;
3825 if (rateMask & DRV_RATE_MASK_24_OFDM)
3826 return DRV_RATE_24M;
3827 if (rateMask & DRV_RATE_MASK_22_PBCC)
3828 return DRV_RATE_22M;
3829 if (rateMask & DRV_RATE_MASK_18_OFDM)
3830 return DRV_RATE_18M;
3831 if (rateMask & DRV_RATE_MASK_12_OFDM)
3832 return DRV_RATE_12M;
3833 if (rateMask & DRV_RATE_MASK_11_CCK)
3834 return DRV_RATE_11M;
3835 if (rateMask & DRV_RATE_MASK_9_OFDM)
3836 return DRV_RATE_9M;
3837 if (rateMask & DRV_RATE_MASK_6_OFDM)
3838 return DRV_RATE_6M;
3839 if (rateMask & DRV_RATE_MASK_5_5_CCK)
3840 return DRV_RATE_5_5M;
3841 if (rateMask & DRV_RATE_MASK_2_BARKER)
3842 return DRV_RATE_2M;
3843 if (rateMask & DRV_RATE_MASK_1_BARKER)
3844 return DRV_RATE_1M;
3845
3846 WLAN_REPORT_WARNING(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("Translate rate mask to value, mask is 0x%X\n", rateMask));
3847 if(pSiteMgr->siteMgrOperationalMode != DOT11_A_MODE)
3848 return DRV_RATE_1M;
3849 else
3850 return DRV_RATE_6M;
3851 }
3852
3853
3854 /***********************************************************************
3855 * getSupportedRateSet
3856 ***********************************************************************
3857 DESCRIPTION: Called by the function 'siteMgr_getParam()' in order to get the supported rate set
3858 Build an array of network rates based on the max active & max basic rates
3859
3860 INPUT: pSiteMgr - site mgr handle.
3861
3862 OUTPUT: pRatesSet - The array built
3863
3864 RETURN:
3865
3866 ************************************************************************/
getSupportedRateSet(siteMgr_t * pSiteMgr,rates_t * pRatesSet)3867 static void getSupportedRateSet(siteMgr_t *pSiteMgr, rates_t *pRatesSet)
3868 {
3869 UINT32 dontCareParam;
3870 UINT32 len = 0;
3871
3872 bitMapToNetworkStringRates(pSiteMgr->pDesiredParams->siteMgrRegstrySuppRateMask,
3873 pSiteMgr->pDesiredParams->siteMgrRegstryBasicRateMask,
3874 (UINT8 *)pRatesSet->ratesString, &len, &dontCareParam);
3875
3876 pRatesSet->len = (UINT8) len;
3877 }
3878
3879 /***********************************************************************
3880 * setSupportedRateSet
3881 ***********************************************************************
3882 DESCRIPTION: Called by the function 'siteMgr_setParam()' in order to set the supported rate set
3883 Go over the input array and set the max active & max basic rates. (after translation from network
3884 rates to host rates ofcourse)
3885 If max basic rate is bigger than the mac active one, print an error.
3886 If the basic or active rate are different than the ones already stored by the site manager,
3887 it returns RE_SCAN_NEEDED
3888
3889 INPUT: pSiteMgr - site mgr handle.
3890 pRatesSet - The rates array received
3891
3892 OUTPUT:
3893
3894 RETURN: RE_SCAN_NEEDED if re scan is needed, OK on success
3895
3896 ************************************************************************/
setSupportedRateSet(siteMgr_t * pSiteMgr,rates_t * pRatesSet)3897 static TI_STATUS setSupportedRateSet(siteMgr_t *pSiteMgr, rates_t *pRatesSet)
3898 {
3899 UINT8 i,j, drvRate;
3900 rate_e maxActiveRate = (rate_e)0, maxBasicRate = (rate_e)0;
3901 UINT32 suppBitMap, basicBitMap;
3902 static rate_e basicRates_G[] = {DRV_RATE_1M,DRV_RATE_2M,DRV_RATE_5_5M,DRV_RATE_11M};
3903 static rate_e basicRates_A[] = {DRV_RATE_6M,DRV_RATE_12M,DRV_RATE_24M};
3904 rate_e* currentBasicRates;
3905 UINT32 currentBasicRatesLength;
3906
3907 #ifndef NET_BASIC_MASK
3908 #define NET_BASIC_MASK 0x80 /* defined in common/src/utils/utils.c */
3909 #endif
3910
3911 if(pSiteMgr->siteMgrOperationalMode == DOT11_A_MODE)
3912 {
3913 currentBasicRates = &basicRates_A[0];
3914 currentBasicRatesLength = sizeof(basicRates_A) / sizeof(basicRates_A[0]);
3915 }
3916 else
3917 {
3918 currentBasicRates = &basicRates_G[0];
3919 currentBasicRatesLength = sizeof(basicRates_G) / sizeof(basicRates_G[0]);
3920 }
3921
3922 /* Basic rates must be supported. If one of 1M,2M,5.5M,11M is not supported fail.*/
3923
3924 for (j=0;j < currentBasicRatesLength;j++)
3925 {
3926 for (i = 0; i < pRatesSet->len; i++)
3927 {
3928 drvRate = utilityToHostRate(pRatesSet->ratesString[i]);
3929 if ((drvRate & ( NET_BASIC_MASK-1)) == currentBasicRates[j])
3930 break;
3931 }
3932 /* not all the basic rates are supported! Failure*/
3933 if (i == pRatesSet->len)
3934 {
3935 WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("Rates set must contain the basic set! Failing\n"));
3936 return PARAM_VALUE_NOT_VALID;
3937 }
3938 }
3939
3940 for (i = 0; i < pRatesSet->len; i++)
3941 {
3942 drvRate = utilityToHostRate(pRatesSet->ratesString[i]);
3943 if(pSiteMgr->siteMgrOperationalMode == DOT11_A_MODE)
3944 {
3945 if(drvRate < DRV_RATE_6M)
3946 {
3947 WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("Notice, the driver configured in 11a mode, but CCK rate appears\n"));
3948 return PARAM_VALUE_NOT_VALID;
3949 }
3950 }
3951 else if(pSiteMgr->siteMgrOperationalMode == DOT11_B_MODE)
3952 {
3953 if(drvRate >= DRV_RATE_6M)
3954 {
3955 WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("Notice, the driver configured in 11b mode, but OFDM rate appears\n"));
3956 return PARAM_VALUE_NOT_VALID;
3957 }
3958 }
3959 maxActiveRate = MAX((rate_e)drvRate, maxActiveRate);
3960 }
3961
3962 for (i = 0; i < pRatesSet->len; i++)
3963 {
3964 if (IS_BASIC_RATE(pRatesSet->ratesString[i]))
3965 maxBasicRate = MAX(utilityToHostRate(pRatesSet->ratesString[i]), maxBasicRate);
3966 }
3967
3968 /* If the basic rate is bigger than the supported one, we print an error */
3969 if (pSiteMgr->pDesiredParams->siteMgrDesiredRatePair.maxBasic > pSiteMgr->pDesiredParams->siteMgrDesiredRatePair.maxActive)
3970 {
3971 WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("Notice, the rates configuration is invalid, basic rate is bigger than supported, Max Basic: %d Max Supported: %d\n", pSiteMgr->pDesiredParams->siteMgrDesiredRatePair.maxBasic, pSiteMgr->pDesiredParams->siteMgrDesiredRatePair.maxActive));
3972 return PARAM_VALUE_NOT_VALID;
3973 }
3974
3975 pSiteMgr->pDesiredParams->siteMgrDesiredRatePair.maxActive = maxActiveRate;
3976 pSiteMgr->pDesiredParams->siteMgrDesiredRatePair.maxBasic = maxBasicRate;
3977
3978
3979 /* configure desired modulation */
3980 if(maxActiveRate == DRV_RATE_22M)
3981 pSiteMgr->pDesiredParams->siteMgrDesiredModulationType = DRV_MODULATION_PBCC;
3982 else if(maxActiveRate < DRV_RATE_22M)
3983 pSiteMgr->pDesiredParams->siteMgrDesiredModulationType = DRV_MODULATION_CCK;
3984 else
3985 pSiteMgr->pDesiredParams->siteMgrDesiredModulationType = DRV_MODULATION_OFDM;
3986
3987
3988 networkStringToBitMapSuppRates(&suppBitMap,
3989 (UINT8 *)pRatesSet->ratesString,
3990 pRatesSet->len);
3991
3992 networkStringToBitMapBasicRates(&basicBitMap,
3993 (UINT8 *)pRatesSet->ratesString,
3994 pRatesSet->len);
3995
3996 if((pSiteMgr->pDesiredParams->siteMgrRegstryBasicRateMask != basicBitMap) ||
3997 (pSiteMgr->pDesiredParams->siteMgrRegstrySuppRateMask != suppBitMap))
3998 {
3999 pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.supportedRateMask = suppBitMap;
4000 pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.basicRateMask = basicBitMap;
4001 pSiteMgr->pDesiredParams->siteMgrRegstryBasicRateMask = basicBitMap;
4002 pSiteMgr->pDesiredParams->siteMgrRegstrySuppRateMask = suppBitMap;
4003 /* Initialize Mutual Rates Matching */
4004 pSiteMgr->pDesiredParams->siteMgrMatchedBasicRateMask = pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.basicRateMask;
4005 pSiteMgr->pDesiredParams->siteMgrMatchedSuppRateMask = pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.supportedRateMask;
4006 pSiteMgr->pDesiredParams->siteMgrMatchedMaxBasicRate = getMaxRatefromBitmap(pSiteMgr->pDesiredParams->siteMgrMatchedBasicRateMask);
4007 pSiteMgr->pDesiredParams->siteMgrMatchedMaxActiveRate = getMaxRatefromBitmap(pSiteMgr->pDesiredParams->siteMgrMatchedSuppRateMask);
4008
4009 return RE_SCAN_NEEDED;
4010 }
4011
4012 return OK;
4013 }
4014
4015 /***********************************************************************
4016 * pbccAlgorithm
4017 ***********************************************************************
4018 DESCRIPTION: Called by the following functions:
4019 - systemConfig(), in the system configuration phase after the selection
4020 - siteMgr_updateSite(), in a case of a primary site update & if a PBCC algorithm
4021 is needed to be performed
4022 Performs the PBCC algorithm
4023
4024
4025 INPUT: hSiteMgr - site mgr handle.
4026
4027 OUTPUT:
4028
4029 RETURN: OK on always
4030
4031 ************************************************************************/
pbccAlgorithm(TI_HANDLE hSiteMgr)4032 TI_STATUS pbccAlgorithm(TI_HANDLE hSiteMgr)
4033 {
4034 siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
4035 paramInfo_t param;
4036 siteEntry_t *pPrimarySite = pSiteMgr->pSitesMgmtParams->pPrimarySite;
4037 UINT32 bitMap = 0;
4038 BOOL desiredTxRateSupported = FALSE;
4039 UINT32 supportedRateMask ;
4040
4041
4042 /* First set the data modulation. */
4043 param.paramType = CTRL_DATA_CURRENT_MODULATION_TYPE_PARAM; /* Current Modulation Type */
4044 param.content.ctrlDataCurrentModulationType = pSiteMgr->currentDataModulation;
4045 ctrlData_setParam(pSiteMgr->hCtrlData, ¶m);
4046
4047 if (pPrimarySite->channel == SPECIAL_BG_CHANNEL)
4048 supportedRateMask = (getSupportedRateMaskForSpecialBGchannel() & pSiteMgr->pDesiredParams->siteMgrMatchedSuppRateMask) ;
4049 else
4050 supportedRateMask = pSiteMgr->pDesiredParams->siteMgrMatchedSuppRateMask ;
4051
4052 validateDesiredTxRate(pSiteMgr->pDesiredParams->siteMgrCurrentDesiredTxRate,
4053 pSiteMgr->currentDataModulation,
4054 supportedRateMask,
4055 &bitMap,
4056 &desiredTxRateSupported);
4057
4058 if(desiredTxRateSupported == FALSE)
4059 {
4060 WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("Notice, the rates configuration is invalid, desired tx rate is not supported => switched to auto"));
4061 pSiteMgr->pDesiredParams->siteMgrCurrentDesiredTxRate = DRV_RATE_AUTO;
4062 }
4063
4064 param.paramType = CTRL_DATA_CURRENT_SUPPORTED_RATE_MASK_PARAM;
4065 param.content.ctrlDataCurrentRateMask = supportedRateMask;
4066 /* clear the 22Mbps bit in case the PBCC is not allowed */
4067 if(pSiteMgr->currentDataModulation != DRV_MODULATION_PBCC &&
4068 pSiteMgr->currentDataModulation != DRV_MODULATION_OFDM)
4069 param.content.ctrlDataCurrentRateMask &= ~DRV_RATE_MASK_22_PBCC;
4070 ctrlData_setParam(pSiteMgr->hCtrlData, ¶m);
4071
4072 param.paramType = CTRL_DATA_CURRENT_ACTIVE_RATE_PARAM;
4073
4074 param.content.ctrlDataCurrentActiveRate = pSiteMgr->pDesiredParams->siteMgrCurrentDesiredTxRate;
4075 ctrlData_setParam(pSiteMgr->hCtrlData, ¶m);
4076
4077 /*
4078 * NOTE: THIS MUST BE AFTER SETTING PREAMBLE TYPE
4079 */
4080
4081 if (pSiteMgr->pDesiredParams->siteMgrCurrentDesiredTxRate == DRV_RATE_AUTO)
4082 {
4083 param.paramType = CTRL_DATA_RATE_CONTROL_ENABLE_PARAM;
4084 param.content.ctrlDataRateControlEnable = TRUE;
4085 ctrlData_setParam(pSiteMgr->hCtrlData, ¶m);
4086 }
4087 else
4088 {
4089 param.paramType = CTRL_DATA_RATE_CONTROL_ENABLE_PARAM;
4090 param.content.ctrlDataRateControlEnable = FALSE;
4091 ctrlData_setParam(pSiteMgr->hCtrlData, ¶m);
4092 }
4093
4094 return OK;
4095 }
4096
4097 /***********************************************************************
4098 * validateDesiredTxRate
4099 ***********************************************************************
4100 DESCRIPTION: Called by the following functions:
4101 - pbccAlgorithm()
4102
4103
4104 INPUT: desiredTxRate - configured desired tx rate.
4105 desiredModulation - configured desired tx modulation.
4106 suppRates - rates, supported by both STA and primary site.
4107
4108 OUTPUT: bitMap - rates bit map to be set to the ctrlData module
4109 txDesiredRateSupported - indication whether the desired tx rate supported
4110 by both STA and the primary site.
4111 RETURN: OK on always
4112
4113 ************************************************************************/
validateDesiredTxRate(rate_e desiredTxRate,modulationType_e desiredModulation,UINT32 suppRates,UINT32 * bitMap,BOOL * txDesiredRateSupported)4114 void validateDesiredTxRate(rate_e desiredTxRate, modulationType_e desiredModulation,
4115 UINT32 suppRates, UINT32 *bitMap, BOOL *txDesiredRateSupported)
4116 {
4117
4118 UINT32 maskTable[DRV_RATE_MAX+1] =
4119 {DRV_RATE_MASK_AUTO,
4120 DRV_RATE_MASK_1_BARKER,
4121 DRV_RATE_MASK_2_BARKER,
4122 DRV_RATE_MASK_5_5_CCK,
4123 DRV_RATE_MASK_11_CCK,
4124 DRV_RATE_MASK_22_PBCC
4125 ,DRV_RATE_MASK_6_OFDM,
4126 DRV_RATE_MASK_9_OFDM,
4127 DRV_RATE_MASK_12_OFDM,
4128 DRV_RATE_MASK_18_OFDM,
4129 DRV_RATE_MASK_24_OFDM,
4130 DRV_RATE_MASK_36_OFDM,
4131 DRV_RATE_MASK_48_OFDM,
4132 DRV_RATE_MASK_54_OFDM
4133 };
4134
4135 if(desiredModulation != DRV_MODULATION_PBCC)
4136 {
4137 if(desiredTxRate == DRV_RATE_22M)
4138 *bitMap = DRV_RATE_MASK_11_CCK;
4139 else
4140 *bitMap = maskTable[desiredTxRate];
4141 }
4142 else
4143 *bitMap = maskTable[desiredTxRate];
4144
4145 if((suppRates & maskTable[desiredTxRate]) || (desiredTxRate == DRV_RATE_AUTO))
4146 *txDesiredRateSupported = TRUE;
4147 else
4148 *txDesiredRateSupported = FALSE;
4149 }
4150
4151 /***********************************************************************
4152 * siteMgr_assocReport
4153 ***********************************************************************
4154 DESCRIPTION: Called by the following functions:
4155 - assoc_recv()
4156
4157
4158 INPUT: hSiteMgr - siteMgr handle.
4159 capabilities - assoc rsp capabilities field.
4160 bCiscoAP - whether we are connected to a Cisco AP. Used for Tx Power Control adjustment
4161 OUTPUT:
4162
4163 RETURN: OK on always
4164
4165 ************************************************************************/
siteMgr_assocReport(TI_HANDLE hSiteMgr,UINT16 capabilities,BOOL bCiscoAP)4166 TI_STATUS siteMgr_assocReport(TI_HANDLE hSiteMgr, UINT16 capabilities, BOOL bCiscoAP)
4167 {
4168 siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
4169 siteEntry_t *pPrimarySite = pSiteMgr->pSitesMgmtParams->pPrimarySite;
4170
4171 /* handle AP's preamble capability */
4172 pPrimarySite->preambleAssRspCap = ((capabilities >> CAP_PREAMBLE_SHIFT) & CAP_PREAMBLE_MASK) ? PREAMBLE_SHORT : PREAMBLE_LONG;
4173
4174 /*
4175 * Enable/Disable the ATx Power Control adjustment.
4176 * When we are connected to Cisco AP - TX Power Control adjustment is disabled.
4177 */
4178 pSiteMgr->bTempTxPowerEnabled = ( !bCiscoAP ) && ( pSiteMgr->pDesiredParams->TxPowerControlOn );
4179
4180 WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
4181 ("%s: Tx Power Control adjustment is %d\n",__FUNCTION__, pSiteMgr->bTempTxPowerEnabled));
4182
4183 return OK;
4184 }
4185
4186 /***********************************************************************
4187 * siteMgr_setWMEParamsSite
4188 ***********************************************************************
4189 DESCRIPTION: Set the WME params as received from the associated
4190 AP. The function is called by the QoS Mgr
4191 after receving association response succefully.
4192
4193 INPUT: hSiteMgr - SiteMgr handle.
4194
4195 OUTPUT: pDot11_WME_PARAM_t - pointer to the WME Param IE.
4196
4197 RETURN: OK on always
4198
4199 ************************************************************************/
siteMgr_setWMEParamsSite(TI_HANDLE hSiteMgr,dot11_WME_PARAM_t * pDot11_WME_PARAM)4200 TI_STATUS siteMgr_setWMEParamsSite(TI_HANDLE hSiteMgr,dot11_WME_PARAM_t *pDot11_WME_PARAM)
4201 {
4202 siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
4203 siteEntry_t *pPrimarySite = pSiteMgr->pSitesMgmtParams->pPrimarySite;
4204
4205 if( pPrimarySite == NULL )
4206 {
4207 return OK;
4208 }
4209
4210 if( pDot11_WME_PARAM == NULL )
4211 {
4212 pPrimarySite->WMESupported = FALSE;
4213 return OK;
4214 }
4215
4216 /* Update the WME params */
4217 os_memoryCopy(pSiteMgr->hOs,&pPrimarySite->WMEParameters,&pDot11_WME_PARAM->WME_ACParameteres,sizeof(ACParameters_t));
4218 pPrimarySite->lastWMEParameterCnt = (pDot11_WME_PARAM->ACInfoField & dot11_WME_ACINFO_MASK);
4219 WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,("$$$$$$ WME parameters were updates according to association response, cntSeq = %d\n",pPrimarySite->lastWMEParameterCnt));
4220
4221 return OK;
4222 }
4223
4224
4225 /***********************************************************************
4226 * siteMgr_getWMEParamsSite
4227 ***********************************************************************
4228 DESCRIPTION: Get the WME params as recieved from the associated
4229 AP. The function is called by the Qos Mgr in order
4230 to set all WME parameters to the core and Hal
4231
4232 INPUT: hSiteMgr - SiteMgr handle.
4233
4234 OUTPUT: pWME_ACParameters_t - pointer to the WME Param.
4235
4236 RETURN: OK if there are valid WME parameters , NOK otherwise.
4237
4238 ************************************************************************/
siteMgr_getWMEParamsSite(TI_HANDLE hSiteMgr,ACParameters_t ** pWME_ACParameters_t)4239 TI_STATUS siteMgr_getWMEParamsSite(TI_HANDLE hSiteMgr,ACParameters_t **pWME_ACParameters_t)
4240 {
4241 siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
4242 siteEntry_t *pPrimarySite = pSiteMgr->pSitesMgmtParams->pPrimarySite;
4243
4244 if(pPrimarySite->WMESupported == TRUE)
4245 {
4246 *pWME_ACParameters_t = &pPrimarySite->WMEParameters;
4247 return OK;
4248 }
4249 else
4250 {
4251 *pWME_ACParameters_t = NULL;
4252 return NOK;
4253 }
4254
4255 }
4256
4257
4258
4259 /***********************************************************************
4260 * calculateBssidListSize
4261 ***********************************************************************
4262 DESCRIPTION: Calculate the size of memory buffer required for BSSID
4263 List.
4264
4265
4266 INPUT: hSiteMgr - site mgr handle.
4267
4268 OUTPUT:
4269
4270 RETURN: OK on always
4271
4272 ************************************************************************/
calculateBssidListSize(siteMgr_t * pSiteMgr,UINT32 * pLength,BOOL allVarIes)4273 static TI_STATUS calculateBssidListSize(siteMgr_t *pSiteMgr, UINT32 *pLength, BOOL allVarIes)
4274 {
4275 UINT32 siteTableIndex, tableIndex;
4276 UINT32 length;
4277 siteEntry_t* pSiteEntry;
4278 siteTablesParams_t* currTable;
4279
4280 *pLength = sizeof(OS_802_11_BSSID_LIST_EX) - sizeof(OS_802_11_BSSID_EX);
4281
4282 currTable = pSiteMgr->pSitesMgmtParams->pCurrentSiteTable;
4283
4284 for (tableIndex = 0; tableIndex < NUM_OF_SITE_TABLE ; tableIndex++)
4285 {
4286 for (siteTableIndex = 0; siteTableIndex < currTable->maxNumOfSites; siteTableIndex++)
4287 {
4288 pSiteEntry = (siteEntry_t*)&currTable->siteTable[siteTableIndex];
4289
4290 if (pSiteEntry->siteType != SITE_NULL)
4291 {
4292 if (allVarIes)
4293 {
4294 length = sizeof(OS_802_11_BSSID_EX) + sizeof(OS_802_11_FIXED_IEs);
4295 if (pSiteEntry->probeRecv)
4296 {
4297 length += pSiteEntry->probeRespLength;
4298 }
4299 else
4300 {
4301 length += pSiteEntry->beaconLength;
4302 }
4303
4304 }
4305 else
4306 {
4307 length = (sizeof(OS_802_11_BSSID_EX) + sizeof(OS_802_11_FIXED_IEs) +
4308 (pSiteEntry->ssid.len + 2) + (MAX_SUPPORTED_RATES + 2) +
4309 (DOT11_FH_PARAMS_ELE_LEN + 2) + (DOT11_DS_PARAMS_ELE_LEN +2) +
4310 pSiteEntry->rsnIeLen);
4311 /* WME information element by alcel*/
4312 if (pSiteEntry->WMESupported)
4313 {
4314 /* length of element + header*/
4315 length += (DOT11_WME_ELE_LEN + 2);
4316 }
4317 }
4318
4319 /* make sure length is 4 bytes aligned */
4320 if (length % 4)
4321 {
4322 length += (4 - (length % 4));
4323 }
4324
4325 *pLength += length;
4326
4327 WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
4328 ("BSSID length =%d on table index %d \n", length, tableIndex));
4329
4330 }
4331 }
4332
4333
4334 if(pSiteMgr->pDesiredParams->siteMgrDesiredDot11Mode == DOT11_DUAL_MODE)
4335 {
4336 /* change site table */
4337 if(currTable == &pSiteMgr->pSitesMgmtParams->dot11BG_sitesTables)
4338 currTable = (siteTablesParams_t *)&pSiteMgr->pSitesMgmtParams->dot11A_sitesTables;
4339 else
4340 currTable = &pSiteMgr->pSitesMgmtParams->dot11BG_sitesTables;
4341 }
4342 else
4343 break;
4344
4345 }
4346
4347 return OK;
4348 }
4349
4350
4351
4352
4353
4354
4355
4356
4357 /***********************************************************************
4358 * siteMgr_setCurrentTable
4359 ***********************************************************************
4360 DESCRIPTION:
4361
4362 INPUT: hSiteMgr - SiteMgr handle.
4363
4364 OUTPUT:
4365
4366 RETURN:
4367
4368 ************************************************************************/
siteMgr_setCurrentTable(TI_HANDLE hSiteMgr,radioBand_e radioBand)4369 void siteMgr_setCurrentTable(TI_HANDLE hSiteMgr, radioBand_e radioBand)
4370 {
4371 siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
4372
4373 if(radioBand == RADIO_BAND_2_4_GHZ)
4374 pSiteMgr->pSitesMgmtParams->pCurrentSiteTable = &pSiteMgr->pSitesMgmtParams->dot11BG_sitesTables;
4375 else
4376 pSiteMgr->pSitesMgmtParams->pCurrentSiteTable = (siteTablesParams_t *)&pSiteMgr->pSitesMgmtParams->dot11A_sitesTables;
4377 }
4378
4379
4380
4381 /***********************************************************************
4382 * siteMgr_updateRates
4383 ***********************************************************************
4384 DESCRIPTION:
4385
4386 INPUT: hSiteMgr - SiteMgr handle.
4387
4388 OUTPUT:
4389
4390 RETURN:
4391
4392 ************************************************************************/
4393
siteMgr_updateRates(TI_HANDLE hSiteMgr,BOOL dot11a,BOOL updateToOS)4394 void siteMgr_updateRates(TI_HANDLE hSiteMgr, BOOL dot11a, BOOL updateToOS)
4395 {
4396 UINT32 statusData;
4397 rate_e txDesiredRate;
4398 UINT32 localSuppRateMask, localBasicRateMask;
4399
4400 siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
4401
4402 localSuppRateMask = pSiteMgr->pDesiredParams->siteMgrRegstrySuppRateMask;
4403 localBasicRateMask = pSiteMgr->pDesiredParams->siteMgrRegstryBasicRateMask;
4404
4405
4406 validateRatesVsBand(&localSuppRateMask, &localBasicRateMask, dot11a);
4407
4408 pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.basicRateMask = localBasicRateMask;
4409 pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.supportedRateMask = localSuppRateMask;
4410
4411 /* Initialize Mutual Rates Matching */
4412 pSiteMgr->pDesiredParams->siteMgrMatchedBasicRateMask = pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.basicRateMask;
4413 pSiteMgr->pDesiredParams->siteMgrMatchedSuppRateMask = pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.supportedRateMask;
4414 pSiteMgr->pDesiredParams->siteMgrMatchedMaxBasicRate = getMaxRatefromBitmap(pSiteMgr->pDesiredParams->siteMgrMatchedBasicRateMask);
4415 pSiteMgr->pDesiredParams->siteMgrMatchedMaxActiveRate = getMaxRatefromBitmap(pSiteMgr->pDesiredParams->siteMgrMatchedSuppRateMask);
4416
4417
4418 /*If we are in dual mode and we are only scanning A band we don't have to set the siteMgrCurrentDesiredTxRate.*/
4419 if (updateToOS == TRUE)
4420 {
4421 /* Validate that the masks and tx rate are OK */
4422 txDesiredRate = pSiteMgr->pDesiredParams->siteMgrRegstryDesiredTxRate;
4423
4424 validateRates((UINT32 *)&pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.basicRateMask,
4425 (UINT32 *)&pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.supportedRateMask,
4426 (UINT32 *)&txDesiredRate,
4427 &pSiteMgr->pDesiredParams->siteMgrDesiredModulationType, dot11a);
4428
4429 pSiteMgr->pDesiredParams->siteMgrCurrentDesiredTxRate = txDesiredRate;
4430 }
4431 pSiteMgr->pDesiredParams->siteMgrDesiredRatePair.maxBasic = translateRateMaskToValue(pSiteMgr, pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.basicRateMask);
4432 pSiteMgr->pDesiredParams->siteMgrDesiredRatePair.maxActive = translateRateMaskToValue(pSiteMgr, pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.supportedRateMask);
4433
4434 if (updateToOS == TRUE) {
4435 /* report the desired rate to OS */
4436 statusData = hostToUtilityRate(pSiteMgr->pDesiredParams->siteMgrDesiredRatePair.maxActive);
4437
4438 EvHandlerSendEvent(pSiteMgr->hEvHandler, IPC_EVENT_LINK_SPEED, (UINT8 *)&statusData,sizeof(UINT32));
4439 }
4440
4441 }
4442
4443 /***********************************************************************
4444 * siteMgr_bandParamsConfig
4445 ***********************************************************************
4446 DESCRIPTION:
4447
4448 INPUT: hSiteMgr - SiteMgr handle.
4449
4450 OUTPUT:
4451
4452 RETURN:
4453
4454 ************************************************************************/
siteMgr_bandParamsConfig(TI_HANDLE hSiteMgr,BOOL updateToOS)4455 void siteMgr_bandParamsConfig(TI_HANDLE hSiteMgr, BOOL updateToOS)
4456 {
4457 siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
4458
4459 /* reconfig rates */
4460 if(pSiteMgr->siteMgrOperationalMode == DOT11_A_MODE)
4461 siteMgr_updateRates(hSiteMgr, TRUE, updateToOS);
4462 else
4463 siteMgr_updateRates(hSiteMgr, FALSE, updateToOS);
4464
4465 /* go to B_ONLY Mode only if WiFI bit is Set*/
4466 if (pSiteMgr->pDesiredParams->siteMgrWiFiAdhoc == TRUE)
4467 { /* Configuration For AdHoc when using external configuration */
4468 if (pSiteMgr->pDesiredParams->siteMgrExternalConfiguration == FALSE)
4469 {
4470 siteMgr_externalConfigurationParametersSet(hSiteMgr);
4471 }
4472 }
4473
4474 }
4475
siteMgr_keepAliveSendNullDataTimer(TI_HANDLE hSiteMgr)4476 void siteMgr_keepAliveSendNullDataTimer(TI_HANDLE hSiteMgr)
4477 {
4478 paramInfo_t param;
4479 siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
4480 UINT32 txPacketsCount = 0;
4481 UINT32 TxQid;
4482
4483 if ((pSiteMgr->pSitesMgmtParams->pPrimarySite != NULL) &&
4484 (pSiteMgr->pSitesMgmtParams->pPrimarySite->bssType != BSS_INFRASTRUCTURE))
4485 { /* No need for kepp alive when not in Infra */
4486 return;
4487 }
4488 param.paramType = TX_DATA_COUNTERS_PARAM;
4489 txData_getParam(pSiteMgr->hTxData, ¶m);
4490 /* get current tx data frames counter */
4491 for (TxQid = 0; TxQid < MAX_NUM_OF_TX_QUEUES; TxQid++)
4492 txPacketsCount += param.content.pTxDataCounters[TxQid].XmitOk;
4493
4494 if (pSiteMgr->txPacketsCount==txPacketsCount)
4495 { /* send NULL data */
4496 WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,("siteMgr_keepAliveSendNullDataTimer\n"));
4497
4498 /* sending null frame with power save bit set to off (if keepAliveEnable in the registry)
4499 Note: the Hardware modify the PS bit according to the current PS mode. */
4500 if(pSiteMgr->keepAliveEnable == TRUE)
4501 {
4502 txData_sendNullFrame(pSiteMgr->hTxData, FALSE, SITE_MGR_MODULE);
4503 }
4504 txPacketsCount++;
4505
4506 }
4507 pSiteMgr->txPacketsCount=txPacketsCount;
4508
4509 }
4510
siteMgr_ConfigRate(TI_HANDLE hSiteMgr)4511 void siteMgr_ConfigRate(TI_HANDLE hSiteMgr)
4512 {
4513 siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
4514 BOOL dot11a;
4515 dot11mode_e OperationMode ;
4516
4517 OperationMode = pSiteMgr->siteMgrOperationalMode;
4518
4519 /* reconfig rates */
4520 if(OperationMode == DOT11_A_MODE)
4521 dot11a = TRUE;
4522 else
4523 dot11a = FALSE;
4524
4525 /*
4526 ** Specific change to ch 14, that channel is only used in Japan, and is limited
4527 ** to rates 1,2,5.5,11
4528 */
4529 if(pSiteMgr->pDesiredParams->siteMgrDesiredChannel == SPECIAL_BG_CHANNEL)
4530 {
4531 if(pSiteMgr->pDesiredParams->siteMgrRegstryBasicRate[OperationMode] > BASIC_RATE_SET_1_2_5_5_11)
4532 pSiteMgr->pDesiredParams->siteMgrRegstryBasicRate[OperationMode] = BASIC_RATE_SET_1_2_5_5_11;
4533
4534
4535 if(pSiteMgr->pDesiredParams->siteMgrRegstrySuppRate[OperationMode] > SUPPORTED_RATE_SET_1_2_5_5_11)
4536 pSiteMgr->pDesiredParams->siteMgrRegstrySuppRate[OperationMode] = SUPPORTED_RATE_SET_1_2_5_5_11;
4537 }
4538
4539 pSiteMgr->pDesiredParams->siteMgrRegstryBasicRateMask =
4540 translateBasicRateValueToMask(pSiteMgr->pDesiredParams->siteMgrRegstryBasicRate[OperationMode], dot11a);
4541
4542 pSiteMgr->pDesiredParams->siteMgrRegstrySuppRateMask =
4543 translateSupportedRateValueToMask(pSiteMgr->pDesiredParams->siteMgrRegstrySuppRate[OperationMode], dot11a);
4544
4545 siteMgr_updateRates(pSiteMgr, dot11a, TRUE);
4546
4547 /* go to B_ONLY Mode only if WiFI bit is Set*/
4548 if (pSiteMgr->pDesiredParams->siteMgrWiFiAdhoc == TRUE)
4549 { /* Configuration For AdHoc when using external configuration */
4550 if (pSiteMgr->pDesiredParams->siteMgrExternalConfiguration == FALSE)
4551 {
4552 siteMgr_externalConfigurationParametersSet(hSiteMgr);
4553 }
4554 }
4555 }
4556
siteMgr_externalConfigurationParametersSet(TI_HANDLE hSiteMgr)4557 static void siteMgr_externalConfigurationParametersSet(TI_HANDLE hSiteMgr)
4558 {
4559 siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
4560
4561 /* Overwrite the parameters for AdHoc with External Configuration */
4562
4563 if( ((pSiteMgr->pDesiredParams->siteMgrDesiredDot11Mode == DOT11_A_MODE) ||
4564 (pSiteMgr->pDesiredParams->siteMgrDesiredDot11Mode == DOT11_DUAL_MODE)) &&
4565 !pSiteMgr->pDesiredParams->siteMgrWiFiAdhoc && pSiteMgr->pDesiredParams->siteMgrDesiredBSSType == BSS_INDEPENDENT)
4566 return;
4567
4568
4569 if(pSiteMgr->pDesiredParams->siteMgrDesiredBSSType == BSS_INDEPENDENT)
4570 {
4571 pSiteMgr->siteMgrOperationalMode = DOT11_B_MODE;
4572 pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.basicRateMask = translateBasicRateValueToMask(BASIC_RATE_SET_1_2_5_5_11, FALSE);
4573 pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.supportedRateMask = translateSupportedRateValueToMask(SUPPORTED_RATE_SET_1_2_5_5_11, FALSE);
4574 pSiteMgr->pDesiredParams->siteMgrCurrentDesiredTxRate = DRV_RATE_AUTO;
4575 pSiteMgr->pDesiredParams->siteMgrRegstryBasicRateMask = translateBasicRateValueToMask(BASIC_RATE_SET_1_2_5_5_11, FALSE);
4576 pSiteMgr->pDesiredParams->siteMgrRegstrySuppRateMask = translateSupportedRateValueToMask(SUPPORTED_RATE_SET_1_2_5_5_11, FALSE);
4577 pSiteMgr->pDesiredParams->siteMgrRegstryDesiredTxRate = DRV_RATE_AUTO;
4578 pSiteMgr->pDesiredParams->siteMgrDesiredSlotTime = PHY_SLOT_TIME_LONG;
4579
4580 whalCtrl_SetRadioBand(pSiteMgr->hHalCtrl, RADIO_BAND_2_4_GHZ);
4581 whalCtrl_SetSlotTime(pSiteMgr->hHalCtrl, PHY_SLOT_TIME_LONG);
4582
4583 }
4584 else
4585 {
4586 if(pSiteMgr->radioBand == RADIO_BAND_2_4_GHZ)
4587 pSiteMgr->siteMgrOperationalMode = DOT11_G_MODE;
4588 else
4589 pSiteMgr->siteMgrOperationalMode = DOT11_A_MODE;
4590 pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.basicRateMask = translateBasicRateValueToMask(BASIC_RATE_SET_1_2_5_5_11, FALSE);
4591 pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.supportedRateMask = translateSupportedRateValueToMask(SUPPORTED_RATE_SET_ALL, FALSE);
4592 pSiteMgr->pDesiredParams->siteMgrCurrentDesiredTxRate = DRV_RATE_AUTO;
4593 pSiteMgr->pDesiredParams->siteMgrRegstryBasicRateMask = translateBasicRateValueToMask(BASIC_RATE_SET_1_2_5_5_11, FALSE);
4594 pSiteMgr->pDesiredParams->siteMgrRegstrySuppRateMask = translateSupportedRateValueToMask(SUPPORTED_RATE_SET_ALL, FALSE);
4595 pSiteMgr->pDesiredParams->siteMgrRegstryDesiredTxRate = DRV_RATE_AUTO;
4596
4597 pSiteMgr->pDesiredParams->siteMgrDesiredSlotTime = PHY_SLOT_TIME_LONG;
4598
4599 whalCtrl_SetSlotTime(pSiteMgr->hHalCtrl, PHY_SLOT_TIME_LONG);
4600 }
4601 }
4602
siteMgr_checkTxPower(TI_HANDLE hSiteMgr)4603 void siteMgr_checkTxPower(TI_HANDLE hSiteMgr)
4604 {
4605 siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
4606
4607 if ( (pSiteMgr->pSitesMgmtParams->pPrimarySite) && (pSiteMgr->bTempTxPowerEnabled)
4608 && (++pSiteMgr->siteMgrTxPowerCheckTime >= pSiteMgr->pDesiredParams->TxPowerCheckTime) )
4609 {
4610 pSiteMgr->siteMgrTxPowerCheckTime = 0; /* reset counter for next check */
4611
4612 WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
4613 ("%s: RSSI = %d TxPowerRssiThresh = %d TxPowerRssiRestoreThresh = %D\n",
4614 __FUNCTION__, pSiteMgr->pSitesMgmtParams->pPrimarySite->rssi,
4615 pSiteMgr->pDesiredParams->TxPowerRssiThresh,pSiteMgr->pDesiredParams->TxPowerRssiRestoreThresh));
4616
4617 if ((pSiteMgr->pSitesMgmtParams->pPrimarySite->rssi) >= (INT32) (0 - pSiteMgr->pDesiredParams->TxPowerRssiThresh))
4618 {
4619 /* activate Tx Power Control adjustment */
4620 siteMgr_setTemporaryTxPower(pSiteMgr, TRUE);
4621 }
4622 else if (pSiteMgr->pSitesMgmtParams->pPrimarySite->rssi <= (INT32) (0 - pSiteMgr->pDesiredParams->TxPowerRssiRestoreThresh))
4623 {
4624 /* deactivate Tx Power Control adjustment */
4625 siteMgr_setTemporaryTxPower(pSiteMgr, FALSE);
4626 }
4627 }
4628 }
4629
siteMgr_saveProbeRespBuffer(TI_HANDLE hSiteMgr,macAddress_t * bssid,UINT8 * pProbeRespBuffer,UINT32 length)4630 TI_STATUS siteMgr_saveProbeRespBuffer(TI_HANDLE hSiteMgr, macAddress_t *bssid, UINT8 *pProbeRespBuffer, UINT32 length)
4631 {
4632 siteEntry_t *pSite;
4633 siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
4634
4635 if ((pSiteMgr==NULL) || (pProbeRespBuffer==NULL) || (length>=MAX_MGMT_BODY_LENGTH))
4636 {
4637 return NOK;
4638 }
4639
4640 pSite = findSiteEntry(pSiteMgr, bssid);
4641 if (pSite==NULL)
4642 {
4643 /*WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
4644 ("siteMgr_saveProbeRespBuffer: site doesn't exist\n"));*/
4645 return NOK;
4646
4647 }
4648
4649 os_memoryCopy(pSiteMgr->hOs, pSite->probeRespBuffer, pProbeRespBuffer, length);
4650 pSite->osTimeStamp = os_timeStampMs(pSiteMgr->hOs);
4651 pSite->probeRespLength = length;
4652
4653 WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
4654 ("siteMgr_saveProbeRespBuffer: BSSID=%x-%x-%x-%x-%x-%x, TSF=%x-%x-%x-%x-%x-%x-%x-%x, \n ts=%d, rssi=%d\n channel = %d \n",
4655 pSite->bssid.addr[0], pSite->bssid.addr[1], pSite->bssid.addr[2],
4656 pSite->bssid.addr[3], pSite->bssid.addr[4], pSite->bssid.addr[5],
4657 pSite->tsfTimeStamp[0], pSite->tsfTimeStamp[1], pSite->tsfTimeStamp[2], pSite->tsfTimeStamp[3],
4658 pSite->tsfTimeStamp[4], pSite->tsfTimeStamp[5], pSite->tsfTimeStamp[6], pSite->tsfTimeStamp[7],
4659 pSite->osTimeStamp, pSite->rssi, pSite->channel));
4660
4661 return OK;
4662 }
4663
siteMgr_saveBeaconBuffer(TI_HANDLE hSiteMgr,macAddress_t * bssid,UINT8 * pBeaconBuffer,UINT32 length)4664 TI_STATUS siteMgr_saveBeaconBuffer(TI_HANDLE hSiteMgr, macAddress_t *bssid, UINT8 *pBeaconBuffer, UINT32 length)
4665 {
4666 siteEntry_t *pSite;
4667 siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
4668
4669 if ((pSiteMgr==NULL) || (pBeaconBuffer==NULL) || (length>=MAX_MGMT_BODY_LENGTH))
4670 {
4671 return NOK;
4672 }
4673
4674 pSite = findSiteEntry(pSiteMgr, bssid);
4675 if (pSite==NULL)
4676 {
4677 /*WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
4678 ("siteMgr_saveBeaconBuffer: site doesn't exist\n"));*/
4679 return NOK;
4680
4681 }
4682
4683 os_memoryCopy(pSiteMgr->hOs, pSite->beaconBuffer, pBeaconBuffer, length);
4684 pSite->osTimeStamp = os_timeStampMs(pSiteMgr->hOs);
4685 pSite->beaconLength = length;
4686
4687 /*if (pSiteMgr->pSitesMgmtParams->pPrimarySite!=NULL)
4688 {
4689 if (!os_memoryCompare(pSiteMgr->hOs, pSiteMgr->pSitesMgmtParams->pPrimarySite->ssid.ssidString, pSite->ssid.ssidString, pSiteMgr->pSitesMgmtParams->pPrimarySite->ssid.len))
4690 {
4691 WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
4692 ("siteMgr_saveBeaconBuffer: BSSID=%x-%x-%x-%x-%x-%x, TSF=%x-%x-%x-%x-%x-%x-%x-%x, \n ts=%d, rssi=%d \n",
4693 pSite->bssid.addr[0], pSite->bssid.addr[1], pSite->bssid.addr[2],
4694 pSite->bssid.addr[3], pSite->bssid.addr[4], pSite->bssid.addr[5],
4695 pSite->tsfTimeStamp[0], pSite->tsfTimeStamp[1], pSite->tsfTimeStamp[2], pSite->tsfTimeStamp[3],
4696 pSite->tsfTimeStamp[4], pSite->tsfTimeStamp[5], pSite->tsfTimeStamp[6], pSite->tsfTimeStamp[7],
4697 pSite->osTimeStamp, pSite->rssi));
4698 }
4699 }*/
4700 pSite->ssid.ssidString[pSite->ssid.len] = '\0';
4701
4702 /*WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
4703 ("siteMgr_saveBeaconBuffer: BSSID=%x-%x-%x-%x-%x-%x, SSID=%s, \n ts=%d, rssi=%d\n channel = %d \n",
4704 pSite->bssid.addr[0], pSite->bssid.addr[1], pSite->bssid.addr[2],
4705 pSite->bssid.addr[3], pSite->bssid.addr[4], pSite->bssid.addr[5],
4706 pSite->ssid.ssidString, pSite->osTimeStamp, pSite->rssi, pSite->channel));
4707
4708 */
4709 return OK;
4710 }
4711
4712
siteMgr_resetChannelList(TI_HANDLE hSiteMgr)4713 void siteMgr_resetChannelList(TI_HANDLE hSiteMgr)
4714 {
4715 UINT8 index;
4716 siteMgr_t *pSiteMgr = (siteMgr_t*)hSiteMgr;
4717
4718 if (hSiteMgr==NULL)
4719 {
4720 return;
4721 }
4722
4723 for (index=0; index < pSiteMgr->pSitesMgmtParams->pCurrentSiteTable->maxNumOfSites; index++)
4724 {
4725 if (pSiteMgr->pSitesMgmtParams->pCurrentSiteTable->siteTable[index].siteType != SITE_NULL)
4726 {
4727 pSiteMgr->pSitesMgmtParams->pCurrentSiteTable->siteTable[index].prioritySite = FALSE;
4728 }
4729 }
4730
4731 }
4732
4733
siteMgr_findSiteEntry(TI_HANDLE hSiteMgrm,macAddress_t * bssid)4734 siteEntry_t *siteMgr_findSiteEntry(TI_HANDLE hSiteMgrm, macAddress_t *bssid)
4735 {
4736 return (findSiteEntry(hSiteMgrm, bssid));
4737 }
4738
4739
4740
siteMgr_IsERP_Needed(TI_HANDLE hSiteMgr,BOOL * useProtection,BOOL * NonErpPresent,BOOL * barkerPreambleType)4741 void siteMgr_IsERP_Needed(TI_HANDLE hSiteMgr,BOOL *useProtection,BOOL *NonErpPresent,BOOL *barkerPreambleType)
4742 {
4743 siteMgr_t *pSiteMgr = (siteMgr_t*)hSiteMgr;
4744 paramInfo_t param;
4745 siteEntry_t *pPrimarySite = pSiteMgr->pSitesMgmtParams->pPrimarySite;
4746
4747 *useProtection = FALSE;
4748 *NonErpPresent = FALSE;
4749 *barkerPreambleType = FALSE;
4750
4751 param.paramType = CTRL_DATA_CURRENT_IBSS_PROTECTION_PARAM;
4752 ctrlData_getParam(pSiteMgr->hCtrlData, ¶m);
4753
4754 /* On WifiAdhoc (for band B) The STa should not include in the beacon an ERP IE (see WiFi B clause 2.2, 5.8.2) */
4755 if (pSiteMgr->pDesiredParams->siteMgrWiFiAdhoc == TRUE)
4756 {
4757 /* Return the default => ERP is not needed */
4758 return;
4759 }
4760
4761 /* check if STA is connected */
4762 if (pPrimarySite)
4763 {
4764 if(pSiteMgr->siteMgrOperationalMode == DOT11_G_MODE || pSiteMgr->siteMgrOperationalMode == DOT11_DUAL_MODE)
4765 {
4766 if(param.content.ctrlDataIbssProtecionType == ERP_PROTECTION_STANDARD)
4767 {
4768 if(pPrimarySite->siteType == SITE_SELF)
4769 {
4770 if(pPrimarySite->channel <= SITE_MGR_CHANNEL_B_G_MAX) /* if channel B&G*/
4771 {
4772 *useProtection = TRUE;
4773 *NonErpPresent = TRUE;
4774 *barkerPreambleType = TRUE;
4775 }
4776 }
4777 else if(pPrimarySite->bssType == BSS_INDEPENDENT)
4778 {
4779 if(pPrimarySite->useProtection == TRUE)
4780 *useProtection = TRUE;
4781 if(pPrimarySite->NonErpPresent == TRUE)
4782 *NonErpPresent = TRUE;
4783 if(pPrimarySite->barkerPreambleType == PREAMBLE_SHORT)
4784 *barkerPreambleType = TRUE;
4785 }
4786 }
4787 }
4788 }
4789 }
4790
4791
4792
4793
siteMgr_gotFirstBcn(TI_HANDLE hSiteMgr)4794 void siteMgr_gotFirstBcn(TI_HANDLE hSiteMgr)
4795 {
4796 siteMgr_t *pSiteMgr = (siteMgr_t*)hSiteMgr;
4797 int status ;
4798
4799 WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
4800 ("siteMgr_gotFirstBcn: dtimPeriod=%d, beaconInterval=%d\n",
4801 pSiteMgr->pSitesMgmtParams->pPrimarySite->dtimPeriod,
4802 pSiteMgr->pSitesMgmtParams->pPrimarySite->beaconInterval));
4803
4804 /* Check if the Beacon Filter Desired State is TRUE */
4805 pSiteMgr->beaconFilterParams.currentState = TRUE;
4806 /* If the Beacon Filter was TRUE then send it to FW if not do not do nothing */
4807 if( TRUE == pSiteMgr->beaconFilterParams.desiredState )
4808 {
4809 if ( (status = whalCtrl_SetBeaconFiltering(pSiteMgr->hHalCtrl, pSiteMgr->beaconFilterParams.desiredState, pSiteMgr->beaconFilterParams.numOfStored)) != OK)
4810 {
4811 WLAN_REPORT_INFORMATION(pSiteMgr->hReport,
4812 POWER_MANAGER_MODULE_LOG,
4813 ("%s(%d) - Error N.%d in configuring beacon filtering !\n",
4814 __FILE__,__LINE__,status));
4815 }
4816 else
4817 {
4818 WLAN_REPORT_INFORMATION(pSiteMgr->hReport,SITE_MGR_MODULE_LOG , ("-- Beacon Filter Enable Beacon Filtering MIB Was Sent to FW !!! --\n"));
4819 }
4820 }
4821 else
4822 {
4823 WLAN_REPORT_INFORMATION(pSiteMgr->hReport,SITE_MGR_MODULE_LOG , ("-- Beacon Filter Disable Beacon Filtering - Do not send to FW Already Disabled !!! --\n"));
4824 }
4825
4826 whalCtrl_setDtimPeriod(pSiteMgr->hHalCtrl, pSiteMgr->pSitesMgmtParams->pPrimarySite->dtimPeriod,
4827 pSiteMgr->pSitesMgmtParams->pPrimarySite->beaconInterval);
4828
4829 /* The power mode configuration gets overridden by the above DTIM period */
4830 /* configuration. We use this call to send it again to the firmware. */
4831 PowerMgr_reloadPowerMode(pSiteMgr->hPowerMgr);
4832 }
4833
siteMgr_clearFirstBcnFlag(TI_HANDLE hSiteMgr)4834 void siteMgr_clearFirstBcnFlag(TI_HANDLE hSiteMgr)
4835 {
4836 siteMgr_t *pSiteMgr = (siteMgr_t*)hSiteMgr;
4837
4838 /* This is set to FALSE since the First Beaqcin should be received for the first beacon mechanism */
4839 pSiteMgr->beaconFilterParams.currentState = FALSE;
4840 whalCtrl_SetBeaconFiltering(pSiteMgr->hHalCtrl, FALSE, pSiteMgr->beaconFilterParams.numOfStored);
4841
4842
4843 /* set Hw available until we get the first beacon */
4844 MacServices_powerAutho_AwakeRequiredUpdate(pSiteMgr->hMacServices, POWERAUTHO_AWAKE_REQUIRED, POWERAUTHO_AWAKE_REASON_FIRST_BEACON);
4845
4846 if(pSiteMgr->pSitesMgmtParams->pPrimarySite != NULL)
4847 pSiteMgr->pSitesMgmtParams->pPrimarySite->beaconReceiveAfterJoin = FALSE;
4848 }
4849
siteMgr_setFirstBcnFlag(TI_HANDLE hSiteMgr)4850 void siteMgr_setFirstBcnFlag(TI_HANDLE hSiteMgr)
4851 {
4852 siteMgr_t *pSiteMgr = (siteMgr_t*)hSiteMgr;
4853
4854 /* set Hw not available until now that the connection was closed */
4855 MacServices_powerAutho_AwakeRequiredUpdate(pSiteMgr->hMacServices, POWERAUTHO_AWAKE_NOT_REQUIRED, POWERAUTHO_AWAKE_REASON_FIRST_BEACON);
4856
4857 if(pSiteMgr->pSitesMgmtParams->pPrimarySite != NULL)
4858 pSiteMgr->pSitesMgmtParams->pPrimarySite->beaconReceiveAfterJoin = TRUE;
4859 }
4860
4861 /**
4862 *
4863 * siteMgr_overwritePrimarySite
4864 *
4865 * \b Description:
4866 *
4867 * This function sets new AP as a primary site and, if requested, stores previous
4868 * AP's info; called during roaming
4869 *
4870 * \b ARGS:
4871 *
4872 * I - pCurrBSS - Current BSS handle \n
4873 *
4874 * \b RETURNS:
4875 *
4876 * OK on success, NOK on failure.
4877 *
4878 * \sa
4879 */
siteMgr_overwritePrimarySite(TI_HANDLE hSiteMgr,bssEntry_t * newAP,BOOL requiredToStorePrevSite)4880 TI_STATUS siteMgr_overwritePrimarySite(TI_HANDLE hSiteMgr, bssEntry_t *newAP, BOOL requiredToStorePrevSite)
4881 {
4882 siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
4883 siteEntry_t *newApEntry;
4884 mlmeIEParsingParams_t *ieListParseParams = mlmeParser_getParseIEsBuffer(pSiteMgr->hMlmeSm);
4885
4886 WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("siteMgr_overwritePrimarySite: new site bssid= 0x%x-0x%x-0x%x-0x%x-0x%x-0x%x\n\n",
4887 newAP->BSSID.addr[0], newAP->BSSID.addr[1], newAP->BSSID.addr[2],
4888 newAP->BSSID.addr[3], newAP->BSSID.addr[4], newAP->BSSID.addr[5]));
4889
4890 /* If previous primary site present, and requested to save it - store it */
4891 if (requiredToStorePrevSite)
4892 {
4893 WLAN_REPORT_INFORMATION(pSiteMgr->hReport,
4894 SITE_MGR_MODULE_LOG,
4895 ("siteMgr_overwritePrimarySite: required to store prev prim site \n"));
4896 /* Store latest primary site, make ite a regular site */
4897 pSiteMgr->pSitesMgmtParams->pPrevPrimarySite = pSiteMgr->pSitesMgmtParams->pPrimarySite;
4898 pSiteMgr->pSitesMgmtParams->pPrevPrimarySite->siteType = SITE_REGULAR;
4899 }
4900 else
4901 {
4902 WLAN_REPORT_INFORMATION(pSiteMgr->hReport,
4903 SITE_MGR_MODULE_LOG,
4904 ("siteMgr_overwritePrimarySite: not required to store prev prim site \n"));
4905 if (pSiteMgr->pSitesMgmtParams->pPrimarySite != NULL)
4906 {
4907 WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("Removing Primary ssid=%s, bssid= 0x%x-0x%x-0x%x-0x%x-0x%x-0x%x\n\n",
4908 pSiteMgr->pSitesMgmtParams->pPrimarySite->ssid.ssidString,
4909 pSiteMgr->pSitesMgmtParams->pPrimarySite->bssid.addr[0], pSiteMgr->pSitesMgmtParams->pPrimarySite->bssid.addr[1], pSiteMgr->pSitesMgmtParams->pPrimarySite->bssid.addr[2],
4910 pSiteMgr->pSitesMgmtParams->pPrimarySite->bssid.addr[3], pSiteMgr->pSitesMgmtParams->pPrimarySite->bssid.addr[4], pSiteMgr->pSitesMgmtParams->pPrimarySite->bssid.addr[5] ));
4911
4912 pSiteMgr->pSitesMgmtParams->pPrimarySite->siteType = SITE_REGULAR;
4913 pSiteMgr->pSitesMgmtParams->pPrimarySite->beaconRecv = FALSE;
4914 pSiteMgr->pSitesMgmtParams->pPrimarySite->beaconReceiveAfterJoin = TRUE;
4915
4916 pSiteMgr->pSitesMgmtParams->pPrimarySite = NULL;
4917 }
4918 else
4919 {
4920 WLAN_REPORT_ERROR(pSiteMgr->hReport,
4921 SITE_MGR_MODULE_LOG,
4922 ("siteMgr_overwritePrimarySite: primary site is NULL \n"));
4923 }
4924
4925 }
4926
4927 /* Find not occupied entry in site table, and store new AP BSSID in */
4928 /* If pPrimarySite is not set to NULL, store it in pPrevSite before updating */
4929 newApEntry = findAndInsertSiteEntry(pSiteMgr, &(newAP->BSSID), newAP->band);
4930
4931 if (newApEntry != NULL)
4932 {
4933 /* Zero frame content */
4934 os_memoryZero(pSiteMgr->hOs, ieListParseParams, sizeof(mlmeIEParsingParams_t));
4935
4936 /* Update parameters of new AP */
4937 newApEntry->rssi = newAP->RSSI;
4938 newApEntry->bssType = BSS_INFRASTRUCTURE;
4939 newApEntry->dtimPeriod = 1;
4940 newApEntry->rxRate = (rate_e)newAP->rxRate;
4941 /* Mark the site as regular in order to prevent from calling Power manager during beacon parsing */
4942 newApEntry->siteType = SITE_REGULAR;
4943
4944 os_memoryCopy(pSiteMgr->hOs, &newApEntry->ssid, &pSiteMgr->pDesiredParams->siteMgrDesiredSSID, sizeof(ssid_t));
4945
4946 if (newAP->resultType == SCAN_RFT_PROBE_RESPONSE)
4947 {
4948 ieListParseParams->frame.subType = PROBE_RESPONSE;
4949 siteMgr_saveProbeRespBuffer(hSiteMgr, &(newAP->BSSID), newAP->pBuffer, newAP->bufferLength);
4950 }
4951 else
4952 {
4953 ieListParseParams->frame.subType = BEACON;
4954 siteMgr_saveBeaconBuffer(hSiteMgr, &(newAP->BSSID), newAP->pBuffer, newAP->bufferLength);
4955 }
4956 ieListParseParams->band = newAP->band;
4957 ieListParseParams->rxChannel = newAP->channel;
4958 ieListParseParams->myBssid = FALSE;
4959
4960 ieListParseParams->frame.content.iePacket.pRsnIe = NULL;
4961 ieListParseParams->frame.content.iePacket.rsnIeLen = 0;
4962 ieListParseParams->frame.content.iePacket.barkerPreambleMode = PREAMBLE_UNSPECIFIED;
4963 os_memoryCopy(pSiteMgr->hOs, (void *)ieListParseParams->frame.content.iePacket.timestamp, (void *)&newAP->lastRxTSF, TIME_STAMP_LEN);
4964 ieListParseParams->frame.content.iePacket.beaconInerval = newAP->beaconInterval;
4965 ieListParseParams->frame.content.iePacket.capabilities = newAP->capabilities;
4966
4967 if (mlmeParser_parseIEs(pSiteMgr->hMlmeSm, newAP->pBuffer, newAP->bufferLength, ieListParseParams) != OK)
4968 {
4969 /* Error in parsing Probe response packet - exit */
4970 return NOK;
4971 }
4972
4973 siteMgr_updateSite(hSiteMgr, &(newAP->BSSID), &ieListParseParams->frame, newAP->channel, newAP->band, FALSE);
4974
4975 /* Select the entry as primary site */
4976 newApEntry->siteType = SITE_PRIMARY;
4977 pSiteMgr->pSitesMgmtParams->pPrimarySite = newApEntry;
4978 return OK;
4979 }
4980 else
4981 {
4982 return NOK;
4983 }
4984 }
4985
4986 #if 0
4987 /***********************************************************************
4988 siteMgr_updateLowPriorityTimeout
4989 ***********************************************************************
4990 DESCRIPTION: Call to the PowerCtrl with the new claculated low priority
4991 timeout that is depend on the:
4992 - short/long doze.
4993 - beacon filtering number.
4994 - beacon interval.
4995
4996 INPUT: hSiteMgr - site mgr handle.
4997
4998 OUTPUT:
4999
5000 RETURN: UINT32 - the timeout in mSec.
5001
5002 ************************************************************************/
5003 static void siteMgr_updateLowPriorityTimeout(TI_HANDLE hSiteMgr)
5004 {
5005 siteMgr_t *pSiteMgr = (siteMgr_t*)hSiteMgr;
5006 UINT32 lowPriorityTimeout = 0;
5007
5008 if(pSiteMgr->pDesiredParams->siteMgrDesiredBSSType == BSS_INDEPENDENT)
5009 {
5010 lowPriorityTimeout = SITE_MGR_IBSS_AGING_TIMEOUT_DEF;
5011 }
5012 else
5013 {
5014 /*
5015 If the pPrimarySite is NULL then we cannot update the aging timeout
5016 */
5017 if (pSiteMgr->pSitesMgmtParams->pPrimarySite == NULL)
5018 {
5019 WLAN_REPORT_ERROR(pSiteMgr->hReport,
5020 SITE_MGR_MODULE_LOG,
5021 ("there is NO primary site! pPrimarySite is NULL\n"));
5022 return;
5023 }
5024 else
5025 {
5026 /*
5027 in shortDoze and active mode the system behaviour is the same as regarding to
5028 beacon evnets. On each beacon the TNET is awake and should received the beacon
5029 */
5030 if(pSiteMgr->powerSaveLdMode == FALSE)
5031 {
5032 lowPriorityTimeout = pSiteMgr->pSitesMgmtParams->pPrimarySite->beaconInterval;
5033 }
5034 else
5035 /*
5036 In longDoze, the interval time should based on numOfBeaconFiltering * Dtim interval
5037 */
5038 {
5039 /*
5040 if beacon filtering disable.
5041 */
5042 if ( 0 == pSiteMgr->numOfBeaconFiltering )
5043 {
5044 lowPriorityTimeout = pSiteMgr->pSitesMgmtParams->pPrimarySite->dtimPeriod * pSiteMgr->pSitesMgmtParams->pPrimarySite->beaconInterval;
5045 }
5046 else
5047 {
5048 lowPriorityTimeout = pSiteMgr->numOfBeaconFiltering * pSiteMgr->pSitesMgmtParams->pPrimarySite->dtimPeriod * pSiteMgr->pSitesMgmtParams->pPrimarySite->beaconInterval;
5049 }
5050 }
5051
5052 WLAN_REPORT_INFORMATION(pSiteMgr->hReport,
5053 SITE_MGR_MODULE_LOG,
5054 ("siteMgr_calcLowPriorityTimeout: lowPriorityTimeout = %d, BeaconInterval = %d, DtimPeriod = %d,powerSaveLdMode = %d, numOfBeaconFiltering = %d\n",
5055 lowPriorityTimeout,
5056 pSiteMgr->pSitesMgmtParams->pPrimarySite->beaconInterval,
5057 pSiteMgr->pSitesMgmtParams->pPrimarySite->dtimPeriod,
5058 pSiteMgr->powerSaveLdMode,
5059 pSiteMgr->numOfBeaconFiltering));
5060 }
5061 }
5062
5063 if (lowPriorityTimeout != 0)
5064 {
5065 #ifdef NO_HAL_VOB
5066 whalCtrl_setLowPriorityTimeout(pSiteMgr->hHalCtrl,
5067 lowPriorityTimeout);
5068 #endif
5069 }
5070 else
5071 {
5072 WLAN_REPORT_ERROR(pSiteMgr->hReport,
5073 SITE_MGR_MODULE_LOG,
5074 ("illegal lowPriorityTimeout (=%d), configuration ABORTED!\n",lowPriorityTimeout));
5075 }
5076 }
5077
5078 #endif
5079