/*
 * 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
//
typedef struct tagSCmdRequest {
	u8 name[16];
	void	*data;
	u16	    wResult;
	u16     wCmdCode;
} __packed SCmdRequest, *PSCmdRequest;

//
// Scan
//

typedef struct tagSCmdScan {

    u8	    ssid[SSID_MAXLEN + 2];

} __packed SCmdScan, *PSCmdScan;

//
// BSS Join
//

typedef struct tagSCmdBSSJoin {

    u16	    wBSSType;
    u16     wBBPType;
    u8	    ssid[SSID_MAXLEN + 2];
    u32	    uChannel;
    BOOL    bPSEnable;
    BOOL    bShareKeyAuth;

} __packed SCmdBSSJoin, *PSCmdBSSJoin;

//
// Zonetype Setting
//

typedef struct tagSCmdZoneTypeSet {

 BOOL       bWrite;
 WZONETYPE  ZoneType;

} __packed SCmdZoneTypeSet, *PSCmdZoneTypeSet;

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

typedef struct tagSCmdStartAP {

    u16	    wBSSType;
    u16     wBBPType;
    u8	    ssid[SSID_MAXLEN + 2];
	u32 uChannel;
	u32 uBeaconInt;
    BOOL    bShareKeyAuth;
    u8      byBasicRate;

} __packed SCmdStartAP, *PSCmdStartAP;

typedef struct tagSCmdSetWEP {

    BOOL    bEnableWep;
    u8      byKeyIndex;
    u8      abyWepKey[WEP_NKEYS][WEP_KEYMAXLEN];
    BOOL    bWepKeyAvailable[WEP_NKEYS];
    u32     auWepKeyLength[WEP_NKEYS];

} __packed 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;

} __packed SBSSIDItem;


typedef struct tagSBSSIDList {

	u32		    uItem;
	SBSSIDItem	sBSSIDList[0];
} __packed 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;

} __packed SNodeItem;


typedef struct tagSNodeList {

	u32		    uItem;
	SNodeItem	sNodeList[0];

} __packed SNodeList, *PSNodeList;


typedef struct tagSCmdLinkStatus {

    BOOL    bLink;
	u16	    wBSSType;
	u8      byState;
    u8      abyBSSID[BSSID_LEN];
    u8      abySSID[SSID_MAXLEN + 2];
    u32     uChannel;
    u32     uLinkRate;

} __packed 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;
} __packed 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];
} __packed SStatMIBCount, *PSStatMIBCount;

typedef struct tagSCmdValue {

    u32     dwValue;

} __packed 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;
} __packed;

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

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

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

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

#endif /* __IOCMD_H__ */
