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

#ifdef __cplusplus
extern          "C" {
#endif


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

    /*
     *********************************************************************
     * Table declarations
     */
/**********************************************************************
 **********************************************************************
 ***
 *** Table ipCidrRouteTable
 ***
 **********************************************************************
 **********************************************************************/
    /*
     * IP-FORWARD-MIB::ipCidrRouteTable is subid 4 of ipForward.
     * Its status is Deprecated.
     * OID: .1.3.6.1.2.1.4.24.4, length: 9
     */


    int
        ipCidrRouteTable_init_data(ipCidrRouteTable_registration *
                                   ipCidrRouteTable_reg);


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

    void            ipCidrRouteTable_container_init(netsnmp_container
                                                    **container_ptr_ptr,
                                                    netsnmp_cache * cache);
    void            ipCidrRouteTable_container_shutdown(netsnmp_container
                                                        *container_ptr);

    int             ipCidrRouteTable_container_load(netsnmp_container
                                                    *container);
    void            ipCidrRouteTable_container_free(netsnmp_container
                                                    *container);

    int             ipCidrRouteTable_cache_load(netsnmp_container
                                                *container);
    void            ipCidrRouteTable_cache_free(netsnmp_container
                                                *container);

    int             ipCidrRouteTable_row_prep(ipCidrRouteTable_rowreq_ctx *
                                              rowreq_ctx);

    int
        ipCidrRouteTable_validate_index(ipCidrRouteTable_registration *
                                        ipCidrRouteTable_reg,
                                        ipCidrRouteTable_rowreq_ctx *
                                        rowreq_ctx);
    int             ipCidrRouteDest_check_index(ipCidrRouteTable_rowreq_ctx * rowreq_ctx);      /* internal */
    int             ipCidrRouteMask_check_index(ipCidrRouteTable_rowreq_ctx * rowreq_ctx);      /* internal */
    int             ipCidrRouteTos_check_index(ipCidrRouteTable_rowreq_ctx * rowreq_ctx);       /* internal */
    int             ipCidrRouteNextHop_check_index(ipCidrRouteTable_rowreq_ctx * rowreq_ctx);   /* internal */


#ifdef __cplusplus
}
#endif
#endif                          /* IPCIDRROUTETABLE_DATA_ACCESS_H */
