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

#ifdef __cplusplus
extern          "C" {
#endif


    /*
     *********************************************************************
     * function declarations
     */

    /*
     *********************************************************************
     * Table declarations
     */
/**********************************************************************
 **********************************************************************
 ***
 *** Table etherStatsTable
 ***
 **********************************************************************
 **********************************************************************/
    /*
     * RMON-MIB::etherStatsTable is subid 1 of statistics.
     * Its status is Current.
     * OID: .1.3.6.1.2.1.16.1.1, length: 9
     */


    int             etherStatsTable_init_data(etherStatsTable_registration
                                              * etherStatsTable_reg);


    /*
     * TODO:180:o: Review etherStatsTable cache timeout.
     * The number of seconds before the cache times out
     */
#define ETHERSTATSTABLE_CACHE_TIMEOUT   60

    void            etherStatsTable_container_init(netsnmp_container **
                                                   container_ptr_ptr,
                                                   netsnmp_cache * cache);
    void            etherStatsTable_container_shutdown(netsnmp_container *
                                                       container_ptr);

    int             etherStatsTable_container_load(netsnmp_container *
                                                   container);
    void            etherStatsTable_container_free(netsnmp_container *
                                                   container);

    int             etherStatsTable_cache_load(netsnmp_container *
                                               container);
    void            etherStatsTable_cache_free(netsnmp_container *
                                               container);

#define MAX_LINE_SIZE 256

    int             etherStatsTable_row_prep(etherStatsTable_rowreq_ctx *
                                             rowreq_ctx);

    int            
        etherStatsTable_validate_index(etherStatsTable_registration *
                                       etherStatsTable_reg,
                                       etherStatsTable_rowreq_ctx *
                                       rowreq_ctx);
    int             etherStatsIndex_check_index(etherStatsTable_rowreq_ctx * rowreq_ctx);       /* internal */


#ifdef __cplusplus
}
#endif
#endif                          /* ETHERSTATSTABLE_DATA_ACCESS_H */
