| /** \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; |
| } |