/*
 * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
 * All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 *
 * File: wmgr.h
 *
 * Purpose:
 *
 * Author: lyndon chen
 *
 * Date: Jan 2, 2003
 *
 * Functions:
 *
 * Revision History:
 *
 */

#ifndef __WMGR_H__
#define __WMGR_H__

#include "ttype.h"
#include "80211mgr.h"
#include "80211hdr.h"
#include "wcmd.h"
#include "bssdb.h"
#include "wpa2.h"
#include "vntwifi.h"
#include "card.h"

/*---------------------  Export Definitions -------------------------*/



// Scan time
#define PROBE_DELAY                  100  // (us)
#define SWITCH_CHANNEL_DELAY         200 // (us)
#define WLAN_SCAN_MINITIME           25   // (ms)
#define WLAN_SCAN_MAXTIME            100  // (ms)
#define TRIVIAL_SYNC_DIFFERENCE      0    // (us)
#define DEFAULT_IBSS_BI              100  // (ms)

#define WCMD_ACTIVE_SCAN_TIME   50 //(ms)
#define WCMD_PASSIVE_SCAN_TIME  100 //(ms)


#define DEFAULT_MSDU_LIFETIME           512  // ms
#define DEFAULT_MSDU_LIFETIME_RES_64us  8000 // 64us

#define DEFAULT_MGN_LIFETIME            8    // ms
#define DEFAULT_MGN_LIFETIME_RES_64us   125  // 64us

#define MAKE_BEACON_RESERVED            10  //(us)


#define TIM_MULTICAST_MASK           0x01
#define TIM_BITMAPOFFSET_MASK        0xFE
#define DEFAULT_DTIM_PERIOD             1

#define AP_LONG_RETRY_LIMIT             4

#define DEFAULT_IBSS_CHANNEL            6  //2.4G


/*---------------------  Export Classes  ----------------------------*/

/*---------------------  Export Variables  --------------------------*/

/*---------------------  Export Types  ------------------------------*/
#define timer_expire(timer,next_tick)   mod_timer(&timer, RUN_AT(next_tick))
typedef void (*TimerFunction)(unsigned long);


//+++ NDIS related

typedef unsigned char NDIS_802_11_MAC_ADDRESS[6];
typedef struct _NDIS_802_11_AI_REQFI
{
    unsigned short Capabilities;
    unsigned short ListenInterval;
    NDIS_802_11_MAC_ADDRESS  CurrentAPAddress;
} NDIS_802_11_AI_REQFI, *PNDIS_802_11_AI_REQFI;

typedef struct _NDIS_802_11_AI_RESFI
{
    unsigned short Capabilities;
    unsigned short StatusCode;
    unsigned short AssociationId;
} NDIS_802_11_AI_RESFI, *PNDIS_802_11_AI_RESFI;

typedef struct _NDIS_802_11_ASSOCIATION_INFORMATION
{
    unsigned long Length;
    unsigned short          AvailableRequestFixedIEs;
    NDIS_802_11_AI_REQFI    RequestFixedIEs;
    unsigned long RequestIELength;
    unsigned long OffsetRequestIEs;
    unsigned short          AvailableResponseFixedIEs;
    NDIS_802_11_AI_RESFI    ResponseFixedIEs;
    unsigned long ResponseIELength;
    unsigned long OffsetResponseIEs;
} NDIS_802_11_ASSOCIATION_INFORMATION, *PNDIS_802_11_ASSOCIATION_INFORMATION;



typedef struct tagSAssocInfo {
    NDIS_802_11_ASSOCIATION_INFORMATION     AssocInfo;
    unsigned char abyIEs[WLAN_BEACON_FR_MAXLEN+WLAN_BEACON_FR_MAXLEN];
    // store ReqIEs set by OID_802_11_ASSOCIATION_INFORMATION
    unsigned long RequestIELength;
    unsigned char abyReqIEs[WLAN_BEACON_FR_MAXLEN];
} SAssocInfo, *PSAssocInfo;
//---


/*
typedef enum tagWMAC_AUTHENTICATION_MODE {


    WMAC_AUTH_OPEN,
    WMAC_AUTH_SHAREKEY,
    WMAC_AUTH_AUTO,
    WMAC_AUTH_WPA,
    WMAC_AUTH_WPAPSK,
    WMAC_AUTH_WPANONE,
    WMAC_AUTH_WPA2,
    WMAC_AUTH_WPA2PSK,
    WMAC_AUTH_MAX       // Not a real mode, defined as upper bound


} WMAC_AUTHENTICATION_MODE, *PWMAC_AUTHENTICATION_MODE;
*/


// Pre-configured Mode (from XP)
/*
typedef enum tagWMAC_CONFIG_MODE {
    WMAC_CONFIG_ESS_STA,
    WMAC_CONFIG_IBSS_STA,
    WMAC_CONFIG_AUTO,
    WMAC_CONFIG_AP

} WMAC_CONFIG_MODE, *PWMAC_CONFIG_MODE;
*/

typedef enum tagWMAC_SCAN_TYPE {

    WMAC_SCAN_ACTIVE,
    WMAC_SCAN_PASSIVE,
    WMAC_SCAN_HYBRID

} WMAC_SCAN_TYPE, *PWMAC_SCAN_TYPE;


typedef enum tagWMAC_SCAN_STATE {

    WMAC_NO_SCANNING,
    WMAC_IS_SCANNING,
    WMAC_IS_PROBEPENDING

} WMAC_SCAN_STATE, *PWMAC_SCAN_STATE;



// Notes:
// Basic Service Set state explained as following:
// WMAC_STATE_IDLE          : no BSS is selected (Adhoc or Infra)
// WMAC_STATE_STARTED       : no BSS is selected, start own IBSS (Adhoc only)
// WMAC_STATE_JOINTED       : BSS is selected and synchronized (Adhoc or Infra)
// WMAC_STATE_AUTHPENDING   : Authentication pending (Infra)
// WMAC_STATE_AUTH          : Authenticated (Infra)
// WMAC_STATE_ASSOCPENDING  : Association pending (Infra)
// WMAC_STATE_ASSOC         : Associated (Infra)

typedef enum tagWMAC_BSS_STATE {

    WMAC_STATE_IDLE,
    WMAC_STATE_STARTED,
    WMAC_STATE_JOINTED,
    WMAC_STATE_AUTHPENDING,
    WMAC_STATE_AUTH,
    WMAC_STATE_ASSOCPENDING,
    WMAC_STATE_ASSOC

} WMAC_BSS_STATE, *PWMAC_BSS_STATE;

// WMAC selected running mode
typedef enum tagWMAC_CURRENT_MODE {

    WMAC_MODE_STANDBY,
    WMAC_MODE_ESS_STA,
    WMAC_MODE_IBSS_STA,
    WMAC_MODE_ESS_AP

} WMAC_CURRENT_MODE, *PWMAC_CURRENT_MODE;

/*
typedef enum tagWMAC_POWER_MODE {

    WMAC_POWER_CAM,
    WMAC_POWER_FAST,
    WMAC_POWER_MAX

} WMAC_POWER_MODE, *PWMAC_POWER_MODE;
*/


// Tx Managment Packet descriptor
typedef struct tagSTxMgmtPacket {

    PUWLAN_80211HDR     p80211Header;
    unsigned int cbMPDULen;
    unsigned int cbPayloadLen;

} STxMgmtPacket, *PSTxMgmtPacket;


// Rx Managment Packet descriptor
typedef struct tagSRxMgmtPacket {

    PUWLAN_80211HDR     p80211Header;
    QWORD               qwLocalTSF;
    unsigned int cbMPDULen;
    unsigned int cbPayloadLen;
    unsigned int uRSSI;
    unsigned char bySQ;
    unsigned char byRxRate;
    unsigned char byRxChannel;

} SRxMgmtPacket, *PSRxMgmtPacket;



typedef struct tagSMgmtObject
{

    void *                   pAdapter;
    // MAC address
    unsigned char abyMACAddr[WLAN_ADDR_LEN];

    // Configuration Mode
    WMAC_CONFIG_MODE        eConfigMode; // MAC pre-configed mode
    CARD_PHY_TYPE           eCurrentPHYMode;
    CARD_PHY_TYPE           eConfigPHYMode;


    // Operation state variables
    WMAC_CURRENT_MODE       eCurrMode;   // MAC current connection mode
    WMAC_BSS_STATE          eCurrState;  // MAC current BSS state

    PKnownBSS               pCurrBSS;
    unsigned char byCSSGK;
    unsigned char byCSSPK;

//    unsigned char abyNewSuppRates[WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN];
//    unsigned char abyNewExtSuppRates[WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN];

    // Current state vars
    unsigned int	uCurrChannel;
    unsigned char abyCurrSuppRates[WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1];
    unsigned char abyCurrExtSuppRates[WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1];
    unsigned char abyCurrSSID[WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1];
    unsigned char abyCurrBSSID[WLAN_BSSID_LEN];
    unsigned short wCurrCapInfo;
    unsigned short wCurrAID;
    unsigned short wCurrATIMWindow;
    unsigned short wCurrBeaconPeriod;
    bool bIsDS;
    unsigned char byERPContext;

    CMD_STATE               eCommandState;
    unsigned int	uScanChannel;

    // Desire joinning BSS vars
    unsigned char abyDesireSSID[WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1];
    unsigned char abyDesireBSSID[WLAN_BSSID_LEN];

    // Adhoc or AP configuration vars
  //unsigned char abyAdHocSSID[WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1];
    unsigned short wIBSSBeaconPeriod;
    unsigned short wIBSSATIMWindow;
    unsigned int	uIBSSChannel;
    unsigned char abyIBSSSuppRates[WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1];
    unsigned char byAPBBType;
    unsigned char abyWPAIE[MAX_WPA_IE_LEN];
    unsigned short wWPAIELen;

    unsigned int	uAssocCount;
    bool bMoreData;

    // Scan state vars
    WMAC_SCAN_STATE         eScanState;
    WMAC_SCAN_TYPE          eScanType;
    unsigned int	uScanStartCh;
    unsigned int	uScanEndCh;
    unsigned short wScanSteps;
    unsigned int	uScanBSSType;
    // Desire scannig vars
    unsigned char abyScanSSID[WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1];
    unsigned char abyScanBSSID[WLAN_BSSID_LEN];

    // Privacy
    WMAC_AUTHENTICATION_MODE eAuthenMode;
    WMAC_ENCRYPTION_MODE    eEncryptionMode;
    bool bShareKeyAlgorithm;
    unsigned char abyChallenge[WLAN_CHALLENGE_LEN];
    bool bPrivacyInvoked;

    // Received beacon state vars
    bool bInTIM;
    bool bMulticastTIM;
    unsigned char byDTIMCount;
    unsigned char byDTIMPeriod;

    // Power saving state vars
    WMAC_POWER_MODE         ePSMode;
    unsigned short wListenInterval;
    unsigned short wCountToWakeUp;
    bool bInTIMWake;
    unsigned char *pbyPSPacketPool;
    unsigned char byPSPacketPool[sizeof(STxMgmtPacket) + WLAN_NULLDATA_FR_MAXLEN];
    bool bRxBeaconInTBTTWake;
    unsigned char abyPSTxMap[MAX_NODE_NUM + 1];

    // management command related
    unsigned int	uCmdBusy;
    unsigned int	uCmdHostAPBusy;

    // management packet pool
    unsigned char *pbyMgmtPacketPool;
    unsigned char byMgmtPacketPool[sizeof(STxMgmtPacket) + WLAN_A3FR_MAXLEN];


    // One second callback timer
    struct timer_list	    sTimerSecondCallback;

    // Temporarily Rx Mgmt Packet Descriptor
    SRxMgmtPacket           sRxPacket;

    // link list of known bss's (scan results)
    KnownBSS                sBSSList[MAX_BSS_NUM];



    // table list of known node
    // sNodeDBList[0] is reserved for AP under Infra mode
    // sNodeDBList[0] is reserved for Multicast under adhoc/AP mode
    KnownNodeDB             sNodeDBTable[MAX_NODE_NUM + 1];



    // WPA2 PMKID Cache
    SPMKIDCache             gsPMKIDCache;
    bool bRoaming;

    // rate fall back vars



    // associate info
    SAssocInfo              sAssocInfo;


    // for 802.11h
    bool b11hEnable;
    bool bSwitchChannel;
    unsigned char byNewChannel;
    PWLAN_IE_MEASURE_REP    pCurrMeasureEIDRep;
    unsigned int	uLengthOfRepEIDs;
    unsigned char abyCurrentMSRReq[sizeof(STxMgmtPacket) + WLAN_A3FR_MAXLEN];
    unsigned char abyCurrentMSRRep[sizeof(STxMgmtPacket) + WLAN_A3FR_MAXLEN];
    unsigned char abyIECountry[WLAN_A3FR_MAXLEN];
    unsigned char abyIBSSDFSOwner[6];
    unsigned char byIBSSDFSRecovery;

    struct sk_buff  skb;

} SMgmtObject, *PSMgmtObject;


/*---------------------  Export Macros ------------------------------*/


/*---------------------  Export Functions  --------------------------*/


void
vMgrObjectInit(
    void *hDeviceContext
    );

void
vMgrTimerInit(
    void *hDeviceContext
    );

void
vMgrObjectReset(
    void *hDeviceContext
    );

void
vMgrAssocBeginSta(
    void *hDeviceContext,
    PSMgmtObject pMgmt,
    PCMD_STATUS pStatus
    );

void
vMgrReAssocBeginSta(
    void *hDeviceContext,
    PSMgmtObject pMgmt,
    PCMD_STATUS pStatus
    );

void
vMgrDisassocBeginSta(
    void *hDeviceContext,
    PSMgmtObject pMgmt,
    unsigned char *abyDestAddress,
    unsigned short wReason,
    PCMD_STATUS pStatus
    );

void
vMgrAuthenBeginSta(
    void *hDeviceContext,
    PSMgmtObject pMgmt,
    PCMD_STATUS pStatus
    );

void
vMgrCreateOwnIBSS(
    void *hDeviceContext,
    PCMD_STATUS pStatus
    );

void
vMgrJoinBSSBegin(
    void *hDeviceContext,
    PCMD_STATUS pStatus
    );

void
vMgrRxManagePacket(
    void *hDeviceContext,
    PSMgmtObject pMgmt,
    PSRxMgmtPacket pRxPacket
    );

/*
void
vMgrScanBegin(
    void *hDeviceContext,
    PCMD_STATUS pStatus
    );
*/

void
vMgrDeAuthenBeginSta(
    void *hDeviceContext,
    PSMgmtObject  pMgmt,
    unsigned char *abyDestAddress,
    unsigned short wReason,
    PCMD_STATUS pStatus
    );

bool
bMgrPrepareBeaconToSend(
    void *hDeviceContext,
    PSMgmtObject pMgmt
    );


bool
bAdd_PMKID_Candidate (
    void *hDeviceContext,
    unsigned char *pbyBSSID,
    PSRSNCapObject psRSNCapObj
    );

void
vFlush_PMKID_Candidate (
    void *hDeviceContext
    );

#endif // __WMGR_H__
