/*
*********************************************************************************************************
*                                              uC/TCP-IP
*                                      The Embedded TCP/IP Suite
*
*                          (c) Copyright 2003-2007; Micrium, Inc.; Weston, FL
*
*               All rights reserved.  Protected by international copyright laws.
*
*               uC/TCP-IP is provided in source form for FREE evaluation, for educational
*               use or peaceful research.  If you plan on using uC/TCP-IP in a commercial
*               product you need to contact Micrium to properly license its use in your
*               product.  We provide ALL the source code for your convenience and to help
*               you experience uC/TCP-IP.  The fact that the source code is provided does
*               NOT mean that you can use it without paying a licensing fee.
*
*               Knowledge of the source code may NOT be used to develop a similar product.
*
*               Please help us continue to provide the Embedded community with the finest
*               software available.  Your honesty is greatly appreciated.
*********************************************************************************************************
*/

/*
*********************************************************************************************************
*
*                                     NETWORK STATISTICS MANAGEMENT
*
* Filename      : net_stat.h
* Version       : V1.89
* Programmer(s) : ITJ
*********************************************************************************************************
*/

/*
*********************************************************************************************************
*                                               EXTERNS
*********************************************************************************************************
*/

#ifdef   NET_STAT_MODULE
#define  NET_STAT_EXT
#else
#define  NET_STAT_EXT  extern
#endif


/*$PAGE*/
/*
*********************************************************************************************************
*                                               DEFINES
*********************************************************************************************************
*/

/*
*********************************************************************************************************
*                                NETWORK STATISTICS POOL TYPE DEFINES
*
* Note(s) : (1) NET_STAT_TYPE_??? #define values specifically chosen as ASCII representations of the network
*               statistics pool types.  Memory displays of statistics pools will display the statistics pool 
*               TYPE with the chosen ASCII name.
*********************************************************************************************************
*/

                                                                /* ---------------- NET STAT POOL TYPES --------------- */
#if     (CPU_CFG_ENDIAN_TYPE == CPU_ENDIAN_TYPE_BIG)
#define  NET_STAT_TYPE_NONE                       0x4E4F4E45    /* "NONE" in ASCII.                                     */
#define  NET_STAT_TYPE_POOL                       0x504F4F4C    /* "POOL" in ASCII.                                     */

#else

#if     (CPU_CFG_DATA_SIZE   == CPU_WORD_SIZE_32)
#define  NET_STAT_TYPE_NONE                       0x454E4F4E    /* "NONE" in ASCII.                                     */
#define  NET_STAT_TYPE_POOL                       0x4C4F4F50    /* "POOL" in ASCII.                                     */

#elif   (CPU_CFG_DATA_SIZE   == CPU_WORD_SIZE_16)
#define  NET_STAT_TYPE_NONE                       0x4F4E454E    /* "NONE" in ASCII.                                     */
#define  NET_STAT_TYPE_POOL                       0x4F504C4F    /* "POOL" in ASCII.                                     */

#else                                                           /* Dflt CPU_WORD_SIZE_08.                               */
#define  NET_STAT_TYPE_NONE                       0x4E4F4E45    /* "NONE" in ASCII.                                     */
#define  NET_STAT_TYPE_POOL                       0x504F4F4C    /* "POOL" in ASCII.                                     */

#endif
#endif


/*$PAGE*/
/*
*********************************************************************************************************
*                                             DATA TYPES
*********************************************************************************************************
*/

/*
*********************************************************************************************************
*                              NETWORK STATISTICS POOL QUANTITY DATA TYPE
*
* Note(s) : (1) Statistics pool quantity data type MUST be configured with an appropriate-sized network 
*               data type large enough to perform calculations on the following data types :
*
*               (a) NET_BUF_QTY
*               (b) NET_TMR_QTY
*               (c) NET_CONN_QTY
*               (d) NET_CONN_LIST_QTY
*               (e) NET_ARP_CACHE_QTY
*               (f) NET_ICMP_SRC_QUENCH_QTY
*               (g) NET_TCP_CONN_QTY
*               (h) NET_SOCK_QTY
*
*           (2) NET_STAT_POOL_NBR_MAX  SHOULD be globally #define'd AFTER 'NET_STAT_POOL_QTY' data type
*               declared.
*********************************************************************************************************
*/

typedef  CPU_INT16U  NET_STAT_POOL_QTY;                         /* Defines max qty of stat pool entries to support.     */

#define  NET_STAT_POOL_NBR_MAX          DEF_INT_16U_MAX_VAL     /* See Note #2.                                         */


/*$PAGE*/
/*
*********************************************************************************************************
*                                  NETWORK STATISTICS POOL DATA TYPE
*
* Note(s) : (1) Forced word-alignment at start of statistics pool NOT required since first data member
*               'Type' is declared as 'CPU_INT32U'.
*
*           (2) Pool statistic entries MUST ALWAYS be accessed in CRITICAL sections.
*
*           (3) (a) 'EntriesInit'/'EntriesTot' indicate the initial/current total number of entries in the 
*                   statistics pool.
*
*               (b) 'EntriesAvail'/'EntriesUsed' track the current number of entries available/used for the 
*                   statistics pool.
*
*               (c) 'EntriesLostCur'/'EntriesLostTot' track the current/total number of unrecoverable invalid/
*                   corrupted entries lost from the statistics pool.  Lost entries MUST be determined by the
*                   owner of the statistics pool.
*
*               (d) 'EntriesAllocatedCtr'/'EntriesDeallocatedCtr' tracks the current number of allocated/
*                   deallocated entries in the statistics pool.
*
*           (4) Assuming statistics pool are always accessed in CRITICAL sections, the following equations
*               for statistics pools are true at all times :
*
*                       EntriesInit  = EntriesTot   + EntriesLostTot
*
*                       EntriesTot   = EntriesAvail + EntriesUsed
*
*                       EntriesUsed  = EntriesAllocatedCtr - EntriesDeallocatedCtr - EntriesLostCur
*********************************************************************************************************
*/

                                                                /* ------------------- NET POOL STAT ------------------ */
typedef  struct  net_stat_pool {
    NET_TYPE            Type;                                   /* Type cfg'd @ init : NET_STAT_TYPE_POOL.              */

    NET_STAT_POOL_QTY   EntriesInit;                            /* Init  nbr entries      in   pool.                    */
    NET_STAT_POOL_QTY   EntriesTot;                             /* Tot   nbr entries      in   pool.                    */
    NET_STAT_POOL_QTY   EntriesAvail;                           /* Avail nbr entries      in   pool.                    */
    NET_STAT_POOL_QTY   EntriesUsed;                            /* Used  nbr entries      from pool.                    */
    NET_STAT_POOL_QTY   EntriesUsedMax;                         /* Max   nbr entries used from pool.                    */
    NET_STAT_POOL_QTY   EntriesLostCur;                         /* Cur   nbr entries lost from pool.                    */
    NET_STAT_POOL_QTY   EntriesLostTot;                         /* Tot   nbr entries lost from pool.                    */

    CPU_INT32U          EntriesAllocatedCtr;                    /* Total nbr entries successfully allocated.            */
    CPU_INT32U          EntriesDeallocatedCtr;                  /* Total nbr entries successfully deallocated.          */
} NET_STAT_POOL;


/*$PAGE*/
/*
*********************************************************************************************************
*                                          GLOBAL VARIABLES
*********************************************************************************************************
*/

#if (NET_CTR_CFG_ERR_EN         == DEF_ENABLED)                 /* ------------------- NET STAT ERRS ------------------ */
#if (NET_ERR_CFG_ARG_CHK_DBG_EN == DEF_ENABLED)
NET_STAT_EXT  NET_CTR  NetStat_ErrNullPtrCtr;                   /* Nbr null net stat ptr          accesses.             */
NET_STAT_EXT  NET_CTR  NetStat_ErrInvalidTypeCtr;               /* Nbr      net stat invalid type accesses.             */
#endif
#endif


/*
*********************************************************************************************************
*                                         FUNCTION PROTOTYPES
*********************************************************************************************************
*/

void  NetStat_Init            (void);


                                                                            /* --------- STAT POOL API FNCTS ---------- */
void  NetStat_PoolInit        (NET_STAT_POOL      *pstat_pool,
                               NET_STAT_POOL_QTY   nbr_avail,
                               NET_ERR            *perr);

void  NetStat_PoolClr         (NET_STAT_POOL      *pstat_pool,
                               NET_ERR            *perr);


void  NetStat_PoolReset       (NET_STAT_POOL      *pstat_pool,
                               NET_ERR            *perr);

void  NetStat_PoolResetUsedMax(NET_STAT_POOL      *pstat_pool,
                               NET_ERR            *perr);


void  NetStat_PoolEntryUsedInc(NET_STAT_POOL      *pstat_pool,
                               NET_ERR            *perr);

void  NetStat_PoolEntryUsedDec(NET_STAT_POOL      *pstat_pool,
                               NET_ERR            *perr);

void  NetStat_PoolEntryLostInc(NET_STAT_POOL      *pstat_pool,
                               NET_ERR            *perr);


/*$PAGE*/
/*
*********************************************************************************************************
*                                        CONFIGURATION ERRORS
*********************************************************************************************************
*/

