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

#ifdef __cplusplus
extern          "C" {
#endif


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

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


    int             ipIfStatsTable_init_data(ipIfStatsTable_registration *
                                             ipIfStatsTable_reg);


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

    void            ipIfStatsTable_container_init(netsnmp_container **
                                                  container_ptr_ptr,
                                                  netsnmp_cache * cache);
    void            ipIfStatsTable_container_shutdown(netsnmp_container *
                                                      container_ptr);

    int             ipIfStatsTable_container_load(netsnmp_container *
                                                  container);
    void            ipIfStatsTable_container_free(netsnmp_container *
                                                  container);

    int             ipIfStatsTable_cache_load(netsnmp_container *
                                              container);
    void            ipIfStatsTable_cache_free(netsnmp_container *
                                              container);

    int             ipIfStatsTable_row_prep(ipIfStatsTable_rowreq_ctx *
                                            rowreq_ctx);

#ifdef __cplusplus
}
#endif
#endif                          /* IPIFSTATSTABLE_DATA_ACCESS_H */
