/*
 * scanResultTable.h
 *
 * Copyright(c) 1998 - 2009 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  scanResultTable.h
 *  \brief declarations for a table holding scan results, by BSSID
 *
 *  \see   scanResultTable.c
 */


#ifndef __SCAN_RESULT_TABLE_H__
#define __SCAN_RESULT_TABLE_H__

#include "osTIType.h"
#include "tidef.h"
#include "ScanCncn.h"
#include "DrvMainModules.h"

/* site types */
typedef enum
{
    SITE_PRIMARY        = 0,
    SITE_SELF           = 1,
    SITE_REGULAR        = 2,
    SITE_NULL           = 3
} siteType_e;

typedef struct
{
    /* The following fields are used for entry management at the SiteMng */
    TI_UINT8                   index;
    siteType_e                 siteType;
    TI_UINT32                  localTimeStamp;
    /* end of fields  are used for entry management at the SiteMng */

    TI_BOOL                    bConsideredForSelect;
    ERadioBand                 eBand;   
    TI_UINT8                   tsfTimeStamp[ TIME_STAMP_LEN ];

    /* The following fields are used for the selection */
    TI_BOOL                    probeRecv;
    TI_BOOL                    beaconRecv;
    TMacAddr                   bssid;
    TSsid                      ssid;
    ScanBssType_e              bssType;
    rateMask_t                 rateMask;
    ERate                      maxBasicRate;
    ERate                      maxActiveRate;
    EModulationType            beaconModulation;
    EModulationType            probeModulation;
    EPreamble                  currentPreambleType;
    EPreamble                  preambleAssRspCap;
    EPreamble                  barkerPreambleType;
    ESlotTime                  currentSlotTime;
    ESlotTime                  newSlotTime;
    TI_BOOL                    useProtection;
    TI_BOOL                    NonErpPresent;
    TI_UINT8                   channel;
    TI_BOOL                    privacy;
    TI_BOOL                    agility;
    TI_UINT16                  capabilities;
    TI_UINT16                  beaconInterval;
    TI_UINT8                   dtimPeriod;
    TI_INT8                    snr;
    ERate                      rxRate;
    TI_INT32                   rssi;

    /* HT capabilites */
	Tdot11HtCapabilitiesUnparse tHtCapabilities;
	/* HT information */
    TI_BOOL                     bHtInfoUpdate;
	Tdot11HtInformationUnparse  tHtInformation;

    /* QOS */
    TI_BOOL                    WMESupported;
    dot11_ACParameters_t       WMEParameters;
    TI_UINT8                   lastWMEParameterCnt;

    /* Power Constraint */
    TI_UINT8                   powerConstraint;

    /* AP Tx Power obtained from TPC Report */
    TI_UINT8                   APTxPower;

    /* UPSD */
    TI_BOOL                    APSDSupport;

    /* WiFi Simple Config */
    TIWLN_SIMPLE_CONFIG_MODE   WSCSiteMode; /* indicates the current WiFi Simple Config mode of the specific site*/

    TI_UINT16                  atimWindow;
    dot11_RSN_t                pRsnIe[MAX_RSN_IE];
    TI_UINT8                   rsnIeLen;

    mgmtStatus_e               failStatus;
    TI_BOOL                    prioritySite;
    TI_UINT8                   probeRespBuffer[ MAX_BEACON_BODY_LENGTH ];
    TI_UINT16                  probeRespLength;
    TI_UINT8                   beaconBuffer[ MAX_BEACON_BODY_LENGTH ];
    TI_UINT16                  beaconLength;

} TSiteEntry;




TI_HANDLE   scanResultTable_Create (TI_HANDLE hOS);
void        scanResultTable_Init (TI_HANDLE hScanResultTable, TStadHandlesList *pStadHandles);
void        scanResultTable_Destroy (TI_HANDLE hScanResultTable);
TI_STATUS   scanResultTable_UpdateEntry (TI_HANDLE hScanResultTable, TMacAddr *pBssid, TScanFrameInfo* pFrame);
void        scanResultTable_SetStableState (TI_HANDLE hScanResultTable);
TSiteEntry  *scanResultTable_GetFirst (TI_HANDLE hScanResultTable);
TSiteEntry  *scanResultTable_GetNext (TI_HANDLE hScanResultTable);
TSiteEntry  *scanResultTable_GetBySsidBssidPair (TI_HANDLE hScanResultTable, TSsid *pSsid, TMacAddr *pBssid);
TI_UINT32   scanResultTable_CalculateBssidListSize (TI_HANDLE hScanResultTable, TI_BOOL bAllVarIes);
TI_STATUS   scanResultTable_GetBssidList (TI_HANDLE hScanResultTable, OS_802_11_BSSID_LIST_EX *pBssidList, 
                                          TI_UINT32 *pLength, TI_BOOL bAllVarIes);

#endif /* __SCAN_RESULT_TABLE_H__ */

