• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * systemConfig.c
3  *
4  * Copyright(c) 1998 - 2010 Texas Instruments. All rights reserved.
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  *  * Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  *  * Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in
15  *    the documentation and/or other materials provided with the
16  *    distribution.
17  *  * Neither the name Texas Instruments nor the names of its
18  *    contributors may be used to endorse or promote products derived
19  *    from this software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32  */
33 
34 /** \file reportReplvl.c
35  *  \brief Report level implementation
36  *
37  *  \see reportReplvl.h
38  */
39 
40 /***************************************************************************/
41 /*																			*/
42 /*		MODULE:	reportReplvl.c												*/
43 /*    PURPOSE:	Report level implementation	 								*/
44 /*																			*/
45 /***************************************************************************/
46 #define __FILE_ID__  FILE_ID_87
47 #include "tidef.h"
48 #include "osApi.h"
49 #include "siteHash.h"
50 #include "sme.h"
51 #include "rate.h"
52 #include "smeApi.h"
53 #include "rsnApi.h"
54 #include "report.h"
55 #include "TWDriver.h"
56 #include "connApi.h"
57 #include "DataCtrl_Api.h"
58 #include "siteMgrApi.h"
59 #include "EvHandler.h"
60 #include "TI_IPC_Api.h"
61 #include "regulatoryDomainApi.h"
62 #include "measurementMgrApi.h"
63 #ifdef XCC_MODULE_INCLUDED
64 #include "XCCMngr.h"
65 #include "TransmitPowerXCC.h"
66 #include "XCCRMMngr.h"
67 #endif
68 
69 #include "qosMngr_API.h"
70 #include "StaCap.h"
71 
72 
73 /****************************************************************************
74 								MATRIC ISSUE
75 	Each function in the select process returns a MATCH, NO_MATCH value in order to
76 	skip non relevant sites. In addition, some of the functions also measures a matching level of a site.
77 	The matching level is returned as a bit map. The select function 'OR's those bit maps in order to
78 	select the site that has the biggest matching level. If a function returns a NO_MATCH value, the matching level of the
79 	site is reset.
80 	Following is the site matching level bit map structure.
81 	Please notice, that if all the match functions returned MATCH for a site, its matric must be different than 0,
82 	because of the rates bits.
83 
84 
85 	    31 - 24           23 - 20           20 - 16             15 - 10       9 - 8         7         6           5         4 - 0
86 	+---------------+---------------+-----------------------+-------------+------------+----------+---------+-----------+-----------+
87 	| Rx Level      | Privacy       | Attempts              |Rates        | Modulation |Preamble  | Channel | Spectrum  | Reserved  |
88 	|		        |	    		|		                | 		      |			   |		  |		    | management|		    |
89 	+---------------+---------------+-----------------------+-------------+------------+----------+---------+-----------+-----------+
90 ****************************************************************************/
91 
92 /* Matric bit map definition */
93 typedef enum
94 {
95 	/* Rx level */
96 	METRIC_RX_LEVEL_MASK			= 0xFF,
97 	METRIC_RX_LEVEL_SHIFT			= 24,
98 
99 	/* Privacy */
100 	METRIC_PRIVACY_MASK				= 0x0F,
101 	METRIC_PRIVACY_SHIFT			= 20,
102 
103 	/* Number of attempts */
104 	METRIC_ATTEMPTS_NUMBER_MASK		= 0x0F,
105 	METRIC_ATTEMPTS_NUMBER_SHIFT	= 16,
106 
107 
108 	/* Rates */
109 	METRIC_RATES_MASK				= 0x3F,
110 	METRIC_RATES_SHIFT				= 10,
111 
112 	/* PBCC */
113 	METRIC_MODULATION_MASK			= 0x03,
114 	METRIC_MODULATION_SHIFT			= 8,
115 
116 	/* Preamble*/
117 	METRIC_PREAMBLE_MASK			= 0x01,
118 	METRIC_PREAMBLE_SHIFT			= 7,
119 
120 	/* Channel */
121 	METRIC_CHANNEL_MASK				= 0x01,
122 	METRIC_CHANNEL_SHIFT			= 6,
123 
124 	/* Spectrum management Capability */
125 	METRIC_SPECTRUM_MANAGEMENT_MASK	= 0x01,
126 	METRIC_SPECTRUM_MANAGEMENT_SHIFT= 5,
127 
128 	/* Priority Site */
129 	METRIC_PRIORITY_SITE_MASK		= 0x01,
130 	METRIC_PRIORITY_SITE_SHIFT		= 4
131 
132 } matric_e;
133 
134 #define MAX_GB_MODE_CHANEL		14
135 
136 #define MAX_RSN_DATA_SIZE       256
137 
138 /* RSSI values boundaries and metric values for best, good, etc  signals */
139 #define SELECT_RSSI_BEST_LEVEL      (-22)
140 #define SELECT_RSSI_GOOD_LEVEL      (-38)
141 #define SELECT_RSSI_NORMAL_LEVEL    (-56)
142 #define SELECT_RSSI_POOR_LEVEL      (-72)
143 #define SELECT_RSSI_BAD_LEVEL       (-82)
144 
145 
146 #define  RSSI_METRIC_BEST      6
147 #define  RSSI_METRIC_GOOD      5
148 #define  RSSI_METRIC_NORMAL    4
149 #define  RSSI_METRIC_POOR      3
150 #define  RSSI_METRIC_BAD       2
151 #define  RSSI_METRIC_NOSIGNAL  1
152 
153 /* Local functions prototypes */
154 
155 static TI_STATUS sendProbeResponse(siteMgr_t *pSiteMgr, TMacAddr *pBssid);
156 
157 /* Interface functions Implementation */
158 
159 /***********************************************************************
160  *                        addSelfSite
161  ***********************************************************************
162 DESCRIPTION: This function is called if the selection fails and desired BSS type is IBSS
163 			That means we creating our own network and wait for other stations to join us.
164 			the best site for teh station.
165 			Performs the following:
166 				-	If the desired BSSID is broadcast, we generate a random BSSId, otherwise we use the desired one.
167 				-	If the site table is full we remove the most old site
168 				-	We send a probe response with our oiwn desired attributes in order to add the site to the site table
169 
170 INPUT:      pSiteMgr	-	site mgr handle.
171 
172 OUTPUT:
173 
174 RETURN:     Pointer to rthe self site entry in the site table
175 
176 ************************************************************************/
addSelfSite(TI_HANDLE hSiteMgr)177 siteEntry_t *addSelfSite(TI_HANDLE hSiteMgr)
178 {
179 	siteMgr_t       *pSiteMgr = (siteMgr_t *)hSiteMgr;
180     siteEntry_t		*pSite;
181 	TMacAddr		bssid;
182     TSsid           *pSsid    = &pSiteMgr->pDesiredParams->siteMgrDesiredSSID;
183 
184 	if (OS_802_11_SSID_JUNK (pSsid->str, pSsid->len))
185 		return NULL;
186 
187 	if ((MAC_BROADCAST (pSiteMgr->pDesiredParams->siteMgrDesiredBSSID)) ||
188 		(BSS_INDEPENDENT == pSiteMgr->pDesiredParams->siteMgrDesiredBSSType))
189 	{
190 		MAC_COPY (bssid, pSiteMgr->ibssBssid);
191 	}
192 	else
193 	{
194 		MAC_COPY (bssid, pSiteMgr->pDesiredParams->siteMgrDesiredBSSID);
195 	}
196 
197 	if(pSiteMgr->pDesiredParams->siteMgrDesiredChannel <= 14)
198 	{
199 		pSiteMgr->pSitesMgmtParams->pCurrentSiteTable = &pSiteMgr->pSitesMgmtParams->dot11BG_sitesTables;
200         pSiteMgr->siteMgrOperationalMode = DOT11_G_MODE;
201 	}
202 	else
203 	{
204 		pSiteMgr->pSitesMgmtParams->pCurrentSiteTable = (siteTablesParams_t *)&pSiteMgr->pSitesMgmtParams->dot11A_sitesTables;
205 		pSiteMgr->siteMgrOperationalMode = DOT11_A_MODE;
206 	}
207 
208     siteMgr_ConfigRate(pSiteMgr);
209 
210 	/* First make sure that there is a place in the site table, if not, reomve the eldest site. */
211 	if (pSiteMgr->pSitesMgmtParams->pCurrentSiteTable->numOfSites == pSiteMgr->pSitesMgmtParams->pCurrentSiteTable->maxNumOfSites)
212 		removeEldestSite(pSiteMgr);
213 
214 	sendProbeResponse(pSiteMgr, &bssid);
215 
216 	/* Now find the site in the site table. */
217 	pSite = findSiteEntry(pSiteMgr, &bssid);
218 	if (pSite == NULL)
219 	{
220 		return NULL;
221 	}
222 	pSite->beaconModulation = pSite->probeModulation;
223 	pSite->barkerPreambleType = PREAMBLE_UNSPECIFIED;
224 
225    	pSiteMgr->pSitesMgmtParams->pPrimarySite = pSite;
226 	pSite->siteType = SITE_SELF;
227     pSite->bssType = BSS_INDEPENDENT;
228 
229 	return pSite;
230 }
231 
232 /***********************************************************************
233  *                        sendProbeResponse
234  ***********************************************************************
235 DESCRIPTION: This function is called by the function 'addSelfSite()' in order to send a probe response
236 			to the site mgr. This will cause the site manager to add a new entry to the site table, the self site entry.
237 
238 INPUT:      pSiteMgr	-	site mgr handle.
239 			pBssid		-	Received BSSID
240 
241 OUTPUT:
242 
243 RETURN:     TI_OK
244 
245 ************************************************************************/
sendProbeResponse(siteMgr_t * pSiteMgr,TMacAddr * pBssid)246 static TI_STATUS sendProbeResponse(siteMgr_t *pSiteMgr, TMacAddr *pBssid)
247 {
248 	mlmeFrameInfo_t		frame;
249     ECipherSuite        rsnStatus;
250 	dot11_SSID_t 		ssid;
251 	dot11_RATES_t 		rates;
252 	dot11_FH_PARAMS_t 	FHParamsSet;
253 	dot11_DS_PARAMS_t 	DSParamsSet;
254 	dot11_CF_PARAMS_t 	CFParamsSet;
255 	dot11_IBSS_PARAMS_t IBSSParamsSet;
256 	TI_UINT32			len = 0, ofdmIndex = 0;
257     ERadioBand          band;
258 	dot11_RATES_t 		extRates;
259 	TI_UINT8			ratesBuf[DOT11_MAX_SUPPORTED_RATES];
260 	TI_BOOL				extRatesInd = TI_FALSE;
261 
262 	/* The easiest way to add a site to the site table is to simulate a probe frame. */
263 	frame.subType = PROBE_RESPONSE;
264 	os_memoryZero(pSiteMgr->hOs, &frame, sizeof(mlmeFrameInfo_t));
265 		/* Initialize the frame fields */
266 	frame.subType = PROBE_RESPONSE;
267 	os_memoryZero(pSiteMgr->hOs, (void *)frame.content.iePacket.timestamp, TIME_STAMP_LEN);
268 
269 	/* Build  Beacon interval  */
270 	frame.content.iePacket.beaconInerval = pSiteMgr->pDesiredParams->siteMgrDesiredBeaconInterval;
271 
272 	/* Build  capability field */
273 	frame.content.iePacket.capabilities = 0;
274 	frame.content.iePacket.capabilities |= (TI_TRUE << CAP_IBSS_SHIFT); /* Bss type must be independent */
275 
276 	if ((pSiteMgr->pDesiredParams->siteMgrDesiredPreambleType == PREAMBLE_SHORT))
277 		frame.content.iePacket.capabilities |= (TI_TRUE << CAP_PREAMBLE_SHIFT);
278 
279 	/* call RSN to get the privacy desired */
280     rsn_getParamEncryptionStatus(pSiteMgr->hRsn, &rsnStatus); /* RSN_ENCRYPTION_STATUS_PARAM */
281 	if (rsnStatus == TWD_CIPHER_NONE)
282 	{
283 		frame.content.iePacket.capabilities |= (TI_FALSE << CAP_PRIVACY_SHIFT);
284 	}
285     else
286     {
287 		frame.content.iePacket.capabilities |= (TI_TRUE << CAP_PRIVACY_SHIFT);
288 	}
289 
290 	if (pSiteMgr->pDesiredParams->siteMgrDesiredModulationType == DRV_MODULATION_PBCC)
291 		frame.content.iePacket.capabilities |= (TI_TRUE << CAP_PBCC_SHIFT);
292 
293     if (pSiteMgr->siteMgrOperationalMode == DOT11_G_MODE)
294     {
295         if(pSiteMgr->pDesiredParams->siteMgrDesiredSlotTime == PHY_SLOT_TIME_SHORT)
296             frame.content.iePacket.capabilities |= (TI_TRUE << CAP_SLOT_TIME_SHIFT);
297     }
298 
299 	/* Build ssid */
300 	os_memoryZero(pSiteMgr->hOs, (void *)ssid.serviceSetId, MAX_SSID_LEN);
301 
302     ssid.hdr[1] = pSiteMgr->pDesiredParams->siteMgrDesiredSSID.len;
303     if (ssid.hdr[1] > MAX_SSID_LEN)
304     {
305         TRACE2(pSiteMgr->hReport, REPORT_SEVERITY_ERROR,
306                "sendProbeResponse. siteMgrDesiredSSID.len=%d exceeds the limit %d\n",
307                pSiteMgr->pDesiredParams->siteMgrDesiredSSID.len, MAX_SSID_LEN);
308         ssid.hdr[1] = MAX_SSID_LEN;
309     }
310     os_memoryCopy(pSiteMgr->hOs, (void *)ssid.serviceSetId, (void *)pSiteMgr->pDesiredParams->siteMgrDesiredSSID.str, ssid.hdr[1]);
311 
312 	if(pSiteMgr->pDesiredParams->siteMgrDesiredChannel <= MAX_GB_MODE_CHANEL)
313 		siteMgr_updateRates(pSiteMgr, TI_FALSE, TI_TRUE);
314 	else
315 		siteMgr_updateRates(pSiteMgr, TI_TRUE, TI_TRUE);
316 
317 	/* Build Rates */
318 	rate_DrvBitmapToNetStr (pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.supportedRateMask,
319 						    pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.basicRateMask,
320                             ratesBuf,
321                             &len,
322                             &ofdmIndex);
323 
324 	if(pSiteMgr->siteMgrOperationalMode != DOT11_G_MODE ||
325        pSiteMgr->pDesiredParams->siteMgrUseDraftNum == DRAFT_5_AND_EARLIER ||
326 	   ofdmIndex == len)
327 	{
328 		rates.hdr[0] = DOT11_SUPPORTED_RATES_ELE_ID;
329 		rates.hdr[1] = len;
330 		os_memoryCopy(pSiteMgr->hOs, (void *)rates.rates, ratesBuf, rates.hdr[1]);
331 	}
332 	else
333 	{
334 		rates.hdr[0] = DOT11_SUPPORTED_RATES_ELE_ID;
335 		rates.hdr[1] = ofdmIndex;
336 		os_memoryCopy(pSiteMgr->hOs, (void *)rates.rates, ratesBuf, rates.hdr[1]);
337 
338 		extRates.hdr[0] = DOT11_EXT_SUPPORTED_RATES_ELE_ID;
339 		extRates.hdr[1] = len - ofdmIndex;
340 		os_memoryCopy(pSiteMgr->hOs, (void *)extRates.rates, &ratesBuf[ofdmIndex], extRates.hdr[1]);
341 		extRatesInd = TI_TRUE;
342 	}
343 
344     if((pSiteMgr->siteMgrOperationalMode == DOT11_G_MODE) || (pSiteMgr->siteMgrOperationalMode == DOT11_DUAL_MODE))
345     {
346         erpProtectionType_e protType;
347         ctrlData_getParamProtType(pSiteMgr->hCtrlData, &protType); /* CTRL_DATA_CURRENT_IBSS_PROTECTION_PARAM */
348         frame.content.iePacket.useProtection = protType;
349     }
350     else
351     {
352         frame.content.iePacket.useProtection = ERP_PROTECTION_NONE;
353     }
354 
355 	/* Build FH */
356 	os_memoryZero(pSiteMgr->hOs, &FHParamsSet, sizeof(dot11_FH_PARAMS_t));
357 
358 	/* Build DS */
359 	DSParamsSet.hdr[1] = 1;
360 	DSParamsSet.currChannel = pSiteMgr->pDesiredParams->siteMgrDesiredChannel;
361 
362 	/* Build CF */
363 	os_memoryZero(pSiteMgr->hOs, &CFParamsSet, sizeof(dot11_CF_PARAMS_t));
364 
365 	/* Build IBSS */
366 	os_memoryZero(pSiteMgr->hOs, &IBSSParamsSet, sizeof(dot11_IBSS_PARAMS_t));
367 	IBSSParamsSet.hdr[1] = 2;
368 	IBSSParamsSet.atimWindow = pSiteMgr->pDesiredParams->siteMgrDesiredAtimWindow;
369 
370 	frame.content.iePacket.pSsid = &ssid;
371 	frame.content.iePacket.pRates = &rates;
372 
373 	if(extRatesInd)
374 		frame.content.iePacket.pExtRates = &extRates;
375 	else
376 		frame.content.iePacket.pExtRates = NULL;
377 
378 	frame.content.iePacket.pFHParamsSet = &FHParamsSet;
379 	frame.content.iePacket.pDSParamsSet = &DSParamsSet;
380 	frame.content.iePacket.pCFParamsSet = &CFParamsSet;
381 	frame.content.iePacket.pIBSSParamsSet = &IBSSParamsSet;
382 
383     band = ( MAX_GB_MODE_CHANEL >= pSiteMgr->pDesiredParams->siteMgrDesiredChannel ? RADIO_BAND_2_4_GHZ : RADIO_BAND_5_0_GHZ );
384 	/* Update site */
385 	siteMgr_updateSite(pSiteMgr, pBssid, &frame ,pSiteMgr->pDesiredParams->siteMgrDesiredChannel, band, TI_FALSE);
386 
387 	return TI_OK;
388 }
389 
390 /***********************************************************************
391  *                        systemConfig
392  ***********************************************************************
393 DESCRIPTION: This function is called by the function 'siteMgr_selectSite()' in order to configure
394 			the system with the chosen site attribute.
395 
396 INPUT:      pSiteMgr	-	site mgr handle.
397 
398 OUTPUT:
399 
400 RETURN:     TI_OK
401 
402 ************************************************************************/
systemConfig(siteMgr_t * pSiteMgr)403 TI_STATUS systemConfig(siteMgr_t *pSiteMgr)
404 {
405 	paramInfo_t *pParam;
406 	siteEntry_t *pPrimarySite = pSiteMgr->pSitesMgmtParams->pPrimarySite;
407 	TRsnData	rsnData;
408 	TI_UINT8	rsnAssocIeLen;
409     dot11_RSN_t *pRsnIe;
410     TI_UINT8    rsnIECount=0;
411     TI_UINT8    *curRsnData;
412     TI_UINT16   length;
413     TI_UINT16   capabilities;
414     TI_UINT16   PktLength=0;
415     TI_UINT8	*pIeBuffer=NULL;
416     TI_BOOL     b11nEnable;
417     TI_BOOL     bWmeEnable;
418 
419 #ifdef XCC_MODULE_INCLUDED
420     TI_UINT8     ExternTxPower;
421 #endif
422 	TI_STATUS	status;
423 	ESlotTime	slotTime;
424 	TI_UINT32	StaTotalRates;
425 	dot11_ACParameters_t *p_ACParametersDummy = NULL;
426     TtxCtrlHtControl tHtControl;
427 
428     curRsnData = os_memoryAlloc(pSiteMgr->hOs, MAX_RSN_DATA_SIZE);
429     if (!curRsnData)
430         return TI_NOK;
431     pParam = (paramInfo_t *)os_memoryAlloc(pSiteMgr->hOs, sizeof(paramInfo_t));
432     if (!pParam) {
433         os_memoryFree(pSiteMgr->hOs, curRsnData, MAX_RSN_DATA_SIZE);
434         return TI_NOK;
435     }
436 
437 	if (pPrimarySite->probeRecv)
438 	{
439 		pIeBuffer = pPrimarySite->probeRespBuffer;
440 		PktLength = pPrimarySite->probeRespLength;
441 	}
442     else if (pPrimarySite->beaconRecv)
443 	{
444 		pIeBuffer = pPrimarySite->beaconBuffer;
445 		PktLength = pPrimarySite->beaconLength;
446 	}
447 
448 	pSiteMgr->prevRadioBand = pSiteMgr->radioBand;
449 
450     TRACE2(pSiteMgr->hReport, REPORT_SEVERITY_INFORMATION, ": Capabilities, Slot Time Bit = %d (capabilities = %d)\n", (pPrimarySite->capabilities >> CAP_SLOT_TIME_SHIFT) & 1, pPrimarySite->capabilities);
451 
452 	if(pPrimarySite->channel <= MAX_GB_MODE_CHANEL)
453 	{
454 		if(pSiteMgr->pDesiredParams->siteMgrDesiredDot11Mode == DOT11_B_MODE)
455 		{
456 			pSiteMgr->siteMgrOperationalMode = DOT11_B_MODE;
457 			slotTime = PHY_SLOT_TIME_LONG;
458 
459             TRACE1(pSiteMgr->hReport, REPORT_SEVERITY_INFORMATION, ": 11b Mode, Slot Time = %d\n", (TI_UINT8)slotTime);
460 		}
461 		else
462 		{
463 			pSiteMgr->siteMgrOperationalMode = DOT11_G_MODE;
464 
465 			if (((pPrimarySite->capabilities >> CAP_SLOT_TIME_SHIFT) & CAP_SLOT_TIME_MASK) == PHY_SLOT_TIME_SHORT)
466 			{
467 			slotTime = pSiteMgr->pDesiredParams->siteMgrDesiredSlotTime;
468 
469             TRACE1(pSiteMgr->hReport, REPORT_SEVERITY_INFORMATION, ": 11g Mode, Slot Time = %d (desired)\n", (TI_UINT8)slotTime);
470 			}
471 			else
472 			{
473 				slotTime = PHY_SLOT_TIME_LONG;
474 
475                 TRACE1(pSiteMgr->hReport, REPORT_SEVERITY_INFORMATION, ": 11g Mode, Slot Time = %d\n", (TI_UINT8) slotTime);
476 			}
477 		}
478 
479 		pSiteMgr->radioBand = RADIO_BAND_2_4_GHZ;
480 		pSiteMgr->pSitesMgmtParams->pCurrentSiteTable = &pSiteMgr->pSitesMgmtParams->dot11BG_sitesTables;
481 	}
482 	else
483 	{
484 		pSiteMgr->siteMgrOperationalMode = DOT11_A_MODE;
485 		pSiteMgr->radioBand = RADIO_BAND_5_0_GHZ;
486 		slotTime = PHY_SLOT_TIME_SHORT;
487 
488         TRACE1(pSiteMgr->hReport, REPORT_SEVERITY_INFORMATION, ": 11a Mode, Slot Time = %d\n", (TI_UINT8)slotTime);
489 
490 		pSiteMgr->pSitesMgmtParams->pCurrentSiteTable = (siteTablesParams_t *)&pSiteMgr->pSitesMgmtParams->dot11A_sitesTables;
491 	}
492 
493 	/* since we are moving to the different band, the siteMgr should be reconfigured */
494 	if(pSiteMgr->prevRadioBand != pSiteMgr->radioBand)
495 		siteMgr_bandParamsConfig(pSiteMgr, TI_TRUE);
496 
497 	if(pPrimarySite->channel <= MAX_GB_MODE_CHANEL)
498 		siteMgr_updateRates(pSiteMgr, TI_FALSE, TI_TRUE);
499 	else
500 		siteMgr_updateRates(pSiteMgr, TI_TRUE, TI_TRUE);
501 
502 	/* configure hal with common core-hal parameters */
503 	TWD_SetRadioBand (pSiteMgr->hTWD, pSiteMgr->radioBand);
504 
505 	pPrimarySite->currentSlotTime = slotTime;
506 	TWD_CfgSlotTime (pSiteMgr->hTWD, slotTime);
507 
508 	/***************** Config Site Manager *************************/
509 	/* L.M. Should be fixed, should take into account the AP's rates */
510 	if(pSiteMgr->pDesiredParams->siteMgrDesiredModulationType == DRV_MODULATION_CCK)
511 		pSiteMgr->chosenModulation = DRV_MODULATION_CCK;
512 	else if(pSiteMgr->pDesiredParams->siteMgrDesiredModulationType == DRV_MODULATION_PBCC)
513 	{
514 		if(pPrimarySite->probeModulation != DRV_MODULATION_NONE)
515 			pSiteMgr->chosenModulation = pPrimarySite->probeModulation;
516 		else
517 			pSiteMgr->chosenModulation = pPrimarySite->beaconModulation;
518 	}
519 	else
520 		pSiteMgr->chosenModulation = DRV_MODULATION_OFDM;
521 
522 	/* We use this variable in order tp perform the PBCC algorithm. */
523 	pSiteMgr->currentDataModulation = pSiteMgr->chosenModulation;
524 	/***************** Config Data CTRL *************************/
525 
526 	pParam->paramType = CTRL_DATA_CURRENT_BSSID_PARAM;							/* Current BSSID */
527 	MAC_COPY (pParam->content.ctrlDataCurrentBSSID, pPrimarySite->bssid);
528 	ctrlData_setParam(pSiteMgr->hCtrlData, pParam);
529 
530 	pParam->paramType = CTRL_DATA_CURRENT_BSS_TYPE_PARAM;							/* Current BSS Type */
531 	pParam->content.ctrlDataCurrentBssType = pPrimarySite->bssType;
532 	ctrlData_setParam(pSiteMgr->hCtrlData, pParam);
533 
534 	pParam->paramType = CTRL_DATA_CURRENT_PREAMBLE_TYPE_PARAM;					/* Current Preamble Type */
535 	if ((pSiteMgr->pDesiredParams->siteMgrDesiredPreambleType == PREAMBLE_SHORT) &&
536 		(pPrimarySite->currentPreambleType == PREAMBLE_SHORT))
537 		pParam->content.ctrlDataCurrentPreambleType = PREAMBLE_SHORT;
538 	else
539 		pParam->content.ctrlDataCurrentPreambleType = PREAMBLE_LONG;
540 	ctrlData_setParam(pSiteMgr->hCtrlData, pParam);
541 
542     /* Mutual Rates Matching */
543 	StaTotalRates = pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.basicRateMask |
544 					pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.supportedRateMask;
545 
546 
547     pSiteMgr->pDesiredParams->siteMgrMatchedSuppRateMask = StaTotalRates &
548 														   pPrimarySite->rateMask.supportedRateMask;
549 
550 	pSiteMgr->pDesiredParams->siteMgrMatchedBasicRateMask = StaTotalRates &
551 															pPrimarySite->rateMask.basicRateMask;
552 	if (pSiteMgr->pDesiredParams->siteMgrMatchedBasicRateMask == 0)
553 	{
554 		pSiteMgr->pDesiredParams->siteMgrMatchedBasicRateMask =
555 			pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.basicRateMask;
556 	}
557 
558     /* set protection */
559     if(BSS_INDEPENDENT == pPrimarySite->bssType)
560     {
561         pParam->paramType = CTRL_DATA_CURRENT_IBSS_PROTECTION_PARAM;
562     }
563     else
564     {
565         pParam->paramType = CTRL_DATA_CURRENT_PROTECTION_STATUS_PARAM;
566     }
567     pParam->content.ctrlDataProtectionEnabled = pPrimarySite->useProtection;
568     ctrlData_setParam(pSiteMgr->hCtrlData, pParam);
569 
570 	pbccAlgorithm(pSiteMgr);
571 
572 	/********** Set Site QOS protocol support *************/
573 
574 	/* Set WME Params */
575 	 status = siteMgr_getWMEParamsSite(pSiteMgr,&p_ACParametersDummy);
576 	 if(status == TI_OK)
577 	 {
578 		 pParam->content.qosSiteProtocol = QOS_WME;
579 	 }
580 	 else
581 	 {
582 		 pParam->content.qosSiteProtocol = QOS_NONE;
583 	 }
584 
585      TRACE1(pSiteMgr->hReport, REPORT_SEVERITY_INFORMATION, " systemConfigt() : pParam->content.qosSiteProtoco %d\n", pParam->content.qosSiteProtocol);
586 
587 	 pParam->paramType = QOS_MNGR_SET_SITE_PROTOCOL;
588 	 qosMngr_setParams(pSiteMgr->hQosMngr, pParam);
589 
590      /* Set active protocol in qosMngr according to station desired mode and site capabilities
591 	    Must be called BEFORE setting the "CURRENT_PS_MODE" into the QosMngr */
592      qosMngr_selectActiveProtocol(pSiteMgr->hQosMngr);
593 
594 	 /* set PS capability parameter */
595 	 pParam->paramType = QOS_MNGR_CURRENT_PS_MODE;
596 	 if(pPrimarySite->APSDSupport == TI_TRUE)
597 		 pParam->content.currentPsMode = PS_SCHEME_UPSD_TRIGGER;
598 	 else
599 		 pParam->content.currentPsMode = PS_SCHEME_LEGACY;
600       qosMngr_setParams(pSiteMgr->hQosMngr, pParam);
601 
602      /* Set upsd/ps_poll configuration */
603      /* Must be done AFTER setting the active Protocol */
604      qosMngr_setAcPsDeliveryMode (pSiteMgr->hQosMngr);
605 
606 
607      /********** Set Site HT setting support *************/
608      /* set HT setting to the FW */
609      /* verify 11n_Enable and Chip type */
610      StaCap_IsHtEnable (pSiteMgr->hStaCap, &b11nEnable);
611 
612      /* verify that WME flag enable */
613      qosMngr_GetWmeEnableFlag (pSiteMgr->hQosMngr, &bWmeEnable);
614 
615      if ((b11nEnable != TI_FALSE) &&
616          (bWmeEnable != TI_FALSE) &&
617          (pPrimarySite->tHtCapabilities.tHdr[0] != TI_FALSE) &&
618          (pPrimarySite->tHtInformation.tHdr[0] != TI_FALSE))
619      {
620          TWD_CfgSetFwHtCapabilities (pSiteMgr->hTWD, &pPrimarySite->tHtCapabilities, TI_TRUE);
621          TWD_CfgSetFwHtInformation (pSiteMgr->hTWD, &pPrimarySite->tHtInformation);
622 
623          /* the FW not supported in HT control field in TX */
624 
625         tHtControl.bHtEnable = TI_FALSE;
626          txCtrlParams_SetHtControl (pSiteMgr->hTxCtrl, &tHtControl);
627      }
628      else
629      {
630          TWD_CfgSetFwHtCapabilities (pSiteMgr->hTWD, &pPrimarySite->tHtCapabilities, TI_FALSE);
631 
632          tHtControl.bHtEnable = TI_FALSE;
633          txCtrlParams_SetHtControl (pSiteMgr->hTxCtrl, &tHtControl);
634      }
635 
636 	/***************** Config RSN *************************/
637     /* Get the RSN IE data */
638     pRsnIe = pPrimarySite->pRsnIe;
639 	length = 0;
640     rsnIECount = 0;
641     while ((length < pPrimarySite->rsnIeLen) && (pPrimarySite->rsnIeLen < 255)
642            && (rsnIECount < MAX_RSN_IE))
643     {
644         curRsnData[0+length] = pRsnIe->hdr[0];
645         curRsnData[1+length] = pRsnIe->hdr[1];
646         os_memoryCopy(pSiteMgr->hOs, &curRsnData[2+length], (void *)pRsnIe->rsnIeData, pRsnIe->hdr[1]);
647         length += pRsnIe->hdr[1]+2;
648         pRsnIe += 1;
649         rsnIECount++;
650     }
651     if (length<pPrimarySite->rsnIeLen)
652     {
653         TRACE2(pSiteMgr->hReport, REPORT_SEVERITY_ERROR, "siteMgr_selectSiteFromTable, RSN IE is too long: rsnIeLen=%d, MAX_RSN_IE=%d\n", pPrimarySite->rsnIeLen, MAX_RSN_IE);
654     }
655 
656 	rsnData.pIe = (pPrimarySite->rsnIeLen==0) ? NULL : curRsnData;
657 	rsnData.ieLen = pPrimarySite->rsnIeLen;
658     rsnData.privacy = pPrimarySite->privacy;
659 
660     rsn_setSite(pSiteMgr->hRsn, &rsnData, NULL, &rsnAssocIeLen);
661 
662 	/***************** Config RegulatoryDomain **************************/
663 
664 #ifdef XCC_MODULE_INCLUDED
665 	/* set XCC TPC if present */
666 	if(XCC_ParseClientTP(pSiteMgr->hOs,pPrimarySite,(TI_INT8 *)&ExternTxPower,pIeBuffer,PktLength) == TI_OK)
667     {
668         TRACE1(pSiteMgr->hReport, REPORT_SEVERITY_INFORMATION, "Select XCC_ParseClientTP == OK: Dbm = %d\n",ExternTxPower);
669         pParam->paramType = REGULATORY_DOMAIN_EXTERN_TX_POWER_PREFERRED;
670         pParam->content.ExternTxPowerPreferred = ExternTxPower;
671         regulatoryDomain_setParam(pSiteMgr->hRegulatoryDomain, pParam);
672     }
673 	/* Parse and save the XCC Version Number if exists */
674 	XCCMngr_parseXCCVer(pSiteMgr->hXCCMngr, pIeBuffer, PktLength);
675 
676 #endif
677 
678 	/* Note: TX Power Control adjustment is now done through siteMgr_assocReport() */
679 	if (pPrimarySite->powerConstraint>0)
680 	{	/* setting power constraint */
681 		pParam->paramType = REGULATORY_DOMAIN_SET_POWER_CONSTRAINT_PARAM;
682 		pParam->content.powerConstraint = pPrimarySite->powerConstraint;
683 		regulatoryDomain_setParam(pSiteMgr->hRegulatoryDomain, pParam);
684 	}
685 
686 
687 	/***************** Config MeasurementMgr object **************************/
688     capabilities = pPrimarySite->capabilities;
689 
690     /* Updating the Measurement Module Mode */
691     measurementMgr_setMeasurementMode(pSiteMgr->hMeasurementMgr, capabilities,
692 									pIeBuffer, PktLength);
693     os_memoryFree(pSiteMgr->hOs, curRsnData, MAX_RSN_DATA_SIZE);
694     os_memoryFree(pSiteMgr->hOs, pParam, sizeof(paramInfo_t));
695 	return TI_OK;
696 }
697 
698