/*
 * Note: this file originally auto-generated by mib2c using
 *       version : 14170 $ of $
 *
 * $Id:$
 */
#ifndef IPIFSTATSTABLE_H
#define IPIFSTATSTABLE_H

#ifdef __cplusplus
extern          "C" {
#endif


/** @addtogroup misc misc: Miscellaneous routines
 *
 * @{
 */
#include <net-snmp/library/asn1.h>
#include <net-snmp/data_access/ipstats.h>
#include <net-snmp/data_access/systemstats.h>

    /*
     * other required module components 
     */
    /* *INDENT-OFF*  */
config_require(ip-mib/ipIfStatsTable/ipIfStatsTable_interface)
config_require(ip-mib/ipIfStatsTable/ipIfStatsTable_data_access)
config_require(ip-mib/ipIfStatsTable/ipIfStatsTable_data_get)
    /* *INDENT-ON*  */

    /*
     * OID and column number definitions for ipIfStatsTable 
     */
#include "ipIfStatsTable_oids.h"

    /*
     * enum definions 
     */
#include "ipIfStatsTable_enums.h"

    /*
     *********************************************************************
     * function declarations
     */
    void            init_ipIfStatsTable(void);
    void            shutdown_ipIfStatsTable(void);

    /*
     *********************************************************************
     * Table declarations
     */
/**********************************************************************
 **********************************************************************
 ***
 *** Table ipIfStatsTable
 ***
 **********************************************************************
 **********************************************************************/
    /*
     * IP-MIB::ipIfStatsTable is subid 3 of ipTrafficStats.
     * Its status is Current.
     * OID: .1.3.6.1.2.1.4.31.3, length: 9
     */
    /*
     *********************************************************************
     * When you register your mib, you get to provide a generic
     * pointer that will be passed back to you for most of the
     * functions calls.
     *
     * TODO:100:r: Review all context structures
     */
    /*
     * TODO:101:o: |-> Review ipIfStatsTable registration context.
     */
    typedef netsnmp_data_list ipIfStatsTable_registration;

/**********************************************************************/
    /*
     * TODO:110:r: |-> Review ipIfStatsTable data context structure.
     * This structure is used to represent the data for ipIfStatsTable.
     */
    typedef netsnmp_systemstats_entry ipIfStatsTable_data;


    /*
     * TODO:120:r: |-> Review ipIfStatsTable mib index.
     * This structure is used to represent the index for ipIfStatsTable.
     */
    typedef struct ipIfStatsTable_mib_index_s {

        /*
         * ipIfStatsIPVersion(1)/InetVersion/ASN_INTEGER/long(u_long)//l/a/w/E/r/d/h
         */
        u_long          ipIfStatsIPVersion;

        /*
         * ipIfStatsIfIndex(2)/InterfaceIndex/ASN_INTEGER/long(long)//l/a/w/e/R/d/H
         */
        long            ipIfStatsIfIndex;


    } ipIfStatsTable_mib_index;

    /*
     * TODO:121:r: |   |-> Review ipIfStatsTable max index length.
     * If you KNOW that your indexes will never exceed a certain
     * length, update this macro to that length.
     */
#define MAX_ipIfStatsTable_IDX_LEN     2


    /*
     *********************************************************************
     * TODO:130:o: |-> Review ipIfStatsTable Row request (rowreq) context.
     * When your functions are called, you will be passed a
     * ipIfStatsTable_rowreq_ctx pointer.
     */
    typedef struct ipIfStatsTable_rowreq_ctx_s {

    /** this must be first for container compare to work */
        netsnmp_index   oid_idx;
        oid             oid_tmp[MAX_ipIfStatsTable_IDX_LEN];

        ipIfStatsTable_mib_index tbl_idx;

        ipIfStatsTable_data *data;

        /*
         * flags per row. Currently, the first (lower) 8 bits are reserved
         * for the user. See mfd.h for other flags.
         */
        u_int           rowreq_flags;

        /*
         * TODO:131:o: |   |-> Add useful data to ipIfStatsTable rowreq context.
         */
        char            known_missing;
        uint32_t        ipIfStatsDiscontinuityTime;
        uint32_t        ipIfStatsRefreshRate;

        /*
         * storage for future expansion
         */
        netsnmp_data_list *ipIfStatsTable_data_list;

    } ipIfStatsTable_rowreq_ctx;

    typedef struct ipIfStatsTable_ref_rowreq_ctx_s {
        ipIfStatsTable_rowreq_ctx *rowreq_ctx;
    } ipIfStatsTable_ref_rowreq_ctx;

    /*
     *********************************************************************
     * function prototypes
     */
    int             ipIfStatsTable_pre_request(ipIfStatsTable_registration
                                               * user_context);
    int             ipIfStatsTable_post_request(ipIfStatsTable_registration
                                                * user_context, int rc);

    int            
        ipIfStatsTable_rowreq_ctx_init(ipIfStatsTable_rowreq_ctx *
                                       rowreq_ctx, void *user_init_ctx);
    void           
        ipIfStatsTable_rowreq_ctx_cleanup(ipIfStatsTable_rowreq_ctx *
                                          rowreq_ctx);

    ipIfStatsTable_data *ipIfStatsTable_allocate_data(void);
    void            ipIfStatsTable_release_data(ipIfStatsTable_data *
                                                data);


    ipIfStatsTable_rowreq_ctx
        *ipIfStatsTable_row_find_by_mib_index(ipIfStatsTable_mib_index *
                                              mib_idx);

    extern const oid      ipIfStatsTable_oid[];
    extern const int      ipIfStatsTable_oid_size;


#include "ipIfStatsTable_interface.h"
#include "ipIfStatsTable_data_access.h"
#include "ipIfStatsTable_data_get.h"

    /*
     * DUMMY markers, ignore
     *
     * TODO:099:x: *************************************************************
     * TODO:199:x: *************************************************************
     * TODO:299:x: *************************************************************
     * TODO:399:x: *************************************************************
     * TODO:499:x: *************************************************************
     */

#ifdef __cplusplus
}
#endif
#endif                          /* IPIFSTATSTABLE_H */
/** @} */
