/*
 * Note: this file originally auto-generated by mib2c using
 *       version : 1.67 $ of : mfd-interface.m2c,v $
 *
 * $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 IPV4INTERFACETABLE_INTERFACE_H
#define IPV4INTERFACETABLE_INTERFACE_H

#ifdef __cplusplus
     extern          "C" {
#endif


#include "ipv4InterfaceTable.h"


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

         /*
          * PUBLIC interface initialization routine 
          */
         void
             _ipv4InterfaceTable_initialize_interface
             (ipv4InterfaceTable_registration * user_ctx, u_long flags);
         void
             _ipv4InterfaceTable_shutdown_interface
             (ipv4InterfaceTable_registration * user_ctx);

             ipv4InterfaceTable_registration
             * ipv4InterfaceTable_registration_get(void);

             ipv4InterfaceTable_registration
             * ipv4InterfaceTable_registration_set
             (ipv4InterfaceTable_registration * newreg);

         netsnmp_container *ipv4InterfaceTable_container_get(void);
         int             ipv4InterfaceTable_container_size(void);

         u_int           ipv4InterfaceTable_dirty_get(void);
         void            ipv4InterfaceTable_dirty_set(u_int status);

             ipv4InterfaceTable_rowreq_ctx
             * ipv4InterfaceTable_allocate_rowreq_ctx(void *);
         void
             ipv4InterfaceTable_release_rowreq_ctx
             (ipv4InterfaceTable_rowreq_ctx * rowreq_ctx);

         int             ipv4InterfaceTable_index_to_oid(netsnmp_index *
                                                         oid_idx,
                                                         ipv4InterfaceTable_mib_index
                                                         * mib_idx);
         int             ipv4InterfaceTable_index_from_oid(netsnmp_index *
                                                           oid_idx,
                                                           ipv4InterfaceTable_mib_index
                                                           * mib_idx);

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

         /*
          */
         void            ipv4InterfaceTable_lastChange_set(u_long uptime);


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

