/*
 * 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 IPCIDRROUTETABLE_INTERFACE_H
#define IPCIDRROUTETABLE_INTERFACE_H

#ifdef __cplusplus
extern          "C" {
#endif


#include "ipCidrRouteTable.h"


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

    /*
     * PUBLIC interface initialization routine 
     */
    void
        _ipCidrRouteTable_initialize_interface
        (ipCidrRouteTable_registration * user_ctx, u_long flags);
    void
        _ipCidrRouteTable_shutdown_interface(ipCidrRouteTable_registration
                                             * user_ctx);
    ipCidrRouteTable_registration *ipCidrRouteTable_registration_get(void);

    ipCidrRouteTable_registration
        * ipCidrRouteTable_registration_set(ipCidrRouteTable_registration *
                                            newreg);

    netsnmp_container *ipCidrRouteTable_container_get(void);
    int             ipCidrRouteTable_container_size(void);

    u_int           ipCidrRouteTable_dirty_get(void);
    void            ipCidrRouteTable_dirty_set(u_int status);

    ipCidrRouteTable_rowreq_ctx
        * ipCidrRouteTable_allocate_rowreq_ctx(ipCidrRouteTable_data *,
                                               void *);
    void
        ipCidrRouteTable_release_rowreq_ctx(ipCidrRouteTable_rowreq_ctx *
                                            rowreq_ctx);

    int             ipCidrRouteTable_index_to_oid(netsnmp_index * oid_idx,
                                                  ipCidrRouteTable_mib_index
                                                  * mib_idx);
    int             ipCidrRouteTable_index_from_oid(netsnmp_index *
                                                    oid_idx,
                                                    ipCidrRouteTable_mib_index
                                                    * mib_idx);

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


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

