/*
 * 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 "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   20 //(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  ------------------------------*/
//mike define: make timer  to expire after desired times
#define timer_expire(timer, next_tick) mod_timer(&timer, RUN_AT(next_tick))

typedef void (*TimerFunction)(unsigned long);


//+++ NDIS related

typedef u8 NDIS_802_11_MAC_ADDRESS[ETH_ALEN];
typedef struct _NDIS_802_11_AI_REQFI
{
	u16 Capabilities;
	u16 ListenInterval;
    NDIS_802_11_MAC_ADDRESS  CurrentAPAddress;
} NDIS_802_11_AI_REQFI, *PNDIS_802_11_AI_REQFI;

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

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



typedef struct tagSAssocInfo {
	NDIS_802_11_ASSOCIATION_INFORMATION AssocInfo;
	u8 abyIEs[WLAN_BEACON_FR_MAXLEN+WLAN_BEACON_FR_MAXLEN];
	/* store ReqIEs set by OID_802_11_ASSOCIATION_INFORMATION */
	u32 RequestIELength;
	u8 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 Management Packet descriptor */
struct vnt_tx_mgmt {
	PUWLAN_80211HDR p80211Header;
	u32 cbMPDULen;
	u32 cbPayloadLen;
};


/* Rx Management Packet descriptor */
struct vnt_rx_mgmt {
	PUWLAN_80211HDR p80211Header;
	u64 qwLocalTSF;
	u32 cbMPDULen;
	u32 cbPayloadLen;
	u32 uRSSI;
	u8 bySQ;
	u8 byRxRate;
	u8 byRxChannel;
};


struct vnt_manager {
	void *pAdapter;

	/* MAC address */
	u8  abyMACAddr[WLAN_ADDR_LEN];

	/* Configuration Mode */
	WMAC_CONFIG_MODE eConfigMode; /* MAC pre-configed mode */

	CARD_PHY_TYPE eCurrentPHYMode;

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

	PKnownBSS pCurrBSS;
	u8 byCSSGK;
	u8 byCSSPK;

	int bCurrBSSIDFilterOn;

	/* Current state vars */
	u32 uCurrChannel;
	u8 abyCurrSuppRates[WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1];
	u8 abyCurrExtSuppRates[WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1];
	u8 abyCurrSSID[WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1];
	u8 abyCurrBSSID[WLAN_BSSID_LEN];
	u16 wCurrCapInfo;
	u16 wCurrAID;
	u32 uRSSITrigger;
	u16 wCurrATIMWindow;
	u16 wCurrBeaconPeriod;
	int bIsDS;
	u8 byERPContext;

	CMD_STATE eCommandState;
	u32 uScanChannel;

	/* Desire joinning BSS vars */
	u8 abyDesireSSID[WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1];
	u8 abyDesireBSSID[WLAN_BSSID_LEN];

	/*restore BSS info for Ad-Hoc mode */
	u8 abyAdHocSSID[WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1];

	/* Adhoc or AP configuration vars */
	u16 wIBSSBeaconPeriod;
	u16 wIBSSATIMWindow;
	u32 uIBSSChannel;
	u8 abyIBSSSuppRates[WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1];
	u8 byAPBBType;
	u8 abyWPAIE[MAX_WPA_IE_LEN];
	u16 wWPAIELen;

	u32 uAssocCount;
	int bMoreData;

	/* Scan state vars */
	WMAC_SCAN_STATE eScanState;
	WMAC_SCAN_TYPE eScanType;
	u32 uScanStartCh;
	u32 uScanEndCh;
	u16 wScanSteps;
	u32 uScanBSSType;
	/* Desire scannig vars */
	u8 abyScanSSID[WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1];
	u8 abyScanBSSID[WLAN_BSSID_LEN];

	/* Privacy */
	WMAC_AUTHENTICATION_MODE eAuthenMode;
	int bShareKeyAlgorithm;
	u8 abyChallenge[WLAN_CHALLENGE_LEN];
	int bPrivacyInvoked;

	/* Received beacon state vars */
	int bInTIM;
	int bMulticastTIM;
	u8 byDTIMCount;
	u8 byDTIMPeriod;

	/* Power saving state vars */
	WMAC_POWER_MODE ePSMode;
	u16 wListenInterval;
	u16 wCountToWakeUp;
	int bInTIMWake;
	u8 *pbyPSPacketPool;
	u8 byPSPacketPool[sizeof(struct vnt_tx_mgmt)
		+ WLAN_NULLDATA_FR_MAXLEN];
	int bRxBeaconInTBTTWake;
	u8 abyPSTxMap[MAX_NODE_NUM + 1];

	/* management command related */
	u32 uCmdBusy;
	u32 uCmdHostAPBusy;

	/* management packet pool */
	u8 *pbyMgmtPacketPool;
	u8 byMgmtPacketPool[sizeof(struct vnt_tx_mgmt)
		+ WLAN_A3FR_MAXLEN];


	/* One second callback timer */
	struct timer_list sTimerSecondCallback;

	/* Temporarily Rx Mgmt Packet Descriptor */
	struct vnt_rx_mgmt sRxPacket;

	/* link list of known bss's (scan results) */
	KnownBSS sBSSList[MAX_BSS_NUM];
	/* link list of same bss's */
	KnownBSS pSameBSS[6];
	int Cisco_cckm;
	u8 Roam_dbm;

	/* 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;
	int bRoaming;

	/* associate info */
	SAssocInfo sAssocInfo;

	/* for 802.11h */
	int b11hEnable;
	int bSwitchChannel;
	u8 byNewChannel;
	PWLAN_IE_MEASURE_REP    pCurrMeasureEIDRep;
	u32 uLengthOfRepEIDs;
	u8 abyCurrentMSRReq[sizeof(struct vnt_tx_mgmt)
		+ WLAN_A3FR_MAXLEN];
	u8 abyCurrentMSRRep[sizeof(struct vnt_tx_mgmt)
		+ WLAN_A3FR_MAXLEN];
	u8 abyIECountry[WLAN_A3FR_MAXLEN];
	u8 abyIBSSDFSOwner[6];
	u8 byIBSSDFSRecovery;

	struct sk_buff skb;

};

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

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

void vMgrObjectInit(struct vnt_private *pDevice);

void vMgrAssocBeginSta(struct vnt_private *pDevice,
		struct vnt_manager *, PCMD_STATUS pStatus);

void vMgrReAssocBeginSta(struct vnt_private *pDevice,
		struct vnt_manager *, PCMD_STATUS pStatus);

void vMgrDisassocBeginSta(struct vnt_private *pDevice,
	struct vnt_manager *, u8 *abyDestAddress, u16 wReason,
	PCMD_STATUS pStatus);

void vMgrAuthenBeginSta(struct vnt_private *pDevice,
	struct vnt_manager *, PCMD_STATUS pStatus);

void vMgrCreateOwnIBSS(struct vnt_private *pDevice,
	PCMD_STATUS pStatus);

void vMgrJoinBSSBegin(struct vnt_private *pDevice,
	PCMD_STATUS pStatus);

void vMgrRxManagePacket(struct vnt_private *pDevice,
	struct vnt_manager *, struct vnt_rx_mgmt *);

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

void vMgrDeAuthenBeginSta(struct vnt_private *pDevice,
	struct vnt_manager *, u8 *abyDestAddress, u16 wReason,
	PCMD_STATUS pStatus);

int bMgrPrepareBeaconToSend(struct vnt_private *pDevice,
	struct vnt_manager *);

int bAdd_PMKID_Candidate(struct vnt_private *pDevice,
	u8 *pbyBSSID, PSRSNCapObject psRSNCapObj);

void vFlush_PMKID_Candidate(struct vnt_private *pDevice);

#endif /* __WMGR_H__ */
