/*
 * Note: this file originally auto-generated by mib2c using
 *       version : 15899 $ of $
 *
 * $Id:$
 */
/** @ingroup interface: Routines to interface to Net-SNMP
 *
 * \warning This code should not be modified, called directly,
 *          or used to interpret functionality. It is subject to
 *          change at any time.
 * 
 * @{
 */
/*
 * *********************************************************************
 * *********************************************************************
 * *********************************************************************
 * ***                                                               ***
 * ***  NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE  ***
 * ***                                                               ***
 * ***                                                               ***
 * ***       THIS FILE DOES NOT CONTAIN ANY USER EDITABLE CODE.      ***
 * ***                                                               ***
 * ***                                                               ***
 * ***       THE GENERATED CODE IS INTERNAL IMPLEMENTATION, AND      ***
 * ***                                                               ***
 * ***                                                               ***
 * ***    IS SUBJECT TO CHANGE WITHOUT WARNING IN FUTURE RELEASES.   ***
 * ***                                                               ***
 * ***                                                               ***
 * *********************************************************************
 * *********************************************************************
 * *********************************************************************
 */
#ifndef ETHERSTATSTABLE_INTERFACE_H
#define ETHERSTATSTABLE_INTERFACE_H

#ifdef __cplusplus
extern          "C" {
#endif


#include "etherStatsTable.h"


    /*
     ********************************************************************
     * Table declarations
     */

    /*
     * PUBLIC interface initialization routine 
     */
    void           
        _etherStatsTable_initialize_interface(etherStatsTable_registration
                                              * user_ctx, u_long flags);
    void           
        _etherStatsTable_shutdown_interface(etherStatsTable_registration *
                                            user_ctx);

    etherStatsTable_registration *etherStatsTable_registration_get(void);

    etherStatsTable_registration
        *etherStatsTable_registration_set(etherStatsTable_registration *
                                          newreg);

    netsnmp_container *etherStatsTable_container_get(void);
    int             etherStatsTable_container_size(void);

    u_int           etherStatsTable_dirty_get(void);
    void            etherStatsTable_dirty_set(u_int status);

    etherStatsTable_rowreq_ctx *etherStatsTable_allocate_rowreq_ctx(void
                                                                    *);
    void           
        etherStatsTable_release_rowreq_ctx(etherStatsTable_rowreq_ctx *
                                           rowreq_ctx);

    int             etherStatsTable_index_to_oid(netsnmp_index * oid_idx,
                                                 etherStatsTable_mib_index
                                                 * mib_idx);
    int             etherStatsTable_index_from_oid(netsnmp_index * oid_idx,
                                                   etherStatsTable_mib_index
                                                   * mib_idx);

    /*
     * access to certain internals. use with caution!
     */
    void            etherStatsTable_valid_columns_set(netsnmp_column_info
                                                      *vc);


#ifdef __cplusplus
}
#endif
#endif                          /* ETHERSTATSTABLE_INTERFACE_H */
/** @} */
