164064216a8433360745f69edddce19a606659163The Android Open Source Project/** \file ScanCncn.c
264064216a8433360745f69edddce19a606659163The Android Open Source Project *  \brief This file include the scan concentrator module implementation
364064216a8433360745f69edddce19a606659163The Android Open Source Project *  \author Ronen Kalish
464064216a8433360745f69edddce19a606659163The Android Open Source Project *  \date 03-Jan-2005
564064216a8433360745f69edddce19a606659163The Android Open Source Project */
664064216a8433360745f69edddce19a606659163The Android Open Source Project/****************************************************************************
764064216a8433360745f69edddce19a606659163The Android Open Source Project**+-----------------------------------------------------------------------+**
864064216a8433360745f69edddce19a606659163The Android Open Source Project**|                                                                       |**
964064216a8433360745f69edddce19a606659163The Android Open Source Project**| Copyright(c) 1998 - 2008 Texas Instruments. All rights reserved.      |**
1064064216a8433360745f69edddce19a606659163The Android Open Source Project**| All rights reserved.                                                  |**
1164064216a8433360745f69edddce19a606659163The Android Open Source Project**|                                                                       |**
1264064216a8433360745f69edddce19a606659163The Android Open Source Project**| Redistribution and use in source and binary forms, with or without    |**
1364064216a8433360745f69edddce19a606659163The Android Open Source Project**| modification, are permitted provided that the following conditions    |**
1464064216a8433360745f69edddce19a606659163The Android Open Source Project**| are met:                                                              |**
1564064216a8433360745f69edddce19a606659163The Android Open Source Project**|                                                                       |**
1664064216a8433360745f69edddce19a606659163The Android Open Source Project**|  * Redistributions of source code must retain the above copyright     |**
1764064216a8433360745f69edddce19a606659163The Android Open Source Project**|    notice, this list of conditions and the following disclaimer.      |**
1864064216a8433360745f69edddce19a606659163The Android Open Source Project**|  * Redistributions in binary form must reproduce the above copyright  |**
1964064216a8433360745f69edddce19a606659163The Android Open Source Project**|    notice, this list of conditions and the following disclaimer in    |**
2064064216a8433360745f69edddce19a606659163The Android Open Source Project**|    the documentation and/or other materials provided with the         |**
2164064216a8433360745f69edddce19a606659163The Android Open Source Project**|    distribution.                                                      |**
2264064216a8433360745f69edddce19a606659163The Android Open Source Project**|  * Neither the name Texas Instruments nor the names of its            |**
2364064216a8433360745f69edddce19a606659163The Android Open Source Project**|    contributors may be used to endorse or promote products derived    |**
2464064216a8433360745f69edddce19a606659163The Android Open Source Project**|    from this software without specific prior written permission.      |**
2564064216a8433360745f69edddce19a606659163The Android Open Source Project**|                                                                       |**
2664064216a8433360745f69edddce19a606659163The Android Open Source Project**| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS   |**
2764064216a8433360745f69edddce19a606659163The Android Open Source Project**| "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT     |**
2864064216a8433360745f69edddce19a606659163The Android Open Source Project**| LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |**
2964064216a8433360745f69edddce19a606659163The Android Open Source Project**| A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT  |**
3064064216a8433360745f69edddce19a606659163The Android Open Source Project**| OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |**
3164064216a8433360745f69edddce19a606659163The Android Open Source Project**| SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT      |**
3264064216a8433360745f69edddce19a606659163The Android Open Source Project**| LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |**
3364064216a8433360745f69edddce19a606659163The Android Open Source Project**| DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |**
3464064216a8433360745f69edddce19a606659163The Android Open Source Project**| THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT   |**
3564064216a8433360745f69edddce19a606659163The Android Open Source Project**| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |**
3664064216a8433360745f69edddce19a606659163The Android Open Source Project**| OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  |**
3764064216a8433360745f69edddce19a606659163The Android Open Source Project**|                                                                       |**
3864064216a8433360745f69edddce19a606659163The Android Open Source Project**+-----------------------------------------------------------------------+**
3964064216a8433360745f69edddce19a606659163The Android Open Source Project****************************************************************************/
4064064216a8433360745f69edddce19a606659163The Android Open Source Project
4164064216a8433360745f69edddce19a606659163The Android Open Source Project#include "ScanCncn.h"
4264064216a8433360745f69edddce19a606659163The Android Open Source Project#include "ScanCncnAppSM.h"
4364064216a8433360745f69edddce19a606659163The Android Open Source Project#include "ScanCncnDrvSM.h"
4464064216a8433360745f69edddce19a606659163The Android Open Source Project#include "ScanCncnRoamingContSM.h"
4564064216a8433360745f69edddce19a606659163The Android Open Source Project#include "ScanCncnRoamingImmedSM.h"
4664064216a8433360745f69edddce19a606659163The Android Open Source Project#include "ScanCncnAppApi.h"
4764064216a8433360745f69edddce19a606659163The Android Open Source Project#include "ScanCncnOidSM.h"
4864064216a8433360745f69edddce19a606659163The Android Open Source Project#include "report.h"
4964064216a8433360745f69edddce19a606659163The Android Open Source Project#include "fsm.h"
5064064216a8433360745f69edddce19a606659163The Android Open Source Project#include "scrApi.h"
5164064216a8433360745f69edddce19a606659163The Android Open Source Project#include "paramIn.h"
5264064216a8433360745f69edddce19a606659163The Android Open Source Project#include "regulatoryDomainApi.h"
5364064216a8433360745f69edddce19a606659163The Android Open Source Project#include "siteMgrApi.h"
5464064216a8433360745f69edddce19a606659163The Android Open Source Project#include "siteHash.h"
5564064216a8433360745f69edddce19a606659163The Android Open Source Project#include "utils.h"
5664064216a8433360745f69edddce19a606659163The Android Open Source Project#include "healthMonitor.h"
5764064216a8433360745f69edddce19a606659163The Android Open Source Project
5864064216a8433360745f69edddce19a606659163The Android Open Source Project/* static functions */
5964064216a8433360745f69edddce19a606659163The Android Open Source Projectstatic void scanConcentrator_SGupdateScanParams( TI_HANDLE hScanCncn, scan_Params_t* pScanParams );
6064064216a8433360745f69edddce19a606659163The Android Open Source Project
6164064216a8433360745f69edddce19a606659163The Android Open Source Project/**
6264064216a8433360745f69edddce19a606659163The Android Open Source Project * \author Ronen Kalish\n
6364064216a8433360745f69edddce19a606659163The Android Open Source Project * \date 02-Jan-2005\n
6464064216a8433360745f69edddce19a606659163The Android Open Source Project * \brief Creates the scan concentrator object
6564064216a8433360745f69edddce19a606659163The Android Open Source Project *
6664064216a8433360745f69edddce19a606659163The Android Open Source Project * Function Scope \e Public.\n
6764064216a8433360745f69edddce19a606659163The Android Open Source Project * \param hOS - handle to the OS object.\n
6864064216a8433360745f69edddce19a606659163The Android Open Source Project * \return a handle to the scan SRV object, NULL if an error occurred.\n
6964064216a8433360745f69edddce19a606659163The Android Open Source Project */
7064064216a8433360745f69edddce19a606659163The Android Open Source ProjectTI_HANDLE scanConcentrator_create( TI_HANDLE hOS )
7164064216a8433360745f69edddce19a606659163The Android Open Source Project{
7264064216a8433360745f69edddce19a606659163The Android Open Source Project    UINT16   initVector = 0;
7364064216a8433360745f69edddce19a606659163The Android Open Source Project
7464064216a8433360745f69edddce19a606659163The Android Open Source Project    /* allocate the scan concentrator object */
7564064216a8433360745f69edddce19a606659163The Android Open Source Project    scanConcentrator_t *pScanConcentrator = os_memoryAlloc( hOS, sizeof(scanConcentrator_t) );
7664064216a8433360745f69edddce19a606659163The Android Open Source Project    if ( NULL == pScanConcentrator )
7764064216a8433360745f69edddce19a606659163The Android Open Source Project    {
7864064216a8433360745f69edddce19a606659163The Android Open Source Project        WLAN_OS_REPORT( ("ERROR: Failed to create scan concnetrator module\n") );
7964064216a8433360745f69edddce19a606659163The Android Open Source Project        return NULL;
8064064216a8433360745f69edddce19a606659163The Android Open Source Project    }
8164064216a8433360745f69edddce19a606659163The Android Open Source Project    initVector |= (1 << SCAN_ALLOC_OBJECT);
8264064216a8433360745f69edddce19a606659163The Android Open Source Project
8364064216a8433360745f69edddce19a606659163The Android Open Source Project    /* store the OS handle */
8464064216a8433360745f69edddce19a606659163The Android Open Source Project    pScanConcentrator->hOS = hOS;
8564064216a8433360745f69edddce19a606659163The Android Open Source Project
8664064216a8433360745f69edddce19a606659163The Android Open Source Project    /* create state machines */
8764064216a8433360745f69edddce19a606659163The Android Open Source Project    if ( OK != fsm_Create( hOS, &(pScanConcentrator->clientSM[ SCAN_SCC_APP ]),
8864064216a8433360745f69edddce19a606659163The Android Open Source Project                           APP_SCAN_NUM_OF_STATES, APP_SCAN_NUM_OF_EVENTS ) )
8964064216a8433360745f69edddce19a606659163The Android Open Source Project    {
9064064216a8433360745f69edddce19a606659163The Android Open Source Project        WLAN_OS_REPORT( ("ERROR: Failed to allocate application scan state machine\n") );
9164064216a8433360745f69edddce19a606659163The Android Open Source Project        scanConcentrator_freeMem( pScanConcentrator, initVector );
9264064216a8433360745f69edddce19a606659163The Android Open Source Project        return NULL;
9364064216a8433360745f69edddce19a606659163The Android Open Source Project    }
9464064216a8433360745f69edddce19a606659163The Android Open Source Project    initVector |= (1 << SCAN_ALLOC_APP_SM);
9564064216a8433360745f69edddce19a606659163The Android Open Source Project
9664064216a8433360745f69edddce19a606659163The Android Open Source Project    if ( OK != fsm_Create( hOS, &(pScanConcentrator->clientSM[ SCAN_SCC_DRIVER ]),
9764064216a8433360745f69edddce19a606659163The Android Open Source Project                           DRV_SCAN_NUM_OF_STATES, DRV_SCAN_NUM_OF_EVENTS ) )
9864064216a8433360745f69edddce19a606659163The Android Open Source Project    {
9964064216a8433360745f69edddce19a606659163The Android Open Source Project        WLAN_OS_REPORT( ("ERROR: Failed to allocate driver scan state machine\n") );
10064064216a8433360745f69edddce19a606659163The Android Open Source Project        scanConcentrator_freeMem( pScanConcentrator, initVector );
10164064216a8433360745f69edddce19a606659163The Android Open Source Project        return NULL;
10264064216a8433360745f69edddce19a606659163The Android Open Source Project    }
10364064216a8433360745f69edddce19a606659163The Android Open Source Project    initVector |= (1 << SCAN_ALLOC_DRV_SM);
10464064216a8433360745f69edddce19a606659163The Android Open Source Project
10564064216a8433360745f69edddce19a606659163The Android Open Source Project    if ( OK != fsm_Create( hOS, &(pScanConcentrator->clientSM[ SCAN_SCC_ROAMING_CONT ]),
10664064216a8433360745f69edddce19a606659163The Android Open Source Project                           CONT_SCAN_NUM_OF_STATES, CONT_SCAN_NUM_OF_EVENTS ) )
10764064216a8433360745f69edddce19a606659163The Android Open Source Project    {
10864064216a8433360745f69edddce19a606659163The Android Open Source Project        WLAN_OS_REPORT( ("ERROR: Failed to allocate continuous scan for roaming state machine\n") );
10964064216a8433360745f69edddce19a606659163The Android Open Source Project        scanConcentrator_freeMem( pScanConcentrator, initVector );
11064064216a8433360745f69edddce19a606659163The Android Open Source Project        return NULL;
11164064216a8433360745f69edddce19a606659163The Android Open Source Project    }
11264064216a8433360745f69edddce19a606659163The Android Open Source Project    initVector |= (1 << SCAN_ALLOC_CONT_SM);
11364064216a8433360745f69edddce19a606659163The Android Open Source Project
11464064216a8433360745f69edddce19a606659163The Android Open Source Project    if ( OK != fsm_Create( hOS, &(pScanConcentrator->clientSM[ SCAN_SCC_ROAMING_IMMED ]),
11564064216a8433360745f69edddce19a606659163The Android Open Source Project                           IMMED_SCAN_NUM_OF_STATES, IMMED_SCAN_NUM_OF_EVENTS ) )
11664064216a8433360745f69edddce19a606659163The Android Open Source Project    {
11764064216a8433360745f69edddce19a606659163The Android Open Source Project        WLAN_OS_REPORT( ("ERROR: Failed to allocate immediate scan for roaming state machine\n") );
11864064216a8433360745f69edddce19a606659163The Android Open Source Project        scanConcentrator_freeMem( pScanConcentrator, initVector );
11964064216a8433360745f69edddce19a606659163The Android Open Source Project        return NULL;
12064064216a8433360745f69edddce19a606659163The Android Open Source Project    }
12164064216a8433360745f69edddce19a606659163The Android Open Source Project    initVector |= (1 << SCAN_ALLOC_IMMED_SM);
12264064216a8433360745f69edddce19a606659163The Android Open Source Project	if ( OK != fsm_Create( hOS, &(pScanConcentrator->hOidSM), OID_SCAN_NUM_OF_STATES, OID_SCAN_NUM_OF_EVENTS) )
12364064216a8433360745f69edddce19a606659163The Android Open Source Project	{
12464064216a8433360745f69edddce19a606659163The Android Open Source Project        WLAN_OS_REPORT( ("ERROR: Failed to allocate OID scan state machine\n") );
12564064216a8433360745f69edddce19a606659163The Android Open Source Project        scanConcentrator_freeMem( pScanConcentrator, initVector );
12664064216a8433360745f69edddce19a606659163The Android Open Source Project        return NULL;
12764064216a8433360745f69edddce19a606659163The Android Open Source Project	}
12864064216a8433360745f69edddce19a606659163The Android Open Source Project    return pScanConcentrator;
12964064216a8433360745f69edddce19a606659163The Android Open Source Project}
13064064216a8433360745f69edddce19a606659163The Android Open Source Project
13164064216a8433360745f69edddce19a606659163The Android Open Source Project/**
13264064216a8433360745f69edddce19a606659163The Android Open Source Project * \author Ronen Kalish\n
13364064216a8433360745f69edddce19a606659163The Android Open Source Project * \date 02-Jan-2005\n
13464064216a8433360745f69edddce19a606659163The Android Open Source Project * \brief Finalizes the scan concentrator object (freeing system resources)
13564064216a8433360745f69edddce19a606659163The Android Open Source Project *
13664064216a8433360745f69edddce19a606659163The Android Open Source Project * Function Scope \e Public.\n
13764064216a8433360745f69edddce19a606659163The Android Open Source Project * \param hScanCncn - handle to the scan concentrator object.\n
13864064216a8433360745f69edddce19a606659163The Android Open Source Project */
13964064216a8433360745f69edddce19a606659163The Android Open Source Projectvoid scanConcentrator_release( TI_HANDLE hScanCncn )
14064064216a8433360745f69edddce19a606659163The Android Open Source Project{
14164064216a8433360745f69edddce19a606659163The Android Open Source Project    scanConcentrator_freeMem( hScanCncn, 0xffff );
14264064216a8433360745f69edddce19a606659163The Android Open Source Project}
14364064216a8433360745f69edddce19a606659163The Android Open Source Project
14464064216a8433360745f69edddce19a606659163The Android Open Source Project/**
14564064216a8433360745f69edddce19a606659163The Android Open Source Project * \author Ronen Kalish\n
14664064216a8433360745f69edddce19a606659163The Android Open Source Project * \date 05-Jan-2005\n
14764064216a8433360745f69edddce19a606659163The Android Open Source Project * \brief Frees the scan concentrator memory, according to the init vector.
14864064216a8433360745f69edddce19a606659163The Android Open Source Project *
14964064216a8433360745f69edddce19a606659163The Android Open Source Project * Function Scope \e Public.\n
15064064216a8433360745f69edddce19a606659163The Android Open Source Project * \param hScanCncn - handle to the scan concentrator object.\n
15164064216a8433360745f69edddce19a606659163The Android Open Source Project * \param initVec - a vector holding on bits for allocated components and off bits for non allocated components
15264064216a8433360745f69edddce19a606659163The Android Open Source Project */
15364064216a8433360745f69edddce19a606659163The Android Open Source Projectvoid scanConcentrator_freeMem( TI_HANDLE hScanCncn, UINT16 initVec )
15464064216a8433360745f69edddce19a606659163The Android Open Source Project{
15564064216a8433360745f69edddce19a606659163The Android Open Source Project    scanConcentrator_t *pScanConcentrator= (scanConcentrator_t*)hScanCncn;
15664064216a8433360745f69edddce19a606659163The Android Open Source Project
15764064216a8433360745f69edddce19a606659163The Android Open Source Project    /* free state machines */
15864064216a8433360745f69edddce19a606659163The Android Open Source Project    if ( initVec & (1<<SCAN_ALLOC_APP_SM) )
15964064216a8433360745f69edddce19a606659163The Android Open Source Project    {
16064064216a8433360745f69edddce19a606659163The Android Open Source Project        fsm_Unload( pScanConcentrator->hOS, pScanConcentrator->clientSM[ SCAN_SCC_APP ] );
16164064216a8433360745f69edddce19a606659163The Android Open Source Project    }
16264064216a8433360745f69edddce19a606659163The Android Open Source Project    if ( initVec & (1 << SCAN_ALLOC_DRV_SM) )
16364064216a8433360745f69edddce19a606659163The Android Open Source Project    {
16464064216a8433360745f69edddce19a606659163The Android Open Source Project        fsm_Unload( pScanConcentrator->hOS, pScanConcentrator->clientSM[ SCAN_SCC_DRIVER ] );
16564064216a8433360745f69edddce19a606659163The Android Open Source Project    }
16664064216a8433360745f69edddce19a606659163The Android Open Source Project    if ( initVec & (1 << SCAN_ALLOC_CONT_SM) )
16764064216a8433360745f69edddce19a606659163The Android Open Source Project    {
16864064216a8433360745f69edddce19a606659163The Android Open Source Project        fsm_Unload( pScanConcentrator->hOS, pScanConcentrator->clientSM[ SCAN_SCC_ROAMING_CONT ] );
16964064216a8433360745f69edddce19a606659163The Android Open Source Project    }
17064064216a8433360745f69edddce19a606659163The Android Open Source Project    if ( initVec & (1 << SCAN_ALLOC_IMMED_SM) )
17164064216a8433360745f69edddce19a606659163The Android Open Source Project    {
17264064216a8433360745f69edddce19a606659163The Android Open Source Project        fsm_Unload( pScanConcentrator->hOS, pScanConcentrator->clientSM[ SCAN_SCC_ROAMING_IMMED ] );
17364064216a8433360745f69edddce19a606659163The Android Open Source Project    }
17464064216a8433360745f69edddce19a606659163The Android Open Source Project	if ( initVec & (1 << SCAN_ALLOC_OID_SM) )
17564064216a8433360745f69edddce19a606659163The Android Open Source Project	{
17664064216a8433360745f69edddce19a606659163The Android Open Source Project		fsm_Unload( pScanConcentrator->hOS, pScanConcentrator->hOidSM );
17764064216a8433360745f69edddce19a606659163The Android Open Source Project	}
17864064216a8433360745f69edddce19a606659163The Android Open Source Project    /* free scan concentrator object */
17964064216a8433360745f69edddce19a606659163The Android Open Source Project    if ( initVec & (1 << SCAN_ALLOC_OBJECT) )
18064064216a8433360745f69edddce19a606659163The Android Open Source Project    {
18164064216a8433360745f69edddce19a606659163The Android Open Source Project        os_memoryFree( pScanConcentrator->hOS, pScanConcentrator, sizeof(scanConcentrator_t) );
18264064216a8433360745f69edddce19a606659163The Android Open Source Project    }
18364064216a8433360745f69edddce19a606659163The Android Open Source Project}
18464064216a8433360745f69edddce19a606659163The Android Open Source Project
18564064216a8433360745f69edddce19a606659163The Android Open Source Project/**
18664064216a8433360745f69edddce19a606659163The Android Open Source Project * \author Ronen Kalish\n
18764064216a8433360745f69edddce19a606659163The Android Open Source Project * \date 02-Jan-2005\n
18864064216a8433360745f69edddce19a606659163The Android Open Source Project * \brief Initialize the scan concentrator object.
18964064216a8433360745f69edddce19a606659163The Android Open Source Project *
19064064216a8433360745f69edddce19a606659163The Android Open Source Project * Function Scope \e Public.\n
19164064216a8433360745f69edddce19a606659163The Android Open Source Project * \param hScanCncn - handle to the scan concentrator object.\n
19264064216a8433360745f69edddce19a606659163The Android Open Source Project * \param hHalCtrl - handle to the Hal Ctrl object.\n
19364064216a8433360745f69edddce19a606659163The Android Open Source Project * \param hReport - handle to the Report object.\n
19464064216a8433360745f69edddce19a606659163The Android Open Source Project * \param hRegDomain - handle to the regulatory domain object.\n
19564064216a8433360745f69edddce19a606659163The Android Open Source Project * \param hSiteMngr - handle to the site manager object.\n
19664064216a8433360745f69edddce19a606659163The Android Open Source Project * \param hSCR - handle to the SCR object.\n
19764064216a8433360745f69edddce19a606659163The Android Open Source Project * \param hMacServices - handle to the MacServices object.\n
19864064216a8433360745f69edddce19a606659163The Android Open Source Project * \param hAPConn - handle to the AP connection object.\n
19964064216a8433360745f69edddce19a606659163The Android Open Source Project * \param hEventSRV - handle to the event SRV object.\n
20064064216a8433360745f69edddce19a606659163The Android Open Source Project * \param hMlme - handle to the MLME object.\n
20164064216a8433360745f69edddce19a606659163The Android Open Source Project * \param hHealthMonitor - handle to the health monitor object.\n
20264064216a8433360745f69edddce19a606659163The Android Open Source Project * \param pScanConcentratorInitParams - pointer to the init parameters structure.\n
20364064216a8433360745f69edddce19a606659163The Android Open Source Project */
20464064216a8433360745f69edddce19a606659163The Android Open Source Projectvoid scanConcentrator_init( TI_HANDLE hScanCncn,
20564064216a8433360745f69edddce19a606659163The Android Open Source Project                            TI_HANDLE hHalCtrl,
20664064216a8433360745f69edddce19a606659163The Android Open Source Project                            TI_HANDLE hReport,
20764064216a8433360745f69edddce19a606659163The Android Open Source Project                            TI_HANDLE hRegDomain,
20864064216a8433360745f69edddce19a606659163The Android Open Source Project                            TI_HANDLE hSiteMngr,
20964064216a8433360745f69edddce19a606659163The Android Open Source Project                            TI_HANDLE hSCR,
21064064216a8433360745f69edddce19a606659163The Android Open Source Project                            TI_HANDLE hMacServices,
21164064216a8433360745f69edddce19a606659163The Android Open Source Project                            TI_HANDLE hAPConn,
21264064216a8433360745f69edddce19a606659163The Android Open Source Project                            TI_HANDLE hEventSRV,
21364064216a8433360745f69edddce19a606659163The Android Open Source Project                            TI_HANDLE hMlme,
21464064216a8433360745f69edddce19a606659163The Android Open Source Project                            TI_HANDLE hCtrlData,
21564064216a8433360745f69edddce19a606659163The Android Open Source Project                            TI_HANDLE hHealthMonitor,
21664064216a8433360745f69edddce19a606659163The Android Open Source Project                            scanConcentratorInitParams_t* pScanConcentratorInitParams )
21764064216a8433360745f69edddce19a606659163The Android Open Source Project{
21864064216a8433360745f69edddce19a606659163The Android Open Source Project    scanConcentrator_t* pScanConcentrator = (scanConcentrator_t*)hScanCncn;
21964064216a8433360745f69edddce19a606659163The Android Open Source Project
22064064216a8433360745f69edddce19a606659163The Android Open Source Project    /* copy handles */
22164064216a8433360745f69edddce19a606659163The Android Open Source Project    pScanConcentrator->hReport = hReport;
22264064216a8433360745f69edddce19a606659163The Android Open Source Project    pScanConcentrator->hHalCtrl = hHalCtrl;
22364064216a8433360745f69edddce19a606659163The Android Open Source Project    pScanConcentrator->hRegulatoryDomain = hRegDomain;
22464064216a8433360745f69edddce19a606659163The Android Open Source Project    pScanConcentrator->hSiteManager = hSiteMngr;
22564064216a8433360745f69edddce19a606659163The Android Open Source Project    pScanConcentrator->hSCR = hSCR;
22664064216a8433360745f69edddce19a606659163The Android Open Source Project    pScanConcentrator->hMacServices = hMacServices;
22764064216a8433360745f69edddce19a606659163The Android Open Source Project    pScanConcentrator->hAPConn = hAPConn;
22864064216a8433360745f69edddce19a606659163The Android Open Source Project    pScanConcentrator->hEventSrv = hEventSRV;
22964064216a8433360745f69edddce19a606659163The Android Open Source Project    pScanConcentrator->hMlme = hMlme;
23064064216a8433360745f69edddce19a606659163The Android Open Source Project    pScanConcentrator->hCtrlData = hCtrlData;
23164064216a8433360745f69edddce19a606659163The Android Open Source Project    pScanConcentrator->hHealthMonitor = hHealthMonitor;
23264064216a8433360745f69edddce19a606659163The Android Open Source Project
23364064216a8433360745f69edddce19a606659163The Android Open Source Project    /* copy registry values */
23464064216a8433360745f69edddce19a606659163The Android Open Source Project    os_memoryCopy( pScanConcentrator->hOS, &(pScanConcentrator->initParams), pScanConcentratorInitParams,
23564064216a8433360745f69edddce19a606659163The Android Open Source Project                   sizeof( scanConcentratorInitParams_t ) );
23664064216a8433360745f69edddce19a606659163The Android Open Source Project
23764064216a8433360745f69edddce19a606659163The Android Open Source Project    /* initialize state machines */
23864064216a8433360745f69edddce19a606659163The Android Open Source Project    if ( OK != scanConcentratorAppSM_init( hScanCncn ) )
23964064216a8433360745f69edddce19a606659163The Android Open Source Project    {
24064064216a8433360745f69edddce19a606659163The Android Open Source Project        WLAN_REPORT_ERROR( hReport, SCAN_CNCN_MODULE_LOG, ("Error: application SM initialization failed.\n") );
24164064216a8433360745f69edddce19a606659163The Android Open Source Project        return;
24264064216a8433360745f69edddce19a606659163The Android Open Source Project    }
24364064216a8433360745f69edddce19a606659163The Android Open Source Project
24464064216a8433360745f69edddce19a606659163The Android Open Source Project    if ( OK != scanConcentratorDrvSM_init( hScanCncn ) )
24564064216a8433360745f69edddce19a606659163The Android Open Source Project    {
24664064216a8433360745f69edddce19a606659163The Android Open Source Project        WLAN_REPORT_ERROR( hReport, SCAN_CNCN_MODULE_LOG, ("Error: driver SM initialization failed.\n") );
24764064216a8433360745f69edddce19a606659163The Android Open Source Project        return;
24864064216a8433360745f69edddce19a606659163The Android Open Source Project    }
24964064216a8433360745f69edddce19a606659163The Android Open Source Project
25064064216a8433360745f69edddce19a606659163The Android Open Source Project    if ( OK != scanConcentratorRoamingContSM_init( hScanCncn ) )
25164064216a8433360745f69edddce19a606659163The Android Open Source Project    {
25264064216a8433360745f69edddce19a606659163The Android Open Source Project        WLAN_REPORT_ERROR( hReport, SCAN_CNCN_MODULE_LOG, ("Error: continuous scan for roaming SM initialization failed.\n") );
25364064216a8433360745f69edddce19a606659163The Android Open Source Project        return;
25464064216a8433360745f69edddce19a606659163The Android Open Source Project    }
25564064216a8433360745f69edddce19a606659163The Android Open Source Project
25664064216a8433360745f69edddce19a606659163The Android Open Source Project    if ( OK != scanConcentratorRoamingImmedSM_init( hScanCncn ) )
25764064216a8433360745f69edddce19a606659163The Android Open Source Project    {
25864064216a8433360745f69edddce19a606659163The Android Open Source Project        WLAN_REPORT_ERROR( hReport, SCAN_CNCN_MODULE_LOG, ("Error: immediate scan for roaming SM initialization failed.\n") );
25964064216a8433360745f69edddce19a606659163The Android Open Source Project        return;
26064064216a8433360745f69edddce19a606659163The Android Open Source Project    }
26164064216a8433360745f69edddce19a606659163The Android Open Source Project	if ( OK != scanConcentratorOidSM_init( hScanCncn ) )
26264064216a8433360745f69edddce19a606659163The Android Open Source Project	{
26364064216a8433360745f69edddce19a606659163The Android Open Source Project        WLAN_REPORT_ERROR( hReport, SCAN_CNCN_MODULE_LOG, ("Error: OID scan SM initialization failed.\n") );
26464064216a8433360745f69edddce19a606659163The Android Open Source Project        return;
26564064216a8433360745f69edddce19a606659163The Android Open Source Project	}
26664064216a8433360745f69edddce19a606659163The Android Open Source Project    /* register SCR callbacks */
26764064216a8433360745f69edddce19a606659163The Android Open Source Project    scr_registerClientCB( pScanConcentrator->hSCR, SCR_CID_APP_SCAN, scanConcentrator_scrAppCB, hScanCncn );
26864064216a8433360745f69edddce19a606659163The Android Open Source Project    scr_registerClientCB( pScanConcentrator->hSCR, SCR_CID_DRIVER_FG_SCAN, scanConcentrator_scrDriverCB, hScanCncn );
26964064216a8433360745f69edddce19a606659163The Android Open Source Project    scr_registerClientCB( pScanConcentrator->hSCR, SCR_CID_CONT_SCAN, scanConcentrator_scrRoamingContCB, hScanCncn );
27064064216a8433360745f69edddce19a606659163The Android Open Source Project    scr_registerClientCB( pScanConcentrator->hSCR, SCR_CID_IMMED_SCAN, scanConcentrator_scrRoamingImmedCB, hScanCncn );
27164064216a8433360745f69edddce19a606659163The Android Open Source Project
27264064216a8433360745f69edddce19a606659163The Android Open Source Project    /* register scan SRV scan complete CB */
27364064216a8433360745f69edddce19a606659163The Android Open Source Project    MacServices_scanSRV_registerScanCompleteCB( hMacServices, scanConcentrator_scanCompleteNotificationCB, hScanCncn );
27464064216a8433360745f69edddce19a606659163The Android Open Source Project
27564064216a8433360745f69edddce19a606659163The Android Open Source Project    /* nullify other parameters */
27664064216a8433360745f69edddce19a606659163The Android Open Source Project    pScanConcentrator->currentRunningScanClient = SCAN_SCC_NO_CLIENT;
27764064216a8433360745f69edddce19a606659163The Android Open Source Project    pScanConcentrator->connectionStatus = STA_NOT_CONNECTED;
27864064216a8433360745f69edddce19a606659163The Android Open Source Project
27964064216a8433360745f69edddce19a606659163The Android Open Source Project    /* bUseSGParams is TRUE only when SG module is enabled */
28064064216a8433360745f69edddce19a606659163The Android Open Source Project    pScanConcentrator->bUseSGParams = FALSE;
28164064216a8433360745f69edddce19a606659163The Android Open Source Project
28264064216a8433360745f69edddce19a606659163The Android Open Source Project    /* "register" the application scan result callback */
28364064216a8433360745f69edddce19a606659163The Android Open Source Project    scanConcentrator_registerScanResultCB( hScanCncn, SCAN_SCC_APP, scanConcentrator_appScanResultCB, hScanCncn );
28464064216a8433360745f69edddce19a606659163The Android Open Source Project
28564064216a8433360745f69edddce19a606659163The Android Open Source Project    WLAN_REPORT_INIT( hReport, SCAN_CNCN_MODULE_LOG,  (".....Scan concentrator configured successfully.\n"));
28664064216a8433360745f69edddce19a606659163The Android Open Source Project}
28764064216a8433360745f69edddce19a606659163The Android Open Source Project
28864064216a8433360745f69edddce19a606659163The Android Open Source Project/**
28964064216a8433360745f69edddce19a606659163The Android Open Source Project * \author Ronen Kalish\n
29064064216a8433360745f69edddce19a606659163The Android Open Source Project * \date 02-Jan-2005\n
29164064216a8433360745f69edddce19a606659163The Android Open Source Project * \brief switch the connection mode to connected (infrastructure BSS)
29264064216a8433360745f69edddce19a606659163The Android Open Source Project *
29364064216a8433360745f69edddce19a606659163The Android Open Source Project * Function Scope \e Public.\n
29464064216a8433360745f69edddce19a606659163The Android Open Source Project * \param hScanCncn - handle to the scan concentrator object.\n
29564064216a8433360745f69edddce19a606659163The Android Open Source Project */
29664064216a8433360745f69edddce19a606659163The Android Open Source Projectvoid scanConcentrator_switchToConnected( TI_HANDLE hScanCncn )
29764064216a8433360745f69edddce19a606659163The Android Open Source Project{
29864064216a8433360745f69edddce19a606659163The Android Open Source Project    scanConcentrator_t* pScanConcentrator = (scanConcentrator_t*)hScanCncn;
29964064216a8433360745f69edddce19a606659163The Android Open Source Project
30064064216a8433360745f69edddce19a606659163The Android Open Source Project    WLAN_REPORT_INFORMATION( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG, ("Switching to connected state.\n") );
30164064216a8433360745f69edddce19a606659163The Android Open Source Project
30264064216a8433360745f69edddce19a606659163The Android Open Source Project    /* change connection status to connected */
30364064216a8433360745f69edddce19a606659163The Android Open Source Project    pScanConcentrator->connectionStatus = STA_CONNECTED;
30464064216a8433360745f69edddce19a606659163The Android Open Source Project
30564064216a8433360745f69edddce19a606659163The Android Open Source Project    /* Any running scans in other modes will be aborted (if needed) by the SCR (or have already been) */
30664064216a8433360745f69edddce19a606659163The Android Open Source Project}
30764064216a8433360745f69edddce19a606659163The Android Open Source Project
30864064216a8433360745f69edddce19a606659163The Android Open Source Project/**
30964064216a8433360745f69edddce19a606659163The Android Open Source Project * \author Ronen Kalish\n
31064064216a8433360745f69edddce19a606659163The Android Open Source Project * \date 02-Jan-2005\n
31164064216a8433360745f69edddce19a606659163The Android Open Source Project * \brief switch the connection mode to not connected
31264064216a8433360745f69edddce19a606659163The Android Open Source Project *
31364064216a8433360745f69edddce19a606659163The Android Open Source Project * Function Scope \e Public.\n
31464064216a8433360745f69edddce19a606659163The Android Open Source Project * \param hScanCncn - handle to the scan concentrator object.\n
31564064216a8433360745f69edddce19a606659163The Android Open Source Project */
31664064216a8433360745f69edddce19a606659163The Android Open Source Projectvoid scanConcentrator_switchToNotConnected( TI_HANDLE hScanCncn )
31764064216a8433360745f69edddce19a606659163The Android Open Source Project{
31864064216a8433360745f69edddce19a606659163The Android Open Source Project    scanConcentrator_t* pScanConcentrator = (scanConcentrator_t*)hScanCncn;
31964064216a8433360745f69edddce19a606659163The Android Open Source Project
32064064216a8433360745f69edddce19a606659163The Android Open Source Project    WLAN_REPORT_INFORMATION( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG, ("Switching to not connected state.\n") );
32164064216a8433360745f69edddce19a606659163The Android Open Source Project
32264064216a8433360745f69edddce19a606659163The Android Open Source Project    /* change connection status to connected */
32364064216a8433360745f69edddce19a606659163The Android Open Source Project    pScanConcentrator->connectionStatus = STA_NOT_CONNECTED;
32464064216a8433360745f69edddce19a606659163The Android Open Source Project
32564064216a8433360745f69edddce19a606659163The Android Open Source Project    /* Any running scans in other modes will be aborted (if needed) by the SCR (or have already been) */
32664064216a8433360745f69edddce19a606659163The Android Open Source Project}
32764064216a8433360745f69edddce19a606659163The Android Open Source Project
32864064216a8433360745f69edddce19a606659163The Android Open Source Project/**
32964064216a8433360745f69edddce19a606659163The Android Open Source Project * \author Ronen Kalish\n
33064064216a8433360745f69edddce19a606659163The Android Open Source Project * \date 02-Jan-2005\n
33164064216a8433360745f69edddce19a606659163The Android Open Source Project * \brief switch the connection mode to IBSS participation
33264064216a8433360745f69edddce19a606659163The Android Open Source Project *
33364064216a8433360745f69edddce19a606659163The Android Open Source Project * Function Scope \e Public.\n
33464064216a8433360745f69edddce19a606659163The Android Open Source Project * \param hScanCncn - handle to the scan concentrator object.\n
33564064216a8433360745f69edddce19a606659163The Android Open Source Project */
33664064216a8433360745f69edddce19a606659163The Android Open Source Projectvoid scanConcentrator_switchToIBSS( TI_HANDLE hScanCncn )
33764064216a8433360745f69edddce19a606659163The Android Open Source Project{
33864064216a8433360745f69edddce19a606659163The Android Open Source Project    scanConcentrator_t* pScanConcentrator = (scanConcentrator_t*)hScanCncn;
33964064216a8433360745f69edddce19a606659163The Android Open Source Project
34064064216a8433360745f69edddce19a606659163The Android Open Source Project    WLAN_REPORT_INFORMATION( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG, ("Switching to IBSS state.\n") );
34164064216a8433360745f69edddce19a606659163The Android Open Source Project
34264064216a8433360745f69edddce19a606659163The Android Open Source Project    /* change connection status to connected */
34364064216a8433360745f69edddce19a606659163The Android Open Source Project    pScanConcentrator->connectionStatus = STA_IBSS;
34464064216a8433360745f69edddce19a606659163The Android Open Source Project
34564064216a8433360745f69edddce19a606659163The Android Open Source Project    /* Any running scans in other modes will be aborted (if needed) by the SCR (or have already been) */
34664064216a8433360745f69edddce19a606659163The Android Open Source Project}
34764064216a8433360745f69edddce19a606659163The Android Open Source Project
34864064216a8433360745f69edddce19a606659163The Android Open Source Project/**
34964064216a8433360745f69edddce19a606659163The Android Open Source Project * \author Ronen Kalish\n
35064064216a8433360745f69edddce19a606659163The Android Open Source Project * \date 02-Jan-2005\n
35164064216a8433360745f69edddce19a606659163The Android Open Source Project * \brief Called by a client to request a scan.
35264064216a8433360745f69edddce19a606659163The Android Open Source Project *
35364064216a8433360745f69edddce19a606659163The Android Open Source Project * Function Scope \e Public.\n
35464064216a8433360745f69edddce19a606659163The Android Open Source Project * \param hScanCncn - handle to the scan concentrator object.\n
35564064216a8433360745f69edddce19a606659163The Android Open Source Project * \param client - the client ID.\n
35664064216a8433360745f69edddce19a606659163The Android Open Source Project * \return scan operation detailed result status.\n
35764064216a8433360745f69edddce19a606659163The Android Open Source Project * \retval SCAN_CRS_SCAN_RUNNING - scan started successfully and is now running.\n
35864064216a8433360745f69edddce19a606659163The Android Open Source Project * \retval SCAN_CRS_SCAN_FAILED - scan failed to start due to an unexpected error.\n
35964064216a8433360745f69edddce19a606659163The Android Open Source Project */
36064064216a8433360745f69edddce19a606659163The Android Open Source Projectscan_cncnResultStatus_e scanConcentrator_scan( TI_HANDLE hScanCncn,
36164064216a8433360745f69edddce19a606659163The Android Open Source Project                                               scan_CncnClient_e client,
36264064216a8433360745f69edddce19a606659163The Android Open Source Project                                               scan_Params_t* pScanParams )
36364064216a8433360745f69edddce19a606659163The Android Open Source Project{
36464064216a8433360745f69edddce19a606659163The Android Open Source Project    scanConcentrator_t* pScanConcentrator = (scanConcentrator_t*)hScanCncn;
36564064216a8433360745f69edddce19a606659163The Android Open Source Project    whalCtrl_setTemplate_t  templateStruct;
36664064216a8433360745f69edddce19a606659163The Android Open Source Project    probeReqTemplate_t      probeReqTemplate;
36764064216a8433360745f69edddce19a606659163The Android Open Source Project    paramInfo_t             param;
36864064216a8433360745f69edddce19a606659163The Android Open Source Project
36964064216a8433360745f69edddce19a606659163The Android Open Source Project    WLAN_REPORT_INFORMATION( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG,
37064064216a8433360745f69edddce19a606659163The Android Open Source Project                             ("Received scan request from client %d\n", client) );
37164064216a8433360745f69edddce19a606659163The Android Open Source Project
37264064216a8433360745f69edddce19a606659163The Android Open Source Project    /* sanity check verify that this is a known client */
37364064216a8433360745f69edddce19a606659163The Android Open Source Project    if ( client >= SCAN_SCC_NUM_OF_CLIENTS)
37464064216a8433360745f69edddce19a606659163The Android Open Source Project    {
37564064216a8433360745f69edddce19a606659163The Android Open Source Project        WLAN_REPORT_WARNING( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG,
37664064216a8433360745f69edddce19a606659163The Android Open Source Project                             ("Scan request with illegal client %d, aborting request.\n", client) );
37764064216a8433360745f69edddce19a606659163The Android Open Source Project        return SCAN_CRS_SCAN_FAILED;
37864064216a8433360745f69edddce19a606659163The Android Open Source Project    }
37964064216a8433360745f69edddce19a606659163The Android Open Source Project
38064064216a8433360745f69edddce19a606659163The Android Open Source Project    /* scan requests with junk SSID (other than application scans) are rejected */
38164064216a8433360745f69edddce19a606659163The Android Open Source Project    if ( (client == SCAN_SCC_DRIVER) &&
38264064216a8433360745f69edddce19a606659163The Android Open Source Project         utils_isJunkSSID( &(pScanParams->desiredSsid) ) )
38364064216a8433360745f69edddce19a606659163The Android Open Source Project    {
38464064216a8433360745f69edddce19a606659163The Android Open Source Project        WLAN_REPORT_WARNING( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG,
38564064216a8433360745f69edddce19a606659163The Android Open Source Project                             ("Scan request with junk SSID from client %d.\n", client) );
38664064216a8433360745f69edddce19a606659163The Android Open Source Project        return SCAN_CRS_SCAN_FAILED;
38764064216a8433360745f69edddce19a606659163The Android Open Source Project    }
38864064216a8433360745f69edddce19a606659163The Android Open Source Project
38964064216a8433360745f69edddce19a606659163The Android Open Source Project#ifndef TI_DBG
39064064216a8433360745f69edddce19a606659163The Android Open Source Project    /* in release mode, no channel expansion is done */
39164064216a8433360745f69edddce19a606659163The Android Open Source Project    if ( 0 == pScanParams->numOfChannels )
39264064216a8433360745f69edddce19a606659163The Android Open Source Project    {
39364064216a8433360745f69edddce19a606659163The Android Open Source Project        WLAN_REPORT_WARNING( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG,
39464064216a8433360745f69edddce19a606659163The Android Open Source Project                             ("Scan request with 0 channels from client:%d\n", client) );
39564064216a8433360745f69edddce19a606659163The Android Open Source Project        return SCAN_CRS_SCAN_FAILED;
39664064216a8433360745f69edddce19a606659163The Android Open Source Project    }
39764064216a8433360745f69edddce19a606659163The Android Open Source Project#endif
39864064216a8433360745f69edddce19a606659163The Android Open Source Project
39964064216a8433360745f69edddce19a606659163The Android Open Source Project	/* Validate dwell times */
40064064216a8433360745f69edddce19a606659163The Android Open Source Project	if ( pScanParams->scanType != SCAN_TYPE_SPS )
40164064216a8433360745f69edddce19a606659163The Android Open Source Project	{
40264064216a8433360745f69edddce19a606659163The Android Open Source Project		int channel;
40364064216a8433360745f69edddce19a606659163The Android Open Source Project
40464064216a8433360745f69edddce19a606659163The Android Open Source Project		for (channel = 0; channel < pScanParams->numOfChannels; ++channel)
40564064216a8433360745f69edddce19a606659163The Android Open Source Project		{
40664064216a8433360745f69edddce19a606659163The Android Open Source Project			if (pScanParams->channelEntry[channel].normalChannelEntry.maxChannelDwellTime <
40764064216a8433360745f69edddce19a606659163The Android Open Source Project				pScanParams->channelEntry[channel].normalChannelEntry.minChannelDwellTime)
40864064216a8433360745f69edddce19a606659163The Android Open Source Project			{
40964064216a8433360745f69edddce19a606659163The Android Open Source Project				WLAN_REPORT_ERROR( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG,
41064064216a8433360745f69edddce19a606659163The Android Open Source Project					("%s: MaxChannelDwellTime must not be smaller than MinChannelDwellTime on channel %d!\n", __FUNCTION__, channel));
41164064216a8433360745f69edddce19a606659163The Android Open Source Project
41264064216a8433360745f69edddce19a606659163The Android Open Source Project				return SCAN_CRS_SCAN_FAILED;
41364064216a8433360745f69edddce19a606659163The Android Open Source Project			}
41464064216a8433360745f69edddce19a606659163The Android Open Source Project		}
41564064216a8433360745f69edddce19a606659163The Android Open Source Project	}
41664064216a8433360745f69edddce19a606659163The Android Open Source Project
41764064216a8433360745f69edddce19a606659163The Android Open Source Project    /* Check if country code should be reset in RegDomain. This is done here in order to detect if country should be updated
41864064216a8433360745f69edddce19a606659163The Android Open Source Project       before the next scan. RegDomain will decide if country code should be deleted or remain the same. */
41964064216a8433360745f69edddce19a606659163The Android Open Source Project    param.paramType = REGULATORY_DOMAIN_CHECK_COUNTRY_PARAM;
42064064216a8433360745f69edddce19a606659163The Android Open Source Project    regulatoryDomain_setParam(pScanConcentrator->hRegulatoryDomain,&param);
42164064216a8433360745f69edddce19a606659163The Android Open Source Project
42264064216a8433360745f69edddce19a606659163The Android Open Source Project	WLAN_REPORT_INFORMATION( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG,("SG=%d, scan band = %d \n",
42364064216a8433360745f69edddce19a606659163The Android Open Source Project																			   pScanConcentrator->bUseSGParams,
42464064216a8433360745f69edddce19a606659163The Android Open Source Project																			   pScanParams->band));
42564064216a8433360745f69edddce19a606659163The Android Open Source Project    /* act according to client */
42664064216a8433360745f69edddce19a606659163The Android Open Source Project    switch ( client )
42764064216a8433360745f69edddce19a606659163The Android Open Source Project    {
42864064216a8433360745f69edddce19a606659163The Android Open Source Project    case SCAN_SCC_APP:
42964064216a8433360745f69edddce19a606659163The Android Open Source Project        /* check that the application state machine is in IDLE state
43064064216a8433360745f69edddce19a606659163The Android Open Source Project           (no more than one scan at a time per client is allowed). */
43164064216a8433360745f69edddce19a606659163The Android Open Source Project        if ( APP_SCAN_STATE_IDLE != pScanConcentrator->clientSMState[ SCAN_SCC_APP ] )
43264064216a8433360745f69edddce19a606659163The Android Open Source Project        {
43364064216a8433360745f69edddce19a606659163The Android Open Source Project            return SCAN_CRS_SCAN_FAILED;
43464064216a8433360745f69edddce19a606659163The Android Open Source Project        }
43564064216a8433360745f69edddce19a606659163The Android Open Source Project        else
43664064216a8433360745f69edddce19a606659163The Android Open Source Project        {
43764064216a8433360745f69edddce19a606659163The Android Open Source Project            /* copy scan parameters to local buffer */
43864064216a8433360745f69edddce19a606659163The Android Open Source Project            os_memoryCopy( pScanConcentrator->hOS, &(pScanConcentrator->clientScanParams[ SCAN_SCC_APP ]),
43964064216a8433360745f69edddce19a606659163The Android Open Source Project                           pScanParams, sizeof(scan_Params_t) );
44064064216a8433360745f69edddce19a606659163The Android Open Source Project
44164064216a8433360745f69edddce19a606659163The Android Open Source Project            /* ask the reg domain which channels are allowed for the requested scan type */
44264064216a8433360745f69edddce19a606659163The Android Open Source Project            scanConcentrator_verifyChannelsWithRegDomain( hScanCncn, &(pScanConcentrator->clientScanParams[ SCAN_SCC_APP ]) );
44364064216a8433360745f69edddce19a606659163The Android Open Source Project
44464064216a8433360745f69edddce19a606659163The Android Open Source Project            /* if no channels are available for scan, return negative result */
44564064216a8433360745f69edddce19a606659163The Android Open Source Project            if ( 0 == pScanConcentrator->clientScanParams[ SCAN_SCC_APP ].numOfChannels )
44664064216a8433360745f69edddce19a606659163The Android Open Source Project            {
44764064216a8433360745f69edddce19a606659163The Android Open Source Project                return SCAN_CRS_SCAN_FAILED;
44864064216a8433360745f69edddce19a606659163The Android Open Source Project            }
44964064216a8433360745f69edddce19a606659163The Android Open Source Project
45064064216a8433360745f69edddce19a606659163The Android Open Source Project            if ((pScanConcentrator->bUseSGParams) && (pScanConcentrator->clientScanParams[ SCAN_SCC_APP ].band == RADIO_BAND_2_4_GHZ))
45164064216a8433360745f69edddce19a606659163The Android Open Source Project            {
45264064216a8433360745f69edddce19a606659163The Android Open Source Project				WLAN_REPORT_INFORMATION( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG,("SG is pn && RADIO_BAND_2_4_GHZ \n"));
45364064216a8433360745f69edddce19a606659163The Android Open Source Project                scanConcentrator_SGupdateScanParams(hScanCncn,&(pScanConcentrator->clientScanParams[ SCAN_SCC_APP ]));
45464064216a8433360745f69edddce19a606659163The Android Open Source Project            }
45564064216a8433360745f69edddce19a606659163The Android Open Source Project
45664064216a8433360745f69edddce19a606659163The Android Open Source Project            /* mark that a scan request is in progress (to avoid client re-entrance if the scan fail) */
45764064216a8433360745f69edddce19a606659163The Android Open Source Project            pScanConcentrator->bInRequest = TRUE;
45864064216a8433360745f69edddce19a606659163The Android Open Source Project
45964064216a8433360745f69edddce19a606659163The Android Open Source Project            /* mark the scan result as OK (until other status will replace it) */
46064064216a8433360745f69edddce19a606659163The Android Open Source Project            pScanConcentrator->scanResult[ SCAN_SCC_APP ] = SCAN_CRS_SCAN_COMPLETE_OK;
46164064216a8433360745f69edddce19a606659163The Android Open Source Project
46264064216a8433360745f69edddce19a606659163The Android Open Source Project            /* send probe request template */
46364064216a8433360745f69edddce19a606659163The Android Open Source Project            if ( (SCAN_TYPE_NORMAL_ACTIVE == pScanParams->scanType) ||
46464064216a8433360745f69edddce19a606659163The Android Open Source Project                 (SCAN_TYPE_TRIGGERED_ACTIVE == pScanParams->scanType) )
46564064216a8433360745f69edddce19a606659163The Android Open Source Project            {
46664064216a8433360745f69edddce19a606659163The Android Open Source Project
46764064216a8433360745f69edddce19a606659163The Android Open Source Project                templateStruct.pTemplate = (UINT8 *)&probeReqTemplate;
46864064216a8433360745f69edddce19a606659163The Android Open Source Project                templateStruct.templateType = PROBE_REQUEST_TEMPLATE;
46964064216a8433360745f69edddce19a606659163The Android Open Source Project                buildProbeReqTemplate( pScanConcentrator->hSiteManager, &templateStruct,
47064064216a8433360745f69edddce19a606659163The Android Open Source Project					&(pScanConcentrator->clientScanParams[ SCAN_SCC_APP ].desiredSsid),
47164064216a8433360745f69edddce19a606659163The Android Open Source Project					  pScanConcentrator->clientScanParams[ SCAN_SCC_APP ].band);
47264064216a8433360745f69edddce19a606659163The Android Open Source Project                whalCtrl_SetTemplate( pScanConcentrator->hHalCtrl, &templateStruct);
47364064216a8433360745f69edddce19a606659163The Android Open Source Project            }
47464064216a8433360745f69edddce19a606659163The Android Open Source Project
47564064216a8433360745f69edddce19a606659163The Android Open Source Project            /* send a start scan event to the SM */
47664064216a8433360745f69edddce19a606659163The Android Open Source Project            scanConcentratorAppSM_SMEvent( hScanCncn,
47764064216a8433360745f69edddce19a606659163The Android Open Source Project                                           (scan_appSMStates_e*)&(pScanConcentrator->clientSMState[ SCAN_SCC_APP ]),
47864064216a8433360745f69edddce19a606659163The Android Open Source Project                                           APP_SCAN_EVENT_START_SCAN );
47964064216a8433360745f69edddce19a606659163The Android Open Source Project
48064064216a8433360745f69edddce19a606659163The Android Open Source Project            /* mark that the scan request is no longer in progress */
48164064216a8433360745f69edddce19a606659163The Android Open Source Project            pScanConcentrator->bInRequest = FALSE;
48264064216a8433360745f69edddce19a606659163The Android Open Source Project
48364064216a8433360745f69edddce19a606659163The Android Open Source Project            /* return scan result */
48464064216a8433360745f69edddce19a606659163The Android Open Source Project            if ( SCAN_CRS_SCAN_COMPLETE_OK == pScanConcentrator->scanResult[ SCAN_SCC_APP ] )
48564064216a8433360745f69edddce19a606659163The Android Open Source Project            {
48664064216a8433360745f69edddce19a606659163The Android Open Source Project                return SCAN_CRS_SCAN_RUNNING;
48764064216a8433360745f69edddce19a606659163The Android Open Source Project            }
48864064216a8433360745f69edddce19a606659163The Android Open Source Project            else
48964064216a8433360745f69edddce19a606659163The Android Open Source Project            {
49064064216a8433360745f69edddce19a606659163The Android Open Source Project                return pScanConcentrator->scanResult[ SCAN_SCC_APP ];
49164064216a8433360745f69edddce19a606659163The Android Open Source Project            }
49264064216a8433360745f69edddce19a606659163The Android Open Source Project        }
49364064216a8433360745f69edddce19a606659163The Android Open Source Project/*        break; - unreachable */
49464064216a8433360745f69edddce19a606659163The Android Open Source Project
49564064216a8433360745f69edddce19a606659163The Android Open Source Project    case SCAN_SCC_DRIVER:
49664064216a8433360745f69edddce19a606659163The Android Open Source Project        /* check that the driver state machine is in IDLE state
49764064216a8433360745f69edddce19a606659163The Android Open Source Project           (no more than one scan at a time per client is allowed)*/
49864064216a8433360745f69edddce19a606659163The Android Open Source Project        if ( DRV_SCAN_STATE_IDLE != pScanConcentrator->clientSMState[ SCAN_SCC_DRIVER ] )
49964064216a8433360745f69edddce19a606659163The Android Open Source Project        {
50064064216a8433360745f69edddce19a606659163The Android Open Source Project            return SCAN_CRS_SCAN_FAILED;
50164064216a8433360745f69edddce19a606659163The Android Open Source Project        }
50264064216a8433360745f69edddce19a606659163The Android Open Source Project        else
50364064216a8433360745f69edddce19a606659163The Android Open Source Project        {
50464064216a8433360745f69edddce19a606659163The Android Open Source Project            /* copy scan parameters to local buffer */
50564064216a8433360745f69edddce19a606659163The Android Open Source Project            os_memoryCopy( pScanConcentrator->hOS, &(pScanConcentrator->clientScanParams[ SCAN_SCC_DRIVER ]),
50664064216a8433360745f69edddce19a606659163The Android Open Source Project                           pScanParams, sizeof(scan_Params_t) );
50764064216a8433360745f69edddce19a606659163The Android Open Source Project
50864064216a8433360745f69edddce19a606659163The Android Open Source Project            if ((pScanConcentrator->bUseSGParams) && (pScanConcentrator->clientScanParams[ SCAN_SCC_DRIVER ].band == RADIO_BAND_2_4_GHZ))
50964064216a8433360745f69edddce19a606659163The Android Open Source Project            {
51064064216a8433360745f69edddce19a606659163The Android Open Source Project				WLAN_REPORT_INFORMATION( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG,("SG is pn && RADIO_BAND_2_4_GHZ \n"));
51164064216a8433360745f69edddce19a606659163The Android Open Source Project                scanConcentrator_SGupdateScanParams(hScanCncn,&(pScanConcentrator->clientScanParams[ SCAN_SCC_DRIVER ]));
51264064216a8433360745f69edddce19a606659163The Android Open Source Project            }
51364064216a8433360745f69edddce19a606659163The Android Open Source Project
51464064216a8433360745f69edddce19a606659163The Android Open Source Project            /* mark that a scan request is in progress (to avoid client re-entrance if the scan fail) */
51564064216a8433360745f69edddce19a606659163The Android Open Source Project            pScanConcentrator->bInRequest = TRUE;
51664064216a8433360745f69edddce19a606659163The Android Open Source Project
51764064216a8433360745f69edddce19a606659163The Android Open Source Project            /* mark the scan result as OK (until other status will replace it) */
51864064216a8433360745f69edddce19a606659163The Android Open Source Project            pScanConcentrator->scanResult[ SCAN_SCC_DRIVER ] = SCAN_CRS_SCAN_COMPLETE_OK;
51964064216a8433360745f69edddce19a606659163The Android Open Source Project
52064064216a8433360745f69edddce19a606659163The Android Open Source Project            /* send probe request template */
52164064216a8433360745f69edddce19a606659163The Android Open Source Project            if ( (SCAN_TYPE_NORMAL_ACTIVE == pScanParams->scanType) ||
52264064216a8433360745f69edddce19a606659163The Android Open Source Project                 (SCAN_TYPE_TRIGGERED_ACTIVE == pScanParams->scanType) )
52364064216a8433360745f69edddce19a606659163The Android Open Source Project            {
52464064216a8433360745f69edddce19a606659163The Android Open Source Project
52564064216a8433360745f69edddce19a606659163The Android Open Source Project                templateStruct.pTemplate = (UINT8 *)&probeReqTemplate;
52664064216a8433360745f69edddce19a606659163The Android Open Source Project                templateStruct.templateType = PROBE_REQUEST_TEMPLATE;
52764064216a8433360745f69edddce19a606659163The Android Open Source Project                buildProbeReqTemplate( pScanConcentrator->hSiteManager, &templateStruct,
52864064216a8433360745f69edddce19a606659163The Android Open Source Project					&(pScanConcentrator->clientScanParams[ SCAN_SCC_DRIVER ].desiredSsid),
52964064216a8433360745f69edddce19a606659163The Android Open Source Project					  pScanConcentrator->clientScanParams[ SCAN_SCC_DRIVER ].band);
53064064216a8433360745f69edddce19a606659163The Android Open Source Project                whalCtrl_SetTemplate( pScanConcentrator->hHalCtrl, &templateStruct);
53164064216a8433360745f69edddce19a606659163The Android Open Source Project            }
53264064216a8433360745f69edddce19a606659163The Android Open Source Project            /* send a start scan event to the SM */
53364064216a8433360745f69edddce19a606659163The Android Open Source Project            scanConcentratorDrvSM_SMEvent( hScanCncn,
53464064216a8433360745f69edddce19a606659163The Android Open Source Project                                           (scan_drvSMStates_e*)&(pScanConcentrator->clientSMState[ SCAN_SCC_DRIVER ]),
53564064216a8433360745f69edddce19a606659163The Android Open Source Project                                           DRV_SCAN_EVENT_START_SCAN );
53664064216a8433360745f69edddce19a606659163The Android Open Source Project
53764064216a8433360745f69edddce19a606659163The Android Open Source Project            /* mark that the scan request is no longer in progress */
53864064216a8433360745f69edddce19a606659163The Android Open Source Project            pScanConcentrator->bInRequest = FALSE;
53964064216a8433360745f69edddce19a606659163The Android Open Source Project
54064064216a8433360745f69edddce19a606659163The Android Open Source Project            /* return scan result */
54164064216a8433360745f69edddce19a606659163The Android Open Source Project            if ( SCAN_CRS_SCAN_COMPLETE_OK == pScanConcentrator->scanResult[ SCAN_SCC_DRIVER ] )
54264064216a8433360745f69edddce19a606659163The Android Open Source Project            {
54364064216a8433360745f69edddce19a606659163The Android Open Source Project                return SCAN_CRS_SCAN_RUNNING;
54464064216a8433360745f69edddce19a606659163The Android Open Source Project            }
54564064216a8433360745f69edddce19a606659163The Android Open Source Project            else
54664064216a8433360745f69edddce19a606659163The Android Open Source Project            {
54764064216a8433360745f69edddce19a606659163The Android Open Source Project                return pScanConcentrator->scanResult[ SCAN_SCC_DRIVER ];
54864064216a8433360745f69edddce19a606659163The Android Open Source Project            }
54964064216a8433360745f69edddce19a606659163The Android Open Source Project        }
55064064216a8433360745f69edddce19a606659163The Android Open Source Project/*        break; - unreachable */
55164064216a8433360745f69edddce19a606659163The Android Open Source Project
55264064216a8433360745f69edddce19a606659163The Android Open Source Project    case SCAN_SCC_ROAMING_CONT:
55364064216a8433360745f69edddce19a606659163The Android Open Source Project        /* check that the continuous roaming state machine is in IDLE state
55464064216a8433360745f69edddce19a606659163The Android Open Source Project           (no more than one scan at a time per client is allowed)*/
55564064216a8433360745f69edddce19a606659163The Android Open Source Project        if ( CONT_SCAN_STATE_IDLE != pScanConcentrator->clientSMState[ SCAN_SCC_ROAMING_CONT ] )
55664064216a8433360745f69edddce19a606659163The Android Open Source Project        {
55764064216a8433360745f69edddce19a606659163The Android Open Source Project            return SCAN_CRS_SCAN_FAILED;
55864064216a8433360745f69edddce19a606659163The Android Open Source Project        }
55964064216a8433360745f69edddce19a606659163The Android Open Source Project        else
56064064216a8433360745f69edddce19a606659163The Android Open Source Project        {
56164064216a8433360745f69edddce19a606659163The Android Open Source Project            /* copy scan parameters to local buffer */
56264064216a8433360745f69edddce19a606659163The Android Open Source Project            os_memoryCopy( pScanConcentrator->hOS, &(pScanConcentrator->clientScanParams[ SCAN_SCC_ROAMING_CONT ]),
56364064216a8433360745f69edddce19a606659163The Android Open Source Project                           pScanParams, sizeof(scan_Params_t) );
56464064216a8433360745f69edddce19a606659163The Android Open Source Project
56564064216a8433360745f69edddce19a606659163The Android Open Source Project            if ((pScanConcentrator->clientScanParams[ SCAN_SCC_ROAMING_CONT ].desiredSsid.len!=0) &&
56664064216a8433360745f69edddce19a606659163The Android Open Source Project                ((pScanConcentrator->clientScanParams[ SCAN_SCC_ROAMING_CONT ].scanType == SCAN_TYPE_NORMAL_ACTIVE) ||
56764064216a8433360745f69edddce19a606659163The Android Open Source Project                 (pScanConcentrator->clientScanParams[ SCAN_SCC_ROAMING_CONT ].scanType == SCAN_TYPE_TRIGGERED_ACTIVE)))
56864064216a8433360745f69edddce19a606659163The Android Open Source Project            {
56964064216a8433360745f69edddce19a606659163The Android Open Source Project                /* set the SSID of the current AP */
57064064216a8433360745f69edddce19a606659163The Android Open Source Project                param.paramType = SITE_MGR_DESIRED_SSID_PARAM;
57164064216a8433360745f69edddce19a606659163The Android Open Source Project                siteMgr_getParam( pScanConcentrator->hSiteManager, &param );
57264064216a8433360745f69edddce19a606659163The Android Open Source Project                os_memoryCopy( pScanConcentrator->hOS,
57364064216a8433360745f69edddce19a606659163The Android Open Source Project                               &(pScanConcentrator->clientScanParams[ SCAN_SCC_ROAMING_CONT ].desiredSsid),
57464064216a8433360745f69edddce19a606659163The Android Open Source Project                               &(param.content.siteMgrDesiredSSID),
57564064216a8433360745f69edddce19a606659163The Android Open Source Project                               sizeof(ssid_t) );
57664064216a8433360745f69edddce19a606659163The Android Open Source Project
57764064216a8433360745f69edddce19a606659163The Android Open Source Project            }
57864064216a8433360745f69edddce19a606659163The Android Open Source Project            WLAN_REPORT_INFORMATION( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG,
57964064216a8433360745f69edddce19a606659163The Android Open Source Project                                     ("CONT Scan: The scan SSID is %s\n", pScanConcentrator->clientScanParams[ SCAN_SCC_ROAMING_CONT ].desiredSsid.ssidString) );
58064064216a8433360745f69edddce19a606659163The Android Open Source Project
58164064216a8433360745f69edddce19a606659163The Android Open Source Project            /* ask the reg domain which channels are allowed for the requested scan type */
58264064216a8433360745f69edddce19a606659163The Android Open Source Project            scanConcentrator_verifyChannelsWithRegDomain( hScanCncn, &(pScanConcentrator->clientScanParams[ SCAN_SCC_ROAMING_CONT ]) );
58364064216a8433360745f69edddce19a606659163The Android Open Source Project
58464064216a8433360745f69edddce19a606659163The Android Open Source Project            /* if no channels are available for scan, return negative result */
58564064216a8433360745f69edddce19a606659163The Android Open Source Project            if ( 0 == pScanConcentrator->clientScanParams[ SCAN_SCC_ROAMING_CONT ].numOfChannels )
58664064216a8433360745f69edddce19a606659163The Android Open Source Project            {
58764064216a8433360745f69edddce19a606659163The Android Open Source Project                return SCAN_CRS_SCAN_FAILED;
58864064216a8433360745f69edddce19a606659163The Android Open Source Project            }
58964064216a8433360745f69edddce19a606659163The Android Open Source Project
59064064216a8433360745f69edddce19a606659163The Android Open Source Project            if ((pScanConcentrator->bUseSGParams) && (pScanConcentrator->clientScanParams[ SCAN_SCC_ROAMING_CONT ].band == RADIO_BAND_2_4_GHZ))
59164064216a8433360745f69edddce19a606659163The Android Open Source Project            {
59264064216a8433360745f69edddce19a606659163The Android Open Source Project				WLAN_REPORT_INFORMATION( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG,("SG is pn && RADIO_BAND_2_4_GHZ \n"));
59364064216a8433360745f69edddce19a606659163The Android Open Source Project                scanConcentrator_SGupdateScanParams(hScanCncn,&(pScanConcentrator->clientScanParams[ SCAN_SCC_ROAMING_CONT ]));
59464064216a8433360745f69edddce19a606659163The Android Open Source Project            }
59564064216a8433360745f69edddce19a606659163The Android Open Source Project
59664064216a8433360745f69edddce19a606659163The Android Open Source Project            /* mark that a scan request is in progress (to avoid client re-entrance if the scan fail) */
59764064216a8433360745f69edddce19a606659163The Android Open Source Project            pScanConcentrator->bInRequest = TRUE;
59864064216a8433360745f69edddce19a606659163The Android Open Source Project
59964064216a8433360745f69edddce19a606659163The Android Open Source Project            /* mark the scan result as OK (until other status will replace it) */
60064064216a8433360745f69edddce19a606659163The Android Open Source Project            pScanConcentrator->scanResult[ SCAN_SCC_ROAMING_CONT ] = SCAN_CRS_SCAN_COMPLETE_OK;
60164064216a8433360745f69edddce19a606659163The Android Open Source Project
60264064216a8433360745f69edddce19a606659163The Android Open Source Project            /* send probe request template */
60364064216a8433360745f69edddce19a606659163The Android Open Source Project            if ( (SCAN_TYPE_NORMAL_ACTIVE == pScanParams->scanType) ||
60464064216a8433360745f69edddce19a606659163The Android Open Source Project                 (SCAN_TYPE_TRIGGERED_ACTIVE == pScanParams->scanType) )
60564064216a8433360745f69edddce19a606659163The Android Open Source Project            {
60664064216a8433360745f69edddce19a606659163The Android Open Source Project
60764064216a8433360745f69edddce19a606659163The Android Open Source Project                templateStruct.pTemplate = (UINT8 *)&probeReqTemplate;
60864064216a8433360745f69edddce19a606659163The Android Open Source Project                templateStruct.templateType = PROBE_REQUEST_TEMPLATE;
60964064216a8433360745f69edddce19a606659163The Android Open Source Project                buildProbeReqTemplate( pScanConcentrator->hSiteManager, &templateStruct,
61064064216a8433360745f69edddce19a606659163The Android Open Source Project					&(pScanConcentrator->clientScanParams[ SCAN_SCC_ROAMING_CONT ].desiredSsid),
61164064216a8433360745f69edddce19a606659163The Android Open Source Project					  pScanConcentrator->clientScanParams[ SCAN_SCC_ROAMING_CONT ].band);
61264064216a8433360745f69edddce19a606659163The Android Open Source Project                whalCtrl_SetTemplate( pScanConcentrator->hHalCtrl, &templateStruct);
61364064216a8433360745f69edddce19a606659163The Android Open Source Project            }
61464064216a8433360745f69edddce19a606659163The Android Open Source Project
61564064216a8433360745f69edddce19a606659163The Android Open Source Project            /* send a start scan event to the SM */
61664064216a8433360745f69edddce19a606659163The Android Open Source Project            scanConcentratorRoamingContSM_SMEvent( hScanCncn,
61764064216a8433360745f69edddce19a606659163The Android Open Source Project                                                   (scan_contSMStates_e*)&(pScanConcentrator->clientSMState[ SCAN_SCC_ROAMING_CONT ]),
61864064216a8433360745f69edddce19a606659163The Android Open Source Project                                                   CONT_SCAN_EVENT_START_SCAN );
61964064216a8433360745f69edddce19a606659163The Android Open Source Project
62064064216a8433360745f69edddce19a606659163The Android Open Source Project            /* mark that the scan request is no longer in progress */
62164064216a8433360745f69edddce19a606659163The Android Open Source Project            pScanConcentrator->bInRequest = FALSE;
62264064216a8433360745f69edddce19a606659163The Android Open Source Project
62364064216a8433360745f69edddce19a606659163The Android Open Source Project            /* return scan result */
62464064216a8433360745f69edddce19a606659163The Android Open Source Project            if ( SCAN_CRS_SCAN_COMPLETE_OK == pScanConcentrator->scanResult[ SCAN_SCC_ROAMING_CONT ] )
62564064216a8433360745f69edddce19a606659163The Android Open Source Project            {
62664064216a8433360745f69edddce19a606659163The Android Open Source Project                return SCAN_CRS_SCAN_RUNNING;
62764064216a8433360745f69edddce19a606659163The Android Open Source Project            }
62864064216a8433360745f69edddce19a606659163The Android Open Source Project            else
62964064216a8433360745f69edddce19a606659163The Android Open Source Project            {
63064064216a8433360745f69edddce19a606659163The Android Open Source Project                return pScanConcentrator->scanResult[ SCAN_SCC_ROAMING_CONT ];
63164064216a8433360745f69edddce19a606659163The Android Open Source Project            }
63264064216a8433360745f69edddce19a606659163The Android Open Source Project        }
63364064216a8433360745f69edddce19a606659163The Android Open Source Project/*        break; - unreachable */
63464064216a8433360745f69edddce19a606659163The Android Open Source Project
63564064216a8433360745f69edddce19a606659163The Android Open Source Project    case SCAN_SCC_ROAMING_IMMED:
63664064216a8433360745f69edddce19a606659163The Android Open Source Project        /* check that the immediate roaming state machine is in IDLE state
63764064216a8433360745f69edddce19a606659163The Android Open Source Project           (no more than one scan at a time per client is allowed)*/
63864064216a8433360745f69edddce19a606659163The Android Open Source Project        if ( IMMED_SCAN_STATE_IDLE != pScanConcentrator->clientSMState[ SCAN_SCC_ROAMING_IMMED ] )
63964064216a8433360745f69edddce19a606659163The Android Open Source Project        {
64064064216a8433360745f69edddce19a606659163The Android Open Source Project            return SCAN_CRS_SCAN_FAILED;
64164064216a8433360745f69edddce19a606659163The Android Open Source Project        }
64264064216a8433360745f69edddce19a606659163The Android Open Source Project        else
64364064216a8433360745f69edddce19a606659163The Android Open Source Project        {
64464064216a8433360745f69edddce19a606659163The Android Open Source Project
64564064216a8433360745f69edddce19a606659163The Android Open Source Project            /* copy scan parameters to local buffer */
64664064216a8433360745f69edddce19a606659163The Android Open Source Project            os_memoryCopy( pScanConcentrator->hOS, &(pScanConcentrator->clientScanParams[ SCAN_SCC_ROAMING_IMMED ]),
64764064216a8433360745f69edddce19a606659163The Android Open Source Project                     pScanParams, sizeof(scan_Params_t) );
64864064216a8433360745f69edddce19a606659163The Android Open Source Project
64964064216a8433360745f69edddce19a606659163The Android Open Source Project            /* set the SSID of the current AP */
65064064216a8433360745f69edddce19a606659163The Android Open Source Project            param.paramType = SITE_MGR_DESIRED_SSID_PARAM;
65164064216a8433360745f69edddce19a606659163The Android Open Source Project            siteMgr_getParam( pScanConcentrator->hSiteManager, &param );
65264064216a8433360745f69edddce19a606659163The Android Open Source Project            os_memoryCopy( pScanConcentrator->hOS,
65364064216a8433360745f69edddce19a606659163The Android Open Source Project                   &(pScanConcentrator->clientScanParams[ SCAN_SCC_ROAMING_IMMED ].desiredSsid),
65464064216a8433360745f69edddce19a606659163The Android Open Source Project                   &(param.content.siteMgrDesiredSSID),
65564064216a8433360745f69edddce19a606659163The Android Open Source Project                   sizeof(ssid_t) );
65664064216a8433360745f69edddce19a606659163The Android Open Source Project
65764064216a8433360745f69edddce19a606659163The Android Open Source Project            /* ask the reg domain which channels are allowed for the requested scan type */
65864064216a8433360745f69edddce19a606659163The Android Open Source Project            scanConcentrator_verifyChannelsWithRegDomain( hScanCncn, &(pScanConcentrator->clientScanParams[ SCAN_SCC_ROAMING_IMMED ]) );
65964064216a8433360745f69edddce19a606659163The Android Open Source Project
66064064216a8433360745f69edddce19a606659163The Android Open Source Project            /* if no channels are available for scan, return negative result */
66164064216a8433360745f69edddce19a606659163The Android Open Source Project            if ( 0 == pScanConcentrator->clientScanParams[ SCAN_SCC_ROAMING_IMMED ].numOfChannels )
66264064216a8433360745f69edddce19a606659163The Android Open Source Project            {
66364064216a8433360745f69edddce19a606659163The Android Open Source Project                return SCAN_CRS_SCAN_FAILED;
66464064216a8433360745f69edddce19a606659163The Android Open Source Project            }
66564064216a8433360745f69edddce19a606659163The Android Open Source Project
66664064216a8433360745f69edddce19a606659163The Android Open Source Project            if ((pScanConcentrator->bUseSGParams) && (pScanConcentrator->clientScanParams[ SCAN_SCC_ROAMING_IMMED ].band == RADIO_BAND_2_4_GHZ))
66764064216a8433360745f69edddce19a606659163The Android Open Source Project            {
66864064216a8433360745f69edddce19a606659163The Android Open Source Project				WLAN_REPORT_INFORMATION( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG,("SG is pn && RADIO_BAND_2_4_GHZ \n"));
66964064216a8433360745f69edddce19a606659163The Android Open Source Project                scanConcentrator_SGupdateScanParams(hScanCncn,&(pScanConcentrator->clientScanParams[ SCAN_SCC_ROAMING_IMMED ]));
67064064216a8433360745f69edddce19a606659163The Android Open Source Project            }
67164064216a8433360745f69edddce19a606659163The Android Open Source Project
67264064216a8433360745f69edddce19a606659163The Android Open Source Project            /* mark that a scan request is in progress (to avoid client re-entrance if the scan fail) */
67364064216a8433360745f69edddce19a606659163The Android Open Source Project            pScanConcentrator->bInRequest = TRUE;
67464064216a8433360745f69edddce19a606659163The Android Open Source Project
67564064216a8433360745f69edddce19a606659163The Android Open Source Project            /* mark the scan result as OK (until other status will replace it) */
67664064216a8433360745f69edddce19a606659163The Android Open Source Project            pScanConcentrator->scanResult[ SCAN_SCC_ROAMING_IMMED ] = SCAN_CRS_SCAN_COMPLETE_OK;
67764064216a8433360745f69edddce19a606659163The Android Open Source Project
67864064216a8433360745f69edddce19a606659163The Android Open Source Project            /* send probe request template */
67964064216a8433360745f69edddce19a606659163The Android Open Source Project            if ( (SCAN_TYPE_NORMAL_ACTIVE == pScanParams->scanType) ||
68064064216a8433360745f69edddce19a606659163The Android Open Source Project                 (SCAN_TYPE_TRIGGERED_ACTIVE == pScanParams->scanType) )
68164064216a8433360745f69edddce19a606659163The Android Open Source Project            {
68264064216a8433360745f69edddce19a606659163The Android Open Source Project
68364064216a8433360745f69edddce19a606659163The Android Open Source Project                templateStruct.pTemplate = (UINT8 *)&probeReqTemplate;
68464064216a8433360745f69edddce19a606659163The Android Open Source Project                templateStruct.templateType = PROBE_REQUEST_TEMPLATE;
68564064216a8433360745f69edddce19a606659163The Android Open Source Project                buildProbeReqTemplate( pScanConcentrator->hSiteManager, &templateStruct,
68664064216a8433360745f69edddce19a606659163The Android Open Source Project					&(pScanConcentrator->clientScanParams[ SCAN_SCC_ROAMING_IMMED ].desiredSsid),
68764064216a8433360745f69edddce19a606659163The Android Open Source Project					  pScanConcentrator->clientScanParams[ SCAN_SCC_ROAMING_IMMED ].band);
68864064216a8433360745f69edddce19a606659163The Android Open Source Project                whalCtrl_SetTemplate( pScanConcentrator->hHalCtrl, &templateStruct);
68964064216a8433360745f69edddce19a606659163The Android Open Source Project            }
69064064216a8433360745f69edddce19a606659163The Android Open Source Project
69164064216a8433360745f69edddce19a606659163The Android Open Source Project            /* send a start scan event to the SM */
69264064216a8433360745f69edddce19a606659163The Android Open Source Project            scanConcentratorRoamingImmedSM_SMEvent( hScanCncn,
69364064216a8433360745f69edddce19a606659163The Android Open Source Project                                                    (scan_immedSMStates_e*)&(pScanConcentrator->clientSMState[ SCAN_SCC_ROAMING_IMMED ]),
69464064216a8433360745f69edddce19a606659163The Android Open Source Project                                                    IMMED_SCAN_EVENT_START_SCAN );
69564064216a8433360745f69edddce19a606659163The Android Open Source Project
69664064216a8433360745f69edddce19a606659163The Android Open Source Project            /* mark that the scan request is no longer in progress */
69764064216a8433360745f69edddce19a606659163The Android Open Source Project            pScanConcentrator->bInRequest = FALSE;
69864064216a8433360745f69edddce19a606659163The Android Open Source Project
69964064216a8433360745f69edddce19a606659163The Android Open Source Project            /* return scan result */
70064064216a8433360745f69edddce19a606659163The Android Open Source Project            if ( SCAN_CRS_SCAN_COMPLETE_OK == pScanConcentrator->scanResult[ SCAN_SCC_ROAMING_IMMED ] )
70164064216a8433360745f69edddce19a606659163The Android Open Source Project            {
70264064216a8433360745f69edddce19a606659163The Android Open Source Project                return SCAN_CRS_SCAN_RUNNING;
70364064216a8433360745f69edddce19a606659163The Android Open Source Project            }
70464064216a8433360745f69edddce19a606659163The Android Open Source Project            else
70564064216a8433360745f69edddce19a606659163The Android Open Source Project            {
70664064216a8433360745f69edddce19a606659163The Android Open Source Project                return pScanConcentrator->scanResult[ SCAN_SCC_ROAMING_IMMED ];
70764064216a8433360745f69edddce19a606659163The Android Open Source Project            }
70864064216a8433360745f69edddce19a606659163The Android Open Source Project        }
70964064216a8433360745f69edddce19a606659163The Android Open Source Project/*        break; - unreachable */
71064064216a8433360745f69edddce19a606659163The Android Open Source Project
71164064216a8433360745f69edddce19a606659163The Android Open Source Project    default:
71264064216a8433360745f69edddce19a606659163The Android Open Source Project        WLAN_REPORT_ERROR( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG,
71364064216a8433360745f69edddce19a606659163The Android Open Source Project                             ("Scan request from unknown client:%d\n", client) );
71464064216a8433360745f69edddce19a606659163The Android Open Source Project        return SCAN_CRS_SCAN_FAILED;
71564064216a8433360745f69edddce19a606659163The Android Open Source Project/*        break; - unreachable */
71664064216a8433360745f69edddce19a606659163The Android Open Source Project
71764064216a8433360745f69edddce19a606659163The Android Open Source Project    }
71864064216a8433360745f69edddce19a606659163The Android Open Source Project
71964064216a8433360745f69edddce19a606659163The Android Open Source Project/*    return SCAN_CRS_SCAN_RUNNING; - unreachable */
72064064216a8433360745f69edddce19a606659163The Android Open Source Project}
72164064216a8433360745f69edddce19a606659163The Android Open Source Project
72264064216a8433360745f69edddce19a606659163The Android Open Source Project/**
72364064216a8433360745f69edddce19a606659163The Android Open Source Project * \author Ronen Kalish\n
72464064216a8433360745f69edddce19a606659163The Android Open Source Project * \date 02-Jan-2005\n
72564064216a8433360745f69edddce19a606659163The Android Open Source Project * \brief Called by a client to stop a scan request in process. A client should ONLY stop its own request!
72664064216a8433360745f69edddce19a606659163The Android Open Source Project *
72764064216a8433360745f69edddce19a606659163The Android Open Source Project * Function Scope \e Public.\n
72864064216a8433360745f69edddce19a606659163The Android Open Source Project * \param hScanCncn - handle to the scan concentrator object.\n
72964064216a8433360745f69edddce19a606659163The Android Open Source Project * \param client - the client ID.\n
73064064216a8433360745f69edddce19a606659163The Android Open Source Project */
73164064216a8433360745f69edddce19a606659163The Android Open Source Projectvoid scanConcentrator_stopScan( TI_HANDLE hScanCncn, scan_CncnClient_e client )
73264064216a8433360745f69edddce19a606659163The Android Open Source Project{
73364064216a8433360745f69edddce19a606659163The Android Open Source Project    scanConcentrator_t* pScanConcentrator = (scanConcentrator_t*)hScanCncn;
73464064216a8433360745f69edddce19a606659163The Android Open Source Project
73564064216a8433360745f69edddce19a606659163The Android Open Source Project    WLAN_REPORT_INFORMATION( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG,
73664064216a8433360745f69edddce19a606659163The Android Open Source Project                             ("Received stop scan request from client %d\n", client) );
73764064216a8433360745f69edddce19a606659163The Android Open Source Project
73864064216a8433360745f69edddce19a606659163The Android Open Source Project    /* act according to client */
73964064216a8433360745f69edddce19a606659163The Android Open Source Project    switch ( client )
74064064216a8433360745f69edddce19a606659163The Android Open Source Project    {
74164064216a8433360745f69edddce19a606659163The Android Open Source Project    case SCAN_SCC_APP:
74264064216a8433360745f69edddce19a606659163The Android Open Source Project        /* if no previous error has occurred, change the state to stopped */
74364064216a8433360745f69edddce19a606659163The Android Open Source Project        if ( SCAN_CRS_SCAN_COMPLETE_OK == pScanConcentrator->scanResult[ SCAN_SCC_APP ] )
74464064216a8433360745f69edddce19a606659163The Android Open Source Project        {
74564064216a8433360745f69edddce19a606659163The Android Open Source Project            pScanConcentrator->scanResult[ SCAN_SCC_APP ] = SCAN_CRS_SCAN_STOPPED;
74664064216a8433360745f69edddce19a606659163The Android Open Source Project            /* set the abort or stop flag (to identify when to exit driver mode (stop) and
74764064216a8433360745f69edddce19a606659163The Android Open Source Project            when not (abort due to higher priority client) */
74864064216a8433360745f69edddce19a606659163The Android Open Source Project            pScanConcentrator->bAbortOrStop = SCAN_CNCN_STOP;
74964064216a8433360745f69edddce19a606659163The Android Open Source Project        }
75064064216a8433360745f69edddce19a606659163The Android Open Source Project        else if (SCAN_CRS_SCAN_ABORTED_HIGHER_PRIORITY != pScanConcentrator->scanResult[ SCAN_SCC_APP ])
75164064216a8433360745f69edddce19a606659163The Android Open Source Project        {   /* In all scan failures, besides abort, indicate the flag as STOP */
75264064216a8433360745f69edddce19a606659163The Android Open Source Project            /* set the abort or stop flag (to identify when to exit driver mode (stop) and
75364064216a8433360745f69edddce19a606659163The Android Open Source Project            when not (abort due to higher priority client) */
75464064216a8433360745f69edddce19a606659163The Android Open Source Project            pScanConcentrator->bAbortOrStop = SCAN_CNCN_STOP;
75564064216a8433360745f69edddce19a606659163The Android Open Source Project        }
75664064216a8433360745f69edddce19a606659163The Android Open Source Project
75764064216a8433360745f69edddce19a606659163The Android Open Source Project        /* send a stop scan event to the SM */
75864064216a8433360745f69edddce19a606659163The Android Open Source Project        scanConcentratorAppSM_SMEvent( hScanCncn,
75964064216a8433360745f69edddce19a606659163The Android Open Source Project                                       (scan_appSMStates_e*)&(pScanConcentrator->clientSMState[ SCAN_SCC_APP ]),
76064064216a8433360745f69edddce19a606659163The Android Open Source Project                                       APP_SCAN_EVENT_STOP_SCAN );
76164064216a8433360745f69edddce19a606659163The Android Open Source Project        break;
76264064216a8433360745f69edddce19a606659163The Android Open Source Project
76364064216a8433360745f69edddce19a606659163The Android Open Source Project    case SCAN_SCC_DRIVER:
76464064216a8433360745f69edddce19a606659163The Android Open Source Project        /* if no previous error has occurred, change the state to stopped */
76564064216a8433360745f69edddce19a606659163The Android Open Source Project        if ( SCAN_CRS_SCAN_COMPLETE_OK == pScanConcentrator->scanResult[ SCAN_SCC_DRIVER ] )
76664064216a8433360745f69edddce19a606659163The Android Open Source Project        {
76764064216a8433360745f69edddce19a606659163The Android Open Source Project            pScanConcentrator->scanResult[ SCAN_SCC_DRIVER ] = SCAN_CRS_SCAN_STOPPED;
76864064216a8433360745f69edddce19a606659163The Android Open Source Project        }
76964064216a8433360745f69edddce19a606659163The Android Open Source Project
77064064216a8433360745f69edddce19a606659163The Android Open Source Project        /* send a stop scan event to the SM */
77164064216a8433360745f69edddce19a606659163The Android Open Source Project        scanConcentratorDrvSM_SMEvent( hScanCncn,
77264064216a8433360745f69edddce19a606659163The Android Open Source Project                                       (scan_drvSMStates_e*)&(pScanConcentrator->clientSMState[ SCAN_SCC_DRIVER ]),
77364064216a8433360745f69edddce19a606659163The Android Open Source Project                                       DRV_SCAN_EVENT_STOP_SCAN );
77464064216a8433360745f69edddce19a606659163The Android Open Source Project        break;
77564064216a8433360745f69edddce19a606659163The Android Open Source Project
77664064216a8433360745f69edddce19a606659163The Android Open Source Project    case SCAN_SCC_ROAMING_CONT:
77764064216a8433360745f69edddce19a606659163The Android Open Source Project        /* if no previous error has occurred, change the state to stopped */
77864064216a8433360745f69edddce19a606659163The Android Open Source Project        if ( SCAN_CRS_SCAN_COMPLETE_OK == pScanConcentrator->scanResult[ SCAN_SCC_ROAMING_CONT ] )
77964064216a8433360745f69edddce19a606659163The Android Open Source Project        {
78064064216a8433360745f69edddce19a606659163The Android Open Source Project            pScanConcentrator->scanResult[ SCAN_SCC_ROAMING_CONT ] = SCAN_CRS_SCAN_STOPPED;
78164064216a8433360745f69edddce19a606659163The Android Open Source Project
78264064216a8433360745f69edddce19a606659163The Android Open Source Project            /* set the abort or stop flag (to identify when to exit driver mode (stop) and
78364064216a8433360745f69edddce19a606659163The Android Open Source Project            when not (abort due to higher priority client) */
78464064216a8433360745f69edddce19a606659163The Android Open Source Project            pScanConcentrator->bAbortOrStop = SCAN_CNCN_STOP;
78564064216a8433360745f69edddce19a606659163The Android Open Source Project        }
78664064216a8433360745f69edddce19a606659163The Android Open Source Project        else if (SCAN_CRS_SCAN_ABORTED_HIGHER_PRIORITY != pScanConcentrator->scanResult[ SCAN_SCC_ROAMING_CONT ])
78764064216a8433360745f69edddce19a606659163The Android Open Source Project        {   /* In all scan failures, besides abort, indicate the flag as STOP */
78864064216a8433360745f69edddce19a606659163The Android Open Source Project            /* set the abort or stop flag (to identify when to exit driver mode (stop) and
78964064216a8433360745f69edddce19a606659163The Android Open Source Project            when not (abort due to higher priority client) */
79064064216a8433360745f69edddce19a606659163The Android Open Source Project            pScanConcentrator->bAbortOrStop = SCAN_CNCN_STOP;
79164064216a8433360745f69edddce19a606659163The Android Open Source Project        }
79264064216a8433360745f69edddce19a606659163The Android Open Source Project
79364064216a8433360745f69edddce19a606659163The Android Open Source Project        /* send a stop scan event to the SM */
79464064216a8433360745f69edddce19a606659163The Android Open Source Project        scanConcentratorRoamingContSM_SMEvent( hScanCncn,
79564064216a8433360745f69edddce19a606659163The Android Open Source Project                                               (scan_contSMStates_e*)&(pScanConcentrator->clientSMState[ SCAN_SCC_ROAMING_CONT ]),
79664064216a8433360745f69edddce19a606659163The Android Open Source Project                                               CONT_SCAN_EVENT_STOP_SCAN );
79764064216a8433360745f69edddce19a606659163The Android Open Source Project        break;
79864064216a8433360745f69edddce19a606659163The Android Open Source Project
79964064216a8433360745f69edddce19a606659163The Android Open Source Project    case SCAN_SCC_ROAMING_IMMED:
80064064216a8433360745f69edddce19a606659163The Android Open Source Project        /* if no previous error has occurred, change the state to stopped */
80164064216a8433360745f69edddce19a606659163The Android Open Source Project        if ( SCAN_CRS_SCAN_COMPLETE_OK == pScanConcentrator->scanResult[ SCAN_SCC_ROAMING_IMMED ] )
80264064216a8433360745f69edddce19a606659163The Android Open Source Project        {
80364064216a8433360745f69edddce19a606659163The Android Open Source Project            pScanConcentrator->scanResult[ SCAN_SCC_ROAMING_IMMED ] = SCAN_CRS_SCAN_STOPPED;
80464064216a8433360745f69edddce19a606659163The Android Open Source Project
80564064216a8433360745f69edddce19a606659163The Android Open Source Project            /* set the abort or stop flag (to identify when to exit driver mode (stop) and
80664064216a8433360745f69edddce19a606659163The Android Open Source Project            when not (abort due to higher priority client) */
80764064216a8433360745f69edddce19a606659163The Android Open Source Project            pScanConcentrator->bAbortOrStop = SCAN_CNCN_STOP;
80864064216a8433360745f69edddce19a606659163The Android Open Source Project        }
80964064216a8433360745f69edddce19a606659163The Android Open Source Project        else if (SCAN_CRS_SCAN_ABORTED_HIGHER_PRIORITY != pScanConcentrator->scanResult[ SCAN_SCC_ROAMING_IMMED ])
81064064216a8433360745f69edddce19a606659163The Android Open Source Project        {   /* In all scan failures, besides abort, indicate the flag as STOP */
81164064216a8433360745f69edddce19a606659163The Android Open Source Project            /* set the abort or stop flag (to identify when to exit driver mode (stop) and
81264064216a8433360745f69edddce19a606659163The Android Open Source Project            when not (abort due to higher priority client) */
81364064216a8433360745f69edddce19a606659163The Android Open Source Project            pScanConcentrator->bAbortOrStop = SCAN_CNCN_STOP;
81464064216a8433360745f69edddce19a606659163The Android Open Source Project        }
81564064216a8433360745f69edddce19a606659163The Android Open Source Project
81664064216a8433360745f69edddce19a606659163The Android Open Source Project        /* send a stop scan event to the SM */
81764064216a8433360745f69edddce19a606659163The Android Open Source Project        scanConcentratorRoamingImmedSM_SMEvent( hScanCncn,
81864064216a8433360745f69edddce19a606659163The Android Open Source Project                                                (scan_immedSMStates_e*)&(pScanConcentrator->clientSMState[ SCAN_SCC_ROAMING_IMMED ]),
81964064216a8433360745f69edddce19a606659163The Android Open Source Project                                                IMMED_SCAN_EVENT_STOP_SCAN );
82064064216a8433360745f69edddce19a606659163The Android Open Source Project        break;
82164064216a8433360745f69edddce19a606659163The Android Open Source Project
82264064216a8433360745f69edddce19a606659163The Android Open Source Project    default:
82364064216a8433360745f69edddce19a606659163The Android Open Source Project        WLAN_REPORT_WARNING( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG,
82464064216a8433360745f69edddce19a606659163The Android Open Source Project                             ("Stop scan request with illegal client %d, aborting request.\n", client) );
82564064216a8433360745f69edddce19a606659163The Android Open Source Project        break;
82664064216a8433360745f69edddce19a606659163The Android Open Source Project    }
82764064216a8433360745f69edddce19a606659163The Android Open Source Project}
82864064216a8433360745f69edddce19a606659163The Android Open Source Project
82964064216a8433360745f69edddce19a606659163The Android Open Source Project/**
83064064216a8433360745f69edddce19a606659163The Android Open Source Project * \author Ronen Kalish\n
83164064216a8433360745f69edddce19a606659163The Android Open Source Project * \date 02-Jan-2005\n
83264064216a8433360745f69edddce19a606659163The Android Open Source Project * \brief Registers a scan result function for a specific client.
83364064216a8433360745f69edddce19a606659163The Android Open Source Project *
83464064216a8433360745f69edddce19a606659163The Android Open Source Project * Function Scope \e Public.\n
83564064216a8433360745f69edddce19a606659163The Android Open Source Project * \param hScanCncn - handle to the scan concentrator object.\n
83664064216a8433360745f69edddce19a606659163The Android Open Source Project * \param client - the client ID.\n
83764064216a8433360745f69edddce19a606659163The Android Open Source Project * \param scanResultCBFunc - the function to use.\n
83864064216a8433360745f69edddce19a606659163The Android Open Source Project * \param scanresultCBObj - the object to pass to the scan result CB function.\n
83964064216a8433360745f69edddce19a606659163The Android Open Source Project */
84064064216a8433360745f69edddce19a606659163The Android Open Source Projectvoid scanConcentrator_registerScanResultCB( TI_HANDLE hScanCncn, scan_CncnClient_e client,
84164064216a8433360745f69edddce19a606659163The Android Open Source Project                                            scan_resultCB_t scanResultCBFunc, TI_HANDLE scanResultCBObj )
84264064216a8433360745f69edddce19a606659163The Android Open Source Project{
84364064216a8433360745f69edddce19a606659163The Android Open Source Project    scanConcentrator_t* pScanConcentrator = (scanConcentrator_t*)hScanCncn;
84464064216a8433360745f69edddce19a606659163The Android Open Source Project
84564064216a8433360745f69edddce19a606659163The Android Open Source Project    /* save the function and object pointers */
84664064216a8433360745f69edddce19a606659163The Android Open Source Project    pScanConcentrator->scanResultCB[ client ] = scanResultCBFunc;
84764064216a8433360745f69edddce19a606659163The Android Open Source Project    pScanConcentrator->scanResultCBObj[ client ] = scanResultCBObj;
84864064216a8433360745f69edddce19a606659163The Android Open Source Project}
84964064216a8433360745f69edddce19a606659163The Android Open Source Project
85064064216a8433360745f69edddce19a606659163The Android Open Source Project/**
85164064216a8433360745f69edddce19a606659163The Android Open Source Project * \author Ronen Kalish\n
85264064216a8433360745f69edddce19a606659163The Android Open Source Project * \date 02-Jan-2005\n
85364064216a8433360745f69edddce19a606659163The Android Open Source Project * \brief Called by the scan SRV (after registration) to notify of a scan complete event.
85464064216a8433360745f69edddce19a606659163The Android Open Source Project *
85564064216a8433360745f69edddce19a606659163The Android Open Source Project * Function Scope \e Public.\n
85664064216a8433360745f69edddce19a606659163The Android Open Source Project * \param hScanCncn - handle to the scan concentrator object.\n
85764064216a8433360745f69edddce19a606659163The Android Open Source Project * \param SPSStatus - which channels were attempted (if SPS scan).\n
85864064216a8433360745f69edddce19a606659163The Android Open Source Project * \param bTSFError - whether a TSF error occurred (if SPS scan).\n
85964064216a8433360745f69edddce19a606659163The Android Open Source Project * \param  ScanStatus - return the status of the scan . \n
86064064216a8433360745f69edddce19a606659163The Android Open Source Project */
86164064216a8433360745f69edddce19a606659163The Android Open Source Projectvoid scanConcentrator_scanCompleteNotificationCB( TI_HANDLE hScanCncn, UINT16 SPSStatus, BOOLEAN bTSFError , TI_STATUS ScanStatus , TI_STATUS PSMode )
86264064216a8433360745f69edddce19a606659163The Android Open Source Project{
86364064216a8433360745f69edddce19a606659163The Android Open Source Project    scanConcentrator_t* pScanConcentrator = (scanConcentrator_t*)hScanCncn;
86464064216a8433360745f69edddce19a606659163The Android Open Source Project
86564064216a8433360745f69edddce19a606659163The Android Open Source Project     /* start built-in test timer */
86664064216a8433360745f69edddce19a606659163The Android Open Source Project    healthMonitor_resumePeriodicTest( pScanConcentrator->hHealthMonitor );
86764064216a8433360745f69edddce19a606659163The Android Open Source Project
86864064216a8433360745f69edddce19a606659163The Android Open Source Project#ifdef TI_DBG
86964064216a8433360745f69edddce19a606659163The Android Open Source Project    /* check that current running client is valid */
87064064216a8433360745f69edddce19a606659163The Android Open Source Project    if ( SCAN_SCC_NO_CLIENT == pScanConcentrator->currentRunningScanClient )
87164064216a8433360745f69edddce19a606659163The Android Open Source Project    {
87264064216a8433360745f69edddce19a606659163The Android Open Source Project        WLAN_REPORT_ERROR( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG,
87364064216a8433360745f69edddce19a606659163The Android Open Source Project                           ("Scan complete called when current running client is invalid: %d\n",
87464064216a8433360745f69edddce19a606659163The Android Open Source Project                            pScanConcentrator->currentRunningScanClient) );
87564064216a8433360745f69edddce19a606659163The Android Open Source Project        return;
87664064216a8433360745f69edddce19a606659163The Android Open Source Project    }
87764064216a8433360745f69edddce19a606659163The Android Open Source Project#endif
87864064216a8433360745f69edddce19a606659163The Android Open Source Project    /* send a scan complete event to the running client (according to its type) */
87964064216a8433360745f69edddce19a606659163The Android Open Source Project    switch ( pScanConcentrator->currentRunningScanClient )
88064064216a8433360745f69edddce19a606659163The Android Open Source Project    {
88164064216a8433360745f69edddce19a606659163The Android Open Source Project    case SCAN_SCC_APP:
88264064216a8433360745f69edddce19a606659163The Android Open Source Project        scanConcentratorAppSM_SMEvent( hScanCncn,
88364064216a8433360745f69edddce19a606659163The Android Open Source Project                                       (scan_appSMStates_e*)&(pScanConcentrator->clientSMState[ SCAN_SCC_APP ]),
88464064216a8433360745f69edddce19a606659163The Android Open Source Project                                       APP_SCAN_EVENT_SCAN_COMPLETE );
88564064216a8433360745f69edddce19a606659163The Android Open Source Project        break;
88664064216a8433360745f69edddce19a606659163The Android Open Source Project
88764064216a8433360745f69edddce19a606659163The Android Open Source Project    case SCAN_SCC_DRIVER:
88864064216a8433360745f69edddce19a606659163The Android Open Source Project        scanConcentratorDrvSM_SMEvent( hScanCncn,
88964064216a8433360745f69edddce19a606659163The Android Open Source Project                                       (scan_drvSMStates_e*)&(pScanConcentrator->clientSMState[ SCAN_SCC_DRIVER ]),
89064064216a8433360745f69edddce19a606659163The Android Open Source Project                                       scanConcentrator_getNextDriverEvent( hScanCncn ) );
89164064216a8433360745f69edddce19a606659163The Android Open Source Project        break;
89264064216a8433360745f69edddce19a606659163The Android Open Source Project
89364064216a8433360745f69edddce19a606659163The Android Open Source Project    case SCAN_SCC_ROAMING_CONT:
89464064216a8433360745f69edddce19a606659163The Android Open Source Project        /* copy the SPS scan result (in case this was an SPS scan) */
89564064216a8433360745f69edddce19a606659163The Android Open Source Project        pScanConcentrator->SPSScanResult = SPSStatus;
89664064216a8433360745f69edddce19a606659163The Android Open Source Project
89764064216a8433360745f69edddce19a606659163The Android Open Source Project        /* if A TSF error occurred (for non-SPS scans this value is always FALSE!), and no previous error occurred,
89864064216a8433360745f69edddce19a606659163The Android Open Source Project           mark this error */
89964064216a8433360745f69edddce19a606659163The Android Open Source Project        if ( (SCAN_CRS_SCAN_COMPLETE_OK ==
90064064216a8433360745f69edddce19a606659163The Android Open Source Project                pScanConcentrator->scanResult[ pScanConcentrator->currentRunningScanClient ]) &&
90164064216a8433360745f69edddce19a606659163The Android Open Source Project              (TRUE == bTSFError) )
90264064216a8433360745f69edddce19a606659163The Android Open Source Project        {
90364064216a8433360745f69edddce19a606659163The Android Open Source Project            pScanConcentrator->scanResult[ pScanConcentrator->currentRunningScanClient ] = SCAN_CRS_TSF_ERROR;
90464064216a8433360745f69edddce19a606659163The Android Open Source Project        }
90564064216a8433360745f69edddce19a606659163The Android Open Source Project        scanConcentratorRoamingContSM_SMEvent( hScanCncn,
90664064216a8433360745f69edddce19a606659163The Android Open Source Project                                               (scan_contSMStates_e*)&(pScanConcentrator->clientSMState[ SCAN_SCC_ROAMING_CONT ]),
90764064216a8433360745f69edddce19a606659163The Android Open Source Project                                               CONT_SCAN_EVENT_SCAN_COMPLETE );
90864064216a8433360745f69edddce19a606659163The Android Open Source Project        break;
90964064216a8433360745f69edddce19a606659163The Android Open Source Project
91064064216a8433360745f69edddce19a606659163The Android Open Source Project    case SCAN_SCC_ROAMING_IMMED:
91164064216a8433360745f69edddce19a606659163The Android Open Source Project        scanConcentratorRoamingImmedSM_SMEvent( hScanCncn,
91264064216a8433360745f69edddce19a606659163The Android Open Source Project                                                (scan_immedSMStates_e*)&(pScanConcentrator->clientSMState[ SCAN_SCC_ROAMING_IMMED ]),
91364064216a8433360745f69edddce19a606659163The Android Open Source Project                                                IMMED_SCAN_EVENT_SCAN_COMPLETE );
91464064216a8433360745f69edddce19a606659163The Android Open Source Project        break;
91564064216a8433360745f69edddce19a606659163The Android Open Source Project
91664064216a8433360745f69edddce19a606659163The Android Open Source Project    default:
91764064216a8433360745f69edddce19a606659163The Android Open Source Project        WLAN_REPORT_WARNING( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG,
91864064216a8433360745f69edddce19a606659163The Android Open Source Project                             ("Scan complete notification with illegal client %d, aborting request.\n", pScanConcentrator->currentRunningScanClient) );
91964064216a8433360745f69edddce19a606659163The Android Open Source Project        break;
92064064216a8433360745f69edddce19a606659163The Android Open Source Project    }
92164064216a8433360745f69edddce19a606659163The Android Open Source Project}
92264064216a8433360745f69edddce19a606659163The Android Open Source Project
92364064216a8433360745f69edddce19a606659163The Android Open Source Project/**
92464064216a8433360745f69edddce19a606659163The Android Open Source Project * \author Ronen Kalish\n
92564064216a8433360745f69edddce19a606659163The Android Open Source Project * \date 02-Jan-2005\n
92664064216a8433360745f69edddce19a606659163The Android Open Source Project * \brief Called by the MLME parser to pass information received on a beacon or probe response.
92764064216a8433360745f69edddce19a606659163The Android Open Source Project *
92864064216a8433360745f69edddce19a606659163The Android Open Source Project * Function Scope \e Public.\n
92964064216a8433360745f69edddce19a606659163The Android Open Source Project * \param hScanCncn - handle to the scan concentrator object.\n
93064064216a8433360745f69edddce19a606659163The Android Open Source Project * \param bssid - a pointer to the address of the AP sending this frame.\n
93164064216a8433360745f69edddce19a606659163The Android Open Source Project * \param frameInfo - the IE in the frame.\n
93264064216a8433360745f69edddce19a606659163The Android Open Source Project * \param pRxAttr - a pointer to TNET RX attributes struct.\n
93364064216a8433360745f69edddce19a606659163The Android Open Source Project * \param buffer - a pointer to the frame body.\n
93464064216a8433360745f69edddce19a606659163The Android Open Source Project * \param byfferLength - the frame body length.\n
93564064216a8433360745f69edddce19a606659163The Android Open Source Project */
93664064216a8433360745f69edddce19a606659163The Android Open Source Projectvoid scanConcentrator_mlmeResultCB( TI_HANDLE hScanCncn, macAddress_t* bssid, mlmeFrameInfo_t* frameInfo,
93764064216a8433360745f69edddce19a606659163The Android Open Source Project                                    Rx_attr_t* pRxAttr, UINT8* buffer, UINT16 bufferLength )
93864064216a8433360745f69edddce19a606659163The Android Open Source Project{
93964064216a8433360745f69edddce19a606659163The Android Open Source Project    scanConcentrator_t* pScanConcentrator = (scanConcentrator_t*)hScanCncn;
94064064216a8433360745f69edddce19a606659163The Android Open Source Project    paramInfo_t param;
94164064216a8433360745f69edddce19a606659163The Android Open Source Project    scan_frameInfo_t scanFrameInfo;
94264064216a8433360745f69edddce19a606659163The Android Open Source Project
94364064216a8433360745f69edddce19a606659163The Android Open Source Project    /* verify that there is a running client (in case the result arrived after the scan complete event) */
94464064216a8433360745f69edddce19a606659163The Android Open Source Project    switch (pScanConcentrator->currentRunningScanClient)
94564064216a8433360745f69edddce19a606659163The Android Open Source Project    {
94664064216a8433360745f69edddce19a606659163The Android Open Source Project    case SCAN_SCC_APP:
94764064216a8433360745f69edddce19a606659163The Android Open Source Project        if ( APP_SCAN_STATE_IDLE == pScanConcentrator->clientSMState[ SCAN_SCC_APP ] )
94864064216a8433360745f69edddce19a606659163The Android Open Source Project        {
94964064216a8433360745f69edddce19a606659163The Android Open Source Project            return;
95064064216a8433360745f69edddce19a606659163The Android Open Source Project        }
95164064216a8433360745f69edddce19a606659163The Android Open Source Project        break;
95264064216a8433360745f69edddce19a606659163The Android Open Source Project
95364064216a8433360745f69edddce19a606659163The Android Open Source Project    case SCAN_SCC_DRIVER:
95464064216a8433360745f69edddce19a606659163The Android Open Source Project        if ( DRV_SCAN_STATE_IDLE == pScanConcentrator->clientSMState[ SCAN_SCC_DRIVER ] )
95564064216a8433360745f69edddce19a606659163The Android Open Source Project        {
95664064216a8433360745f69edddce19a606659163The Android Open Source Project            return;
95764064216a8433360745f69edddce19a606659163The Android Open Source Project        }
95864064216a8433360745f69edddce19a606659163The Android Open Source Project        break;
95964064216a8433360745f69edddce19a606659163The Android Open Source Project
96064064216a8433360745f69edddce19a606659163The Android Open Source Project    case SCAN_SCC_ROAMING_CONT:
96164064216a8433360745f69edddce19a606659163The Android Open Source Project        if ( CONT_SCAN_STATE_IDLE == pScanConcentrator->clientSMState[ SCAN_SCC_ROAMING_CONT ] )
96264064216a8433360745f69edddce19a606659163The Android Open Source Project        {
96364064216a8433360745f69edddce19a606659163The Android Open Source Project            return;
96464064216a8433360745f69edddce19a606659163The Android Open Source Project        }
96564064216a8433360745f69edddce19a606659163The Android Open Source Project        /* check that the SSID IE exists in the frame received */
96664064216a8433360745f69edddce19a606659163The Android Open Source Project        if (frameInfo->content.iePacket.pSsid==NULL)
96764064216a8433360745f69edddce19a606659163The Android Open Source Project        {
96864064216a8433360745f69edddce19a606659163The Android Open Source Project            /* Discard sites with no SID IE */
96964064216a8433360745f69edddce19a606659163The Android Open Source Project            return;
97064064216a8433360745f69edddce19a606659163The Android Open Source Project        }
97164064216a8433360745f69edddce19a606659163The Android Open Source Project        /* check that scan results are not from current BSS */
97264064216a8433360745f69edddce19a606659163The Android Open Source Project        param.paramType = CTRL_DATA_CURRENT_BSSID_PARAM;
97364064216a8433360745f69edddce19a606659163The Android Open Source Project        ctrlData_getParam( pScanConcentrator->hCtrlData, &param );
97464064216a8433360745f69edddce19a606659163The Android Open Source Project        if (( 0 == os_memoryCompare( pScanConcentrator->hOS,
97564064216a8433360745f69edddce19a606659163The Android Open Source Project                                    (void *)&(bssid->addr[ 0 ]),
97664064216a8433360745f69edddce19a606659163The Android Open Source Project                                    (void *)&(param.content.ctrlDataCurrentBSSID.addr[ 0 ]),
97764064216a8433360745f69edddce19a606659163The Android Open Source Project                                    MAC_ADDR_LEN ) ) ||
97864064216a8433360745f69edddce19a606659163The Android Open Source Project            (( os_memoryCompare( pScanConcentrator->hOS,
97964064216a8433360745f69edddce19a606659163The Android Open Source Project                                (PUINT8)frameInfo->content.iePacket.pSsid->serviceSetId,
98064064216a8433360745f69edddce19a606659163The Android Open Source Project                                (PUINT8)pScanConcentrator->clientScanParams[ SCAN_SCC_ROAMING_CONT ].desiredSsid.ssidString,
98164064216a8433360745f69edddce19a606659163The Android Open Source Project                                    pScanConcentrator->clientScanParams[ SCAN_SCC_ROAMING_CONT ].desiredSsid.len )) &&
98264064216a8433360745f69edddce19a606659163The Android Open Source Project             pScanConcentrator->clientScanParams[ SCAN_SCC_ROAMING_CONT ].scanType != SCAN_TYPE_SPS) )
98364064216a8433360745f69edddce19a606659163The Android Open Source Project        {
98464064216a8433360745f69edddce19a606659163The Android Open Source Project            /* reply from current site - discard it (by returning w/o notifying the scan manager */
98564064216a8433360745f69edddce19a606659163The Android Open Source Project            /* Also discard sites with different SSID than the desired */
98664064216a8433360745f69edddce19a606659163The Android Open Source Project            WLAN_REPORT_INFORMATION( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG,
98764064216a8433360745f69edddce19a606659163The Android Open Source Project                                     ("Cont scan: discarding frame from SSID: %s, BSSID: %2x:%2x:%2x:%2x:%2x:%2x, because SSID different from desired or from current AP!\n",
98864064216a8433360745f69edddce19a606659163The Android Open Source Project                                      frameInfo->content.iePacket.pSsid->serviceSetId, bssid->addr[ 0 ],
98964064216a8433360745f69edddce19a606659163The Android Open Source Project                                      bssid->addr[ 1 ], bssid->addr[ 2 ], bssid->addr[ 3 ],
99064064216a8433360745f69edddce19a606659163The Android Open Source Project                                      bssid->addr[ 4 ], bssid->addr[ 5 ]) );
99164064216a8433360745f69edddce19a606659163The Android Open Source Project            return;
99264064216a8433360745f69edddce19a606659163The Android Open Source Project        }
99364064216a8433360745f69edddce19a606659163The Android Open Source Project
99464064216a8433360745f69edddce19a606659163The Android Open Source Project        break;
99564064216a8433360745f69edddce19a606659163The Android Open Source Project
99664064216a8433360745f69edddce19a606659163The Android Open Source Project    case SCAN_SCC_ROAMING_IMMED:
99764064216a8433360745f69edddce19a606659163The Android Open Source Project        if ( IMMED_SCAN_STATE_IDLE == pScanConcentrator->clientSMState[ SCAN_SCC_ROAMING_IMMED ] )
99864064216a8433360745f69edddce19a606659163The Android Open Source Project        {
99964064216a8433360745f69edddce19a606659163The Android Open Source Project            return;
100064064216a8433360745f69edddce19a606659163The Android Open Source Project        }
100164064216a8433360745f69edddce19a606659163The Android Open Source Project        /* check that the SSID IE exists in the frame received */
100264064216a8433360745f69edddce19a606659163The Android Open Source Project        if (frameInfo->content.iePacket.pSsid==NULL)
100364064216a8433360745f69edddce19a606659163The Android Open Source Project        {
100464064216a8433360745f69edddce19a606659163The Android Open Source Project            /* Discard sites with no SID IE */
100564064216a8433360745f69edddce19a606659163The Android Open Source Project            return;
100664064216a8433360745f69edddce19a606659163The Android Open Source Project        }
100764064216a8433360745f69edddce19a606659163The Android Open Source Project        /* check that scan results are not from current BSS */
100864064216a8433360745f69edddce19a606659163The Android Open Source Project        param.paramType = CTRL_DATA_CURRENT_BSSID_PARAM;
100964064216a8433360745f69edddce19a606659163The Android Open Source Project        ctrlData_getParam( pScanConcentrator->hCtrlData, &param );
101064064216a8433360745f69edddce19a606659163The Android Open Source Project        if (( 0 == os_memoryCompare( pScanConcentrator->hOS,
101164064216a8433360745f69edddce19a606659163The Android Open Source Project                                    (PUINT8)&(bssid->addr[ 0 ]),
101264064216a8433360745f69edddce19a606659163The Android Open Source Project                                    (PUINT8)&(param.content.ctrlDataCurrentBSSID.addr[ 0 ]),
101364064216a8433360745f69edddce19a606659163The Android Open Source Project                                    MAC_ADDR_LEN ) ) ||
101464064216a8433360745f69edddce19a606659163The Android Open Source Project            ( os_memoryCompare( pScanConcentrator->hOS,
101564064216a8433360745f69edddce19a606659163The Android Open Source Project                                (PUINT8)frameInfo->content.iePacket.pSsid->serviceSetId,
101664064216a8433360745f69edddce19a606659163The Android Open Source Project                                (PUINT8)pScanConcentrator->clientScanParams[ SCAN_SCC_ROAMING_IMMED ].desiredSsid.ssidString,
101764064216a8433360745f69edddce19a606659163The Android Open Source Project                                    pScanConcentrator->clientScanParams[ SCAN_SCC_ROAMING_IMMED ].desiredSsid.len )))
101864064216a8433360745f69edddce19a606659163The Android Open Source Project
101964064216a8433360745f69edddce19a606659163The Android Open Source Project        {
102064064216a8433360745f69edddce19a606659163The Android Open Source Project            /* reply from current site - discard it (by returning w/o notifying the scan manager */
102164064216a8433360745f69edddce19a606659163The Android Open Source Project            /* Also discard sites with different SSID than the desired */
102264064216a8433360745f69edddce19a606659163The Android Open Source Project            WLAN_REPORT_INFORMATION( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG,
102364064216a8433360745f69edddce19a606659163The Android Open Source Project                                     ("Immed scan: discarding frame from SSID: %s, BSSID: %2x:%2x:%2x:%2x:%2x:%2x, because SSID different from desired or from current AP!\n",
102464064216a8433360745f69edddce19a606659163The Android Open Source Project                                      frameInfo->content.iePacket.pSsid->serviceSetId, bssid->addr[ 0 ],
102564064216a8433360745f69edddce19a606659163The Android Open Source Project                                      bssid->addr[ 1 ], bssid->addr[ 2 ], bssid->addr[ 3 ],
102664064216a8433360745f69edddce19a606659163The Android Open Source Project                                      bssid->addr[ 4 ], bssid->addr[ 5 ]) );
102764064216a8433360745f69edddce19a606659163The Android Open Source Project            return;
102864064216a8433360745f69edddce19a606659163The Android Open Source Project        }
102964064216a8433360745f69edddce19a606659163The Android Open Source Project        break;
103064064216a8433360745f69edddce19a606659163The Android Open Source Project
103164064216a8433360745f69edddce19a606659163The Android Open Source Project    default:
103264064216a8433360745f69edddce19a606659163The Android Open Source Project        WLAN_REPORT_WARNING( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG,
103364064216a8433360745f69edddce19a606659163The Android Open Source Project                             ("Scan result with illegal client %d, aborting request.\n", pScanConcentrator->currentRunningScanClient) );
103464064216a8433360745f69edddce19a606659163The Android Open Source Project        return;
103564064216a8433360745f69edddce19a606659163The Android Open Source Project/*        break; - unreachable */
103664064216a8433360745f69edddce19a606659163The Android Open Source Project    }
103764064216a8433360745f69edddce19a606659163The Android Open Source Project
103864064216a8433360745f69edddce19a606659163The Android Open Source Project    /* build the scan frame info object */
103964064216a8433360745f69edddce19a606659163The Android Open Source Project    scanFrameInfo.bssId = bssid;
104064064216a8433360745f69edddce19a606659163The Android Open Source Project    scanFrameInfo.band = (radioBand_e)pRxAttr->band;
104164064216a8433360745f69edddce19a606659163The Android Open Source Project    scanFrameInfo.channel = pRxAttr->channel;
104264064216a8433360745f69edddce19a606659163The Android Open Source Project    scanFrameInfo.parsedIEs = frameInfo;
104364064216a8433360745f69edddce19a606659163The Android Open Source Project    scanFrameInfo.rate = pRxAttr->Rate;
104464064216a8433360745f69edddce19a606659163The Android Open Source Project    scanFrameInfo.rssi = pRxAttr->Rssi;
104564064216a8433360745f69edddce19a606659163The Android Open Source Project    scanFrameInfo.staTSF = pRxAttr->TimeStamp;
104664064216a8433360745f69edddce19a606659163The Android Open Source Project    scanFrameInfo.buffer = buffer;
104764064216a8433360745f69edddce19a606659163The Android Open Source Project    scanFrameInfo.bufferLength = bufferLength;
104864064216a8433360745f69edddce19a606659163The Android Open Source Project
104964064216a8433360745f69edddce19a606659163The Android Open Source Project    /* call the client result CB, according to the running client type */
105064064216a8433360745f69edddce19a606659163The Android Open Source Project    if ( NULL != pScanConcentrator->scanResultCB[ pScanConcentrator->currentRunningScanClient ] )
105164064216a8433360745f69edddce19a606659163The Android Open Source Project    {
105264064216a8433360745f69edddce19a606659163The Android Open Source Project        pScanConcentrator->scanResultCB[ pScanConcentrator->currentRunningScanClient ](
105364064216a8433360745f69edddce19a606659163The Android Open Source Project            pScanConcentrator->scanResultCBObj[ pScanConcentrator->currentRunningScanClient ],
105464064216a8433360745f69edddce19a606659163The Android Open Source Project            SCAN_CRS_RECEIVED_FRAME,
105564064216a8433360745f69edddce19a606659163The Android Open Source Project            &scanFrameInfo,
105664064216a8433360745f69edddce19a606659163The Android Open Source Project            0xffff ); /* SPS status is only valid on SPS scan complete */
105764064216a8433360745f69edddce19a606659163The Android Open Source Project    }
105864064216a8433360745f69edddce19a606659163The Android Open Source Project}
105964064216a8433360745f69edddce19a606659163The Android Open Source Project
106064064216a8433360745f69edddce19a606659163The Android Open Source Project/**
106164064216a8433360745f69edddce19a606659163The Android Open Source Project * \author Ronen Kalish\n
106264064216a8433360745f69edddce19a606659163The Android Open Source Project * \date 02-Jan-2005\n
106364064216a8433360745f69edddce19a606659163The Android Open Source Project * \brief Called by the SCR (after registration) to notify the scan concentrator of a status change
106464064216a8433360745f69edddce19a606659163The Android Open Source Project * \brief for the immediate scan for roaming client.
106564064216a8433360745f69edddce19a606659163The Android Open Source Project *
106664064216a8433360745f69edddce19a606659163The Android Open Source Project * Function Scope \e Public.\n
106764064216a8433360745f69edddce19a606659163The Android Open Source Project * \param hScanCncn - handle to the scan concentrator object.\n
106864064216a8433360745f69edddce19a606659163The Android Open Source Project * \param requestStatus - the continuous scan for roaming client status.\n
106964064216a8433360745f69edddce19a606659163The Android Open Source Project */
107064064216a8433360745f69edddce19a606659163The Android Open Source Projectvoid scanConcentrator_scrRoamingImmedCB( TI_HANDLE hScanCncn, scr_clientRequestStatus_e requestStatus,
107164064216a8433360745f69edddce19a606659163The Android Open Source Project                                         scr_pendReason_e pendReason )
107264064216a8433360745f69edddce19a606659163The Android Open Source Project{
107364064216a8433360745f69edddce19a606659163The Android Open Source Project    scanConcentrator_t* pScanConcentrator = (scanConcentrator_t*)hScanCncn;
107464064216a8433360745f69edddce19a606659163The Android Open Source Project
107564064216a8433360745f69edddce19a606659163The Android Open Source Project    WLAN_REPORT_INFORMATION( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG,
107664064216a8433360745f69edddce19a606659163The Android Open Source Project                             ("Immed. romaing CB called by SCR. Status is: %d, pend reason: %d.\n",
107764064216a8433360745f69edddce19a606659163The Android Open Source Project                              requestStatus, pendReason) );
107864064216a8433360745f69edddce19a606659163The Android Open Source Project
107964064216a8433360745f69edddce19a606659163The Android Open Source Project    /* act according to the request staus */
108064064216a8433360745f69edddce19a606659163The Android Open Source Project    switch ( requestStatus )
108164064216a8433360745f69edddce19a606659163The Android Open Source Project    {
108264064216a8433360745f69edddce19a606659163The Android Open Source Project    case SCR_CRS_RUN:
108364064216a8433360745f69edddce19a606659163The Android Open Source Project        /* send an SCR run event to the SM */
108464064216a8433360745f69edddce19a606659163The Android Open Source Project        scanConcentratorRoamingImmedSM_SMEvent( hScanCncn,
108564064216a8433360745f69edddce19a606659163The Android Open Source Project                                                (scan_immedSMStates_e*)&(pScanConcentrator->clientSMState[ SCAN_SCC_ROAMING_IMMED ]),
108664064216a8433360745f69edddce19a606659163The Android Open Source Project                                                IMMED_SCAN_EVENT_SCR_RUN );
108764064216a8433360745f69edddce19a606659163The Android Open Source Project        break;
108864064216a8433360745f69edddce19a606659163The Android Open Source Project
108964064216a8433360745f69edddce19a606659163The Android Open Source Project    case SCR_CRS_PEND:
109064064216a8433360745f69edddce19a606659163The Android Open Source Project        /* if pending reason has changed to different group - send a reject event
109164064216a8433360745f69edddce19a606659163The Android Open Source Project           (should only happen when pending) */
109264064216a8433360745f69edddce19a606659163The Android Open Source Project        if ( SCR_PR_DIFFERENT_GROUP_RUNNING == pendReason )
109364064216a8433360745f69edddce19a606659163The Android Open Source Project        {
109464064216a8433360745f69edddce19a606659163The Android Open Source Project            /* send an SCR reject event to the SM - would not scan when not performing roaming */
109564064216a8433360745f69edddce19a606659163The Android Open Source Project            pScanConcentrator->scanResult[ SCAN_SCC_ROAMING_IMMED ] = SCAN_CRS_SCAN_FAILED;
109664064216a8433360745f69edddce19a606659163The Android Open Source Project            scanConcentratorRoamingImmedSM_SMEvent( hScanCncn,
109764064216a8433360745f69edddce19a606659163The Android Open Source Project                                                    (scan_immedSMStates_e*)&(pScanConcentrator->clientSMState[ SCAN_SCC_ROAMING_IMMED ]),
109864064216a8433360745f69edddce19a606659163The Android Open Source Project                                                    IMMED_SCAN_EVENT_SCR_REJECT );
109964064216a8433360745f69edddce19a606659163The Android Open Source Project        }
110064064216a8433360745f69edddce19a606659163The Android Open Source Project        else
110164064216a8433360745f69edddce19a606659163The Android Open Source Project        {
110264064216a8433360745f69edddce19a606659163The Android Open Source Project            /* send an SCR pend event to the SM */
110364064216a8433360745f69edddce19a606659163The Android Open Source Project            scanConcentratorRoamingImmedSM_SMEvent( hScanCncn,
110464064216a8433360745f69edddce19a606659163The Android Open Source Project                                                    (scan_immedSMStates_e*)&(pScanConcentrator->clientSMState[ SCAN_SCC_ROAMING_IMMED ]),
110564064216a8433360745f69edddce19a606659163The Android Open Source Project                                                    IMMED_SCAN_EVENT_SCR_PEND );
110664064216a8433360745f69edddce19a606659163The Android Open Source Project        }
110764064216a8433360745f69edddce19a606659163The Android Open Source Project        break;
110864064216a8433360745f69edddce19a606659163The Android Open Source Project
110964064216a8433360745f69edddce19a606659163The Android Open Source Project    case SCR_CRS_FW_RESET:
111064064216a8433360745f69edddce19a606659163The Android Open Source Project        /* if no previous error has occurred, change the state to FW reset */
111164064216a8433360745f69edddce19a606659163The Android Open Source Project        if ( SCAN_CRS_SCAN_COMPLETE_OK == pScanConcentrator->scanResult[ SCAN_SCC_ROAMING_IMMED ] )
111264064216a8433360745f69edddce19a606659163The Android Open Source Project        {
111364064216a8433360745f69edddce19a606659163The Android Open Source Project            pScanConcentrator->scanResult[ SCAN_SCC_ROAMING_IMMED ] = SCAN_CRS_SCAN_ABORTED_FW_RESET;
111464064216a8433360745f69edddce19a606659163The Android Open Source Project        }
111564064216a8433360745f69edddce19a606659163The Android Open Source Project
111664064216a8433360745f69edddce19a606659163The Android Open Source Project         /* start built-in test timer */
111764064216a8433360745f69edddce19a606659163The Android Open Source Project        healthMonitor_resumePeriodicTest( pScanConcentrator->hHealthMonitor );
111864064216a8433360745f69edddce19a606659163The Android Open Source Project
111964064216a8433360745f69edddce19a606659163The Android Open Source Project        /* send a FW reset event to the SM */
112064064216a8433360745f69edddce19a606659163The Android Open Source Project        scanConcentratorRoamingImmedSM_SMEvent( hScanCncn,
112164064216a8433360745f69edddce19a606659163The Android Open Source Project                                                (scan_immedSMStates_e*)&(pScanConcentrator->clientSMState[ SCAN_SCC_ROAMING_IMMED ]),
112264064216a8433360745f69edddce19a606659163The Android Open Source Project                                                IMMED_SCAN_EVENT_FW_RESET );
112364064216a8433360745f69edddce19a606659163The Android Open Source Project        break;
112464064216a8433360745f69edddce19a606659163The Android Open Source Project
112564064216a8433360745f69edddce19a606659163The Android Open Source Project    case SCR_CRS_ABORT:
112664064216a8433360745f69edddce19a606659163The Android Open Source Project        /* This should never happen, report error */
112764064216a8433360745f69edddce19a606659163The Android Open Source Project    default:
112864064216a8433360745f69edddce19a606659163The Android Open Source Project        WLAN_REPORT_ERROR( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG,
112964064216a8433360745f69edddce19a606659163The Android Open Source Project                             ("Illegal SCR request status: %d.\n", requestStatus) );
113064064216a8433360745f69edddce19a606659163The Android Open Source Project        break;
113164064216a8433360745f69edddce19a606659163The Android Open Source Project    }
113264064216a8433360745f69edddce19a606659163The Android Open Source Project}
113364064216a8433360745f69edddce19a606659163The Android Open Source Project
113464064216a8433360745f69edddce19a606659163The Android Open Source Project/**
113564064216a8433360745f69edddce19a606659163The Android Open Source Project * \author Ronen Kalish\n
113664064216a8433360745f69edddce19a606659163The Android Open Source Project * \date 02-Jan-2005\n
113764064216a8433360745f69edddce19a606659163The Android Open Source Project * \brief Called by the SCR (after registration) to notify the scan concentrator of a status change
113864064216a8433360745f69edddce19a606659163The Android Open Source Project * \brief for the continuous scan for roaming client.
113964064216a8433360745f69edddce19a606659163The Android Open Source Project *
114064064216a8433360745f69edddce19a606659163The Android Open Source Project * Function Scope \e Public.\n
114164064216a8433360745f69edddce19a606659163The Android Open Source Project * \param hScanCncn - handle to the scan concentrator object.\n
114264064216a8433360745f69edddce19a606659163The Android Open Source Project * \param requestStatus - the continuous scan for roaming client status.\n
114364064216a8433360745f69edddce19a606659163The Android Open Source Project */
114464064216a8433360745f69edddce19a606659163The Android Open Source Projectvoid scanConcentrator_scrRoamingContCB( TI_HANDLE hScanCncn, scr_clientRequestStatus_e requestStatus,
114564064216a8433360745f69edddce19a606659163The Android Open Source Project                                        scr_pendReason_e pendReason )
114664064216a8433360745f69edddce19a606659163The Android Open Source Project{
114764064216a8433360745f69edddce19a606659163The Android Open Source Project    scanConcentrator_t* pScanConcentrator = (scanConcentrator_t*)hScanCncn;
114864064216a8433360745f69edddce19a606659163The Android Open Source Project
114964064216a8433360745f69edddce19a606659163The Android Open Source Project    WLAN_REPORT_INFORMATION( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG,
115064064216a8433360745f69edddce19a606659163The Android Open Source Project                             ("Cont. romaing CB called by SCR. Status is: %d, pend reason: %d.\n",
115164064216a8433360745f69edddce19a606659163The Android Open Source Project                              requestStatus, pendReason) );
115264064216a8433360745f69edddce19a606659163The Android Open Source Project
115364064216a8433360745f69edddce19a606659163The Android Open Source Project    /* act according to the request staus */
115464064216a8433360745f69edddce19a606659163The Android Open Source Project    switch ( requestStatus )
115564064216a8433360745f69edddce19a606659163The Android Open Source Project    {
115664064216a8433360745f69edddce19a606659163The Android Open Source Project    case SCR_CRS_RUN:
115764064216a8433360745f69edddce19a606659163The Android Open Source Project        /* send an SCR run event to the SM */
115864064216a8433360745f69edddce19a606659163The Android Open Source Project        scanConcentratorRoamingContSM_SMEvent( hScanCncn,
115964064216a8433360745f69edddce19a606659163The Android Open Source Project                                               (scan_contSMStates_e*)&(pScanConcentrator->clientSMState[ SCAN_SCC_ROAMING_CONT ]),
116064064216a8433360745f69edddce19a606659163The Android Open Source Project                                               CONT_SCAN_EVENT_SCR_RUN );
116164064216a8433360745f69edddce19a606659163The Android Open Source Project        break;
116264064216a8433360745f69edddce19a606659163The Android Open Source Project
116364064216a8433360745f69edddce19a606659163The Android Open Source Project    case SCR_CRS_PEND:
116464064216a8433360745f69edddce19a606659163The Android Open Source Project        /* if pending reason has changed to different group - send a reject event
116564064216a8433360745f69edddce19a606659163The Android Open Source Project           (should only happen when pending) */
116664064216a8433360745f69edddce19a606659163The Android Open Source Project        if ( SCR_PR_DIFFERENT_GROUP_RUNNING == pendReason )
116764064216a8433360745f69edddce19a606659163The Android Open Source Project        {
116864064216a8433360745f69edddce19a606659163The Android Open Source Project            pScanConcentrator->scanResult[ SCAN_SCC_ROAMING_CONT ] = SCAN_CRS_SCAN_FAILED;
116964064216a8433360745f69edddce19a606659163The Android Open Source Project            /* send an SCR reject event to the SM - would not scan when not connected */
117064064216a8433360745f69edddce19a606659163The Android Open Source Project        scanConcentratorRoamingContSM_SMEvent( hScanCncn,
117164064216a8433360745f69edddce19a606659163The Android Open Source Project                                               (scan_contSMStates_e*)&(pScanConcentrator->clientSMState[ SCAN_SCC_ROAMING_CONT ]),
117264064216a8433360745f69edddce19a606659163The Android Open Source Project                                               CONT_SCAN_EVENT_SCR_REJECT );
117364064216a8433360745f69edddce19a606659163The Android Open Source Project        }
117464064216a8433360745f69edddce19a606659163The Android Open Source Project        else
117564064216a8433360745f69edddce19a606659163The Android Open Source Project        {
117664064216a8433360745f69edddce19a606659163The Android Open Source Project            /* send an SCR pend event to the SM */
117764064216a8433360745f69edddce19a606659163The Android Open Source Project            scanConcentratorRoamingContSM_SMEvent( hScanCncn,
117864064216a8433360745f69edddce19a606659163The Android Open Source Project                                                   (scan_contSMStates_e*)&(pScanConcentrator->clientSMState[ SCAN_SCC_ROAMING_CONT ]),
117964064216a8433360745f69edddce19a606659163The Android Open Source Project                                                   CONT_SCAN_EVENT_SCR_PEND );
118064064216a8433360745f69edddce19a606659163The Android Open Source Project        }
118164064216a8433360745f69edddce19a606659163The Android Open Source Project        break;
118264064216a8433360745f69edddce19a606659163The Android Open Source Project
118364064216a8433360745f69edddce19a606659163The Android Open Source Project    case SCR_CRS_FW_RESET:
118464064216a8433360745f69edddce19a606659163The Android Open Source Project        /* if no previous error has occurred, change the state to FW reset */
118564064216a8433360745f69edddce19a606659163The Android Open Source Project        if ( SCAN_CRS_SCAN_COMPLETE_OK == pScanConcentrator->scanResult[ SCAN_SCC_ROAMING_CONT ] )
118664064216a8433360745f69edddce19a606659163The Android Open Source Project        {
118764064216a8433360745f69edddce19a606659163The Android Open Source Project            pScanConcentrator->scanResult[ SCAN_SCC_ROAMING_CONT ] = SCAN_CRS_SCAN_ABORTED_FW_RESET;
118864064216a8433360745f69edddce19a606659163The Android Open Source Project        }
118964064216a8433360745f69edddce19a606659163The Android Open Source Project
119064064216a8433360745f69edddce19a606659163The Android Open Source Project         /* start built-in test timer */
119164064216a8433360745f69edddce19a606659163The Android Open Source Project        healthMonitor_resumePeriodicTest( pScanConcentrator->hHealthMonitor );
119264064216a8433360745f69edddce19a606659163The Android Open Source Project
119364064216a8433360745f69edddce19a606659163The Android Open Source Project        /* send a FW reset event to the SM */
119464064216a8433360745f69edddce19a606659163The Android Open Source Project        scanConcentratorRoamingContSM_SMEvent( hScanCncn,
119564064216a8433360745f69edddce19a606659163The Android Open Source Project                                               (scan_contSMStates_e*)&(pScanConcentrator->clientSMState[ SCAN_SCC_ROAMING_CONT ]),
119664064216a8433360745f69edddce19a606659163The Android Open Source Project                                               CONT_SCAN_EVENT_FW_RESET );
119764064216a8433360745f69edddce19a606659163The Android Open Source Project        break;
119864064216a8433360745f69edddce19a606659163The Android Open Source Project
119964064216a8433360745f69edddce19a606659163The Android Open Source Project    case SCR_CRS_ABORT:
120064064216a8433360745f69edddce19a606659163The Android Open Source Project        /* set the abort or stop flag (to identify when to exit driver mode (stop) and
120164064216a8433360745f69edddce19a606659163The Android Open Source Project           when not (abort due to higher priority client) */
120264064216a8433360745f69edddce19a606659163The Android Open Source Project
120364064216a8433360745f69edddce19a606659163The Android Open Source Project        pScanConcentrator->bAbortOrStop = SCAN_CNCN_ABORT;
120464064216a8433360745f69edddce19a606659163The Android Open Source Project
120564064216a8433360745f69edddce19a606659163The Android Open Source Project        /* if no previous error has occurred, change the state to abort (according to reason) */
120664064216a8433360745f69edddce19a606659163The Android Open Source Project        if ( SCAN_CRS_SCAN_COMPLETE_OK == pScanConcentrator->scanResult[ SCAN_SCC_ROAMING_CONT ] )
120764064216a8433360745f69edddce19a606659163The Android Open Source Project        {
120864064216a8433360745f69edddce19a606659163The Android Open Source Project            pScanConcentrator->scanResult[ SCAN_SCC_ROAMING_CONT ] = SCAN_CRS_SCAN_ABORTED_HIGHER_PRIORITY;
120964064216a8433360745f69edddce19a606659163The Android Open Source Project        }
121064064216a8433360745f69edddce19a606659163The Android Open Source Project
121164064216a8433360745f69edddce19a606659163The Android Open Source Project        /* send an abort scan event to the SM */
121264064216a8433360745f69edddce19a606659163The Android Open Source Project        scanConcentratorRoamingContSM_SMEvent( hScanCncn,
121364064216a8433360745f69edddce19a606659163The Android Open Source Project                                               (scan_contSMStates_e*)&(pScanConcentrator->clientSMState[ SCAN_SCC_ROAMING_CONT ]),
121464064216a8433360745f69edddce19a606659163The Android Open Source Project                                               CONT_SCAN_EVENT_ABORT_SCAN );
121564064216a8433360745f69edddce19a606659163The Android Open Source Project        break;
121664064216a8433360745f69edddce19a606659163The Android Open Source Project
121764064216a8433360745f69edddce19a606659163The Android Open Source Project    default:
121864064216a8433360745f69edddce19a606659163The Android Open Source Project        WLAN_REPORT_WARNING( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG,
121964064216a8433360745f69edddce19a606659163The Android Open Source Project                             ("Illegal SCR request status: %d.\n", requestStatus) );
122064064216a8433360745f69edddce19a606659163The Android Open Source Project        break;
122164064216a8433360745f69edddce19a606659163The Android Open Source Project    }
122264064216a8433360745f69edddce19a606659163The Android Open Source Project}
122364064216a8433360745f69edddce19a606659163The Android Open Source Project
122464064216a8433360745f69edddce19a606659163The Android Open Source Project/**
122564064216a8433360745f69edddce19a606659163The Android Open Source Project * \author Ronen Kalish\n
122664064216a8433360745f69edddce19a606659163The Android Open Source Project * \date 02-Jan-2005\n
122764064216a8433360745f69edddce19a606659163The Android Open Source Project * \brief Called by the SCR (after registration) to notify the scan concentrator of a status change
122864064216a8433360745f69edddce19a606659163The Android Open Source Project * \brief for the Application scan client.
122964064216a8433360745f69edddce19a606659163The Android Open Source Project *
123064064216a8433360745f69edddce19a606659163The Android Open Source Project * Function Scope \e Public.\n
123164064216a8433360745f69edddce19a606659163The Android Open Source Project * \param hScanCncn - handle to the scan concentrator object.\n
123264064216a8433360745f69edddce19a606659163The Android Open Source Project * \param requestStatus - the application scan status.\n
123364064216a8433360745f69edddce19a606659163The Android Open Source Project * \param pendReason - the reason for pend status, if the status is pend.\n
123464064216a8433360745f69edddce19a606659163The Android Open Source Project */
123564064216a8433360745f69edddce19a606659163The Android Open Source Projectvoid scanConcentrator_scrAppCB( TI_HANDLE hScanCncn, scr_clientRequestStatus_e requestStatus,
123664064216a8433360745f69edddce19a606659163The Android Open Source Project                                scr_pendReason_e pendReason )
123764064216a8433360745f69edddce19a606659163The Android Open Source Project{
123864064216a8433360745f69edddce19a606659163The Android Open Source Project    scanConcentrator_t* pScanConcentrator = (scanConcentrator_t*)hScanCncn;
123964064216a8433360745f69edddce19a606659163The Android Open Source Project
124064064216a8433360745f69edddce19a606659163The Android Open Source Project    WLAN_REPORT_INFORMATION( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG,
124164064216a8433360745f69edddce19a606659163The Android Open Source Project                             ("App. CB called by SCR. Status is: %d, pend reason: %d.\n",
124264064216a8433360745f69edddce19a606659163The Android Open Source Project                              requestStatus, pendReason) );
124364064216a8433360745f69edddce19a606659163The Android Open Source Project
124464064216a8433360745f69edddce19a606659163The Android Open Source Project    /* act according to the request staus */
124564064216a8433360745f69edddce19a606659163The Android Open Source Project    switch ( requestStatus )
124664064216a8433360745f69edddce19a606659163The Android Open Source Project    {
124764064216a8433360745f69edddce19a606659163The Android Open Source Project    /* Note: pend is not handled because application scan cancel its scan request when it receives pend
124864064216a8433360745f69edddce19a606659163The Android Open Source Project       as the SCR request result, and thus it is assumed that the application scan request will never be
124964064216a8433360745f69edddce19a606659163The Android Open Source Project       pending */
125064064216a8433360745f69edddce19a606659163The Android Open Source Project
125164064216a8433360745f69edddce19a606659163The Android Open Source Project    case SCR_CRS_RUN:
125264064216a8433360745f69edddce19a606659163The Android Open Source Project        /* send an SCR run event to the SM */
125364064216a8433360745f69edddce19a606659163The Android Open Source Project        scanConcentratorAppSM_SMEvent( hScanCncn,
125464064216a8433360745f69edddce19a606659163The Android Open Source Project                                       (scan_appSMStates_e*)&(pScanConcentrator->clientSMState[ SCAN_SCC_APP ]),
125564064216a8433360745f69edddce19a606659163The Android Open Source Project                                       APP_SCAN_EVENT_SCR_RUN );
125664064216a8433360745f69edddce19a606659163The Android Open Source Project        break;
125764064216a8433360745f69edddce19a606659163The Android Open Source Project
125864064216a8433360745f69edddce19a606659163The Android Open Source Project    case SCR_CRS_FW_RESET:
125964064216a8433360745f69edddce19a606659163The Android Open Source Project        /* if no previous error has occurred, change the state to FW reset */
126064064216a8433360745f69edddce19a606659163The Android Open Source Project        if ( SCAN_CRS_SCAN_COMPLETE_OK == pScanConcentrator->scanResult[ SCAN_SCC_APP ] )
126164064216a8433360745f69edddce19a606659163The Android Open Source Project        {
126264064216a8433360745f69edddce19a606659163The Android Open Source Project            pScanConcentrator->scanResult[ SCAN_SCC_APP ] = SCAN_CRS_SCAN_ABORTED_FW_RESET;
126364064216a8433360745f69edddce19a606659163The Android Open Source Project        }
126464064216a8433360745f69edddce19a606659163The Android Open Source Project
126564064216a8433360745f69edddce19a606659163The Android Open Source Project         /* start built-in test timer */
126664064216a8433360745f69edddce19a606659163The Android Open Source Project        healthMonitor_resumePeriodicTest( pScanConcentrator->hHealthMonitor );
126764064216a8433360745f69edddce19a606659163The Android Open Source Project
126864064216a8433360745f69edddce19a606659163The Android Open Source Project        /* send a FW reset event to the SM */
126964064216a8433360745f69edddce19a606659163The Android Open Source Project        scanConcentratorAppSM_SMEvent( hScanCncn,
127064064216a8433360745f69edddce19a606659163The Android Open Source Project                                       (scan_appSMStates_e*)&(pScanConcentrator->clientSMState[ SCAN_SCC_APP ]),
127164064216a8433360745f69edddce19a606659163The Android Open Source Project                                       APP_SCAN_EVENT_FW_RESET );
127264064216a8433360745f69edddce19a606659163The Android Open Source Project        break;
127364064216a8433360745f69edddce19a606659163The Android Open Source Project
127464064216a8433360745f69edddce19a606659163The Android Open Source Project    case SCR_CRS_ABORT:
127564064216a8433360745f69edddce19a606659163The Android Open Source Project        /* set the abort or stop flag (to identify when to exit driver mode (stop) and
127664064216a8433360745f69edddce19a606659163The Android Open Source Project           when not (abort due to higher priority client) */
127764064216a8433360745f69edddce19a606659163The Android Open Source Project
127864064216a8433360745f69edddce19a606659163The Android Open Source Project        pScanConcentrator->bAbortOrStop = SCAN_CNCN_ABORT;
127964064216a8433360745f69edddce19a606659163The Android Open Source Project
128064064216a8433360745f69edddce19a606659163The Android Open Source Project        /* if no previous error has occurred, change the state to abort (according to reason) */
128164064216a8433360745f69edddce19a606659163The Android Open Source Project        if ( SCAN_CRS_SCAN_COMPLETE_OK == pScanConcentrator->scanResult[ SCAN_SCC_APP ] )
128264064216a8433360745f69edddce19a606659163The Android Open Source Project        {
128364064216a8433360745f69edddce19a606659163The Android Open Source Project            pScanConcentrator->scanResult[ SCAN_SCC_APP ] = SCAN_CRS_SCAN_ABORTED_HIGHER_PRIORITY;
128464064216a8433360745f69edddce19a606659163The Android Open Source Project        }
128564064216a8433360745f69edddce19a606659163The Android Open Source Project
128664064216a8433360745f69edddce19a606659163The Android Open Source Project        /* send an abort scan event to the SM */
128764064216a8433360745f69edddce19a606659163The Android Open Source Project        scanConcentratorAppSM_SMEvent( hScanCncn,
128864064216a8433360745f69edddce19a606659163The Android Open Source Project                                       (scan_appSMStates_e*)&(pScanConcentrator->clientSMState[ SCAN_SCC_APP ]),
128964064216a8433360745f69edddce19a606659163The Android Open Source Project                                       APP_SCAN_EVENT_ABORT_SCAN );
129064064216a8433360745f69edddce19a606659163The Android Open Source Project        break;
129164064216a8433360745f69edddce19a606659163The Android Open Source Project
129264064216a8433360745f69edddce19a606659163The Android Open Source Project    default:
129364064216a8433360745f69edddce19a606659163The Android Open Source Project        WLAN_REPORT_WARNING( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG,
129464064216a8433360745f69edddce19a606659163The Android Open Source Project                             ("Illegal SCR request status: %d.\n", requestStatus) );
129564064216a8433360745f69edddce19a606659163The Android Open Source Project        break;
129664064216a8433360745f69edddce19a606659163The Android Open Source Project    }
129764064216a8433360745f69edddce19a606659163The Android Open Source Project}
129864064216a8433360745f69edddce19a606659163The Android Open Source Project
129964064216a8433360745f69edddce19a606659163The Android Open Source Project/**
130064064216a8433360745f69edddce19a606659163The Android Open Source Project * \author Ronen Kalish\n
130164064216a8433360745f69edddce19a606659163The Android Open Source Project * \date 02-Jan-2005\n
130264064216a8433360745f69edddce19a606659163The Android Open Source Project * \brief Called by the SCR (after registration) to notify the scan concentrator of a status change
130364064216a8433360745f69edddce19a606659163The Android Open Source Project * \brief for the driver scan client.
130464064216a8433360745f69edddce19a606659163The Android Open Source Project *
130564064216a8433360745f69edddce19a606659163The Android Open Source Project * Function Scope \e Public.\n
130664064216a8433360745f69edddce19a606659163The Android Open Source Project * \param hScanCncn - handle to the scan concentrator object.\n
130764064216a8433360745f69edddce19a606659163The Android Open Source Project * \param requestStatus - the driver scan status.\n
130864064216a8433360745f69edddce19a606659163The Android Open Source Project * \param pendReason - the reason for pend status, if the status is pend.\n
130964064216a8433360745f69edddce19a606659163The Android Open Source Project */
131064064216a8433360745f69edddce19a606659163The Android Open Source Projectvoid scanConcentrator_scrDriverCB( TI_HANDLE hScanCncn, scr_clientRequestStatus_e requestStatus,
131164064216a8433360745f69edddce19a606659163The Android Open Source Project                                   scr_pendReason_e pendReason )
131264064216a8433360745f69edddce19a606659163The Android Open Source Project{
131364064216a8433360745f69edddce19a606659163The Android Open Source Project    scanConcentrator_t* pScanConcentrator = (scanConcentrator_t*)hScanCncn;
131464064216a8433360745f69edddce19a606659163The Android Open Source Project
131564064216a8433360745f69edddce19a606659163The Android Open Source Project    WLAN_REPORT_INFORMATION( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG,
131664064216a8433360745f69edddce19a606659163The Android Open Source Project                             ("Driver CB called by SCR. Status is: %d, pend reason: %d.\n",
131764064216a8433360745f69edddce19a606659163The Android Open Source Project                              requestStatus, pendReason) );
131864064216a8433360745f69edddce19a606659163The Android Open Source Project
131964064216a8433360745f69edddce19a606659163The Android Open Source Project    /* act according to the request staus */
132064064216a8433360745f69edddce19a606659163The Android Open Source Project    switch ( requestStatus )
132164064216a8433360745f69edddce19a606659163The Android Open Source Project    {
132264064216a8433360745f69edddce19a606659163The Android Open Source Project    case SCR_CRS_RUN:
132364064216a8433360745f69edddce19a606659163The Android Open Source Project        /* send the next event to the SM */
132464064216a8433360745f69edddce19a606659163The Android Open Source Project        scanConcentratorDrvSM_SMEvent( hScanCncn,
132564064216a8433360745f69edddce19a606659163The Android Open Source Project                                       (scan_drvSMStates_e*)&(pScanConcentrator->clientSMState[ SCAN_SCC_DRIVER ]),
132664064216a8433360745f69edddce19a606659163The Android Open Source Project                                       scanConcentrator_getNextDriverEvent( hScanCncn ) );
132764064216a8433360745f69edddce19a606659163The Android Open Source Project        break;
132864064216a8433360745f69edddce19a606659163The Android Open Source Project
132964064216a8433360745f69edddce19a606659163The Android Open Source Project    case SCR_CRS_PEND:
133064064216a8433360745f69edddce19a606659163The Android Open Source Project        /* a pend event should only be sent when the SM is waiting for the SCR */
133164064216a8433360745f69edddce19a606659163The Android Open Source Project        if ( pendReason == SCR_PR_DIFFERENT_GROUP_RUNNING )
133264064216a8433360745f69edddce19a606659163The Android Open Source Project        {
133364064216a8433360745f69edddce19a606659163The Android Open Source Project            /* send a reject event - should not perform scan if not in connecting mode */
133464064216a8433360745f69edddce19a606659163The Android Open Source Project            pScanConcentrator->scanResult[ SCAN_SCC_DRIVER ] = SCAN_CRS_SCAN_FAILED;
133564064216a8433360745f69edddce19a606659163The Android Open Source Project        scanConcentratorDrvSM_SMEvent( hScanCncn,
133664064216a8433360745f69edddce19a606659163The Android Open Source Project                                       (scan_drvSMStates_e*)&(pScanConcentrator->clientSMState[ SCAN_SCC_DRIVER ]),
133764064216a8433360745f69edddce19a606659163The Android Open Source Project                                       DRV_SCAN_EVENT_SCR_REJECT );
133864064216a8433360745f69edddce19a606659163The Android Open Source Project        }
133964064216a8433360745f69edddce19a606659163The Android Open Source Project        else
134064064216a8433360745f69edddce19a606659163The Android Open Source Project        {
134164064216a8433360745f69edddce19a606659163The Android Open Source Project            /* send a pend event */
134264064216a8433360745f69edddce19a606659163The Android Open Source Project            scanConcentratorDrvSM_SMEvent( hScanCncn,
134364064216a8433360745f69edddce19a606659163The Android Open Source Project                                           (scan_drvSMStates_e*)&(pScanConcentrator->clientSMState[ SCAN_SCC_DRIVER ]),
134464064216a8433360745f69edddce19a606659163The Android Open Source Project                                           DRV_SCAN_EVENT_SCR_PEND );
134564064216a8433360745f69edddce19a606659163The Android Open Source Project        }
134664064216a8433360745f69edddce19a606659163The Android Open Source Project        break;
134764064216a8433360745f69edddce19a606659163The Android Open Source Project
134864064216a8433360745f69edddce19a606659163The Android Open Source Project    case SCR_CRS_FW_RESET:
134964064216a8433360745f69edddce19a606659163The Android Open Source Project        /* if no previous error has occurred, change the state to FW reset */
135064064216a8433360745f69edddce19a606659163The Android Open Source Project        if ( SCAN_CRS_SCAN_COMPLETE_OK == pScanConcentrator->scanResult[ SCAN_SCC_DRIVER ] )
135164064216a8433360745f69edddce19a606659163The Android Open Source Project        {
135264064216a8433360745f69edddce19a606659163The Android Open Source Project            pScanConcentrator->scanResult[ SCAN_SCC_DRIVER ] = SCAN_CRS_SCAN_ABORTED_FW_RESET;
135364064216a8433360745f69edddce19a606659163The Android Open Source Project        }
135464064216a8433360745f69edddce19a606659163The Android Open Source Project
135564064216a8433360745f69edddce19a606659163The Android Open Source Project        /* start built-in test timer */
135664064216a8433360745f69edddce19a606659163The Android Open Source Project        healthMonitor_resumePeriodicTest( pScanConcentrator->hHealthMonitor );
135764064216a8433360745f69edddce19a606659163The Android Open Source Project
135864064216a8433360745f69edddce19a606659163The Android Open Source Project        /* send a FW reset event to the SM */
135964064216a8433360745f69edddce19a606659163The Android Open Source Project        scanConcentratorDrvSM_SMEvent( hScanCncn,
136064064216a8433360745f69edddce19a606659163The Android Open Source Project                                       (scan_drvSMStates_e*)&(pScanConcentrator->clientSMState[ SCAN_SCC_DRIVER ]),
136164064216a8433360745f69edddce19a606659163The Android Open Source Project                                       DRV_SCAN_EVENT_FW_RESET );
136264064216a8433360745f69edddce19a606659163The Android Open Source Project        break;
136364064216a8433360745f69edddce19a606659163The Android Open Source Project
136464064216a8433360745f69edddce19a606659163The Android Open Source Project    case SCR_CRS_ABORT:
136564064216a8433360745f69edddce19a606659163The Android Open Source Project    /* This should never happen, report error */
136664064216a8433360745f69edddce19a606659163The Android Open Source Project    default:
136764064216a8433360745f69edddce19a606659163The Android Open Source Project        WLAN_REPORT_ERROR( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG,
136864064216a8433360745f69edddce19a606659163The Android Open Source Project                             ("Illegal SCR request status: %d.\n", requestStatus) );
136964064216a8433360745f69edddce19a606659163The Android Open Source Project        break;
137064064216a8433360745f69edddce19a606659163The Android Open Source Project    }
137164064216a8433360745f69edddce19a606659163The Android Open Source Project}
137264064216a8433360745f69edddce19a606659163The Android Open Source Project
137364064216a8433360745f69edddce19a606659163The Android Open Source Project/**
137464064216a8433360745f69edddce19a606659163The Android Open Source Project * \author Ronen Kalish\n
137564064216a8433360745f69edddce19a606659163The Android Open Source Project * \date 09-Jan-2005\n
137664064216a8433360745f69edddce19a606659163The Android Open Source Project * \brief Verifies that specified channels are allowed for the specified scan type, and removes those that are not.\n
137764064216a8433360745f69edddce19a606659163The Android Open Source Project *
137864064216a8433360745f69edddce19a606659163The Android Open Source Project * Function Scope \e Private.\n
137964064216a8433360745f69edddce19a606659163The Android Open Source Project * \param hScanCncn - handle to the scan concentrator object.\n
138064064216a8433360745f69edddce19a606659163The Android Open Source Project * \param pScanParams - a pointer to the structure holding the scan params (inc. channels and scan type).\n
138164064216a8433360745f69edddce19a606659163The Android Open Source Project */
138264064216a8433360745f69edddce19a606659163The Android Open Source Projectvoid scanConcentrator_verifyChannelsWithRegDomain( TI_HANDLE hScanCncn, scan_Params_t* pScanParams )
138364064216a8433360745f69edddce19a606659163The Android Open Source Project{
138464064216a8433360745f69edddce19a606659163The Android Open Source Project    paramInfo_t     param;
138564064216a8433360745f69edddce19a606659163The Android Open Source Project    UINT8           i,j,k;
138664064216a8433360745f69edddce19a606659163The Android Open Source Project    UINT8           tempChannelList[ SCAN_MAX_NUM_OF_NORMAL_CHANNELS_PER_COMMAND ];
138764064216a8433360745f69edddce19a606659163The Android Open Source Project    scanConcentrator_t* pScanConcentrator = (scanConcentrator_t*)hScanCncn;
138864064216a8433360745f69edddce19a606659163The Android Open Source Project
138964064216a8433360745f69edddce19a606659163The Android Open Source Project    /* if no channels were given by the user, get all channels from reg domain */
139064064216a8433360745f69edddce19a606659163The Android Open Source Project    if ( 0 == pScanParams->numOfChannels )
139164064216a8433360745f69edddce19a606659163The Android Open Source Project    {
139264064216a8433360745f69edddce19a606659163The Android Open Source Project        /* SPS cannot be performed when the user does not define the channels! */
139364064216a8433360745f69edddce19a606659163The Android Open Source Project        if ( SCAN_TYPE_SPS != pScanParams->scanType )
139464064216a8433360745f69edddce19a606659163The Android Open Source Project        {
139564064216a8433360745f69edddce19a606659163The Android Open Source Project            UINT validChannelsCnt=0;
139664064216a8433360745f69edddce19a606659163The Android Open Source Project
139764064216a8433360745f69edddce19a606659163The Android Open Source Project            /* extract the channel list (channel numbers) from the bitmap */
139864064216a8433360745f69edddce19a606659163The Android Open Source Project            i = SCAN_MAX_NUM_OF_NORMAL_CHANNELS_PER_COMMAND;
139964064216a8433360745f69edddce19a606659163The Android Open Source Project            /*scanConcentrator_ExtractBitmapToList( pScanParams->band, &(tmpChannelBitmap[0]), &(tempChannelList[0]), &i );*/
140064064216a8433360745f69edddce19a606659163The Android Open Source Project
140164064216a8433360745f69edddce19a606659163The Android Open Source Project            param.paramType = REGULATORY_DOMAIN_ALL_SUPPORTED_CHANNELS;
140264064216a8433360745f69edddce19a606659163The Android Open Source Project            param.content.siteMgrRadioBand = pScanParams->band;
140364064216a8433360745f69edddce19a606659163The Android Open Source Project            /*param.content.supportedChannels.listOfChannels = tempChannelList;*/
140464064216a8433360745f69edddce19a606659163The Android Open Source Project            regulatoryDomain_getParam( pScanConcentrator->hRegulatoryDomain, &param );
140564064216a8433360745f69edddce19a606659163The Android Open Source Project            i = param.content.supportedChannels.sizeOfList;
140664064216a8433360745f69edddce19a606659163The Android Open Source Project            if (i > SCAN_MAX_NUM_OF_NORMAL_CHANNELS_PER_COMMAND)
140764064216a8433360745f69edddce19a606659163The Android Open Source Project            {
140864064216a8433360745f69edddce19a606659163The Android Open Source Project                i = SCAN_MAX_NUM_OF_NORMAL_CHANNELS_PER_COMMAND;
140964064216a8433360745f69edddce19a606659163The Android Open Source Project            }
141064064216a8433360745f69edddce19a606659163The Android Open Source Project            os_memoryCopy(pScanConcentrator->hOS, tempChannelList, param.content.supportedChannels.listOfChannels, i);
141164064216a8433360745f69edddce19a606659163The Android Open Source Project            /* add default values to channels extracted from the bitmap */
141264064216a8433360745f69edddce19a606659163The Android Open Source Project            for ( j = 0; j < i; j++ )
141364064216a8433360745f69edddce19a606659163The Android Open Source Project            {
141464064216a8433360745f69edddce19a606659163The Android Open Source Project
141564064216a8433360745f69edddce19a606659163The Android Open Source Project                param.paramType = REGULATORY_DOMAIN_GET_SCAN_CAPABILITIES;
141664064216a8433360745f69edddce19a606659163The Android Open Source Project                param.content.channelCapabilityReq.band = pScanParams->band;
141764064216a8433360745f69edddce19a606659163The Android Open Source Project                if ( (pScanParams->scanType == SCAN_TYPE_NORMAL_PASSIVE) ||
141864064216a8433360745f69edddce19a606659163The Android Open Source Project                     (pScanParams->scanType == SCAN_TYPE_TRIGGERED_PASSIVE) ||
141964064216a8433360745f69edddce19a606659163The Android Open Source Project                     (pScanParams->scanType == SCAN_TYPE_SPS) )
142064064216a8433360745f69edddce19a606659163The Android Open Source Project                {
142164064216a8433360745f69edddce19a606659163The Android Open Source Project                    param.content.channelCapabilityReq.scanOption = PASSIVE_SCANNING;
142264064216a8433360745f69edddce19a606659163The Android Open Source Project                }
142364064216a8433360745f69edddce19a606659163The Android Open Source Project                else
142464064216a8433360745f69edddce19a606659163The Android Open Source Project                {
142564064216a8433360745f69edddce19a606659163The Android Open Source Project                    param.content.channelCapabilityReq.scanOption = ACTIVE_SCANNING;
142664064216a8433360745f69edddce19a606659163The Android Open Source Project                }
142764064216a8433360745f69edddce19a606659163The Android Open Source Project                param.content.channelCapabilityReq.channelNum = tempChannelList[ j ];
142864064216a8433360745f69edddce19a606659163The Android Open Source Project                regulatoryDomain_getParam( pScanConcentrator->hRegulatoryDomain, &param );
142964064216a8433360745f69edddce19a606659163The Android Open Source Project                if (param.content.channelCapabilityRet.channelValidity == TRUE)
143064064216a8433360745f69edddce19a606659163The Android Open Source Project                {
143164064216a8433360745f69edddce19a606659163The Android Open Source Project                    /* add the channel ID */
143264064216a8433360745f69edddce19a606659163The Android Open Source Project                    pScanParams->channelEntry[ j ].normalChannelEntry.channel = tempChannelList[ j ];
143364064216a8433360745f69edddce19a606659163The Android Open Source Project                    /* add other default parameters */
143464064216a8433360745f69edddce19a606659163The Android Open Source Project                    pScanParams->channelEntry[ j ].normalChannelEntry.minChannelDwellTime =
143564064216a8433360745f69edddce19a606659163The Android Open Source Project                        SCAN_DEFAULT_MIN_CHANNEL_DWELL_TIME;
143664064216a8433360745f69edddce19a606659163The Android Open Source Project                    pScanParams->channelEntry[ j ].normalChannelEntry.maxChannelDwellTime =
143764064216a8433360745f69edddce19a606659163The Android Open Source Project                        SCAN_DEFAULT_MAX_CHANNEL_DWELL_TIME;
143864064216a8433360745f69edddce19a606659163The Android Open Source Project                    pScanParams->channelEntry[ j ].normalChannelEntry.earlyTerminationEvent =
143964064216a8433360745f69edddce19a606659163The Android Open Source Project                        SCAN_DEFAULT_EARLY_TERMINATION_EVENT;
144064064216a8433360745f69edddce19a606659163The Android Open Source Project                    pScanParams->channelEntry[ j ].normalChannelEntry.ETMaxNumOfAPframes =
144164064216a8433360745f69edddce19a606659163The Android Open Source Project                        SCAN_DEFAULT_EARLY_TERMINATION_NUM_OF_FRAMES;
144264064216a8433360745f69edddce19a606659163The Android Open Source Project                    pScanParams->channelEntry[ j ].normalChannelEntry.txPowerDbm = param.content.channelCapabilityRet.maxTxPowerDbm;
144364064216a8433360745f69edddce19a606659163The Android Open Source Project
144464064216a8433360745f69edddce19a606659163The Android Open Source Project                    /* Fill broadcast BSSID */
144564064216a8433360745f69edddce19a606659163The Android Open Source Project                    for ( k = 0; k < 6; k++ )
144664064216a8433360745f69edddce19a606659163The Android Open Source Project                    {
144764064216a8433360745f69edddce19a606659163The Android Open Source Project                        pScanParams->channelEntry[ j ].normalChannelEntry.bssId.addr[ k ] = 0xff;
144864064216a8433360745f69edddce19a606659163The Android Open Source Project                    }
144964064216a8433360745f69edddce19a606659163The Android Open Source Project
145064064216a8433360745f69edddce19a606659163The Android Open Source Project                    validChannelsCnt++;
145164064216a8433360745f69edddce19a606659163The Android Open Source Project                }
145264064216a8433360745f69edddce19a606659163The Android Open Source Project            }
145364064216a8433360745f69edddce19a606659163The Android Open Source Project            pScanParams->numOfChannels = validChannelsCnt;
145464064216a8433360745f69edddce19a606659163The Android Open Source Project        }
145564064216a8433360745f69edddce19a606659163The Android Open Source Project    }
145664064216a8433360745f69edddce19a606659163The Android Open Source Project    /* channels were supplied by user - must verify that all of them are allowed */
145764064216a8433360745f69edddce19a606659163The Android Open Source Project    else
145864064216a8433360745f69edddce19a606659163The Android Open Source Project    {
145964064216a8433360745f69edddce19a606659163The Android Open Source Project        /* check channels */
146064064216a8433360745f69edddce19a606659163The Android Open Source Project        for ( i = 0; i < pScanParams->numOfChannels; )
146164064216a8433360745f69edddce19a606659163The Android Open Source Project        { /* Note that i is only increased when channel is valid - if channel is invalid, another
146264064216a8433360745f69edddce19a606659163The Android Open Source Project             channel is copied in its place, and thus the same index should be checked again. However,
146364064216a8433360745f69edddce19a606659163The Android Open Source Project             since the number of channels is decreased, the loop end condition is getting nearer! */
146464064216a8433360745f69edddce19a606659163The Android Open Source Project
146564064216a8433360745f69edddce19a606659163The Android Open Source Project            param.paramType = REGULATORY_DOMAIN_GET_SCAN_CAPABILITIES;
146664064216a8433360745f69edddce19a606659163The Android Open Source Project            param.content.channelCapabilityReq.band = pScanParams->band;
146764064216a8433360745f69edddce19a606659163The Android Open Source Project            if ( (pScanParams->scanType == SCAN_TYPE_NORMAL_PASSIVE) ||
146864064216a8433360745f69edddce19a606659163The Android Open Source Project                 (pScanParams->scanType == SCAN_TYPE_TRIGGERED_PASSIVE) ||
146964064216a8433360745f69edddce19a606659163The Android Open Source Project                 (pScanParams->scanType == SCAN_TYPE_SPS) )
147064064216a8433360745f69edddce19a606659163The Android Open Source Project            {
147164064216a8433360745f69edddce19a606659163The Android Open Source Project                param.content.channelCapabilityReq.scanOption = PASSIVE_SCANNING;
147264064216a8433360745f69edddce19a606659163The Android Open Source Project            }
147364064216a8433360745f69edddce19a606659163The Android Open Source Project            else
147464064216a8433360745f69edddce19a606659163The Android Open Source Project            {
147564064216a8433360745f69edddce19a606659163The Android Open Source Project                param.content.channelCapabilityReq.scanOption = ACTIVE_SCANNING;
147664064216a8433360745f69edddce19a606659163The Android Open Source Project            }
147764064216a8433360745f69edddce19a606659163The Android Open Source Project
147864064216a8433360745f69edddce19a606659163The Android Open Source Project            /* SPS scan */
147964064216a8433360745f69edddce19a606659163The Android Open Source Project            if ( SCAN_TYPE_SPS == pScanParams->scanType )
148064064216a8433360745f69edddce19a606659163The Android Open Source Project            {
148164064216a8433360745f69edddce19a606659163The Android Open Source Project                param.content.channelCapabilityReq.channelNum = pScanParams->channelEntry[ i ].SPSChannelEntry.channel;
148264064216a8433360745f69edddce19a606659163The Android Open Source Project                regulatoryDomain_getParam( pScanConcentrator->hRegulatoryDomain, &param );
148364064216a8433360745f69edddce19a606659163The Android Open Source Project                if (!param.content.channelCapabilityRet.channelValidity)
148464064216a8433360745f69edddce19a606659163The Android Open Source Project                {   /* channel not allowed - copy the rest of the channel in its place */
148564064216a8433360745f69edddce19a606659163The Android Open Source Project                    os_memoryCopy( pScanConcentrator->hOS, &(pScanParams->channelEntry[ i ]),
148664064216a8433360745f69edddce19a606659163The Android Open Source Project                                   &(pScanParams->channelEntry[ i + 1 ]), sizeof(scan_SPSChannelEntry_t) *
148764064216a8433360745f69edddce19a606659163The Android Open Source Project                                                                          (pScanParams->numOfChannels - i - 1) );
148864064216a8433360745f69edddce19a606659163The Android Open Source Project                    pScanParams->numOfChannels--;
148964064216a8433360745f69edddce19a606659163The Android Open Source Project                }
149064064216a8433360745f69edddce19a606659163The Android Open Source Project                else
149164064216a8433360745f69edddce19a606659163The Android Open Source Project                {
149264064216a8433360745f69edddce19a606659163The Android Open Source Project                    i += 1;
149364064216a8433360745f69edddce19a606659163The Android Open Source Project                }
149464064216a8433360745f69edddce19a606659163The Android Open Source Project
149564064216a8433360745f69edddce19a606659163The Android Open Source Project            }
149664064216a8433360745f69edddce19a606659163The Android Open Source Project            /* all other scan types */
149764064216a8433360745f69edddce19a606659163The Android Open Source Project            else
149864064216a8433360745f69edddce19a606659163The Android Open Source Project            {
149964064216a8433360745f69edddce19a606659163The Android Open Source Project                param.content.channelCapabilityReq.channelNum = pScanParams->channelEntry[ i ].normalChannelEntry.channel;
150064064216a8433360745f69edddce19a606659163The Android Open Source Project                regulatoryDomain_getParam( pScanConcentrator->hRegulatoryDomain, &param );
150164064216a8433360745f69edddce19a606659163The Android Open Source Project                if (!param.content.channelCapabilityRet.channelValidity)
150264064216a8433360745f69edddce19a606659163The Android Open Source Project                {   /* channel not allowed - copy the rest of the channel in its place */
150364064216a8433360745f69edddce19a606659163The Android Open Source Project                    os_memoryCopy( pScanConcentrator->hOS, &(pScanParams->channelEntry[ i ]),
150464064216a8433360745f69edddce19a606659163The Android Open Source Project                                   &(pScanParams->channelEntry[ i + 1 ]), sizeof(scan_normalChannelEntry_t) *
150564064216a8433360745f69edddce19a606659163The Android Open Source Project                                                                          (pScanParams->numOfChannels - i - 1) );
150664064216a8433360745f69edddce19a606659163The Android Open Source Project                    pScanParams->numOfChannels--;
150764064216a8433360745f69edddce19a606659163The Android Open Source Project                }
150864064216a8433360745f69edddce19a606659163The Android Open Source Project                else
150964064216a8433360745f69edddce19a606659163The Android Open Source Project                {
151064064216a8433360745f69edddce19a606659163The Android Open Source Project                    pScanParams->channelEntry[i].normalChannelEntry.txPowerDbm =
151164064216a8433360745f69edddce19a606659163The Android Open Source Project							MIN( param.content.channelCapabilityRet.maxTxPowerDbm,
151264064216a8433360745f69edddce19a606659163The Android Open Source Project								pScanParams->channelEntry[i].normalChannelEntry.txPowerDbm );
151364064216a8433360745f69edddce19a606659163The Android Open Source Project
151464064216a8433360745f69edddce19a606659163The Android Open Source Project                    i += 1;
151564064216a8433360745f69edddce19a606659163The Android Open Source Project                }
151664064216a8433360745f69edddce19a606659163The Android Open Source Project            }
151764064216a8433360745f69edddce19a606659163The Android Open Source Project        }
151864064216a8433360745f69edddce19a606659163The Android Open Source Project    }
151964064216a8433360745f69edddce19a606659163The Android Open Source Project}
152064064216a8433360745f69edddce19a606659163The Android Open Source Project
152164064216a8433360745f69edddce19a606659163The Android Open Source Project/**
152264064216a8433360745f69edddce19a606659163The Android Open Source Project * \author Yuval Adler\n
152364064216a8433360745f69edddce19a606659163The Android Open Source Project * \date 26-Jan-2006\n
152464064216a8433360745f69edddce19a606659163The Android Open Source Project * \brief enable/disable the use of SG parameters , and update parameters of next scans
152564064216a8433360745f69edddce19a606659163The Android Open Source Project *      requests for minDwellTime,MaxDwellTime,numProbeReq  .\n
152664064216a8433360745f69edddce19a606659163The Android Open Source Project *          this function is called when SG is enabled or disabled from the SoftGemini module
152764064216a8433360745f69edddce19a606659163The Android Open Source Project *          The compensation is needed since BT Activity holds the antenna and over-ride Scan activity
152864064216a8433360745f69edddce19a606659163The Android Open Source Project *
152964064216a8433360745f69edddce19a606659163The Android Open Source Project * Function Scope \e Private.\n
153064064216a8433360745f69edddce19a606659163The Android Open Source Project * \param hScanCncn - handle to the scan concentrator object.\n
153164064216a8433360745f69edddce19a606659163The Android Open Source Project * \param bUseSGParams - whether to use the new parameters (TRUE when SG is enabled)
153264064216a8433360745f69edddce19a606659163The Android Open Source Project * \param probeReqNumber -
153364064216a8433360745f69edddce19a606659163The Android Open Source Project * \param SGcompensationMaxTime - max value from which we won't increase dwelling time
153464064216a8433360745f69edddce19a606659163The Android Open Source Project * \param SGcompensationPercent - increasing dwell time in that percentage
153564064216a8433360745f69edddce19a606659163The Android Open Source Project */
153664064216a8433360745f69edddce19a606659163The Android Open Source Projectvoid scanConcentrator_SGconfigureScanParams( TI_HANDLE hScanCncn, BOOL bUseSGParams ,
153764064216a8433360745f69edddce19a606659163The Android Open Source Project                                             UINT8 probeReqNumber , UINT32 SGcompensationMaxTime,
153864064216a8433360745f69edddce19a606659163The Android Open Source Project                                             UINT32 SGcompensationPercent)
153964064216a8433360745f69edddce19a606659163The Android Open Source Project{
154064064216a8433360745f69edddce19a606659163The Android Open Source Project    scanConcentrator_t* pScanConcentrator = (scanConcentrator_t*)hScanCncn;
154164064216a8433360745f69edddce19a606659163The Android Open Source Project
154264064216a8433360745f69edddce19a606659163The Android Open Source Project    pScanConcentrator->bUseSGParams            = bUseSGParams;
154364064216a8433360745f69edddce19a606659163The Android Open Source Project    pScanConcentrator->SGnumOfProbeRequest     = probeReqNumber;
154464064216a8433360745f69edddce19a606659163The Android Open Source Project    pScanConcentrator->SGcompensationMaxTime   = SGcompensationMaxTime;
154564064216a8433360745f69edddce19a606659163The Android Open Source Project    pScanConcentrator->SGcompensationPercent   = SGcompensationPercent;
154664064216a8433360745f69edddce19a606659163The Android Open Source Project
154764064216a8433360745f69edddce19a606659163The Android Open Source Project    WLAN_REPORT_INFORMATION(pScanConcentrator->hReport,SCAN_CNCN_MODULE_LOG,
154864064216a8433360745f69edddce19a606659163The Android Open Source Project            ("%s: bUseSGParams = %d, numOfProbeRequest = %d, compensationMaxTime = %d, SGcompensationPercent = %d\n "
154964064216a8433360745f69edddce19a606659163The Android Open Source Project            ,__FUNCTION__,pScanConcentrator->bUseSGParams,pScanConcentrator->SGnumOfProbeRequest,
155064064216a8433360745f69edddce19a606659163The Android Open Source Project            pScanConcentrator->SGcompensationMaxTime,pScanConcentrator->SGcompensationPercent));
155164064216a8433360745f69edddce19a606659163The Android Open Source Project}
155264064216a8433360745f69edddce19a606659163The Android Open Source Project
155364064216a8433360745f69edddce19a606659163The Android Open Source Project/**
155464064216a8433360745f69edddce19a606659163The Android Open Source Project * \author Yuval Adler\n
155564064216a8433360745f69edddce19a606659163The Android Open Source Project * \date 26-Jan-2006\n
155664064216a8433360745f69edddce19a606659163The Android Open Source Project * \brief update minDwellTime,MaxDwellTime,numProbeReq according to SG module request .\n
155764064216a8433360745f69edddce19a606659163The Android Open Source Project *          this function is called when SG is enabled.
155864064216a8433360745f69edddce19a606659163The Android Open Source Project * Function Scope \e Private.\n
155964064216a8433360745f69edddce19a606659163The Android Open Source Project * \param hScanCncn - handle to the scan concentrator object.\n
156064064216a8433360745f69edddce19a606659163The Android Open Source Project * \param pScanParams - a pointer to the structure holding the scan params .\n
156164064216a8433360745f69edddce19a606659163The Android Open Source Project */
156264064216a8433360745f69edddce19a606659163The Android Open Source Projectvoid scanConcentrator_SGupdateScanParams( TI_HANDLE hScanCncn, scan_Params_t* pScanParams )
156364064216a8433360745f69edddce19a606659163The Android Open Source Project{
156464064216a8433360745f69edddce19a606659163The Android Open Source Project    scanConcentrator_t* pScanConcentrator = (scanConcentrator_t*)hScanCncn;
156564064216a8433360745f69edddce19a606659163The Android Open Source Project    UINT8 i;
156664064216a8433360745f69edddce19a606659163The Android Open Source Project    UINT32 tempTime;
156764064216a8433360745f69edddce19a606659163The Android Open Source Project
156864064216a8433360745f69edddce19a606659163The Android Open Source Project    /* for each channel increase the min and max dwell time */
156964064216a8433360745f69edddce19a606659163The Android Open Source Project    for ( i = 0 ; i < pScanParams->numOfChannels ; i++)
157064064216a8433360745f69edddce19a606659163The Android Open Source Project    {
157164064216a8433360745f69edddce19a606659163The Android Open Source Project        if (pScanConcentrator->SGcompensationMaxTime >
157264064216a8433360745f69edddce19a606659163The Android Open Source Project            pScanParams->channelEntry[i].normalChannelEntry.minChannelDwellTime)
157364064216a8433360745f69edddce19a606659163The Android Open Source Project        {
157464064216a8433360745f69edddce19a606659163The Android Open Source Project            tempTime = ((pScanParams->channelEntry[i].normalChannelEntry.minChannelDwellTime) *
157564064216a8433360745f69edddce19a606659163The Android Open Source Project                ( 100 + pScanConcentrator->SGcompensationPercent)) / 100 ;
157664064216a8433360745f69edddce19a606659163The Android Open Source Project
157764064216a8433360745f69edddce19a606659163The Android Open Source Project            if (tempTime > pScanConcentrator->SGcompensationMaxTime)
157864064216a8433360745f69edddce19a606659163The Android Open Source Project            {
157964064216a8433360745f69edddce19a606659163The Android Open Source Project                tempTime = pScanConcentrator->SGcompensationMaxTime;
158064064216a8433360745f69edddce19a606659163The Android Open Source Project            }
158164064216a8433360745f69edddce19a606659163The Android Open Source Project            pScanParams->channelEntry[i].normalChannelEntry.minChannelDwellTime = tempTime;
158264064216a8433360745f69edddce19a606659163The Android Open Source Project        }
158364064216a8433360745f69edddce19a606659163The Android Open Source Project
158464064216a8433360745f69edddce19a606659163The Android Open Source Project        if (pScanConcentrator->SGcompensationMaxTime >
158564064216a8433360745f69edddce19a606659163The Android Open Source Project                pScanParams->channelEntry[i].normalChannelEntry.maxChannelDwellTime)
158664064216a8433360745f69edddce19a606659163The Android Open Source Project        {
158764064216a8433360745f69edddce19a606659163The Android Open Source Project            tempTime = ((pScanParams->channelEntry[i].normalChannelEntry.maxChannelDwellTime) *
158864064216a8433360745f69edddce19a606659163The Android Open Source Project                ( 100 + pScanConcentrator->SGcompensationPercent)) / 100 ;
158964064216a8433360745f69edddce19a606659163The Android Open Source Project
159064064216a8433360745f69edddce19a606659163The Android Open Source Project            if (tempTime > pScanConcentrator->SGcompensationMaxTime)
159164064216a8433360745f69edddce19a606659163The Android Open Source Project            {
159264064216a8433360745f69edddce19a606659163The Android Open Source Project                tempTime = pScanConcentrator->SGcompensationMaxTime;
159364064216a8433360745f69edddce19a606659163The Android Open Source Project            }
159464064216a8433360745f69edddce19a606659163The Android Open Source Project            pScanParams->channelEntry[i].normalChannelEntry.maxChannelDwellTime = tempTime;
159564064216a8433360745f69edddce19a606659163The Android Open Source Project        }
159664064216a8433360745f69edddce19a606659163The Android Open Source Project        WLAN_REPORT_INFORMATION(pScanConcentrator->hReport,SCAN_CNCN_MODULE_LOG,
159764064216a8433360745f69edddce19a606659163The Android Open Source Project                ("%s new parmas : channel = %d  MaxDwellTime = %d MinDwellTime = %d\n"
159864064216a8433360745f69edddce19a606659163The Android Open Source Project                ,__FUNCTION__,i,pScanParams->channelEntry[i].normalChannelEntry.maxChannelDwellTime,
159964064216a8433360745f69edddce19a606659163The Android Open Source Project                pScanParams->channelEntry[i].normalChannelEntry.minChannelDwellTime));
160064064216a8433360745f69edddce19a606659163The Android Open Source Project    }
160164064216a8433360745f69edddce19a606659163The Android Open Source Project
160264064216a8433360745f69edddce19a606659163The Android Open Source Project    /* update ProbeReqNumber only if it is larger than 0 and smaller than the new value */
160364064216a8433360745f69edddce19a606659163The Android Open Source Project    if ((pScanParams->probeReqNumber > 0) &&
160464064216a8433360745f69edddce19a606659163The Android Open Source Project        (pScanConcentrator->SGnumOfProbeRequest > pScanParams->probeReqNumber))
160564064216a8433360745f69edddce19a606659163The Android Open Source Project    {
160664064216a8433360745f69edddce19a606659163The Android Open Source Project        pScanParams->probeReqNumber = pScanConcentrator->SGnumOfProbeRequest;
160764064216a8433360745f69edddce19a606659163The Android Open Source Project    }
160864064216a8433360745f69edddce19a606659163The Android Open Source Project
160964064216a8433360745f69edddce19a606659163The Android Open Source Project    WLAN_REPORT_INFORMATION(pScanConcentrator->hReport,SCAN_CNCN_MODULE_LOG,
161064064216a8433360745f69edddce19a606659163The Android Open Source Project        ("%s number of Probe requests = %d\n",__FUNCTION__,pScanParams->probeReqNumber));
161164064216a8433360745f69edddce19a606659163The Android Open Source Project}
161264064216a8433360745f69edddce19a606659163The Android Open Source Project
161364064216a8433360745f69edddce19a606659163The Android Open Source Project
1614