/*
 * 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: iocmd.h
 *
 * Purpose: Handles the viawget ioctl private interface functions
 *
 * Author: Lyndon Chen
 *
 * Date: May 8, 2002
 *
 */

#ifndef __IOCMD_H__
#define __IOCMD_H__

#include "ttype.h"

// ioctl Command code
#define MAGIC_CODE	                 0x3142
#define IOCTL_CMD_TEST	            (SIOCDEVPRIVATE + 0)
#define IOCTL_CMD_SET			    (SIOCDEVPRIVATE + 1)
#define IOCTL_CMD_HOSTAPD           (SIOCDEVPRIVATE + 2)
#define IOCTL_CMD_WPA               (SIOCDEVPRIVATE + 3)

typedef enum tagWMAC_CMD {
	WLAN_CMD_BSS_SCAN,
	WLAN_CMD_BSS_JOIN,
	WLAN_CMD_DISASSOC,
	WLAN_CMD_SET_WEP,
	WLAN_CMD_GET_LINK,
	WLAN_CMD_GET_LISTLEN,
	WLAN_CMD_GET_LIST,
	WLAN_CMD_GET_MIB,
	WLAN_CMD_GET_STAT,
	WLAN_CMD_STOP_MAC,
	WLAN_CMD_START_MAC,
	WLAN_CMD_AP_START,
	WLAN_CMD_SET_HOSTAPD,
	WLAN_CMD_SET_HOSTAPD_STA,
	WLAN_CMD_SET_802_1X,
	WLAN_CMD_SET_HOST_WEP,
	WLAN_CMD_SET_WPA,
	WLAN_CMD_GET_NODE_CNT,
	WLAN_CMD_ZONETYPE_SET,
	WLAN_CMD_GET_NODE_LIST
} WMAC_CMD, *PWMAC_CMD;

typedef enum tagWZONETYPE {
	ZoneType_USA = 0,
	ZoneType_Japan = 1,
	ZoneType_Europe = 2
} WZONETYPE;

#define ADHOC	0
#define INFRA	1
#define BOTH	2
#define AP	    3

#define ADHOC_STARTED	   1
#define ADHOC_JOINTED	   2

#define PHY80211a       0
#define PHY80211b       1
#define PHY80211g       2

#define SSID_ID                0
#define SSID_MAXLEN            32
#define BSSID_LEN              6
#define WEP_NKEYS              4
#define WEP_KEYMAXLEN          29
#define WEP_40BIT_LEN          5
#define WEP_104BIT_LEN         13
#define WEP_232BIT_LEN         16

// Ioctl interface structure
// Command structure
//
#pragma pack(1)
typedef struct tagSCmdRequest {
	u8	    name[16];
	void __user *data;
	u16	    wResult;
	u16     wCmdCode;
} SCmdRequest, *PSCmdRequest;

//
// Scan
//

typedef struct tagSCmdScan {
	u8 ssid[SSID_MAXLEN + 2];
} SCmdScan, *PSCmdScan;

//
// BSS Join
//

typedef struct tagSCmdBSSJoin {
	u16	    wBSSType;
	u16     wBBPType;
	u8	    ssid[SSID_MAXLEN + 2];
	u32	    uChannel;
	bool bPSEnable;
	bool bShareKeyAuth;
} SCmdBSSJoin, *PSCmdBSSJoin;

//
// Zonetype Setting
//

typedef struct tagSCmdZoneTypeSet {
	bool bWrite;
	WZONETYPE  ZoneType;
} SCmdZoneTypeSet, *PSCmdZoneTypeSet;

#ifdef WPA_SM_Transtatus
typedef struct tagSWPAResult {
	char	ifname[100];
	u8 proto;
	u8 key_mgmt;
	u8 eap_type;
	bool authenticated;
} SWPAResult, *PSWPAResult;
#endif

typedef struct tagSCmdStartAP {
	u16	    wBSSType;
	u16     wBBPType;
	u8	    ssid[SSID_MAXLEN + 2];
	u32	    uChannel;
	u32     uBeaconInt;
	bool bShareKeyAuth;
	u8      byBasicRate;
} SCmdStartAP, *PSCmdStartAP;

typedef struct tagSCmdSetWEP {
	bool bEnableWep;
	u8      byKeyIndex;
	u8      abyWepKey[WEP_NKEYS][WEP_KEYMAXLEN];
	bool bWepKeyAvailable[WEP_NKEYS];
	u32     auWepKeyLength[WEP_NKEYS];
} SCmdSetWEP, *PSCmdSetWEP;

typedef struct tagSBSSIDItem {
	u32	    uChannel;
	u8      abyBSSID[BSSID_LEN];
	u8      abySSID[SSID_MAXLEN + 1];
	u8      byNetType;
	u16	    wBeaconInterval;
	u16	    wCapInfo;        // for address of byNetType at align 4

	bool bWEPOn;
	u32     uRSSI;
} SBSSIDItem;

typedef struct tagSBSSIDList {
	u32		    uItem;
	SBSSIDItem	sBSSIDList[0];
} SBSSIDList, *PSBSSIDList;

typedef struct tagSCmdLinkStatus {
	bool bLink;
	u16   wBSSType;
	u8      byState;
	u8      abyBSSID[BSSID_LEN];
	u8      abySSID[SSID_MAXLEN + 2];
	u32     uChannel;
	u32     uLinkRate;
} SCmdLinkStatus, *PSCmdLinkStatus;

//
// 802.11 counter
//
typedef struct tagSDot11MIBCount {
	u32 TransmittedFragmentCount;
	u32 MulticastTransmittedFrameCount;
	u32 FailedCount;
	u32 RetryCount;
	u32 MultipleRetryCount;
	u32 RTSSuccessCount;
	u32 RTSFailureCount;
	u32 ACKFailureCount;
	u32 FrameDuplicateCount;
	u32 ReceivedFragmentCount;
	u32 MulticastReceivedFrameCount;
	u32 FCSErrorCount;
} SDot11MIBCount, *PSDot11MIBCount;

//
// statistic counter
//
typedef struct tagSStatMIBCount {
	//
	// ISR status count
	//
	u32   dwIsrTx0OK;
	u32   dwIsrTx1OK;
	u32   dwIsrBeaconTxOK;
	u32   dwIsrRxOK;
	u32   dwIsrTBTTInt;
	u32   dwIsrSTIMERInt;
	u32   dwIsrUnrecoverableError;
	u32   dwIsrSoftInterrupt;
	u32   dwIsrRxNoBuf;

	u32   dwIsrUnknown;

	// RSR status count
	//
	u32   dwRsrFrmAlgnErr;
	u32   dwRsrErr;
	u32   dwRsrCRCErr;
	u32   dwRsrCRCOk;
	u32   dwRsrBSSIDOk;
	u32   dwRsrADDROk;
	u32   dwRsrICVOk;
	u32   dwNewRsrShortPreamble;
	u32   dwRsrLong;
	u32   dwRsrRunt;

	u32   dwRsrRxControl;
	u32   dwRsrRxData;
	u32   dwRsrRxManage;

	u32   dwRsrRxPacket;
	u32   dwRsrRxOctet;
	u32   dwRsrBroadcast;
	u32   dwRsrMulticast;
	u32   dwRsrDirected;
	// 64-bit OID
	u32   ullRsrOK;

	// for some optional OIDs (64 bits) and DMI support
	u32   ullRxBroadcastBytes;
	u32   ullRxMulticastBytes;
	u32   ullRxDirectedBytes;
	u32   ullRxBroadcastFrames;
	u32   ullRxMulticastFrames;
	u32   ullRxDirectedFrames;

	u32   dwRsrRxFragment;
	u32   dwRsrRxFrmLen64;
	u32   dwRsrRxFrmLen65_127;
	u32   dwRsrRxFrmLen128_255;
	u32   dwRsrRxFrmLen256_511;
	u32   dwRsrRxFrmLen512_1023;
	u32   dwRsrRxFrmLen1024_1518;

	// TSR0,1 status count
	//
	u32   dwTsrTotalRetry[2];        // total collision retry count
	u32   dwTsrOnceRetry[2];         // this packet only occur one collision
	u32   dwTsrMoreThanOnceRetry[2]; // this packet occur more than one collision
	u32   dwTsrRetry[2];             // this packet has ever occur collision,
	// that is (dwTsrOnceCollision0 + dwTsrMoreThanOnceCollision0)
	u32   dwTsrACKData[2];
	u32   dwTsrErr[2];
	u32   dwAllTsrOK[2];
	u32   dwTsrRetryTimeout[2];
	u32   dwTsrTransmitTimeout[2];

	u32   dwTsrTxPacket[2];
	u32   dwTsrTxOctet[2];
	u32   dwTsrBroadcast[2];
	u32   dwTsrMulticast[2];
	u32   dwTsrDirected[2];

	// RD/TD count
	u32   dwCntRxFrmLength;
	u32   dwCntTxBufLength;

	u8    abyCntRxPattern[16];
	u8    abyCntTxPattern[16];

	// Software check....
	u32   dwCntRxDataErr;             // rx buffer data software compare CRC err count
	u32   dwCntDecryptErr;            // rx buffer data software compare CRC err count
	u32   dwCntRxICVErr;              // rx buffer data software compare CRC err count
	u32    idxRxErrorDesc;             // index for rx data error RD

	// 64-bit OID
	u32   ullTsrOK[2];

	// for some optional OIDs (64 bits) and DMI support
	u32   ullTxBroadcastFrames[2];
	u32   ullTxMulticastFrames[2];
	u32   ullTxDirectedFrames[2];
	u32   ullTxBroadcastBytes[2];
	u32   ullTxMulticastBytes[2];
	u32   ullTxDirectedBytes[2];
} SStatMIBCount, *PSStatMIBCount;

typedef struct tagSNodeItem {
	// STA info
	u16            wAID;
	u8             abyMACAddr[6];
	u16            wTxDataRate;
	u16            wInActiveCount;
	u16            wEnQueueCnt;
	u16            wFlags;
	bool bPWBitOn;
	u8             byKeyIndex;
	u16            wWepKeyLength;
	u8            abyWepKey[WEP_KEYMAXLEN];
	// Auto rate fallback vars
	bool bIsInFallback;
	u32            uTxFailures;
	u32            uTxAttempts;
	u16            wFailureRatio;
} SNodeItem;

typedef struct tagSNodeList {
	u32		    uItem;
	SNodeItem	sNodeList[0];
} SNodeList, *PSNodeList;

typedef struct tagSCmdValue {
	u32 dwValue;
} SCmdValue,  *PSCmdValue;

//
// hostapd & viawget ioctl related
//

enum {
	VIAWGET_HOSTAPD_FLUSH = 1,
	VIAWGET_HOSTAPD_ADD_STA = 2,
	VIAWGET_HOSTAPD_REMOVE_STA = 3,
	VIAWGET_HOSTAPD_GET_INFO_STA = 4,
	VIAWGET_HOSTAPD_SET_ENCRYPTION = 5,
	VIAWGET_HOSTAPD_GET_ENCRYPTION = 6,
	VIAWGET_HOSTAPD_SET_FLAGS_STA = 7,
	VIAWGET_HOSTAPD_SET_ASSOC_AP_ADDR = 8,
	VIAWGET_HOSTAPD_SET_GENERIC_ELEMENT = 9,
	VIAWGET_HOSTAPD_MLME = 10,
	VIAWGET_HOSTAPD_SCAN_REQ = 11,
	VIAWGET_HOSTAPD_STA_CLEAR_STATS = 12,
};

#define VIAWGET_HOSTAPD_GENERIC_ELEMENT_HDR_LEN				\
	((int)(&((struct viawget_hostapd_param *)0)->u.generic_elem.data))

// Maximum length for algorithm names (-1 for nul termination) used in ioctl()

struct viawget_hostapd_param {
	u32 cmd;
	u8 sta_addr[6];
	union {
		struct {
			u16 aid;
			u16 capability;
			u8 tx_supp_rates;
		} add_sta;
		struct {
			u32 inactive_sec;
		} get_info_sta;
		struct {
			u8 alg;
			u32 flags;
			u32 err;
			u8 idx;
			u8 seq[8];
			u16 key_len;
			u8 key[0];
		} crypt;
		struct {
			u32 flags_and;
			u32 flags_or;
		} set_flags_sta;
		struct {
			u16 rid;
			u16 len;
			u8 data[0];
		} rid;
		struct {
			u8 len;
			u8 data[0];
		} generic_elem;
		struct {
			u16 cmd;
			u16 reason_code;
		} mlme;
		struct {
			u8 ssid_len;
			u8 ssid[32];
		} scan_req;
	} u;
};

#pragma pack()

#endif //__IOCMD_H__
