/*
 * 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: mib.h
 *
 * Purpose: Implement MIB Data Structure
 *
 * Author: Tevin Chen
 *
 * Date: May 21, 1996
 *
 */

#ifndef __MIB_H__
#define __MIB_H__

#include "tether.h"
#include "desc.h"

//
// USB counter
//
typedef struct tagSUSBCounter {
    u32 dwCrc;

} SUSBCounter, *PSUSBCounter;

//
// 802.11 counter
//

typedef struct tagSDot11Counters {
  /* unsigned long Length; // Length of structure */
    unsigned long long   TransmittedFragmentCount;
    unsigned long long   MulticastTransmittedFrameCount;
    unsigned long long   FailedCount;
    unsigned long long   RetryCount;
    unsigned long long   MultipleRetryCount;
    unsigned long long   RTSSuccessCount;
    unsigned long long   RTSFailureCount;
    unsigned long long   ACKFailureCount;
    unsigned long long   FrameDuplicateCount;
    unsigned long long   ReceivedFragmentCount;
    unsigned long long   MulticastReceivedFrameCount;
    unsigned long long   FCSErrorCount;
    unsigned long long   TKIPLocalMICFailures;
    unsigned long long   TKIPRemoteMICFailures;
    unsigned long long   TKIPICVErrors;
    unsigned long long   TKIPReplays;
    unsigned long long   CCMPFormatErrors;
    unsigned long long   CCMPReplays;
    unsigned long long   CCMPDecryptErrors;
    unsigned long long   FourWayHandshakeFailures;
  /*
   * unsigned long long   WEPUndecryptableCount;
   * unsigned long long   WEPICVErrorCount;
   * unsigned long long   DecryptSuccessCount;
   * unsigned long long   DecryptFailureCount;
   */
} SDot11Counters, *PSDot11Counters;

//
// MIB2 counter
//
typedef struct tagSMib2Counter {
    signed long    ifIndex;
    char    ifDescr[256];               // max size 255 plus zero ending
                                        // e.g. "interface 1"
    signed long    ifType;
    signed long    ifMtu;
    u32   ifSpeed;
    u8    ifPhysAddress[ETH_ALEN];
    signed long    ifAdminStatus;
    signed long    ifOperStatus;
    u32   ifLastChange;
    u32   ifInOctets;
    u32   ifInUcastPkts;
    u32   ifInNUcastPkts;
    u32   ifInDiscards;
    u32   ifInErrors;
    u32   ifInUnknownProtos;
    u32   ifOutOctets;
    u32   ifOutUcastPkts;
    u32   ifOutNUcastPkts;
    u32   ifOutDiscards;
    u32   ifOutErrors;
    u32   ifOutQLen;
    u32   ifSpecific;
} SMib2Counter, *PSMib2Counter;

// Value in the ifType entry
#define WIRELESSLANIEEE80211b      6           //

// Value in the ifAdminStatus/ifOperStatus entry
#define UP                  1           //
#define DOWN                2           //
#define TESTING             3           //

//
// RMON counter
//
typedef struct tagSRmonCounter {
    signed long    etherStatsIndex;
    u32   etherStatsDataSource;
    u32   etherStatsDropEvents;
    u32   etherStatsOctets;
    u32   etherStatsPkts;
    u32   etherStatsBroadcastPkts;
    u32   etherStatsMulticastPkts;
    u32   etherStatsCRCAlignErrors;
    u32   etherStatsUndersizePkts;
    u32   etherStatsOversizePkts;
    u32   etherStatsFragments;
    u32   etherStatsJabbers;
    u32   etherStatsCollisions;
    u32   etherStatsPkt64Octets;
    u32   etherStatsPkt65to127Octets;
    u32   etherStatsPkt128to255Octets;
    u32   etherStatsPkt256to511Octets;
    u32   etherStatsPkt512to1023Octets;
    u32   etherStatsPkt1024to1518Octets;
    u32   etherStatsOwners;
    u32   etherStatsStatus;
} SRmonCounter, *PSRmonCounter;

//
// Custom counter
//
typedef struct tagSCustomCounters {
    unsigned long       Length;

    unsigned long long   ullTsrAllOK;

    unsigned long long   ullRsr11M;
    unsigned long long   ullRsr5M;
    unsigned long long   ullRsr2M;
    unsigned long long   ullRsr1M;

    unsigned long long   ullRsr11MCRCOk;
    unsigned long long   ullRsr5MCRCOk;
    unsigned long long   ullRsr2MCRCOk;
    unsigned long long   ullRsr1MCRCOk;

    unsigned long long   ullRsr54M;
    unsigned long long   ullRsr48M;
    unsigned long long   ullRsr36M;
    unsigned long long   ullRsr24M;
    unsigned long long   ullRsr18M;
    unsigned long long   ullRsr12M;
    unsigned long long   ullRsr9M;
    unsigned long long   ullRsr6M;

    unsigned long long   ullRsr54MCRCOk;
    unsigned long long   ullRsr48MCRCOk;
    unsigned long long   ullRsr36MCRCOk;
    unsigned long long   ullRsr24MCRCOk;
    unsigned long long   ullRsr18MCRCOk;
    unsigned long long   ullRsr12MCRCOk;
    unsigned long long   ullRsr9MCRCOk;
    unsigned long long   ullRsr6MCRCOk;

} SCustomCounters, *PSCustomCounters;

//
// Custom counter
//
typedef struct tagSISRCounters {
    unsigned long   Length;

    u32   dwIsrTx0OK;
    u32   dwIsrAC0TxOK;
    u32   dwIsrBeaconTxOK;
    u32   dwIsrRx0OK;
    u32   dwIsrTBTTInt;
    u32   dwIsrSTIMERInt;
    u32   dwIsrWatchDog;
    u32   dwIsrUnrecoverableError;
    u32   dwIsrSoftInterrupt;
    u32   dwIsrMIBNearfull;
    u32   dwIsrRxNoBuf;

    u32   dwIsrUnknown;               // unknown interrupt count

    u32   dwIsrRx1OK;
    u32   dwIsrATIMTxOK;
    u32   dwIsrSYNCTxOK;
    u32   dwIsrCFPEnd;
    u32   dwIsrATIMEnd;
    u32   dwIsrSYNCFlushOK;
    u32   dwIsrSTIMER1Int;
    /////////////////////////////////////
} SISRCounters, *PSISRCounters;

// Value in the etherStatsStatus entry
#define VALID               1           //
#define CREATE_REQUEST      2           //
#define UNDER_CREATION      3           //
#define INVALID             4           //

//
// Tx packet information
//
typedef struct tagSTxPktInfo {
    u8    byBroadMultiUni;
    u16    wLength;
    u16    wFIFOCtl;
    u8    abyDestAddr[ETH_ALEN];
} STxPktInfo, *PSTxPktInfo;

#define MAX_RATE            12
//
// statistic counter
//
typedef struct tagSStatCounter {
    //
    // ISR status count
    //

    SISRCounters ISRStat;

    // RSR status count
    //
    u32   dwRsrFrmAlgnErr;
    u32   dwRsrErr;
    u32   dwRsrCRCErr;
    u32   dwRsrCRCOk;
    u32   dwRsrBSSIDOk;
    u32   dwRsrADDROk;
    u32   dwRsrBCNSSIDOk;
    u32   dwRsrLENErr;
    u32   dwRsrTYPErr;

    u32   dwNewRsrDECRYPTOK;
    u32   dwNewRsrCFP;
    u32   dwNewRsrUTSF;
    u32   dwNewRsrHITAID;
    u32   dwNewRsrHITAID0;

    u32   dwRsrLong;
    u32   dwRsrRunt;

    u32   dwRsrRxControl;
    u32   dwRsrRxData;
    u32   dwRsrRxManage;

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

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

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

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

    u32   dwTsrTxPacket;
    u32   dwTsrTxOctet;
    u32   dwTsrBroadcast;
    u32   dwTsrMulticast;
    u32   dwTsrDirected;

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

    // 64-bit OID
    unsigned long long   ullTsrOK;

    // for some optional OIDs (64 bits) and DMI support
    unsigned long long   ullTxBroadcastFrames;
    unsigned long long   ullTxMulticastFrames;
    unsigned long long   ullTxDirectedFrames;
    unsigned long long   ullTxBroadcastBytes;
    unsigned long long   ullTxMulticastBytes;
    unsigned long long   ullTxDirectedBytes;

    // for autorate
    u32   dwTxOk[MAX_RATE+1];
    u32   dwTxFail[MAX_RATE+1];
    u32   dwTxRetryCount[8];

    STxPktInfo  abyTxPktInfo[16];

    SUSBCounter USB_EP0Stat;
    SUSBCounter USB_BulkInStat;
    SUSBCounter USB_BulkOutStat;
    SUSBCounter USB_InterruptStat;

    SCustomCounters CustomStat;

       //Tx count:
  unsigned long TxNoRetryOkCount;         /* success tx no retry ! */
  unsigned long TxRetryOkCount;           /* success tx but retry ! */
  unsigned long TxFailCount;              /* fail tx ? */
      //Rx count:
  unsigned long RxOkCnt;                  /* success rx ! */
  unsigned long RxFcsErrCnt;              /* fail rx ? */
      //statistic
    unsigned long SignalStren;
    unsigned long LinkQuality;

} SStatCounter, *PSStatCounter;

void STAvUpdateIsrStatCounter(PSStatCounter pStatistic,
			      u8 byIsr0,
			      u8 byIsr1);

void STAvUpdateRDStatCounter(PSStatCounter pStatistic,
			     u8 byRSR, u8 byNewRSR, u8 byRxSts,
			     u8 byRxRate, u8 * pbyBuffer,
			     unsigned int cbFrameLength);

void STAvUpdateTDStatCounter(PSStatCounter pStatistic, u8 byPktNum,
			     u8 byRate, u8 byTSR);

void
STAvUpdate802_11Counter(
    PSDot11Counters         p802_11Counter,
    PSStatCounter           pStatistic,
    u8                    byRTSSuccess,
    u8                    byRTSFail,
    u8                    byACKFail,
    u8                    byFCSErr
    );

void STAvUpdateUSBCounter(PSUSBCounter pUsbCounter, int ntStatus);

#endif /* __MIB_H__ */