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

#if !defined(DEF)
#define DEF
#endif

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

#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];
    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__ */
