/*
 * mlmeApi.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 mlmeApi.h
 *  \brief MLME API
 *
 *  \see mlmeSm.c
 */

/***************************************************************************/
/*                                                                          */
/*    MODULE:   mlmeApi.h                                                   */
/*    PURPOSE:  MLME API                                                    */
/*                                                                          */
/***************************************************************************/
#ifndef __MLME_API_H__
#define __MLME_API_H__

#include "tidef.h"
#include "paramOut.h"
#include "802_11Defs.h"
#include "TWDriver.h"
#include "DrvMainModules.h"

/* Constants */

/* Enumerations */

typedef enum
{
    MLME_LEGACY_TYPE_PARAM   = 0x01,
    MLME_RE_ASSOC_PARAM      = 0x02,
    MLME_TNET_WAKE_ON_PARAM  = 0x03,
    MLME_CAPABILITY_PARAM    = 0x04

} EMlmeParam;


typedef enum
{
    AUTH_LEGACY_TYPE_PARAM   = 0x01

} EAuthLegacyParam;


typedef enum
{
    MSG_BROADCAST,
    MSG_MULTICAST,
    MSG_UNICAST
} mlmeMsgDestType_t;

/* Typedefs */

/* Disassociation frame structure */
typedef struct
{
    TI_UINT16                   reason;    
}  disAssoc_t;


/* (Re)Association response frame structure */
#define ASSOC_RESP_FIXED_DATA_LEN 6
#define ASSOC_RESP_AID_MASK  0x3FFF  /* The AID is only in 14 LS bits. */

typedef struct
{
    TI_UINT16                   capabilities;      
    TI_UINT16                   status;    
    TI_UINT16                   aid;       
    dot11_RATES_t               *pRates;    
    dot11_RATES_t               *pExtRates;
    TI_UINT8                    useProtection;
    TI_BOOL                     ciscoIEPresent;
    EPreamble                   barkerPreambleMode;
    TI_UINT8                    NonErpPresent;  
    dot11_WME_PARAM_t           *WMEParams;
    dot11_RSN_t                 *pRsnIe;
    TI_UINT8                    rsnIeLen;
    dot11_QOS_CAPABILITY_IE_t   *QoSCapParameters;
	Tdot11HtCapabilitiesUnparse *pHtCapabilities;
	Tdot11HtInformationUnparse	*pHtInformation;
    TI_UINT8                    *tspecVoiceParameters;  /* dot11_WME_TSPEC_IE_t is unpacked so need to access as bytes. */
    TI_UINT8                    *tspecSignalParameters; /* dot11_WME_TSPEC_IE_t is unpacked so need to access as bytes. */
    XCCv4IEs_t                  XCCIEs[MAX_NUM_OF_AC];
}  assocRsp_t;


/* Probe response frame structure */
/* Please notice, the order of fields in the beacon must be identical to the order of 
    field in the probe response. This is because of the parsing that is done by the site manager. */
typedef struct
{
    char                        timestamp[TIME_STAMP_LEN];     
    TI_UINT16                   beaconInerval;     
    TI_UINT16                   capabilities;      
    dot11_SSID_t                *pSsid;    
    dot11_RATES_t               *pRates;
    dot11_COUNTRY_t             *country;
    dot11_POWER_CONSTRAINT_t    *powerConstraint;
    dot11_CHANNEL_SWITCH_t      *channelSwitch;
    dot11_QUIET_t               *quiet;
    dot11_TPC_REPORT_t          *TPCReport;

#ifdef XCC_MODULE_INCLUDED
    dot11_CELL_TP_t             *cellTP;
#endif

    dot11_WME_PARAM_t           *WMEParams;
    dot11_WSC_t                 *WSCParams;
    dot11_RATES_t               *pExtRates;
    TI_UINT8                    useProtection;
    EPreamble                   barkerPreambleMode;
    TI_UINT8                    NonErpPresent;  
    dot11_FH_PARAMS_t           *pFHParamsSet;     
    dot11_DS_PARAMS_t           *pDSParamsSet;     
    dot11_CF_PARAMS_t           *pCFParamsSet;     
    dot11_IBSS_PARAMS_t         *pIBSSParamsSet;
    dot11_RSN_t                 *pRsnIe;
    TI_UINT8                    rsnIeLen;
    dot11_QOS_CAPABILITY_IE_t   *QoSCapParameters;
	Tdot11HtCapabilitiesUnparse *pHtCapabilities;
	Tdot11HtInformationUnparse	*pHtInformation;
    dot11_TIM_t                 *pTIM;                  /* for beacons only */
    TI_UINT8                    *pUnknownIe;
    TI_UINT16                   unknownIeLen;
} beacon_probeRsp_t; 


/* Authentication message frame structure */
typedef struct
{
    TI_UINT16                   authAlgo;      
    TI_UINT16                   seqNum;    
    TI_UINT16                   status;    
    dot11_CHALLENGE_t           *pChallenge;       
}  authMsg_t;

/* DeAuthentication message frame structure */
typedef struct
{
    TI_UINT16                   reason;    
}  deAuth_t;

/* Action message frame structure */
typedef struct
{
    TI_UINT8                    frameType;
    TI_UINT8                    category;
    TI_UINT8                    action;
} action_t;


typedef struct 
{
    dot11MgmtSubType_e subType;

    union 
    {
        beacon_probeRsp_t iePacket;
        disAssoc_t  disAssoc;
        assocRsp_t  assocRsp;
        authMsg_t   auth;
        deAuth_t    deAuth;
        action_t    action;
    } content;

    union
    {
        mlmeMsgDestType_t   destType;
    } extesion;

} mlmeFrameInfo_t;

typedef struct 
{
    dot11_SSID_t            ssid;
    TMacAddr                bssid;
    dot11_CHALLENGE_t       challenge;
    dot11_RATES_t           rates;
    dot11_RATES_t           extRates;
    dot11_FH_PARAMS_t       fhParams;
    dot11_CF_PARAMS_t       cfParams;
    dot11_DS_PARAMS_t       dsParams;
    dot11_IBSS_PARAMS_t     ibssParams;
    dot11_COUNTRY_t         country;
    dot11_WME_PARAM_t       WMEParams;
    dot11_WSC_t             WSCParams;
    dot11_POWER_CONSTRAINT_t powerConstraint;
    dot11_CHANNEL_SWITCH_t  channelSwitch;
    dot11_QUIET_t           quiet;
    dot11_TPC_REPORT_t      TPCReport;
#ifdef XCC_MODULE_INCLUDED
    dot11_CELL_TP_t         cellTP;
#endif
    dot11_RSN_t             rsnIe[3];
    dot11_TIM_t             tim;
    dot11_QOS_CAPABILITY_IE_t   QosCapParams;
	Tdot11HtCapabilitiesUnparse tHtCapabilities;
	Tdot11HtInformationUnparse	tHtInformation;
    TI_UINT8                rxChannel;
    TI_UINT8                band;
    TI_BOOL                 myBssid;
    TI_BOOL                 myDst;
    TI_BOOL                 mySa;

    TI_BOOL                 recvChannelSwitchAnnoncIE;

	TI_UINT8                unknownIe[MAX_BEACON_BODY_LENGTH];

    mlmeFrameInfo_t         frame;
}mlmeIEParsingParams_t;

typedef void (*mlme_resultCB_t)( TI_HANDLE hObj, TMacAddr* bssid, mlmeFrameInfo_t* pFrameInfo,
                                 TRxAttr* pRxAttr, TI_UINT8* frame, TI_UINT16 frameLength );

/* External data definitions */

/* External functions definitions */

/* Function prototypes */

/* MLME SM API */

TI_HANDLE mlme_create(TI_HANDLE hOs);

TI_STATUS mlme_unload(TI_HANDLE hMlme);

void      mlme_init (TStadHandlesList *pStadHandles);

void      mlme_SetDefaults (TI_HANDLE hMlmeSm, TMlmeInitParams *pMlmeInitParams);

TI_STATUS mlme_setParam(TI_HANDLE           hMlmeSm,
                        paramInfo_t         *pParam);

TI_STATUS mlme_getParam(TI_HANDLE           hMlmeSm, 
                        paramInfo_t         *pParam);

TI_STATUS mlme_start(TI_HANDLE hMlme);

TI_STATUS mlme_stop(TI_HANDLE hMlme, DisconnectType_e disConnType, mgmtStatus_e reason);

TI_STATUS mlme_reportAuthStatus(TI_HANDLE hMlme, TI_UINT16 status);

TI_STATUS mlme_reportAssocStatus(TI_HANDLE hMlme, TI_UINT16 status);

/* MLME parser API */

TI_STATUS mlmeParser_recv(TI_HANDLE hMlme, void *pBuffer, TRxAttr* pRxAttr);

TI_STATUS mlmeParser_parseIEs(TI_HANDLE hMlme, 
                              TI_UINT8 *pData,
                              TI_INT32 bodyDataLen,
                              mlmeIEParsingParams_t *params);
TI_BOOL mlmeParser_ParseIeBuffer (TI_HANDLE hMlme, TI_UINT8 *pIeBuffer, TI_UINT32 length, TI_UINT8 desiredIeId, TI_UINT8 **pDesiredIe, TI_UINT8 *pMatchBuffer, TI_UINT32 matchBufferLen);

#ifdef XCC_MODULE_INCLUDED
void mlmeParser_readXCCOui (TI_UINT8 *pData, 
                            TI_UINT32 dataLen, 
                            TI_UINT32 *pReadLen, 
                            XCCv4IEs_t *XCCIEs);
#endif

mlmeIEParsingParams_t *mlmeParser_getParseIEsBuffer(TI_HANDLE *hMlme);

/* Association SM API */

TI_HANDLE assoc_create(TI_HANDLE pOs);

TI_STATUS assoc_unload(TI_HANDLE pAssoc);

void      assoc_init (TStadHandlesList *pStadHandles);

TI_STATUS assoc_SetDefaults (TI_HANDLE hAssoc, assocInitParams_t *pAssocInitParams);

TI_STATUS assoc_setParam(TI_HANDLE hCtrlData, paramInfo_t   *pParam);

TI_STATUS assoc_getParam(TI_HANDLE hCtrlData, paramInfo_t   *pParam);

/* Authentication SM API */

TI_HANDLE auth_create(TI_HANDLE hOs);

TI_STATUS auth_unload(TI_HANDLE hAuth);

void      auth_init (TStadHandlesList *pStadHandles);

TI_STATUS auth_SetDefaults (TI_HANDLE hAuth, authInitParams_t *pAuthInitParams);

TI_STATUS auth_setParam(TI_HANDLE hCtrlData, paramInfo_t    *pParam);

TI_STATUS auth_getParam(TI_HANDLE hCtrlData, paramInfo_t    *pParam);

#endif /* __MLME_API_H__*/