/*
* ScanCncn.h
*
* Copyright(c) 1998 - 2010 Texas Instruments. All rights reserved.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* * Neither the name Texas Instruments nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/** \file ScanCncn.h
* \brief Scan concentartor module API
*
* \see ScanCncn.c
*/
#ifndef __SCANCNCN_H__
#define __SCANCNCN_H__
#include "osTIType.h"
#include "TWDriver.h"
#include "scrApi.h"
#include "mlmeApi.h"
#define SCAN_CNCN_APP_SCAN_TABLE_ENTRIES 64
/** \enum EScanCncnClient
* \brief Scan Concentrator Client
*
* \par Description
* Enumerates the different possible clients requesting scan from the scan concentrator
*
* \sa
*/
typedef enum
{
/* 0 */ SCAN_SCC_ROAMING_IMMED, /**< Indicates a scan from the immediate scan for a roaming client */
/* 1 */ SCAN_SCC_ROAMING_CONT, /**< Indicates a scan from the continuous scan for a roaming client */
/* 2 */ SCAN_SCC_DRIVER, /**< Indicates a scan from the driver client (SME scan) */
/* 3 */ SCAN_SCC_APP_PERIODIC, /**< Indicates application (user) periodic scan */
/* 4 */ SCAN_SCC_APP_ONE_SHOT, /**< Indicates application (user) one shot scan */
/* 5 */ SCAN_SCC_NUM_OF_CLIENTS, /**< Number of scan clients (used internally) */
/* 6 */ SCAN_SCC_NO_CLIENT /**< No valid scan clients (used internally) */
} EScanCncnClient;
/** \enum EScanCncnResultStatus
* \brief Scan Concentrator Result Status
*
* \par Description
* Enumerates the possible scan result statuses
*
* \sa
*/
typedef enum
{
/* 0 */ SCAN_CRS_RECEIVED_FRAME = 0, /**< Scan is still running; management frame information is passed. */
/* 1 */ SCAN_CRS_SCAN_COMPLETE_OK, /**< Scan completed successfully */
/* 2 */ SCAN_CRS_SCAN_RUNNING, /**< Scan started successfully and now is running */
/* 3 */ SCAN_CRS_SCAN_FAILED, /**<
* scan failed due to unexpected situation (SCR reject, no
* channels available, scan SRV returned TI_NOK, etc)
*/
/* 4 */ SCAN_CRS_SCAN_STOPPED, /**< scan stopped by user */
/* 5 */ SCAN_CRS_TSF_ERROR, /**< TSF error (AP recovery) occurred (for SPS only):
* SPS was not performed because current TSF value is less than designated TSF value.
*/
/* 6 */ SCAN_CRS_SCAN_ABORTED_FW_RESET, /**< scan aborted due to FW reset */
/* 7 */ SCAN_CRS_SCAN_ABORTED_HIGHER_PRIORITY, /**< Scan was aborted because of a higher priority client request of the channel (switched channel) */
/* 8 */ SCAN_CRS_NUM_OF_RES_STATUS /**< number of possible result status */
} EScanCncnResultStatus;
/** \struct TScanFrameInfo
* \brief Scan Fram Information
*
* \par Description
* This structure contains a single frame information, returned by the result CB when a frame is available.
* It is used to pass scan results (beacons and probe responses).
*
* \sa
*/
typedef struct
{
TMacAddr* bssId; /* BSSID (MAC address) of the AP from which the frame was received */
mlmeFrameInfo_t* parsedIEs; /* Information elements in the frame, which is parsed */
ERadioBand band; /* Band on which the frame was received */
TI_UINT8 channel; /* Channel on which the frame was received */
TI_UINT32 staTSF; /* TSF of the station when the frame was received */
TI_INT8 rssi; /* RSSI level at which frame was received */
TI_INT8 snr; /* SNR level at which frame was received */
ERate rate; /* Bitrate at which frame was received */
TI_UINT8* buffer; /* Frame information elements, unparsed */
TI_UINT16 bufferLength; /* Length of the frame unparsed information elements */
} TScanFrameInfo;
/** \typedef TScanResultCB
* \brief Defines the function prototype for the scan result callback
* (notification by the scan concentrator to a client of either a scan
* termination or a result frame received).
*/
/**
* \brief Scan Result CB
*
* \param clientObj - TWD module object handle
* \param status - TID number
* \param frameInfo - Policy : Enable / Disable
* \param SPSStatus - Mac address of: SA as receiver / RA as initiator
* \return void
*
* \par Description
* Defines the function prototype for the scan result callback
* (notification by the scan concentrator to a client of either a scan termination or a result frame received)
* This CB is egistered by each client and invoked by the scan concentrator, passes scan results to the caller.
*
* \sa
*/
typedef void (*TScanResultCB) (TI_HANDLE clientObj, EScanCncnResultStatus status,
TScanFrameInfo* frameInfo, TI_UINT16 SPSStatus);
TI_HANDLE scanCncn_Create (TI_HANDLE hOS);
void scanCncn_Destroy (TI_HANDLE hScanCncn);
void scanCncn_Init (TStadHandlesList *pStadHandles);
void scanCncn_SetDefaults (TI_HANDLE hScanCncn, TScanCncnInitParams* pScanCncnInitParams);
void scanCncn_SwitchToConnected (TI_HANDLE hScanCncn);
void scanCncn_SwitchToNotConnected (TI_HANDLE hScanCncn);
void scanCncn_SwitchToIBSS (TI_HANDLE hScanCncn);
/**
* \brief Starts a one-shot scan operation
*
* \param hScanCncn - Handle to the scan concentrator object
* \param eClient - The client requesting the scan operation
* \param pScanParams - Parameters for the requested scan
* \return Scan Concentrator Result Status:
* SCAN_CRS_SCAN_RUNNING - scan started successfully and is now running
* SCAN_CRS_SCAN_FAILED - scan failed to start due to an unexpected error
*
* \par Description
* Starts a one-shot scan operation:
* - copies scan params to scan concentrator object
* - copies current SSID for roaming scans
* - verifies the requested channels with the reg doamin
* - if needed, adjust to SG compensation values
* - send an event to the client SM
*
* \sa scanCncn_StopScan
*/
EScanCncnResultStatus scanCncn_Start1ShotScan (TI_HANDLE hScanCncn, EScanCncnClient eClient, TScanParams* pScanParams);
/**
* \brief Stop an on-going one-shot scan operation
*
* \param hScanCncn - Handle to the scan concentrator object
* \param eClient - The client requesting to stop the scan operation
* \return void
*
* \par Description
* Set necessary flags and send a stop scan event to the client SM
*
* \sa scanCncn_Start1ShotScan
*/
void scanCncn_StopScan (TI_HANDLE hScanCncn, EScanCncnClient eClient);
EScanCncnResultStatus scanCncn_StartPeriodicScan (TI_HANDLE hScanCncn, EScanCncnClient eClient,
TPeriodicScanParams *pScanParams);
void scanCncn_StopPeriodicScan (TI_HANDLE hScanCncn, EScanCncnClient eClient);
/**
* \brief Registers a scan complete object
*
* \param hScanCncn - Handle to the scan concentrator object
* \param eClient - The client requesting to stop the scan operation
* \param scanResultCBFunc - Pointer to the resulting callback function
* \param scanResultCBObj - Object passed to the scan resulting callback function
* \return void
*
* \par Description
* Registers a callback function for a client that is called for every scan result and scan complete event.
* It is called by each client one time before issuing a scan request.
*
* \sa
*/
void scanCncn_RegisterScanResultCB (TI_HANDLE hScanCncn, EScanCncnClient eClient,
TScanResultCB scanResultCBFunc, TI_HANDLE scanResultCBObj);
void scanCncn_ScanCompleteNotificationCB (TI_HANDLE hScanCncn, EScanResultTag eTag,
TI_UINT32 uResultCount, TI_UINT16 SPSStatus,
TI_BOOL bTSFError, TI_STATUS scanStatus,
TI_STATUS PSMode);
void scanCncn_MlmeResultCB (TI_HANDLE hScanCncn, TMacAddr* bssid, mlmeFrameInfo_t* frameInfo,
TRxAttr* pRxAttr, TI_UINT8* buffer, TI_UINT16 bufferLength);
void scanCncn_ScrRoamingImmedCB (TI_HANDLE hScanCncn, EScrClientRequestStatus eRequestStatus,
EScrResourceId eResource, EScePendReason ePendReason);
void scanCncn_ScrRoamingContCB (TI_HANDLE hScanCncn, EScrClientRequestStatus eRequestStatus,
EScrResourceId eResource, EScePendReason ePendReason);
void scanCncn_ScrAppCB (TI_HANDLE hScanCncn, EScrClientRequestStatus eRequestStatus,
EScrResourceId eResource, EScePendReason ePendReason );
void scanCncn_ScrDriverCB (TI_HANDLE hScanCncn, EScrClientRequestStatus eRequestStatus,
EScrResourceId eResource, EScePendReason ePendReason);
void scanCncn_SGconfigureScanParams (TI_HANDLE hScanCncn, TI_BOOL bUseSGParams,
TI_UINT8 probeReqPercent, TI_UINT32 SGcompensationMaxTime,
TI_UINT32 SGcompensationPercent);
/* Scan concentrator application functions */
TI_STATUS scanCncnApp_SetParam (TI_HANDLE hScanCncn, paramInfo_t *pParam);
TI_STATUS scanCncnApp_GetParam (TI_HANDLE hScanCncn, paramInfo_t *pParam);
void scanCncn_AppScanResultCB (TI_HANDLE hScanCncn, EScanCncnResultStatus status,
TScanFrameInfo* frameInfo, TI_UINT16 SPSStatus);
void scanCncn_PeriodicScanCompleteCB (TI_HANDLE hScanCncn, char* str, TI_UINT32 strLen);
void scanCncn_PeriodicScanReportCB (TI_HANDLE hScanCncn, char* str, TI_UINT32 strLen);
#endif /* __SCANCNCN_H__ */