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

	// 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__
