/*
 * 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 "ttype.h"
#include "tether.h"
#include "desc.h"

/*---------------------  Export Definitions -------------------------*/
//
// 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   TKIPCounterMeasuresInvoked;
    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 {
    long    ifIndex;
    char    ifDescr[256];               // max size 255 plus zero ending
                                        // e.g. "interface 1"
    long    ifType;
    long    ifMtu;
    unsigned long ifSpeed;
    unsigned char ifPhysAddress[ETH_ALEN];
    long    ifAdminStatus;
    long    ifOperStatus;
    unsigned long ifLastChange;
    unsigned long ifInOctets;
    unsigned long ifInUcastPkts;
    unsigned long ifInNUcastPkts;
    unsigned long ifInDiscards;
    unsigned long ifInErrors;
    unsigned long ifInUnknownProtos;
    unsigned long ifOutOctets;
    unsigned long ifOutUcastPkts;
    unsigned long ifOutNUcastPkts;
    unsigned long ifOutDiscards;
    unsigned long ifOutErrors;
    unsigned long ifOutQLen;
    unsigned long ifSpecific;
} SMib2Counter, *PSMib2Counter;

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

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


//
// RMON counter
//
typedef struct tagSRmonCounter {
    long    etherStatsIndex;
    unsigned long etherStatsDataSource;
    unsigned long etherStatsDropEvents;
    unsigned long etherStatsOctets;
    unsigned long etherStatsPkts;
    unsigned long etherStatsBroadcastPkts;
    unsigned long etherStatsMulticastPkts;
    unsigned long etherStatsCRCAlignErrors;
    unsigned long etherStatsUndersizePkts;
    unsigned long etherStatsOversizePkts;
    unsigned long etherStatsFragments;
    unsigned long etherStatsJabbers;
    unsigned long etherStatsCollisions;
    unsigned long etherStatsPkt64Octets;
    unsigned long etherStatsPkt65to127Octets;
    unsigned long etherStatsPkt128to255Octets;
    unsigned long etherStatsPkt256to511Octets;
    unsigned long etherStatsPkt512to1023Octets;
    unsigned long etherStatsPkt1024to1518Octets;
    unsigned long etherStatsOwners;
    unsigned long 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;

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

    unsigned long dwIsrUnknown;               // unknown interrupt count

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


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

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


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

    unsigned long dwNewRsrDECRYPTOK;
    unsigned long dwNewRsrCFP;
    unsigned long dwNewRsrUTSF;
    unsigned long dwNewRsrHITAID;
    unsigned long dwNewRsrHITAID0;

    unsigned long dwRsrLong;
    unsigned long dwRsrRunt;

    unsigned long dwRsrRxControl;
    unsigned long dwRsrRxData;
    unsigned long dwRsrRxManage;

    unsigned long dwRsrRxPacket;
    unsigned long dwRsrRxOctet;
    unsigned long dwRsrBroadcast;
    unsigned long dwRsrMulticast;
    unsigned long 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;

    unsigned long dwRsrRxFragment;
    unsigned long dwRsrRxFrmLen64;
    unsigned long dwRsrRxFrmLen65_127;
    unsigned long dwRsrRxFrmLen128_255;
    unsigned long dwRsrRxFrmLen256_511;
    unsigned long dwRsrRxFrmLen512_1023;
    unsigned long dwRsrRxFrmLen1024_1518;

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

    unsigned long dwTsrTxPacket[TYPE_MAXTD];
    unsigned long dwTsrTxOctet[TYPE_MAXTD];
    unsigned long dwTsrBroadcast[TYPE_MAXTD];
    unsigned long dwTsrMulticast[TYPE_MAXTD];
    unsigned long dwTsrDirected[TYPE_MAXTD];

    // RD/TD count
    unsigned long dwCntRxFrmLength;
    unsigned long dwCntTxBufLength;

    unsigned char abyCntRxPattern[16];
    unsigned char abyCntTxPattern[16];



    // Software check....
    unsigned long dwCntRxDataErr;             // rx buffer data software compare CRC err count
    unsigned long dwCntDecryptErr;            // rx buffer data software compare CRC err count
    unsigned long dwCntRxICVErr;              // rx buffer data software compare CRC err count
    unsigned int idxRxErrorDesc[TYPE_MAXRD]; // index for rx data error RD

    // 64-bit OID
    unsigned long long   ullTsrOK[TYPE_MAXTD];

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

//    unsigned long dwTxRetryCount[8];
    //
    // ISR status count
    //
    SISRCounters ISRStat;

    SCustomCounters CustomStat;

   #ifdef Calcu_LinkQual
       //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;
   #endif
} SStatCounter, *PSStatCounter;

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

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

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

void STAvClearAllCounter(PSStatCounter pStatistic);

void STAvUpdateIsrStatCounter(PSStatCounter pStatistic, unsigned long dwIsr);

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

void STAvUpdateRDStatCounterEx(PSStatCounter pStatistic,
                              unsigned char byRSR, unsigned char byNewRsr, unsigned char byRxRate,
                              unsigned char *pbyBuffer, unsigned int cbFrameLength);

void STAvUpdateTDStatCounter(PSStatCounter pStatistic, unsigned char byTSR0, unsigned char byTSR1,
		unsigned char *pbyBuffer, unsigned int cbFrameLength, unsigned int uIdx);

void STAvUpdateTDStatCounterEx(
    PSStatCounter   pStatistic,
    unsigned char *pbyBuffer,
    unsigned long cbFrameLength
    );

void STAvUpdate802_11Counter(
    PSDot11Counters p802_11Counter,
    PSStatCounter   pStatistic,
    unsigned long dwCounter
    );

void STAvClear802_11Counter(PSDot11Counters p802_11Counter);

#endif // __MIB_H__