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



