/*
 * Note: this file originally auto-generated by mib2c using
 *       version : 1.48 $ of : mfd-top.m2c,v $
 *
 * $Id$
 */
#ifndef IFXTABLE_H
#define IFXTABLE_H

#ifdef __cplusplus
extern          "C" {
#endif


/** @addtogroup misc misc: Miscellaneous routines
 *
 * @{
 */
#include <net-snmp/library/asn1.h>
#include <net-snmp/data_access/interface.h>

#include "if-mib/ifTable/ifTable.h"

    /*
     * other required module components 
     */
    /* *INDENT-OFF*  */
config_require(if-mib/ifTable/ifTable)
config_require(if-mib/ifXTable/ifXTable_interface)
config_require(if-mib/ifXTable/ifXTable_data_access)
    /* *INDENT-ON*  */

    /*
     * OID, column number and enum definions for ifXTable 
     */
#include "ifXTable_constants.h"

    /*
     *********************************************************************
     * function declarations
     */
    void            init_ifXTable(void);
    void            initialize_table_ifXTable(void);
    void            shutdown_ifXTable(void);

    /*
     *********************************************************************
     * Table declarations
     */
/**********************************************************************
 **********************************************************************
 ***
 *** Table ifXTable
 ***
 **********************************************************************
 **********************************************************************/
    /*
     * IF-MIB::ifXTable is subid 1 of ifMIBObjects.
     * Its status is Current.
     * OID: .1.3.6.1.2.1.31.1.1, length: 9
     *
     * we share data structures (data too, in fact) with ifTable
     */

    typedef ifTable_registration ifXTable_registration;
    typedef ifTable_data ifXTable_data;
    typedef ifTable_undo_data ifXTable_undo_data;
    typedef ifTable_mib_index ifXTable_mib_index;
    typedef ifTable_rowreq_ctx ifXTable_rowreq_ctx;
    typedef ifTable_ref_rowreq_ctx ifXTable_ref_rowreq_ctx;

#define ifXTable_data_list           ifTable_data_list
#define ifXTable_reg                 ifTable_reg

    /*
     *********************************************************************
     * function prototypes
     */
    int             ifXTable_pre_request(ifXTable_registration *
                                         user_context);
    int             ifXTable_post_request(ifXTable_registration *
                                          user_context, int rc);

    int             ifXTable_rowreq_ctx_init(ifXTable_rowreq_ctx *
                                             rowreq_ctx,
                                             void *user_init_ctx);
    void            ifXTable_rowreq_ctx_cleanup(ifXTable_rowreq_ctx *
                                                rowreq_ctx);

    int             ifXTable_check_dependencies(ifXTable_rowreq_ctx *
                                                rowreq_ctx);
    int             ifXTable_commit(ifXTable_rowreq_ctx * rowreq_ctx);

    ifXTable_rowreq_ctx *ifXTable_row_find_by_mib_index(ifXTable_mib_index
                                                        * mib_idx);

    extern const oid      ifXTable_oid[];
    extern const int      ifXTable_oid_size;


#include "ifXTable_interface.h"
#include "ifXTable_data_access.h"
    /*
     *********************************************************************
     * GET function declarations
     */

    /*
     *********************************************************************
     * GET Table declarations
     */
/**********************************************************************
 **********************************************************************
 ***
 *** Table ifXTable
 ***
 **********************************************************************
 **********************************************************************/
    /*
     * IF-MIB::ifXTable is subid 1 of ifMIBObjects.
     * Its status is Current.
     * OID: .1.3.6.1.2.1.31.1.1, length: 9
     */
    /*
     * indexes
     */

    int             ifName_get(ifXTable_rowreq_ctx * rowreq_ctx,
                               char **ifName_val_ptr_ptr,
                               size_t * ifName_val_ptr_len_ptr);
    int             ifInMulticastPkts_get(ifXTable_rowreq_ctx * rowreq_ctx,
                                          u_long *
                                          ifInMulticastPkts_val_ptr);
    int             ifInBroadcastPkts_get(ifXTable_rowreq_ctx * rowreq_ctx,
                                          u_long *
                                          ifInBroadcastPkts_val_ptr);
    int             ifOutMulticastPkts_get(ifXTable_rowreq_ctx *
                                           rowreq_ctx,
                                           u_long *
                                           ifOutMulticastPkts_val_ptr);
    int             ifOutBroadcastPkts_get(ifXTable_rowreq_ctx *
                                           rowreq_ctx,
                                           u_long *
                                           ifOutBroadcastPkts_val_ptr);
    int             ifHCInOctets_get(ifXTable_rowreq_ctx * rowreq_ctx,
                                     U64 * ifHCInOctets_val_ptr);
    int             ifHCInUcastPkts_get(ifXTable_rowreq_ctx * rowreq_ctx,
                                        U64 * ifHCInUcastPkts_val_ptr);
    int             ifHCInMulticastPkts_get(ifXTable_rowreq_ctx *
                                            rowreq_ctx,
                                            U64 *
                                            ifHCInMulticastPkts_val_ptr);
    int             ifHCInBroadcastPkts_get(ifXTable_rowreq_ctx *
                                            rowreq_ctx,
                                            U64 *
                                            ifHCInBroadcastPkts_val_ptr);
    int             ifHCOutOctets_get(ifXTable_rowreq_ctx * rowreq_ctx,
                                      U64 * ifHCOutOctets_val_ptr);
    int             ifHCOutUcastPkts_get(ifXTable_rowreq_ctx * rowreq_ctx,
                                         U64 * ifHCOutUcastPkts_val_ptr);
    int             ifHCOutMulticastPkts_get(ifXTable_rowreq_ctx *
                                             rowreq_ctx,
                                             U64 *
                                             ifHCOutMulticastPkts_val_ptr);
    int             ifHCOutBroadcastPkts_get(ifXTable_rowreq_ctx *
                                             rowreq_ctx,
                                             U64 *
                                             ifHCOutBroadcastPkts_val_ptr);
    int             ifLinkUpDownTrapEnable_get(ifXTable_rowreq_ctx *
                                               rowreq_ctx,
                                               u_long *
                                               ifLinkUpDownTrapEnable_val_ptr);
    int             ifHighSpeed_get(ifXTable_rowreq_ctx * rowreq_ctx,
                                    u_long * ifHighSpeed_val_ptr);
    int             ifPromiscuousMode_get(ifXTable_rowreq_ctx * rowreq_ctx,
                                          u_long *
                                          ifPromiscuousMode_val_ptr);
    int             ifConnectorPresent_get(ifXTable_rowreq_ctx *
                                           rowreq_ctx,
                                           u_long *
                                           ifConnectorPresent_val_ptr);
    int             ifAlias_get(ifXTable_rowreq_ctx * rowreq_ctx,
                                char **ifAlias_val_ptr_ptr,
                                size_t * ifAlias_val_ptr_len_ptr);
    int             ifCounterDiscontinuityTime_get(ifXTable_rowreq_ctx *
                                                   rowreq_ctx,
                                                   u_long *
                                                   ifCounterDiscontinuityTime_val_ptr);


    int             ifXTable_indexes_set_tbl_idx(ifXTable_mib_index *
                                                 tbl_idx,
                                                 long ifIndex_val);
    int             ifXTable_indexes_set(ifXTable_rowreq_ctx * rowreq_ctx,
                                         long ifIndex_val);



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

    /*
     *********************************************************************
     * SET Table declarations
     */
/**********************************************************************
 **********************************************************************
 ***
 *** Table ifXTable
 ***
 **********************************************************************
 **********************************************************************/
    /*
     * IF-MIB::ifXTable is subid 1 of ifMIBObjects.
     * Its status is Current.
     * OID: .1.3.6.1.2.1.31.1.1, length: 9
     */

#ifndef NETSNMP_NO_WRITE_SUPPORT
    int             ifXTable_undo_setup(ifXTable_rowreq_ctx * rowreq_ctx);
    int             ifXTable_undo_cleanup(ifXTable_rowreq_ctx *
                                          rowreq_ctx);
    int             ifXTable_undo(ifXTable_rowreq_ctx * rowreq_ctx);
    int             ifXTable_commit(ifXTable_rowreq_ctx * rowreq_ctx);
    int             ifXTable_undo_commit(ifXTable_rowreq_ctx * rowreq_ctx);


    int             ifName_check_value(ifXTable_rowreq_ctx * rowreq_ctx,
                                       char *ifName_val_ptr,
                                       size_t ifName_val_ptr_len);
    int             ifName_undo_setup(ifXTable_rowreq_ctx * rowreq_ctx);
    int             ifName_set(ifXTable_rowreq_ctx * rowreq_ctx,
                               char *ifName_val_ptr,
                               size_t ifName_val_ptr_len);
    int             ifName_undo(ifXTable_rowreq_ctx * rowreq_ctx);

    int             ifInMulticastPkts_check_value(ifXTable_rowreq_ctx *
                                                  rowreq_ctx,
                                                  u_long
                                                  ifInMulticastPkts_val);
    int             ifInMulticastPkts_undo_setup(ifXTable_rowreq_ctx *
                                                 rowreq_ctx);
    int             ifInMulticastPkts_set(ifXTable_rowreq_ctx * rowreq_ctx,
                                          u_long ifInMulticastPkts_val);
    int             ifInMulticastPkts_undo(ifXTable_rowreq_ctx *
                                           rowreq_ctx);

    int             ifInBroadcastPkts_check_value(ifXTable_rowreq_ctx *
                                                  rowreq_ctx,
                                                  u_long
                                                  ifInBroadcastPkts_val);
    int             ifInBroadcastPkts_undo_setup(ifXTable_rowreq_ctx *
                                                 rowreq_ctx);
    int             ifInBroadcastPkts_set(ifXTable_rowreq_ctx * rowreq_ctx,
                                          u_long ifInBroadcastPkts_val);
    int             ifInBroadcastPkts_undo(ifXTable_rowreq_ctx *
                                           rowreq_ctx);

    int             ifOutMulticastPkts_check_value(ifXTable_rowreq_ctx *
                                                   rowreq_ctx,
                                                   u_long
                                                   ifOutMulticastPkts_val);
    int             ifOutMulticastPkts_undo_setup(ifXTable_rowreq_ctx *
                                                  rowreq_ctx);
    int             ifOutMulticastPkts_set(ifXTable_rowreq_ctx *
                                           rowreq_ctx,
                                           u_long ifOutMulticastPkts_val);
    int             ifOutMulticastPkts_undo(ifXTable_rowreq_ctx *
                                            rowreq_ctx);

    int             ifOutBroadcastPkts_check_value(ifXTable_rowreq_ctx *
                                                   rowreq_ctx,
                                                   u_long
                                                   ifOutBroadcastPkts_val);
    int             ifOutBroadcastPkts_undo_setup(ifXTable_rowreq_ctx *
                                                  rowreq_ctx);
    int             ifOutBroadcastPkts_set(ifXTable_rowreq_ctx *
                                           rowreq_ctx,
                                           u_long ifOutBroadcastPkts_val);
    int             ifOutBroadcastPkts_undo(ifXTable_rowreq_ctx *
                                            rowreq_ctx);

    int             ifHCInOctets_check_value(ifXTable_rowreq_ctx *
                                             rowreq_ctx,
                                             U64 ifHCInOctets_val);
    int             ifHCInOctets_undo_setup(ifXTable_rowreq_ctx *
                                            rowreq_ctx);
    int             ifHCInOctets_set(ifXTable_rowreq_ctx * rowreq_ctx,
                                     U64 ifHCInOctets_val);
    int             ifHCInOctets_undo(ifXTable_rowreq_ctx * rowreq_ctx);

    int             ifHCInUcastPkts_check_value(ifXTable_rowreq_ctx *
                                                rowreq_ctx,
                                                U64 ifHCInUcastPkts_val);
    int             ifHCInUcastPkts_undo_setup(ifXTable_rowreq_ctx *
                                               rowreq_ctx);
    int             ifHCInUcastPkts_set(ifXTable_rowreq_ctx * rowreq_ctx,
                                        U64 ifHCInUcastPkts_val);
    int             ifHCInUcastPkts_undo(ifXTable_rowreq_ctx * rowreq_ctx);

    int             ifHCInMulticastPkts_check_value(ifXTable_rowreq_ctx *
                                                    rowreq_ctx,
                                                    U64
                                                    ifHCInMulticastPkts_val);
    int             ifHCInMulticastPkts_undo_setup(ifXTable_rowreq_ctx *
                                                   rowreq_ctx);
    int             ifHCInMulticastPkts_set(ifXTable_rowreq_ctx *
                                            rowreq_ctx,
                                            U64 ifHCInMulticastPkts_val);
    int             ifHCInMulticastPkts_undo(ifXTable_rowreq_ctx *
                                             rowreq_ctx);

    int             ifHCInBroadcastPkts_check_value(ifXTable_rowreq_ctx *
                                                    rowreq_ctx,
                                                    U64
                                                    ifHCInBroadcastPkts_val);
    int             ifHCInBroadcastPkts_undo_setup(ifXTable_rowreq_ctx *
                                                   rowreq_ctx);
    int             ifHCInBroadcastPkts_set(ifXTable_rowreq_ctx *
                                            rowreq_ctx,
                                            U64 ifHCInBroadcastPkts_val);
    int             ifHCInBroadcastPkts_undo(ifXTable_rowreq_ctx *
                                             rowreq_ctx);

    int             ifHCOutOctets_check_value(ifXTable_rowreq_ctx *
                                              rowreq_ctx,
                                              U64 ifHCOutOctets_val);
    int             ifHCOutOctets_undo_setup(ifXTable_rowreq_ctx *
                                             rowreq_ctx);
    int             ifHCOutOctets_set(ifXTable_rowreq_ctx * rowreq_ctx,
                                      U64 ifHCOutOctets_val);
    int             ifHCOutOctets_undo(ifXTable_rowreq_ctx * rowreq_ctx);

    int             ifHCOutUcastPkts_check_value(ifXTable_rowreq_ctx *
                                                 rowreq_ctx,
                                                 U64 ifHCOutUcastPkts_val);
    int             ifHCOutUcastPkts_undo_setup(ifXTable_rowreq_ctx *
                                                rowreq_ctx);
    int             ifHCOutUcastPkts_set(ifXTable_rowreq_ctx * rowreq_ctx,
                                         U64 ifHCOutUcastPkts_val);
    int             ifHCOutUcastPkts_undo(ifXTable_rowreq_ctx *
                                          rowreq_ctx);

    int             ifHCOutMulticastPkts_check_value(ifXTable_rowreq_ctx *
                                                     rowreq_ctx,
                                                     U64
                                                     ifHCOutMulticastPkts_val);
    int             ifHCOutMulticastPkts_undo_setup(ifXTable_rowreq_ctx *
                                                    rowreq_ctx);
    int             ifHCOutMulticastPkts_set(ifXTable_rowreq_ctx *
                                             rowreq_ctx,
                                             U64 ifHCOutMulticastPkts_val);
    int             ifHCOutMulticastPkts_undo(ifXTable_rowreq_ctx *
                                              rowreq_ctx);

    int             ifHCOutBroadcastPkts_check_value(ifXTable_rowreq_ctx *
                                                     rowreq_ctx,
                                                     U64
                                                     ifHCOutBroadcastPkts_val);
    int             ifHCOutBroadcastPkts_undo_setup(ifXTable_rowreq_ctx *
                                                    rowreq_ctx);
    int             ifHCOutBroadcastPkts_set(ifXTable_rowreq_ctx *
                                             rowreq_ctx,
                                             U64 ifHCOutBroadcastPkts_val);
    int             ifHCOutBroadcastPkts_undo(ifXTable_rowreq_ctx *
                                              rowreq_ctx);

    int             ifLinkUpDownTrapEnable_check_value(ifXTable_rowreq_ctx
                                                       * rowreq_ctx,
                                                       u_long
                                                       ifLinkUpDownTrapEnable_val);
    int             ifLinkUpDownTrapEnable_undo_setup(ifXTable_rowreq_ctx *
                                                      rowreq_ctx);
    int             ifLinkUpDownTrapEnable_set(ifXTable_rowreq_ctx *
                                               rowreq_ctx,
                                               u_long
                                               ifLinkUpDownTrapEnable_val);
    int             ifLinkUpDownTrapEnable_undo(ifXTable_rowreq_ctx *
                                                rowreq_ctx);

    int             ifHighSpeed_check_value(ifXTable_rowreq_ctx *
                                            rowreq_ctx,
                                            u_long ifHighSpeed_val);
    int             ifHighSpeed_undo_setup(ifXTable_rowreq_ctx *
                                           rowreq_ctx);
    int             ifHighSpeed_set(ifXTable_rowreq_ctx * rowreq_ctx,
                                    u_long ifHighSpeed_val);
    int             ifHighSpeed_undo(ifXTable_rowreq_ctx * rowreq_ctx);

    int             ifPromiscuousMode_check_value(ifXTable_rowreq_ctx *
                                                  rowreq_ctx,
                                                  u_long
                                                  ifPromiscuousMode_val);
    int             ifPromiscuousMode_undo_setup(ifXTable_rowreq_ctx *
                                                 rowreq_ctx);
    int             ifPromiscuousMode_set(ifXTable_rowreq_ctx * rowreq_ctx,
                                          u_long ifPromiscuousMode_val);
    int             ifPromiscuousMode_undo(ifXTable_rowreq_ctx *
                                           rowreq_ctx);

    int             ifConnectorPresent_check_value(ifXTable_rowreq_ctx *
                                                   rowreq_ctx,
                                                   u_long
                                                   ifConnectorPresent_val);
    int             ifConnectorPresent_undo_setup(ifXTable_rowreq_ctx *
                                                  rowreq_ctx);
    int             ifConnectorPresent_set(ifXTable_rowreq_ctx *
                                           rowreq_ctx,
                                           u_long ifConnectorPresent_val);
    int             ifConnectorPresent_undo(ifXTable_rowreq_ctx *
                                            rowreq_ctx);

    int             ifAlias_check_value(ifXTable_rowreq_ctx * rowreq_ctx,
                                        char *ifAlias_val_ptr,
                                        size_t ifAlias_val_ptr_len);
    int             ifAlias_undo_setup(ifXTable_rowreq_ctx * rowreq_ctx);
    int             ifAlias_set(ifXTable_rowreq_ctx * rowreq_ctx,
                                char *ifAlias_val_ptr,
                                size_t ifAlias_val_ptr_len);
    int             ifAlias_undo(ifXTable_rowreq_ctx * rowreq_ctx);

    int
        ifCounterDiscontinuityTime_check_value(ifXTable_rowreq_ctx *
                                               rowreq_ctx,
                                               u_long
                                               ifCounterDiscontinuityTime_val);
    int
        ifCounterDiscontinuityTime_undo_setup(ifXTable_rowreq_ctx *
                                              rowreq_ctx);
    int             ifCounterDiscontinuityTime_set(ifXTable_rowreq_ctx *
                                                   rowreq_ctx,
                                                   u_long
                                                   ifCounterDiscontinuityTime_val);
    int             ifCounterDiscontinuityTime_undo(ifXTable_rowreq_ctx *
                                                    rowreq_ctx);


    int             ifXTable_check_dependencies(ifXTable_rowreq_ctx * ctx);
#endif /* !NETSNMP_NO_WRITE_SUPPORT */

    /*
     * DUMMY markers, ignore
     *
     * TODO:099:x: *************************************************************
     * TODO:199:x: *************************************************************
     * TODO:299:x: *************************************************************
     * TODO:399:x: *************************************************************
     * TODO:499:x: *************************************************************
     */

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

