--- /dev/null
+/** \file reportReplvl.c
+ * \brief Report level implementation
+ *
+ * \see reportReplvl.h
+ */
+/****************************************************************************
+**+-----------------------------------------------------------------------+**
+**| |**
+**| Copyright(c) 1998 - 2008 Texas Instruments. All rights reserved. |**
+**| All rights reserved. |**
+**| |**
+**| Redistribution and use in source and binary forms, with or without |**
+**| modification, are permitted provided that the following conditions |**
+**| are met: |**
+**| |**
+**| * Redistributions of source code must retain the above copyright |**
+**| notice, this list of conditions and the following disclaimer. |**
+**| * Redistributions in binary form must reproduce the above copyright |**
+**| notice, this list of conditions and the following disclaimer in |**
+**| the documentation and/or other materials provided with the |**
+**| distribution. |**
+**| * Neither the name Texas Instruments nor the names of its |**
+**| contributors may be used to endorse or promote products derived |**
+**| from this software without specific prior written permission. |**
+**| |**
+**| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |**
+**| "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |**
+**| LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |**
+**| A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |**
+**| OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |**
+**| SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |**
+**| LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |**
+**| DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |**
+**| THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |**
+**| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |**
+**| OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |**
+**| |**
+**+-----------------------------------------------------------------------+**
+****************************************************************************/
+
+/***************************************************************************/
+/* */
+/* MODULE: reportReplvl.c */
+/* PURPOSE: Report level implementation */
+/* */
+/***************************************************************************/
+#include "osTIType.h"
+#include "osApi.h"
+#include "siteHash.h"
+#include "smeSmApi.h"
+#include "utils.h"
+#include "smeApi.h"
+#include "rsnApi.h"
+#include "report.h"
+#include "whalCtrl_api.h"
+#include "connApi.h"
+#include "DataCtrl_Api.h"
+#include "siteMgrApi.h"
+#include "regulatoryDomainApi.h"
+#include "measurementMgrApi.h"
+#ifdef EXC_MODULE_INCLUDED
+#include "excMngr.h"
+#include "TransmitPowerExc.h"
+#include "excRMMngr.h"
+#endif
+
+#include "qosMngr_API.h"
+
+
+/****************************************************************************
+ MATRIC ISSUE
+ Each function in the select process returns a MATCH, NO_MATCH value in order to
+ skip non relevant sites. In addition, some of the functions also measures a matching level of a site.
+ The matching level is returned as a bit map. The select function 'OR's those bit maps in order to
+ select the site that has the biggest matching level. If a function returns a NO_MATCH value, the matching level of the
+ site is reset.
+ Following is the site matching level bit map structure.
+ Please notice, that if all the match functions returned MATCH for a site, its matric must be different than 0,
+ because of the rates bits.
+
+
+ 31 - 24 23 - 20 20 - 16 15 - 10 9 - 8 7 6 5 4 - 0
+ +---------------+---------------+-----------------------+-------------+------------+----------+---------+-----------+-----------+
+ | Rx Level | Privacy | Attempts |Rates | Modulation |Preamble | Channel | Spectrum | Reserved |
+ | | | | | | | | management| |
+ +---------------+---------------+-----------------------+-------------+------------+----------+---------+-----------+-----------+
+****************************************************************************/
+
+/* Matric bit map definition */
+typedef enum
+{
+ /* Rx level */
+ METRIC_RX_LEVEL_MASK = 0xFF,
+ METRIC_RX_LEVEL_SHIFT = 24,
+
+ /* Privacy */
+ METRIC_PRIVACY_MASK = 0x0F,
+ METRIC_PRIVACY_SHIFT = 20,
+
+ /* Number of attempts */
+ METRIC_ATTEMPTS_NUMBER_MASK = 0x0F,
+ METRIC_ATTEMPTS_NUMBER_SHIFT = 16,
+
+
+ /* Rates */
+ METRIC_RATES_MASK = 0x3F,
+ METRIC_RATES_SHIFT = 10,
+
+ /* PBCC */
+ METRIC_MODULATION_MASK = 0x03,
+ METRIC_MODULATION_SHIFT = 8,
+
+ /* Preamble*/
+ METRIC_PREAMBLE_MASK = 0x01,
+ METRIC_PREAMBLE_SHIFT = 7,
+
+ /* Channel */
+ METRIC_CHANNEL_MASK = 0x01,
+ METRIC_CHANNEL_SHIFT = 6,
+
+ /* Spectrum management Capability */
+ METRIC_SPECTRUM_MANAGEMENT_MASK = 0x01,
+ METRIC_SPECTRUM_MANAGEMENT_SHIFT= 5,
+
+ /* Priority Site */
+ METRIC_PRIORITY_SITE_MASK = 0x01,
+ METRIC_PRIORITY_SITE_SHIFT = 4,
+
+} matric_e;
+
+#define MAX_GB_MODE_CHANEL 14
+
+/* RSSI values boundaries and metric values for best, good, etc signals */
+#define SELECT_RSSI_BEST_LEVEL (-22)
+#define SELECT_RSSI_GOOD_LEVEL (-38)
+#define SELECT_RSSI_NORMAL_LEVEL (-56)
+#define SELECT_RSSI_POOR_LEVEL (-72)
+#define SELECT_RSSI_BAD_LEVEL (-82)
+
+
+#define RSSI_METRIC_BEST 6
+#define RSSI_METRIC_GOOD 5
+#define RSSI_METRIC_NORMAL 4
+#define RSSI_METRIC_POOR 3
+#define RSSI_METRIC_BAD 2
+#define RSSI_METRIC_NOSIGNAL 1
+
+/* Local functions prototypes */
+
+static match_e ssidMatchingLevel(siteMgr_t *pSiteMgr, siteEntry_t *pSite);
+
+
+static match_e bssidMatchingLevel(siteMgr_t *pSiteMgr, siteEntry_t *pSite);
+
+static match_e bssTypeMatchingLevel(siteMgr_t *pSiteMgr, siteEntry_t *pSite);
+
+static match_e ratesMatchingLevel(siteMgr_t *pSiteMgr, siteEntry_t *pSite, UINT32 *matchingLevel);
+
+static match_e modulationTypeMatchingLevel(siteMgr_t *pSiteMgr, siteEntry_t *pSite, UINT32 *matchingLevel);
+
+static match_e preambleTypeMatchingLevel(siteMgr_t *pSiteMgr, siteEntry_t *pSite, UINT32 *matchingLevel);
+
+static match_e channelMatchingLevel(siteMgr_t *pSiteMgr, siteEntry_t *pSite, UINT32 *matchingLevel);
+
+static match_e spectrumManagementMatchingLevel(siteMgr_t *pSiteMgr, UINT16 siteCapability, UINT32 *matchingLevel);
+
+static match_e rxLevelMatchingLevel(siteMgr_t *pSiteMgr, siteEntry_t *pSite, UINT32 *matchingLevel);
+
+static match_e attemptsNumberMatchingLevel(siteMgr_t *pSiteMgr, siteEntry_t *pSite, UINT32 *matchingLevel);
+
+static match_e prioritySiteMatchingLevel(siteMgr_t *pSiteMgr, siteEntry_t *pSite, UINT32 *matchingLevel);
+
+static siteEntry_t *addSelfSite(siteMgr_t *pSiteMgr);
+
+static TI_STATUS sendProbeResponse(siteMgr_t *pSiteMgr, macAddress_t *pBssid);
+
+/* Interface functions Implementation */
+
+
+/**************************************************************/
+/* DEBUG CLI CRASH (systemConfig stack usage reduction) */
+/**************************************************************/
+
+static paramInfo_t gSystemCfgParam;
+static UINT8 curRsnData[255];
+/**************************************************************/
+
+/***********************************************************************
+ * siteMgr_disSelectSite
+ ***********************************************************************
+DESCRIPTION: Called by the SME SM in order to dis select the primary site.
+ The function set the primary site pointer to NULL and set its type to type regular
+
+INPUT: hSiteMgr - site mgr handle.
+
+OUTPUT:
+
+RETURN: OK
+
+************************************************************************/
+TI_STATUS siteMgr_disSelectSite(TI_HANDLE hSiteMgr)
+{
+ siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
+
+ /* This protection is because in the case that the BSS was LOST the primary site was removed already. */
+ if (pSiteMgr->pSitesMgmtParams->pPrimarySite != NULL)
+ {
+ 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",
+ pSiteMgr->pSitesMgmtParams->pPrimarySite->ssid.ssidString,
+ pSiteMgr->pSitesMgmtParams->pPrimarySite->bssid.addr[0], pSiteMgr->pSitesMgmtParams->pPrimarySite->bssid.addr[1], pSiteMgr->pSitesMgmtParams->pPrimarySite->bssid.addr[2],
+ pSiteMgr->pSitesMgmtParams->pPrimarySite->bssid.addr[3], pSiteMgr->pSitesMgmtParams->pPrimarySite->bssid.addr[4], pSiteMgr->pSitesMgmtParams->pPrimarySite->bssid.addr[5] ));
+
+ pSiteMgr->pSitesMgmtParams->pPrimarySite->siteType = SITE_REGULAR;
+ pSiteMgr->pSitesMgmtParams->pPrevPrimarySite = pSiteMgr->pSitesMgmtParams->pPrimarySite;
+ pSiteMgr->pSitesMgmtParams->pPrimarySite = NULL;
+ }
+
+ return OK;
+}
+
+/***********************************************************************
+ * siteMgr_selectSite
+ ***********************************************************************
+DESCRIPTION: Site selection function. Called by the SME SM in order to select
+ the best site for teh station.
+ The function go over the site table, and for each site it calls the match functions
+ If one fo the functions returns NO_MATCH from some reason, it skips the current site
+ and move to the next one.
+ The site that has the biggest bit map is chosen.
+ - If a site is chosen, the function calls the 'systemConfig()' function in order
+ to configure the station with the chosen site attribute. Than it reports
+ a select status success to the SME SM.
+ - If no site is chosen & the desired BSS type is infrastructure, it reports
+ a select status failure to the SME SM.
+ - If no site is chosen but the desired BSS type is IBSS, we create a self site by adding an entry
+ to the site table, than we configure the system and reports a select status success to the SME SM.
+
+ NOTE: if the reScanFlag is set, means we received a scan command from the utility while in the
+ previous scanning, we report a select status failure to the SME SM because a re scan is needed
+ and we don't perform a selection.
+
+
+INPUT: hSiteMgr - site mgr handle.
+
+OUTPUT:
+
+RETURN: OK
+
+************************************************************************/
+siteEntry_t* siteMgr_selectSiteFromTable(TI_HANDLE hSiteMgr)
+{
+ UINT32 metric;
+ UINT32 prevMatchingLevel = 0;
+ UINT8 siteIndex, tableIndex, numberOfSites = 0;
+ siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
+ siteEntry_t *pSiteEntry, *pLastMatchSite = NULL;
+ rsnData_t rsnData;
+ dot11_RSN_t *pRsnIe;
+ UINT8 rsnIECount=0;
+ UINT8 length=0;
+ paramInfo_t param;
+ radioBand_e radioBand;
+ BOOL bRegulatoryDomainEnabled;
+
+ siteTablesParams_t* currTable = pSiteMgr->pSitesMgmtParams->pCurrentSiteTable;
+
+ WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
+ ("SITE MATCH , Desired ssid (%s) len= (%d)\n\n",
+ pSiteMgr->pDesiredParams->siteMgrDesiredSSID.ssidString,
+ pSiteMgr->pDesiredParams->siteMgrDesiredSSID.len));
+
+
+ for (tableIndex = 0; tableIndex < NUM_OF_SITE_TABLE ; tableIndex++)
+ {
+ /* If regulatoryDomains is enable, it should be checked if Country IE was detected */
+ param.paramType = REGULATORY_DOMAIN_ENABLED_PARAM;
+ regulatoryDomain_getParam(pSiteMgr->hRegulatoryDomain,¶m);
+ bRegulatoryDomainEnabled = param.content.regulatoryDomainEnabled;
+
+ if(currTable == &pSiteMgr->pSitesMgmtParams->dot11BG_sitesTables)
+ radioBand = RADIO_BAND_2_4_GHZ;
+ else
+ radioBand = RADIO_BAND_5_0_GHZ;
+
+ /* Check if country code was received */
+ param.paramType = REGULATORY_DOMAIN_IS_COUNTRY_FOUND;
+ param.content.eRadioBand = radioBand;
+ regulatoryDomain_getParam(pSiteMgr->hRegulatoryDomain,¶m);
+
+ if( ( bRegulatoryDomainEnabled == TRUE) && ( !param.content.bIsCountryFound ) )
+ {
+ if( radioBand == RADIO_BAND_2_4_GHZ)
+ WLAN_REPORT_WARNING(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("There is no valid Country IE for 2.4G band\n"));
+ else
+ WLAN_REPORT_WARNING(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("There is no valid Country IE for 5G band\n"));
+
+ if(pSiteMgr->pDesiredParams->siteMgrDesiredDot11Mode == DOT11_DUAL_MODE)
+ {
+ /* change site table */
+ if(currTable == &pSiteMgr->pSitesMgmtParams->dot11BG_sitesTables)
+ {
+ currTable = (siteTablesParams_t *)&pSiteMgr->pSitesMgmtParams->dot11A_sitesTables;
+/* siteMgr_updateRates(pSiteMgr, TRUE, TRUE);*/
+ }
+ else
+ {
+ currTable = &pSiteMgr->pSitesMgmtParams->dot11BG_sitesTables;
+/* siteMgr_updateRates(pSiteMgr, FALSE, TRUE);*/
+ }
+ }
+ continue;
+ }
+
+ for (siteIndex = 0; siteIndex < currTable->maxNumOfSites; siteIndex++)
+ {
+ pSiteEntry = &(currTable->siteTable[siteIndex]);
+
+ length = 0;
+ metric = 0;
+ pSiteEntry->matchingLevel = 0;
+
+
+ if(pSiteEntry->siteType == SITE_PRIMARY)
+ {
+ 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]));
+ }
+
+
+ if (pSiteEntry->siteType != SITE_REGULAR)
+ continue;
+
+ numberOfSites++;
+
+ pSiteEntry->ssid.ssidString[pSiteEntry->ssid.len] = 0;
+ if (ssidMatchingLevel(pSiteMgr, pSiteEntry) != MATCH)
+ {
+ 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]));
+ continue;
+ }
+
+ if (bssidMatchingLevel(pSiteMgr, pSiteEntry) != MATCH)
+ {
+ 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]));
+ continue;
+ }
+
+ if (bssTypeMatchingLevel(pSiteMgr, pSiteEntry) != MATCH)
+ {
+ 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]));
+ WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("SITE MATCH FAILURE, bss Type, siteMgrDesiredBSSType=%d, bssType=%d\n",pSiteMgr->pDesiredParams->siteMgrDesiredBSSType, pSiteEntry->bssType));
+ continue;
+ }
+
+ if (ratesMatchingLevel(pSiteMgr, pSiteEntry, &metric) != MATCH)
+ {
+ pSiteEntry->matchingLevel = 0;
+ 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]));
+ continue;
+ }
+ pSiteEntry->matchingLevel |= metric << METRIC_RATES_SHIFT;
+
+
+ /* Get the RSN IE data */
+ pRsnIe = pSiteEntry->pRsnIe;
+ rsnIECount = 0;
+ while ((length < pSiteEntry->rsnIeLen) && (rsnIECount < MAX_RSN_IE))
+ {
+ curRsnData[0+length] = pRsnIe->hdr.eleId;
+ curRsnData[1+length] = pRsnIe->hdr.eleLen;
+ os_memoryCopy(pSiteMgr->hOs, &curRsnData[2+length], (void *)pRsnIe->rsnIeData, pRsnIe->hdr.eleLen);
+ length += pRsnIe->hdr.eleLen+2;
+ pRsnIe += 1;
+ rsnIECount++;
+ }
+ if (length<pSiteEntry->rsnIeLen)
+ {
+ WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
+ ("siteMgr_selectSiteFromTable, RSN IE is too long: rsnIeLen=%d, MAX_RSN_IE=%d\n",
+ pSiteEntry->rsnIeLen, MAX_RSN_IE));
+ }
+
+ rsnData.pIe = (pSiteEntry->rsnIeLen==0) ? NULL :curRsnData;
+ rsnData.ieLen = pSiteEntry->rsnIeLen;
+ rsnData.privacy = pSiteEntry->privacy;
+
+ if (rsn_evalSite(pSiteMgr->hRsn, &rsnData, pSiteEntry->bssType, pSiteEntry->bssid, &metric) != OK)
+ {
+ pSiteEntry->matchingLevel = 0;
+ 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]));
+ continue;
+ }
+
+ pSiteEntry->matchingLevel |= metric << METRIC_PRIVACY_SHIFT;
+
+
+
+
+#if 0 /* TODO - Define 4x evaluation */
+ if (ctrlData_evalSite(pSiteMgr->hCtrlData, &pSiteEntry->fourXParams, &metric) != OK)
+ {
+ pSiteEntry->matchingLevel = 0;
+ 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]));
+ continue;
+ }
+ pSiteEntry->matchingLevel |= metric << METRIC_4X_SHIFT;
+#endif
+
+ if (modulationTypeMatchingLevel(pSiteMgr, pSiteEntry, &metric) != MATCH)
+ {
+ pSiteEntry->matchingLevel = 0;
+ 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]));
+ continue;
+ }
+ pSiteEntry->matchingLevel |= metric << METRIC_MODULATION_SHIFT;
+
+ if (preambleTypeMatchingLevel(pSiteMgr, pSiteEntry, &metric) != MATCH)
+ {
+ pSiteEntry->matchingLevel = 0;
+ 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]));
+ continue;
+ }
+ pSiteEntry->matchingLevel |= metric << METRIC_PREAMBLE_SHIFT;
+
+ if (channelMatchingLevel(pSiteMgr, pSiteEntry, &metric) != MATCH)
+ {
+ pSiteEntry->matchingLevel = 0;
+ 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]));
+ continue;
+ }
+ pSiteEntry->matchingLevel |= metric << METRIC_CHANNEL_SHIFT;
+
+ if (spectrumManagementMatchingLevel(pSiteMgr,pSiteEntry->capabilities,&metric) != MATCH)
+ {
+ pSiteEntry->matchingLevel = 0;
+ WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("SITE MATCH FAILURE, spectrum management.\n\n"));
+ continue;
+ }
+ pSiteEntry->matchingLevel |= metric << METRIC_SPECTRUM_MANAGEMENT_SHIFT;
+
+ if (rxLevelMatchingLevel(pSiteMgr, pSiteEntry, &metric) != MATCH)
+ {
+ pSiteEntry->matchingLevel = 0;
+ 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]));
+ continue;
+ }
+ pSiteEntry->matchingLevel |= metric << METRIC_RX_LEVEL_SHIFT;
+
+ if (attemptsNumberMatchingLevel(pSiteMgr, pSiteEntry, &metric) != MATCH)
+ {
+ pSiteEntry->matchingLevel = 0;
+ 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]));
+ continue;
+ }
+ pSiteEntry->matchingLevel |= metric << METRIC_ATTEMPTS_NUMBER_SHIFT;
+
+ if (prioritySiteMatchingLevel(pSiteMgr, pSiteEntry, &metric) != MATCH)
+ {
+ pSiteEntry->matchingLevel = 0;
+ 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]));
+ continue;
+ }
+ pSiteEntry->matchingLevel |= metric << METRIC_PRIORITY_SITE_SHIFT;
+
+ if(pSiteEntry->matchingLevel > prevMatchingLevel)
+ {
+ prevMatchingLevel = pSiteEntry->matchingLevel;
+ pLastMatchSite = pSiteEntry;
+ }
+ }
+ if(pSiteMgr->pDesiredParams->siteMgrDesiredDot11Mode == DOT11_DUAL_MODE)
+ {
+ /* change site table */
+ if(currTable == &pSiteMgr->pSitesMgmtParams->dot11BG_sitesTables)
+ {
+ currTable = (siteTablesParams_t *)&pSiteMgr->pSitesMgmtParams->dot11A_sitesTables;
+/* siteMgr_updateRates(pSiteMgr, TRUE, TRUE);*/
+ }
+ else
+ {
+ currTable = &pSiteMgr->pSitesMgmtParams->dot11BG_sitesTables;
+ /* siteMgr_updateRates(pSiteMgr, FALSE, TRUE);*/
+ }
+ }
+ else
+ break;
+
+ }
+ WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, (" NUMBER OF SITES: %d\n\n", numberOfSites));
+
+ return pLastMatchSite;
+}
+
+TI_STATUS siteMgr_selectSite(TI_HANDLE hSiteMgr)
+{
+ radioBand_e radioBand;
+ paramInfo_t param;
+ siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
+
+ siteEntry_t* pLastMatchSite = siteMgr_selectSiteFromTable(hSiteMgr);
+
+ if (pLastMatchSite != NULL)
+ {
+ pSiteMgr->pSitesMgmtParams->pPrimarySite = pLastMatchSite;
+ pLastMatchSite->siteType = SITE_PRIMARY;
+
+ 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]));
+
+
+ /***************** Config Connection *************************/
+ param.paramType = CONN_TYPE_PARAM;
+ if (pLastMatchSite->bssType == BSS_INDEPENDENT)
+ param.content.connType = CONNECTION_IBSS;
+ else
+ param.content.connType = CONNECTION_INFRA;
+ conn_setParam(pSiteMgr->hConn, ¶m);
+
+ return smeSm_reportSelectStatus(pSiteMgr->hSmeSm, (mgmtStatus_e)SELECT_STATUS_SUCCESS);
+ }
+
+ if ((pSiteMgr->pDesiredParams->siteMgrDesiredBSSType == BSS_ANY) ||
+ (pSiteMgr->pDesiredParams->siteMgrDesiredBSSType == BSS_INDEPENDENT)) /* Means we can start our own BSS */
+ {
+
+ if (pSiteMgr->pDesiredParams->siteMgrDesiredChannel >= SITE_MGR_CHANNEL_A_MIN)
+ {
+ radioBand = RADIO_BAND_5_0_GHZ;
+ }
+ else {
+ radioBand = RADIO_BAND_2_4_GHZ;
+ }
+
+ /*
+ update the regulatory domain with the selected band
+ */
+ /* Check if the selected channel is valid according to regDomain */
+ param.paramType = REGULATORY_DOMAIN_GET_SCAN_CAPABILITIES;
+ param.content.channelCapabilityReq.band = radioBand;
+ param.content.channelCapabilityReq.scanOption = ACTIVE_SCANNING;
+ param.content.channelCapabilityReq.channelNum = pSiteMgr->pDesiredParams->siteMgrDesiredChannel;
+ regulatoryDomain_getParam(pSiteMgr->hRegulatoryDomain,¶m);
+ if (!param.content.channelCapabilityRet.channelValidity)
+ {
+ WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("IBSS SELECT FAILURE - No channel !!!\n\n"));
+ return smeSm_reportSelectStatus(pSiteMgr->hSmeSm, (mgmtStatus_e)SELECT_STATUS_FAILURE);
+ }
+
+ pLastMatchSite = addSelfSite(pSiteMgr);
+ if (pLastMatchSite == NULL)
+ {
+ WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("IBSS SELECT FAILURE - could not open self site !!!\n\n"));
+ return smeSm_reportSelectStatus(pSiteMgr->hSmeSm, (mgmtStatus_e)SELECT_STATUS_FAILURE);
+ }
+
+ pSiteMgr->pSitesMgmtParams->pPrimarySite = pLastMatchSite;
+ pLastMatchSite->siteType = SITE_SELF;
+
+ 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]));
+
+ /***************** Config Connection *************************/
+
+ param.paramType = CONN_TYPE_PARAM; /* Connection Type*/
+ param.content.connType = CONNECTION_SELF;
+ conn_setParam(pSiteMgr->hConn, ¶m);
+
+ return smeSm_reportSelectStatus(pSiteMgr->hSmeSm, (mgmtStatus_e)SELECT_STATUS_SUCCESS);
+ }
+
+ WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("SELECT FAILURE \n\n"));
+
+ return smeSm_reportSelectStatus(pSiteMgr->hSmeSm, (mgmtStatus_e)SELECT_STATUS_FAILURE);
+}
+
+
+void siteMgr_setNotReceivedParameter(TI_HANDLE hSiteMgr, ssid_t* ssid , radioBand_e band)
+{
+ UINT8 siteIndex;
+ siteEntry_t *pSiteEntry;
+ siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
+ siteTablesParams_t* currTable=NULL;
+
+
+ /*
+ * Set the propiate site table.
+ */
+ switch (band) {
+ case RADIO_BAND_2_4_GHZ :
+ currTable = &pSiteMgr->pSitesMgmtParams->dot11BG_sitesTables;
+ break;
+
+ case RADIO_BAND_5_0_GHZ :
+ currTable = (siteTablesParams_t*)&pSiteMgr->pSitesMgmtParams->dot11A_sitesTables;
+ break;
+
+ case RADIO_BAND_DUAL:
+ default:
+ WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("siteMgr_setNotReceivedParameter() invalid band.\n"));
+
+ }
+
+
+ /*
+ * Increase the scanned sites "Not_Received" counter, this counter is used by the
+ * aging logic to clean old sites.
+ */
+ for (siteIndex = 0; siteIndex < currTable->maxNumOfSites; siteIndex++)
+ {
+ pSiteEntry = &(currTable->siteTable[siteIndex]);
+
+ /* Self site & null site are never aged out. */
+ if ((pSiteEntry->siteType == SITE_SELF) || (pSiteEntry->siteType == SITE_NULL) || (pSiteEntry->siteType == SITE_PRIMARY))
+ continue;
+
+ /* If scan for any ssid all sites are expected to be found, and all should be marked. */
+ if( utils_isAnySSID(ssid) )
+ {
+ pSiteEntry->Not_Received++;
+ }
+ /* otherwise, the scan was a unicast scan, and thus only sites that match the desired SSID are marked*/
+ else
+ {
+ if(os_memoryCompare(pSiteMgr->hOs, (UINT8 *)ssid->ssidString, (UINT8 *)pSiteEntry->ssid.ssidString, pSiteEntry->ssid.len) == 0)
+ {
+ pSiteEntry->Not_Received++;
+ }
+ }
+ } /* for (... all sites in table ) */
+}
+
+
+
+void siteMgr_resetAttemptsNumberParameter(TI_HANDLE hSiteMgr)
+{
+ UINT8 siteIndex, tableIndex;
+ siteEntry_t *pSiteEntry;
+ siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
+
+ siteTablesParams_t* currTable = pSiteMgr->pSitesMgmtParams->pCurrentSiteTable;
+
+ for (tableIndex = 0; tableIndex < NUM_OF_SITE_TABLE ; tableIndex++)
+ {
+ for (siteIndex = 0; siteIndex < currTable->maxNumOfSites; siteIndex++)
+ {
+ pSiteEntry = &(currTable->siteTable[siteIndex]);
+
+ /* Self site & null site are never aged out. */
+ if ((pSiteEntry->siteType == SITE_SELF) || (pSiteEntry->siteType == SITE_NULL))
+ continue;
+
+ pSiteEntry->attemptsNumber = 0;
+ }
+ if(pSiteMgr->pDesiredParams->siteMgrDesiredDot11Mode == DOT11_DUAL_MODE)
+ {
+ /* change site table */
+ if(currTable == &pSiteMgr->pSitesMgmtParams->dot11BG_sitesTables)
+ currTable = (siteTablesParams_t *)&pSiteMgr->pSitesMgmtParams->dot11A_sitesTables;
+ else
+ currTable = &pSiteMgr->pSitesMgmtParams->dot11BG_sitesTables;
+ }
+ else
+ break;
+
+ }
+}
+
+/* Local functions Implementation */
+
+/************************************************************************************************************/
+/* Each functions of the following measures the matching level of a site for the specific attribute,
+ for example: BSSId, SSID, etc...
+ The input is the site manager handle which contains the desired attributes, and a pointer
+ to the site in the site table.
+ The function returns NO_MATCH if it is not possible to work with this site and MATCH otherwise.
+ Some of the functions, in a case of a MATCH, compute also the site matching level and returns it too.
+ This used later in the function 'siteMgr_selectSite()'.
+ */
+/************************************************************************************************************/
+
+static match_e ssidMatchingLevel(siteMgr_t *pSiteMgr, siteEntry_t *pSite)
+{
+ if (pSiteMgr->pDesiredParams->siteMgrDesiredSSID.len == 0)
+ { /* match any site that is not hidden */
+ if (pSite->ssid.ssidString[0]=='\0') /* hidden ssid */
+ {
+ WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("Null SSID and hidden ssid \n\n"));
+ return NO_MATCH;
+ }
+ else
+ {
+ WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("Null SSID and not hidden ssid \n\n"));
+ return MATCH;
+ }
+ }
+ if ((pSiteMgr->pDesiredParams->siteMgrDesiredSSID.len == pSite->ssid.len) &&
+ (os_memoryCompare(pSiteMgr->hOs, (UINT8 *)pSiteMgr->pDesiredParams->siteMgrDesiredSSID.ssidString, (UINT8 *)pSite->ssid.ssidString, pSite->ssid.len) == 0))
+ return MATCH;
+
+ else
+ return NO_MATCH;
+}
+
+
+static match_e bssidMatchingLevel(siteMgr_t *pSiteMgr, siteEntry_t *pSite)
+{
+ /* If BSSID is NULL, return NO_MATCH */
+ if MAC_NULL((&(pSite->bssid)))
+ return NO_MATCH;
+
+ if MAC_BROADCAST((&(pSiteMgr->pDesiredParams->siteMgrDesiredBSSID)))
+ return MATCH;
+
+ if MAC_EQUAL((&(pSite->bssid)), (&(pSiteMgr->pDesiredParams->siteMgrDesiredBSSID)))
+ return MATCH;
+
+ return NO_MATCH;
+}
+
+static match_e bssTypeMatchingLevel(siteMgr_t *pSiteMgr, siteEntry_t *pSite)
+{
+ if (pSiteMgr->pDesiredParams->siteMgrDesiredBSSType == BSS_ANY)
+ return MATCH;
+
+ if (pSiteMgr->pDesiredParams->siteMgrDesiredBSSType == pSite->bssType)
+ return MATCH;
+
+ return NO_MATCH;
+}
+
+static match_e ratesMatchingLevel(siteMgr_t *pSiteMgr, siteEntry_t *pSite, UINT32 *matchingLevel)
+{
+ UINT32 MatchedBasicRateMask;
+ UINT32 MatchedSupportedRateMask;
+ UINT32 MatchedMaxBasicRate;
+ UINT32 MatchedMaxActiveRate;
+ UINT32 StaTotalRates;
+ UINT32 SiteTotalRates;
+
+ /* If the basic or active rate are invalid (0), return NO_MATCH. */
+ if ((pSite->maxBasicRate == DRV_RATE_INVALID) || (pSite->maxActiveRate == DRV_RATE_INVALID))
+ {
+ WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("SITE MATCH FAILURE, 1.maxBasic=%d,maxActive=%d \n", pSite->maxBasicRate,pSite->maxActiveRate));
+ return NO_MATCH;
+ }
+
+ if (DRV_RATE_MAX < pSite->maxBasicRate)
+ {
+ WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("SITE MATCH FAILURE, 1.maxBasic=%d,maxActive=%d \n", pSite->maxBasicRate,pSite->maxActiveRate));
+ return NO_MATCH;
+ }
+
+ if(pSite->channel <= 14)
+ siteMgr_updateRates(pSiteMgr, FALSE, TRUE);
+ else
+ siteMgr_updateRates(pSiteMgr, TRUE, TRUE);
+
+ StaTotalRates = pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.basicRateMask
+ | pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.supportedRateMask;
+
+ SiteTotalRates = pSite->rateMask.basicRateMask | pSite->rateMask.supportedRateMask;
+
+ MatchedBasicRateMask = SiteTotalRates
+ & pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.basicRateMask;
+
+
+ MatchedSupportedRateMask = SiteTotalRates &
+ pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.supportedRateMask;
+
+ if ((StaTotalRates & pSite->rateMask.basicRateMask) != pSite->rateMask.basicRateMask)
+ {
+ WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("SITE MATCH FAILURE, Basic or Supported Rates Doesn't Match \n"));
+ return NO_MATCH;
+
+ }
+
+
+ MatchedMaxBasicRate = getMaxRatefromBitmap(MatchedBasicRateMask);
+ MatchedMaxActiveRate = getMaxRatefromBitmap(MatchedSupportedRateMask);
+
+ MatchedMaxActiveRate = MAX(MatchedMaxBasicRate,MatchedMaxActiveRate);
+
+ *matchingLevel = MatchedMaxActiveRate;
+ return MATCH;
+}
+
+static match_e modulationTypeMatchingLevel(siteMgr_t *pSiteMgr, siteEntry_t *pSite, UINT32 *matchingLevel)
+{
+ /* If the desired modulation is CCK, we set the modulation bits off. */
+ if (pSiteMgr->pDesiredParams->siteMgrDesiredModulationType == DRV_MODULATION_CCK)
+ {
+ *matchingLevel = 0;
+ return MATCH;
+ }
+
+ /* Now, the desired modulation is PBCC */
+ if (pSite->beaconModulation == DRV_MODULATION_PBCC) /* if the site current modulation is PBCC */
+ {
+ *matchingLevel = 2;
+ return MATCH;
+ }
+
+ if (pSite->probeModulation == DRV_MODULATION_PBCC) /* if the site potential modulation is PBCC */
+ {
+ *matchingLevel = 1;
+ return MATCH;
+ }
+ else /* the current modulation is CCK */
+ {
+ *matchingLevel = 0;
+ return MATCH;
+ }
+}
+
+static match_e preambleTypeMatchingLevel(siteMgr_t *pSiteMgr, siteEntry_t *pSite, UINT32 *matchingLevel)
+{
+ /* NOw, the chip preamble is SHORT */
+ /* If the desired preamble is LONG, we set the preamble bits off. */
+ if (pSiteMgr->pDesiredParams->siteMgrDesiredPreambleType == PREAMBLE_LONG)
+ {
+ *matchingLevel = 0;
+ return MATCH;
+ }
+
+ /* Now, the desired preamble is SHORT */
+ if (pSite->currentPreambleType == PREAMBLE_SHORT) /* site preamble is SHORT */
+ {
+ *matchingLevel = 1;
+ return MATCH;
+ }
+ else /* site preamble is LONG */
+ {
+ *matchingLevel = 0;
+ return MATCH;
+ }
+}
+
+static match_e channelMatchingLevel(siteMgr_t *pSiteMgr, siteEntry_t *pSite, UINT32 *matchingLevel)
+{
+ paramInfo_t tParam;
+ /* when 802.11d is enabled,
+ channels that are not valid for Active, will not be mach.*/
+ tParam.content.channel = pSite->channel;
+ tParam.paramType = REGULATORY_DOMAIN_IS_CHANNEL_SUPPORTED;
+ regulatoryDomain_getParam(pSiteMgr->hRegulatoryDomain, &tParam);
+ if ( !tParam.content.bIsChannelSupprted )
+ {
+ WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
+ ("channelMatchingLevel: channel =%d isn't valid for Active and will not be matched.\n",
+ pSite->channel));
+ return NO_MATCH;
+ }
+
+ /* If the site channel is equal to the desired channel, we set the channel bit on. */
+ if (pSite->channel == pSiteMgr->pDesiredParams->siteMgrDesiredChannel)
+ {
+ *matchingLevel = 1;
+ return MATCH;
+ }
+ else
+ {
+ *matchingLevel = 0;
+ return MATCH;
+ }
+/* return NO_MATCH; - unreachable*/
+
+}
+
+static match_e rxLevelMatchingLevel(siteMgr_t *pSiteMgr, siteEntry_t *pSite, UINT32 *matchingLevel)
+{
+
+ if(pSite->rssi > SELECT_RSSI_BEST_LEVEL)
+ *matchingLevel = (UINT8)RSSI_METRIC_BEST;
+ else if (pSite->rssi > SELECT_RSSI_GOOD_LEVEL)
+ *matchingLevel = (UINT8)RSSI_METRIC_GOOD;
+ else if(pSite->rssi > SELECT_RSSI_NORMAL_LEVEL)
+ *matchingLevel = (UINT8)RSSI_METRIC_NORMAL;
+ else if (pSite->rssi > SELECT_RSSI_POOR_LEVEL)
+ *matchingLevel = (UINT8)RSSI_METRIC_POOR;
+ else if(pSite->rssi > SELECT_RSSI_BAD_LEVEL)
+ *matchingLevel = (UINT8)RSSI_METRIC_BAD;
+ else
+ *matchingLevel = (UINT8)RSSI_METRIC_NOSIGNAL;
+
+ return MATCH;
+
+}
+
+static match_e attemptsNumberMatchingLevel(siteMgr_t *pSiteMgr, siteEntry_t *pSite, UINT32 *matchingLevel)
+{
+ if(pSite->attemptsNumber > 0)
+ {
+ return NO_MATCH;
+ }
+ else
+ {
+ *matchingLevel = 0x0F - pSite->attemptsNumber;
+ return MATCH;
+ }
+}
+
+static match_e spectrumManagementMatchingLevel(siteMgr_t *pSiteMgr, UINT16 siteCapability, UINT32 *matchingLevel)
+{
+ paramInfo_t param;
+ TI_STATUS status;
+ /* If the site has spectrum management capabilty and the station
+ spectrumManagementCapabilty is enabled, we set the spectrum management bit on. */
+ param.paramType = REGULATORY_DOMAIN_MANAGEMENT_CAPABILITY_ENABLED_PARAM;
+ status = regulatoryDomain_getParam(pSiteMgr->hRegulatoryDomain,¶m);
+ if(status == OK && param.content.spectrumManagementEnabled)
+ {
+ if (siteCapability & DOT11_SPECTRUM_MANAGEMENT)
+ *matchingLevel = 1;
+ else
+ *matchingLevel = 0;
+ }
+
+ return MATCH;
+}
+
+static match_e prioritySiteMatchingLevel(siteMgr_t *pSiteMgr, siteEntry_t *pSite, UINT32 *matchingLevel)
+{
+ /* If the site channel is equal to the desired channel, we set the channel bit on. */
+ if (pSite->prioritySite)
+ {
+ *matchingLevel = 1;
+ return MATCH;
+ }
+ else
+ {
+ *matchingLevel = 0;
+ return MATCH;
+ }
+/* return NO_MATCH; - unreachable */
+}
+
+/***********************************************************************
+ * addSelfSite
+ ***********************************************************************
+DESCRIPTION: This function is called if the selection fails and desired BSS type is IBSS
+ That means we creating our own network and wait for other stations to join us.
+ the best site for teh station.
+ Performs the following:
+ - If the desired BSSID is broadcast, we generate a random BSSId, otherwise we use the desired one.
+ - If the site table is full we remove the most old site
+ - We send a probe response with our oiwn desired attributes in order to add the site to the site table
+
+INPUT: pSiteMgr - site mgr handle.
+
+OUTPUT:
+
+RETURN: Pointer to rthe self site entry in the site table
+
+************************************************************************/
+siteEntry_t *addSelfSite(siteMgr_t *pSiteMgr)
+{
+ siteEntry_t *pSite;
+ macAddress_t bssid;
+
+
+ if (utils_isJunkSSID(&(pSiteMgr->pDesiredParams->siteMgrDesiredSSID)) == TRUE)
+ return NULL ;
+
+ if MAC_BROADCAST((&(pSiteMgr->pDesiredParams->siteMgrDesiredBSSID)))
+ {
+ os_memoryCopy(pSiteMgr->hOs, (void *)bssid.addr, (void *)pSiteMgr->ibssBssid.addr, sizeof(macAddress_t));
+ }
+ else
+ {
+ os_memoryCopy(pSiteMgr->hOs, (void *)bssid.addr, (void *)pSiteMgr->pDesiredParams->siteMgrDesiredBSSID.addr, sizeof(macAddress_t));
+ }
+
+ if(pSiteMgr->pDesiredParams->siteMgrDesiredChannel <= 14)
+ {
+ pSiteMgr->pSitesMgmtParams->pCurrentSiteTable = &pSiteMgr->pSitesMgmtParams->dot11BG_sitesTables;
+ pSiteMgr->siteMgrOperationalMode = DOT11_G_MODE;
+ }
+ else
+ {
+ pSiteMgr->pSitesMgmtParams->pCurrentSiteTable = (siteTablesParams_t *)&pSiteMgr->pSitesMgmtParams->dot11A_sitesTables;
+ pSiteMgr->siteMgrOperationalMode = DOT11_A_MODE;
+ }
+
+ siteMgr_ConfigRate(pSiteMgr);
+
+ /* First make sure that there is a place in the site table, if not, reomve the eldest site. */
+ if (pSiteMgr->pSitesMgmtParams->pCurrentSiteTable->numOfSites == pSiteMgr->pSitesMgmtParams->pCurrentSiteTable->maxNumOfSites)
+ removeEldestSite(pSiteMgr);
+
+ sendProbeResponse(pSiteMgr, &bssid);
+
+ /* Now find the site in the site table. */
+ pSite = findSiteEntry(pSiteMgr, &bssid);
+ if (pSite == NULL)
+ {
+ return NULL;
+ }
+ pSite->beaconModulation = pSite->probeModulation;
+ pSite->barkerPreambleType = PREAMBLE_UNSPECIFIED;
+
+ return pSite;
+
+}
+
+/***********************************************************************
+ * sendProbeResponse
+ ***********************************************************************
+DESCRIPTION: This function is called by the function 'addSelfSite()' in order to send a probe response
+ to the site mgr. This will cause the site manager to add a new entry to the site table, the self site entry.
+
+INPUT: pSiteMgr - site mgr handle.
+ pBssid - Received BSSID
+
+OUTPUT:
+
+RETURN: OK
+
+************************************************************************/
+static TI_STATUS sendProbeResponse(siteMgr_t *pSiteMgr, macAddress_t *pBssid)
+{
+ mlmeFrameInfo_t frame;
+ paramInfo_t param;
+ dot11_SSID_t ssid;
+ dot11_RATES_t rates;
+ dot11_FH_PARAMS_t FHParamsSet;
+ dot11_DS_PARAMS_t DSParamsSet;
+ dot11_CF_PARAMS_t CFParamsSet;
+ dot11_IBSS_PARAMS_t IBSSParamsSet;
+ UINT32 len = 0, ofdmIndex = 0;
+ radioBand_e band;
+ dot11_RATES_t extRates;
+ UINT8 ratesBuf[MAX_SUPPORTED_RATES];
+ BOOL extRatesInd = FALSE;
+
+ /* The easiest way to add a site to the site table is to simulate a probe frame. */
+ frame.subType = PROBE_RESPONSE;
+ os_memoryZero(pSiteMgr->hOs, &frame, sizeof(mlmeFrameInfo_t));
+ /* Initialize the frame fields */
+ frame.subType = PROBE_RESPONSE;
+ os_memoryZero(pSiteMgr->hOs, (void *)frame.content.iePacket.timestamp, TIME_STAMP_LEN);
+
+ /* Build Beacon interval */
+ frame.content.iePacket.beaconInerval = pSiteMgr->pDesiredParams->siteMgrDesiredBeaconInterval;
+
+ /* Build capability field */
+ frame.content.iePacket.capabilities = 0;
+ frame.content.iePacket.capabilities |= (TRUE << CAP_IBSS_SHIFT); /* Bss type must be independent */
+
+ if ((pSiteMgr->pDesiredParams->siteMgrDesiredPreambleType == PREAMBLE_SHORT))
+ frame.content.iePacket.capabilities |= (TRUE << CAP_PREAMBLE_SHIFT);
+
+ /* call RSN to get the privacy desired */
+ param.paramType = RSN_ENCRYPTION_STATUS_PARAM;
+ rsn_getParam(pSiteMgr->hRsn, ¶m);
+ if (param.content.rsnEncryptionStatus == RSN_CIPHER_NONE)
+ {
+ frame.content.iePacket.capabilities |= (FALSE << CAP_PRIVACY_SHIFT);
+ } else {
+ frame.content.iePacket.capabilities |= (TRUE << CAP_PRIVACY_SHIFT);
+ }
+
+ if (pSiteMgr->pDesiredParams->siteMgrDesiredModulationType == DRV_MODULATION_PBCC)
+ frame.content.iePacket.capabilities |= (TRUE << CAP_PBCC_SHIFT);
+
+ if (pSiteMgr->siteMgrOperationalMode == DOT11_G_MODE)
+ {
+ if(pSiteMgr->pDesiredParams->siteMgrDesiredSlotTime == PHY_SLOT_TIME_SHORT)
+ frame.content.iePacket.capabilities |= (TRUE << CAP_SLOT_TIME_SHIFT);
+ }
+
+ /* Build ssid */
+ os_memoryZero(pSiteMgr->hOs, (void *)ssid.serviceSetId, MAX_SSID_LEN);
+
+ if (pSiteMgr->pDesiredParams->siteMgrDesiredSSID.len == 0)
+ ssid.hdr.eleLen = 0;
+ else
+ {
+ os_memoryCopy(pSiteMgr->hOs, (void *)ssid.serviceSetId, (void *)pSiteMgr->pDesiredParams->siteMgrDesiredSSID.ssidString, pSiteMgr->pDesiredParams->siteMgrDesiredSSID.len);
+ ssid.hdr.eleLen = pSiteMgr->pDesiredParams->siteMgrDesiredSSID.len;
+ }
+
+ if(pSiteMgr->pDesiredParams->siteMgrDesiredChannel <= MAX_GB_MODE_CHANEL)
+ siteMgr_updateRates(pSiteMgr, FALSE, TRUE);
+ else
+ siteMgr_updateRates(pSiteMgr, TRUE, TRUE);
+
+ /* Build Rates */
+ bitMapToNetworkStringRates(pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.supportedRateMask,
+ pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.basicRateMask,
+ ratesBuf, &len, &ofdmIndex);
+
+ if(pSiteMgr->siteMgrOperationalMode != DOT11_G_MODE ||
+ pSiteMgr->pDesiredParams->siteMgrUseDraftNum == DRAFT_5_AND_EARLIER ||
+ ofdmIndex == len)
+ {
+ rates.hdr.eleId = DOT11_SUPPORTED_RATES_ELE_ID;
+ rates.hdr.eleLen = len;
+ os_memoryCopy(pSiteMgr->hOs, (void *)rates.rates, ratesBuf, rates.hdr.eleLen);
+ }
+ else
+ {
+ rates.hdr.eleId = DOT11_SUPPORTED_RATES_ELE_ID;
+ rates.hdr.eleLen = ofdmIndex;
+ os_memoryCopy(pSiteMgr->hOs, (void *)rates.rates, ratesBuf, rates.hdr.eleLen);
+
+ extRates.hdr.eleId = DOT11_EXT_SUPPORTED_RATES_ELE_ID;
+ extRates.hdr.eleLen = len - ofdmIndex;
+ os_memoryCopy(pSiteMgr->hOs, (void *)extRates.rates, &ratesBuf[ofdmIndex], extRates.hdr.eleLen);
+ extRatesInd = TRUE;
+ }
+
+
+ /* Build FH */
+ os_memoryZero(pSiteMgr->hOs, &FHParamsSet, sizeof(dot11_FH_PARAMS_t));
+
+ /* Build DS */
+ DSParamsSet.hdr.eleLen = 1;
+ DSParamsSet.currChannel = pSiteMgr->pDesiredParams->siteMgrDesiredChannel;
+
+ /* Build CF */
+ os_memoryZero(pSiteMgr->hOs, &CFParamsSet, sizeof(dot11_CF_PARAMS_t));
+
+ /* Build IBSS */
+ os_memoryZero(pSiteMgr->hOs, &IBSSParamsSet, sizeof(dot11_IBSS_PARAMS_t));
+ IBSSParamsSet.hdr.eleLen = 2;
+ IBSSParamsSet.atimWindow = pSiteMgr->pDesiredParams->siteMgrDesiredAtimWindow;
+
+ frame.content.iePacket.pSsid = &ssid;
+ frame.content.iePacket.pRates = &rates;
+
+ if(extRatesInd)
+ frame.content.iePacket.pExtRates = &extRates;
+ else
+ frame.content.iePacket.pExtRates = NULL;
+
+ frame.content.iePacket.pFHParamsSet = &FHParamsSet;
+ frame.content.iePacket.pDSParamsSet = &DSParamsSet;
+ frame.content.iePacket.pCFParamsSet = &CFParamsSet;
+ frame.content.iePacket.pIBSSParamsSet = &IBSSParamsSet;
+
+ band = ( MAX_GB_MODE_CHANEL >= pSiteMgr->pDesiredParams->siteMgrDesiredChannel ? RADIO_BAND_2_4_GHZ : RADIO_BAND_5_0_GHZ );
+ /* Update site */
+ siteMgr_updateSite(pSiteMgr, pBssid, &frame ,pSiteMgr->pDesiredParams->siteMgrDesiredChannel, band, FALSE);
+
+ return OK;
+}
+
+/***********************************************************************
+ * systemConfig
+ ***********************************************************************
+DESCRIPTION: This function is called by the function 'siteMgr_selectSite()' in order to configure
+ the system with the chosen site attribute.
+
+INPUT: pSiteMgr - site mgr handle.
+
+OUTPUT:
+
+RETURN: OK
+
+************************************************************************/
+TI_STATUS systemConfig(siteMgr_t *pSiteMgr)
+{
+ siteEntry_t *pPrimarySite = pSiteMgr->pSitesMgmtParams->pPrimarySite;
+ rsnData_t rsnData;
+ UINT8 rsnAssocIeLen;
+ dot11_RSN_t *pRsnIe;
+ UINT8 rsnIECount=0;
+ UINT16 length;
+ UINT16 capabilities;
+ UINT16 PktLength=0;
+ UINT8 *pIeBuffer=NULL;
+
+#ifdef EXC_MODULE_INCLUDED
+ UINT8 ExternTxPower;
+#endif
+ TI_STATUS status;
+ slotTime_e slotTime;
+ UINT32 StaTotalRates;
+ ACParameters_t *p_ACParametersDummy = NULL;
+
+
+ if (pPrimarySite->probeRecv)
+ {
+ pIeBuffer = pPrimarySite->probeRespBuffer;
+ PktLength = pPrimarySite->probeRespLength;
+ }
+ else if (pPrimarySite->beaconRecv)
+ {
+ pIeBuffer = pPrimarySite->beaconBuffer;
+ PktLength = pPrimarySite->beaconLength;
+ }
+
+ pSiteMgr->prevRadioBand = pSiteMgr->radioBand;
+
+ WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
+ ("%s: Capabilities, Slot Time Bit = %d (capabilities = %d)\n", __FUNCTION__, (pPrimarySite->capabilities >> CAP_SLOT_TIME_SHIFT) & 1, pPrimarySite->capabilities));
+
+ if(pPrimarySite->channel <= MAX_GB_MODE_CHANEL)
+ {
+ if(pSiteMgr->pDesiredParams->siteMgrDesiredDot11Mode == DOT11_B_MODE)
+ {
+ pSiteMgr->siteMgrOperationalMode = DOT11_B_MODE;
+ slotTime = PHY_SLOT_TIME_LONG;
+
+ WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
+ ("%s: 11b Mode, Slot Time = %d\n", __FUNCTION__, (UINT8)slotTime));
+ }
+ else
+ {
+ pSiteMgr->siteMgrOperationalMode = DOT11_G_MODE;
+
+ if (((pPrimarySite->capabilities >> CAP_SLOT_TIME_SHIFT) & CAP_SLOT_TIME_MASK) == PHY_SLOT_TIME_SHORT)
+ {
+ slotTime = pSiteMgr->pDesiredParams->siteMgrDesiredSlotTime;
+
+ WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
+ ("%s: 11g Mode, Slot Time = %d (desired)\n", __FUNCTION__, (UINT8)slotTime));
+ }
+ else
+ {
+ slotTime = PHY_SLOT_TIME_LONG;
+
+ WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
+ ("%s: 11g Mode, Slot Time = %d\n", __FUNCTION__, (UINT8) slotTime));
+ }
+ }
+
+ pSiteMgr->radioBand = RADIO_BAND_2_4_GHZ;
+ pSiteMgr->pSitesMgmtParams->pCurrentSiteTable = &pSiteMgr->pSitesMgmtParams->dot11BG_sitesTables;
+ }
+ else
+ {
+ pSiteMgr->siteMgrOperationalMode = DOT11_A_MODE;
+ pSiteMgr->radioBand = RADIO_BAND_5_0_GHZ;
+ slotTime = PHY_SLOT_TIME_SHORT;
+
+ WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
+ ("%s: 11a Mode, Slot Time = %d\n", __FUNCTION__, (UINT8)slotTime));
+
+ pSiteMgr->pSitesMgmtParams->pCurrentSiteTable = (siteTablesParams_t *)&pSiteMgr->pSitesMgmtParams->dot11A_sitesTables;
+ }
+
+ /* since we are moving to the different band, the siteMgr should be reconfigured */
+ if(pSiteMgr->prevRadioBand != pSiteMgr->radioBand)
+ siteMgr_bandParamsConfig(pSiteMgr, TRUE);
+
+ if(pPrimarySite->channel <= MAX_GB_MODE_CHANEL)
+ siteMgr_updateRates(pSiteMgr, FALSE, TRUE);
+ else
+ siteMgr_updateRates(pSiteMgr, TRUE, TRUE);
+
+ /* configure hal with common core-hal parameters */
+ whalCtrl_SetRadioBand(pSiteMgr->hHalCtrl, pSiteMgr->radioBand);
+
+ pPrimarySite->currentSlotTime = slotTime;
+ whalCtrl_SetSlotTime(pSiteMgr->hHalCtrl, slotTime);
+
+ /***************** Config HAL *************************/
+ /* Current Beacon Interval */
+ whalCtrl_SetBeaconInterval( pSiteMgr->hHalCtrl , pPrimarySite->beaconInterval);
+
+ /***************** Config Site Manager *************************/
+ /* L.M. Should be fixed, should take into account the AP's rates */
+ if(pSiteMgr->pDesiredParams->siteMgrDesiredModulationType == DRV_MODULATION_CCK)
+ pSiteMgr->chosenModulation = DRV_MODULATION_CCK;
+ else if(pSiteMgr->pDesiredParams->siteMgrDesiredModulationType == DRV_MODULATION_PBCC)
+ {
+ if(pPrimarySite->probeModulation != DRV_MODULATION_NONE)
+ pSiteMgr->chosenModulation = pPrimarySite->probeModulation;
+ else
+ pSiteMgr->chosenModulation = pPrimarySite->beaconModulation;
+ }
+ else
+ pSiteMgr->chosenModulation = DRV_MODULATION_OFDM;
+
+ /* We use this variable in order tp perform the PBCC algorithm. */
+ pSiteMgr->currentDataModulation = pSiteMgr->chosenModulation;
+ /***************** Config Data CTRL *************************/
+
+ gSystemCfgParam.paramType = CTRL_DATA_CURRENT_BSSID_PARAM; /* Current BSSID */
+ os_memoryCopy(pSiteMgr->hOs, &(gSystemCfgParam.content.ctrlDataCurrentBSSID), &(pPrimarySite->bssid), sizeof(macAddress_t));
+ ctrlData_setParam(pSiteMgr->hCtrlData, &gSystemCfgParam);
+
+ gSystemCfgParam.paramType = CTRL_DATA_CURRENT_BSS_TYPE_PARAM; /* Current BSS Type */
+ gSystemCfgParam.content.ctrlDataCurrentBssType = pPrimarySite->bssType;
+ ctrlData_setParam(pSiteMgr->hCtrlData, &gSystemCfgParam);
+
+ gSystemCfgParam.paramType = CTRL_DATA_CURRENT_PREAMBLE_TYPE_PARAM; /* Current Preamble Type */
+ if ((pSiteMgr->pDesiredParams->siteMgrDesiredPreambleType == PREAMBLE_SHORT) &&
+ (pPrimarySite->currentPreambleType == PREAMBLE_SHORT))
+ gSystemCfgParam.content.ctrlDataCurrentPreambleType = PREAMBLE_SHORT;
+ else
+ gSystemCfgParam.content.ctrlDataCurrentPreambleType = PREAMBLE_LONG;
+ ctrlData_setParam(pSiteMgr->hCtrlData, &gSystemCfgParam);
+
+ /* Mutual Rates Matching */
+ StaTotalRates = pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.basicRateMask |
+ pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.supportedRateMask;
+
+
+ pSiteMgr->pDesiredParams->siteMgrMatchedSuppRateMask = StaTotalRates &
+ pPrimarySite->rateMask.supportedRateMask;
+
+ pSiteMgr->pDesiredParams->siteMgrMatchedBasicRateMask = StaTotalRates &
+ pPrimarySite->rateMask.basicRateMask;
+ if (pSiteMgr->pDesiredParams->siteMgrMatchedBasicRateMask == 0)
+ {
+ pSiteMgr->pDesiredParams->siteMgrMatchedBasicRateMask =
+ pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.basicRateMask;
+ }
+
+ pSiteMgr->pDesiredParams->siteMgrMatchedMaxBasicRate = getMaxRatefromBitmap(pSiteMgr->pDesiredParams->siteMgrMatchedBasicRateMask);
+
+ pSiteMgr->pDesiredParams->siteMgrMatchedMaxActiveRate = getMaxRatefromBitmap(pSiteMgr->pDesiredParams->siteMgrMatchedSuppRateMask);
+
+ pSiteMgr->pDesiredParams->siteMgrMatchedMaxActiveRate = MAX(pSiteMgr->pDesiredParams->siteMgrMatchedMaxBasicRate,pSiteMgr->pDesiredParams->siteMgrMatchedMaxActiveRate);
+
+ gSystemCfgParam.paramType = CTRL_DATA_CURRENT_BASIC_RATE_PARAM; /* Current Basic Rate */
+ gSystemCfgParam.content.ctrlDataCurrentBasicRate = (rate_e)pSiteMgr->pDesiredParams->siteMgrMatchedMaxBasicRate;
+ ctrlData_setParam(pSiteMgr->hCtrlData, &gSystemCfgParam);
+
+ gSystemCfgParam.paramType = CTRL_DATA_CURRENT_BASIC_RATE_MASK_PARAM;
+ gSystemCfgParam.content.ctrlDataBasicRateBitMask = pSiteMgr->pDesiredParams->siteMgrMatchedBasicRateMask;
+ ctrlData_setParam(pSiteMgr->hCtrlData, &gSystemCfgParam);
+ gSystemCfgParam.paramType = CTRL_DATA_CURRENT_BASIC_MODULATION_PARAM; /* Current Mgmt Rate */
+ if ((pPrimarySite->maxBasicRate == DRV_RATE_1M) || (pPrimarySite->maxBasicRate == DRV_RATE_2M))
+ gSystemCfgParam.content.ctrlDataCurrentBasicModulationType = DRV_MODULATION_QPSK;
+ else if (pPrimarySite->maxBasicRate == DRV_RATE_22M)
+ gSystemCfgParam.content.ctrlDataCurrentBasicModulationType = DRV_MODULATION_PBCC;
+ else if (pPrimarySite->maxBasicRate < DRV_RATE_22M)
+ gSystemCfgParam.content.ctrlDataCurrentBasicModulationType = DRV_MODULATION_CCK;
+ else
+ gSystemCfgParam.content.ctrlDataCurrentBasicModulationType = DRV_MODULATION_OFDM;
+
+ ctrlData_setParam(pSiteMgr->hCtrlData, &gSystemCfgParam);
+ gSystemCfgParam.paramType = CTRL_DATA_CURRENT_PROTECTION_STATUS_PARAM;
+ gSystemCfgParam.content.ctrlDataProtectionEnabled = pPrimarySite->useProtection;
+ ctrlData_setParam(pSiteMgr->hCtrlData, &gSystemCfgParam);
+
+ ctrlData_setSite(pSiteMgr->hCtrlData, &pPrimarySite->fourXParams);
+
+ pbccAlgorithm(pSiteMgr);
+
+ /********** Set Site QOS protocol support *************/
+
+ /* Set WME Params */
+ status = siteMgr_getWMEParamsSite(pSiteMgr,&p_ACParametersDummy);
+ if(status == OK)
+ {
+ gSystemCfgParam.content.qosSiteProtocol = WME;
+ }
+ else
+ {
+ gSystemCfgParam.content.qosSiteProtocol = NONE_QOS;
+ }
+
+ WLAN_REPORT_DEBUG_TX(pSiteMgr->hReport,
+ (" systemConfigt() : param.content.qosSiteProtoco %d\n", gSystemCfgParam.content.qosSiteProtocol));
+
+ gSystemCfgParam.paramType = QOS_MNGR_SET_SITE_PROTOCOL;
+ qosMngr_setParams(pSiteMgr->hQosMngr,&gSystemCfgParam);
+
+ /* Set active protocol in qosMngr according to station desired mode and site capabilities
+ Must be called BEFORE setting the "CURRENT_PS_MODE" into the QosMngr */
+ qosMngr_selectActiveProtocol(pSiteMgr->hQosMngr);
+
+ /* set PS capability parameter */
+ gSystemCfgParam.paramType = QOS_MNGR_CURRENT_PS_MODE;
+ if(pPrimarySite->APSDSupport == TRUE)
+ gSystemCfgParam.content.currentPsMode = PS_SCHEME_UPSD_TRIGGER;
+ else
+ gSystemCfgParam.content.currentPsMode = PS_SCHEME_LEGACY_PSPOLL;
+ qosMngr_setParams(pSiteMgr->hQosMngr,&gSystemCfgParam);
+
+ /* Set upsd/ps_poll configuration */
+ /* Must be done AFTER setting the active Protocol */
+ qosMngr_setAcPsDeliveryMode (pSiteMgr->hQosMngr);
+
+ /***************** Config RSN *************************/
+ /* Get the RSN IE data */
+ pRsnIe = pPrimarySite->pRsnIe;
+ length=0;
+ rsnIECount = 0;
+ while ((length < pPrimarySite->rsnIeLen) && (pPrimarySite->rsnIeLen < 255)
+ && (rsnIECount < MAX_RSN_IE))
+ {
+ curRsnData[0+length] = pRsnIe->hdr.eleId;
+ curRsnData[1+length] = pRsnIe->hdr.eleLen;
+ os_memoryCopy(pSiteMgr->hOs, &curRsnData[2+length], (void *)pRsnIe->rsnIeData, pRsnIe->hdr.eleLen);
+ length += pRsnIe->hdr.eleLen+2;
+ pRsnIe += 1;
+ rsnIECount++;
+ }
+ if (length<pPrimarySite->rsnIeLen)
+ {
+ WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
+ ("siteMgr_selectSiteFromTable, RSN IE is too long: rsnIeLen=%d, MAX_RSN_IE=%d\n",
+ pPrimarySite->rsnIeLen, MAX_RSN_IE));
+ }
+
+ rsnData.pIe = (pPrimarySite->rsnIeLen==0) ? NULL :curRsnData;
+ rsnData.ieLen = pPrimarySite->rsnIeLen;
+ rsnData.privacy = pPrimarySite->privacy;
+
+ rsn_setSite(pSiteMgr->hRsn, &rsnData, NULL, &rsnAssocIeLen);
+
+ /***************** Config RegulatoryDomain **************************/
+
+#ifdef EXC_MODULE_INCLUDED
+ /* set EXC TPC if present */
+ if(Exc_ParseClientTP(pSiteMgr->hOs,pPrimarySite,&ExternTxPower,pIeBuffer,PktLength) == OK)
+ {
+ WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
+ ("Select Exc_ParseClientTP == OK: Dbm = %d\n",ExternTxPower));
+ gSystemCfgParam.paramType = REGULATORY_DOMAIN_EXTERN_TX_POWER_PREFERRED;
+ gSystemCfgParam.content.ExternTxPowerPreferred = ExternTxPower;
+ regulatoryDomain_setParam(pSiteMgr->hRegulatoryDomain,&gSystemCfgParam);
+ }
+ /* Parse and save the EXC Version Number if exists */
+ excMngr_parseExcVer(pSiteMgr->hExcMngr, pIeBuffer, PktLength);
+
+#endif
+
+ /* Note: TX Power Control adjustment is now done through siteMgr_assocReport() */
+ if (pPrimarySite->powerConstraint>0)
+ { /* setting power constraint */
+ gSystemCfgParam.paramType = REGULATORY_DOMAIN_SET_POWER_CONSTRAINT_PARAM;
+ gSystemCfgParam.content.powerConstraint = pPrimarySite->powerConstraint;
+ regulatoryDomain_setParam(pSiteMgr->hRegulatoryDomain,&gSystemCfgParam);
+ }
+
+
+ /***************** Config MeasurementMgr object **************************/
+ capabilities = pPrimarySite->capabilities;
+
+ /* Updating the Measurement Module Mode */
+ measurementMgr_setMeasurementMode(pSiteMgr->hMeasurementMgr, capabilities,
+ pIeBuffer, PktLength);
+
+
+ return OK;
+}