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

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

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

typedef struct tagSWPAResult {
         char	ifname[100];
	u8 proto;
	u8 key_mgmt;
	u8 eap_type;
         BOOL authenticated;
} SWPAResult, *PSWPAResult;

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];
    u16	    wBeaconInterval;
    u16	    wCapInfo;
    u8      byNetType;
    BOOL    bWEPOn;
    u32     uRSSI;

} SBSSIDItem;


typedef struct tagSBSSIDList {

	u32		    uItem;
	SBSSIDItem	sBSSIDList[0];
} SBSSIDList, *PSBSSIDList;


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 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; /* unknown interrupt count */

    // 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 had one collision */
	u32 dwTsrMoreThanOnceRetry[2]; /* this packet had many collisions */
	u32 dwTsrRetry[2];             /* this packet has ever occur collision,
					* that is (dwTsrOnceCollision0 plus
					* 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 CRC err count */
	u32 dwCntDecryptErr; /* rx buffer data CRC err count */
	u32 dwCntRxICVErr;   /* rx buffer data 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 tagSCmdValue {

    u32     dwValue;

} SCmdValue,  *PSCmdValue;

//
// hostapd & viawget ioctl related
//

// VIAGWET_IOCTL_HOSTAPD ioctl() cmd:
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;
};

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

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

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

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

#endif /* __IOCMD_H__ */
