Home | History | Annotate | Download | only in siteMgr
      1 /** \file reportReplvl.c
      2  *  \brief Report level implementation
      3  *
      4  *  \see reportReplvl.h
      5  */
      6 /****************************************************************************
      7 **+-----------------------------------------------------------------------+**
      8 **|                                                                       |**
      9 **| Copyright(c) 1998 - 2008 Texas Instruments. All rights reserved.      |**
     10 **| All rights reserved.                                                  |**
     11 **|                                                                       |**
     12 **| Redistribution and use in source and binary forms, with or without    |**
     13 **| modification, are permitted provided that the following conditions    |**
     14 **| are met:                                                              |**
     15 **|                                                                       |**
     16 **|  * Redistributions of source code must retain the above copyright     |**
     17 **|    notice, this list of conditions and the following disclaimer.      |**
     18 **|  * Redistributions in binary form must reproduce the above copyright  |**
     19 **|    notice, this list of conditions and the following disclaimer in    |**
     20 **|    the documentation and/or other materials provided with the         |**
     21 **|    distribution.                                                      |**
     22 **|  * Neither the name Texas Instruments nor the names of its            |**
     23 **|    contributors may be used to endorse or promote products derived    |**
     24 **|    from this software without specific prior written permission.      |**
     25 **|                                                                       |**
     26 **| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS   |**
     27 **| "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT     |**
     28 **| LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |**
     29 **| A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT  |**
     30 **| OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |**
     31 **| SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT      |**
     32 **| LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |**
     33 **| DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |**
     34 **| THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT   |**
     35 **| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |**
     36 **| OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  |**
     37 **|                                                                       |**
     38 **+-----------------------------------------------------------------------+**
     39 ****************************************************************************/
     40 
     41 /***************************************************************************/
     42 /*																									*/
     43 /*		MODULE:	reportReplvl.c																*/
     44 /*    PURPOSE:	Report level implementation	 										*/
     45 /*																									*/
     46 /***************************************************************************/
     47 #include "osTIType.h"
     48 #include "osApi.h"
     49 #include "siteHash.h"
     50 #include "smeSmApi.h"
     51 #include "utils.h"
     52 #include "smeApi.h"
     53 #include "rsnApi.h"
     54 #include "report.h"
     55 #include "whalCtrl_api.h"
     56 #include "connApi.h"
     57 #include "DataCtrl_Api.h"
     58 #include "siteMgrApi.h"
     59 #include "regulatoryDomainApi.h"
     60 #include "measurementMgrApi.h"
     61 #ifdef EXC_MODULE_INCLUDED
     62 #include "excMngr.h"
     63 #include "TransmitPowerExc.h"
     64 #include "excRMMngr.h"
     65 #endif
     66 
     67 #include "qosMngr_API.h"
     68 
     69 
     70 /****************************************************************************
     71 								MATRIC ISSUE
     72 	Each function in the select process returns a MATCH, NO_MATCH value in order to
     73 	skip non relevant sites. In addition, some of the functions also measures a matching level of a site.
     74 	The matching level is returned as a bit map. The select function 'OR's those bit maps in order to
     75 	select the site that has the biggest matching level. If a function returns a NO_MATCH value, the matching level of the
     76 	site is reset.
     77 	Following is the site matching level bit map structure.
     78 	Please notice, that if all the match functions returned MATCH for a site, its matric must be different than 0,
     79 	because of the rates bits.
     80 
     81 
     82 	    31 - 24           23 - 20           20 - 16             15 - 10       9 - 8         7         6           5         4 - 0
     83 	+---------------+---------------+-----------------------+-------------+------------+----------+---------+-----------+-----------+
     84 	| Rx Level      | Privacy       | Attempts              |Rates        | Modulation |Preamble  | Channel | Spectrum  | Reserved  |
     85 	|		        |	    		|		                | 		      |			   |		  |		    | management|		    |
     86 	+---------------+---------------+-----------------------+-------------+------------+----------+---------+-----------+-----------+
     87 ****************************************************************************/
     88 
     89 /* Matric bit map definition */
     90 typedef enum
     91 {
     92 	/* Rx level */
     93 	METRIC_RX_LEVEL_MASK			= 0xFF,
     94 	METRIC_RX_LEVEL_SHIFT			= 24,
     95 
     96 	/* Privacy */
     97 	METRIC_PRIVACY_MASK				= 0x0F,
     98 	METRIC_PRIVACY_SHIFT			= 20,
     99 
    100 	/* Number of attempts */
    101 	METRIC_ATTEMPTS_NUMBER_MASK		= 0x0F,
    102 	METRIC_ATTEMPTS_NUMBER_SHIFT	= 16,
    103 
    104 
    105 	/* Rates */
    106 	METRIC_RATES_MASK				= 0x3F,
    107 	METRIC_RATES_SHIFT				= 10,
    108 
    109 	/* PBCC */
    110 	METRIC_MODULATION_MASK			= 0x03,
    111 	METRIC_MODULATION_SHIFT			= 8,
    112 
    113 	/* Preamble*/
    114 	METRIC_PREAMBLE_MASK			= 0x01,
    115 	METRIC_PREAMBLE_SHIFT			= 7,
    116 
    117 	/* Channel */
    118 	METRIC_CHANNEL_MASK				= 0x01,
    119 	METRIC_CHANNEL_SHIFT			= 6,
    120 
    121 	/* Spectrum management Capability */
    122 	METRIC_SPECTRUM_MANAGEMENT_MASK	= 0x01,
    123 	METRIC_SPECTRUM_MANAGEMENT_SHIFT= 5,
    124 
    125 	/* Priority Site */
    126 	METRIC_PRIORITY_SITE_MASK		= 0x01,
    127 	METRIC_PRIORITY_SITE_SHIFT		= 4,
    128 
    129 } matric_e;
    130 
    131 #define MAX_GB_MODE_CHANEL		14
    132 
    133 /* RSSI values boundaries and metric values for best, good, etc  signals */
    134 #define SELECT_RSSI_BEST_LEVEL      (-22)
    135 #define SELECT_RSSI_GOOD_LEVEL      (-38)
    136 #define SELECT_RSSI_NORMAL_LEVEL    (-56)
    137 #define SELECT_RSSI_POOR_LEVEL      (-72)
    138 #define SELECT_RSSI_BAD_LEVEL       (-82)
    139 
    140 
    141 #define  RSSI_METRIC_BEST      6
    142 #define  RSSI_METRIC_GOOD      5
    143 #define  RSSI_METRIC_NORMAL    4
    144 #define  RSSI_METRIC_POOR      3
    145 #define  RSSI_METRIC_BAD       2
    146 #define  RSSI_METRIC_NOSIGNAL  1
    147 
    148 /* Local functions prototypes */
    149 
    150 static match_e ssidMatchingLevel(siteMgr_t *pSiteMgr, siteEntry_t *pSite);
    151 
    152 
    153 static match_e bssidMatchingLevel(siteMgr_t *pSiteMgr, siteEntry_t *pSite);
    154 
    155 static match_e bssTypeMatchingLevel(siteMgr_t *pSiteMgr, siteEntry_t *pSite);
    156 
    157 static match_e ratesMatchingLevel(siteMgr_t *pSiteMgr, siteEntry_t *pSite, UINT32 *matchingLevel);
    158 
    159 static match_e modulationTypeMatchingLevel(siteMgr_t *pSiteMgr, siteEntry_t *pSite, UINT32 *matchingLevel);
    160 
    161 static match_e preambleTypeMatchingLevel(siteMgr_t *pSiteMgr, siteEntry_t *pSite, UINT32 *matchingLevel);
    162 
    163 static match_e channelMatchingLevel(siteMgr_t *pSiteMgr, siteEntry_t *pSite, UINT32 *matchingLevel);
    164 
    165 static match_e spectrumManagementMatchingLevel(siteMgr_t *pSiteMgr, UINT16 siteCapability, UINT32 *matchingLevel);
    166 
    167 static match_e rxLevelMatchingLevel(siteMgr_t *pSiteMgr, siteEntry_t *pSite, UINT32 *matchingLevel);
    168 
    169 static match_e attemptsNumberMatchingLevel(siteMgr_t *pSiteMgr, siteEntry_t *pSite, UINT32 *matchingLevel);
    170 
    171 static match_e prioritySiteMatchingLevel(siteMgr_t *pSiteMgr, siteEntry_t *pSite, UINT32 *matchingLevel);
    172 
    173 static siteEntry_t *addSelfSite(siteMgr_t *pSiteMgr);
    174 
    175 static TI_STATUS sendProbeResponse(siteMgr_t *pSiteMgr, macAddress_t *pBssid);
    176 
    177 /* Interface functions Implementation */
    178 
    179 
    180 /**************************************************************/
    181 /* DEBUG CLI CRASH (systemConfig stack usage reduction)       */
    182 /**************************************************************/
    183 
    184 static paramInfo_t gSystemCfgParam;
    185 static UINT8       curRsnData[255];
    186 /**************************************************************/
    187 
    188 /***********************************************************************
    189  *                        siteMgr_disSelectSite
    190  ***********************************************************************
    191 DESCRIPTION: Called by the SME SM in order to dis select the primary site.
    192 			The function set the primary site pointer to NULL and set its type to type regular
    193 
    194 INPUT:      hSiteMgr	-	site mgr handle.
    195 
    196 OUTPUT:
    197 
    198 RETURN:     OK
    199 
    200 ************************************************************************/
    201 TI_STATUS siteMgr_disSelectSite(TI_HANDLE	hSiteMgr)
    202 {
    203 	siteMgr_t	*pSiteMgr = (siteMgr_t *)hSiteMgr;
    204 
    205 	/* This protection is because in the case that the BSS was LOST the primary site was removed already. */
    206 	if (pSiteMgr->pSitesMgmtParams->pPrimarySite != NULL)
    207 	{
    208         WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,  ("siteMgr_disSelectSite REMOVE Primary ssid=%s, bssid= 0x%x-0x%x-0x%x-0x%x-0x%x-0x%x\n\n",
    209                    pSiteMgr->pSitesMgmtParams->pPrimarySite->ssid.ssidString,
    210                    pSiteMgr->pSitesMgmtParams->pPrimarySite->bssid.addr[0], pSiteMgr->pSitesMgmtParams->pPrimarySite->bssid.addr[1], pSiteMgr->pSitesMgmtParams->pPrimarySite->bssid.addr[2],
    211                    pSiteMgr->pSitesMgmtParams->pPrimarySite->bssid.addr[3], pSiteMgr->pSitesMgmtParams->pPrimarySite->bssid.addr[4], pSiteMgr->pSitesMgmtParams->pPrimarySite->bssid.addr[5] ));
    212 
    213         pSiteMgr->pSitesMgmtParams->pPrimarySite->siteType = SITE_REGULAR;
    214 		pSiteMgr->pSitesMgmtParams->pPrevPrimarySite = pSiteMgr->pSitesMgmtParams->pPrimarySite;
    215 		pSiteMgr->pSitesMgmtParams->pPrimarySite = NULL;
    216 	}
    217 
    218 	return OK;
    219 }
    220 
    221 /***********************************************************************
    222  *                        siteMgr_selectSite
    223  ***********************************************************************
    224 DESCRIPTION: Site selection function. Called by the SME SM in order to select
    225 			the best site for teh station.
    226 			The function go over the site table, and for each site it calls the match functions
    227 			If one fo the functions returns NO_MATCH from some reason, it skips the current site
    228 			and move to the next one.
    229 			The site that has the biggest bit map is chosen.
    230 				-	If a site is chosen, the function calls the 'systemConfig()' function in order
    231 					to configure the station with the chosen site attribute. Than it reports
    232 					a select status success to the SME SM.
    233 				-	If no site is chosen & the desired BSS type is infrastructure, it reports
    234 					a select status failure to the SME SM.
    235 				-	If no site is chosen but the desired BSS type is IBSS, we create a self site by adding an entry
    236 					to the site table, than we configure the system and reports a select status success to the SME SM.
    237 
    238 			NOTE: if the reScanFlag is set, means we received a scan command from the utility while in the
    239 					previous scanning, we report a select status failure to the SME SM because a re scan is needed
    240 					and we don't perform a selection.
    241 
    242 
    243 INPUT:      hSiteMgr	-	site mgr handle.
    244 
    245 OUTPUT:
    246 
    247 RETURN:     OK
    248 
    249 ************************************************************************/
    250 siteEntry_t* siteMgr_selectSiteFromTable(TI_HANDLE	hSiteMgr)
    251 {
    252 	UINT32		metric;
    253 	UINT32		prevMatchingLevel = 0;
    254 	UINT8		siteIndex, tableIndex, numberOfSites = 0;
    255 	siteMgr_t	*pSiteMgr = (siteMgr_t *)hSiteMgr;
    256 	siteEntry_t	*pSiteEntry, *pLastMatchSite = NULL;
    257 	rsnData_t	rsnData;
    258 	dot11_RSN_t	*pRsnIe;
    259 	UINT8		rsnIECount=0;
    260 	UINT8       	length=0;
    261 	paramInfo_t	param;
    262 	radioBand_e	radioBand;
    263 	BOOL		bRegulatoryDomainEnabled;
    264 
    265 	siteTablesParams_t* currTable = pSiteMgr->pSitesMgmtParams->pCurrentSiteTable;
    266 
    267 	WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
    268 							("SITE MATCH , Desired ssid (%s) len= (%d)\n\n",
    269 							 pSiteMgr->pDesiredParams->siteMgrDesiredSSID.ssidString,
    270 							 pSiteMgr->pDesiredParams->siteMgrDesiredSSID.len));
    271 
    272 
    273     for (tableIndex = 0; tableIndex < NUM_OF_SITE_TABLE ; tableIndex++)
    274 	{
    275 		/* If regulatoryDomains is enable, it should be checked if Country IE was detected */
    276 		param.paramType = REGULATORY_DOMAIN_ENABLED_PARAM;
    277 		regulatoryDomain_getParam(pSiteMgr->hRegulatoryDomain,&param);
    278 		bRegulatoryDomainEnabled = param.content.regulatoryDomainEnabled;
    279 
    280 		if(currTable == &pSiteMgr->pSitesMgmtParams->dot11BG_sitesTables)
    281 			radioBand = RADIO_BAND_2_4_GHZ;
    282 		else
    283 			radioBand = RADIO_BAND_5_0_GHZ;
    284 
    285 		/* Check if country code was received */
    286 		param.paramType			 = REGULATORY_DOMAIN_IS_COUNTRY_FOUND;
    287 		param.content.eRadioBand = radioBand;
    288 		regulatoryDomain_getParam(pSiteMgr->hRegulatoryDomain,&param);
    289 
    290 		if( ( bRegulatoryDomainEnabled == TRUE) && ( !param.content.bIsCountryFound ) )
    291 		{
    292 			if( radioBand == RADIO_BAND_2_4_GHZ)
    293 				WLAN_REPORT_WARNING(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,  ("There is no valid Country IE for 2.4G band\n"));
    294 			else
    295 				WLAN_REPORT_WARNING(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,  ("There is no valid Country IE for 5G band\n"));
    296 
    297 			if(pSiteMgr->pDesiredParams->siteMgrDesiredDot11Mode == DOT11_DUAL_MODE)
    298 			{
    299 				/* change site table */
    300 				if(currTable == &pSiteMgr->pSitesMgmtParams->dot11BG_sitesTables)
    301                 {
    302                     currTable = (siteTablesParams_t *)&pSiteMgr->pSitesMgmtParams->dot11A_sitesTables;
    303 /*                    siteMgr_updateRates(pSiteMgr, TRUE, TRUE);*/
    304                 }
    305 				else
    306                 {
    307                     currTable = &pSiteMgr->pSitesMgmtParams->dot11BG_sitesTables;
    308 /*                    siteMgr_updateRates(pSiteMgr, FALSE, TRUE);*/
    309                 }
    310 			}
    311 			continue;
    312 		}
    313 
    314 		for (siteIndex = 0; siteIndex < currTable->maxNumOfSites; siteIndex++)
    315 		{
    316 			pSiteEntry = &(currTable->siteTable[siteIndex]);
    317 
    318 			length = 0;
    319 			metric = 0;
    320 			pSiteEntry->matchingLevel = 0;
    321 
    322 
    323 			if(pSiteEntry->siteType == SITE_PRIMARY)
    324 			{
    325 				WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,  ("SITE PRIMARY, ssid (%s len= %d ),  %X-%X-%X-%X-%X-%X\n\n", pSiteEntry->ssid.ssidString, pSiteEntry->ssid.len, pSiteEntry->bssid.addr[0], pSiteEntry->bssid.addr[1], pSiteEntry->bssid.addr[2], pSiteEntry->bssid.addr[3], pSiteEntry->bssid.addr[4], pSiteEntry->bssid.addr[5]));
    326 			}
    327 
    328 
    329 			if (pSiteEntry->siteType != SITE_REGULAR)
    330 				continue;
    331 
    332 			numberOfSites++;
    333 
    334 			pSiteEntry->ssid.ssidString[pSiteEntry->ssid.len] = 0;
    335 			if (ssidMatchingLevel(pSiteMgr, pSiteEntry) != MATCH)
    336 			{
    337 				WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,  ("SITE MATCH FAILURE, ssid (%s len= %d ),  %X-%X-%X-%X-%X-%X\n\n", pSiteEntry->ssid.ssidString, pSiteEntry->ssid.len, pSiteEntry->bssid.addr[0], pSiteEntry->bssid.addr[1], pSiteEntry->bssid.addr[2], pSiteEntry->bssid.addr[3], pSiteEntry->bssid.addr[4], pSiteEntry->bssid.addr[5]));
    338 				continue;
    339 			}
    340 
    341 			if (bssidMatchingLevel(pSiteMgr, pSiteEntry) != MATCH)
    342 			{
    343 				WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,  ("SITE MATCH FAILURE, bssid,  %X-%X-%X-%X-%X-%X\n\n", pSiteEntry->bssid.addr[0], pSiteEntry->bssid.addr[1], pSiteEntry->bssid.addr[2], pSiteEntry->bssid.addr[3], pSiteEntry->bssid.addr[4], pSiteEntry->bssid.addr[5]));
    344 				continue;
    345 			}
    346 
    347 			if (bssTypeMatchingLevel(pSiteMgr, pSiteEntry) != MATCH)
    348 			{
    349 				WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,  ("SITE MATCH FAILURE, bss Type,  %X-%X-%X-%X-%X-%X\n", pSiteEntry->bssid.addr[0], pSiteEntry->bssid.addr[1], pSiteEntry->bssid.addr[2], pSiteEntry->bssid.addr[3], pSiteEntry->bssid.addr[4], pSiteEntry->bssid.addr[5]));
    350 				WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,  ("SITE MATCH FAILURE, bss Type,  siteMgrDesiredBSSType=%d, bssType=%d\n",pSiteMgr->pDesiredParams->siteMgrDesiredBSSType, pSiteEntry->bssType));
    351 				continue;
    352 			}
    353 
    354 			if (ratesMatchingLevel(pSiteMgr, pSiteEntry, &metric) != MATCH)
    355 			{
    356 				pSiteEntry->matchingLevel = 0;
    357 				WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,  ("SITE MATCH FAILURE, rates,  %X-%X-%X-%X-%X-%X\n\n", pSiteEntry->bssid.addr[0], pSiteEntry->bssid.addr[1], pSiteEntry->bssid.addr[2], pSiteEntry->bssid.addr[3], pSiteEntry->bssid.addr[4], pSiteEntry->bssid.addr[5]));
    358 				continue;
    359 			}
    360 			pSiteEntry->matchingLevel |= metric << METRIC_RATES_SHIFT;
    361 
    362 
    363 			/* Get the RSN IE data */
    364 			pRsnIe = pSiteEntry->pRsnIe;
    365             rsnIECount = 0;
    366 			while ((length < pSiteEntry->rsnIeLen) && (rsnIECount < MAX_RSN_IE))
    367 			{
    368 				curRsnData[0+length] = pRsnIe->hdr.eleId;
    369 				curRsnData[1+length] = pRsnIe->hdr.eleLen;
    370 				os_memoryCopy(pSiteMgr->hOs, &curRsnData[2+length], (void *)pRsnIe->rsnIeData, pRsnIe->hdr.eleLen);
    371 				length += pRsnIe->hdr.eleLen+2;
    372 				pRsnIe += 1;
    373                 rsnIECount++;
    374 			}
    375             if (length<pSiteEntry->rsnIeLen)
    376             {
    377                 WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
    378                                   ("siteMgr_selectSiteFromTable, RSN IE is too long: rsnIeLen=%d, MAX_RSN_IE=%d\n",
    379                                     pSiteEntry->rsnIeLen, MAX_RSN_IE));
    380 			}
    381 
    382 			rsnData.pIe = (pSiteEntry->rsnIeLen==0) ? NULL :curRsnData;
    383 			rsnData.ieLen = pSiteEntry->rsnIeLen;
    384 			rsnData.privacy = pSiteEntry->privacy;
    385 
    386 			if (rsn_evalSite(pSiteMgr->hRsn, &rsnData, pSiteEntry->bssType, pSiteEntry->bssid, &metric) != OK)
    387 			{
    388 				pSiteEntry->matchingLevel = 0;
    389 				WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,  ("SITE MATCH FAILURE, RSN,  %X-%X-%X-%X-%X-%X\n\n", pSiteEntry->bssid.addr[0], pSiteEntry->bssid.addr[1], pSiteEntry->bssid.addr[2], pSiteEntry->bssid.addr[3], pSiteEntry->bssid.addr[4], pSiteEntry->bssid.addr[5]));
    390 				continue;
    391 			}
    392 
    393 			pSiteEntry->matchingLevel |= metric << METRIC_PRIVACY_SHIFT;
    394 
    395 
    396 
    397 
    398 #if 0 /* TODO - Define 4x evaluation */
    399 			if (ctrlData_evalSite(pSiteMgr->hCtrlData, &pSiteEntry->fourXParams, &metric) != OK)
    400 			{
    401 				pSiteEntry->matchingLevel = 0;
    402 				WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,  ("SITE MATCH FAILURE, RSN,  %X-%X-%X-%X-%X-%X\n\n", pSiteEntry->bssid.addr[0], pSiteEntry->bssid.addr[1], pSiteEntry->bssid.addr[2], pSiteEntry->bssid.addr[3], pSiteEntry->bssid.addr[4], pSiteEntry->bssid.addr[5]));
    403 				continue;
    404 			}
    405 			pSiteEntry->matchingLevel |= metric << METRIC_4X_SHIFT;
    406 #endif
    407 
    408 			if (modulationTypeMatchingLevel(pSiteMgr, pSiteEntry, &metric) != MATCH)
    409 			{
    410 				pSiteEntry->matchingLevel = 0;
    411 				WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,  ("SITE MATCH FAILURE, modulation Type,  %X-%X-%X-%X-%X-%X\n\n", pSiteEntry->bssid.addr[0], pSiteEntry->bssid.addr[1], pSiteEntry->bssid.addr[2], pSiteEntry->bssid.addr[3], pSiteEntry->bssid.addr[4], pSiteEntry->bssid.addr[5]));
    412 				continue;
    413 			}
    414 			pSiteEntry->matchingLevel |= metric << METRIC_MODULATION_SHIFT;
    415 
    416 			if (preambleTypeMatchingLevel(pSiteMgr, pSiteEntry, &metric) != MATCH)
    417 			{
    418 				pSiteEntry->matchingLevel = 0;
    419 				WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,  ("SITE MATCH FAILURE, preamble,  %X-%X-%X-%X-%X-%X\n\n", pSiteEntry->bssid.addr[0], pSiteEntry->bssid.addr[1], pSiteEntry->bssid.addr[2], pSiteEntry->bssid.addr[3], pSiteEntry->bssid.addr[4], pSiteEntry->bssid.addr[5]));
    420 				continue;
    421 			}
    422 			pSiteEntry->matchingLevel |= metric << METRIC_PREAMBLE_SHIFT;
    423 
    424 			if (channelMatchingLevel(pSiteMgr, pSiteEntry, &metric) != MATCH)
    425 			{
    426 				pSiteEntry->matchingLevel = 0;
    427 				WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,  ("SITE MATCH FAILURE, channel,  %X-%X-%X-%X-%X-%X\n\n", pSiteEntry->bssid.addr[0], pSiteEntry->bssid.addr[1], pSiteEntry->bssid.addr[2], pSiteEntry->bssid.addr[3], pSiteEntry->bssid.addr[4], pSiteEntry->bssid.addr[5]));
    428 				continue;
    429 			}
    430 			pSiteEntry->matchingLevel |= metric << METRIC_CHANNEL_SHIFT;
    431 
    432 			if (spectrumManagementMatchingLevel(pSiteMgr,pSiteEntry->capabilities,&metric) != MATCH)
    433 			{
    434 				pSiteEntry->matchingLevel = 0;
    435 				WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,  ("SITE MATCH FAILURE, spectrum management.\n\n"));
    436 				continue;
    437 			}
    438 			pSiteEntry->matchingLevel |= metric << METRIC_SPECTRUM_MANAGEMENT_SHIFT;
    439 
    440 			if (rxLevelMatchingLevel(pSiteMgr, pSiteEntry, &metric) != MATCH)
    441 			{
    442 				pSiteEntry->matchingLevel = 0;
    443 				WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,  ("SITE MATCH FAILURE, Rx level,  %X-%X-%X-%X-%X-%X\n\n", pSiteEntry->bssid.addr[0], pSiteEntry->bssid.addr[1], pSiteEntry->bssid.addr[2], pSiteEntry->bssid.addr[3], pSiteEntry->bssid.addr[4], pSiteEntry->bssid.addr[5]));
    444 				continue;
    445 			}
    446 			pSiteEntry->matchingLevel |= metric << METRIC_RX_LEVEL_SHIFT;
    447 
    448 			if (attemptsNumberMatchingLevel(pSiteMgr, pSiteEntry, &metric) != MATCH)
    449 			{
    450 				pSiteEntry->matchingLevel = 0;
    451 				WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,  ("SITE MATCH FAILURE, Number of attempts,  %X-%X-%X-%X-%X-%X\n\n", pSiteEntry->bssid.addr[0], pSiteEntry->bssid.addr[1], pSiteEntry->bssid.addr[2], pSiteEntry->bssid.addr[3], pSiteEntry->bssid.addr[4], pSiteEntry->bssid.addr[5]));
    452 				continue;
    453 			}
    454 			pSiteEntry->matchingLevel |= metric << METRIC_ATTEMPTS_NUMBER_SHIFT;
    455 
    456 			if (prioritySiteMatchingLevel(pSiteMgr, pSiteEntry, &metric) != MATCH)
    457 			{
    458 				pSiteEntry->matchingLevel = 0;
    459 				WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,  ("SITE MATCH FAILURE, priority Site,  %X-%X-%X-%X-%X-%X\n\n", pSiteEntry->bssid.addr[0], pSiteEntry->bssid.addr[1], pSiteEntry->bssid.addr[2], pSiteEntry->bssid.addr[3], pSiteEntry->bssid.addr[4], pSiteEntry->bssid.addr[5]));
    460 				continue;
    461 			}
    462 			pSiteEntry->matchingLevel |= metric << METRIC_PRIORITY_SITE_SHIFT;
    463 
    464 			if(pSiteEntry->matchingLevel > prevMatchingLevel)
    465 			{
    466 				prevMatchingLevel = pSiteEntry->matchingLevel;
    467 				pLastMatchSite = pSiteEntry;
    468 			}
    469 		}
    470 		if(pSiteMgr->pDesiredParams->siteMgrDesiredDot11Mode == DOT11_DUAL_MODE)
    471 		{
    472             /* change site table */
    473             if(currTable == &pSiteMgr->pSitesMgmtParams->dot11BG_sitesTables)
    474             {
    475                 currTable = (siteTablesParams_t *)&pSiteMgr->pSitesMgmtParams->dot11A_sitesTables;
    476 /*                siteMgr_updateRates(pSiteMgr, TRUE, TRUE);*/
    477             }
    478             else
    479             {
    480                 currTable = &pSiteMgr->pSitesMgmtParams->dot11BG_sitesTables;
    481  /*               siteMgr_updateRates(pSiteMgr, FALSE, TRUE);*/
    482             }
    483 		}
    484 		else
    485 			break;
    486 
    487 	}
    488 	WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,  ("				NUMBER OF SITES:	%d\n\n", numberOfSites));
    489 
    490 	return pLastMatchSite;
    491 }
    492 
    493 TI_STATUS siteMgr_selectSite(TI_HANDLE	hSiteMgr)
    494 {
    495 	radioBand_e radioBand;
    496 	paramInfo_t	param;
    497 	siteMgr_t	*pSiteMgr = (siteMgr_t *)hSiteMgr;
    498 
    499 	siteEntry_t* pLastMatchSite = siteMgr_selectSiteFromTable(hSiteMgr);
    500 
    501 	if (pLastMatchSite != NULL)
    502 	{
    503 		pSiteMgr->pSitesMgmtParams->pPrimarySite = pLastMatchSite;
    504 		pLastMatchSite->siteType = SITE_PRIMARY;
    505 
    506 		WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,  ("SELECT SUCCESS FROM TABLE, bssid: %X-%X-%X-%X-%X-%X\n\n", pLastMatchSite->bssid.addr[0], pLastMatchSite->bssid.addr[1], pLastMatchSite->bssid.addr[2], pLastMatchSite->bssid.addr[3], pLastMatchSite->bssid.addr[4], pLastMatchSite->bssid.addr[5]));
    507 
    508 
    509 		/***************** Config Connection *************************/
    510 		param.paramType = CONN_TYPE_PARAM;
    511 		if (pLastMatchSite->bssType == BSS_INDEPENDENT)
    512 			param.content.connType = CONNECTION_IBSS;
    513 		else
    514 			param.content.connType = CONNECTION_INFRA;
    515 		conn_setParam(pSiteMgr->hConn, &param);
    516 
    517 		return smeSm_reportSelectStatus(pSiteMgr->hSmeSm, (mgmtStatus_e)SELECT_STATUS_SUCCESS);
    518 	}
    519 
    520 	if ((pSiteMgr->pDesiredParams->siteMgrDesiredBSSType == BSS_ANY) ||
    521 		(pSiteMgr->pDesiredParams->siteMgrDesiredBSSType == BSS_INDEPENDENT))	/* Means we can start our own BSS */
    522 	{
    523 
    524 		if (pSiteMgr->pDesiredParams->siteMgrDesiredChannel >= SITE_MGR_CHANNEL_A_MIN)
    525 		{
    526 			radioBand = RADIO_BAND_5_0_GHZ;
    527 		}
    528 		else {
    529 			radioBand = RADIO_BAND_2_4_GHZ;
    530 		}
    531 
    532         /*
    533         update the regulatory domain with the selected band
    534         */
    535 		/* Check if the selected channel is valid according to regDomain */
    536 		param.paramType = REGULATORY_DOMAIN_GET_SCAN_CAPABILITIES;
    537 		param.content.channelCapabilityReq.band = radioBand;
    538 		param.content.channelCapabilityReq.scanOption = ACTIVE_SCANNING;
    539 		param.content.channelCapabilityReq.channelNum = pSiteMgr->pDesiredParams->siteMgrDesiredChannel;
    540 		regulatoryDomain_getParam(pSiteMgr->hRegulatoryDomain,&param);
    541 		if (!param.content.channelCapabilityRet.channelValidity)
    542 		{
    543 			WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,  ("IBSS SELECT FAILURE  - No channel !!!\n\n"));
    544 			return smeSm_reportSelectStatus(pSiteMgr->hSmeSm, (mgmtStatus_e)SELECT_STATUS_FAILURE);
    545 		}
    546 
    547 		pLastMatchSite = addSelfSite(pSiteMgr);
    548 		if (pLastMatchSite == NULL)
    549 		{
    550 			WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,  ("IBSS SELECT FAILURE  - could not open self site !!!\n\n"));
    551 			return smeSm_reportSelectStatus(pSiteMgr->hSmeSm, (mgmtStatus_e)SELECT_STATUS_FAILURE);
    552 		}
    553 
    554 		pSiteMgr->pSitesMgmtParams->pPrimarySite = pLastMatchSite;
    555 		pLastMatchSite->siteType = SITE_SELF;
    556 
    557 		WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,  ("%%%%%%%%%%%%%%	SELF SELECT SUCCESS, bssid: %X-%X-%X-%X-%X-%X	%%%%%%%%%%%%%%\n\n", pLastMatchSite->bssid.addr[0], pLastMatchSite->bssid.addr[1], pLastMatchSite->bssid.addr[2], pLastMatchSite->bssid.addr[3], pLastMatchSite->bssid.addr[4], pLastMatchSite->bssid.addr[5]));
    558 
    559 		/***************** Config Connection *************************/
    560 
    561 		param.paramType = CONN_TYPE_PARAM;											/* Connection Type*/
    562 		param.content.connType = CONNECTION_SELF;
    563 		conn_setParam(pSiteMgr->hConn, &param);
    564 
    565 		return smeSm_reportSelectStatus(pSiteMgr->hSmeSm, (mgmtStatus_e)SELECT_STATUS_SUCCESS);
    566 	}
    567 
    568 	WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,  ("SELECT FAILURE \n\n"));
    569 
    570 	return smeSm_reportSelectStatus(pSiteMgr->hSmeSm, (mgmtStatus_e)SELECT_STATUS_FAILURE);
    571 }
    572 
    573 
    574 void siteMgr_setNotReceivedParameter(TI_HANDLE	hSiteMgr, ssid_t* ssid , radioBand_e band)
    575 {
    576 	UINT8		siteIndex;
    577 	siteEntry_t *pSiteEntry;
    578 	siteMgr_t	*pSiteMgr = (siteMgr_t *)hSiteMgr;
    579 	siteTablesParams_t* currTable=NULL;
    580 
    581 
    582 	/*
    583 	 * Set the propiate site table.
    584 	 */
    585 	switch (band) {
    586 	case  RADIO_BAND_2_4_GHZ  :
    587 		currTable = &pSiteMgr->pSitesMgmtParams->dot11BG_sitesTables;
    588 		break;
    589 
    590 	case RADIO_BAND_5_0_GHZ :
    591 		currTable = (siteTablesParams_t*)&pSiteMgr->pSitesMgmtParams->dot11A_sitesTables;
    592 		break;
    593 
    594 	case RADIO_BAND_DUAL:
    595 	default:
    596 		WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,  ("siteMgr_setNotReceivedParameter() invalid band.\n"));
    597 
    598 	}
    599 
    600 
    601 	/*
    602 	 *  Increase the scanned sites "Not_Received" counter, this counter is used by the
    603 	 *  aging logic to clean old sites.
    604 	 */
    605 	for (siteIndex = 0; siteIndex < currTable->maxNumOfSites; siteIndex++)
    606 	{
    607 		pSiteEntry = &(currTable->siteTable[siteIndex]);
    608 
    609 		/* Self site & null site are never aged out. */
    610 		if ((pSiteEntry->siteType == SITE_SELF) || (pSiteEntry->siteType == SITE_NULL) || (pSiteEntry->siteType == SITE_PRIMARY))
    611 			continue;
    612 
    613 		/* If scan for any ssid all sites are expected to be found, and all should be marked. */
    614 		if( utils_isAnySSID(ssid) )
    615 		{
    616 			pSiteEntry->Not_Received++;
    617 		}
    618 		/* otherwise, the scan was a unicast scan, and thus only sites that match the desired SSID are marked*/
    619 		else
    620 		{
    621             if(os_memoryCompare(pSiteMgr->hOs, (UINT8 *)ssid->ssidString, (UINT8 *)pSiteEntry->ssid.ssidString, pSiteEntry->ssid.len) == 0)
    622 			{
    623 				pSiteEntry->Not_Received++;
    624 			}
    625 		}
    626 	} /* for (... all sites in table ) */
    627 }
    628 
    629 
    630 
    631 void siteMgr_resetAttemptsNumberParameter(TI_HANDLE	hSiteMgr)
    632 {
    633 	UINT8		siteIndex, tableIndex;
    634 	siteEntry_t *pSiteEntry;
    635 	siteMgr_t	*pSiteMgr = (siteMgr_t *)hSiteMgr;
    636 
    637 	siteTablesParams_t* currTable = pSiteMgr->pSitesMgmtParams->pCurrentSiteTable;
    638 
    639 	for (tableIndex = 0; tableIndex < NUM_OF_SITE_TABLE ; tableIndex++)
    640 	{
    641 		for (siteIndex = 0; siteIndex < currTable->maxNumOfSites; siteIndex++)
    642 		{
    643 			pSiteEntry = &(currTable->siteTable[siteIndex]);
    644 
    645 			/* Self site & null site are never aged out. */
    646 			if ((pSiteEntry->siteType == SITE_SELF) || (pSiteEntry->siteType == SITE_NULL))
    647 				continue;
    648 
    649 			pSiteEntry->attemptsNumber = 0;
    650 		}
    651 		if(pSiteMgr->pDesiredParams->siteMgrDesiredDot11Mode == DOT11_DUAL_MODE)
    652 		{
    653 			/* change site table */
    654 			if(currTable == &pSiteMgr->pSitesMgmtParams->dot11BG_sitesTables)
    655 				currTable = (siteTablesParams_t *)&pSiteMgr->pSitesMgmtParams->dot11A_sitesTables;
    656 			else
    657 				currTable = &pSiteMgr->pSitesMgmtParams->dot11BG_sitesTables;
    658 		}
    659 		else
    660 			break;
    661 
    662 	}
    663 }
    664 
    665 /* Local functions Implementation */
    666 
    667 /************************************************************************************************************/
    668 /*		Each functions of the following measures the matching level of a site for the specific attribute,
    669 		for example: BSSId, SSID, etc...
    670 		The input is the site manager handle which contains the desired attributes, and a pointer
    671 		to the site in the site table.
    672 		The function returns NO_MATCH if it is not possible to work with this site and MATCH otherwise.
    673 		Some of the functions, in a case of a MATCH, compute also the site matching level and returns it too.
    674 		This used later in the function 'siteMgr_selectSite()'.
    675 	*/
    676 /************************************************************************************************************/
    677 
    678 static match_e ssidMatchingLevel(siteMgr_t *pSiteMgr, siteEntry_t *pSite)
    679 {
    680 	if (pSiteMgr->pDesiredParams->siteMgrDesiredSSID.len == 0)
    681 	{	/* match any site that is not hidden */
    682         if (pSite->ssid.ssidString[0]=='\0') /* hidden ssid */
    683         {
    684             WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,  ("Null SSID and hidden ssid \n\n"));
    685             return NO_MATCH;
    686         }
    687         else
    688         {
    689             WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,  ("Null SSID and not hidden ssid \n\n"));
    690             return MATCH;
    691         }
    692     }
    693 	if ((pSiteMgr->pDesiredParams->siteMgrDesiredSSID.len == pSite->ssid.len) &&
    694             (os_memoryCompare(pSiteMgr->hOs, (UINT8 *)pSiteMgr->pDesiredParams->siteMgrDesiredSSID.ssidString, (UINT8 *)pSite->ssid.ssidString, pSite->ssid.len) == 0))
    695 		return MATCH;
    696 
    697 	else
    698 		return NO_MATCH;
    699 }
    700 
    701 
    702 static match_e bssidMatchingLevel(siteMgr_t *pSiteMgr, siteEntry_t *pSite)
    703 {
    704 	/* If BSSID is NULL, return NO_MATCH */
    705 	if MAC_NULL((&(pSite->bssid)))
    706 		return NO_MATCH;
    707 
    708 	if MAC_BROADCAST((&(pSiteMgr->pDesiredParams->siteMgrDesiredBSSID)))
    709 		return MATCH;
    710 
    711 	if MAC_EQUAL((&(pSite->bssid)), (&(pSiteMgr->pDesiredParams->siteMgrDesiredBSSID)))
    712 		return MATCH;
    713 
    714 	return NO_MATCH;
    715 }
    716 
    717 static match_e bssTypeMatchingLevel(siteMgr_t *pSiteMgr, siteEntry_t *pSite)
    718 {
    719 	if (pSiteMgr->pDesiredParams->siteMgrDesiredBSSType == BSS_ANY)
    720 		return MATCH;
    721 
    722 	if (pSiteMgr->pDesiredParams->siteMgrDesiredBSSType == pSite->bssType)
    723 		return MATCH;
    724 
    725 	return NO_MATCH;
    726 }
    727 
    728 static match_e ratesMatchingLevel(siteMgr_t *pSiteMgr, siteEntry_t *pSite, UINT32 *matchingLevel)
    729 {
    730     UINT32 MatchedBasicRateMask;
    731     UINT32 MatchedSupportedRateMask;
    732     UINT32 MatchedMaxBasicRate;
    733     UINT32 MatchedMaxActiveRate;
    734 	UINT32 StaTotalRates;
    735 	UINT32 SiteTotalRates;
    736 
    737 	/* If the basic or active rate are invalid (0), return NO_MATCH. */
    738 	if ((pSite->maxBasicRate == DRV_RATE_INVALID) || (pSite->maxActiveRate == DRV_RATE_INVALID))
    739 	{
    740 		WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,  ("SITE MATCH FAILURE, 1.maxBasic=%d,maxActive=%d \n", pSite->maxBasicRate,pSite->maxActiveRate));
    741 		return NO_MATCH;
    742 	}
    743 
    744 	if (DRV_RATE_MAX < pSite->maxBasicRate)
    745 	{
    746 		WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,  ("SITE MATCH FAILURE, 1.maxBasic=%d,maxActive=%d \n", pSite->maxBasicRate,pSite->maxActiveRate));
    747 		return NO_MATCH;
    748 	}
    749 
    750 	if(pSite->channel <= 14)
    751 		siteMgr_updateRates(pSiteMgr, FALSE, TRUE);
    752 	else
    753 		siteMgr_updateRates(pSiteMgr, TRUE, TRUE);
    754 
    755 	StaTotalRates = pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.basicRateMask
    756 				| pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.supportedRateMask;
    757 
    758 	SiteTotalRates = pSite->rateMask.basicRateMask | pSite->rateMask.supportedRateMask;
    759 
    760 	MatchedBasicRateMask = SiteTotalRates
    761 				& pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.basicRateMask;
    762 
    763 
    764     MatchedSupportedRateMask = SiteTotalRates &
    765 				pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.supportedRateMask;
    766 
    767     if ((StaTotalRates & pSite->rateMask.basicRateMask) != pSite->rateMask.basicRateMask)
    768     {
    769         WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,  ("SITE MATCH FAILURE, Basic or Supported Rates Doesn't Match \n"));
    770         return NO_MATCH;
    771 
    772     }
    773 
    774 
    775     MatchedMaxBasicRate = getMaxRatefromBitmap(MatchedBasicRateMask);
    776     MatchedMaxActiveRate = getMaxRatefromBitmap(MatchedSupportedRateMask);
    777 
    778     MatchedMaxActiveRate = MAX(MatchedMaxBasicRate,MatchedMaxActiveRate);
    779 
    780 	*matchingLevel = MatchedMaxActiveRate;
    781 	return MATCH;
    782 }
    783 
    784 static match_e modulationTypeMatchingLevel(siteMgr_t *pSiteMgr, siteEntry_t *pSite, UINT32 *matchingLevel)
    785 {
    786 	/* If the desired modulation is CCK, we set the modulation bits off. */
    787 	if (pSiteMgr->pDesiredParams->siteMgrDesiredModulationType == DRV_MODULATION_CCK)
    788 	{
    789 		*matchingLevel = 0;
    790 		return MATCH;
    791 	}
    792 
    793 	/* Now, the desired modulation is PBCC */
    794 	if (pSite->beaconModulation == DRV_MODULATION_PBCC)		/* if the site current modulation is PBCC */
    795 	{
    796 		*matchingLevel = 2;
    797 		return MATCH;
    798 	}
    799 
    800 	if (pSite->probeModulation == DRV_MODULATION_PBCC)		/* if the site potential modulation is PBCC */
    801 	{
    802 		*matchingLevel = 1;
    803 		return MATCH;
    804 	}
    805 	else												/* the current modulation is CCK */
    806 	{
    807 		*matchingLevel = 0;
    808 		return MATCH;
    809 	}
    810 }
    811 
    812 static match_e preambleTypeMatchingLevel(siteMgr_t *pSiteMgr, siteEntry_t *pSite, UINT32 *matchingLevel)
    813 {
    814 	/* NOw, the chip preamble is SHORT */
    815 	/* If the desired preamble is LONG, we set the preamble bits off. */
    816 	if (pSiteMgr->pDesiredParams->siteMgrDesiredPreambleType == PREAMBLE_LONG)
    817 	{
    818 		*matchingLevel = 0;
    819 		return MATCH;
    820 	}
    821 
    822 	/* Now, the desired preamble is SHORT */
    823 	if (pSite->currentPreambleType == PREAMBLE_SHORT)	/* site preamble is SHORT */
    824 	{
    825 		*matchingLevel = 1;
    826 		return MATCH;
    827 	}
    828 	else										/* site preamble is LONG */
    829 	{
    830 		*matchingLevel = 0;
    831 		return MATCH;
    832 	}
    833 }
    834 
    835 static match_e channelMatchingLevel(siteMgr_t *pSiteMgr, siteEntry_t *pSite, UINT32 *matchingLevel)
    836 {
    837 	paramInfo_t     tParam;
    838 	/*	when 802.11d is enabled,
    839 	channels that are not valid for Active, will not be mach.*/
    840 	tParam.content.channel = pSite->channel;
    841 	tParam.paramType = REGULATORY_DOMAIN_IS_CHANNEL_SUPPORTED;
    842 	regulatoryDomain_getParam(pSiteMgr->hRegulatoryDomain, &tParam);
    843 	if ( !tParam.content.bIsChannelSupprted )
    844 	{
    845         WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
    846 			("channelMatchingLevel: channel =%d isn't valid for Active and will not be matched.\n",
    847 			pSite->channel));
    848 		return NO_MATCH;
    849 	}
    850 
    851 	/* If the site channel is equal to the desired channel, we set the channel bit on. */
    852 	if (pSite->channel == pSiteMgr->pDesiredParams->siteMgrDesiredChannel)
    853 	{
    854 		*matchingLevel = 1;
    855 		return MATCH;
    856 	}
    857 	else
    858 	{
    859 		*matchingLevel = 0;
    860 		return MATCH;
    861 	}
    862 /*	return NO_MATCH; - unreachable*/
    863 
    864 }
    865 
    866 static match_e rxLevelMatchingLevel(siteMgr_t *pSiteMgr, siteEntry_t *pSite, UINT32 *matchingLevel)
    867 {
    868 
    869 	if(pSite->rssi > SELECT_RSSI_BEST_LEVEL)
    870 		*matchingLevel = (UINT8)RSSI_METRIC_BEST;
    871 	else if (pSite->rssi > SELECT_RSSI_GOOD_LEVEL)
    872 		*matchingLevel = (UINT8)RSSI_METRIC_GOOD;
    873 	else if(pSite->rssi > SELECT_RSSI_NORMAL_LEVEL)
    874 		*matchingLevel = (UINT8)RSSI_METRIC_NORMAL;
    875 	else if (pSite->rssi > SELECT_RSSI_POOR_LEVEL)
    876 		*matchingLevel = (UINT8)RSSI_METRIC_POOR;
    877 	else if(pSite->rssi > SELECT_RSSI_BAD_LEVEL)
    878 		*matchingLevel = (UINT8)RSSI_METRIC_BAD;
    879 	else
    880 		*matchingLevel = (UINT8)RSSI_METRIC_NOSIGNAL;
    881 
    882 	return MATCH;
    883 
    884 }
    885 
    886 static match_e attemptsNumberMatchingLevel(siteMgr_t *pSiteMgr, siteEntry_t *pSite, UINT32 *matchingLevel)
    887 {
    888 	if(pSite->attemptsNumber > 0)
    889 	{
    890 		return NO_MATCH;
    891 	}
    892 	else
    893 	{
    894 		*matchingLevel = 0x0F - pSite->attemptsNumber;
    895 		return MATCH;
    896 	}
    897 }
    898 
    899 static match_e spectrumManagementMatchingLevel(siteMgr_t *pSiteMgr, UINT16 siteCapability, UINT32 *matchingLevel)
    900 {
    901 	paramInfo_t		param;
    902 	TI_STATUS		status;
    903 	/* If the site has spectrum management capabilty and the station
    904 	   spectrumManagementCapabilty is enabled, we set the spectrum management bit on. */
    905 	param.paramType = REGULATORY_DOMAIN_MANAGEMENT_CAPABILITY_ENABLED_PARAM;
    906 	status = regulatoryDomain_getParam(pSiteMgr->hRegulatoryDomain,&param);
    907 	if(status == OK && param.content.spectrumManagementEnabled)
    908 	{
    909 		if (siteCapability & DOT11_SPECTRUM_MANAGEMENT)
    910 			*matchingLevel = 1;
    911 		else
    912 			*matchingLevel = 0;
    913 	}
    914 
    915 	return MATCH;
    916 }
    917 
    918 static match_e prioritySiteMatchingLevel(siteMgr_t *pSiteMgr, siteEntry_t *pSite, UINT32 *matchingLevel)
    919 {
    920 	/* If the site channel is equal to the desired channel, we set the channel bit on. */
    921 	if (pSite->prioritySite)
    922 	{
    923 		*matchingLevel = 1;
    924 		return MATCH;
    925 	}
    926 	else
    927 	{
    928 		*matchingLevel = 0;
    929 		return MATCH;
    930 	}
    931 /*	return NO_MATCH; - unreachable */
    932 }
    933 
    934 /***********************************************************************
    935  *                        addSelfSite
    936  ***********************************************************************
    937 DESCRIPTION: This function is called if the selection fails and desired BSS type is IBSS
    938 			That means we creating our own network and wait for other stations to join us.
    939 			the best site for teh station.
    940 			Performs the following:
    941 				-	If the desired BSSID is broadcast, we generate a random BSSId, otherwise we use the desired one.
    942 				-	If the site table is full we remove the most old site
    943 				-	We send a probe response with our oiwn desired attributes in order to add the site to the site table
    944 
    945 INPUT:      pSiteMgr	-	site mgr handle.
    946 
    947 OUTPUT:
    948 
    949 RETURN:     Pointer to rthe self site entry in the site table
    950 
    951 ************************************************************************/
    952 siteEntry_t *addSelfSite(siteMgr_t *pSiteMgr)
    953 {
    954 	siteEntry_t			*pSite;
    955 	macAddress_t		bssid;
    956 
    957 
    958 	if (utils_isJunkSSID(&(pSiteMgr->pDesiredParams->siteMgrDesiredSSID)) == TRUE)
    959 		return NULL ;
    960 
    961 	if MAC_BROADCAST((&(pSiteMgr->pDesiredParams->siteMgrDesiredBSSID)))
    962 	{
    963 		os_memoryCopy(pSiteMgr->hOs, (void *)bssid.addr, (void *)pSiteMgr->ibssBssid.addr, sizeof(macAddress_t));
    964 	}
    965 	else
    966 	{
    967 		os_memoryCopy(pSiteMgr->hOs, (void *)bssid.addr, (void *)pSiteMgr->pDesiredParams->siteMgrDesiredBSSID.addr, sizeof(macAddress_t));
    968 	}
    969 
    970 	if(pSiteMgr->pDesiredParams->siteMgrDesiredChannel <= 14)
    971 	{
    972 		pSiteMgr->pSitesMgmtParams->pCurrentSiteTable = &pSiteMgr->pSitesMgmtParams->dot11BG_sitesTables;
    973         pSiteMgr->siteMgrOperationalMode = DOT11_G_MODE;
    974 	}
    975 	else
    976 	{
    977 		pSiteMgr->pSitesMgmtParams->pCurrentSiteTable = (siteTablesParams_t *)&pSiteMgr->pSitesMgmtParams->dot11A_sitesTables;
    978 		pSiteMgr->siteMgrOperationalMode = DOT11_A_MODE;
    979 	}
    980 
    981     siteMgr_ConfigRate(pSiteMgr);
    982 
    983 	/* First make sure that there is a place in the site table, if not, reomve the eldest site. */
    984 	if (pSiteMgr->pSitesMgmtParams->pCurrentSiteTable->numOfSites == pSiteMgr->pSitesMgmtParams->pCurrentSiteTable->maxNumOfSites)
    985 		removeEldestSite(pSiteMgr);
    986 
    987 	sendProbeResponse(pSiteMgr, &bssid);
    988 
    989 	/* Now find the site in the site table. */
    990 	pSite = findSiteEntry(pSiteMgr, &bssid);
    991 	if (pSite == NULL)
    992 	{
    993 		return NULL;
    994 	}
    995 	pSite->beaconModulation = pSite->probeModulation;
    996 	pSite->barkerPreambleType = PREAMBLE_UNSPECIFIED;
    997 
    998 	return pSite;
    999 
   1000 }
   1001 
   1002 /***********************************************************************
   1003  *                        sendProbeResponse
   1004  ***********************************************************************
   1005 DESCRIPTION: This function is called by the function 'addSelfSite()' in order to send a probe response
   1006 			to the site mgr. This will cause the site manager to add a new entry to the site table, the self site entry.
   1007 
   1008 INPUT:      pSiteMgr	-	site mgr handle.
   1009 			pBssid		-	Received BSSID
   1010 
   1011 OUTPUT:
   1012 
   1013 RETURN:     OK
   1014 
   1015 ************************************************************************/
   1016 static TI_STATUS sendProbeResponse(siteMgr_t *pSiteMgr, macAddress_t *pBssid)
   1017 {
   1018 	mlmeFrameInfo_t		frame;
   1019 	paramInfo_t			param;
   1020 	dot11_SSID_t 		ssid;
   1021 	dot11_RATES_t 		rates;
   1022 	dot11_FH_PARAMS_t 	FHParamsSet;
   1023 	dot11_DS_PARAMS_t 	DSParamsSet;
   1024 	dot11_CF_PARAMS_t 	CFParamsSet;
   1025 	dot11_IBSS_PARAMS_t IBSSParamsSet;
   1026 	UINT32				len = 0, ofdmIndex = 0;
   1027     radioBand_e         band;
   1028 	dot11_RATES_t 		extRates;
   1029 	UINT8				ratesBuf[MAX_SUPPORTED_RATES];
   1030 	BOOL				extRatesInd = FALSE;
   1031 
   1032 	/* The easiest way to add a site to the site table is to simulate a probe frame. */
   1033 	frame.subType = PROBE_RESPONSE;
   1034 	os_memoryZero(pSiteMgr->hOs, &frame, sizeof(mlmeFrameInfo_t));
   1035 		/* Initialize the frame fields */
   1036 	frame.subType = PROBE_RESPONSE;
   1037 	os_memoryZero(pSiteMgr->hOs, (void *)frame.content.iePacket.timestamp, TIME_STAMP_LEN);
   1038 
   1039 	/* Build  Beacon interval  */
   1040 	frame.content.iePacket.beaconInerval = pSiteMgr->pDesiredParams->siteMgrDesiredBeaconInterval;
   1041 
   1042 	/* Build  capability field */
   1043 	frame.content.iePacket.capabilities = 0;
   1044 	frame.content.iePacket.capabilities |= (TRUE << CAP_IBSS_SHIFT); /* Bss type must be independent */
   1045 
   1046 	if ((pSiteMgr->pDesiredParams->siteMgrDesiredPreambleType == PREAMBLE_SHORT))
   1047 		frame.content.iePacket.capabilities |= (TRUE << CAP_PREAMBLE_SHIFT);
   1048 
   1049 	/* call RSN to get the privacy desired */
   1050 	param.paramType = RSN_ENCRYPTION_STATUS_PARAM;
   1051 	rsn_getParam(pSiteMgr->hRsn, &param);
   1052 	if (param.content.rsnEncryptionStatus == RSN_CIPHER_NONE)
   1053 	{
   1054 		frame.content.iePacket.capabilities |= (FALSE << CAP_PRIVACY_SHIFT);
   1055 	} else {
   1056 		frame.content.iePacket.capabilities |= (TRUE << CAP_PRIVACY_SHIFT);
   1057 	}
   1058 
   1059 	if (pSiteMgr->pDesiredParams->siteMgrDesiredModulationType == DRV_MODULATION_PBCC)
   1060 		frame.content.iePacket.capabilities |= (TRUE << CAP_PBCC_SHIFT);
   1061 
   1062     if (pSiteMgr->siteMgrOperationalMode == DOT11_G_MODE)
   1063     {
   1064         if(pSiteMgr->pDesiredParams->siteMgrDesiredSlotTime == PHY_SLOT_TIME_SHORT)
   1065             frame.content.iePacket.capabilities |= (TRUE << CAP_SLOT_TIME_SHIFT);
   1066     }
   1067 
   1068 	/* Build ssid */
   1069 	os_memoryZero(pSiteMgr->hOs, (void *)ssid.serviceSetId, MAX_SSID_LEN);
   1070 
   1071 	if (pSiteMgr->pDesiredParams->siteMgrDesiredSSID.len == 0)
   1072 		ssid.hdr.eleLen = 0;
   1073 	else
   1074 	{
   1075 		os_memoryCopy(pSiteMgr->hOs, (void *)ssid.serviceSetId, (void *)pSiteMgr->pDesiredParams->siteMgrDesiredSSID.ssidString, pSiteMgr->pDesiredParams->siteMgrDesiredSSID.len);
   1076 		ssid.hdr.eleLen = pSiteMgr->pDesiredParams->siteMgrDesiredSSID.len;
   1077 	}
   1078 
   1079 	if(pSiteMgr->pDesiredParams->siteMgrDesiredChannel <= MAX_GB_MODE_CHANEL)
   1080 		siteMgr_updateRates(pSiteMgr, FALSE, TRUE);
   1081 	else
   1082 		siteMgr_updateRates(pSiteMgr, TRUE, TRUE);
   1083 
   1084 	/* Build Rates */
   1085 	bitMapToNetworkStringRates(pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.supportedRateMask,
   1086 							   pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.basicRateMask,
   1087 							   ratesBuf, &len, &ofdmIndex);
   1088 
   1089 	if(pSiteMgr->siteMgrOperationalMode != DOT11_G_MODE ||
   1090        pSiteMgr->pDesiredParams->siteMgrUseDraftNum == DRAFT_5_AND_EARLIER ||
   1091 	   ofdmIndex == len)
   1092 	{
   1093 		rates.hdr.eleId = DOT11_SUPPORTED_RATES_ELE_ID;
   1094 		rates.hdr.eleLen = len;
   1095 		os_memoryCopy(pSiteMgr->hOs, (void *)rates.rates, ratesBuf, rates.hdr.eleLen);
   1096 	}
   1097 	else
   1098 	{
   1099 		rates.hdr.eleId = DOT11_SUPPORTED_RATES_ELE_ID;
   1100 		rates.hdr.eleLen = ofdmIndex;
   1101 		os_memoryCopy(pSiteMgr->hOs, (void *)rates.rates, ratesBuf, rates.hdr.eleLen);
   1102 
   1103 		extRates.hdr.eleId = DOT11_EXT_SUPPORTED_RATES_ELE_ID;
   1104 		extRates.hdr.eleLen = len - ofdmIndex;
   1105 		os_memoryCopy(pSiteMgr->hOs, (void *)extRates.rates, &ratesBuf[ofdmIndex], extRates.hdr.eleLen);
   1106 		extRatesInd = TRUE;
   1107 	}
   1108 
   1109 
   1110 	/* Build FH */
   1111 	os_memoryZero(pSiteMgr->hOs, &FHParamsSet, sizeof(dot11_FH_PARAMS_t));
   1112 
   1113 	/* Build DS */
   1114 	DSParamsSet.hdr.eleLen = 1;
   1115 	DSParamsSet.currChannel = pSiteMgr->pDesiredParams->siteMgrDesiredChannel;
   1116 
   1117 	/* Build CF */
   1118 	os_memoryZero(pSiteMgr->hOs, &CFParamsSet, sizeof(dot11_CF_PARAMS_t));
   1119 
   1120 	/* Build IBSS */
   1121 	os_memoryZero(pSiteMgr->hOs, &IBSSParamsSet, sizeof(dot11_IBSS_PARAMS_t));
   1122 	IBSSParamsSet.hdr.eleLen = 2;
   1123 	IBSSParamsSet.atimWindow = pSiteMgr->pDesiredParams->siteMgrDesiredAtimWindow;
   1124 
   1125 	frame.content.iePacket.pSsid = &ssid;
   1126 	frame.content.iePacket.pRates = &rates;
   1127 
   1128 	if(extRatesInd)
   1129 		frame.content.iePacket.pExtRates = &extRates;
   1130 	else
   1131 		frame.content.iePacket.pExtRates = NULL;
   1132 
   1133 	frame.content.iePacket.pFHParamsSet = &FHParamsSet;
   1134 	frame.content.iePacket.pDSParamsSet = &DSParamsSet;
   1135 	frame.content.iePacket.pCFParamsSet = &CFParamsSet;
   1136 	frame.content.iePacket.pIBSSParamsSet = &IBSSParamsSet;
   1137 
   1138     band = ( MAX_GB_MODE_CHANEL >= pSiteMgr->pDesiredParams->siteMgrDesiredChannel ? RADIO_BAND_2_4_GHZ : RADIO_BAND_5_0_GHZ );
   1139 	/* Update site */
   1140 	siteMgr_updateSite(pSiteMgr, pBssid, &frame ,pSiteMgr->pDesiredParams->siteMgrDesiredChannel, band, FALSE);
   1141 
   1142 	return OK;
   1143 }
   1144 
   1145 /***********************************************************************
   1146  *                        systemConfig
   1147  ***********************************************************************
   1148 DESCRIPTION: This function is called by the function 'siteMgr_selectSite()' in order to configure
   1149 			the system with the chosen site attribute.
   1150 
   1151 INPUT:      pSiteMgr	-	site mgr handle.
   1152 
   1153 OUTPUT:
   1154 
   1155 RETURN:     OK
   1156 
   1157 ************************************************************************/
   1158 TI_STATUS systemConfig(siteMgr_t *pSiteMgr)
   1159 {
   1160 	siteEntry_t *pPrimarySite = pSiteMgr->pSitesMgmtParams->pPrimarySite;
   1161 	rsnData_t	rsnData;
   1162 	UINT8		rsnAssocIeLen;
   1163     dot11_RSN_t *pRsnIe;
   1164     UINT8       rsnIECount=0;
   1165     UINT16      length;
   1166     UINT16      capabilities;
   1167     UINT16      PktLength=0;
   1168     UINT8		*pIeBuffer=NULL;
   1169 
   1170 #ifdef EXC_MODULE_INCLUDED
   1171     UINT8        ExternTxPower;
   1172 #endif
   1173 	TI_STATUS	status;
   1174 	slotTime_e	slotTime;
   1175 	UINT32		StaTotalRates;
   1176 	ACParameters_t *p_ACParametersDummy = NULL;
   1177 
   1178 
   1179 	if (pPrimarySite->probeRecv)
   1180 	{
   1181 		pIeBuffer = pPrimarySite->probeRespBuffer;
   1182 		PktLength = pPrimarySite->probeRespLength;
   1183 	}
   1184     else if (pPrimarySite->beaconRecv)
   1185 	{
   1186 		pIeBuffer = pPrimarySite->beaconBuffer;
   1187 		PktLength = pPrimarySite->beaconLength;
   1188 	}
   1189 
   1190 	pSiteMgr->prevRadioBand = pSiteMgr->radioBand;
   1191 
   1192 	WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
   1193 		("%s: Capabilities, Slot Time Bit = %d (capabilities = %d)\n", __FUNCTION__, (pPrimarySite->capabilities >> CAP_SLOT_TIME_SHIFT) & 1, pPrimarySite->capabilities));
   1194 
   1195 	if(pPrimarySite->channel <= MAX_GB_MODE_CHANEL)
   1196 	{
   1197 		if(pSiteMgr->pDesiredParams->siteMgrDesiredDot11Mode == DOT11_B_MODE)
   1198 		{
   1199 			pSiteMgr->siteMgrOperationalMode = DOT11_B_MODE;
   1200 			slotTime = PHY_SLOT_TIME_LONG;
   1201 
   1202 			WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
   1203 				("%s: 11b Mode, Slot Time = %d\n", __FUNCTION__, (UINT8)slotTime));
   1204 		}
   1205 		else
   1206 		{
   1207 			pSiteMgr->siteMgrOperationalMode = DOT11_G_MODE;
   1208 
   1209 			if (((pPrimarySite->capabilities >> CAP_SLOT_TIME_SHIFT) & CAP_SLOT_TIME_MASK) == PHY_SLOT_TIME_SHORT)
   1210 			{
   1211 			slotTime = pSiteMgr->pDesiredParams->siteMgrDesiredSlotTime;
   1212 
   1213 				WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
   1214 					("%s: 11g Mode, Slot Time = %d (desired)\n", __FUNCTION__, (UINT8)slotTime));
   1215 			}
   1216 			else
   1217 			{
   1218 				slotTime = PHY_SLOT_TIME_LONG;
   1219 
   1220 				WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
   1221 					("%s: 11g Mode, Slot Time = %d\n", __FUNCTION__, (UINT8) slotTime));
   1222 			}
   1223 		}
   1224 
   1225 		pSiteMgr->radioBand = RADIO_BAND_2_4_GHZ;
   1226 		pSiteMgr->pSitesMgmtParams->pCurrentSiteTable = &pSiteMgr->pSitesMgmtParams->dot11BG_sitesTables;
   1227 	}
   1228 	else
   1229 	{
   1230 		pSiteMgr->siteMgrOperationalMode = DOT11_A_MODE;
   1231 		pSiteMgr->radioBand = RADIO_BAND_5_0_GHZ;
   1232 		slotTime = PHY_SLOT_TIME_SHORT;
   1233 
   1234 		WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
   1235 			("%s: 11a Mode, Slot Time = %d\n", __FUNCTION__, (UINT8)slotTime));
   1236 
   1237 		pSiteMgr->pSitesMgmtParams->pCurrentSiteTable = (siteTablesParams_t *)&pSiteMgr->pSitesMgmtParams->dot11A_sitesTables;
   1238 	}
   1239 
   1240 	/* since we are moving to the different band, the siteMgr should be reconfigured */
   1241 	if(pSiteMgr->prevRadioBand != pSiteMgr->radioBand)
   1242 		siteMgr_bandParamsConfig(pSiteMgr, TRUE);
   1243 
   1244 	if(pPrimarySite->channel <= MAX_GB_MODE_CHANEL)
   1245 		siteMgr_updateRates(pSiteMgr, FALSE, TRUE);
   1246 	else
   1247 		siteMgr_updateRates(pSiteMgr, TRUE, TRUE);
   1248 
   1249 	/* configure hal with common core-hal parameters */
   1250 	whalCtrl_SetRadioBand(pSiteMgr->hHalCtrl, pSiteMgr->radioBand);
   1251 
   1252 	pPrimarySite->currentSlotTime = slotTime;
   1253 	whalCtrl_SetSlotTime(pSiteMgr->hHalCtrl, slotTime);
   1254 
   1255 	/***************** Config HAL *************************/
   1256 	/* Current Beacon Interval */
   1257 	whalCtrl_SetBeaconInterval( pSiteMgr->hHalCtrl , pPrimarySite->beaconInterval);
   1258 
   1259 	/***************** Config Site Manager *************************/
   1260 	/* L.M. Should be fixed, should take into account the AP's rates */
   1261 	if(pSiteMgr->pDesiredParams->siteMgrDesiredModulationType == DRV_MODULATION_CCK)
   1262 		pSiteMgr->chosenModulation = DRV_MODULATION_CCK;
   1263 	else if(pSiteMgr->pDesiredParams->siteMgrDesiredModulationType == DRV_MODULATION_PBCC)
   1264 	{
   1265 		if(pPrimarySite->probeModulation != DRV_MODULATION_NONE)
   1266 			pSiteMgr->chosenModulation = pPrimarySite->probeModulation;
   1267 		else
   1268 			pSiteMgr->chosenModulation = pPrimarySite->beaconModulation;
   1269 	}
   1270 	else
   1271 		pSiteMgr->chosenModulation = DRV_MODULATION_OFDM;
   1272 
   1273 	/* We use this variable in order tp perform the PBCC algorithm. */
   1274 	pSiteMgr->currentDataModulation = pSiteMgr->chosenModulation;
   1275 	/***************** Config Data CTRL *************************/
   1276 
   1277 	gSystemCfgParam.paramType = CTRL_DATA_CURRENT_BSSID_PARAM;							/* Current BSSID */
   1278 	os_memoryCopy(pSiteMgr->hOs, &(gSystemCfgParam.content.ctrlDataCurrentBSSID), &(pPrimarySite->bssid), sizeof(macAddress_t));
   1279 	ctrlData_setParam(pSiteMgr->hCtrlData, &gSystemCfgParam);
   1280 
   1281 	gSystemCfgParam.paramType = CTRL_DATA_CURRENT_BSS_TYPE_PARAM;							/* Current BSS Type */
   1282 	gSystemCfgParam.content.ctrlDataCurrentBssType = pPrimarySite->bssType;
   1283 	ctrlData_setParam(pSiteMgr->hCtrlData, &gSystemCfgParam);
   1284 
   1285 	gSystemCfgParam.paramType = CTRL_DATA_CURRENT_PREAMBLE_TYPE_PARAM;					/* Current Preamble Type */
   1286 	if ((pSiteMgr->pDesiredParams->siteMgrDesiredPreambleType == PREAMBLE_SHORT) &&
   1287 		(pPrimarySite->currentPreambleType == PREAMBLE_SHORT))
   1288 		gSystemCfgParam.content.ctrlDataCurrentPreambleType = PREAMBLE_SHORT;
   1289 	else
   1290 		gSystemCfgParam.content.ctrlDataCurrentPreambleType = PREAMBLE_LONG;
   1291 	ctrlData_setParam(pSiteMgr->hCtrlData, &gSystemCfgParam);
   1292 
   1293     /* Mutual Rates Matching */
   1294 	StaTotalRates = pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.basicRateMask |
   1295 					pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.supportedRateMask;
   1296 
   1297 
   1298     pSiteMgr->pDesiredParams->siteMgrMatchedSuppRateMask = StaTotalRates &
   1299 														   pPrimarySite->rateMask.supportedRateMask;
   1300 
   1301 	pSiteMgr->pDesiredParams->siteMgrMatchedBasicRateMask = StaTotalRates &
   1302 															pPrimarySite->rateMask.basicRateMask;
   1303 	if (pSiteMgr->pDesiredParams->siteMgrMatchedBasicRateMask == 0)
   1304 	{
   1305 		pSiteMgr->pDesiredParams->siteMgrMatchedBasicRateMask =
   1306 			pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.basicRateMask;
   1307 	}
   1308 
   1309     pSiteMgr->pDesiredParams->siteMgrMatchedMaxBasicRate = getMaxRatefromBitmap(pSiteMgr->pDesiredParams->siteMgrMatchedBasicRateMask);
   1310 
   1311     pSiteMgr->pDesiredParams->siteMgrMatchedMaxActiveRate = getMaxRatefromBitmap(pSiteMgr->pDesiredParams->siteMgrMatchedSuppRateMask);
   1312 
   1313     pSiteMgr->pDesiredParams->siteMgrMatchedMaxActiveRate = MAX(pSiteMgr->pDesiredParams->siteMgrMatchedMaxBasicRate,pSiteMgr->pDesiredParams->siteMgrMatchedMaxActiveRate);
   1314 
   1315 	gSystemCfgParam.paramType = CTRL_DATA_CURRENT_BASIC_RATE_PARAM;						/* Current Basic Rate */
   1316 	gSystemCfgParam.content.ctrlDataCurrentBasicRate = (rate_e)pSiteMgr->pDesiredParams->siteMgrMatchedMaxBasicRate;
   1317 	ctrlData_setParam(pSiteMgr->hCtrlData, &gSystemCfgParam);
   1318 
   1319 	gSystemCfgParam.paramType = CTRL_DATA_CURRENT_BASIC_RATE_MASK_PARAM;
   1320 	gSystemCfgParam.content.ctrlDataBasicRateBitMask = pSiteMgr->pDesiredParams->siteMgrMatchedBasicRateMask;
   1321 	ctrlData_setParam(pSiteMgr->hCtrlData, &gSystemCfgParam);
   1322 	gSystemCfgParam.paramType = CTRL_DATA_CURRENT_BASIC_MODULATION_PARAM;						/* Current Mgmt Rate */
   1323 	if ((pPrimarySite->maxBasicRate == DRV_RATE_1M) || (pPrimarySite->maxBasicRate == DRV_RATE_2M))
   1324 		gSystemCfgParam.content.ctrlDataCurrentBasicModulationType = DRV_MODULATION_QPSK;
   1325 	else if (pPrimarySite->maxBasicRate == DRV_RATE_22M)
   1326 		gSystemCfgParam.content.ctrlDataCurrentBasicModulationType = DRV_MODULATION_PBCC;
   1327 	else if (pPrimarySite->maxBasicRate < DRV_RATE_22M)
   1328 		gSystemCfgParam.content.ctrlDataCurrentBasicModulationType = DRV_MODULATION_CCK;
   1329 	else
   1330 		gSystemCfgParam.content.ctrlDataCurrentBasicModulationType = DRV_MODULATION_OFDM;
   1331 
   1332 	ctrlData_setParam(pSiteMgr->hCtrlData, &gSystemCfgParam);
   1333     gSystemCfgParam.paramType = CTRL_DATA_CURRENT_PROTECTION_STATUS_PARAM;
   1334     gSystemCfgParam.content.ctrlDataProtectionEnabled = pPrimarySite->useProtection;
   1335     ctrlData_setParam(pSiteMgr->hCtrlData, &gSystemCfgParam);
   1336 
   1337 	ctrlData_setSite(pSiteMgr->hCtrlData, &pPrimarySite->fourXParams);
   1338 
   1339 	pbccAlgorithm(pSiteMgr);
   1340 
   1341 	/********** Set Site QOS protocol support *************/
   1342 
   1343 	/* Set WME Params */
   1344 	 status = siteMgr_getWMEParamsSite(pSiteMgr,&p_ACParametersDummy);
   1345 	 if(status == OK)
   1346 	 {
   1347 		 gSystemCfgParam.content.qosSiteProtocol = WME;
   1348 	 }
   1349 	 else
   1350 	 {
   1351 			 gSystemCfgParam.content.qosSiteProtocol = NONE_QOS;
   1352 	 }
   1353 
   1354 	WLAN_REPORT_DEBUG_TX(pSiteMgr->hReport,
   1355 	 (" systemConfigt() : param.content.qosSiteProtoco %d\n", gSystemCfgParam.content.qosSiteProtocol));
   1356 
   1357 	 gSystemCfgParam.paramType = QOS_MNGR_SET_SITE_PROTOCOL;
   1358 	 qosMngr_setParams(pSiteMgr->hQosMngr,&gSystemCfgParam);
   1359 
   1360      /* Set active protocol in qosMngr according to station desired mode and site capabilities
   1361 	Must be called BEFORE setting the "CURRENT_PS_MODE" into the QosMngr */
   1362      qosMngr_selectActiveProtocol(pSiteMgr->hQosMngr);
   1363 
   1364 	 /* set PS capability parameter */
   1365 	 gSystemCfgParam.paramType = QOS_MNGR_CURRENT_PS_MODE;
   1366 	 if(pPrimarySite->APSDSupport == TRUE)
   1367 		 gSystemCfgParam.content.currentPsMode = PS_SCHEME_UPSD_TRIGGER;
   1368 	 else
   1369 		 gSystemCfgParam.content.currentPsMode = PS_SCHEME_LEGACY_PSPOLL;
   1370       qosMngr_setParams(pSiteMgr->hQosMngr,&gSystemCfgParam);
   1371 
   1372      /* Set upsd/ps_poll configuration */
   1373      /* Must be done AFTER setting the active Protocol */
   1374      qosMngr_setAcPsDeliveryMode (pSiteMgr->hQosMngr);
   1375 
   1376 	/***************** Config RSN *************************/
   1377     /* Get the RSN IE data */
   1378     pRsnIe = pPrimarySite->pRsnIe;
   1379 	length=0;
   1380     rsnIECount = 0;
   1381     while ((length < pPrimarySite->rsnIeLen) && (pPrimarySite->rsnIeLen < 255)
   1382            && (rsnIECount < MAX_RSN_IE))
   1383     {
   1384         curRsnData[0+length] = pRsnIe->hdr.eleId;
   1385         curRsnData[1+length] = pRsnIe->hdr.eleLen;
   1386         os_memoryCopy(pSiteMgr->hOs, &curRsnData[2+length], (void *)pRsnIe->rsnIeData, pRsnIe->hdr.eleLen);
   1387         length += pRsnIe->hdr.eleLen+2;
   1388         pRsnIe += 1;
   1389         rsnIECount++;
   1390     }
   1391     if (length<pPrimarySite->rsnIeLen)
   1392     {
   1393         WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
   1394                           ("siteMgr_selectSiteFromTable, RSN IE is too long: rsnIeLen=%d, MAX_RSN_IE=%d\n",
   1395                             pPrimarySite->rsnIeLen, MAX_RSN_IE));
   1396     }
   1397 
   1398 	rsnData.pIe = (pPrimarySite->rsnIeLen==0) ? NULL :curRsnData;
   1399 	rsnData.ieLen = pPrimarySite->rsnIeLen;
   1400     rsnData.privacy = pPrimarySite->privacy;
   1401 
   1402     rsn_setSite(pSiteMgr->hRsn, &rsnData, NULL, &rsnAssocIeLen);
   1403 
   1404 	/***************** Config RegulatoryDomain **************************/
   1405 
   1406 #ifdef EXC_MODULE_INCLUDED
   1407 	/* set EXC TPC if present */
   1408 	if(Exc_ParseClientTP(pSiteMgr->hOs,pPrimarySite,&ExternTxPower,pIeBuffer,PktLength) == OK)
   1409     {
   1410         WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
   1411 			("Select Exc_ParseClientTP == OK: Dbm = %d\n",ExternTxPower));
   1412 		gSystemCfgParam.paramType = REGULATORY_DOMAIN_EXTERN_TX_POWER_PREFERRED;
   1413 		gSystemCfgParam.content.ExternTxPowerPreferred = ExternTxPower;
   1414 		regulatoryDomain_setParam(pSiteMgr->hRegulatoryDomain,&gSystemCfgParam);
   1415     }
   1416 	/* Parse and save the EXC Version Number if exists */
   1417 	excMngr_parseExcVer(pSiteMgr->hExcMngr, pIeBuffer, PktLength);
   1418 
   1419 #endif
   1420 
   1421 	/* Note: TX Power Control adjustment is now done through siteMgr_assocReport() */
   1422 	if (pPrimarySite->powerConstraint>0)
   1423 	{	/* setting power constraint */
   1424 		gSystemCfgParam.paramType = REGULATORY_DOMAIN_SET_POWER_CONSTRAINT_PARAM;
   1425 		gSystemCfgParam.content.powerConstraint = pPrimarySite->powerConstraint;
   1426 		regulatoryDomain_setParam(pSiteMgr->hRegulatoryDomain,&gSystemCfgParam);
   1427 	}
   1428 
   1429 
   1430 	/***************** Config MeasurementMgr object **************************/
   1431     capabilities = pPrimarySite->capabilities;
   1432 
   1433     /* Updating the Measurement Module Mode */
   1434     measurementMgr_setMeasurementMode(pSiteMgr->hMeasurementMgr, capabilities,
   1435 									pIeBuffer, PktLength);
   1436 
   1437 
   1438 	return OK;
   1439 }
   1440