/*
 * Note: this file originally auto-generated by mib2c using
 *       version : 14170 $ of $
 *
 * $Id:ipv6ScopeZoneIndexTable_data_access.h 14170 2007-04-29 00:12:32Z varun_c$
 */
#ifndef IPV6SCOPEZONEINDEXTABLE_DATA_ACCESS_H
#define IPV6SCOPEZONEINDEXTABLE_DATA_ACCESS_H

#ifdef __cplusplus
extern          "C" {
#endif


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

    /*
     *********************************************************************
     * Table declarations
     */
/**********************************************************************
 **********************************************************************
 ***
 *** Table ipv6ScopeZoneIndexTable
 ***
 **********************************************************************
 **********************************************************************/
    /*
     * IP-MIB::ipv6ScopeZoneIndexTable is subid 36 of ip.
     * Its status is Current.
     * OID: .1.3.6.1.2.1.4.36, length: 8
     */


    int            
        ipv6ScopeZoneIndexTable_init_data
        (ipv6ScopeZoneIndexTable_registration *
         ipv6ScopeZoneIndexTable_reg);


    void           
        ipv6ScopeZoneIndexTable_container_init(netsnmp_container **
                                               container_ptr_ptr,
                                               netsnmp_cache *
                                               cache);
    void           
        ipv6ScopeZoneIndexTable_container_shutdown(netsnmp_container *
                                                   container_ptr);

    int            
        ipv6ScopeZoneIndexTable_container_load(netsnmp_container *
                                               container);
    void           
        ipv6ScopeZoneIndexTable_container_free(netsnmp_container *
                                               container);

#define MAX_LINE_SIZE 256
    int            
        ipv6ScopeZoneIndexTable_row_prep(ipv6ScopeZoneIndexTable_rowreq_ctx
                                         * rowreq_ctx);



#ifdef __cplusplus
}
#endif
#endif                          /* IPV6SCOPEZONEINDEXTABLE_DATA_ACCESS_H */
