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