diff options
Diffstat (limited to 'wl1271/stad/src/Application/scanMngr.c')
-rw-r--r-- | wl1271/stad/src/Application/scanMngr.c | 4672 |
1 files changed, 0 insertions, 4672 deletions
diff --git a/wl1271/stad/src/Application/scanMngr.c b/wl1271/stad/src/Application/scanMngr.c deleted file mode 100644 index 64108e1..0000000 --- a/wl1271/stad/src/Application/scanMngr.c +++ /dev/null @@ -1,4672 +0,0 @@ -/* - * scanMngr.c - * - * Copyright(c) 1998 - 2010 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. - */ - -/** \file scanMngr.c - * \brief This file include the scan manager module implementation - * - * \see scanMngr.h, scanMngrApi.h scanMngrTypes.h - */ - - -#define __FILE_ID__ FILE_ID_9 -#include "TWDriver.h" -#include "roamingMngrApi.h" -#include "osApi.h" -#include "timer.h" -#include "ScanCncn.h" -#include "report.h" -#include "regulatoryDomainApi.h" -#include "siteMgrApi.h" -#include "scanMngr.h" -#include "DrvMainModules.h" -#include "EvHandler.h" -#include "apConnApi.h" - - -/* - *********************************************************************** - * Internal functions - *********************************************************************** - */ -/*************************************************************************** -* reminder64 * -**************************************************************************** -DESCRIPTION: returns the reminder of a 64 bit number division by a 32 - bit number. - -INPUT: The dividee (64 bit number to divide) - The divider (32 bit number to divide by) - -OUTPUT: - - -RETURN: The reminder -****************************************************************************/ -static TI_UINT32 reminder64( TI_UINT64 dividee, TI_UINT32 divider ) -{ - TI_UINT32 divideeHigh, divideeLow, partA, partB, mod28n, mod24n, mod16n, partA8n, mod8n, mod4n; - - divideeHigh = INT64_HIGHER( dividee ); - divideeLow = INT64_LOWER( dividee ); - - mod8n = 256 % divider; - mod4n = 16 % divider; - - partA = (mod4n * (divideeHigh % divider)) % divider; - partA8n = (partA * mod4n) % divider; - mod16n = (partA8n * mod8n) % divider; - mod24n = (mod8n * mod16n) % divider; - mod28n = (mod4n * mod24n) % divider; - - partB = (mod4n * mod28n) % divider; - return ( partB + (divideeLow % divider)) % divider; -} - - - -static void scanMngr_setManualScanDefaultParams(TI_HANDLE hScanMngr) -{ - scanMngr_t* pScanMngr = (scanMngr_t*)hScanMngr; - - pScanMngr->manualScanParams.desiredSsid.len = 1; /* will be set by the scan concentrator */ - pScanMngr->manualScanParams.scanType= SCAN_TYPE_NORMAL_ACTIVE; - pScanMngr->manualScanParams.band = RADIO_BAND_2_4_GHZ; - pScanMngr->manualScanParams.probeReqNumber = 3; - pScanMngr->manualScanParams.probeRequestRate = (ERateMask)RATE_MASK_UNSPECIFIED; -} - - -static void scanMngr_reportContinuousScanResults (TI_HANDLE hScanMngr, EScanCncnResultStatus resultStatus) -{ - scanMngr_t* pScanMngr = (scanMngr_t*)hScanMngr; - BssListEx_t BssListEx; - - - if (resultStatus == SCAN_CRS_SCAN_COMPLETE_OK) - { - BssListEx.pListOfAPs = scanMngr_getBSSList(hScanMngr); - BssListEx.scanIsRunning = pScanMngr->bContinuousScanStarted; /* false = stopped */ - EvHandlerSendEvent(pScanMngr->hEvHandler, IPC_EVENT_CONTINUOUS_SCAN_REPORT, (TI_UINT8*)&BssListEx, sizeof(BssListEx_t)); - } - else - { - TRACE1( pScanMngr->hReport, REPORT_SEVERITY_ERROR, "scanMngr_reportContinuousScanResults failed. scan status %d\n", resultStatus); - } -} - - - -/** - * \\n - * \date 01-Mar-2005\n - * \brief Frees scan manager resources.\n - * - * Function Scope \e Private.\n - * \param hScanMngr - handle to the scan manager object.\n - */ -void scanMngrFreeMem (TI_HANDLE hScanMngr) -{ - scanMngr_t* pScanMngr = hScanMngr; - TI_UINT8 i; - - /* free frame storage space */ - for (i = 0; i < MAX_SIZE_OF_BSS_TRACK_LIST; i++) - { - if (pScanMngr->BSSList.BSSList[i].pBuffer) - { - os_memoryFree (pScanMngr->hOS, pScanMngr->BSSList.BSSList[i].pBuffer, MAX_BEACON_BODY_LENGTH); - } - } - - /* free the timer */ - if (pScanMngr->hContinuousScanTimer) - { - tmr_DestroyTimer (pScanMngr->hContinuousScanTimer); - } - - /* free the scan manager object */ - os_memoryFree (pScanMngr->hOS, hScanMngr, sizeof(scanMngr_t)); -} - -/** - * \\n - * \date 01-Mar-2005\n - * \brief Callback used by the scan concentrator for immediate scan result.\n - * - * Function Scope \e Public.\n - * \param hScanMngr - handle to the scan manager object.\n - * \param resultStatus - reason for calling this function (frame received / scan complete).\n - * \param frameInfo - frame related information (in case of a frame reception).\n - * \param SPSStatus - bitmap indicating which channels were scan, in case of an SPS scan.\n - */ -void scanMngr_immedScanCB( TI_HANDLE hScanMngr, EScanCncnResultStatus resultStatus, - TScanFrameInfo* frameInfo, TI_UINT16 SPSStatus ) -{ - scanMngr_t* pScanMngr = (scanMngr_t*)hScanMngr; - TScanBandPolicy* aPolicy; - EScanCncnResultStatus nextResultStatus; - - TRACE2( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "scanMngr_immedScanCB called, hScanMngr=0x%x, resultStatus=%d", hScanMngr, resultStatus); - - switch (resultStatus) - { - /* if this function is called because a frame was received, update the BSS list accordingly */ - case SCAN_CRS_RECEIVED_FRAME: - scanMngrUpdateReceivedFrame( hScanMngr, frameInfo ); - break; - - /* scan was completed successfuly */ - case SCAN_CRS_SCAN_COMPLETE_OK: - /* act according to immediate scan state */ - switch (pScanMngr->immedScanState) - { - /* immediate scan on G finished */ - case SCAN_ISS_G_BAND: -#ifdef TI_DBG - pScanMngr->stats.ImmediateGByStatus[ resultStatus ]++; -#endif - /* check if another scan is needed (this time on A) */ - aPolicy = scanMngrGetPolicyByBand( hScanMngr, RADIO_BAND_5_0_GHZ ); - if ( (NULL != aPolicy) && - (SCAN_TYPE_NO_SCAN != aPolicy->immediateScanMethod.scanType)) - { - /* build scan command */ - scanMngrBuildImmediateScanCommand( hScanMngr, aPolicy, pScanMngr->bImmedNeighborAPsOnly ); - - /* if no channels are available, report error */ - if ( 0 < pScanMngr->scanParams.numOfChannels ) - { - /* mark that immediate scan is running on band A */ - pScanMngr->immedScanState = SCAN_ISS_A_BAND; - - /* send scan command to scan concentrator */ - nextResultStatus = - scanCncn_Start1ShotScan( pScanMngr->hScanCncn, SCAN_SCC_ROAMING_IMMED, &(pScanMngr->scanParams)); - if ( SCAN_CRS_SCAN_RUNNING != nextResultStatus ) - { - pScanMngr->immedScanState = SCAN_ISS_IDLE; - TRACE1( pScanMngr->hReport, REPORT_SEVERITY_WARNING, "Failed to start immediate scan on band A, return code %d.\n", resultStatus); -#ifdef TI_DBG - pScanMngr->stats.ImmediateAByStatus[ nextResultStatus ]++; -#endif - scanMngr_immediateScanComplete(hScanMngr,SCAN_MRS_SCAN_COMPLETE_OK); - } - } - else - { - /* mark that immediate scan is not running */ - pScanMngr->immedScanState = SCAN_ISS_IDLE; - - /* no channels are actually available for scan - notify the roaming manager of the scan complete */ - scanMngr_immediateScanComplete(hScanMngr,SCAN_MRS_SCAN_COMPLETE_OK); - } - } - else - { - /* mark that immediate scan is not running */ - pScanMngr->immedScanState = SCAN_ISS_IDLE; - - /* otherwise, notify the roaming manager of the scan complete */ - scanMngr_immediateScanComplete(hScanMngr,SCAN_MRS_SCAN_COMPLETE_OK); - } - break; - - /* stop immediate scan was requested */ - case SCAN_ISS_STOPPING: - /* mark that immediate scan is not running */ - pScanMngr->immedScanState = SCAN_ISS_IDLE; - - /* notify the roaming manager of the scan complete */ - scanMngr_immediateScanComplete(hScanMngr,SCAN_MRS_SCAN_STOPPED); - break; - - /* Scan completed on A band */ - case SCAN_ISS_A_BAND: - /* mark that immediate scan is not running */ - pScanMngr->immedScanState = SCAN_ISS_IDLE; -#ifdef TI_DBG - pScanMngr->stats.ImmediateAByStatus[ resultStatus ]++; -#endif - /* otherwise, notify the roaming manager of the scan complete */ - scanMngr_immediateScanComplete(hScanMngr,SCAN_MRS_SCAN_COMPLETE_OK); - break; - - default: - /* should not be at any other stage when CB is invoked */ - TRACE1( pScanMngr->hReport, REPORT_SEVERITY_WARNING, "Immediate scan CB called with scan complete TI_OK reason in state:%d", pScanMngr->immedScanState); - - /* reset continuous scan to idle */ - pScanMngr->immedScanState = SCAN_ISS_IDLE; - break; - } - break; - - /* scan was completed due to an error! */ - default: -#ifdef TI_DBG - switch (pScanMngr->immedScanState) - { - case SCAN_ISS_G_BAND: - pScanMngr->stats.ImmediateGByStatus[ resultStatus ]++; - break; - - case SCAN_ISS_A_BAND: - pScanMngr->stats.ImmediateAByStatus[ resultStatus ]++; - break; - - default: - break; - } -#endif - /* mark that immediate scan is not running */ - pScanMngr->immedScanState = SCAN_ISS_IDLE; - scanMngr_immediateScanComplete(hScanMngr,scanMngrConvertResultStatus(resultStatus)); - break; - } -} - -/** - * \\n - * \date 01-Mar-2005\n - * \brief Callback used by the scan concentrator for continuous scan result.\n - * - * Function Scope \e Public.\n - * \param hScanMngr - handle to the scan manager object.\n - * \param resultStatus - reason for calling this function (frame received / scan complete).\n - * \param frameInfo - frame related info (in case of a frame reception).\n - * \param SPSStatus - bitmap indicating which channels were scan, in case of an SPS scan.\n - */ -void scanMngr_contScanCB( TI_HANDLE hScanMngr, EScanCncnResultStatus resultStatus, - TScanFrameInfo* frameInfo, TI_UINT16 SPSStatus ) -{ - scanMngr_t* pScanMngr = (scanMngr_t*)hScanMngr; - TScanBandPolicy *aPolicy; - EScanCncnResultStatus nextResultStatus; - - TRACE3( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "scanMngr_contScanCB called, hScanMngr=0x%x, resultStatus=%d, SPSStatus=%d\n", hScanMngr, resultStatus, SPSStatus); - - /* It looks like it never happens. Anyway decided to check */ - if ( pScanMngr->scanParams.numOfChannels > SCAN_MAX_NUM_OF_SPS_CHANNELS_PER_COMMAND ) - { - TRACE2( pScanMngr->hReport, REPORT_SEVERITY_ERROR, - "scanMngr_contScanCB. pScanMngr->scanParams.numOfChannels=%d exceeds the limit %d\n", - pScanMngr->scanParams.numOfChannels, SCAN_MAX_NUM_OF_SPS_CHANNELS_PER_COMMAND); - handleRunProblem(PROBLEM_BUF_SIZE_VIOLATION); - return; - } - switch (resultStatus) - { - /* frame received - update BSS list accordingly */ - case SCAN_CRS_RECEIVED_FRAME: - scanMngrUpdateReceivedFrame( hScanMngr, frameInfo ); - break; - - /* scan was completed successfully - either continue to next stage or simply finish this cycle */ - case SCAN_CRS_SCAN_COMPLETE_OK: -#ifdef SCAN_MNGR_DBG - TRACE0( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "Continuous scan completes successfuly.\n"); - scanMngrDebugPrintBSSList( hScanMngr ); -#endif -#ifdef TI_DBG - if ( SCAN_TYPE_SPS == pScanMngr->scanParams.scanType ) - { - int i; - - /*update SPS channels attendant statistics */ - for ( i = 0; i < pScanMngr->scanParams.numOfChannels; i++ ) - { - if ( TI_FALSE == WAS_SPS_CHANNEL_ATTENDED( SPSStatus, i )) - { - pScanMngr->stats.SPSChannelsNotAttended[ i ]++; - } - } - } -#endif - - /* first, remove APs that were not tracked. Note that this function does NOT - increase the retry counter, and therefore there's no harm in calling it even if only - some of the APs were searched in the previous tracking command, or previous command was - discovery */ - scanMngrPerformAging( hScanMngr ); - - - /* if new BSS's were found (or enough scan iterations passed w/o finding any), notify the roaming manager */ - if ( ((TI_TRUE == pScanMngr->bNewBSSFound) || - (SCAN_MNGR_CONSEC_SCAN_ITER_FOR_PRE_AUTH < pScanMngr->consecNotFound)) && - (pScanMngr->BSSList.numOfEntries > 0)) /* in case no AP was found for specified iterations number, - but no AP is present, and so is pre-auth */ - { - pScanMngr->bNewBSSFound = TI_FALSE; - pScanMngr->consecNotFound = 0; - roamingMngr_updateNewBssList( pScanMngr->hRoamingMngr, (bssList_t*)&(pScanMngr->BSSList)); - - if (SCANNING_OPERATIONAL_MODE_MANUAL == pScanMngr->scanningOperationalMode) - { - scanMngr_reportContinuousScanResults(hScanMngr, resultStatus); - } - } - - /* act according to continuous scan state */ - switch (pScanMngr->contScanState) - { - case SCAN_CSS_TRACKING_G_BAND: -#ifdef TI_DBG - pScanMngr->stats.TrackingGByStatus[ resultStatus ]++; -#endif - TRACE0(pScanMngr->hReport , REPORT_SEVERITY_INFORMATION, "\n Starting SCAN_CSS_TRACKING_G_BAND \n"); - /* if necessary, attempt tracking on A */ - aPolicy = scanMngrGetPolicyByBand( hScanMngr, RADIO_BAND_5_0_GHZ ); - /* if a policy is defined for A band tracking, attempt to perform it */ - if ( (NULL != aPolicy) && - (SCAN_TYPE_NO_SCAN != aPolicy->trackingMethod.scanType)) - { - /* recalculate current TSF, to adjust the TSF read at the beginning of - the continuous scan process with the tracking on G duration */ - pScanMngr->currentTSF += - ((os_timeStampMs( pScanMngr->hOS ) - pScanMngr->currentHostTimeStamp) * 1000); - - /* build scan command */ - scanMngrBuildTrackScanCommand( hScanMngr, aPolicy, RADIO_BAND_5_0_GHZ ); - - /* if channels are available for tracking on A */ - if ( 0 < pScanMngr->scanParams.numOfChannels ) - { - /* mark that continuous scan is now tracking on A */ - pScanMngr->contScanState = SCAN_CSS_TRACKING_A_BAND; - - /* send scan command */ - nextResultStatus = - scanCncn_Start1ShotScan( pScanMngr->hScanCncn, SCAN_SCC_ROAMING_CONT, &(pScanMngr->scanParams)); - if ( SCAN_CRS_SCAN_RUNNING != nextResultStatus ) - { - TRACE1( pScanMngr->hReport, REPORT_SEVERITY_WARNING, "Failed to start tracking continuous scan on band A, return code %d.\n", resultStatus); -#ifdef TI_DBG - pScanMngr->stats.TrackingAByStatus[ nextResultStatus ]++; -#endif - pScanMngr->contScanState = SCAN_CSS_IDLE; - } -#ifdef SCAN_MNGR_DBG - TRACE0( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "Tracking on A started.\n"); -#endif - return; - } - } - /* in case a TSF error was received on last continuous scan cycle, mark (now, that tracking - on both bands was attempted), that TSF values are synchronized */ - pScanMngr->bSynchronized = TI_TRUE; - - /* the break is missing on purpose: if tracking on A was not successful (or not needed), continue to discovery */ - - case SCAN_CSS_TRACKING_A_BAND: -#ifdef TI_DBG - /* update stats - since there's no break above, we must check that the state is indeed tracking on A */ - if ( SCAN_CSS_TRACKING_A_BAND == pScanMngr->contScanState ) - { - pScanMngr->stats.TrackingAByStatus[ resultStatus ]++; - } -#endif - TRACE0(pScanMngr->hReport , REPORT_SEVERITY_INFORMATION, "\n SCAN_CSS_TRACKING_A_BAND \n"); - /* if necessary and possible, attempt discovery */ - if ( (SCAN_SDP_NO_DISCOVERY != pScanMngr->currentDiscoveryPart) && - (pScanMngr->BSSList.numOfEntries <= pScanMngr->scanPolicy.BSSNumberToStartDiscovery)) - { - /* build scan command */ - scanMngrBuildDiscoveryScanCommand( hScanMngr ); - - /* if channels are available for discovery */ - if ( 0 < pScanMngr->scanParams.numOfChannels ) - { - /* mark that continuous scan is now in discovery state */ - pScanMngr->contScanState = SCAN_CSS_DISCOVERING; - - /* mark that no new APs were discovered in this discovery operation */ - pScanMngr->bNewBSSFound = TI_FALSE; - - /* send scan command */ - nextResultStatus = - scanCncn_Start1ShotScan( pScanMngr->hScanCncn, SCAN_SCC_ROAMING_CONT, &(pScanMngr->scanParams)); - if ( SCAN_CRS_SCAN_RUNNING != nextResultStatus ) - { - TRACE1( pScanMngr->hReport, REPORT_SEVERITY_WARNING, "Failed to start discovery continuous scan, nextResultStatus %d.\n", nextResultStatus); - pScanMngr->contScanState = SCAN_CSS_IDLE; - } -#ifdef SCAN_MNGR_DBG - TRACE0( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "Disocvery started.\n"); -#endif - return; - } - } - - /* the break is missing on purpose: if discovery was not successful (or not needed), finish scan cycle */ - - case SCAN_CSS_DISCOVERING: -#ifdef TI_DBG - /* update stats - since there's no break above, we must check that the state is indeed discocery */ - if ( SCAN_CSS_DISCOVERING == pScanMngr->contScanState ) - { - if ( RADIO_BAND_2_4_GHZ == pScanMngr->statsLastDiscoveryBand ) - { - pScanMngr->stats.DiscoveryGByStatus[ resultStatus ]++; - } - else - { - pScanMngr->stats.DiscoveryAByStatus[ resultStatus ]++; - } - } -#endif - /* continuous scan cycle is complete */ - pScanMngr->contScanState = SCAN_CSS_IDLE; - - break; - - case SCAN_CSS_STOPPING: - /* continuous scan cycle is complete */ - pScanMngr->contScanState = SCAN_CSS_IDLE; - break; - - default: - /* should not be at any other stage when CB is invoked */ - TRACE1( pScanMngr->hReport, REPORT_SEVERITY_WARNING, "Continuous scan CB called with scan complete TI_OK reason in state:%d\n", pScanMngr->contScanState); - - /* reset continuous scan to idle */ - pScanMngr->contScanState = SCAN_CSS_IDLE; - pScanMngr->bNewBSSFound = TI_FALSE; - break; - } - break; - - /* SPS scan was completed with TSF error */ - case SCAN_CRS_TSF_ERROR: - /* report the recovery event */ - TRACE0( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "Continuous scan callback called with TSF error indication\n"); - /* mark that the TSF values are no longer valid */ - pScanMngr->bSynchronized = TI_FALSE; -#ifdef TI_DBG - switch ( pScanMngr->contScanState ) - { - case SCAN_CSS_TRACKING_G_BAND: - pScanMngr->stats.TrackingGByStatus[ resultStatus ]++; - break; - - case SCAN_CSS_TRACKING_A_BAND: - pScanMngr->stats.TrackingAByStatus[ resultStatus ]++; - break; - - default: - break; - } -#endif - /* stop continuous scan cycle for this time (to avoid tracking using discovery only on A, thus - having mixed results - some are synchronized, some are not */ - pScanMngr->contScanState = SCAN_CSS_IDLE; - break; - - default: - /* report the status received */ - TRACE1( pScanMngr->hReport, REPORT_SEVERITY_WARNING, "Continuous scan CB called with status %d\n", resultStatus); - - /* also perform aging (since it does not increase counter, no harm done if this was not tracking */ - scanMngrPerformAging( hScanMngr ); -#ifdef TI_DBG - switch ( pScanMngr->contScanState ) - { - case SCAN_CSS_TRACKING_G_BAND: - pScanMngr->stats.TrackingGByStatus[ resultStatus ]++; - break; - - case SCAN_CSS_TRACKING_A_BAND: - pScanMngr->stats.TrackingAByStatus[ resultStatus ]++; - break; - - case SCAN_CSS_DISCOVERING: - if ( RADIO_BAND_2_4_GHZ == pScanMngr->statsLastDiscoveryBand ) - { - pScanMngr->stats.DiscoveryGByStatus[ resultStatus ]++; - } - else - { - pScanMngr->stats.DiscoveryGByStatus[ resultStatus ]++; - } - default: - break; - } -#endif - /* finish scan for this iteration */ - pScanMngr->contScanState = SCAN_CSS_IDLE; - break; - } -} - -/** - * \\n - * \date 01-Mar-2005\n - * \brief Sets the scan policy.\n - * - * Function Scope \e Public.\n - * \param hScanMngr - handle to the scan manager object.\n - * \param scanPolicy - a pointer to the policy data.\n - */ -void scanMngr_setScanPolicy( TI_HANDLE hScanMngr, TScanPolicy* scanPolicy ) -{ - scanMngr_t* pScanMngr = (scanMngr_t*)hScanMngr; - - TRACE1( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "scanMngr_setScanPolicy called, hScanMngr=0x%x.\n", hScanMngr); -#ifdef SCAN_MNGR_DBG - scanMngrTracePrintScanPolicy( scanPolicy ); -#endif - - /* if continuous or immediate scan are running, indicate that they shouldn't proceed to next scan (if any), - and stop the scan operation (in case a triggered scan was in progress and the voice was stopped, the scan - must be stopped or a recovery will occur */ - if ( pScanMngr->contScanState != SCAN_CSS_IDLE ) - { - pScanMngr->contScanState = SCAN_CSS_STOPPING; - scanCncn_StopScan( pScanMngr->hScanCncn, SCAN_SCC_ROAMING_CONT ); - } - if ( pScanMngr->immedScanState != SCAN_ISS_IDLE ) - { - pScanMngr->immedScanState = SCAN_ISS_STOPPING; - scanCncn_StopScan( pScanMngr->hScanCncn, SCAN_SCC_ROAMING_IMMED ); - } - - /* set new scan policy */ - os_memoryCopy( pScanMngr->hOS, &(pScanMngr->scanPolicy), scanPolicy, sizeof(TScanPolicy)); - - /* remove all tracked APs that are not on a policy defined channel (neighbor APs haven't changed, - so there's no need to check them */ - scanMngrUpdateBSSList( hScanMngr, TI_FALSE, TI_TRUE ); - - /* if continuous scan timer is running, stop it */ - if (pScanMngr->bTimerRunning) - { - tmr_StopTimer (pScanMngr->hContinuousScanTimer); - pScanMngr->bTimerRunning = TI_FALSE; - } - - /* if continuous scan was started, start the timer using the new intervals */ - if (pScanMngr->bContinuousScanStarted) - { - TI_UINT32 uTimeout = pScanMngr->bLowQuality ? - pScanMngr->scanPolicy.deterioratingScanInterval : - pScanMngr->scanPolicy.normalScanInterval; - - pScanMngr->bTimerRunning = TI_TRUE; - - tmr_StartTimer (pScanMngr->hContinuousScanTimer, - scanMngr_GetUpdatedTsfDtimMibForScan, - (TI_HANDLE)pScanMngr, - uTimeout, - TI_TRUE); - } - - /* reset discovery counters */ - pScanMngr->neighborAPsDiscoveryIndex[ RADIO_BAND_2_4_GHZ ] = 0; - pScanMngr->neighborAPsDiscoveryIndex[ RADIO_BAND_5_0_GHZ ] = 0; - pScanMngr->channelDiscoveryIndex[ RADIO_BAND_2_4_GHZ ] = 0; - pScanMngr->channelDiscoveryIndex[ RADIO_BAND_5_0_GHZ ] = 0; - /* set current discovery part to first part */ - pScanMngr->currentDiscoveryPart = SCAN_SDP_NEIGHBOR_G; - /* now advance discovery part to first valid part */ - scanMngrSetNextDiscoveryPart( hScanMngr ); -} - -/** - * \\n - * \date 06-Feb-2006\n - * \brief CB function for current TSF and last beacon TSF and DTIM read.\n - * - * Function Scope \e Public.\n - * \param hScanMngr - handle to the scan manager object.\n - * \param status - read status (TI_OK / TI_NOK).\n - * \param CB_buf - a pointer to the data read.\n - */ -void scanMngrGetCurrentTsfDtimMibCB(TI_HANDLE hScanMngr, TI_STATUS status, TI_UINT8* CB_buf) -{ - scanMngr_t* pScanMngr = (scanMngr_t*)hScanMngr; - - os_memoryCopy(pScanMngr->hOS, (TI_UINT8*)&(pScanMngr->currTsfDtimMib), CB_buf, sizeof(TTsfDtim)); - - /* set the current TSF and last beacon TSF and DTIM count */ - INT64_HIGHER( pScanMngr->currentTSF ) = pScanMngr->currTsfDtimMib.CurrentTSFHigh; - INT64_LOWER( pScanMngr->currentTSF ) = pScanMngr->currTsfDtimMib.CurrentTSFLow; - - INT64_HIGHER( pScanMngr->lastLocalBcnTSF ) = pScanMngr->currTsfDtimMib.lastTBTTHigh; - INT64_LOWER( pScanMngr->lastLocalBcnTSF ) = pScanMngr->currTsfDtimMib.lastTBTTLow; - - pScanMngr->lastLocalBcnDTIMCount = pScanMngr->currTsfDtimMib.LastDTIMCount; - - TRACE5( pScanMngr->hReport , REPORT_SEVERITY_INFORMATION, "\n currentTSF = %u-%u lastLocalBcnTSF = %u-%u lastDTIMCount = %d \n", INT64_HIGHER( pScanMngr->currentTSF ), INT64_LOWER( pScanMngr->currentTSF ), INT64_HIGHER( pScanMngr->lastLocalBcnTSF ), INT64_LOWER( pScanMngr->lastLocalBcnTSF ), pScanMngr->lastLocalBcnDTIMCount ); - - /* get the current host time stamp */ - pScanMngr->currentHostTimeStamp = os_timeStampMs( pScanMngr->hOS ); - - /* now that the current TSF and last beacon TSF had been retrieved from the FW, - continuous scan may proceed */ - scanMngrPerformContinuousScan(hScanMngr); -} - -/** - * \\n - * \date 06-Feb-2006\n - * \brief requests current TSF and last beacon TSF and DTIM from the FW.\n - * - * Function Scope \e Public.\n - * \param hScanMngr - handle to the scan manager object.\n - * \param bTwdInitOccured - Indicates if TWDriver recovery occured since timer started.\n - */ -void scanMngr_GetUpdatedTsfDtimMibForScan (TI_HANDLE hScanMngr, TI_BOOL bTwdInitOccured) -{ - scanMngr_t* pScanMngr = (scanMngr_t*)hScanMngr; - TTwdParamInfo param; - TI_STATUS reqStatus = TI_OK; - - TRACE0( pScanMngr->hReport , REPORT_SEVERITY_INFORMATION, "\nscanMngr_GetUpdatedTsfDtimMibForScan called\n"); - - /* Getting the current TSF and DTIM values */ - param.paramType = TWD_TSF_DTIM_MIB_PARAM_ID; - param.content.interogateCmdCBParams.fCb = (void *)scanMngrGetCurrentTsfDtimMibCB; - param.content.interogateCmdCBParams.hCb = hScanMngr; - param.content.interogateCmdCBParams.pCb = (TI_UINT8*)&pScanMngr->currTsfDtimMib; - reqStatus = TWD_GetParam (pScanMngr->hTWD, ¶m); - if ( TI_OK != reqStatus ) - { - TRACE1( pScanMngr->hReport, REPORT_SEVERITY_ERROR, ": getParam from HAL CTRL failed wih status: %d\n", reqStatus); - } -} - -/** - * \\n - * \date 01-Mar-2005\n - * \brief Starts a continuous scan operation.\n - * - * Function Scope \e Private.\n - * \param hScanMngr - handle to the scan manager object.\n - */ -void scanMngrPerformContinuousScan( TI_HANDLE hScanMngr ) -{ - - scanMngr_t* pScanMngr = (scanMngr_t*)hScanMngr; - TScanBandPolicy *gPolicy, *aPolicy; - EScanCncnResultStatus resultStatus; - paramInfo_t param; - -#ifdef SCAN_MNGR_DBG - TRACE1( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "scanMngrPerformContinuousScan called, hScanMngr=0x%x.\n", hScanMngr); - scanMngrDebugPrintBSSList( hScanMngr ); -#endif - - /* this function is called due to continuous scan timer expiry, to start a new continuous scan cycle. - If the continuous scan is anything but idle, a new cycle is not started. */ - if ( SCAN_CSS_IDLE != pScanMngr->contScanState ) - { - TRACE1( pScanMngr->hReport, REPORT_SEVERITY_WARNING, "Continuous scan timer expired and continuous scan state is:%d\n", pScanMngr->contScanState); - return; - } - - /* retrieve the current BSS DTIM period and beacon interval, for SPS DTIM avoidance - calculations later. This is done before the continuous scan process is started, - to check that they are not zero (in case the STA disconnected and somehow the - scan manager was not notified of the event). If the STA disconnected, the continuous - scan process is aborted */ - param.paramType = SITE_MGR_BEACON_INTERVAL_PARAM; - siteMgr_getParam( pScanMngr->hSiteMngr, ¶m ); - pScanMngr->currentBSSBeaconInterval = param.content.beaconInterval; - - param.paramType = SITE_MGR_DTIM_PERIOD_PARAM; - siteMgr_getParam( pScanMngr->hSiteMngr, ¶m ); - pScanMngr->currentBSSDtimPeriod = param.content.siteMgrDtimPeriod; - - /* now check that none of the above is zero */ - if ( (0 == pScanMngr->currentBSSBeaconInterval) || (0 == pScanMngr->currentBSSDtimPeriod)) - { - TRACE2( pScanMngr->hReport, REPORT_SEVERITY_ERROR, "Trying to start continuous scan cycle but DTIM period=%d and beacon interval=%d\n", pScanMngr->currentBSSDtimPeriod, pScanMngr->currentBSSBeaconInterval); - return; - } - - /* increase the consecutive not found counter */ - pScanMngr->consecNotFound++; - - /* first try tracking on G */ - gPolicy = scanMngrGetPolicyByBand( hScanMngr, RADIO_BAND_2_4_GHZ ); - /* if a policy is defined for G band tracking, attempt to perform it */ - if ( (NULL != gPolicy) && - (SCAN_TYPE_NO_SCAN != gPolicy->trackingMethod.scanType)) - { - /* build scan command */ - scanMngrBuildTrackScanCommand( hScanMngr, gPolicy, RADIO_BAND_2_4_GHZ ); - - /* if channels are available for tracking on G */ - if ( 0 < pScanMngr->scanParams.numOfChannels ) - { - /* mark that continuous scan is now tracking on G */ - pScanMngr->contScanState = SCAN_CSS_TRACKING_G_BAND; - - /* send scan command to scan concentrator with the required scan params according to scannig operational mode */ - resultStatus = scanMngr_Start1ShotScan(hScanMngr, SCAN_SCC_ROAMING_CONT); - if ( SCAN_CRS_SCAN_RUNNING != resultStatus ) - { - TRACE1( pScanMngr->hReport, REPORT_SEVERITY_WARNING, "Failed to start tracking continuous scan on G, return code %d.\n", resultStatus); -#ifdef TI_DBG - pScanMngr->stats.TrackingGByStatus[ resultStatus ]++; -#endif - pScanMngr->contScanState = SCAN_CSS_IDLE; - } -#ifdef SCAN_MNGR_DBG - TRACE0( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "Tracking on G started.\n"); -#endif - return; - } - } - - /* if not, try tracking on A */ - aPolicy = scanMngrGetPolicyByBand( hScanMngr, RADIO_BAND_5_0_GHZ ); - /* if a policy is defined for A band tracking, attempt to perform it */ - if ( (NULL != aPolicy) && - (SCAN_TYPE_NO_SCAN != aPolicy->trackingMethod.scanType)) - { - /* build scan command */ - scanMngrBuildTrackScanCommand( hScanMngr, aPolicy, RADIO_BAND_5_0_GHZ ); - - /* if channels are available for tracking on A */ - if ( 0 < pScanMngr->scanParams.numOfChannels ) - { - /* mark that continuous scan is now tracking on A */ - pScanMngr->contScanState = SCAN_CSS_TRACKING_A_BAND; - - /* send scan command to scan concentrator with the required scan params according to scanning operational mode */ - resultStatus = scanMngr_Start1ShotScan(hScanMngr, SCAN_SCC_ROAMING_CONT); - if ( SCAN_CRS_SCAN_RUNNING != resultStatus ) - { - TRACE1( pScanMngr->hReport, REPORT_SEVERITY_WARNING, "Failed to start tracking continuous scan on A, return code %d.\n", resultStatus); -#ifdef TI_DBG - pScanMngr->stats.TrackingAByStatus[ resultStatus ]++; -#endif - pScanMngr->contScanState = SCAN_CSS_IDLE; - } -#ifdef SCAN_MNGR_DBG - TRACE0( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "Tracking on A started.\n"); -#endif - return; - } - } - /* in case a TSF error was received on last continuous scan cycle, mark (now, that tracking - on both bands was attempted), that TSF values are synchronized */ - pScanMngr->bSynchronized = TI_TRUE; - - /* if this does not work as well, try discovery */ - /* discovery can be performed if discovery part is valid (this is maintained whenever a new policy or neighbor AP list - is set, a discovery scan command is built, and a new neighbor AP is discovered) */ - if ( (SCAN_SDP_NO_DISCOVERY != pScanMngr->currentDiscoveryPart) && - (pScanMngr->BSSList.numOfEntries <= pScanMngr->scanPolicy.BSSNumberToStartDiscovery)) - { - /* build scan command */ - scanMngrBuildDiscoveryScanCommand( hScanMngr ); - - /* if channels are available for discovery */ - if ( 0 < pScanMngr->scanParams.numOfChannels ) - { - /* mark that continuous scan is now in discovery state */ - pScanMngr->contScanState = SCAN_CSS_DISCOVERING; - - /* mark that no new BSS's were found (yet) */ - pScanMngr->bNewBSSFound = TI_FALSE; - - /* send scan command to scan concentrator with the required scan params according to scanning operational mode */ - resultStatus = scanMngr_Start1ShotScan(hScanMngr, SCAN_SCC_ROAMING_CONT); - if ( SCAN_CRS_SCAN_RUNNING != resultStatus ) - { - TRACE1( pScanMngr->hReport, REPORT_SEVERITY_WARNING, "Failed to start discovery continuous scan, resultStatus %d.\n", resultStatus); -#ifdef TI_DBG - if ( RADIO_BAND_2_4_GHZ == pScanMngr->statsLastDiscoveryBand ) - { - pScanMngr->stats.DiscoveryGByStatus[ resultStatus ]++; - } - else - { - pScanMngr->stats.DiscoveryAByStatus[ resultStatus ]++; - } -#endif - pScanMngr->contScanState = SCAN_CSS_IDLE; - } -#ifdef SCAN_MNGR_DBG - TRACE0( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "Discovery started.\n"); -#endif - return; - } - } - - /* if we got here, no scan had executed successfully - print a warning */ - TRACE0( pScanMngr->hReport, REPORT_SEVERITY_WARNING, "Unable to perform continuous scan.\n"); -} - -/** - * \\n - * \date 01-Mar-2005\n - * \brief Perform aging on the BSS list.\n - * - * Function Scope \e Private.\n - * \param hScanMngr - handle to the scan manager object.\n - */ -void scanMngrPerformAging( TI_HANDLE hScanMngr ) -{ - scanMngr_t* pScanMngr = (scanMngr_t*)hScanMngr; - TI_UINT8 BSSEntryIndex; - -#ifdef SCAN_MNGR_DBG - TRACE0( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "Performing Aging.\n"); -#endif - /* It looks like it never happens. Anyway decided to check */ - if (pScanMngr->BSSList.numOfEntries > MAX_SIZE_OF_BSS_TRACK_LIST) - { - TRACE2( pScanMngr->hReport, REPORT_SEVERITY_ERROR, - "scanMngrPerformAging problem. BSSList.numOfEntries=%d exceeds the limit %d\n", - pScanMngr->BSSList.numOfEntries, MAX_SIZE_OF_BSS_TRACK_LIST); - handleRunProblem(PROBLEM_BUF_SIZE_VIOLATION); - return; - } - /* loop on all entries in the BSS list */ - for ( BSSEntryIndex = 0; BSSEntryIndex < pScanMngr->BSSList.numOfEntries; ) - { - /* if an entry failed enough consecutive track attempts - remove it */ - if ( pScanMngr->BSSList.scanBSSList[ BSSEntryIndex ].trackFailCount > - pScanMngr->scanPolicy.maxTrackFailures ) - { - /* will replace this entry with one further down the array, if any. Therefore, index is not increased - (because a new entry will be placed in the same index). If this is the last entry - the number of - BSSes will be decreased, and thus the loop will exit */ -#ifdef SCAN_MNGR_DBG - TRACE7( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "Aging: removing BSSID %2x:%2x:%2x:%2x:%2x:%2x from index: %d.\n", pScanMngr->BSSList.BSSList[ BSSEntryIndex ].BSSID[ 0 ], pScanMngr->BSSList.BSSList[ BSSEntryIndex ].BSSID[ 1 ], pScanMngr->BSSList.BSSList[ BSSEntryIndex ].BSSID[ 2 ], pScanMngr->BSSList.BSSList[ BSSEntryIndex ].BSSID[ 3 ], pScanMngr->BSSList.BSSList[ BSSEntryIndex ].BSSID[ 4 ], pScanMngr->BSSList.BSSList[ BSSEntryIndex ].BSSID[ 5 ], pScanMngr->BSSList.numOfEntries); -#endif - scanMngrRemoveBSSListEntry( hScanMngr, BSSEntryIndex ); - } - else - { - BSSEntryIndex++; - } - } -} - -/** - * \\n - * \date 01-Mar-2005\n - * \brief Updates object data according to a received frame.\n - * - * Function Scope \e Private.\n - * \param hScanMngr - handle to the scan manager object.\n - * \param frameInfo - pointer to frame related information.\n - */ -void scanMngrUpdateReceivedFrame( TI_HANDLE hScanMngr, TScanFrameInfo* frameInfo ) -{ - scanMngr_t* pScanMngr = (scanMngr_t*)hScanMngr; - int BSSListIndex, neighborAPIndex; - TScanBandPolicy* pBandPolicy; - - /* It looks like it never happens. Anyway decided to check */ - if ( frameInfo->band >= RADIO_BAND_NUM_OF_BANDS ) - { - TRACE2( pScanMngr->hReport, REPORT_SEVERITY_ERROR, - "scanMngrUpdateReceivedFrame. frameInfo->band=%d exceeds the limit %d\n", - frameInfo->band, RADIO_BAND_NUM_OF_BANDS-1); - handleRunProblem(PROBLEM_BUF_SIZE_VIOLATION); - return; - } - if ( pScanMngr->neighborAPsDiscoveryList[ frameInfo->band ].numOfEntries > MAX_NUM_OF_NEIGHBOR_APS ) - { - TRACE3( pScanMngr->hReport, REPORT_SEVERITY_ERROR, - "scanMngrUpdateReceivedFrame. pScanMngr->neighborAPsDiscoveryList[ %d ].numOfEntries=%d exceeds the limit %d\n", - frameInfo->band, pScanMngr->neighborAPsDiscoveryList[ frameInfo->band ].numOfEntries, MAX_NUM_OF_NEIGHBOR_APS); - handleRunProblem(PROBLEM_BUF_SIZE_VIOLATION); - return; - } - -#ifdef SCAN_MNGR_DBG - scanMngrDebugPrintReceivedFrame( hScanMngr, frameInfo ); -#endif -#ifdef TI_DBG - pScanMngr->stats.receivedFrames++; -#endif - /* first check if the frame pass RSSI threshold. If not discard it and continue */ - pBandPolicy = scanMngrGetPolicyByBand( hScanMngr, frameInfo->band ); - if ( NULL == pBandPolicy ) /* sanity checking */ - { - TRACE1( pScanMngr->hReport, REPORT_SEVERITY_ERROR, "Recieved framed on band %d, for which policy is not defined!\n", frameInfo->band); -#ifdef TI_DBG - pScanMngr->stats.discardedFramesOther++; -#endif - return; - } - - if ( frameInfo->rssi < pBandPolicy->rxRSSIThreshold ) - { - TRACE2( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "Discarding frame beacuse RSSI %d is lower than threshold %d\n", frameInfo->rssi, pBandPolicy->rxRSSIThreshold); -#ifdef TI_DBG - pScanMngr->stats.discardedFramesLowRSSI++; -#endif - return; - } - - /* search for this AP in the tracking list */ - BSSListIndex = scanMngrGetTrackIndexByBssid( hScanMngr, frameInfo->bssId ); - - /* if the frame received from an AP in the track list */ - if (( -1 != BSSListIndex ) && (BSSListIndex < MAX_SIZE_OF_BSS_TRACK_LIST )) - { - scanMngrUpdateBSSInfo( hScanMngr, BSSListIndex, frameInfo ); - } - /* otherwise, if the list is not full and AP is either a neighbor AP or on a policy defined channel: */ - else - { - neighborAPIndex = scanMngrGetNeighborAPIndex( hScanMngr, frameInfo->band, frameInfo->bssId ); - - if ( (pScanMngr->BSSList.numOfEntries < pScanMngr->scanPolicy.BSSListSize) && - ((TI_TRUE == scanMngrIsPolicyChannel( hScanMngr, frameInfo->band, frameInfo->channel )) || - (-1 != neighborAPIndex))) - { - /* insert the AP to the list */ - scanMngrInsertNewBSSToTrackingList( hScanMngr, frameInfo ); - - /* if this is a neighbor AP */ - if ( -1 != neighborAPIndex ) - { - /* mark in the neighbor AP list that it's being tracked */ - pScanMngr->neighborAPsDiscoveryList[ frameInfo->band ].trackStatusList[ neighborAPIndex ] = SCAN_NDS_DISCOVERED; - - /* if the discovery index for this neighbor AP band points to this AP, - advance it and advance discovery part if needed */ - if ( pScanMngr->neighborAPsDiscoveryIndex[ frameInfo->band ] == neighborAPIndex ) - { - do { - pScanMngr->neighborAPsDiscoveryIndex[ frameInfo->band ]++; /* advance discovery index */ - /* while discovery list is not exhausted and no AP for discovery is found */ - } while ( (pScanMngr->neighborAPsDiscoveryIndex[ frameInfo->band ] < pScanMngr->neighborAPsDiscoveryList[ frameInfo->band ].numOfEntries) && - (SCAN_NDS_NOT_DISCOVERED != pScanMngr->neighborAPsDiscoveryList[ frameInfo->band ].trackStatusList[ pScanMngr->neighborAPsDiscoveryIndex[ frameInfo->band ] ])); - /* if discovery list isexhausted */ - if ( pScanMngr->neighborAPsDiscoveryIndex[ frameInfo->band ] == pScanMngr->neighborAPsDiscoveryList[ frameInfo->band ].numOfEntries ) - { - /* restart discovery cycle for this band's neighbor APs */ - pScanMngr->neighborAPsDiscoveryIndex[ frameInfo->band ] = 0; - /* set new discovery part (if needed) */ - scanMngrSetNextDiscoveryPart( hScanMngr ); - } - } - } - } -#ifdef TI_DBG - else - { - pScanMngr->stats.discardedFramesOther++; - } -#endif - } -} - -/** - * \\n - * \date 17-Mar-2005\n - * \brief Cerate a new tracking entry and store the newly discovered AP info in it.\n - * - * Function Scope \e Private.\n - * \param hScanMngr - handle to the scan manager object.\n - * \param frameInfo - a pointer to the information received from this AP.\n - */ -void scanMngrInsertNewBSSToTrackingList( TI_HANDLE hScanMngr, TScanFrameInfo* frameInfo ) -{ - scanMngr_t* pScanMngr = (scanMngr_t*)hScanMngr; -#ifdef SCAN_SPS_USE_DRIFT_COMPENSATION - int i; -#endif - - /* mark that a new AP was discovered (for discovery stage) */ - pScanMngr->bNewBSSFound = TI_TRUE; - - /* It looks like it never happens. Anyway decided to check */ - if ( pScanMngr->BSSList.numOfEntries > MAX_SIZE_OF_BSS_TRACK_LIST ) - { - TRACE2( pScanMngr->hReport, REPORT_SEVERITY_ERROR, - "scanMngrInsertNewBSSToTrackingList. pScanMngr->BSSList.numOfEntries =%d can not exceed the limit %d\n", - pScanMngr->BSSList.numOfEntries, MAX_SIZE_OF_BSS_TRACK_LIST); - handleRunProblem(PROBLEM_BUF_SIZE_VIOLATION); - return; - } - /* insert fields that are not update regulary */ - pScanMngr->BSSList.BSSList[ pScanMngr->BSSList.numOfEntries ].bNeighborAP = - ( -1 == scanMngrGetNeighborAPIndex( hScanMngr, frameInfo->band, frameInfo->bssId ) ? - TI_FALSE : - TI_TRUE ); - MAC_COPY (pScanMngr->BSSList.BSSList[pScanMngr->BSSList.numOfEntries].BSSID, *(frameInfo->bssId)); - - /* initialize average RSSI value */ - pScanMngr->BSSList.BSSList[ pScanMngr->BSSList.numOfEntries ].RSSI = frameInfo->rssi; - pScanMngr->BSSList.BSSList[ pScanMngr->BSSList.numOfEntries ].lastRSSI = frameInfo->rssi; - -#ifdef SCAN_SPS_USE_DRIFT_COMPENSATION - /* initialize previous delta change array (used for SPS drift compensation) */ - pScanMngr->BSSList.scanBSSList[ pScanMngr->BSSList.numOfEntries ].prevTSFDelta = 0; - pScanMngr->BSSList.scanBSSList[ pScanMngr->BSSList.numOfEntries ].deltaChangeArrayIndex = 0; - for ( i = 0; i < SCAN_SPS_NUM_OF_TSF_DELTA_ENTRIES; i++ ) - { - pScanMngr->BSSList.scanBSSList[ pScanMngr->BSSList.numOfEntries ].deltaChangeArray[ i ] = 0; - } -#endif - - /* update regular fields */ - pScanMngr->BSSList.scanBSSList[ pScanMngr->BSSList.numOfEntries ].trackFailCount = 0; /* for correct statistics update */ - scanMngrUpdateBSSInfo( hScanMngr, pScanMngr->BSSList.numOfEntries, frameInfo ); - - /* increase the number of tracked APs */ - pScanMngr->BSSList.numOfEntries++; -} - -/** - * \\n - * \date 17-Mar-2005\n - * \brief Updates tracked AP information.\n - * - * Function Scope \e Private.\n - * \param hScanMngr - handle to the scan manager object.\n - * \param BSSListIndex - index to the BSS list where the AP information is stored.\n - * \param frameInfo - a pointer to the information received from this AP.\n - */ -void scanMngrUpdateBSSInfo( TI_HANDLE hScanMngr, TI_UINT8 BSSListIndex, TScanFrameInfo* frameInfo ) -{ - scanMngr_t* pScanMngr = (scanMngr_t*)hScanMngr; - - /* update AP data */ - pScanMngr->BSSList.BSSList[ BSSListIndex ].lastRxHostTimestamp = os_timeStampMs( pScanMngr->hOS ); - pScanMngr->BSSList.BSSList[ BSSListIndex ].resultType = (frameInfo->parsedIEs->subType == BEACON) ? SCAN_RFT_BEACON : SCAN_RFT_PROBE_RESPONSE; - pScanMngr->BSSList.BSSList[ BSSListIndex ].band = frameInfo->band; - pScanMngr->BSSList.BSSList[ BSSListIndex ].channel = frameInfo->channel; - /* if the received TSF (which is the lower 32 bits) is smaller than the lower 32 bits of the last beacon - TSF, it means the higher 32 bits should be increased by 1 (TSF overflow to higher 32 bits occurred between - last beacon of current AP and this frame). */ - if ( INT64_LOWER( (pScanMngr->currentTSF)) > frameInfo->staTSF ) - { - INT64_HIGHER( (pScanMngr->BSSList.scanBSSList[ BSSListIndex ].localTSF)) = - INT64_HIGHER( (pScanMngr->currentTSF)) + 1; - } - else - { - INT64_HIGHER( (pScanMngr->BSSList.scanBSSList[ BSSListIndex ].localTSF)) = - INT64_HIGHER( (pScanMngr->currentTSF)); - } - INT64_LOWER( (pScanMngr->BSSList.scanBSSList[ BSSListIndex ].localTSF)) = frameInfo->staTSF; - - if ( BEACON == frameInfo->parsedIEs->subType ) - { - os_memoryCopy( pScanMngr->hOS, &(pScanMngr->BSSList.BSSList[ BSSListIndex ].lastRxTSF), - (void *)frameInfo->parsedIEs->content.iePacket.timestamp, TIME_STAMP_LEN ); - pScanMngr->BSSList.BSSList[ BSSListIndex ].beaconInterval = - frameInfo->parsedIEs->content.iePacket.beaconInerval; - pScanMngr->BSSList.BSSList[ BSSListIndex ].capabilities = - frameInfo->parsedIEs->content.iePacket.capabilities; - } - else - { - os_memoryCopy( pScanMngr->hOS, &(pScanMngr->BSSList.BSSList[ BSSListIndex ].lastRxTSF), - (void *)frameInfo->parsedIEs->content.iePacket.timestamp, TIME_STAMP_LEN ); - pScanMngr->BSSList.BSSList[ BSSListIndex ].beaconInterval = - frameInfo->parsedIEs->content.iePacket.beaconInerval; - pScanMngr->BSSList.BSSList[ BSSListIndex ].capabilities = - frameInfo->parsedIEs->content.iePacket.capabilities; - } -#ifdef TI_DBG - /* - update track fail histogram: - 1. only done when tracking (to avoid updating due to "accidental re-discovery" - 2. only done for APs which have their track fail count larger than 0. The reason for that is because - when tracking is started, the track fail count is increased, and thus if it is 0 tracking was not - attempted for this AP, or more than one frame was received as a result of tracking operation for the AP. - */ - if ( ((SCAN_CSS_TRACKING_A_BAND == pScanMngr->contScanState) || - (SCAN_CSS_TRACKING_G_BAND == pScanMngr->contScanState)) && - (0 < pScanMngr->BSSList.scanBSSList[ BSSListIndex ].trackFailCount)) - { - if ( SCAN_MNGR_STAT_MAX_TRACK_FAILURE <= - pScanMngr->BSSList.scanBSSList[ BSSListIndex ].trackFailCount ) - { - pScanMngr->stats.ConsecutiveTrackFailCountHistogram[ SCAN_MNGR_STAT_MAX_TRACK_FAILURE - 1 ]++; - } - else - { - pScanMngr->stats.ConsecutiveTrackFailCountHistogram[ pScanMngr->BSSList.scanBSSList[ BSSListIndex ].trackFailCount - 1 ]++; - } - } -#endif - pScanMngr->BSSList.scanBSSList[ BSSListIndex ].trackFailCount = 0; - - /* update RSSI value */ - { - TI_INT8 rssiPrevVal = pScanMngr->BSSList.BSSList[ BSSListIndex ].RSSI; - TI_INT8 tmpRssiAvg = ((RSSI_PREVIOUS_COEFFICIENT * rssiPrevVal) + - ((10-RSSI_PREVIOUS_COEFFICIENT) * frameInfo->rssi)) / 10; - - pScanMngr->BSSList.BSSList[ BSSListIndex ].lastRSSI = frameInfo->rssi; - - if (rssiPrevVal!=0) - { - /* for faster convergence on RSSI changes use rounding error calculation with latest sample and not - on latest average */ - if (frameInfo->rssi > tmpRssiAvg) - tmpRssiAvg++; - else - if (frameInfo->rssi < tmpRssiAvg) - tmpRssiAvg--; - - pScanMngr->BSSList.BSSList[ BSSListIndex ].RSSI = tmpRssiAvg; - } - else - { - pScanMngr->BSSList.BSSList[ BSSListIndex ].RSSI = frameInfo->rssi; - } - TRACE2( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "given RSSI=%d, AVRG RSSI=%d\n", frameInfo->rssi, pScanMngr->BSSList.BSSList[ BSSListIndex ].RSSI); - - } - - pScanMngr->BSSList.BSSList[ BSSListIndex ].rxRate = frameInfo->rate; - os_memoryCopy( pScanMngr->hOS, pScanMngr->BSSList.BSSList[ BSSListIndex ].pBuffer, - frameInfo->buffer, frameInfo->bufferLength ); - pScanMngr->BSSList.BSSList[ BSSListIndex ].bufferLength = frameInfo->bufferLength; -} - -/** - * \\n - * \date 16-Mar-2005\n - * \brief Search tracking list for an entry matching given BSSID.\n - * - * Function Scope \e Private.\n - * \param hScanMngr - handle to the scan manager object.\n - * \param bssId - the BSSID to search for.\n - * \return entry index if found, -1 if no entry matching the BSSID was found.\n - */ -TI_INT8 scanMngrGetTrackIndexByBssid( TI_HANDLE hScanMngr, TMacAddr* bssId ) -{ - scanMngr_t* pScanMngr = (scanMngr_t*)hScanMngr; - int i; - - for ( i = 0; i < pScanMngr->BSSList.numOfEntries; i++ ) - { - if (MAC_EQUAL(*bssId, pScanMngr->BSSList.BSSList[ i ].BSSID)) - { - return i; - } - } - return -1; -} - -/** - * \\n - * \date 02-Mar-2005\n - * \brief Search current policy for band policy - * - * Function Scope \e Private.\n - * \param hScanMngr - handle to the scan manager object.\n - * \param band - the band to find policy for.\n - * \return the policy structure if found, NULL if no policy configured for this band.\n - */ -TScanBandPolicy* scanMngrGetPolicyByBand( TI_HANDLE hScanMngr, ERadioBand band ) -{ - scanMngr_t* pScanMngr = (scanMngr_t*)hScanMngr; - int i; - - /* loop on all configured policies, and look for the requested band */ - for ( i = 0; i < pScanMngr->scanPolicy.numOfBands; i++ ) - { - if ( band == pScanMngr->scanPolicy.bandScanPolicy[ i ].band ) - { - return &(pScanMngr->scanPolicy.bandScanPolicy[ i ]); - } - } - - /* if no policy was found, there's no policy configured for the requested band */ - return NULL; -} - -/** - * \\n - * \date 06-Mar-2005\n - * \brief Sets the next discovery part according to current discovery part, policies and neighbor APs availability .\n - * - * Function Scope \e Private.\n - * \param hScanMngr - handle to the scan manager object.\n - */ -void scanMngrSetNextDiscoveryPart( TI_HANDLE hScanMngr ) -{ - scanMngr_t* pScanMngr = (scanMngr_t*)hScanMngr; - scan_discoveryPart_e nextDiscoveryPart, originalDiscoveryPart; - - /* sanity check - if discovery part is not valid, restart from first discovery part */ - if ( SCAN_SDP_NO_DISCOVERY <= pScanMngr->currentDiscoveryPart ) - { - pScanMngr->currentDiscoveryPart = SCAN_SDP_NEIGHBOR_G; - } - - /* if current discovery part is valid, do nothing */ - if ( TI_TRUE == scanMngrIsDiscoveryValid( hScanMngr, pScanMngr->currentDiscoveryPart )) - { - return; - } - - /* next discovery part is found according to current part, in the following order: - Neighbor APs on G, Neighbor APs on A, Channel list on G, Channel list on A */ - /* get next discovery part */ - nextDiscoveryPart = pScanMngr->currentDiscoveryPart; - originalDiscoveryPart = pScanMngr->currentDiscoveryPart; - - do - { - nextDiscoveryPart++; - /* loop back to first discovery part if discovery list end had been reached */ - if ( SCAN_SDP_NO_DISCOVERY == nextDiscoveryPart ) - { - nextDiscoveryPart = SCAN_SDP_NEIGHBOR_G; - } - /* try next discovery part until first one is reached again or a valid part is found */ - } while( (nextDiscoveryPart != originalDiscoveryPart) && - (TI_FALSE == scanMngrIsDiscoveryValid( hScanMngr, nextDiscoveryPart ))); - - /* if a discovery part for which discovery is valid was found, use it */ - if ( TI_TRUE == scanMngrIsDiscoveryValid( hScanMngr, nextDiscoveryPart )) - { - pScanMngr->currentDiscoveryPart = nextDiscoveryPart; - } - /* otherwise don't do discovery */ - else - { - pScanMngr->currentDiscoveryPart = SCAN_SDP_NO_DISCOVERY; - } -} - -/** - * \\n - * \date 06-Mar-2005\n - * \brief Checks whether discovery should be performed on the specified discovery part.\n - * - * Function Scope \e Private.\n - * \param hScanMngr - handle to the scan manager object.\n - * \param discoveryPart - the discovery part to check.\n - */ -TI_BOOL scanMngrIsDiscoveryValid( TI_HANDLE hScanMngr, scan_discoveryPart_e discoveryPart ) -{ - scanMngr_t* pScanMngr = (TI_HANDLE)hScanMngr; - TScanBandPolicy *gPolicy, *aPolicy; - - gPolicy = scanMngrGetPolicyByBand( hScanMngr, RADIO_BAND_2_4_GHZ ); - aPolicy = scanMngrGetPolicyByBand( hScanMngr, RADIO_BAND_5_0_GHZ ); - - switch (discoveryPart) - { - case SCAN_SDP_NEIGHBOR_G: - /* for discovery on G neighbor APs, a policy must be defined for G, discovery scan type should be present, - number of neighbor APs on G should be greater than zero, and at least one AP should be yet undiscovered */ - if ( (NULL != gPolicy) && - (SCAN_TYPE_NO_SCAN != gPolicy->discoveryMethod.scanType) && - (0 < pScanMngr->neighborAPsDiscoveryList[ RADIO_BAND_2_4_GHZ ].numOfEntries) && - (TI_TRUE == scanMngrNeighborAPsAvailableForDiscovery( hScanMngr, RADIO_BAND_2_4_GHZ ))) - { - return TI_TRUE; - } - else - { - return TI_FALSE; - } - - case SCAN_SDP_NEIGHBOR_A: - /* for discovery on A neighbor APs, a policy must be defined for A, discovery scan type should be present, - number of neighbor APs on A should be greater than zero, and at least one AP should be yet undiscovered */ - if ( (NULL != aPolicy) && - (SCAN_TYPE_NO_SCAN != aPolicy->discoveryMethod.scanType) && - (0 < pScanMngr->neighborAPsDiscoveryList[ RADIO_BAND_5_0_GHZ ].numOfEntries) && - (TI_TRUE == scanMngrNeighborAPsAvailableForDiscovery( hScanMngr, RADIO_BAND_5_0_GHZ ))) - { - return TI_TRUE; - } - else - { - return TI_FALSE; - } - - case SCAN_SDP_CHANNEL_LIST_G: - /* for discovery on G channel list, a policy must be defined for G, discovery scan type should be present, - and number of channels in G channel list should be greater than zero */ - if ( (NULL != gPolicy) && - (SCAN_TYPE_NO_SCAN != gPolicy->discoveryMethod.scanType) && - (0 < gPolicy->numOfChannles)) - { - return TI_TRUE; - } - else - { - return TI_FALSE; - } - case SCAN_SDP_CHANNEL_LIST_A: - /* for discovery on A channel list, a policy must be defined for A, discovery scan type should be present, - and number of channels in A channel list should be greater than zero */ - if ( (NULL != aPolicy) && - (SCAN_TYPE_NO_SCAN != aPolicy->discoveryMethod.scanType) && - (0 < aPolicy->numOfChannles)) - { - return TI_TRUE; - } - else - { - return TI_FALSE; - } - default: - TRACE1( pScanMngr->hReport, REPORT_SEVERITY_WARNING, "Checking whather discovery is valid for discovery part %d", discoveryPart); - return TI_FALSE; - } -} - -/** - * \\n - * \date 07-Mar-2005\n - * \brief Check whether there are neighbor APs to track on the given band.\n - * - * Function Scope \e Private.\n - * \param hScanMngr - handle to the scan manager object.\n - * \param bandPolicy - The scan policy for the requested band.\n - * \param bNeighborAPsOnly - whether to scan for neighbor APs only or for all policy defined channels.\n - */ -TI_BOOL scanMngrNeighborAPsAvailableForDiscovery( TI_HANDLE hScanMngr, ERadioBand band ) -{ - scanMngr_t* pScanMngr = (scanMngr_t*)hScanMngr; - int i; - - - /* loop on all neighbor APs of the given band */ - for ( i = 0; i < pScanMngr->neighborAPsDiscoveryList[ band ].numOfEntries; i++ ) - { - /* if a neighbor AP is not being tracked, meaning it yet has to be discovered, return TI_TRUE */ - if ( SCAN_NDS_NOT_DISCOVERED == pScanMngr->neighborAPsDiscoveryList[ band ].trackStatusList[ i ] ) - { - return TI_TRUE; - } - } - /* if all neighbor APs are being tracked (or no neighbor APs available) return TI_FALSE */ - return TI_FALSE; -} - -/** - * \\n - * \date 02-Mar-2005\n - * \brief Builds a scan command on the object workspace for immediate scan.\n - * - * Function Scope \e Private.\n - * \param hScanMngr - handle to the scan manager object.\n - * \param bandPolicy - The scan policy for the requested band.\n - * \param bNeighborAPsOnly - whether to scan for neighbor APs only or for all policy defined channels.\n - */ -void scanMngrBuildImmediateScanCommand( TI_HANDLE hScanMngr, TScanBandPolicy* bandPolicy, TI_BOOL bNeighborAPsOnly ) -{ - scanMngr_t* pScanMngr = (scanMngr_t*)hScanMngr; - int channelIndex; - paramInfo_t param; - TMacAddr broadcastAddress; - int i; - - /* It looks like it never happens. Anyway decided to check */ - if ( bandPolicy->band >= RADIO_BAND_NUM_OF_BANDS ) - { - TRACE2( pScanMngr->hReport, REPORT_SEVERITY_ERROR, - "scanMngrBuildImmediateScanCommand. bandPolicy->band=%d exceeds the limit %d\n", - bandPolicy->band, RADIO_BAND_NUM_OF_BANDS-1); - handleRunProblem(PROBLEM_BUF_SIZE_VIOLATION); - return; - } - if ( pScanMngr->neighborAPsDiscoveryList[ bandPolicy->band ].numOfEntries > MAX_NUM_OF_NEIGHBOR_APS ) - { - TRACE3( pScanMngr->hReport, REPORT_SEVERITY_ERROR, - "scanMngrBuildImmediateScanCommand. pScanMngr->neighborAPsDiscoveryList[%d].numOfEntries=%d exceeds the limit %d\n", - bandPolicy->band, pScanMngr->neighborAPsDiscoveryList[ bandPolicy->band ].numOfEntries, MAX_NUM_OF_NEIGHBOR_APS); - handleRunProblem(PROBLEM_BUF_SIZE_VIOLATION); - return; - } - /* first, build the command header */ - scanMngrBuildScanCommandHeader( hScanMngr, &(bandPolicy->immediateScanMethod), bandPolicy->band ); - - /* if requested to scan on neighbor APs only */ - if ( TI_TRUE == bNeighborAPsOnly ) - { - /* loop on all neighbor APs */ - channelIndex = 0; - while ( (channelIndex < pScanMngr->neighborAPsDiscoveryList[ bandPolicy->band ].numOfEntries) && - (pScanMngr->scanParams.numOfChannels < SCAN_MAX_NUM_OF_NORMAL_CHANNELS_PER_COMMAND)) - { - /* verify channel with reg domain */ - param.paramType = REGULATORY_DOMAIN_GET_SCAN_CAPABILITIES; - param.content.channelCapabilityReq.band = bandPolicy->band; - if ( (bandPolicy->immediateScanMethod.scanType == SCAN_TYPE_NORMAL_PASSIVE) || - (bandPolicy->immediateScanMethod.scanType == SCAN_TYPE_TRIGGERED_PASSIVE) || - (bandPolicy->immediateScanMethod.scanType == SCAN_TYPE_SPS)) - { - param.content.channelCapabilityReq.scanOption = PASSIVE_SCANNING; - } - else - { - param.content.channelCapabilityReq.scanOption = ACTIVE_SCANNING; - } - param.content.channelCapabilityReq.channelNum = - pScanMngr->neighborAPsDiscoveryList[ bandPolicy->band ].APListPtr[ channelIndex ].channel; - regulatoryDomain_getParam( pScanMngr->hRegulatoryDomain, ¶m ); - - /* if the channel is allowed, insert it to the scan command */ - if (param.content.channelCapabilityRet.channelValidity) - { - scanMngrAddNormalChannel( hScanMngr, &(bandPolicy->immediateScanMethod), - pScanMngr->neighborAPsDiscoveryList[ bandPolicy->band ].APListPtr[ channelIndex ].channel, - &(pScanMngr->neighborAPsDiscoveryList[ bandPolicy->band ].APListPtr[ channelIndex ].BSSID), - param.content.channelCapabilityRet.maxTxPowerDbm ); - } - channelIndex++; - } - } - else - /* scan on all policy defined channels */ - { - /* set the broadcast address */ - for ( i = 0; i < MAC_ADDR_LEN; i++ ) - { - broadcastAddress[ i ] = 0xff; - } - - /* loop on all channels in the policy */ - channelIndex = 0; - while ( (channelIndex < bandPolicy->numOfChannles) && - (pScanMngr->scanParams.numOfChannels < SCAN_MAX_NUM_OF_NORMAL_CHANNELS_PER_COMMAND)) - { - /* verify channel with reg domain */ - param.paramType = REGULATORY_DOMAIN_GET_SCAN_CAPABILITIES; - param.content.channelCapabilityReq.band = bandPolicy->band; - if ( (bandPolicy->immediateScanMethod.scanType == SCAN_TYPE_NORMAL_PASSIVE) || - (bandPolicy->immediateScanMethod.scanType == SCAN_TYPE_TRIGGERED_PASSIVE) || - (bandPolicy->immediateScanMethod.scanType == SCAN_TYPE_SPS)) - { - param.content.channelCapabilityReq.scanOption = PASSIVE_SCANNING; - } - else - { - param.content.channelCapabilityReq.scanOption = ACTIVE_SCANNING; - } - param.content.channelCapabilityReq.channelNum = bandPolicy->channelList[ channelIndex ]; - regulatoryDomain_getParam( pScanMngr->hRegulatoryDomain, ¶m ); - - /* if the channel is allowed, insert it to the scan command */ - if (param.content.channelCapabilityRet.channelValidity) - { - scanMngrAddNormalChannel( hScanMngr, &(bandPolicy->immediateScanMethod), - bandPolicy->channelList[ channelIndex ], - &broadcastAddress, - param.content.channelCapabilityRet.maxTxPowerDbm ); - } - channelIndex++; - } - } -} - -/** - * \\n - * \date 03-Mar-2005\n - * \brief Builds a scan command on the object workspace for tracking.\n - * - * Function Scope \e Private.\n - * \param hScanMngr - handle to the scan manager object.\n - * \param bandPolicy - The scan policy for the band to track on.\n - * \param band - the band to scan.\n - */ -void scanMngrBuildTrackScanCommand( TI_HANDLE hScanMngr, TScanBandPolicy* bandPolicy, ERadioBand band ) -{ - scanMngr_t* pScanMngr = (scanMngr_t*)hScanMngr; - int BSSListIndex; - paramInfo_t param; - TScanMethod* scanMethod; - - TRACE0(pScanMngr->hReport , REPORT_SEVERITY_INFORMATION, "\n scanMngrBuildTrackScanCommand \n"); - - - /* SPS is performed differently from all other scan types, and only if TSF error has not occured */ - if ( (SCAN_TYPE_SPS == bandPolicy->trackingMethod.scanType) && (TI_TRUE == pScanMngr->bSynchronized)) - { - /* build the command header */ - TRACE0(pScanMngr->hReport , REPORT_SEVERITY_INFORMATION, "\nSPS invoked\n"); - scanMngrBuildScanCommandHeader( hScanMngr, &(bandPolicy->trackingMethod), band ); - - /* build the channel list */ - scanMngrAddSPSChannels( hScanMngr, &(bandPolicy->trackingMethod), band ); - return; - } - - /* the scan method to use is the method defined for tracking, unless this is SPS and TSF error occurred, - in which case we use the discovery method this time. */ - if ( (SCAN_TYPE_SPS == bandPolicy->trackingMethod.scanType) && (TI_FALSE == pScanMngr->bSynchronized)) - { - /* use discovery scan method */ - scanMethod = &(bandPolicy->discoveryMethod); - } - else - { - /* use tracking method */ - scanMethod = &(bandPolicy->trackingMethod); - } - - /* build the command header */ - scanMngrBuildScanCommandHeader( hScanMngr, scanMethod, band ); - - /* It looks like it never happens. Anyway decided to check */ - if ( pScanMngr->BSSList.numOfEntries > MAX_SIZE_OF_BSS_TRACK_LIST ) - { - TRACE2( pScanMngr->hReport, REPORT_SEVERITY_ERROR, - "scanMngrBuildTrackScanCommand. pScanMngr->BSSList.numOfEntries=%d exceeds the limit %d\n", - pScanMngr->BSSList.numOfEntries, MAX_SIZE_OF_BSS_TRACK_LIST); - handleRunProblem(PROBLEM_BUF_SIZE_VIOLATION); - return; - } - if ( bandPolicy->numOfChannles > MAX_BAND_POLICY_CHANNLES ) - { - TRACE2( pScanMngr->hReport, REPORT_SEVERITY_ERROR, - "scanMngrBuildTrackScanCommand. bandPolicy->numOfChannles=%d exceeds the limit %d\n", - bandPolicy->numOfChannles, MAX_BAND_POLICY_CHANNLES); - handleRunProblem(PROBLEM_BUF_SIZE_VIOLATION); - return; - } - /* insert channels from tracking list according to requested band */ - BSSListIndex = 0; - while ( (BSSListIndex < pScanMngr->BSSList.numOfEntries) && - (pScanMngr->scanParams.numOfChannels < SCAN_MAX_NUM_OF_NORMAL_CHANNELS_PER_COMMAND)) - { - /* if BSS is on the right band */ - if ( band == pScanMngr->BSSList.BSSList[ BSSListIndex ].band ) - { - /* verify the channel with the reg domain */ - param.paramType = REGULATORY_DOMAIN_GET_SCAN_CAPABILITIES; - param.content.channelCapabilityReq.band = band; - if ( (scanMethod->scanType == SCAN_TYPE_NORMAL_PASSIVE) || - (scanMethod->scanType == SCAN_TYPE_TRIGGERED_PASSIVE)) - { - param.content.channelCapabilityReq.scanOption = PASSIVE_SCANNING; - } - else - { - param.content.channelCapabilityReq.scanOption = ACTIVE_SCANNING; - } - param.content.channelCapabilityReq.channelNum = pScanMngr->BSSList.BSSList[ BSSListIndex ].channel; - regulatoryDomain_getParam( pScanMngr->hRegulatoryDomain, ¶m ); - - /* if channel is verified for requested scan type */ - if ( param.content.channelCapabilityRet.channelValidity ) - { - scanMngrAddNormalChannel( hScanMngr, scanMethod, - pScanMngr->BSSList.BSSList[ BSSListIndex ].channel, - &(pScanMngr->BSSList.BSSList[ BSSListIndex ].BSSID), - param.content.channelCapabilityRet.maxTxPowerDbm ); - - /* increase AP track attempts counter */ - if ( (SCAN_TYPE_SPS == bandPolicy->trackingMethod.scanType) && (TI_FALSE == pScanMngr->bSynchronized)) - { - pScanMngr->BSSList.scanBSSList[ BSSListIndex ].trackFailCount = - pScanMngr->scanPolicy.maxTrackFailures + 1; - } - else - { - pScanMngr->BSSList.scanBSSList[ BSSListIndex ].trackFailCount++; - } - } - /* if channel is not verified, there are two options: - 1. we are using the tracking method, and thus the AP should be removed (because we are unable - to track it) - 2. we are using the discovery method (because a TSF error occurred and tracking method is SPS). - In this case, it seems we do not have to remove the AP (because the channel may not be valid - for active scan but it is valid for passive scan), but since we had a TSF error the AP would - be removed anyhow if not re-discovered now, so no harm done in removing it as well. */ - else - { - /* removing an AP is done by increasing its track failure counter to maximum. Since it is - not tracked, it would not be found, and thus would be removed by aging process performed - at scan completion */ - pScanMngr->BSSList.scanBSSList[ BSSListIndex ].trackFailCount = - pScanMngr->scanPolicy.maxTrackFailures + 1; -#ifdef TI_DBG - /* update statistics */ - pScanMngr->stats.APsRemovedInvalidChannel++; -#endif - } - } - BSSListIndex++; - } -} - -/** - * \\n - * \date 03-Mar-2005\n - * \brief Builds a scan command on the object workspace for discovery.\n - * - * Function Scope \e Private.\n - * \param hScanMngr - handle to the scan manager object.\n - */ -void scanMngrBuildDiscoveryScanCommand( TI_HANDLE hScanMngr ) -{ - scanMngr_t* pScanMngr = (scanMngr_t*)hScanMngr; - ERadioBand band; - TScanBandPolicy* bandPolicy; - - /* find on which band to discover at current cycle */ - if ( (SCAN_SDP_NEIGHBOR_G == pScanMngr->currentDiscoveryPart) || - (SCAN_SDP_CHANNEL_LIST_G == pScanMngr->currentDiscoveryPart)) - { - band = RADIO_BAND_2_4_GHZ; - bandPolicy = scanMngrGetPolicyByBand( hScanMngr, band ); - } - else - { - band = RADIO_BAND_5_0_GHZ; - bandPolicy = scanMngrGetPolicyByBand( hScanMngr, band ); - } - - if( NULL == bandPolicy) - { - TRACE0( pScanMngr->hReport, REPORT_SEVERITY_WARNING, "scanMngrGetPolicyByBand() returned NULL.\n"); - return; - } - - /* first, build the command header */ - scanMngrBuildScanCommandHeader( hScanMngr, &(bandPolicy->discoveryMethod), band ); - - /* channels are added according to current discovery part */ - switch ( pScanMngr->currentDiscoveryPart ) - { - case SCAN_SDP_NEIGHBOR_G: - /* add channels from neighbor AP discovery list */ - scanMngrAddNeighborAPsForDiscovery( hScanMngr, bandPolicy ); - - /* if neighbor AP list is exhausted, proceed to next discovery part */ - if ( 0 == pScanMngr->neighborAPsDiscoveryIndex[ band ] ) - { - pScanMngr->currentDiscoveryPart++; - scanMngrSetNextDiscoveryPart( hScanMngr ); - } - - /* if need to discover more APs, (not enough neighbor APs), proceed to G channel list */ - if ( pScanMngr->scanParams.numOfChannels < bandPolicy->numOfChannlesForDiscovery ) - { - scanMngrAddChannelListForDiscovery( hScanMngr, bandPolicy ); - } - -#ifdef TI_DBG - pScanMngr->statsLastDiscoveryBand = RADIO_BAND_2_4_GHZ; -#endif - break; - - case SCAN_SDP_NEIGHBOR_A: - /* add channels from neighbor AP discovery list */ - scanMngrAddNeighborAPsForDiscovery( hScanMngr, bandPolicy ); - - /* if neighbor AP list is exhausted, proceed to next discovery part */ - if ( 0 == pScanMngr->neighborAPsDiscoveryIndex[ band ] ) - { - pScanMngr->currentDiscoveryPart++; - scanMngrSetNextDiscoveryPart( hScanMngr ); - } - - /* if need to discover more APs, (not enough neighbor APs), proceed to A channel list */ - if ( pScanMngr->scanParams.numOfChannels < bandPolicy->numOfChannlesForDiscovery ) - { - scanMngrAddChannelListForDiscovery( hScanMngr, bandPolicy ); - } - -#ifdef TI_DBG - pScanMngr->statsLastDiscoveryBand = RADIO_BAND_5_0_GHZ; -#endif - break; - - case SCAN_SDP_CHANNEL_LIST_G: - /* add channels from policy channel list */ - scanMngrAddChannelListForDiscovery( hScanMngr, bandPolicy ); - - /* if channel list is exhausted, proceed to next discovery part */ - if ( 0 == pScanMngr->channelDiscoveryIndex[ band ] ) - { - pScanMngr->currentDiscoveryPart++; - scanMngrSetNextDiscoveryPart( hScanMngr ); - } - - /* if need to discover more APs (not enough channels on channel list), proceed to G neighbor APs */ - if ( pScanMngr->scanParams.numOfChannels < bandPolicy->numOfChannlesForDiscovery ) - { - scanMngrAddNeighborAPsForDiscovery( hScanMngr, bandPolicy ); - } - -#ifdef TI_DBG - pScanMngr->statsLastDiscoveryBand = RADIO_BAND_2_4_GHZ; -#endif - break; - - case SCAN_SDP_CHANNEL_LIST_A: - /* add channels from policy channel list */ - scanMngrAddChannelListForDiscovery( hScanMngr, bandPolicy ); - - /* if channel list is exhausted, proceed to next discovery part */ - if ( 0 == pScanMngr->channelDiscoveryIndex[ band ] ) - { - pScanMngr->currentDiscoveryPart++; - scanMngrSetNextDiscoveryPart( hScanMngr ); - } - - /* if need to discover more APs (not enough channels on channel list), proceed to A neighbor APs */ - if ( pScanMngr->scanParams.numOfChannels < bandPolicy->numOfChannlesForDiscovery ) - { - scanMngrAddNeighborAPsForDiscovery( hScanMngr, bandPolicy ); - } -#ifdef TI_DBG - pScanMngr->statsLastDiscoveryBand = RADIO_BAND_5_0_GHZ; -#endif - break; - - case SCAN_SDP_NO_DISCOVERY: - default: - TRACE1( pScanMngr->hReport, REPORT_SEVERITY_ERROR, "scanMngrBuildDiscoveryScanCommand called and current discovery part is %d", pScanMngr->currentDiscoveryPart); - break; - } -} - -/** - * \\n - * \date 02-Mar-2005\n - * \brief Builds the scan command header on the object workspace.\n - * - * Function Scope \e Private.\n - * \param hScanMngr - handle to the scan manager object.\n - * \param scanMethod - The scan method (and parameters) to use.\n - * \param band - the band to scan.\n - */ -void scanMngrBuildScanCommandHeader( TI_HANDLE hScanMngr, TScanMethod* scanMethod, ERadioBand band ) -{ - scanMngr_t* pScanMngr = (scanMngr_t*)hScanMngr; - - - /* set general scan parameters */ - /* SSID is not set - scan concentrator will set it for the scan manager to current SSID */ - pScanMngr->scanParams.scanType = scanMethod->scanType; - pScanMngr->scanParams.band = band; - - switch (scanMethod->scanType) - { - case SCAN_TYPE_NORMAL_ACTIVE: - /* In active scan, the desired SSID is set by the scan concentrator to the current SSID. - Stting anything not zero triggers this in the scan concentrator */ - pScanMngr->scanParams.desiredSsid.len = 1; - pScanMngr->scanParams.probeReqNumber = scanMethod->method.basicMethodParams.probReqParams.numOfProbeReqs; - pScanMngr->scanParams.probeRequestRate = scanMethod->method.basicMethodParams.probReqParams.bitrate; - break; - - case SCAN_TYPE_TRIGGERED_ACTIVE: - /* In active scan, the desired SSID is set by the scan concentrator to the current SSID. - Stting anything not zero triggers this in the scan concentrator */ - pScanMngr->scanParams.desiredSsid.len = 1; - pScanMngr->scanParams.probeReqNumber = scanMethod->method.TidTriggerdMethodParams.basicMethodParams.probReqParams.numOfProbeReqs; - pScanMngr->scanParams.probeRequestRate = scanMethod->method.TidTriggerdMethodParams.basicMethodParams.probReqParams.bitrate; - pScanMngr->scanParams.Tid = scanMethod->method.TidTriggerdMethodParams.triggeringTid; - break; - - case SCAN_TYPE_TRIGGERED_PASSIVE: - pScanMngr->scanParams.Tid = scanMethod->method.TidTriggerdMethodParams.triggeringTid; - /* In Passive scan, Desired SSID length is set to 0 so that the Scan concentrator won't replace - it with the current SSID (to be able to receive beacons from AP's with multiple or hidden - SSID) */ - pScanMngr->scanParams.desiredSsid.len = 0; - break; - - case SCAN_TYPE_NORMAL_PASSIVE: - /* In Passive scan, Desired SSID length is set to 0 so that the Scan concentrator won't replace - it with the current SSID (to be able to receive beacons from AP's with multiple or hidden - SSID) */ - pScanMngr->scanParams.desiredSsid.len = 0; - break; - - case SCAN_TYPE_SPS: - /* SPS doesn't have SSID filter, it only uses BSSID filter */ - break; - - default: - TRACE1( pScanMngr->hReport, REPORT_SEVERITY_WARNING, "Unrecognized scan type %d when building scan command", scanMethod->scanType); - break; - } - - /* set 0 channels - actual channel will be added by caller */ - pScanMngr->scanParams.numOfChannels = 0; -} - -/** - * \\n - * \date 06-Mar-2005\n - * \brief Add neighbor APs to scan command on the object workspace for discovery scan.\n - * - * Function Scope \e Private.\n - * \param hScanMngr - handle to the scan manager object.\n - * \param bandPolicy - the scan policy for the band to use.\n - */ -void scanMngrAddNeighborAPsForDiscovery( TI_HANDLE hScanMngr, TScanBandPolicy* bandPolicy ) -{ - scanMngr_t* pScanMngr = (scanMngr_t*)hScanMngr; - int neighborAPIndex; - paramInfo_t param; - - /* It looks like it never happens. Anyway decided to check */ - if ( bandPolicy->band >= RADIO_BAND_NUM_OF_BANDS ) - { - TRACE2( pScanMngr->hReport, REPORT_SEVERITY_ERROR, - "scanMngrAddNeighborAPsForDiscovery. bandPolicy->band=%d exceeds the limit %d\n", - bandPolicy->band, RADIO_BAND_NUM_OF_BANDS-1); - handleRunProblem(PROBLEM_BUF_SIZE_VIOLATION); - return; - } - neighborAPIndex = pScanMngr->neighborAPsDiscoveryIndex[ bandPolicy->band ]; - /* loop while neighbor AP list has not been exhausted, command is not full and not enough APs for discovery had been found */ - while ( (pScanMngr->scanParams.numOfChannels < bandPolicy->numOfChannlesForDiscovery) && - (pScanMngr->scanParams.numOfChannels < SCAN_MAX_NUM_OF_NORMAL_CHANNELS_PER_COMMAND) && - (neighborAPIndex < pScanMngr->neighborAPsDiscoveryList[ bandPolicy->band ].numOfEntries)) - { - /* if the AP is not being tracked */ - if ( SCAN_NDS_NOT_DISCOVERED == - pScanMngr->neighborAPsDiscoveryList[ bandPolicy->band ].trackStatusList[ neighborAPIndex ] ) - { - /* verify channel with reg domain */ - param.paramType = REGULATORY_DOMAIN_GET_SCAN_CAPABILITIES; - param.content.channelCapabilityReq.band = bandPolicy->band; - if ( (bandPolicy->discoveryMethod.scanType == SCAN_TYPE_NORMAL_PASSIVE) || - (bandPolicy->discoveryMethod.scanType == SCAN_TYPE_TRIGGERED_PASSIVE) || - (bandPolicy->discoveryMethod.scanType == SCAN_TYPE_SPS)) - { - param.content.channelCapabilityReq.scanOption = PASSIVE_SCANNING; - } - else - { - param.content.channelCapabilityReq.scanOption = ACTIVE_SCANNING; - } - param.content.channelCapabilityReq.channelNum = - pScanMngr->neighborAPsDiscoveryList[ bandPolicy->band ].APListPtr[ neighborAPIndex ].channel; - regulatoryDomain_getParam( pScanMngr->hRegulatoryDomain, ¶m ); - - /* if the channel is allowed, insert it to the scan command */ - if (param.content.channelCapabilityRet.channelValidity) - { - scanMngrAddNormalChannel( hScanMngr, &(bandPolicy->discoveryMethod), - pScanMngr->neighborAPsDiscoveryList[ bandPolicy->band ].APListPtr[ neighborAPIndex ].channel, - &(pScanMngr->neighborAPsDiscoveryList[ bandPolicy->band ].APListPtr[ neighborAPIndex ].BSSID), - param.content.channelCapabilityRet.maxTxPowerDbm ); - } - } - neighborAPIndex++; - } - - /* if neighbor AP list has been exhuasted */ - if ( neighborAPIndex == pScanMngr->neighborAPsDiscoveryList[ bandPolicy->band ].numOfEntries ) - { - /* reset discovery index */ - pScanMngr->neighborAPsDiscoveryIndex[ bandPolicy->band ] = 0; - } - else - { - /* just update neighbor APs discovery index */ - pScanMngr->neighborAPsDiscoveryIndex[ bandPolicy->band ] = neighborAPIndex; - } -} - -/** - * \\n - * \date 06-Mar-2005\n - * \brief Add channel from policy channels list to scan command on the object workspace for discovery scan.\n - * - * Function Scope \e Private.\n - * \param hScanMngr - handle to the scan manager object.\n - * \param bandPolicy - the scan policy for the band to use.\n - */ -void scanMngrAddChannelListForDiscovery( TI_HANDLE hScanMngr, TScanBandPolicy* bandPolicy ) -{ - scanMngr_t* pScanMngr = (scanMngr_t*)hScanMngr; - paramInfo_t param; - TMacAddr broadcastAddress; - int i, channelListIndex; - - /* It looks like it never happens. Anyway decided to check */ - if ( bandPolicy->band >= RADIO_BAND_NUM_OF_BANDS ) - { - TRACE2( pScanMngr->hReport, REPORT_SEVERITY_ERROR, - "scanMngrAddChannelListForDiscovery. bandPolicy->band=%d exceeds the limit %d\n", - bandPolicy->band, RADIO_BAND_NUM_OF_BANDS-1); - handleRunProblem(PROBLEM_BUF_SIZE_VIOLATION); - return; - } - if ( bandPolicy->numOfChannles > MAX_BAND_POLICY_CHANNLES ) - { - TRACE2( pScanMngr->hReport, REPORT_SEVERITY_ERROR, - "scanMngrAddChannelListForDiscovery. bandPolicy->numOfChannles=%d exceeds the limit %d\n", - bandPolicy->numOfChannles, MAX_BAND_POLICY_CHANNLES); - handleRunProblem(PROBLEM_BUF_SIZE_VIOLATION); - return; - } - channelListIndex = pScanMngr->channelDiscoveryIndex[ bandPolicy->band ]; - - /* set broadcast MAC address */ - for ( i = 0; i < MAC_ADDR_LEN; i++ ) - { - broadcastAddress[ i ] = 0xff; - } - - /* loop while channel list has not been exhausted, command is not full, and not enough APs for discovery had been found */ - while ( (pScanMngr->scanParams.numOfChannels < bandPolicy->numOfChannlesForDiscovery) && - (pScanMngr->scanParams.numOfChannels < SCAN_MAX_NUM_OF_NORMAL_CHANNELS_PER_COMMAND) && - (channelListIndex < bandPolicy->numOfChannles)) - { - /* verify channel with reg domain */ - param.paramType = REGULATORY_DOMAIN_GET_SCAN_CAPABILITIES; - param.content.channelCapabilityReq.band = bandPolicy->band; - if ( (bandPolicy->discoveryMethod.scanType == SCAN_TYPE_NORMAL_PASSIVE) || - (bandPolicy->discoveryMethod.scanType == SCAN_TYPE_TRIGGERED_PASSIVE) || - (bandPolicy->discoveryMethod.scanType == SCAN_TYPE_SPS)) - { - param.content.channelCapabilityReq.scanOption = PASSIVE_SCANNING; - } - else - { - param.content.channelCapabilityReq.scanOption = ACTIVE_SCANNING; - } - param.content.channelCapabilityReq.channelNum = - bandPolicy->channelList[ channelListIndex ]; - regulatoryDomain_getParam( pScanMngr->hRegulatoryDomain, ¶m ); - - /* if the channel is allowed, insert it to the scan command */ - if (param.content.channelCapabilityRet.channelValidity) - { - scanMngrAddNormalChannel( hScanMngr, &(bandPolicy->discoveryMethod), - bandPolicy->channelList[ channelListIndex ], - &broadcastAddress, - param.content.channelCapabilityRet.maxTxPowerDbm ); - } - channelListIndex++; - } - - /* if channel discovery list has been exhuasted */ - if ( channelListIndex == bandPolicy->numOfChannles ) - { - /* reset discovery index */ - pScanMngr->channelDiscoveryIndex[ bandPolicy->band ] = 0; - } - else - { - /* just update channel list discovery index */ - pScanMngr->channelDiscoveryIndex[ bandPolicy->band ] = channelListIndex; - } -} - -/** - * \\n - * \date 02-Mar-2005\n - * \brief Add SPS channels to scan command on the object workspace.\n - * - * Function Scope \e Private.\n - * \param hScanMngr - handle to the scan manager object.\n - * \param scanMethod - The scan method (and parameters) to use.\n - * \param band - the band to scan.\n - */ -void scanMngrAddSPSChannels( TI_HANDLE hScanMngr, TScanMethod* scanMethod, ERadioBand band ) -{ - scanMngr_t* pScanMngr = (scanMngr_t*)hScanMngr; - TI_UINT64 EarliestTSFToInsert; - TI_UINT32 timeToStartInAdvance = scanMethod->method.spsMethodParams.scanDuration / - SCAN_SPS_DURATION_PART_IN_ADVANCE; - scan_SPSHelper_t nextEventArray[ MAX_SIZE_OF_BSS_TRACK_LIST ]; - int BSSListIndex, i, j, nextEventArrayHead, nextEventArraySize; - paramInfo_t param; -#ifdef SCAN_MNGR_SPS_DBG - TI_UINT32 highValue, lowValue, maxNextEventArraySize; -#endif - - TRACE1(pScanMngr->hReport , REPORT_SEVERITY_INFORMATION, "\nscanMngrAddSPSChannels invoked for band %d\n",band); - /* initialize latest TSF value */ - pScanMngr->scanParams.latestTSFValue = 0; - - /* initialize the next event arry */ - nextEventArrayHead = -1; - nextEventArraySize = 0; - -#ifdef SCAN_MNGR_SPS_DBG - highValue = INT64_HIGHER( pScanMngr->currentTSF ); - lowValue = INT64_LOWER( pScanMngr->currentTSF ); - TRACE2( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "current TSF: %u-%u\n", highValue, lowValue); -#endif - /* It looks like it never happens. Anyway decided to check */ - if ( pScanMngr->BSSList.numOfEntries > MAX_SIZE_OF_BSS_TRACK_LIST ) - { - TRACE2( pScanMngr->hReport, REPORT_SEVERITY_ERROR, - "scanMngrAddSPSChannels. pScanMngr->BSSList.numOfEntries=%d exceeds the limit %d\n", - pScanMngr->BSSList.numOfEntries, MAX_SIZE_OF_BSS_TRACK_LIST); - handleRunProblem(PROBLEM_BUF_SIZE_VIOLATION); - return; - } - /* insert channels from tracking list to next event array according to requested band */ - for ( BSSListIndex = 0; BSSListIndex < pScanMngr->BSSList.numOfEntries; BSSListIndex++ ) - { - /* if BSS is on the right band */ - if ( band == pScanMngr->BSSList.BSSList[ BSSListIndex ].band ) - { - /* verify the channel with the reg domain */ - param.paramType = REGULATORY_DOMAIN_GET_SCAN_CAPABILITIES; - param.content.channelCapabilityReq.band = band; - param.content.channelCapabilityReq.scanOption = PASSIVE_SCANNING; - param.content.channelCapabilityReq.channelNum = pScanMngr->BSSList.BSSList[ BSSListIndex ].channel; - regulatoryDomain_getParam( pScanMngr->hRegulatoryDomain, ¶m ); - - /* if channel is verified for requested scan type */ - if ( param.content.channelCapabilityRet.channelValidity ) - { - /* if this AP local TSF value is greater that latest TSF value, change it */ - if ( pScanMngr->BSSList.scanBSSList[ BSSListIndex ].localTSF > pScanMngr->scanParams.latestTSFValue ) - { - /* the latest TSF value is used by the FW to detect TSF error (an AP recovery). When a TSF - error occurs, the latest TSF value should be in the future (because the AP TSF was - reset). */ - pScanMngr->scanParams.latestTSFValue = pScanMngr->BSSList.scanBSSList[ BSSListIndex ].localTSF; - } - - /* calculate the TSF of the next event for tracked AP. Scan should start - SCAN_SPS_DURATION_PART_IN_ADVANCE before the calculated event */ - nextEventArray[ nextEventArraySize ].nextEventTSF = - scanMngrCalculateNextEventTSF( hScanMngr, &(pScanMngr->BSSList), BSSListIndex, - pScanMngr->currentTSF + SCAN_SPS_GUARD_FROM_CURRENT_TSF + - timeToStartInAdvance ) - timeToStartInAdvance; -#ifdef SCAN_MNGR_SPS_DBG - highValue = INT64_HIGHER( nextEventArray[ nextEventArraySize ].nextEventTSF ); - lowValue = INT64_LOWER( nextEventArray[ nextEventArraySize ].nextEventTSF ); - TRACE8( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "BSSID:%02x:%02x:%02x:%02x:%02x:%02x will send frame at TSF:%x-%x\n", pScanMngr->BSSList.BSSList[ BSSListIndex ].BSSID[ 0 ], pScanMngr->BSSList.BSSList[ BSSListIndex ].BSSID[ 1 ], pScanMngr->BSSList.BSSList[ BSSListIndex ].BSSID[ 2 ], pScanMngr->BSSList.BSSList[ BSSListIndex ].BSSID[ 3 ], pScanMngr->BSSList.BSSList[ BSSListIndex ].BSSID[ 4 ], pScanMngr->BSSList.BSSList[ BSSListIndex ].BSSID[ 5 ], highValue, lowValue); -#endif - nextEventArray[ nextEventArraySize ].trackListIndex = BSSListIndex; - - /* insert it, sorted, to the next event array */ - /* if need to insert as head (either because list is empty or because it has earliest TSF) */ - if ( (-1 == nextEventArrayHead) || - (nextEventArray[ nextEventArraySize ].nextEventTSF < nextEventArray[ nextEventArrayHead ].nextEventTSF)) - { - /* link the newly inserted AP to the current head */ - nextEventArray[ nextEventArraySize ].nextAPIndex = nextEventArrayHead; - /* make current head point to newly inserted AP */ - nextEventArrayHead = nextEventArraySize; - nextEventArraySize++; - } - /* insert into the list */ - else - { - /* start with list head */ - i = nextEventArrayHead; - /* while the new AP TSF is larger and list end had not been reached */ - while ( (nextEventArray[ i ].nextAPIndex != -1) && /* list end had not been reached */ - (nextEventArray[ nextEventArray[ i ].nextAPIndex ].nextEventTSF < nextEventArray[ nextEventArraySize ].nextEventTSF)) /* next event TSF of the next AP in the list is smaller than that of the AP being inserted */ - { - /* proceed to the next AP */ - i = nextEventArray[ i ].nextAPIndex; - } - /* insert this AP to the list, right after the next event entry found */ - nextEventArray[ nextEventArraySize ].nextAPIndex = nextEventArray[ i ].nextAPIndex; - nextEventArray[ i ].nextAPIndex = nextEventArraySize; - nextEventArraySize++; - } - } - /* if for some reason a channel on which an AP was found is not valid for passive scan, - the AP should be removed. */ - else - { - /* removing the AP is done by increasing its track count to maximum - and since it is - not tracked it will not be discovered, and thus will be deleted when the scan is complete */ - pScanMngr->BSSList.scanBSSList[ BSSListIndex ].trackFailCount = - pScanMngr->scanPolicy.maxTrackFailures + 1; -#ifdef TI_DBG - /*update statistics */ - pScanMngr->stats.APsRemovedInvalidChannel++; -#endif - } - } - } - -#ifdef SCAN_MNGR_SPS_DBG - TRACE0( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "SPS list after first stage:\n"); - scanMngrDebugPrintSPSHelperList( hScanMngr, nextEventArray, nextEventArrayHead, nextEventArraySize ); - maxNextEventArraySize = nextEventArraySize; -#endif - - /* insert channels from next event array to scan command */ - EarliestTSFToInsert = pScanMngr->currentTSF + SCAN_SPS_GUARD_FROM_CURRENT_TSF; - /* insert all APs to scan command (as long as command is not full) */ - while ( (nextEventArraySize > 0) && - (pScanMngr->scanParams.numOfChannels < SCAN_MAX_NUM_OF_SPS_CHANNELS_PER_COMMAND)) - { - /* if first list entry fits, and it doesn't collide with current AP DTIM */ - if ( EarliestTSFToInsert < nextEventArray[ nextEventArrayHead ].nextEventTSF ) - { - if ( TI_FALSE == scanMngrDTIMInRange( hScanMngr, nextEventArray[ nextEventArrayHead ].nextEventTSF, - nextEventArray[ nextEventArrayHead ].nextEventTSF + scanMethod->method.spsMethodParams.scanDuration )) - { - /* insert it to scan command */ - pScanMngr->scanParams.channelEntry[ pScanMngr->scanParams.numOfChannels ].SPSChannelEntry.scanStartTime = - INT64_LOWER( (nextEventArray[ nextEventArrayHead ].nextEventTSF)); - pScanMngr->scanParams.channelEntry[ pScanMngr->scanParams.numOfChannels ].SPSChannelEntry.scanDuration = - scanMethod->method.spsMethodParams.scanDuration; - pScanMngr->scanParams.channelEntry[ pScanMngr->scanParams.numOfChannels ].SPSChannelEntry.ETMaxNumOfAPframes = - scanMethod->method.spsMethodParams.ETMaxNumberOfApFrames; - pScanMngr->scanParams.channelEntry[ pScanMngr->scanParams.numOfChannels ].SPSChannelEntry.earlyTerminationEvent = - scanMethod->method.spsMethodParams.earlyTerminationEvent; - pScanMngr->scanParams.channelEntry[ pScanMngr->scanParams.numOfChannels ].SPSChannelEntry.channel = - pScanMngr->BSSList.BSSList[ nextEventArray[ nextEventArrayHead ].trackListIndex ].channel; - MAC_COPY (pScanMngr->scanParams.channelEntry[ pScanMngr->scanParams.numOfChannels ].SPSChannelEntry.bssId, - pScanMngr->BSSList.BSSList[ nextEventArray[ nextEventArrayHead ].trackListIndex ].BSSID); - /* increase the AP track attempts counter */ - pScanMngr->BSSList.scanBSSList[ nextEventArray[ nextEventArrayHead ].trackListIndex ].trackFailCount++; - /* increase number of channels in scan command */ - pScanMngr->scanParams.numOfChannels++; - /* set earliest TSF that would fit in scan command */ - EarliestTSFToInsert = nextEventArray[ nextEventArrayHead ].nextEventTSF + - scanMethod->method.spsMethodParams.scanDuration + - SCAN_SPS_GUARD_FROM_LAST_BSS; - /* remove it from next event array */ - nextEventArrayHead = nextEventArray[ nextEventArrayHead ].nextAPIndex; - nextEventArraySize--; - } - else - { - TI_UINT32 beaconIntervalUsec = - pScanMngr->BSSList.BSSList[ nextEventArray[ nextEventArrayHead ].trackListIndex ].beaconInterval * 1024; - - /* if the next beacon also collide with DTIM */ - if ( TI_TRUE == scanMngrDTIMInRange( hScanMngr, nextEventArray[ nextEventArrayHead ].nextEventTSF + beaconIntervalUsec, - nextEventArray[ nextEventArrayHead ].nextEventTSF + scanMethod->method.spsMethodParams.scanDuration + beaconIntervalUsec )) - { - /* An AP whose two consecutive beacons collide with current AP DTIM is not trackable by SPS!!! - Shouldn't happen at a normal setup, but checked to avoid endless loop. - First, remove it from the tracking list (by increasing it's track count above the maximum) */ - pScanMngr->BSSList.scanBSSList[ nextEventArray[ nextEventArrayHead ].trackListIndex ].trackFailCount = - pScanMngr->scanPolicy.maxTrackFailures + 1; - - /* and also remove it from the SPS list */ - nextEventArrayHead = nextEventArray[ nextEventArrayHead ].nextAPIndex; - nextEventArraySize--; - -#ifdef TI_DBG - /* update statistics */ - pScanMngr->stats.APsRemovedDTIMOverlap++; -#endif - } - else - { - /* calculate next event TSF - will get the next beacon, since timeToStartInAdvance is added to current beacon TSF */ - nextEventArray[ nextEventArrayHead ].nextEventTSF = - scanMngrCalculateNextEventTSF( hScanMngr, &(pScanMngr->BSSList), - nextEventArray[ nextEventArrayHead ].trackListIndex, - nextEventArray[ nextEventArrayHead ].nextEventTSF + timeToStartInAdvance + 1) - - timeToStartInAdvance; - -#ifdef SCAN_MNGR_SPS_DBG - highValue = INT64_HIGHER( nextEventArray[ nextEventArrayHead ].nextEventTSF ); - lowValue = INT64_LOWER( nextEventArray[ nextEventArrayHead ].nextEventTSF ); - TRACE8( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "reacalculating next frame for BSSID:%02x:%02x:%02x:%02x:%02x:%02x at TSF:%x-%x, bacause of DTIM collision\n", pScanMngr->BSSList.BSSList[ nextEventArray[ nextEventArrayHead ].trackListIndex ].BSSID[ 0 ], pScanMngr->BSSList.BSSList[ nextEventArray[ nextEventArrayHead ].trackListIndex ].BSSID[ 1 ], pScanMngr->BSSList.BSSList[ nextEventArray[ nextEventArrayHead ].trackListIndex ].BSSID[ 2 ], pScanMngr->BSSList.BSSList[ nextEventArray[ nextEventArrayHead ].trackListIndex ].BSSID[ 3 ], pScanMngr->BSSList.BSSList[ nextEventArray[ nextEventArrayHead ].trackListIndex ].BSSID[ 4 ], pScanMngr->BSSList.BSSList[ nextEventArray[ nextEventArrayHead ].trackListIndex ].BSSID[ 5 ], highValue, lowValue); -#endif - - /* reinsert to the next event array, sorted */ - /* if still needs to be head, do nothing (because it's still head). otherwise: */ - if ( (1 < nextEventArraySize) && /* list has more than one entry */ - (nextEventArray[ nextEventArrayHead ].nextEventTSF > nextEventArray[ nextEventArray[ nextEventArrayHead ].nextAPIndex ].nextEventTSF)) /* first event in list is earlier */ - { - /* first remove the head from the list */ - j = nextEventArrayHead; - nextEventArrayHead = nextEventArray[ nextEventArrayHead ].nextAPIndex; - - /* start with list head */ - i = nextEventArrayHead; - /* while the new AP TSF is larger and list end had not been reached */ - while ( (nextEventArray[ i ].nextAPIndex != -1) && /* list end had not been reached */ - (nextEventArray[ nextEventArray[ i ].nextAPIndex ].nextEventTSF < nextEventArray[ j ].nextEventTSF)) /* next event TSF of the next AP in the list is smaller than that of the AP being inserted */ - { - /* proceed to the next AP */ - i = nextEventArray[ i ].nextAPIndex; - } - /* insert this AP to the list, right after the next event entry found */ - nextEventArray[ j ].nextAPIndex = nextEventArray[ i ].nextAPIndex; - nextEventArray[ i ].nextAPIndex = j; - } - -#ifdef SCAN_MNGR_SPS_DBG - scanMngrDebugPrintSPSHelperList( hScanMngr, nextEventArray, nextEventArrayHead, maxNextEventArraySize ); -#endif -#ifdef TI_DBG - /* update statistics */ - pScanMngr->stats.SPSSavedByDTIMCheck++; -#endif - } - } - } - else - { - /* calculate next event TSF */ - nextEventArray[ nextEventArrayHead ].nextEventTSF = - scanMngrCalculateNextEventTSF( hScanMngr, &(pScanMngr->BSSList), - nextEventArray[ nextEventArrayHead ].trackListIndex, - EarliestTSFToInsert + timeToStartInAdvance ) - timeToStartInAdvance; - -#ifdef SCAN_MNGR_SPS_DBG - highValue = INT64_HIGHER( nextEventArray[ nextEventArrayHead ].nextEventTSF ); - lowValue = INT64_LOWER( nextEventArray[ nextEventArrayHead ].nextEventTSF ); - TRACE8( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "reacalculating next frame for BSSID:%02x:%02x:%02x:%02x:%02x:%02x at TSF:%x-%x\n", pScanMngr->BSSList.BSSList[ nextEventArray[ nextEventArrayHead ].trackListIndex ].BSSID[ 0 ], pScanMngr->BSSList.BSSList[ nextEventArray[ nextEventArrayHead ].trackListIndex ].BSSID[ 1 ], pScanMngr->BSSList.BSSList[ nextEventArray[ nextEventArrayHead ].trackListIndex ].BSSID[ 2 ], pScanMngr->BSSList.BSSList[ nextEventArray[ nextEventArrayHead ].trackListIndex ].BSSID[ 3 ], pScanMngr->BSSList.BSSList[ nextEventArray[ nextEventArrayHead ].trackListIndex ].BSSID[ 4 ], pScanMngr->BSSList.BSSList[ nextEventArray[ nextEventArrayHead ].trackListIndex ].BSSID[ 5 ], highValue, lowValue); -#endif - - /* reinsert to the next event array, sorted */ - /* if still needs to be head, do nothing (because it's still head). otherwise: */ - if ( (1 < nextEventArraySize) && /* list has more than one entry */ - (nextEventArray[ nextEventArrayHead ].nextEventTSF > nextEventArray[ nextEventArray[ nextEventArrayHead ].nextAPIndex ].nextEventTSF)) /* first event in list is earlier */ - { - /* first remove the head from the list */ - j = nextEventArrayHead; - nextEventArrayHead = nextEventArray[ nextEventArrayHead ].nextAPIndex; - - /* start with list head */ - i = nextEventArrayHead; - /* while the new AP TSF is larger and list end had not been reached */ - while ( (nextEventArray[ i ].nextAPIndex != -1) && /* list end had not been reached */ - (nextEventArray[ nextEventArray[ i ].nextAPIndex ].nextEventTSF < nextEventArray[ j ].nextEventTSF)) /* next event TSF of the next AP in the list is smaller than that of the AP being inserted */ - { - /* proceed to the next AP */ - i = nextEventArray[ i ].nextAPIndex; - } - /* insert this AP to the list, right after the next event entry found */ - nextEventArray[ j ].nextAPIndex = nextEventArray[ i ].nextAPIndex; - nextEventArray[ i ].nextAPIndex = j; - } - -#ifdef SCAN_MNGR_SPS_DBG - scanMngrDebugPrintSPSHelperList( hScanMngr, nextEventArray, nextEventArrayHead, maxNextEventArraySize ); -#endif - } - } - /* For SPS scan, the scan duration is added to the command, since later on current TSF cannot be - reevaluated. The scan duration is TSF at end of scan minus current TSF, divided by 1000 (convert - to milliseconds) plus 1 (for the division reminder). */ - pScanMngr->scanParams.SPSScanDuration = - (((TI_UINT32)(EarliestTSFToInsert - SCAN_SPS_GUARD_FROM_LAST_BSS - pScanMngr->currentTSF)) / 1000) + 1; -} - -/** - * \\n - * \date 07-Mar-2005\n - * \brief Calculates local TSF of the next event (beacon or GPR) of the given tracked AP.\n - * - * Function Scope \e Private.\n - * \param hScanMngr - handle to the scan manager object.\n - * \param BSSList - a pointer to the track list.\n - * \param entryIndex - the index of the AP for which calculation is requires in the tracking list.\n - * \param initialTSFValue - local TSF value AFTER which the next event is to found.\n - * \return The approximate current TSF - */ -TI_UINT64 scanMngrCalculateNextEventTSF( TI_HANDLE hScanMngr, scan_BSSList_t* BSSList, TI_UINT8 entryIndex, TI_UINT64 initialTSFValue ) -{ - TI_UINT64 remoteBeaconTSF, localBeaconTSF; - TI_INT64 localRemoteTSFDelta; - TI_UINT32 reminder; - TI_INT32 averageDeltaChange = 0; - int i; -#ifdef SCAN_MNGR_SPS_DBG - scanMngr_t* pScanMngr = (scanMngr_t*)hScanMngr; -#endif /* SCAN_MNGR_SPS_DBG */ - -/* graphical representation: - E E E E E E E E E -Remote TSF Line: | | | | | | | | | -0 remoteTSF | | | | | | | | | Returned value -+-----------------------+------+------+------+------+------+------+------+------+------+------+----------------... - -Local TSF Line: - 0 localTSF initialTSFValue - +-------------------+---------------------------------------------------------------+-----+---------------... - - note that: - 1. both lines Don't start at the same time! - 2. remoteTSF and localTSF were measured when last frame was received from the tracked AP. the difference between their - values is the constant difference between the two lines. - 3. initialTSFValue is the local TSF the first event after which is requested. - 4. returned value is the TSF (in local scale!) of the next event of the tracked AP. - 5. an E represents an occurring event, which is a scheduled frame transmission (beacon or GPR) of the tracked AP. -*/ - - /* - * The next event TSF is calculated as follows: - * first, the difference between the local TSF (that of the AP the STA is currently connected to) and the - * remote TSF (that of the AP being tracked) is calculated using the TSF values measured when last scan was - * performed. Than, the initial TSF value is converted to remote TSF value, using the delta just calculated. - * The next remote TSF is found (in remote TSF value) by subtracting the reminder of dividing the current - * remote TSF value by the remote beacon interval (time passed from last beacon) from the current remote TSF - * (hence amounting to the last beacon remote TSF), and than adding beacon interval. This is finally converted - * back to local TSF, which is the requested value. - * - * After all this is done, clock drift between current AP and remote AP is compensated. This is done in thr - * following way: the delte between local TSF and remote TSF is compared to this value at the last scan - * (if they are equal, the clocks tick at the same rate). This difference is store in an array holding a - * configured number of such previous differences (currenlty 4). The average value of these previous values - * is then calculated, and added the the TSF value calculated before. This way, the average drift between - * the local AP and the candidate AP is measured, and the next drift value can be estimated and thus - * taken into account. - */ - -#ifdef SCAN_MNGR_SPS_DBG - TRACE2( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "initial TSF value:%x-%x\n", INT64_HIGHER( initialTSFValue ), INT64_LOWER( initialTSFValue )); - TRACE2( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "local time stamp:%x-%x\n", INT64_HIGHER( BSSList->scanBSSList[ entryIndex ].localTSF ), INT64_LOWER( BSSList->scanBSSList[ entryIndex ].localTSF )); -#endif - /* calculate the delta between local and remote TSF */ - localRemoteTSFDelta = BSSList->scanBSSList[ entryIndex ].localTSF - - BSSList->BSSList[ entryIndex ].lastRxTSF; - /* convert initial TSF to remote timeline */ - remoteBeaconTSF = initialTSFValue - localRemoteTSFDelta; -#ifdef SCAN_MNGR_SPS_DBG - TRACE4( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "Local TSF:%u-%u, Remote TSF: %u-%u\n", INT64_HIGHER(BSSList->scanBSSList[ entryIndex ].localTSF), INT64_LOWER(BSSList->scanBSSList[ entryIndex ].localTSF), INT64_HIGHER(BSSList->BSSList[ entryIndex ].lastRxTSF), INT64_LOWER(BSSList->BSSList[ entryIndex ].lastRxTSF))); - TRACE4( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "TSF delta:%u-%u, current remote TSF:%u-%u\n", INT64_HIGHER(localRemoteTSFDelta), INT64_LOWER(localRemoteTSFDelta), INT64_HIGHER(remoteBeaconTSF ), INT64_LOWER(remoteBeaconTSF )); -#endif - /* find last remote beacon transmission by subtracting the reminder of current remote TSF divided - by the beacon interval (indicating how much time passed since last beacon) from current remote - TSF */ - reminder = reminder64( remoteBeaconTSF, BSSList->BSSList[ entryIndex ].beaconInterval * 1024 ); - remoteBeaconTSF -= reminder; - -#ifdef SCAN_MNGR_SPS_DBG - TRACE1( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "reminder=%d\n",reminder); - TRACE2( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "Last remote beacon TSF:%x-%x\n", INT64_HIGHER(remoteBeaconTSF), INT64_LOWER(remoteBeaconTSF)); -#endif - /* advance from last beacon to next beacon */ - remoteBeaconTSF += BSSList->BSSList[ entryIndex ].beaconInterval * 1024; -#ifdef SCAN_MNGR_SPS_DBG - TRACE2( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "Next remote beacon TSF:%x-%x\n", INT64_HIGHER(remoteBeaconTSF), INT64_LOWER(remoteBeaconTSF)); -#endif - -#ifdef SCAN_SPS_USE_DRIFT_COMPENSATION - /* update delta change array with the change between current and last delta (if last delta is valid) */ - if ( 0 != BSSList->scanBSSList[ entryIndex ].prevTSFDelta ) - { - BSSList->scanBSSList[ entryIndex ].deltaChangeArray[ BSSList->scanBSSList[ entryIndex ].deltaChangeArrayIndex ] = - (TI_INT32)(localRemoteTSFDelta - BSSList->scanBSSList[ entryIndex ].prevTSFDelta); -#ifdef SCAN_MNGR_SPS_DBG - TRACE1( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "current delta^2:%d\n", localRemoteTSFDelta - BSSList->scanBSSList[ entryIndex ].prevTSFDelta); -#endif - if ( SCAN_SPS_NUM_OF_TSF_DELTA_ENTRIES == ++BSSList->scanBSSList[ entryIndex ].deltaChangeArrayIndex ) - { - BSSList->scanBSSList[ entryIndex ].deltaChangeArrayIndex = 0; - } - } - BSSList->scanBSSList[ entryIndex ].prevTSFDelta = localRemoteTSFDelta; - - /* calculate average delta change, and add (or subtract) it from beacon timing */ - for ( i = 0; i < SCAN_SPS_NUM_OF_TSF_DELTA_ENTRIES; i++ ) - { - averageDeltaChange += BSSList->scanBSSList[ entryIndex ].deltaChangeArray[ i ]; - } - averageDeltaChange /= SCAN_SPS_NUM_OF_TSF_DELTA_ENTRIES; -#ifdef SCAN_MNGR_SPS_DBG - TRACE1( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "average delta change: %d\n", averageDeltaChange); -#endif /* SCAN_MNGR_SPS_DBG */ - remoteBeaconTSF += averageDeltaChange; -#endif - - /* convert to local TSF */ - localBeaconTSF = remoteBeaconTSF + localRemoteTSFDelta; - -#ifdef SCAN_SPS_USE_DRIFT_COMPENSATION - /* if beacon (in local TSF) is before initial TSF value (possible due to drift compensation), - proceed to next beacon */ - if ( localBeaconTSF < initialTSFValue ) - { - localBeaconTSF += (BSSList->BSSList[ entryIndex ].beaconInterval * 1024); - } -#endif - - return localBeaconTSF; -} - -/** - * \\n - * \date 20-September-2005\n - * \brief Check whether a time range collides with current AP DTIM - * - * Function Scope \e Private.\n - * \param hScanMngr - handle to the scan manager object.\n - * \param rangeStart - the time range start TSF.\n - * \param rangeEnd - the time range end TSF.\n - * \return Whether the event collides with a DTIM (TRUF if it does, TI_FALSE if it doesn't).\n - */ -TI_BOOL scanMngrDTIMInRange( TI_HANDLE hScanMngr, TI_UINT64 rangeStart, TI_UINT64 rangeEnd ) -{ - scanMngr_t* pScanMngr = (scanMngr_t*)hScanMngr; - TI_UINT64 DTIMEventStart, DTIMEventEnd; - TI_UINT32 DTIMPeriodInUsec; /* DTIM period in micro seconds */ - -#ifdef SCAN_MNGR_DTIM_DBG - TRACE4( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "DTIM check: SPS raneg start:%x-%x, end:%x-%x\n", INT64_HIGHER(rangeStart), INT64_LOWER(rangeStart), INT64_HIGHER(rangeEnd), INT64_LOWER(rangeEnd)); -#endif - - /* calculate DTIM period */ - DTIMPeriodInUsec = pScanMngr->currentBSSBeaconInterval * 1024 * pScanMngr->currentBSSDtimPeriod; - -#ifdef SCAN_MNGR_DTIM_DBG - TRACE1( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "DTIM period in usec: %d\n", DTIMPeriodInUsec); -#endif - - /* calculate (from DTIM count) the first DTIM after the last seen beacon. The last seen beacon will always - occur before the SPS - because it already happened, and the SPS is a future event. However, the next DTIM - is not necessarily prior to the SPS - it is also a future event (if the last beacon was not a DTIM) */ - if ( 0 == pScanMngr->lastLocalBcnDTIMCount ) - { /* The last beacon was a DTIM */ - DTIMEventStart = pScanMngr->lastLocalBcnTSF; - } - else - { /* The last beacon was not a DTIM - calculate the next beacon that will be a DTIM */ - DTIMEventStart = pScanMngr->lastLocalBcnTSF + - ((pScanMngr->currentBSSDtimPeriod - pScanMngr->lastLocalBcnDTIMCount) * pScanMngr->currentBSSBeaconInterval); - TRACE6(pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "\n Next DTIM TSF:%u-%u , last beacon TSF:%u-%u, last DTIM count: %d, beacon interval: %d\n", INT64_HIGHER(DTIMEventStart), INT64_LOWER(DTIMEventStart), INT64_HIGHER(pScanMngr->lastLocalBcnTSF), INT64_LOWER(pScanMngr->lastLocalBcnTSF), pScanMngr->lastLocalBcnDTIMCount, pScanMngr->currentBSSBeaconInterval); - } -#ifdef SCAN_MNGR_DTIM_DBG - TRACE6( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "Next DTIM TSF:%u-%u, last beacon TSF:%u-%u, last DTIM count: %d, beacon interval: %d\n", INT64_HIGHER(DTIMEventStart), INT64_LOWER(DTIMEventStart), INT64_HIGHER(pScanMngr->lastLocalBcnTSF), INT64_LOWER(pScanMngr->lastLocalBcnTSF), pScanMngr->lastLocalBcnDTIMCount, pScanMngr->currentBSSBeaconInterval); -#endif - - /* calculate the DTIM event end (add the DTIM length). Note that broadcast frames after the DTIM are not - taken into consideration because their availability and length varies. Even if at some point SPS will be - missed due to broadcast RX frames, it does not mean this AP cannot be tracked. */ - DTIMEventEnd = DTIMEventStart + SCAN_SPS_FW_DTIM_LENGTH; - - /* if this DTIM is after the SPS end - than no collision will occur! */ - if ( DTIMEventStart > rangeEnd ) - { -#ifdef SCAN_MNGR_DTIM_DBG - TRACE0( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "no collision because DTIM is after SPS\n"); -#endif - return TI_FALSE; - } - /* if this DTIM end is not before the SPS range start - it means the DTIM is colliding with the SPS, because - it neither ends before the SPS nor starts after it */ - else if ( DTIMEventEnd >= rangeStart ) - { -#ifdef SCAN_MNGR_DTIM_DBG - TRACE0( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "Collision beacuse DTIM is not before SPS\n"); -#endif - return TI_TRUE; - } - /* the DTIM is before the SPS range - find the first DTIM after the SPS start (and check if it's colliding - with the SPS range */ - else - { - /* get the usec difference from the SPS range start to the last DTIM */ - TI_UINT64 usecDiffFromRangeStartToLastDTIM = rangeStart - DTIMEventStart; - /* get the reminder from the usec difference divided by the DTIM period - the time (in usec) from last DTIM - to SPS start */ - TI_UINT32 reminder = reminder64( usecDiffFromRangeStartToLastDTIM, DTIMPeriodInUsec ); - /* get the next DTIM start time by adding DTIM period to the last DTIM before the SPS range start */ - DTIMEventStart = rangeStart - reminder + DTIMPeriodInUsec; - /* get DTIM end time */ - DTIMEventEnd = DTIMEventStart + SCAN_SPS_FW_DTIM_LENGTH; -#ifdef SCAN_MNGR_DTIM_DBG - TRACE7( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "Diff from range start to last DTIM: %x-%x, reminder:%d, DTIM start:%x-%x, DTIM end: %x-%x\n", INT64_HIGHER(usecDiffFromRangeStartToLastDTIM), INT64_LOWER(usecDiffFromRangeStartToLastDTIM), reminder, INT64_HIGHER(DTIMEventStart), INT64_LOWER(DTIMEventStart), INT64_HIGHER(DTIMEventEnd), INT64_LOWER(DTIMEventEnd)); -#endif - - /* if the SPS starts after the DTIM ends or before the DTIM starts - no collision occurs */ - if ( (rangeStart > DTIMEventEnd) || (rangeEnd < DTIMEventStart)) - { -#ifdef SCAN_MNGR_DTIM_DBG - TRACE0( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "No collision will occur because DTIM is before or after SPS\n"); -#endif - return TI_FALSE; - } - /* otherwise - a collision will occur! */ - { -#ifdef SCAN_MNGR_DTIM_DBG - TRACE0( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "Collision will occur!\n"); -#endif - return TI_TRUE; - } - } -} - -/** - * \\n - * \date 03-Mar-2005\n - * \brief Add a normal channel entry to the object workspace scan command.\n - * - * Function Scope \e Private.\n - * \param hScanMngr - handle to the scan manager object.\n - * \param scanMethod - The scan method (and parameters) to use.\n - * \param channel - the channel index.\n - * \param BSSID - pointer to the BSSID to use (may be broadcast.\n - * \param txPowerDbm - tx power to transmit probe requests.\n - */ -void scanMngrAddNormalChannel( TI_HANDLE hScanMngr, TScanMethod* scanMethod, TI_UINT8 channel, - TMacAddr* BSSID, TI_UINT8 txPowerDbm ) -{ - scanMngr_t* pScanMngr = (scanMngr_t*)hScanMngr; - int commandChannelIndex; - TScanBasicMethodParams* basicMethodParams; - - /* get next channel in the object workspace */ - commandChannelIndex = pScanMngr->scanParams.numOfChannels; - pScanMngr->scanParams.numOfChannels++; - - /* get basic method params pointer according to scan type */ - switch ( scanMethod->scanType ) - { - case SCAN_TYPE_NORMAL_PASSIVE: - case SCAN_TYPE_NORMAL_ACTIVE: - basicMethodParams = &(scanMethod->method.basicMethodParams); - break; - - case SCAN_TYPE_TRIGGERED_PASSIVE: - case SCAN_TYPE_TRIGGERED_ACTIVE: - basicMethodParams = &(scanMethod->method.TidTriggerdMethodParams.basicMethodParams); - break; - - default: - TRACE1( pScanMngr->hReport, REPORT_SEVERITY_WARNING, "Unercognized scan type %d when adding normal channel to scan list.\n", scanMethod->scanType ); - basicMethodParams = NULL; - return; - } - - /* set params */ - pScanMngr->scanParams.channelEntry[ commandChannelIndex ].normalChannelEntry.channel = channel; - pScanMngr->scanParams.channelEntry[ commandChannelIndex ].normalChannelEntry.txPowerDbm = - TI_MIN( txPowerDbm, basicMethodParams->probReqParams.txPowerDbm ); - pScanMngr->scanParams.channelEntry[ commandChannelIndex ].normalChannelEntry.maxChannelDwellTime = - basicMethodParams->maxChannelDwellTime; - pScanMngr->scanParams.channelEntry[ commandChannelIndex ].normalChannelEntry.minChannelDwellTime = - basicMethodParams->minChannelDwellTime; - pScanMngr->scanParams.channelEntry[ commandChannelIndex ].normalChannelEntry.earlyTerminationEvent = - basicMethodParams->earlyTerminationEvent; - pScanMngr->scanParams.channelEntry[ commandChannelIndex ].normalChannelEntry.ETMaxNumOfAPframes = - basicMethodParams->ETMaxNumberOfApFrames; - - MAC_COPY (pScanMngr->scanParams.channelEntry[ commandChannelIndex ].normalChannelEntry.bssId, *BSSID); -} - -/** - * \\n - * \date 02-Mar-2005\n - * \brief Removes an entry from the BSS list (by replacing it with another entry, if any). - * - * Function Scope \e Private.\n - * \param hScanMngr - handle to the scan manager object.\n - * \param BSSEntryIndex - index of the entry to remove.\n - */ -void scanMngrRemoveBSSListEntry( TI_HANDLE hScanMngr, TI_UINT8 BSSEntryIndex ) -{ - scanMngr_t* pScanMngr = (scanMngr_t*)hScanMngr; - TI_UINT8* tempResultBuffer; - -#ifdef TI_DBG - /*update statistics */ - if ( SCAN_MNGR_STAT_MAX_TRACK_FAILURE <= pScanMngr->BSSList.scanBSSList[ BSSEntryIndex ].trackFailCount ) - { - pScanMngr->stats.ConsecutiveTrackFailCountHistogram[ SCAN_MNGR_STAT_MAX_TRACK_FAILURE - 1 ]++; - } - else - { - pScanMngr->stats.ConsecutiveTrackFailCountHistogram[ pScanMngr->BSSList.scanBSSList[ BSSEntryIndex ].trackFailCount ]++; - } -#endif - /* if no more entries are available, simply reduce the number of entries. - As this is the last entry, it won't be accessed any more. */ - if ( (pScanMngr->BSSList.numOfEntries-1) == BSSEntryIndex ) - { - - TRACE1( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "Removing last entry %d in BSS list\n", pScanMngr->BSSList.numOfEntries); - - pScanMngr->BSSList.numOfEntries--; - } - else - { -#ifdef SCAN_MNGR_DBG - TRACE2( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "Removing entry %d of %d\n", BSSEntryIndex, pScanMngr->BSSList.numOfEntries); -#endif - /* keep the scan result buffer pointer */ - tempResultBuffer = pScanMngr->BSSList.BSSList[ BSSEntryIndex ].pBuffer; - /* copy the last entry over this one */ - os_memoryCopy( pScanMngr->hOS, &(pScanMngr->BSSList.BSSList[ BSSEntryIndex ]), - &(pScanMngr->BSSList.BSSList[ pScanMngr->BSSList.numOfEntries-1 ]), - sizeof(bssEntry_t)); - os_memoryCopy( pScanMngr->hOS, &(pScanMngr->BSSList.scanBSSList[ BSSEntryIndex ]), - &(pScanMngr->BSSList.scanBSSList[ pScanMngr->BSSList.numOfEntries-1 ]), - sizeof(scan_BSSEntry_t)); - /* replace the scan result buffer of the last entry */ - pScanMngr->BSSList.BSSList[ pScanMngr->BSSList.numOfEntries-1 ].pBuffer = tempResultBuffer; - /* decrease the number of BSS entries */ - pScanMngr->BSSList.numOfEntries--; - } -} - -/** - * \\n - * \date 02-Mar-2005\n - * \brief Removes all BSS list entries that are neither neighbor APs not on a policy defined channel.\n - * - * Function Scope \e Private.\n - * \param hScanMngr - handle to the scan manager object.\n - * \param bCheckNeighborAPs - whether to verify that APs marked as neighbor APs are really neighbor APs.\n - * \param bCheckChannels - whether to verify that APs not marked as neighbor APs are on policy defined channel.\n - */ -void scanMngrUpdateBSSList( TI_HANDLE hScanMngr, TI_BOOL bCheckNeighborAPs, TI_BOOL bCheckChannels ) -{ - scanMngr_t* pScanMngr = (scanMngr_t*)hScanMngr; - int BSSEntryIndex; - - /* It looks like it never happens. Anyway decided to check */ - if (pScanMngr->BSSList.numOfEntries > MAX_SIZE_OF_BSS_TRACK_LIST) - { - TRACE2( pScanMngr->hReport, REPORT_SEVERITY_ERROR, - "scanMngrUpdateBSSList problem. BSSList.numOfEntries=%d exceeds the limit %d\n", - pScanMngr->BSSList.numOfEntries, MAX_SIZE_OF_BSS_TRACK_LIST); - handleRunProblem(PROBLEM_BUF_SIZE_VIOLATION); - return; - } - - /* loop on all BSS list entry */ - for ( BSSEntryIndex = 0; BSSEntryIndex < pScanMngr->BSSList.numOfEntries; ) - { - /* an AP can be in the BSS list either because it's a neighbor AP or, if not, because it's on a - policy defined channel. When Neighbor AP list is changed, it is only necessary to check APs that - are in the list because they are neighbor APs. When the policy is changed, it is only necessary - to check APs that are in the list because they are on a policy defined channel. */ - - /* if a check for neighbor APs is requested, check only APs that are designated as neighbor APs, - and only check if they still are neighbor APs */ - if ( (TI_TRUE == bCheckNeighborAPs) && - (TI_TRUE == pScanMngr->BSSList.BSSList[ BSSEntryIndex ].bNeighborAP) && - (-1 == scanMngrGetNeighborAPIndex( hScanMngr, - pScanMngr->BSSList.BSSList[ BSSEntryIndex ].band, - &(pScanMngr->BSSList.BSSList[ BSSEntryIndex ].BSSID)))) - { - /* remove it */ - scanMngrRemoveBSSListEntry( hScanMngr, BSSEntryIndex ); - /* repeat the loop with the same index to check the new BSS on this place */ - continue; - } - - /* if a check for policy defined channels is requested, check only APs that are not designated as - neighbor APs */ - if ( (TI_TRUE == bCheckChannels) && - (TI_FALSE == pScanMngr->BSSList.BSSList[ BSSEntryIndex ].bNeighborAP) && - (TI_FALSE == scanMngrIsPolicyChannel( hScanMngr, - pScanMngr->BSSList.BSSList[ BSSEntryIndex ].band, - pScanMngr->BSSList.BSSList[ BSSEntryIndex ].channel ))) - { - /* remove it */ - scanMngrRemoveBSSListEntry( hScanMngr, BSSEntryIndex ); - } - else - { - BSSEntryIndex++; - } - } -} - -/** - * \\n - * \date 02-Mar-2005\n - * \brief returns the index of a neighbor AP.\n - * - * Function Scope \e Private.\n - * \param hScanMngr - handle to the scan manager object.\n - * \param band - the band on which the AP resides.\n - * \param bssId - the AP's BSSID.\n - * \return the index into the neighbor AP list for the given address, -1 if AP is not in list.\n - */ -TI_INT8 scanMngrGetNeighborAPIndex( TI_HANDLE hScanMngr, ERadioBand band, TMacAddr* bssId ) -{ - scanMngr_t* pScanMngr = (scanMngr_t*)hScanMngr; - int i; - - /* loop on all neighbor APS for this AP's band, and compare BSSID's */ - for ( i = 0; i < pScanMngr->neighborAPsDiscoveryList[ band ].numOfEntries; i++ ) - { - if (MAC_EQUAL (*bssId, pScanMngr->neighborAPsDiscoveryList[ band ].APListPtr[ i ].BSSID)) - { - return i; - } - } - - /* if the AP wasn't found in the list, it's not a neighbor AP... */ - return -1; -} - -/** - * \\n - * \date 02-Mar-2005\n - * \brief Checks whether a channel is defined on a policy.\n - * - * Function Scope \e Private.\n - * \param hScanMngr - handle to the scan manager object.\n - * \param band - the band on which the channel is.\n - * \param channel - the channel number.\n - * \return TI_TRUE if channel is defined on policy, TI_FALSE otherwise.\n - */ -TI_BOOL scanMngrIsPolicyChannel( TI_HANDLE hScanMngr, ERadioBand band, TI_UINT8 channel ) -{ - int i; - TScanBandPolicy* bandPolicy = scanMngrGetPolicyByBand( hScanMngr, band ); - - - /* check if the AP's band is defined in the policy */ - if ( NULL == bandPolicy ) - { - return TI_FALSE; - } - - /* loop on all channels for the AP's band */ - for ( i = 0; i < bandPolicy->numOfChannles; i++ ) - { - if ( bandPolicy->channelList[ i ] == channel ) - { - return TI_TRUE; - } - } - - /* if no channel was found, the AP is NOT on a policy configured channel */ - return TI_FALSE; -} - -/** - * \\n - * \date 18-Apr-2005\n - * \brief Converts scan concentrator result status to scan manager result status, to be returned to roaming manager.\n - * - * Function Scope \e Private.\n - * \param result status - scan concentrator result status.\n - * \return appropriate scan manager status.\n - */ -scan_mngrResultStatus_e scanMngrConvertResultStatus( EScanCncnResultStatus resultStatus ) -{ - switch (resultStatus) - { - case SCAN_CRS_SCAN_COMPLETE_OK: - return SCAN_MRS_SCAN_COMPLETE_OK; -/* break; - unreachable */ - - case SCAN_CRS_SCAN_RUNNING: - return SCAN_MRS_SCAN_RUNNING; -/* break; - unreachable */ - - case SCAN_CRS_SCAN_FAILED: - return SCAN_MRS_SCAN_FAILED; -/* break; - unreachable */ - - case SCAN_CRS_SCAN_STOPPED: - return SCAN_MRS_SCAN_STOPPED; -/* break; - unreachable */ - - case SCAN_CRS_TSF_ERROR: - return SCAN_MRS_SCAN_FAILED; -/* break; - unreachable */ - - case SCAN_CRS_SCAN_ABORTED_FW_RESET: - return SCAN_MRS_SCAN_ABORTED_FW_RESET; -/* break; - unreachable */ - - case SCAN_CRS_SCAN_ABORTED_HIGHER_PRIORITY: - return SCAN_MRS_SCAN_ABORTED_HIGHER_PRIORITY; -/* break; - unreachable */ - - default: - return SCAN_MRS_SCAN_FAILED; -/* break; - unreachable */ - } -} - -/************************************************************************/ -/* Trace functions */ -/************************************************************************/ - -#ifdef REPORT_LOG - -static char scanTypeDesc[ 6 ][ MAX_DESC_LENGTH ] = -{ - "passive normal scan", - "active normal scan", - "SPS scan", - "passive triggered scan", - "active triggered scan", - "no scan type" -}; - -static char earlyTerminationConditionDesc[ 4 ][ MAX_DESC_LENGTH ] = -{ - "Early termination disabled", - "Early termination on beacon", - "Early termination on probe response", - "Early termination on both" -}; - -#ifdef TI_DBG -static char booleanDesc[ 2 ][ MAX_DESC_LENGTH ] = -{ - "No", - "Yes" -}; - -static char contScanStatesDesc[ SCAN_CSS_NUM_OF_STATES ][ MAX_DESC_LENGTH ] = -{ - "IDLE", - "TRACKING ON G", - "TRACKING ON A", - "DISCOVERING", - "STOPPING" -}; - -static char immedScanStatesDesc[ SCAN_ISS_NUM_OF_STATES ][ MAX_DESC_LENGTH ] = -{ - "IDLE", - "IMMEDIATE ON G", - "IMMEDIATE ON A", - "STOPPING" -}; - -static char discoveryPartDesc[ SCAN_SDP_NUMBER_OF_DISCOVERY_PARTS ][ MAX_DESC_LENGTH ] = -{ - "G neighbor APs", - "A neighbor APs", - "G channels", - "A Channels", - "No discovery" -}; - -static char neighborDiscovreyStateDesc[ SCAN_NDS_NUMBER_OF_NEIGHBOR_DISCOVERY_STATES ][ MAX_DESC_LENGTH ] = -{ - "Discovered", - "Not discovered", - "Current AP" -}; - -static char earlyTerminationDesc[ SCAN_ET_COND_NUM_OF_CONDS ][ MAX_DESC_LENGTH ] = -{ - "None", - "Beacon", - "Prob. resp." - "Bcn & prob. resp." -}; -#endif - -#endif - -/** - * \\n - * \date 09-Mar-2005\n - * \brief Print a neighbor AP list.\n - * - * Function Scope \e Private.\n - * \param hScanMngr - handle to the scan manager object.\n - * \param neighborAPList - the list of neighbor APs to print.\n - */ -void scanMngrTracePrintNeighborAPsList( TI_HANDLE hScanMngr, neighborAPList_t *neighborAPList ) -{ - scanMngr_t* pScanMngr = (scanMngr_t*)hScanMngr; - int i; - - /* It looks like it never happens. Anyway decided to check */ - if ( neighborAPList->numOfEntries > MAX_NUM_OF_NEIGHBOR_APS ) - { - TRACE2( pScanMngr->hReport, REPORT_SEVERITY_ERROR, - "scanMngrTracePrintNeighborAPsList. neighborAPList->numOfEntries=%d exceeds the limit %d\n", - neighborAPList->numOfEntries, MAX_NUM_OF_NEIGHBOR_APS); - handleRunProblem(PROBLEM_BUF_SIZE_VIOLATION); - return; - } - /* print number of entries */ - TRACE1( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "Neighbor AP list with %d entries.\n\n", neighborAPList->numOfEntries); - - /* print all APs in list */ - for ( i = 0; i < neighborAPList->numOfEntries; i++ ) - { - scanMngrTracePrintNeighborAP( hScanMngr, &(neighborAPList->APListPtr[ i ])); - } -} - -/** - * \\n - * \date 09-Mar-2005\n - * \brief Print a neighbor AP.\n - * - * Function Scope \e Private.\n - * \param hScanMngr - handle to the scan manager object.\n - * \param neighborAP - the neighbor AP to print.\n - */ -void scanMngrTracePrintNeighborAP( TI_HANDLE hScanMngr, neighborAP_t* neighborAP ) -{ - scanMngr_t* pScanMngr = (scanMngr_t*)hScanMngr; - - /* print neighbor AP content */ - TRACE7( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "Neighbor AP band: , channel: %d, MAC address (BSSID): %2x:%2x:%2x:%2x:%2x:%2xn", neighborAP->channel, neighborAP->BSSID[ 0 ], neighborAP->BSSID[ 1 ], neighborAP->BSSID[ 2 ], neighborAP->BSSID[ 3 ], neighborAP->BSSID[ 4 ], neighborAP->BSSID[ 5 ]); -} - -/** - * \\n - * \date 09-Mar-2005\n - * \brief Print scan policy.\n - * - * Function Scope \e Private.\n - * \param scanPolicy - scan policy to print.\n - */ -void scanMngrTracePrintScanPolicy( TScanPolicy* scanPolicy ) -{ - int i; - - /* print general policy parameters */ - WLAN_OS_REPORT(("Global policy parameters:\n")); - WLAN_OS_REPORT(("Normal scan interval: %d, deteriorating scan interval: %d\n", - scanPolicy->normalScanInterval, scanPolicy->deterioratingScanInterval)); - WLAN_OS_REPORT(("BSS list size: %d, numnber of tracked APs to start discovery: %d, " - "Max track failures:% d\n", scanPolicy->BSSListSize, - scanPolicy->BSSNumberToStartDiscovery, scanPolicy->maxTrackFailures)); - /* It looks like it never happens. Anyway decided to check */ - if ( scanPolicy->numOfBands > RADIO_BAND_NUM_OF_BANDS ) - { - WLAN_OS_REPORT(("scanMngrTracePrintScanPolicy. scanPolicy->numOfBands=%d exceeds the limit %d\n", - scanPolicy->numOfBands, RADIO_BAND_NUM_OF_BANDS)); - handleRunProblem(PROBLEM_BUF_SIZE_VIOLATION); - return; - } - /* print band policy parameters for all available bands */ - for ( i = 0; i < scanPolicy->numOfBands; i++ ) - { - scanMngrTracePrintBandScanPolicy( &(scanPolicy->bandScanPolicy[ i ])); - } -} - -/** - * \\n - * \date 09-Mar-2005\n - * \brief Print a band scan policy AP.\n - * - * Function Scope \e Private.\n - * \param bandPolicy - the band scan policy to print.\n - */ -void scanMngrTracePrintBandScanPolicy( TScanBandPolicy* bandPolicy ) -{ - int i; - - WLAN_OS_REPORT(("Band scan policy for band: %s\n", - (RADIO_BAND_2_4_GHZ == bandPolicy->band ? "2.4 GHz (b/g)" : "5.0 GHz (a)"))); - WLAN_OS_REPORT(("Maximal number of channels to scan at each discovery interval %d:\n", - bandPolicy->numOfChannlesForDiscovery)); - WLAN_OS_REPORT(("RSSI Threshold: %d\n", bandPolicy->rxRSSIThreshold)); - WLAN_OS_REPORT(("Tracking method:\n")); - scanMngrTracePrintScanMethod( &(bandPolicy->trackingMethod)); - WLAN_OS_REPORT(("Discovery method:\n")); - scanMngrTracePrintScanMethod( &(bandPolicy->discoveryMethod)); - WLAN_OS_REPORT(("Immediate scan method:\n")); - scanMngrTracePrintScanMethod( &(bandPolicy->immediateScanMethod)); - /* It looks like it never happens. Anyway decided to check */ - if ( bandPolicy->numOfChannles > MAX_BAND_POLICY_CHANNLES ) - { - WLAN_OS_REPORT(("scanMngrTracePrintBandScanPolicy. bandPolicy->numOfChannles=%d exceeds the limit %d\n", - bandPolicy->numOfChannles, MAX_BAND_POLICY_CHANNLES)); - handleRunProblem(PROBLEM_BUF_SIZE_VIOLATION); - return; - } - WLAN_OS_REPORT(("Channels: ")); - for( i = 0; i < bandPolicy->numOfChannles; i++ ) - { - WLAN_OS_REPORT(("%d ", bandPolicy->channelList[ i ])); - } - WLAN_OS_REPORT(("\n")); -} - -/** - * \\n - * \date 09-Mar-2005\n - * \brief Print a scan method - * - * Function Scope \e Private.\n - * \param scanMethod - the scan method to print.\n - */ -void scanMngrTracePrintScanMethod( TScanMethod* scanMethod ) -{ - WLAN_OS_REPORT(("Scan type: %s\n", scanTypeDesc[ scanMethod->scanType ])); - - switch (scanMethod->scanType) - { - case SCAN_TYPE_NORMAL_ACTIVE: - case SCAN_TYPE_NORMAL_PASSIVE: - scanMngrTracePrintNormalScanMethod( &(scanMethod->method.basicMethodParams)); - break; - - case SCAN_TYPE_TRIGGERED_ACTIVE: - case SCAN_TYPE_TRIGGERED_PASSIVE: - scanMngrTracePrintTriggeredScanMethod( &(scanMethod->method.TidTriggerdMethodParams)); - break; - - case SCAN_TYPE_SPS: - scanMngrTracePrintSPSScanMethod( &(scanMethod->method.spsMethodParams)); - break; - - case SCAN_TYPE_NO_SCAN: - default: - WLAN_OS_REPORT(("No scan method defined\n")); - break; - } -} - -/** - * \\n - * \date 09-Mar-2005\n - * \brief print a normal scan method - * - * Function Scope \e Private.\n - * \param basicMethodParams - the basic method parameters to print.\n - */ -void scanMngrTracePrintNormalScanMethod( TScanBasicMethodParams* basicMethodParams ) -{ - WLAN_OS_REPORT(("Max channel dwell time: %d, min channel dwell time: %d\n", - basicMethodParams->maxChannelDwellTime, basicMethodParams->minChannelDwellTime)); - WLAN_OS_REPORT(("Early termination condition: %s, frame number for early termination: %d\n", - earlyTerminationConditionDesc[ basicMethodParams->earlyTerminationEvent >> 4 ], - basicMethodParams->ETMaxNumberOfApFrames)); - WLAN_OS_REPORT(("Number of probe requests: %d, TX level: %d, probe request rate: %d\n", - basicMethodParams->probReqParams.numOfProbeReqs, - basicMethodParams->probReqParams.txPowerDbm, - basicMethodParams->probReqParams.bitrate)); -} - -/** - * \\n - * \date 09-Mar-2005\n - * \brief print an AC triggered scan method - * - * Function Scope \e Private.\n - * \param triggeredMethodParams - the AC-triggered method parameters to print.\n - */ -void scanMngrTracePrintTriggeredScanMethod( TScanTidTriggeredMethodParams* triggeredMethodParams ) -{ - WLAN_OS_REPORT(("Triggering Tid: %d\n", triggeredMethodParams->triggeringTid)); - scanMngrTracePrintNormalScanMethod( &(triggeredMethodParams->basicMethodParams)); -} - -/** - * \\n - * \date 09-Mar-2005\n - * \brief print a SPS scan method - * - * Function Scope \e Private.\n - * \param SPSMethodParams - the SPS method parameters to print.\n - */ -void scanMngrTracePrintSPSScanMethod( TScanSPSMethodParams* SPSMethodParams ) -{ - WLAN_OS_REPORT(("Early termination condition: %s, frame number for early termination: %d\n", - earlyTerminationConditionDesc[ SPSMethodParams->earlyTerminationEvent ], - SPSMethodParams->ETMaxNumberOfApFrames)); - WLAN_OS_REPORT(("Scan duration: %d\n", SPSMethodParams->scanDuration)); -} - -/** - * \\n - * \date 31-Mar-2005\n - * \brief print debug information for every received frame.\n - * - * Function Scope \e Private.\n - * \param hScanMngr - handle to the scan manager object.\n - * \param frameInfo - holding all frame related information.\n - */ -void scanMngrDebugPrintReceivedFrame( TI_HANDLE hScanMngr, TScanFrameInfo *frameInfo ) -{ - scanMngr_t* pScanMngr = (scanMngr_t*)hScanMngr; - - TRACE0( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "Scan manager received the following frame:\n"); - TRACE8( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "from BSSID: %02x:%02x:%02x:%02x:%02x:%02x, band: %d, channel: %d\n", (*frameInfo->bssId)[ 0 ], (*frameInfo->bssId)[ 1 ], (*frameInfo->bssId)[ 2 ], (*frameInfo->bssId)[ 3 ], (*frameInfo->bssId)[ 4 ], (*frameInfo->bssId)[ 5 ], frameInfo->band, frameInfo->channel); - TRACE2( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "rate: %d, received at TSF (lower 32 bits): %d\n", frameInfo->rate, frameInfo->staTSF); - if ( BEACON == frameInfo->parsedIEs->subType ) - { - TRACE2( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "remote TSF value: %x-%x\n", INT64_HIGHER( frameInfo->parsedIEs->content.iePacket.timestamp ), INT64_LOWER( frameInfo->parsedIEs->content.iePacket.timestamp )); - - } - else - { - TRACE2( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "remote TSF value: %x-%x\n", INT64_HIGHER( frameInfo->parsedIEs->content.iePacket.timestamp ), INT64_LOWER( frameInfo->parsedIEs->content.iePacket.timestamp )); - } - TRACE1( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "RSSI: %d\n", frameInfo->rssi); -} -#ifdef TI_DBG -/** - * \\n - * \date 31-Mar-2005\n - * \brief print BSS list.\n - * - * Function Scope \e Private.\n - * \param hScanMngr - handle to the scan manager object.\n - */ -void scanMngrDebugPrintBSSList( TI_HANDLE hScanMngr ) -{ - scanMngr_t* pScanMngr = (scanMngr_t*)hScanMngr; - int i, limit; - - if ( 0 == pScanMngr->BSSList.numOfEntries ) - { - WLAN_OS_REPORT(("BSS list is empty.\n")); - return; - } - limit = pScanMngr->BSSList.numOfEntries; - /* It looks like it never happens. Anyway decided to check */ - if (pScanMngr->BSSList.numOfEntries > MAX_SIZE_OF_BSS_TRACK_LIST) - { - TRACE2( pScanMngr->hReport, REPORT_SEVERITY_ERROR, - "scanMngrDebugPrintBSSList problem. BSSList.numOfEntries=%d Exceeds limit %d\n", - pScanMngr->BSSList.numOfEntries, MAX_SIZE_OF_BSS_TRACK_LIST); - handleRunProblem(PROBLEM_BUF_SIZE_VIOLATION); - limit = MAX_SIZE_OF_BSS_TRACK_LIST; - } - - WLAN_OS_REPORT(("-------------------------------- BSS List--------------------------------\n")); - - for ( i = 0; i < limit; i++ ) - { - WLAN_OS_REPORT( ("Entry number: %d\n", i)); - scanMngrDebugPrintBSSEntry( hScanMngr, i ); - } - - WLAN_OS_REPORT(("--------------------------------------------------------------------------\n")); -} -#endif/*TI_DBG*/ -/** - * \\n - * \date 31-Mar-2005\n - * \brief print one entry in the BSS list.\n - * - * Function Scope \e Private.\n - * \param hScanMngr - handle to the scan manager object.\n - * \param entryIndex - the index of the entry to print.\n - */ -void scanMngrDebugPrintBSSEntry( TI_HANDLE hScanMngr, TI_UINT8 entryIndex ) -{ -#ifdef REPORT_LOG - - scanMngr_t* pScanMngr = (scanMngr_t*)hScanMngr; - bssEntry_t* pBssEntry = &(pScanMngr->BSSList.BSSList[ entryIndex ]); - scan_BSSEntry_t * pScanBssEntry = &(pScanMngr->BSSList.scanBSSList[ entryIndex ]); - - WLAN_OS_REPORT( ("BSSID: %02x:%02x:%02x:%02x:%02x:%02x, band: %d\n", pBssEntry->BSSID[ 0 ], - pBssEntry->BSSID[ 1 ], pBssEntry->BSSID[ 2 ], - pBssEntry->BSSID[ 3 ], pBssEntry->BSSID[ 4 ], - pBssEntry->BSSID[ 5 ], pBssEntry->band)); - WLAN_OS_REPORT( ("channel: %d, beacon interval: %d, average RSSI: %d dBm\n", - pBssEntry->channel, pBssEntry->beaconInterval, pBssEntry->RSSI)); - WLAN_OS_REPORT( ("Neighbor AP: %s, track fail count: %d\n", - (TI_TRUE == pBssEntry->bNeighborAP ? "YES" : "NO"), - pScanBssEntry->trackFailCount)); - WLAN_OS_REPORT( ("local TSF: %d-%d, remote TSF: %x-%x\n", - INT64_HIGHER( pScanBssEntry->localTSF ), INT64_LOWER( pScanBssEntry->localTSF ), - INT64_HIGHER( pBssEntry->lastRxTSF ), INT64_LOWER( pBssEntry->lastRxTSF ))); - WLAN_OS_REPORT( ("Host Time Stamp: %d, last received rate: %d\n", - pBssEntry->lastRxHostTimestamp, pBssEntry->rxRate)); - -#endif -} - -/** - * \\n - * \date 14-Apr-2005\n - * \brief print SPS helper list - * - * Function Scope \e Private.\n - * \param hScanMngr - handle to the scan manager object.\n - * \param spsHelperList - the list to print.\n - * \param arrayHead - the index of the first element in the list.\n - * \param arraySize - the size of the array.\n - */ -void scanMngrDebugPrintSPSHelperList( TI_HANDLE hScanMngr, scan_SPSHelper_t* spsHelperList, int arrayHead, int arraySize ) -{ - scanMngr_t* pScanMngr = (scanMngr_t*)hScanMngr; - int i; - - TRACE2( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "SPS helper list size:%d, list head:%d\n", arraySize, arrayHead); - for ( i = 0; i < arraySize; i++ ) - { - TRACE7( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "track list index:%d, BSSID:%02x:%02x:%02x:%02x:%02x:%02x\n", spsHelperList[ i ].trackListIndex, pScanMngr->BSSList.BSSList[ spsHelperList[ i ].trackListIndex ].BSSID[ 0 ], pScanMngr->BSSList.BSSList[ spsHelperList[ i ].trackListIndex ].BSSID[ 1 ], pScanMngr->BSSList.BSSList[ spsHelperList[ i ].trackListIndex ].BSSID[ 2 ], pScanMngr->BSSList.BSSList[ spsHelperList[ i ].trackListIndex ].BSSID[ 3 ], pScanMngr->BSSList.BSSList[ spsHelperList[ i ].trackListIndex ].BSSID[ 4 ], pScanMngr->BSSList.BSSList[ spsHelperList[ i ].trackListIndex ].BSSID[ 5 ]); - TRACE3( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "TSF:%x-%x, next entry index:%d\n", INT64_HIGHER(spsHelperList[ i ].nextEventTSF), INT64_LOWER(spsHelperList[ i ].nextEventTSF), spsHelperList[ i ].nextAPIndex); - } -} - - -/* - *********************************************************************** - * API functions - *********************************************************************** - */ -TI_HANDLE scanMngr_create( TI_HANDLE hOS ) -{ - int i,j = 0; - scanMngr_t* pScanMngr ; - - /* allocate the scan manager object */ - pScanMngr = os_memoryAlloc( hOS, sizeof(scanMngr_t)); - if ( NULL == pScanMngr ) - { - WLAN_OS_REPORT( ("scanMngr_create: Failed allocating scan manager object storage.\n")); - return NULL; - } - - os_memoryZero( pScanMngr->hOS, pScanMngr, sizeof(scanMngr_t)); - - pScanMngr->hOS = hOS; - - /* allocate frame storage space for BSS list */ - for (i = 0; i < MAX_SIZE_OF_BSS_TRACK_LIST; i++) - { - pScanMngr->BSSList.BSSList[i].pBuffer = os_memoryAlloc (hOS, MAX_BEACON_BODY_LENGTH); - if (pScanMngr->BSSList.BSSList[i].pBuffer == NULL) - { - WLAN_OS_REPORT( ("scanMngr_create: Failed allocating scan result buffer for index %d.\n", i)); - /* failed to allocate a buffer - release all buffers that were allocated by now */ - for (j = i - 1; j >= 0; j--) - { - os_memoryFree (hOS, pScanMngr->BSSList.BSSList[j].pBuffer, MAX_BEACON_BODY_LENGTH); - } - /* release the rest of the module */ - scanMngrFreeMem ((TI_HANDLE)pScanMngr); - return NULL; - } - } - - return (TI_HANDLE)pScanMngr; -} - -void scanMngr_init (TStadHandlesList *pStadHandles) -{ - scanMngr_t *pScanMngr = (scanMngr_t*)(pStadHandles->hScanMngr); - int i; - - /* store handles */ - pScanMngr->hReport = pStadHandles->hReport; - pScanMngr->hRegulatoryDomain = pStadHandles->hRegulatoryDomain; - pScanMngr->hScanCncn = pStadHandles->hScanCncn; - pScanMngr->hRoamingMngr = pStadHandles->hRoamingMngr; - pScanMngr->hSiteMngr = pStadHandles->hSiteMgr; - pScanMngr->hTWD = pStadHandles->hTWD; - pScanMngr->hTimer = pStadHandles->hTimer; - pScanMngr->hAPConnection = pStadHandles->hAPConnection; - pScanMngr->hEvHandler = pStadHandles->hEvHandler; - - /* mark the scanning operational mode to be automatic by default */ - pScanMngr->scanningOperationalMode = SCANNING_OPERATIONAL_MODE_AUTO; - - /* mark that continuous scan timer is not running */ - pScanMngr->bTimerRunning = TI_FALSE; - - /* mark that continuous scan process is not running */ - pScanMngr->bContinuousScanStarted = TI_FALSE; - - /* nullify scan policy */ - os_memoryZero( pScanMngr->hOS, &(pScanMngr->scanPolicy), sizeof(TScanPolicy)); - - /* initialize the BSS list to empty list */ - pScanMngr->BSSList.numOfEntries = 0; - - /* mark no continuous and immediate scans are currently running */ - pScanMngr->contScanState = SCAN_CSS_IDLE; - pScanMngr->immedScanState = SCAN_ISS_IDLE; - pScanMngr->bNewBSSFound = TI_FALSE; - pScanMngr->consecNotFound = 0; - - /* mark no AP recovery occured */ - pScanMngr->bSynchronized = TI_TRUE; - - /* mark no neighbor APs */ - pScanMngr->neighborAPsDiscoveryList[ RADIO_BAND_2_4_GHZ ].numOfEntries = 0; - pScanMngr->neighborAPsDiscoveryList[ RADIO_BAND_5_0_GHZ ].numOfEntries = 0; - - /* mark no discovery process */ - pScanMngr->currentDiscoveryPart = SCAN_SDP_NO_DISCOVERY; - - /* initialize the low quality indication to indicate that normal quality interval should be used */ - pScanMngr->bLowQuality = TI_FALSE; - - /* clear current BSS field (put broadcast MAC) */ - for (i = 0; i < MAC_ADDR_LEN; i++) - { - pScanMngr->currentBSS[i] = 0xff; - } - pScanMngr->currentBSSBand = RADIO_BAND_2_4_GHZ; - - /* create timer */ - pScanMngr->hContinuousScanTimer = tmr_CreateTimer (pScanMngr->hTimer); - if (pScanMngr->hContinuousScanTimer == NULL) - { - TRACE0(pScanMngr->hReport, REPORT_SEVERITY_ERROR, "scanMngr_init(): Failed to create hContinuousScanTimer!\n"); - } - - /* register scan concentrator callbacks */ - scanCncn_RegisterScanResultCB( pScanMngr->hScanCncn, SCAN_SCC_ROAMING_CONT, - scanMngr_contScanCB, pStadHandles->hScanMngr ); - scanCncn_RegisterScanResultCB( pScanMngr->hScanCncn, SCAN_SCC_ROAMING_IMMED, - scanMngr_immedScanCB, pStadHandles->hScanMngr ); - -#ifdef TI_DBG - /* nullify statistics */ - os_memoryZero( pScanMngr->hOS, &(pScanMngr->stats), sizeof(scan_mngrStat_t)); - /* nullify scan parameters - for debug prints before start */ - os_memoryZero( pScanMngr->hOS, &(pScanMngr->scanParams), sizeof(TScanParams)); - /* initialize other variables for debug print */ - pScanMngr->bImmedNeighborAPsOnly = TI_FALSE; - pScanMngr->bNewBSSFound = TI_FALSE; -#endif -} - -void scanMngr_unload (TI_HANDLE hScanMngr) -{ - scanMngrFreeMem (hScanMngr); -} - -scan_mngrResultStatus_e scanMngr_startImmediateScan( TI_HANDLE hScanMngr, TI_BOOL bNeighborAPsOnly ) -{ - scanMngr_t* pScanMngr = (scanMngr_t*)hScanMngr; - TScanBandPolicy *gPolicy, *aPolicy; - EScanCncnResultStatus resultStatus; - - TRACE1( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "scanMngr_startImmediateScan called, hScanMngr=0x%x, bNeighborAPsOnly=.\n", hScanMngr); - - /* sanity check - whether immediate scan is already running */ - if ( SCAN_ISS_IDLE != pScanMngr->immedScanState ) - { - TRACE1( pScanMngr->hReport, REPORT_SEVERITY_WARNING, "Immediate scan attempted while it is already running, in state:%d.\n", pScanMngr->immedScanState); - return SCAN_MRS_SCAN_NOT_ATTEMPTED_ALREADY_RUNNING; - } - - /* get policies by band */ - gPolicy = scanMngrGetPolicyByBand( hScanMngr, RADIO_BAND_2_4_GHZ ); - aPolicy = scanMngrGetPolicyByBand( hScanMngr, RADIO_BAND_5_0_GHZ ); - - /* check whether a policy is defined for at least one band */ - if ( ((NULL == gPolicy) || (SCAN_TYPE_NO_SCAN == gPolicy->immediateScanMethod.scanType)) && /* no policy for G band */ - ((NULL == aPolicy) || (SCAN_TYPE_NO_SCAN == aPolicy->immediateScanMethod.scanType))) /* no policy for A band */ - { - TRACE0( pScanMngr->hReport, REPORT_SEVERITY_WARNING, "Immediatse scan attempted when no policy is defined.\n"); - return SCAN_MRS_SCAN_NOT_ATTEMPTED_EMPTY_POLICY; - } - - /* First try to scan on G band - if a policy is defined and channels are available */ - if ( (NULL != gPolicy) && /* policy is defined for G */ - (SCAN_TYPE_NO_SCAN != gPolicy->immediateScanMethod.scanType)) - { - /* build scan command */ - scanMngrBuildImmediateScanCommand( hScanMngr, gPolicy, bNeighborAPsOnly ); - - /* if no channels are available, proceed to band A */ - if ( 0 < pScanMngr->scanParams.numOfChannels ) - { - /* mark that immediate scan is running on band G */ - pScanMngr->immedScanState = SCAN_ISS_G_BAND; - pScanMngr->bImmedNeighborAPsOnly = bNeighborAPsOnly; - - /* if continuous scan is running, mark that it should quit */ - if ( SCAN_CSS_IDLE != pScanMngr->contScanState ) - { - TRACE0( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "scanMngr_startImmediateScan called 1, switched to STOPPING state \n"); - - pScanMngr->contScanState = SCAN_CSS_STOPPING; - } - - /* send scan command to scan concentrator with the required scan params according to scanning operational mode */ - resultStatus = scanMngr_Start1ShotScan(hScanMngr, SCAN_SCC_ROAMING_IMMED); - - if ( SCAN_CRS_SCAN_RUNNING != resultStatus ) - { - TRACE1( pScanMngr->hReport, REPORT_SEVERITY_WARNING, "Failed to start immediate scan on band G, return code %d.\n", resultStatus); -#ifdef TI_DBG - pScanMngr->stats.ImmediateGByStatus[ resultStatus ]++; -#endif - return SCAN_MRS_SCAN_FAILED; - } - return SCAN_MRS_SCAN_RUNNING; - } - } - - /* if G scan did not start (because no policy is configured or no channels are available, try A band */ - if ( (NULL != aPolicy) && - (SCAN_TYPE_NO_SCAN != aPolicy->immediateScanMethod.scanType)) - { - /* build scan command */ - scanMngrBuildImmediateScanCommand( hScanMngr, aPolicy, bNeighborAPsOnly ); - - /* if no channels are available, report error */ - if ( 0 == pScanMngr->scanParams.numOfChannels ) - { - TRACE0( pScanMngr->hReport, REPORT_SEVERITY_WARNING, "No channels available for scan operation.\n"); - return SCAN_MRS_SCAN_NOT_ATTEMPTED_NO_CHANNLES_AVAILABLE; - } - else - { - /* mark that immediate scan is running on band A */ - pScanMngr->immedScanState = SCAN_ISS_A_BAND; - - /* if continuous scan is running, mark that it should quit */ - if ( SCAN_CSS_IDLE != pScanMngr->contScanState ) - { - TRACE0( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "scanMngr_startImmediateScan called 2, switched to STOPPING state \n"); - - pScanMngr->contScanState = SCAN_CSS_STOPPING; - } - - /* send scan command to scan concentrator with the required scan params according to scanning operational mode */ - resultStatus = scanMngr_Start1ShotScan(hScanMngr, SCAN_SCC_ROAMING_IMMED); - if ( SCAN_CRS_SCAN_RUNNING != resultStatus ) - { - TRACE1( pScanMngr->hReport, REPORT_SEVERITY_WARNING, "Failed to start immediate scan on band A, return code %d.\n", resultStatus); -#ifdef TI_DBG - pScanMngr->stats.ImmediateAByStatus[ resultStatus ]++; -#endif - return SCAN_MRS_SCAN_FAILED; - } - return SCAN_MRS_SCAN_RUNNING; - } - } - else - { - /* since we passed the policy check, we arrived here because we didn't had channel on G and policy on A */ - TRACE0( pScanMngr->hReport, REPORT_SEVERITY_WARNING, "No channels available for scan operation.\n"); - return SCAN_MRS_SCAN_NOT_ATTEMPTED_NO_CHANNLES_AVAILABLE; - } -} - -void scanMngr_stopImmediateScan( TI_HANDLE hScanMngr ) -{ - scanMngr_t* pScanMngr = (scanMngr_t*)hScanMngr; - - TRACE1( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "scanMngrStopImmediateScan called, hScanMngr=0x%x", hScanMngr); - - /* check that immediate scan is running */ - if ( (SCAN_ISS_A_BAND != pScanMngr->immedScanState) && (SCAN_ISS_G_BAND != pScanMngr->immedScanState)) - { - TRACE1( pScanMngr->hReport, REPORT_SEVERITY_WARNING, "Immediate scan stop request when immediate scan is in state:%d", pScanMngr->immedScanState); - return; - } - -#ifdef TI_DBG - switch ( pScanMngr->immedScanState ) - { - case SCAN_ISS_G_BAND: - pScanMngr->stats.ImmediateGByStatus[ SCAN_CRS_SCAN_STOPPED ]++; - break; - - case SCAN_ISS_A_BAND: - pScanMngr->stats.ImmediateAByStatus[ SCAN_CRS_SCAN_STOPPED ]++; - break; - - default: - break; - } -#endif - /* mark immediate scan status as stopping */ - pScanMngr->immedScanState = SCAN_ISS_STOPPING; - - /* send a stop command to scan concentrator */ - scanCncn_StopScan( pScanMngr->hScanCncn, SCAN_SCC_ROAMING_IMMED ); -} - -void scanMngr_startContScan( TI_HANDLE hScanMngr, TMacAddr* currentBSS, ERadioBand currentBSSBand ) -{ - scanMngr_t* pScanMngr = (scanMngr_t*)hScanMngr; - int currentBSSNeighborIndex; - - TRACE1( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "scanMngr_StartContScan called, hScanMngr=0x%x.\n", hScanMngr); - /* It looks like it never happens. Anyway decided to check */ - if ( pScanMngr->currentBSSBand >= RADIO_BAND_NUM_OF_BANDS ) - { - TRACE2( pScanMngr->hReport, REPORT_SEVERITY_ERROR, - "scanMngr_startContScan. pScanMngr->currentBSSBand=%d exceeds the limit %d\n", - pScanMngr->currentBSSBand, RADIO_BAND_NUM_OF_BANDS-1); - handleRunProblem(PROBLEM_BUF_SIZE_VIOLATION); - return; - } - if ( currentBSSBand >= RADIO_BAND_NUM_OF_BANDS ) - { - TRACE2( pScanMngr->hReport, REPORT_SEVERITY_ERROR, - "scanMngr_startContScan. currentBSSBand=%d exceeds the limit %d\n", - currentBSSBand, RADIO_BAND_NUM_OF_BANDS-1); - handleRunProblem(PROBLEM_BUF_SIZE_VIOLATION); - return; - } - /* if continuous scan is already running, it means we get a start command w/o stop */ - if ( TI_TRUE == pScanMngr->bContinuousScanStarted ) - { - TRACE0( pScanMngr->hReport, REPORT_SEVERITY_WARNING, "Start continuous scan requested when continuous scan is running.\n"); - return; - } - - /* mark that continuous scan was started */ - pScanMngr->bContinuousScanStarted = TI_TRUE; - - /* before reading and marking the new BSS - make sure that the old one is marked as NOT DISCOVERED */ - currentBSSNeighborIndex = scanMngrGetNeighborAPIndex( hScanMngr, pScanMngr->currentBSSBand, &(pScanMngr->currentBSS)); - if (( -1 != currentBSSNeighborIndex ) && ( currentBSSNeighborIndex < MAX_NUM_OF_NEIGHBOR_APS )) - { - pScanMngr->neighborAPsDiscoveryList[ pScanMngr->currentBSSBand ].trackStatusList[ currentBSSNeighborIndex ] = - SCAN_NDS_NOT_DISCOVERED; - } - - /* Now copy current BSS - to be used when setting neighbor APs */ - pScanMngr->currentBSSBand = currentBSSBand; - MAC_COPY (pScanMngr->currentBSS, *currentBSS); - - /* if current BSS is in the neighbor AP list, mark it as current BSS */ - currentBSSNeighborIndex = scanMngrGetNeighborAPIndex( hScanMngr, currentBSSBand, currentBSS ); - if (( -1 != currentBSSNeighborIndex ) && ( currentBSSNeighborIndex < MAX_NUM_OF_NEIGHBOR_APS )) - { - pScanMngr->neighborAPsDiscoveryList[ currentBSSBand ].trackStatusList[ currentBSSNeighborIndex ] = - SCAN_NDS_CURRENT_AP; - } - - /* reset discovery cycle */ - pScanMngr->neighborAPsDiscoveryIndex[ RADIO_BAND_2_4_GHZ ] = 0; - pScanMngr->neighborAPsDiscoveryIndex[ RADIO_BAND_5_0_GHZ ] = 0; - pScanMngr->channelDiscoveryIndex[ RADIO_BAND_2_4_GHZ ] = 0; - pScanMngr->channelDiscoveryIndex[ RADIO_BAND_5_0_GHZ ] = 0; - pScanMngr->currentDiscoveryPart = SCAN_SDP_NEIGHBOR_G; - scanMngrSetNextDiscoveryPart( hScanMngr ); - - /* clear the BSS tracking list */ - pScanMngr->BSSList.numOfEntries = 0; - - /* start timer (if timeout is configured) */ - if ( ((TI_TRUE == pScanMngr->bLowQuality) && (0 < pScanMngr->scanPolicy.normalScanInterval)) || - ((TI_FALSE == pScanMngr->bLowQuality) && (0 < pScanMngr->scanPolicy.deterioratingScanInterval))) - { - TI_UINT32 uTimeout = pScanMngr->bLowQuality ? - pScanMngr->scanPolicy.deterioratingScanInterval : - pScanMngr->scanPolicy.normalScanInterval; - - pScanMngr->bTimerRunning = TI_TRUE; - - tmr_StartTimer (pScanMngr->hContinuousScanTimer, - scanMngr_GetUpdatedTsfDtimMibForScan, - (TI_HANDLE)pScanMngr, - uTimeout, - TI_TRUE); - } -} - -void scanMngr_stopContScan( TI_HANDLE hScanMngr ) -{ - scanMngr_t* pScanMngr = (scanMngr_t*)hScanMngr; - TI_UINT8 i; - - TRACE2( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "scanMngr_stopContScan called, hScanMngr=0x%x, state =%d\n", hScanMngr, pScanMngr->contScanState); - - /* if continuous scan is not running, it means we get a stop command w/o start */ - if ( TI_FALSE == pScanMngr->bContinuousScanStarted ) - { - TRACE0( pScanMngr->hReport, REPORT_SEVERITY_WARNING, "Stop continuous scan when continuous scan is not running.\n"); - return; - } - - /* mark that continuous scan is not running */ - pScanMngr->bContinuousScanStarted = TI_FALSE; - - /* stop timer */ - if ( TI_TRUE == pScanMngr->bTimerRunning ) - { - tmr_StopTimer (pScanMngr->hContinuousScanTimer); - pScanMngr->bTimerRunning = TI_FALSE; - } - - /* if continuous scan is currently running */ - if ( (SCAN_CSS_IDLE != pScanMngr->contScanState) && - (SCAN_CSS_STOPPING != pScanMngr->contScanState)) - { - /* send a stop scan command to the scan concentartor */ - scanCncn_StopScan( pScanMngr->hScanCncn, SCAN_SCC_ROAMING_CONT ); - TRACE0( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "scanMngr_stopContScan called, switched to STOPPING state \n"); - -#ifdef TI_DBG - switch ( pScanMngr->contScanState ) - { - case SCAN_CSS_TRACKING_G_BAND: - pScanMngr->stats.TrackingGByStatus[ SCAN_CRS_SCAN_STOPPED ]++; - break; - - case SCAN_CSS_TRACKING_A_BAND: - pScanMngr->stats.TrackingAByStatus[ SCAN_CRS_SCAN_STOPPED ]++; - break; - - case SCAN_CSS_DISCOVERING: - if ( RADIO_BAND_2_4_GHZ == pScanMngr->statsLastDiscoveryBand ) - { - pScanMngr->stats.DiscoveryGByStatus[ SCAN_CRS_SCAN_STOPPED ]++; - } - else - { - pScanMngr->stats.DiscoveryAByStatus[ SCAN_CRS_SCAN_STOPPED ]++; - } - break; - - default: - break; - } -#endif - /* mark that continuous scan is stopping */ - pScanMngr->contScanState = SCAN_CSS_STOPPING; - } - - /* clear current neighbor APs */ - pScanMngr->neighborAPsDiscoveryList[ RADIO_BAND_2_4_GHZ ].numOfEntries = 0; - pScanMngr->neighborAPsDiscoveryList[ RADIO_BAND_5_0_GHZ ].numOfEntries = 0; - - /* clear current BSS field .This is for the case that scanMngr_setNeighborAPs() is called before scanMngr_startcontScan() */ - for ( i = 0; i < MAC_ADDR_LEN; i++ ) - { - pScanMngr->currentBSS[ i ] = 0xff; - } - -} - -bssList_t* scanMngr_getBSSList( TI_HANDLE hScanMngr ) -{ - scanMngr_t* pScanMngr = (scanMngr_t*)hScanMngr; - TI_UINT8 BSSIndex; - paramInfo_t param; - - - TRACE1( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "scanMngr_getBSSList called, hScanMngr=0x%x.\n", hScanMngr); - /* It looks like it never happens. Anyway decided to check */ - if (pScanMngr->BSSList.numOfEntries > MAX_SIZE_OF_BSS_TRACK_LIST) - { - TRACE2( pScanMngr->hReport, REPORT_SEVERITY_ERROR, - "scanMngr_getBSSList problem. BSSList.numOfEntries=%d exceeds the limit %d\n", - pScanMngr->BSSList.numOfEntries, MAX_SIZE_OF_BSS_TRACK_LIST); - handleRunProblem(PROBLEM_BUF_SIZE_VIOLATION); - /* Returning here a NULL pointer can cause problems because the calling procedures - use the returned pointer without checking it for correctness. */ - pScanMngr->BSSList.numOfEntries = MAX_SIZE_OF_BSS_TRACK_LIST; - } - /* loop on all BSS'es */ - for ( BSSIndex = 0; BSSIndex < pScanMngr->BSSList.numOfEntries; ) - { - /* verify channel validity with the reg domain - for active scan! - (because connection will be attempted on the channel... */ - param.paramType = REGULATORY_DOMAIN_GET_SCAN_CAPABILITIES; - param.content.channelCapabilityReq.band = pScanMngr->BSSList.BSSList[ BSSIndex ].band; - param.content.channelCapabilityReq.scanOption = ACTIVE_SCANNING; - param.content.channelCapabilityReq.channelNum = pScanMngr->BSSList.BSSList[ BSSIndex ].channel; - regulatoryDomain_getParam( pScanMngr->hRegulatoryDomain, ¶m ); - - /* if channel is not valid */ - if ( !param.content.channelCapabilityRet.channelValidity ) - { - /* will replace this entry with one further down the array, if any. Therefore, index is not increased - (because a new entry will be placed in the same index). If this is the last entry - the number of - BSSes will be decreased, and thus the loop will exit */ - scanMngrRemoveBSSListEntry( hScanMngr, BSSIndex ); - } - else - { - BSSIndex++; - } - } - - /* return the BSS list */ - return (bssList_t*)&(pScanMngr->BSSList); -} - -void scanMngr_setNeighborAPs( TI_HANDLE hScanMngr, neighborAPList_t* neighborAPList ) -{ - scanMngr_t* pScanMngr = (scanMngr_t*)hScanMngr; - int neighborAPIndex, currentBSSNeighborIndex; - - TRACE1( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "scanMngr_setNeighborAPs called, hScanMngr=0x%x.\n", hScanMngr); -#ifdef TI_DBG - scanMngrTracePrintNeighborAPsList( hScanMngr, neighborAPList ); -#endif - /* if continuous scan is running, indicate that it shouldn't proceed to next scan (if any) */ - if ( pScanMngr->contScanState != SCAN_CSS_IDLE ) - { - TRACE0( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "scanMngr_setNeighborAPs called, switched to STOPPING state \n"); - - pScanMngr->contScanState = SCAN_CSS_STOPPING; - } - /* It looks like it never happens. Anyway decided to check */ - if ( neighborAPList->numOfEntries > MAX_NUM_OF_NEIGHBOR_APS ) - { - TRACE2( pScanMngr->hReport, REPORT_SEVERITY_ERROR, - "scanMngr_setNeighborAPs. neighborAPList->numOfEntries=%d exceeds the limit %d\n", - neighborAPList->numOfEntries, MAX_NUM_OF_NEIGHBOR_APS); - handleRunProblem(PROBLEM_BUF_SIZE_VIOLATION); - return; - } - /* clear current neighbor APs */ - pScanMngr->neighborAPsDiscoveryList[ RADIO_BAND_2_4_GHZ ].numOfEntries = 0; - pScanMngr->neighborAPsDiscoveryList[ RADIO_BAND_5_0_GHZ ].numOfEntries = 0; - - /* copy new neighbor APs, according to band */ - for ( neighborAPIndex = 0; neighborAPIndex < neighborAPList->numOfEntries; neighborAPIndex++ ) - { - if ( neighborAPList->APListPtr[ neighborAPIndex ].band >= RADIO_BAND_NUM_OF_BANDS ) - { - TRACE3( pScanMngr->hReport, REPORT_SEVERITY_ERROR, - "scanMngr_setNeighborAPs. neighborAPList->APListPtr[ %d ].band=%d exceeds the limit %d\n", - neighborAPIndex, neighborAPList->APListPtr[ neighborAPIndex ].band, RADIO_BAND_NUM_OF_BANDS-1); - handleRunProblem(PROBLEM_BUF_SIZE_VIOLATION); - return; - } - /* insert to appropriate list */ - os_memoryCopy( pScanMngr->hOS, - &(pScanMngr->neighborAPsDiscoveryList[ neighborAPList->APListPtr[ neighborAPIndex ].band ].APListPtr[ pScanMngr->neighborAPsDiscoveryList[ neighborAPList->APListPtr[ neighborAPIndex ].band ].numOfEntries ]), - &(neighborAPList->APListPtr[ neighborAPIndex ]), - sizeof(neighborAP_t)); - - /* if AP is in track list, mark as discovered. This is done only if continuous scan - has already started, to ensure the roaming canidate list holds valid information */ - if ( TI_TRUE == pScanMngr->bContinuousScanStarted ) - { - pScanMngr->neighborAPsDiscoveryList[ neighborAPList->APListPtr[ neighborAPIndex ].band ].trackStatusList[ pScanMngr->neighborAPsDiscoveryList[ neighborAPList->APListPtr[ neighborAPIndex ].band ].numOfEntries ] = - ( -1 == scanMngrGetTrackIndexByBssid( hScanMngr, &(neighborAPList->APListPtr[ neighborAPIndex ].BSSID)) ? - SCAN_NDS_NOT_DISCOVERED : - SCAN_NDS_DISCOVERED ); - } - else - { - /* if continuous scan has not yet started, all AP's are yet to be discovered... */ - pScanMngr->neighborAPsDiscoveryList[ neighborAPList->APListPtr[ neighborAPIndex ].band ].trackStatusList[ pScanMngr->neighborAPsDiscoveryList[ neighborAPList->APListPtr[ neighborAPIndex ].band ].numOfEntries ] = - SCAN_NDS_NOT_DISCOVERED; - } - - /* increase neighbor AP count */ - pScanMngr->neighborAPsDiscoveryList[ neighborAPList->APListPtr[ neighborAPIndex ].band ].numOfEntries++; - } - - /* remove all tracked APs that are designated as neighbor APs, but are not anymore. Policy has not - changed, so there's no need to check APs that are not neighbor APs and were inserted to the BSS - list because they are on a policy defined channel. */ - scanMngrUpdateBSSList( hScanMngr, TI_TRUE, TI_FALSE ); - - /* if current BSS is a neighbor AP, mark it */ - currentBSSNeighborIndex = scanMngrGetNeighborAPIndex( hScanMngr, - pScanMngr->currentBSSBand, - &(pScanMngr->currentBSS)); - if ( -1 != currentBSSNeighborIndex ) - { - pScanMngr->neighborAPsDiscoveryList[ pScanMngr->currentBSSBand ].trackStatusList[ currentBSSNeighborIndex ] = - SCAN_NDS_CURRENT_AP; - } - - /* reset discovery counters */ - pScanMngr->neighborAPsDiscoveryIndex[ RADIO_BAND_2_4_GHZ ] = 0; - pScanMngr->neighborAPsDiscoveryIndex[ RADIO_BAND_5_0_GHZ ] = 0; - pScanMngr->channelDiscoveryIndex[ RADIO_BAND_2_4_GHZ ] = 0; - pScanMngr->channelDiscoveryIndex[ RADIO_BAND_5_0_GHZ ] = 0; - /* set current discovery part to first part (G neighbor APs) */ - pScanMngr->currentDiscoveryPart = SCAN_SDP_NEIGHBOR_G; - /* now advance discovery part */ - scanMngrSetNextDiscoveryPart( hScanMngr ); -} - -void scanMngr_qualityChangeTrigger( TI_HANDLE hScanMngr, TI_BOOL bLowQuality ) -{ - scanMngr_t* pScanMngr = (scanMngr_t*)hScanMngr; - - TRACE1( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "scanMngr_qualityChangeTrigger called, hScanMngr=0x%x, bLowQuality=.\n", hScanMngr); - - /* remember the low quality trigger (in case policy changes, to know which timer interval to use) */ - pScanMngr->bLowQuality = bLowQuality; - - /* This function shouldn't be called when continuous scan is not running */ - if ( TI_FALSE == pScanMngr->bContinuousScanStarted ) - { - TRACE0( pScanMngr->hReport, REPORT_SEVERITY_WARNING, "Quality change trigger when continuous scan is not running.\n"); - } - - /* If the timer is running, stop it and start it again with the new interval */ - if (pScanMngr->bTimerRunning) - { - TI_UINT32 uTimeout = pScanMngr->bLowQuality ? - pScanMngr->scanPolicy.deterioratingScanInterval : - pScanMngr->scanPolicy.normalScanInterval; - - tmr_StopTimer (pScanMngr->hContinuousScanTimer); - - tmr_StartTimer (pScanMngr->hContinuousScanTimer, - scanMngr_GetUpdatedTsfDtimMibForScan, - (TI_HANDLE)pScanMngr, - uTimeout, - TI_TRUE); - } -} - -void scanMngr_handoverDone( TI_HANDLE hScanMngr, TMacAddr* macAddress, ERadioBand band ) -{ - scanMngr_t* pScanMngr = (scanMngr_t*)hScanMngr; - int i, currentBSSNeighborIndex; - - /* mark that TSF values are not synchronized */ - pScanMngr->bSynchronized = TI_FALSE; - - TRACE0( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "scanMngr_handoverDone called\n"); - /* It looks like it never happens. Anyway decided to check */ - if ( pScanMngr->currentBSSBand >= RADIO_BAND_NUM_OF_BANDS ) - { - TRACE2( pScanMngr->hReport, REPORT_SEVERITY_ERROR, - "scanMngr_handoverDone. pScanMngr->currentBSSBand=%d exceeds the limit %d\n", - pScanMngr->currentBSSBand, RADIO_BAND_NUM_OF_BANDS-1); - handleRunProblem(PROBLEM_BUF_SIZE_VIOLATION); - return; - } - if ( pScanMngr->neighborAPsDiscoveryList[ pScanMngr->currentBSSBand ].numOfEntries > MAX_NUM_OF_NEIGHBOR_APS) - { - TRACE3( pScanMngr->hReport, REPORT_SEVERITY_ERROR, - "scanMngr_handoverDone. pScanMngr->neighborAPsDiscoveryList[ %d ].numOfEntries=%d exceeds the limit %d\n", - pScanMngr->currentBSSBand, pScanMngr->neighborAPsDiscoveryList[ pScanMngr->currentBSSBand ].numOfEntries, - MAX_NUM_OF_NEIGHBOR_APS); - handleRunProblem(PROBLEM_BUF_SIZE_VIOLATION); - return; - } - if ( band >= RADIO_BAND_NUM_OF_BANDS ) - { - TRACE2( pScanMngr->hReport, REPORT_SEVERITY_ERROR, - "scanMngr_handoverDone. band=%d exceeds the limit %d\n", - band, RADIO_BAND_NUM_OF_BANDS-1); - handleRunProblem(PROBLEM_BUF_SIZE_VIOLATION); - return; - } - if ( pScanMngr->neighborAPsDiscoveryList[ band ].numOfEntries > MAX_NUM_OF_NEIGHBOR_APS) - { - TRACE3( pScanMngr->hReport, REPORT_SEVERITY_ERROR, - "scanMngr_handoverDone. pScanMngr->neighborAPsDiscoveryList[ %d ].numOfEntries=%d exceeds the limit %d\n", - band, pScanMngr->neighborAPsDiscoveryList[ band ].numOfEntries, MAX_NUM_OF_NEIGHBOR_APS); - handleRunProblem(PROBLEM_BUF_SIZE_VIOLATION); - return; - } - /* if previous AP is in neighbor AP list, mark it as not discoverd */ - currentBSSNeighborIndex = scanMngrGetNeighborAPIndex( hScanMngr, - pScanMngr->currentBSSBand, - &(pScanMngr->currentBSS)); - if ( -1 != currentBSSNeighborIndex ) - { - pScanMngr->neighborAPsDiscoveryList[ pScanMngr->currentBSSBand ].trackStatusList[ currentBSSNeighborIndex ] = - SCAN_NDS_NOT_DISCOVERED; - } - - /* copy new current AP info */ - pScanMngr->currentBSSBand = band; - MAC_COPY (pScanMngr->currentBSS, *macAddress); - - /* if new current AP is a neighbor AP, mark it */ - currentBSSNeighborIndex = scanMngrGetNeighborAPIndex( hScanMngr, band, macAddress ); - if ( -1 != currentBSSNeighborIndex ) - { - pScanMngr->neighborAPsDiscoveryList[ band ].trackStatusList[ currentBSSNeighborIndex ] = - SCAN_NDS_CURRENT_AP; - /* note - no need to update discovery index - when adding neighbor APs the check (whether discovery should - be attempted) is done for every channel! */ - } - - /* if a continuous scan is running, mark that it should stop */ - if ( SCAN_CSS_IDLE != pScanMngr->contScanState ) - { - - TRACE0( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "scanMngr_handoverDone called, switched to STOPPING state \n"); - - pScanMngr->contScanState = SCAN_CSS_STOPPING; - scanCncn_StopScan( pScanMngr->hScanCncn, SCAN_SCC_ROAMING_CONT ); - } - - /* if the new AP is in the track list */ - i = scanMngrGetTrackIndexByBssid( hScanMngr, macAddress ); - if (( i != -1 ) && ( i < MAX_SIZE_OF_BSS_TRACK_LIST)) - { - /* remove it */ - scanMngrRemoveBSSListEntry( hScanMngr, i ); - } -} - -TI_STATUS scanMngr_getParam( TI_HANDLE hScanMngr, paramInfo_t *pParam ) -{ - scanMngr_t* pScanMngr = (scanMngr_t*)hScanMngr; - - TRACE2( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "scanMngr_getParam called, hScanMngr=0x%x, pParam=0x%x\n", hScanMngr, pParam); - - /* act according to parameter type */ - switch ( pParam->paramType ) - { - case SCAN_MNGR_BSS_LIST_GET: - os_memoryCopy(pScanMngr->hOS, pParam->content.pScanBssList, scanMngr_getBSSList( hScanMngr ), sizeof(bssList_t)); - break; - - default: - TRACE1( pScanMngr->hReport, REPORT_SEVERITY_ERROR, "Scan manager getParam called with param type %d.\n", pParam->paramType); - return PARAM_NOT_SUPPORTED; -/* break; - unreachable */ - } - - return TI_OK; -} - - - - - - -TI_STATUS scanMngr_setParam( TI_HANDLE hScanMngr, paramInfo_t *pParam ) -{ - scanMngr_t* pScanMngr = (scanMngr_t*)hScanMngr; - - TRACE3( pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "scanMngr_setParam called, hScanMngr=0x%x, pParam=0x%x, pParam->paramType=%d\n", hScanMngr, pParam, pParam->paramType); - - /* act according to parameter type */ - switch ( pParam->paramType ) - { - case SCAN_MNGR_SET_CONFIGURATION: - scanMngr_setScanPolicy( hScanMngr, pParam->content.pScanPolicy); - break; - - default: - TRACE1( pScanMngr->hReport, REPORT_SEVERITY_ERROR, "Set param, Params is not supported:%d\n", pParam->paramType); - return PARAM_NOT_SUPPORTED; - } - - return TI_OK; -} - - -/** - * \fn scanMngr_SetDefaults - * \brief Set default values to the Scan Manager - * - * \param hScanMngr - handle to the SME object - * \param pInitParams - values read from registry / ini file - * \return None - */ -void scanMngr_SetDefaults (TI_HANDLE hScanMngr, TRoamScanMngrInitParams *pInitParams) -{ - scanMngr_t* pScanMngr = (scanMngr_t*)hScanMngr; - TScanPolicy defaultScanPolicy; - paramInfo_t *pParam; - int i; - - WLAN_OS_REPORT(("pInitParams->RoamingScanning_2_4G_enable %d \n",pInitParams->RoamingScanning_2_4G_enable )); - - pParam = os_memoryAlloc(pScanMngr->hOS, sizeof(paramInfo_t)); - if (!pParam) - { - return; - } - - if (pInitParams->RoamingScanning_2_4G_enable) - { - /* Configure default scan policy for 2.4G */ - defaultScanPolicy.normalScanInterval = 10000; - defaultScanPolicy.deterioratingScanInterval = 5000; - defaultScanPolicy.maxTrackFailures = 3; - defaultScanPolicy.BSSListSize = 4; - defaultScanPolicy.BSSNumberToStartDiscovery = 1; - defaultScanPolicy.numOfBands = 1; - - defaultScanPolicy.bandScanPolicy[0].band = RADIO_BAND_2_4_GHZ; - defaultScanPolicy.bandScanPolicy[0].rxRSSIThreshold = -80; - defaultScanPolicy.bandScanPolicy[0].numOfChannlesForDiscovery = 3; - defaultScanPolicy.bandScanPolicy[0].numOfChannles = 14; - - for ( i = 0; i < 14; i++ ) - { - defaultScanPolicy.bandScanPolicy[0].channelList[ i ] = i + 1; - } - - defaultScanPolicy.bandScanPolicy[0].trackingMethod.scanType = SCAN_TYPE_NO_SCAN; - defaultScanPolicy.bandScanPolicy[ 0 ].trackingMethod.method.basicMethodParams.earlyTerminationEvent = SCAN_ET_COND_DISABLE; - defaultScanPolicy.bandScanPolicy[ 0 ].trackingMethod.method.basicMethodParams.ETMaxNumberOfApFrames = 0; - defaultScanPolicy.bandScanPolicy[ 0 ].trackingMethod.method.basicMethodParams.maxChannelDwellTime = 0; - defaultScanPolicy.bandScanPolicy[ 0 ].trackingMethod.method.basicMethodParams.minChannelDwellTime = 0; - - defaultScanPolicy.bandScanPolicy[ 0 ].trackingMethod.method.basicMethodParams.probReqParams.bitrate = (ERateMask)RATE_MASK_UNSPECIFIED; /* Let the FW select */ - defaultScanPolicy.bandScanPolicy[ 0 ].trackingMethod.method.basicMethodParams.probReqParams.numOfProbeReqs = 0; - defaultScanPolicy.bandScanPolicy[ 0 ].trackingMethod.method.basicMethodParams.probReqParams.txPowerDbm = 0; - - defaultScanPolicy.bandScanPolicy[0].discoveryMethod.scanType = SCAN_TYPE_NO_SCAN; - defaultScanPolicy.bandScanPolicy[ 0 ].discoveryMethod.method.basicMethodParams.earlyTerminationEvent = SCAN_ET_COND_DISABLE; - defaultScanPolicy.bandScanPolicy[ 0 ].discoveryMethod.method.basicMethodParams.ETMaxNumberOfApFrames = 0; - defaultScanPolicy.bandScanPolicy[ 0 ].discoveryMethod.method.basicMethodParams.maxChannelDwellTime = 0; - defaultScanPolicy.bandScanPolicy[ 0 ].discoveryMethod.method.basicMethodParams.minChannelDwellTime = 0; - defaultScanPolicy.bandScanPolicy[ 0 ].discoveryMethod.method.basicMethodParams.probReqParams.bitrate = (ERateMask)RATE_MASK_UNSPECIFIED; /* Let the FW select */ - defaultScanPolicy.bandScanPolicy[ 0 ].discoveryMethod.method.basicMethodParams.probReqParams.numOfProbeReqs = 0; - defaultScanPolicy.bandScanPolicy[ 0 ].discoveryMethod.method.basicMethodParams.probReqParams.txPowerDbm = 0; - - defaultScanPolicy.bandScanPolicy[0].immediateScanMethod.scanType = SCAN_TYPE_NORMAL_ACTIVE; - defaultScanPolicy.bandScanPolicy[0].immediateScanMethod.method.basicMethodParams.maxChannelDwellTime = 30000; - defaultScanPolicy.bandScanPolicy[0].immediateScanMethod.method.basicMethodParams.minChannelDwellTime = 15000; - defaultScanPolicy.bandScanPolicy[0].immediateScanMethod.method.basicMethodParams.earlyTerminationEvent = SCAN_ET_COND_DISABLE; - defaultScanPolicy.bandScanPolicy[0].immediateScanMethod.method.basicMethodParams.ETMaxNumberOfApFrames = 0; - defaultScanPolicy.bandScanPolicy[0].immediateScanMethod.method.basicMethodParams.probReqParams.numOfProbeReqs = 3; - defaultScanPolicy.bandScanPolicy[0].immediateScanMethod.method.basicMethodParams.probReqParams.bitrate = (ERateMask)4;//RATE_MASK_UNSPECIFIED; /* Let the FW select */ - defaultScanPolicy.bandScanPolicy[0].immediateScanMethod.method.basicMethodParams.probReqParams.txPowerDbm = MAX_TX_POWER; - - pParam->paramType = SCAN_MNGR_SET_CONFIGURATION; - - /* scanMngr_setParam() copy the content and not the pointer */ - pParam->content.pScanPolicy = &defaultScanPolicy; - pParam->paramLength = sizeof(TScanPolicy); - - scanMngr_setParam (hScanMngr, pParam); - } - - os_memoryFree(pScanMngr->hOS, pParam, sizeof(paramInfo_t)); -} -/** -* -* scanMngr_startManual API -* -* Description: -* -* save the manual scan params later to be used upon the scan concentrator object -* and change the conn status to connected -* -* ARGS: -* hScanMngr - Scan manager handle \n -* -* RETURNS: -* void -*/ -void scanMngr_startManual(TI_HANDLE hScanMngr) -{ - scanMngr_t* pScanMngr = (scanMngr_t*)hScanMngr; - - pScanMngr->scanningOperationalMode = SCANNING_OPERATIONAL_MODE_MANUAL; - pScanMngr->connStatus = CONNECTION_STATUS_CONNECTED; - - scanMngr_setManualScanDefaultParams(hScanMngr); - TRACE0(pScanMngr->hReport,REPORT_SEVERITY_INFORMATION, "scanMngr_startManual() called. \n"); - - /* get policies by band */ - scanMngrGetPolicyByBand( hScanMngr, RADIO_BAND_2_4_GHZ ); /* TODO: check if neccessary!!!*/ -} - -/** -* -* scanMngr_stopManual API -* -* Description: -* -* set the connection status to NOT_CONNECTED -* -* ARGS: -* hScanMngr - Scan manager handle \n -* pTargetAp - the target AP to connect with info. -* -* RETURNS: -* void -*/ -void scanMngr_stopManual(TI_HANDLE hScanMngr) -{ - scanMngr_t* pScanMngr = (scanMngr_t*)hScanMngr; - pScanMngr->connStatus = CONNECTION_STATUS_NOT_CONNECTED; -} - -/** -* -* scanMngr_setManualScanChannelList API -* -* Description: -* -* save the channel list received form the application. -* -* ARGS: -* hScanMngr - Scan manager handle \n -* pTargetAp - the target AP to connect with info. -* -* RETURNS: -* TI_OK -*/ -TI_STATUS scanMngr_setManualScanChannelList (TI_HANDLE hScanMngr, channelList_t* pChannelList) -{ - scanMngr_t* pScanMngr = (scanMngr_t*)hScanMngr; - - pScanMngr->manualScanParams.numOfChannels = pChannelList->numOfChannels; - os_memoryCopy(pScanMngr->hOS, - (void*)&pScanMngr->manualScanParams.channelEntry[0], - &pChannelList->channelEntry[0], - pChannelList->numOfChannels * sizeof(TScanChannelEntry)); - - return TI_OK; -} - -/** -* -* scanMngr_Start1ShotScan API -* -* Description: -* -* send the required scan params to the scan concentartor module -* according to the scanning manual mode. -* -* ARGS: -* hScanMngr - scan manager handle \n -* eClient - the client that requests this scan command. -* -* RETURNS: -* EScanCncnResultStatus - the scan concentrator result -*/ -EScanCncnResultStatus scanMngr_Start1ShotScan (TI_HANDLE hScanMngr, EScanCncnClient eClient) -{ - scanMngr_t* pScanMngr = (scanMngr_t*)hScanMngr; - TScanParams* pScanParams; - EScanCncnResultStatus status; - - TRACE2(pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "scanMngr_Start1ShotScan started... .Operational mode: %d, ScanClient=%d. \n", - pScanMngr->scanningOperationalMode, eClient); - - if(SCANNING_OPERATIONAL_MODE_AUTO == pScanMngr->scanningOperationalMode) - { - pScanParams = &(pScanMngr->scanParams); - } - else - { - pScanParams = &(pScanMngr->manualScanParams); /* the scan params that were previously saved in the scanMngr_startManual()*/ - } - - status = scanCncn_Start1ShotScan(pScanMngr->hScanCncn, eClient, pScanParams); - return status; -} - -/** -* -* scanMngr_immediateScanComplete API -* -* Description: -* -* called upon the immediate scan complete (manual or auto), - and call the roaming manager to handle this callback. -* -* ARGS: -* hScanMngr - Scan manager handle \n -* scanCmpltStatus - the scan complete status -* -* RETURNS: -* EScanCncnResultStatus - the scan concentrator result -*/ -TI_STATUS scanMngr_immediateScanComplete(TI_HANDLE hScanMngr, scan_mngrResultStatus_e scanCmpltStatus) -{ - scanMngr_t* pScanMngr = (scanMngr_t*)hScanMngr; - - if(SCANNING_OPERATIONAL_MODE_AUTO == pScanMngr->scanningOperationalMode) - { - roamingMngr_immediateScanComplete(pScanMngr->hRoamingMngr, scanCmpltStatus); - } - else - { - scanMngr_reportImmediateScanResults(hScanMngr, SCAN_MRS_SCAN_COMPLETE_OK); - roamingMngr_immediateScanByAppComplete(pScanMngr->hRoamingMngr, scanCmpltStatus); - } - return TI_OK; -} - - -/** -* -* scanMngr_reportImmediateScanResults API -* -* Description: -* -* report the immediate scan results to the application -* -* ARGS: -* hScanMngr - Scan manager handle \n -* scanCmpltStatus - the scan complete status -* -* RETURNS: -* EScanCncnResultStatus - the scan concentrator result -*/ -TI_STATUS scanMngr_reportImmediateScanResults(TI_HANDLE hScanMngr, scan_mngrResultStatus_e scanCmpltStatus) -{ - scanMngr_t* pScanMngr = (scanMngr_t*)hScanMngr; - bssList_t *pListOfAPs; - - - if (scanCmpltStatus == SCAN_MRS_SCAN_COMPLETE_OK) - { - TRACE0(pScanMngr->hReport, REPORT_SEVERITY_INFORMATION ,"scanMngr_reportImmediateScanResults(): reporting scan results to App \n"); - pListOfAPs = scanMngr_getBSSList(hScanMngr); - EvHandlerSendEvent(pScanMngr->hEvHandler, IPC_EVENT_IMMEDIATE_SCAN_REPORT, (TI_UINT8*)pListOfAPs, sizeof(bssList_t)); - } - else - { - TRACE1(pScanMngr->hReport, REPORT_SEVERITY_ERROR, "scanMngr_reportImmediateScanResults was not completed successfully. status: %d\n", scanCmpltStatus); - return TI_NOK; - } - - return TI_OK; -} - - -/** -* -* scanMngr_startContinuousScanByApp API -* -* Description: -* -* start continuous scan by application -* -* ARGS: -* hScanMngr - Scan manager handle \n -* pChannelList - the channel list to scan -* -* RETURNS: -* TI_OK - if connected, if not returns TI_NOK -*/ -TI_STATUS scanMngr_startContinuousScanByApp (TI_HANDLE hScanMngr, channelList_t* pChannelList) -{ - scanMngr_t* pScanMngr = (scanMngr_t*)hScanMngr; - bssEntry_t *pCurBssEntry; - - scanMngr_setManualScanDefaultParams(hScanMngr); - - TRACE1(pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "scanMngr_startContinuousScanByApp().pScanMngr->connStatus = %d \n", pScanMngr->connStatus); - - if (CONN_STATUS_CONNECTED == pScanMngr->connStatus) - { - scanMngr_setManualScanChannelList(hScanMngr,pChannelList); - pCurBssEntry = apConn_getBSSParams(pScanMngr->hAPConnection); - scanMngr_startContScan(hScanMngr, &pCurBssEntry->BSSID, pCurBssEntry->band); - } - else - { - TRACE1( pScanMngr->hReport, REPORT_SEVERITY_ERROR, "scanMngr_startContinuousScanByApp failed. connection status %d\n", pScanMngr->connStatus); - return TI_NOK; - } - - return TI_OK; -} - -/** -* -* scanMngr_stopContinuousScanByApp API -* -* Description: -* -* stop the continuous scan already started by and reoprt to application -* -* ARGS: -* hScanMngr - Scan manager handle \n -* -* RETURNS: -* TI_OK - always -*/ -TI_STATUS scanMngr_stopContinuousScanByApp (TI_HANDLE hScanMngr) -{ - scanMngr_t* pScanMngr = (scanMngr_t*)hScanMngr; - - TRACE0(pScanMngr->hReport, REPORT_SEVERITY_INFORMATION, "scanMngr_stopContinuousScanByApp(). call scanMngr_stopContScan() \n"); - scanMngr_stopContScan(hScanMngr); - scanMngr_reportContinuousScanResults(hScanMngr,SCAN_CRS_SCAN_COMPLETE_OK); - return TI_OK; -} - - - - - -#ifdef TI_DBG -/** - * \\n - * \date 26-May-2005\n - * \brief Print scan manager statistics.\n - * - * Function Scope \e Public.\n - * \param hScanMngr - handle to the scan manager object.\n - */ -void scanMngr_statsPrint( TI_HANDLE hScanMngr ) -{ - scanMngr_t* pScanMngr = (scanMngr_t*)hScanMngr; - - WLAN_OS_REPORT(("-------------- Scan Manager Statistics ---------------\n")); - WLAN_OS_REPORT(("Discovery scans on G result histogram:\n")); - scanMngrStatsPrintScanResultHistogram( pScanMngr->stats.DiscoveryGByStatus ); - WLAN_OS_REPORT(("\nDiscovery scans on A result histogram:\n")); - scanMngrStatsPrintScanResultHistogram( pScanMngr->stats.DiscoveryAByStatus ); - WLAN_OS_REPORT(("\nTracking scans on G result histogram:\n")); - scanMngrStatsPrintScanResultHistogram( pScanMngr->stats.TrackingGByStatus ); - WLAN_OS_REPORT(("\nTracking scans on A result histogram:\n")); - scanMngrStatsPrintScanResultHistogram( pScanMngr->stats.TrackingAByStatus ); - WLAN_OS_REPORT(("\nImmediate scans on G result histogram:\n")); - scanMngrStatsPrintScanResultHistogram( pScanMngr->stats.ImmediateGByStatus ); - WLAN_OS_REPORT(("\nImmediate scans on A result histogram:\n")); - scanMngrStatsPrintScanResultHistogram( pScanMngr->stats.ImmediateAByStatus ); - WLAN_OS_REPORT(("\nTrack fail count histogram:\n")); - scanMngrStatsPrintTrackFailHistogrsm( pScanMngr->stats.ConsecutiveTrackFailCountHistogram ); - WLAN_OS_REPORT(("Frames received:%d, frames discarded low RSSI:%d, frames discarded other:%d\n", - pScanMngr->stats.receivedFrames, pScanMngr->stats.discardedFramesLowRSSI, - pScanMngr->stats.discardedFramesOther)); - WLAN_OS_REPORT(("\nSPS channels not attened histogram:\n")); - scanMngrStatsPrintSPSChannelsHistogram( pScanMngr->stats.SPSChannelsNotAttended ); - WLAN_OS_REPORT(("\nSPS attempts changed due to DTIM collision:%d, APs removed due to DTIM overlap: %d\n", - pScanMngr->stats.SPSSavedByDTIMCheck, pScanMngr->stats.APsRemovedDTIMOverlap)); - WLAN_OS_REPORT(("APs removed due to invalid channel: %d\n", pScanMngr->stats.APsRemovedInvalidChannel)); -} - -/** - * \\n - * \date 26-May-2005\n - * \brief Print scan result histogram statistics.\n - * - * Function Scope \e Private.\n - * \param scanResultHistogram - Scan results histogram (by scan complete reason).\n - */ -void scanMngrStatsPrintScanResultHistogram( TI_UINT32 scanResultHistogram[] ) -{ - WLAN_OS_REPORT(("Complete TI_OK failed stopped TSF error FW reset aborted\n")); - WLAN_OS_REPORT(("%-6d %-5d %-5d %-5d %-5d %-5d\n", - scanResultHistogram[ SCAN_CRS_SCAN_COMPLETE_OK ], - scanResultHistogram[ SCAN_CRS_SCAN_FAILED ], - scanResultHistogram[ SCAN_CRS_SCAN_STOPPED ], - scanResultHistogram[ SCAN_CRS_TSF_ERROR ], - scanResultHistogram[ SCAN_CRS_SCAN_ABORTED_FW_RESET ], - scanResultHistogram[ SCAN_CRS_SCAN_ABORTED_HIGHER_PRIORITY ])); -} - -/** - * \\n - * \date 26-May-2005\n - * \brief Print track fail count histogram statistics.\n - * - * Function Scope \e Private.\n - * \param trackFailHistogram - tracking failure histogram (by tracking retry).\n - */ -void scanMngrStatsPrintTrackFailHistogrsm( TI_UINT32 trackFailHistogram[] ) -{ - WLAN_OS_REPORT(("Attempts: 0 1 2 3 4\n")); - WLAN_OS_REPORT((" %-6d %-6d %-6d %-6d %-6d\n\n", - trackFailHistogram[0], trackFailHistogram[1],trackFailHistogram[2], - trackFailHistogram[3], trackFailHistogram[4])); - WLAN_OS_REPORT(("Attempts: 5 6 7 8 9 or more\n")); - WLAN_OS_REPORT((" %-6d %-6d %-6d %-6d %-6d\n\n", - trackFailHistogram[5], trackFailHistogram[6],trackFailHistogram[7], - trackFailHistogram[8],trackFailHistogram[9])); -} - -/** - * \\n - * \date 24-July-2005\n - * \brief Print SPS attendant channel histogram statistics.\n - * - * Function Scope \e Private.\n - * \param SPSChannelsNotAttendedHistogram - SPS channels attendant histogram.\n - */ -void scanMngrStatsPrintSPSChannelsHistogram( TI_UINT32 SPSChannelsNotAttendedHistogram[] ) -{ - WLAN_OS_REPORT(("Channel index: 0 1 2 3\n")); - WLAN_OS_REPORT((" %-6d %-6d %-6d %-6d\n\n", - SPSChannelsNotAttendedHistogram[ 0 ], SPSChannelsNotAttendedHistogram[ 1 ], - SPSChannelsNotAttendedHistogram[ 2 ], SPSChannelsNotAttendedHistogram[ 3 ])); - WLAN_OS_REPORT(("Channel index: 4 5 6 7\n")); - WLAN_OS_REPORT((" %-6d %-6d %-6d %-6d\n\n", - SPSChannelsNotAttendedHistogram[ 4 ], SPSChannelsNotAttendedHistogram[ 5 ], - SPSChannelsNotAttendedHistogram[ 6 ], SPSChannelsNotAttendedHistogram[ 7 ])); - WLAN_OS_REPORT(("Channel index: 8 9 10 11\n")); - WLAN_OS_REPORT((" %-6d %-6d %-6d %-6d\n\n", - SPSChannelsNotAttendedHistogram[ 8 ], SPSChannelsNotAttendedHistogram[ 9 ], - SPSChannelsNotAttendedHistogram[ 10 ], SPSChannelsNotAttendedHistogram[ 11 ])); - WLAN_OS_REPORT(("Channel index: 12 13 14 15\n")); - WLAN_OS_REPORT((" %-6d %-6d %-6d %-6d\n\n", - SPSChannelsNotAttendedHistogram[ 12 ], SPSChannelsNotAttendedHistogram[ 13 ], - SPSChannelsNotAttendedHistogram[ 14 ], SPSChannelsNotAttendedHistogram[ 15 ])); -} - -/** - * \\n - * \date 26-May-2005\n - * \brief Reset scan manager statistics.\n - * - * Function Scope \e Public.\n - * \param hScanMngr - handle to the scan manager object.\n - */ -void scanMngr_statsReset( TI_HANDLE hScanMngr ) -{ - scanMngr_t* pScanMngr = (scanMngr_t*)hScanMngr; - - os_memoryZero( pScanMngr->hOS, &(pScanMngr->stats), sizeof(scan_mngrStat_t)); -} - -/** - * \\n - * \date 25-July-2005\n - * \brief Print Neighbor AP list.\n - * - * Function Scope \e Public.\n - * \param hScanMngr - Handle to the scan manager object.\n - */ -void scanMngrDebugPrintNeighborAPList( TI_HANDLE hScanMngr ) -{ - scanMngr_t* pScanMngr = (scanMngr_t*)hScanMngr; - int i,j; - - WLAN_OS_REPORT(("-------------- Scan Manager Neighbor APs List ---------------\n")); - for ( i = 0; i < RADIO_BAND_NUM_OF_BANDS; i++ ) - { - WLAN_OS_REPORT(("Neighbor AP list for band:%d\n", i)); - if ( 0 == pScanMngr->neighborAPsDiscoveryList[ i ].numOfEntries ) - { - WLAN_OS_REPORT(("Neighbor AP list is empty.\n")); - continue; /* to next band */ - } - WLAN_OS_REPORT(("%-17s %-4s %-7s %-30s\n", "BSSID", "Band", "Channel", "Discovery state")); - WLAN_OS_REPORT(("------------------------------------------------------\n")); - for ( j = 0; j < pScanMngr->neighborAPsDiscoveryList[ i ].numOfEntries; j++ ) - { - scanMngrDebugPrintNeighborAP( &(pScanMngr->neighborAPsDiscoveryList[ i ].APListPtr[ j ]), - pScanMngr->neighborAPsDiscoveryList[ i ].trackStatusList[ j ] ); - } - } -} - -/** - * \\n - * \date 25-July-2005\n - * \brief Print One neighbor AP entry.\n - * - * Function Scope \e Private.\n - * \param pNeighborAp - pointer to the neighbor AP data.\n - * \param discovery state - the discovery state of this neighbor AP.\n - */ -void scanMngrDebugPrintNeighborAP( neighborAP_t* pNeighborAp, scan_neighborDiscoveryState_e discoveryState ) -{ - WLAN_OS_REPORT(("%02x:%02x:%02x:%02x:%02x:%02x %-4d %-7d %-30s\n", - pNeighborAp->BSSID[ 0 ], pNeighborAp->BSSID[ 1 ], pNeighborAp->BSSID[ 2 ], - pNeighborAp->BSSID[ 3 ], pNeighborAp->BSSID[ 4 ], pNeighborAp->BSSID[ 5 ], - pNeighborAp->band, pNeighborAp->channel, neighborDiscovreyStateDesc[ discoveryState ])); -} - -/** - * \\n - * \date 27-July-2005\n - * \brief Prints a scan command.\n - * - * Function Scope \e Private.\n - * \param pScanParams - a pointer to the scan parameters structure.\n - */ -void scanMngrDebugPrintScanCommand( TScanParams* pScanParams ) -{ - int i; - - if ( 0 == pScanParams->numOfChannels ) - { - WLAN_OS_REPORT(("Invalid scan command.\n")); - return; - } - /* It looks like it never happens. Anyway decided to check */ - if ( pScanParams->numOfChannels > SCAN_MAX_NUM_OF_NORMAL_CHANNELS_PER_COMMAND) - { - WLAN_OS_REPORT(("scanMngrDebugPrintScanCommand. pScanParams->numOfChannels=%d exceeds the limit %d\n", - pScanParams->numOfChannels, SCAN_MAX_NUM_OF_NORMAL_CHANNELS_PER_COMMAND)); - handleRunProblem(PROBLEM_BUF_SIZE_VIOLATION); - return; - } - WLAN_OS_REPORT(("Scan type: %s, band: %d\n", scanTypeDesc[ pScanParams->scanType ], pScanParams->band)); - - switch (pScanParams->scanType) - { - case SCAN_TYPE_NORMAL_ACTIVE: - WLAN_OS_REPORT(("Probe request number:%d, rate:%x, TX level:%d\n", - pScanParams->probeReqNumber, pScanParams->probeRequestRate)); - /* break is missing on purpose!!! */ - - case SCAN_TYPE_NORMAL_PASSIVE: - WLAN_OS_REPORT(("SSID: %s\n", pScanParams->desiredSsid)); - WLAN_OS_REPORT(("%-4s %-17s %-17s %-20s %-8s %-14s %-14s\n", "Chnl", "BSSID", "Early ter. event", - "Early ter. frame num", "TX level", "Max dwell time", "Min dwell time")); - WLAN_OS_REPORT(("------------------------------------------------------------------------------------------------------\n")); - for ( i = 0; i < pScanParams->numOfChannels; i++ ) - { - scanMngrDebugPrintNormalChannelParam( &(pScanParams->channelEntry[ i ].normalChannelEntry)); - } - break; - - case SCAN_TYPE_TRIGGERED_ACTIVE: - WLAN_OS_REPORT(("Probe request number:%d, rate:%x, TX level:%d\n", - pScanParams->probeReqNumber, pScanParams->probeRequestRate )); - /* break is missing on purpose!!! */ - - case SCAN_TYPE_TRIGGERED_PASSIVE: - WLAN_OS_REPORT(("SSID: %s, Tid: %d\n", pScanParams->desiredSsid, pScanParams->Tid)); - WLAN_OS_REPORT(("%-4s %-17s %-17s %-20s %-8s %-14s %-14s\n", "Chnl", "BSSID", "Early ter. event", - "Early ter. frame num", "TX level", "Max dwell time", " Min dwell time")); - WLAN_OS_REPORT(("------------------------------------------------------------------------------------------------------\n")); - for ( i = 0; i < pScanParams->numOfChannels; i++ ) - { - scanMngrDebugPrintNormalChannelParam( &(pScanParams->channelEntry[ i ].normalChannelEntry)); - } - break; - - case SCAN_TYPE_SPS: - WLAN_OS_REPORT(("Total scan duration (for scan timer): %d, latest TSF value: %x-%x\n", - pScanParams->SPSScanDuration, - INT64_HIGHER(pScanParams->latestTSFValue), INT64_LOWER(pScanParams->latestTSFValue))); - WLAN_OS_REPORT(("%-4s %-17s %-17s %-7s %-16s %-20s\n", "Chnl", "BSSID", "Start time (TSF)", "Duration", - "Early ter. event", "Early ter. frame num")); - WLAN_OS_REPORT(("---------------------------------------------------------------------------------------\n")); - for ( i = 0; i < pScanParams->numOfChannels; i++ ) - { - scanMngrDebugPrintSPSChannelParam( &(pScanParams->channelEntry[ i ].SPSChannelEntry)); - } - break; - - case SCAN_TYPE_NO_SCAN: - default: - WLAN_OS_REPORT(("Invalid scan type: %d\n", pScanParams->scanType)); - break; - } - -} - -/** - * \\n - * \date 27-July-2005\n - * \brief Prints scan command single normal channel.\n - * - * Function Scope \e Private.\n - * \param pNormalChannel - a pointer to the normal channel to print.\n - */ -void scanMngrDebugPrintNormalChannelParam( TScanNormalChannelEntry* pNormalChannel ) -{ - WLAN_OS_REPORT(("%-4d %02x:%02x:%02x:%02x:%02x:%02x %-17s %-20d %-8d %-14d %-14d\n", pNormalChannel->channel, - pNormalChannel->bssId[ 0 ], pNormalChannel->bssId[ 1 ], pNormalChannel->bssId[ 2 ], - pNormalChannel->bssId[ 3 ], pNormalChannel->bssId[ 4 ], pNormalChannel->bssId[ 5 ], - earlyTerminationDesc[ pNormalChannel->earlyTerminationEvent >> 8 ], - pNormalChannel->ETMaxNumOfAPframes, pNormalChannel->txPowerDbm, - pNormalChannel->minChannelDwellTime, pNormalChannel->maxChannelDwellTime)); -} - -/** - * \\n - * \date 27-July-2005\n - * \brief Prints scan command single SPS channel.\n - * - * Function Scope \e Private.\n - * \param pSPSChannel - a pointer to the SPS channel to print.\n - */ -void scanMngrDebugPrintSPSChannelParam( TScanSpsChannelEntry* pSPSChannel ) -{ - WLAN_OS_REPORT(("%-4d %02x:%02x:%02x:%02x:%02x:%02x %8x-%8x %-7d %-16s %-3d\n", - pSPSChannel->channel, pSPSChannel->bssId[ 0 ], pSPSChannel->bssId[ 1 ], - pSPSChannel->bssId[ 2 ], pSPSChannel->bssId[ 3 ], pSPSChannel->bssId[ 4 ], - pSPSChannel->bssId[ 5 ], INT64_HIGHER(pSPSChannel->scanStartTime), - INT64_LOWER(pSPSChannel->scanStartTime), pSPSChannel->scanDuration, - earlyTerminationDesc[ pSPSChannel->earlyTerminationEvent >> 8 ], pSPSChannel->ETMaxNumOfAPframes)); -} - -/** - * \\n - * \date 25-July-2005\n - * \brief Prints all data in the scan manager object.\n - * - * Function Scope \e Public.\n - * \param hScanMngr - handle to the scan manager object.\n - */ -void scanMngrDebugPrintObject( TI_HANDLE hScanMngr ) -{ - scanMngr_t* pScanMngr = (scanMngr_t*)hScanMngr; - - WLAN_OS_REPORT(("-------------- Scan Manager Object Dump ---------------\n")); - WLAN_OS_REPORT(("Continuous scan timer running: %s, Continuous scan started:%s\n", - booleanDesc[ pScanMngr->bTimerRunning ], booleanDesc[ pScanMngr->bContinuousScanStarted ])); - WLAN_OS_REPORT(("Current BSS in low quality: %s, AP TSF synchronized: %s\n", - booleanDesc[ pScanMngr->bLowQuality ], booleanDesc[ pScanMngr->bSynchronized ])); - WLAN_OS_REPORT(("Continuous scan state: %s, Immediate scan state: %s\n", - contScanStatesDesc[ pScanMngr->contScanState ], immedScanStatesDesc[ pScanMngr->immedScanState ])); - WLAN_OS_REPORT(("Discovery part: %s, G channels discovery Index: %d, A channels discovery index: %d\n", - discoveryPartDesc[ pScanMngr->currentDiscoveryPart ], - pScanMngr->channelDiscoveryIndex[ RADIO_BAND_2_4_GHZ ], - pScanMngr->channelDiscoveryIndex[ RADIO_BAND_5_0_GHZ ])); - WLAN_OS_REPORT(("G neighbor APs discovery index: %d, A neighbor APs discovery index: %d\n", - pScanMngr->neighborAPsDiscoveryIndex[ RADIO_BAND_2_4_GHZ ], - pScanMngr->neighborAPsDiscoveryIndex[ RADIO_BAND_5_0_GHZ ])); - WLAN_OS_REPORT(("Current BSS MAC: %02x:%02x:%02x:%02x:%02x:%02x, Current BSS band: %d\n", - pScanMngr->currentBSS[ 0 ], pScanMngr->currentBSS[ 1 ], pScanMngr->currentBSS[ 2 ], - pScanMngr->currentBSS[ 3 ], pScanMngr->currentBSS[ 4 ], pScanMngr->currentBSS[ 5 ], - pScanMngr->currentBSSBand)); - WLAN_OS_REPORT(("Last beacon DTIM count:%d, TSF:%x-%x\n", - pScanMngr->lastLocalBcnDTIMCount, - INT64_HIGHER(pScanMngr->currentTSF), INT64_LOWER(pScanMngr->currentTSF))); - WLAN_OS_REPORT(("-------------- Scan Manager Policy ---------------\n")); - scanMngrTracePrintScanPolicy( &(pScanMngr->scanPolicy)); - WLAN_OS_REPORT(("-------------- Scan Manager BSS List ---------------\n")); - scanMngrDebugPrintBSSList( hScanMngr ); - scanMngrDebugPrintNeighborAPList( hScanMngr ); - scanMngr_statsPrint( hScanMngr ); - WLAN_OS_REPORT(("New BSS found during last discovery:%s, Number of scan cycles during which no new AP was found: %d\n", - booleanDesc[ pScanMngr->bNewBSSFound ], pScanMngr->consecNotFound)); - WLAN_OS_REPORT(("Scan for neighbor APs only at last immediate scan: %s\n", - booleanDesc[ pScanMngr->bImmedNeighborAPsOnly ])); - WLAN_OS_REPORT(("-------------- Last issued scan command ---------------\n")); - scanMngrDebugPrintScanCommand( &(pScanMngr->scanParams)); - WLAN_OS_REPORT(("-------------- Handles ---------------\n")); - WLAN_OS_REPORT(("Continuous scan timer: %x, OS:% x, Reg. domain: %x\n", - pScanMngr->hContinuousScanTimer, pScanMngr->hOS, pScanMngr->hRegulatoryDomain)); - WLAN_OS_REPORT(("Report: %x, Roaming manager: %x, Scan concentrator: %x\n", - pScanMngr->hReport, pScanMngr->hRoamingMngr, pScanMngr->hScanCncn)); -} - -#endif /* TI_DBG */ |