#include <Copyright.h>
/********************************************************************************
* rmon.c
*
* DESCRIPTION:
*        This sample shows how to read/clear RMON counter in the device
*
* DEPENDENCIES:   NONE.
*
* FILE REVISION NUMBER:
*
*******************************************************************************/

#include "msSample.h"


/*
 * This sample is for every device that support RMON counter.
*/
GT_STATUS sampleClearRMONCounter(GT_QD_DEV *dev,GT_LPORT port)
{
    GT_STATUS status;

    if((status = gstatsFlushPort(dev,port)) != GT_OK)
    {
        MSG_PRINT(("gstatsFlushPort returned fail (%#x).\n",status));
        return status;
    }

    return GT_OK;
}

/*
 * This sample is for 88E6021, 88E6063, and 88E6083.
*/
void sampleDisplayCounter(GT_STATS_COUNTER_SET *statsCounter)
{
    MSG_PRINT(("InUnicasts    %08i    ", statsCounter->InUnicasts));
    MSG_PRINT(("InBroadcasts  %08i   \n", statsCounter->InBroadcasts));
    MSG_PRINT(("InPause       %08i    ", statsCounter->InPause));
    MSG_PRINT(("InMulticasts  %08i   \n", statsCounter->InMulticasts));
    MSG_PRINT(("InFCSErr      %08i    ", statsCounter->InFCSErr));
    MSG_PRINT(("AlignErr      %08i   \n", statsCounter->AlignErr));
    MSG_PRINT(("InGoodOctets  %08i    ", statsCounter->InGoodOctets));
    MSG_PRINT(("InBadOctets   %08i   \n", statsCounter->InBadOctets));
    MSG_PRINT(("Undersize     %08i    ", statsCounter->Undersize));
    MSG_PRINT(("Fragments     %08i   \n", statsCounter->Fragments));
    MSG_PRINT(("In64Octets    %08i    ", statsCounter->In64Octets));
    MSG_PRINT(("In127Octets   %08i   \n", statsCounter->In127Octets));
    MSG_PRINT(("In255Octets   %08i    ", statsCounter->In255Octets));
    MSG_PRINT(("In511Octets   %08i   \n", statsCounter->In511Octets));
    MSG_PRINT(("In1023Octets  %08i    ", statsCounter->In1023Octets));
    MSG_PRINT(("InMaxOctets   %08i   \n", statsCounter->InMaxOctets));
    MSG_PRINT(("Jabber        %08i    ", statsCounter->Jabber));
    MSG_PRINT(("Oversize      %08i   \n", statsCounter->Oversize));
    MSG_PRINT(("InDiscards    %08i    ", statsCounter->InDiscards));
    MSG_PRINT(("Filtered      %08i   \n", statsCounter->Filtered));
    MSG_PRINT(("OutUnicasts   %08i    ", statsCounter->OutUnicasts));
    MSG_PRINT(("OutBroadcasts %08i   \n", statsCounter->OutBroadcasts));
    MSG_PRINT(("OutPause      %08i    ", statsCounter->OutPause));
    MSG_PRINT(("OutMulticasts %08i   \n", statsCounter->OutMulticasts));
    MSG_PRINT(("OutFCSErr     %08i    ", statsCounter->OutFCSErr));
    MSG_PRINT(("OutGoodOctets %08i   \n", statsCounter->OutGoodOctets));
    MSG_PRINT(("Out64Octets   %08i    ", statsCounter->Out64Octets));
    MSG_PRINT(("Out127Octets  %08i   \n", statsCounter->Out127Octets));
    MSG_PRINT(("Out255Octets  %08i    ", statsCounter->Out255Octets));
    MSG_PRINT(("Out511Octets  %08i   \n", statsCounter->Out511Octets));
    MSG_PRINT(("Out1023Octets %08i    ", statsCounter->Out1023Octets));
    MSG_PRINT(("OutMaxOctets  %08i   \n", statsCounter->OutMaxOctets));
    MSG_PRINT(("Collisions    %08i    ", statsCounter->Collisions));
    MSG_PRINT(("Late          %08i   \n", statsCounter->Late));
    MSG_PRINT(("Excessive     %08i    ", statsCounter->Excessive));
    MSG_PRINT(("Multiple      %08i   \n", statsCounter->Multiple));
    MSG_PRINT(("Single        %08i    ", statsCounter->Single));
    MSG_PRINT(("Deferred      %08i   \n", statsCounter->Deferred));
    MSG_PRINT(("OutDiscards   %08i   \n", statsCounter->OutDiscards));
}

/*
 * This sample is for 88E6021, 88E6063, and 88E6083.
*/
GT_STATUS sampleGetRMONCounter(GT_QD_DEV *dev)
{
    GT_STATUS status;
    GT_LPORT port;
    GT_STATS_COUNTER_SET    statsCounterSet;

    for(port=0; port<dev->numOfPorts; port++)
    {
        MSG_PRINT(("Port %i :\n",port));

        if((status = gstatsGetPortAllCounters(dev,port,&statsCounterSet)) != GT_OK)
        {
            MSG_PRINT(("gstatsGetPortAllCounters returned fail (%#x).\n",status));
            return status;
        }

        sampleDisplayCounter(&statsCounterSet);

    }

    return GT_OK;
}


/*
 * This sample is for 88E6183
*/
void sampleDisplayCounter2(GT_STATS_COUNTER_SET2 *statsCounter)
{
    MSG_PRINT(("InGoodOctetsHi  %08i    ", statsCounter->InGoodOctetsHi));
    MSG_PRINT(("InGoodOctetsLo  %08i   \n", statsCounter->InGoodOctetsLo));
    MSG_PRINT(("InBadOctets     %08i    ", statsCounter->InBadOctets));
    MSG_PRINT(("OutDiscards     %08i   \n", statsCounter->OutDiscards));
    MSG_PRINT(("InGoodFrames    %08i    ", statsCounter->InGoodFrames));
    MSG_PRINT(("InBadFrames     %08i   \n", statsCounter->InBadFrames));
    MSG_PRINT(("InBroadcasts    %08i    ", statsCounter->InBroadcasts));
    MSG_PRINT(("InMulticasts    %08i   \n", statsCounter->InMulticasts));
    MSG_PRINT(("64Octets        %08i    ", statsCounter->Octets64));
    MSG_PRINT(("127Octets       %08i   \n", statsCounter->Octets127));
    MSG_PRINT(("255Octets       %08i    ", statsCounter->Octets255));
    MSG_PRINT(("511Octets       %08i   \n", statsCounter->Octets511));
    MSG_PRINT(("1023Octets      %08i    ", statsCounter->Octets1023));
    MSG_PRINT(("MaxOctets       %08i   \n", statsCounter->OctetsMax));
    MSG_PRINT(("OutOctetsHi     %08i    ", statsCounter->OutOctetsHi));
    MSG_PRINT(("OutOctetsLo     %08i   \n", statsCounter->OutOctetsLo));
    MSG_PRINT(("OutFrames       %08i    ", statsCounter->OutFrames));
    MSG_PRINT(("Excessive       %08i   \n", statsCounter->Excessive));
    MSG_PRINT(("OutMulticasts   %08i    ", statsCounter->OutMulticasts));
    MSG_PRINT(("OutBroadcasts   %08i    ", statsCounter->OutBroadcasts));
    MSG_PRINT(("InBadMACCtrl    %08i    ", statsCounter->InBadMACCtrl));
    MSG_PRINT(("OutPause        %08i   \n", statsCounter->OutPause));
    MSG_PRINT(("InPause         %08i    ", statsCounter->InPause));
    MSG_PRINT(("InDiscards      %08i   \n", statsCounter->InDiscards));
    MSG_PRINT(("Undersize       %08i    ", statsCounter->Undersize));
    MSG_PRINT(("Fragments       %08i   \n", statsCounter->Fragments));
    MSG_PRINT(("Oversize        %08i    ", statsCounter->Oversize));
    MSG_PRINT(("Jabber          %08i   \n", statsCounter->Jabber));
    MSG_PRINT(("MACRcvErr       %08i    ", statsCounter->MACRcvErr));
    MSG_PRINT(("InFCSErr        %08i   \n", statsCounter->InFCSErr));
    MSG_PRINT(("Collisions      %08i    ", statsCounter->Collisions));
    MSG_PRINT(("Late            %08i   \n", statsCounter->Late));
}

/*
 * This sample is for 88E6183
*/
GT_STATUS sampleGetRMONCounter2(GT_QD_DEV *dev)
{
    GT_STATUS status;
    GT_LPORT port;
    GT_STATS_COUNTER_SET2 statsCounterSet;

    for(port=0; port<dev->numOfPorts; port++)
    {
        MSG_PRINT(("Port %i :\n",port));

        if((status = gstatsGetPortAllCounters2(dev,port,&statsCounterSet)) != GT_OK)
        {
            MSG_PRINT(("gstatsGetPortAllCounters2 returned fail (%#x).\n",status));
            return status;
        }

        sampleDisplayCounter2(&statsCounterSet);

    }

    return GT_OK;
}



/*
 * This sample is for 88E6093, 88E6095, 88E6185, and 88E6065
*/
void sampleDisplayCounter3(GT_STATS_COUNTER_SET3 *statsCounter)
{
    MSG_PRINT(("InGoodOctetsLo  %08i    ", statsCounter->InGoodOctetsLo));
    MSG_PRINT(("InGoodOctetsHi  %08i   \n", statsCounter->InGoodOctetsHi));
    MSG_PRINT(("InBadOctets     %08i    ", statsCounter->InBadOctets));
    MSG_PRINT(("OutFCSErr       %08i   \n", statsCounter->OutFCSErr));
    MSG_PRINT(("InUnicasts      %08i    ", statsCounter->InUnicasts));
    MSG_PRINT(("Deferred        %08i   \n", statsCounter->Deferred));
    MSG_PRINT(("InBroadcasts    %08i    ", statsCounter->InBroadcasts));
    MSG_PRINT(("InMulticasts    %08i   \n", statsCounter->InMulticasts));
    MSG_PRINT(("64Octets        %08i    ", statsCounter->Octets64));
    MSG_PRINT(("127Octets       %08i   \n", statsCounter->Octets127));
    MSG_PRINT(("255Octets       %08i    ", statsCounter->Octets255));
    MSG_PRINT(("511Octets       %08i   \n", statsCounter->Octets511));
    MSG_PRINT(("1023Octets      %08i    ", statsCounter->Octets1023));
    MSG_PRINT(("MaxOctets       %08i   \n", statsCounter->OctetsMax));
    MSG_PRINT(("OutOctetsLo     %08i    ", statsCounter->OutOctetsLo));
    MSG_PRINT(("OutOctetsHi     %08i   \n", statsCounter->OutOctetsHi));
    MSG_PRINT(("OutUnicasts     %08i    ", statsCounter->OutUnicasts));
    MSG_PRINT(("Excessive       %08i   \n", statsCounter->Excessive));
    MSG_PRINT(("OutMulticasts   %08i    ", statsCounter->OutMulticasts));
    MSG_PRINT(("OutBroadcasts   %08i   \n", statsCounter->OutBroadcasts));
    MSG_PRINT(("Single          %08i    ", statsCounter->Single));
    MSG_PRINT(("OutPause        %08i   \n", statsCounter->OutPause));
    MSG_PRINT(("InPause         %08i    ", statsCounter->InPause));
    MSG_PRINT(("Multiple        %08i   \n", statsCounter->Multiple));
    MSG_PRINT(("Undersize       %08i    ", statsCounter->Undersize));
    MSG_PRINT(("Fragments       %08i   \n", statsCounter->Fragments));
    MSG_PRINT(("Oversize        %08i    ", statsCounter->Oversize));
    MSG_PRINT(("Jabber          %08i   \n", statsCounter->Jabber));
    MSG_PRINT(("InMACRcvErr     %08i    ", statsCounter->InMACRcvErr));
    MSG_PRINT(("InFCSErr        %08i   \n", statsCounter->InFCSErr));
    MSG_PRINT(("Collisions      %08i    ", statsCounter->Collisions));
    MSG_PRINT(("Late            %08i   \n", statsCounter->Late));
}


/*
 * This sample is for 88E6093, 88E6095, 88E6185, and 88E6065
*/
GT_STATUS sampleGetRMONCounter3(GT_QD_DEV *dev)
{
    GT_STATUS status;
    GT_LPORT port;
    GT_STATS_COUNTER_SET3 statsCounterSet;

    for(port=0; port<dev->numOfPorts; port++)
    {
        MSG_PRINT(("Port %i :\n",port));

        if((status = gstatsGetPortAllCounters3(dev,port,&statsCounterSet)) != GT_OK)
        {
            MSG_PRINT(("gstatsGetPortAllCounters3 returned fail (%#x).\n",status));
            return status;
        }

        sampleDisplayCounter3(&statsCounterSet);

    }

    return GT_OK;
}
