/*
 * Note: this file originally auto-generated by mib2c using
 *       version : 1.17 $ of : mfd-data-access.m2c,v $
 *
 * $Id$
 */
#ifndef IFTABLE_DATA_ACCESS_H
#define IFTABLE_DATA_ACCESS_H

#ifdef __cplusplus
extern          "C" {
#endif


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

    /*
     *********************************************************************
     * Table declarations
     */
/**********************************************************************
 **********************************************************************
 ***
 *** Table ifTable
 ***
 **********************************************************************
 **********************************************************************/
    /*
     * IF-MIB::ifTable is subid 2 of interfaces.
     * Its status is Current.
     * OID: .1.3.6.1.2.1.2.2, length: 8
     */


    int             ifTable_init_data(ifTable_registration * ifTable_reg);


    /*
     * TODO:180:o: Review ifTable cache timeout.
     * The number of seconds before the cache times out
     */
    /*
     * A 10 Mbps stream can wrap if*Octets in ~57 minutes.
     * At 100 Mbps it is ~5 minutes, and at 1 Gbps, ~34 seconds.
     */
#define IFTABLE_CACHE_TIMEOUT   15

#define IFTABLE_REMOVE_MISSING_AFTER     (5 * 60) /* seconds */

    void            ifTable_container_init(netsnmp_container
                                           **container_ptr_ptr,
                                           netsnmp_cache * cache);
    void            ifTable_container_shutdown(netsnmp_container
                                               *container_ptr);

    int             ifTable_container_load(netsnmp_container *container);
    void            ifTable_container_free(netsnmp_container *container);

    void            ifTable_container_shutdown(netsnmp_container
                                               *container_ptr);

    int             ifTable_container_load(netsnmp_container *container);
    void            ifTable_container_free(netsnmp_container *container);

    void            ifTable_container_shutdown(netsnmp_container
                                               *container_ptr);

    int             ifTable_container_load(netsnmp_container *container);
    void            ifTable_container_free(netsnmp_container *container);

    int             ifTable_cache_load(netsnmp_container *container);
    void            ifTable_cache_free(netsnmp_container *container);

    int             ifTable_row_prep(ifTable_rowreq_ctx * rowreq_ctx);





#ifdef __cplusplus
}
#endif
#endif                          /* IFTABLE_DATA_ACCESS_H */
