/*
 * 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: bssdb.h
 *
 * Purpose: Handles the Basic Service Set & Node Database functions
 *
 * Author: Lyndon Chen
 *
 * Date: July 16, 2002
 *
 */

#ifndef __BSSDB_H__
#define __BSSDB_H__

#include <linux/skbuff.h>
#include "80211hdr.h"
#include "80211mgr.h"
#include "card.h"

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

#define MAX_NODE_NUM             64
#define MAX_BSS_NUM              42
#define LOST_BEACON_COUNT        10   // 10 sec, XP defined
#define MAX_PS_TX_BUF            32   // sta max power saving tx buf
#define ADHOC_LOST_BEACON_COUNT  30   // 30 sec, beacon lost for adhoc only
#define MAX_INACTIVE_COUNT       300  // 300 sec, inactive STA node refresh

#define USE_PROTECT_PERIOD       10   // 10 sec, Use protect mode check period
#define ERP_RECOVER_COUNT        30   // 30 sec, ERP support callback check
#define BSS_CLEAR_COUNT           1

#define RSSI_STAT_COUNT          10
#define MAX_CHECK_RSSI_COUNT     8

// STA dwflags
#define WLAN_STA_AUTH            BIT0
#define WLAN_STA_ASSOC           BIT1
#define WLAN_STA_PS              BIT2
#define WLAN_STA_TIM             BIT3
// permanent; do not remove entry on expiration
#define WLAN_STA_PERM            BIT4
// If 802.1X is used, this flag is
// controlling whether STA is authorized to
// send and receive non-IEEE 802.1X frames
#define WLAN_STA_AUTHORIZED      BIT5

#define MAX_RATE            12

#define MAX_WPA_IE_LEN      64

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

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

/*---------------------  Export Types  ------------------------------*/

//
// IEEE 802.11 Structures and definitions
//

typedef enum _NDIS_802_11_NETWORK_TYPE
{
	Ndis802_11FH,
	Ndis802_11DS,
	Ndis802_11OFDM5,
	Ndis802_11OFDM24,
	Ndis802_11NetworkTypeMax    // not a real type, defined as an upper bound
} NDIS_802_11_NETWORK_TYPE, *PNDIS_802_11_NETWORK_TYPE;

typedef struct tagSERPObject {
	bool bERPExist;
	unsigned char byERP;
} ERPObject, *PERPObject;

typedef struct tagSRSNCapObject {
	bool bRSNCapExist;
	unsigned short wRSNCap;
} SRSNCapObject, *PSRSNCapObject;

// BSS info(AP)
#pragma pack(1)
typedef struct tagKnownBSS {
	// BSS info
	bool bActive;
	unsigned char abyBSSID[WLAN_BSSID_LEN];
	unsigned int	uChannel;
	unsigned char abySuppRates[WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1];
	unsigned char abyExtSuppRates[WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1];
	unsigned int	uRSSI;
	unsigned char bySQ;
	unsigned short wBeaconInterval;
	unsigned short wCapInfo;
	unsigned char abySSID[WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1];
	unsigned char byRxRate;

//    unsigned short wATIMWindow;
	unsigned char byRSSIStatCnt;
	long            ldBmMAX;
	long            ldBmAverage[RSSI_STAT_COUNT];
	long            ldBmAverRange;
	//For any BSSID selection improvment
	bool bSelected;

	//++ WPA informations
	bool bWPAValid;
	unsigned char byGKType;
	unsigned char abyPKType[4];
	unsigned short wPKCount;
	unsigned char abyAuthType[4];
	unsigned short wAuthCount;
	unsigned char byDefaultK_as_PK;
	unsigned char byReplayIdx;
	//--

	//++ WPA2 informations
	bool bWPA2Valid;
	unsigned char byCSSGK;
	unsigned short wCSSPKCount;
	unsigned char abyCSSPK[4];
	unsigned short wAKMSSAuthCount;
	unsigned char abyAKMSSAuthType[4];

	//++  wpactl
	unsigned char byWPAIE[MAX_WPA_IE_LEN];
	unsigned char byRSNIE[MAX_WPA_IE_LEN];
	unsigned short wWPALen;
	unsigned short wRSNLen;

	// Clear count
	unsigned int	uClearCount;
//    unsigned char abyIEs[WLAN_BEACON_FR_MAXLEN];
	unsigned int	uIELength;
	QWORD           qwBSSTimestamp;
	QWORD           qwLocalTSF;     // local TSF timer

//    NDIS_802_11_NETWORK_TYPE    NetworkTypeInUse;
	CARD_PHY_TYPE   eNetworkTypeInUse;

	ERPObject       sERP;
	SRSNCapObject   sRSNCapObj;
	unsigned char abyIEs[1024];   // don't move this field !!
} __attribute__ ((__packed__))
KnownBSS , *PKnownBSS;

//2006-1116-01,<Add> by NomadZhao
#pragma pack()

typedef enum tagNODE_STATE {
	NODE_FREE,
	NODE_AGED,
	NODE_KNOWN,
	NODE_AUTH,
	NODE_ASSOC
} NODE_STATE, *PNODE_STATE;

// STA node info
typedef struct tagKnownNodeDB {
	// STA info
	bool bActive;
	unsigned char abyMACAddr[WLAN_ADDR_LEN];
	unsigned char abyCurrSuppRates[WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN];
	unsigned char abyCurrExtSuppRates[WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN];
	unsigned short wTxDataRate;
	bool bShortPreamble;
	bool bERPExist;
	bool bShortSlotTime;
	unsigned int	uInActiveCount;
	unsigned short wMaxBasicRate;     //Get from byTopOFDMBasicRate or byTopCCKBasicRate which depends on packetTyp.
	unsigned short wMaxSuppRate;      //Records the highest supported rate getting from SuppRates IE and ExtSuppRates IE in Beacon.
	unsigned short wSuppRate;
	unsigned char byTopOFDMBasicRate;//Records the highest basic rate in OFDM mode
	unsigned char byTopCCKBasicRate; //Records the highest basic rate in CCK mode

	// For AP mode
	struct sk_buff_head sTxPSQueue;
	unsigned short wCapInfo;
	unsigned short wListenInterval;
	unsigned short wAID;
	NODE_STATE      eNodeState;
	bool bPSEnable;
	bool bRxPSPoll;
	unsigned char byAuthSequence;
	unsigned long ulLastRxJiffer;
	unsigned char bySuppRate;
	unsigned long dwFlags;
	unsigned short wEnQueueCnt;

	bool bOnFly;
	unsigned long long       KeyRSC;
	unsigned char byKeyIndex;
	unsigned long dwKeyIndex;
	unsigned char byCipherSuite;
	unsigned long dwTSC47_16;
	unsigned short wTSC15_0;
	unsigned int	uWepKeyLength;
	unsigned char abyWepKey[WLAN_WEPMAX_KEYLEN];
	//
	// Auto rate fallback vars
	bool bIsInFallback;
	unsigned int	uAverageRSSI;
	unsigned int	uRateRecoveryTimeout;
	unsigned int	uRatePollTimeout;
	unsigned int	uTxFailures;
	unsigned int	uTxAttempts;

	unsigned int	uTxRetry;
	unsigned int	uFailureRatio;
	unsigned int	uRetryRatio;
	unsigned int	uTxOk[MAX_RATE+1];
	unsigned int	uTxFail[MAX_RATE+1];
	unsigned int	uTimeCount;
} KnownNodeDB, *PKnownNodeDB;

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

PKnownBSS
BSSpSearchBSSList(
	void *hDeviceContext,
	unsigned char *pbyDesireBSSID,
	unsigned char *pbyDesireSSID,
	CARD_PHY_TYPE ePhyType
);

PKnownBSS
BSSpAddrIsInBSSList(
	void *hDeviceContext,
	unsigned char *abyBSSID,
	PWLAN_IE_SSID pSSID
);

void
BSSvClearBSSList(
	void *hDeviceContext,
	bool bKeepCurrBSSID
);

bool
BSSbInsertToBSSList(
	void *hDeviceContext,
	unsigned char *abyBSSIDAddr,
	QWORD qwTimestamp,
	unsigned short wBeaconInterval,
	unsigned short wCapInfo,
	unsigned char byCurrChannel,
	PWLAN_IE_SSID pSSID,
	PWLAN_IE_SUPP_RATES pSuppRates,
	PWLAN_IE_SUPP_RATES pExtSuppRates,
	PERPObject psERP,
	PWLAN_IE_RSN pRSN,
	PWLAN_IE_RSN_EXT pRSNWPA,
	PWLAN_IE_COUNTRY pIE_Country,
	PWLAN_IE_QUIET pIE_Quiet,
	unsigned int uIELength,
	unsigned char *pbyIEs,
	void *pRxPacketContext
);

bool
BSSbUpdateToBSSList(
	void *hDeviceContext,
	QWORD qwTimestamp,
	unsigned short wBeaconInterval,
	unsigned short wCapInfo,
	unsigned char byCurrChannel,
	bool bChannelHit,
	PWLAN_IE_SSID pSSID,
	PWLAN_IE_SUPP_RATES pSuppRates,
	PWLAN_IE_SUPP_RATES pExtSuppRates,
	PERPObject psERP,
	PWLAN_IE_RSN pRSN,
	PWLAN_IE_RSN_EXT pRSNWPA,
	PWLAN_IE_COUNTRY pIE_Country,
	PWLAN_IE_QUIET pIE_Quiet,
	PKnownBSS pBSSList,
	unsigned int uIELength,
	unsigned char *pbyIEs,
	void *pRxPacketContext
);

bool
BSSDBbIsSTAInNodeDB(void *hDeviceContext, unsigned char *abyDstAddr,
		    unsigned int *puNodeIndex);

void
BSSvCreateOneNode(void *hDeviceContext, unsigned int *puNodeIndex);

void
BSSvUpdateAPNode(
	void *hDeviceContext,
	unsigned short *pwCapInfo,
	PWLAN_IE_SUPP_RATES pItemRates,
	PWLAN_IE_SUPP_RATES pExtSuppRates
);

void
BSSvSecondCallBack(
	void *hDeviceContext
);

void
BSSvUpdateNodeTxCounter(
	void *hDeviceContext,
	unsigned char byTsr0,
	unsigned char byTsr1,
	unsigned char *pbyBuffer,
	unsigned int uFIFOHeaderSize
);

void
BSSvRemoveOneNode(
	void *hDeviceContext,
	unsigned int uNodeIndex
);

void
BSSvAddMulticastNode(
	void *hDeviceContext
);

void
BSSvClearNodeDBTable(
	void *hDeviceContext,
	unsigned int uStartIndex
);

void
BSSvClearAnyBSSJoinRecord(
	void *hDeviceContext
);

#endif //__BSSDB_H__
