/*
 * 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_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
typedef struct tagSTxMgmtPacket {
	PUWLAN_80211HDR     p80211Header;
	unsigned int cbMPDULen;
	unsigned int cbPayloadLen;
} STxMgmtPacket, *PSTxMgmtPacket;

// Rx Management Packet descriptor
typedef struct tagSRxMgmtPacket {
	PUWLAN_80211HDR     p80211Header;
	u64 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;

	// 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 joining BSS vars
	unsigned char abyDesireSSID[WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1];
	unsigned char abyDesireBSSID[WLAN_BSSID_LEN];

	// Adhoc or AP configuration vars
	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 scanning 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__
