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

#ifdef __cplusplus
extern          "C" {
#endif


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

    /*
     * other required module components 
     */
    /* *INDENT-OFF*  */
config_require(if-mib/data_access/interface)
config_require(if-mib/ifTable/ifTable_interface)
config_require(if-mib/ifTable/ifTable_data_access)
/*
 * conflicts with mibII/interfaces
 */
config_exclude(mibII/interfaces)
    /* *INDENT-ON*  */

    /*
     * OID, column number and enum definions for ifTable 
     */
#include "ifTable_constants.h"

    /*
     *********************************************************************
     * function declarations
     */
    void            init_ifTable(void);
    void            shutdown_ifTable(void);

    /*
     *********************************************************************
     * Table declarations
     */
/**********************************************************************
 **********************************************************************
 ***
 *** Table ifTable
 ***
 **********************************************************************
 **********************************************************************/
    /*
     * IF-MIB::ifTable is subid 2 of interfaces.
     * Its status is Current.
     * OID: .1.3.6.1.2.1.2.2, length: 8
     */
    /*
     *********************************************************************
     * When you register your mib, you get to provide a generic
     * pointer that will be passed back to you for most of the
     * functions calls.
     *
     * TODO:100:r: Review all context structures
     */
    /*
     * TODO:101:o: |-> Review ifTable registration context.
     */
    typedef netsnmp_data_list ifTable_registration;

/**********************************************************************/
    /*
     * TODO:110:r: |-> Review ifTable data context structure.
     * This structure is used to represent the data for ifTable.
     */
    /*
     * This structure contains storage for all the columns defined in the
     * ifTable.
     */
    typedef struct ifTable_data_s {

        /*
         * ifDescr(2)/DisplayString/ASN_OCTET_STR/char(char)//L/A/w/e/R/d/h
         */

        /*
         * ifType(3)/INTEGER/ASN_INTEGER/long(u_long)//l/A/w/E/r/d/h
         */

        /*
         * ifMtu(4)/INTEGER/ASN_INTEGER/long(long)//l/A/w/e/r/d/h
         */

        /*
         * ifSpeed(5)/GAUGE/ASN_GAUGE/u_long(u_long)//l/A/w/e/r/d/h
         */

        /*
         * ifPhysAddress(6)/PhysAddress/ASN_OCTET_STR/char(char)//L/A/w/e/r/d/h
         */

        /*
         * ifAdminStatus(7)/INTEGER/ASN_INTEGER/long(u_long)//l/A/W/E/r/d/h
         */

        /*
         * ifOperStatus(8)/INTEGER/ASN_INTEGER/long(u_long)//l/A/w/E/r/d/h
         */

        /*
         * ifLastChange(9)/TICKS/ASN_TIMETICKS/u_long(u_long)//l/A/w/e/r/d/h
         */

        /*
         * ifInOctets(10)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h
         */

        /*
         * ifInUcastPkts(11)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h
         */

        /*
         * ifInNUcastPkts(12)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h
         */

        /*
         * ifInDiscards(13)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h
         */

        /*
         * ifInErrors(14)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h
         */

        /*
         * ifInUnknownProtos(15)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h
         */

        /*
         * ifOutOctets(16)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h
         */

        /*
         * ifOutUcastPkts(17)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h
         */

        /*
         * ifOutNUcastPkts(18)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h
         */

        /*
         * ifOutDiscards(19)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h
         */

        /*
         * ifOutErrors(20)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h
         */

        /*
         * ifOutQLen(21)/GAUGE/ASN_GAUGE/u_long(u_long)//l/A/w/e/r/d/h
         */

        /*
         * ifSpecific(22)/OBJECTID/ASN_OBJECT_ID/oid(oid)//L/A/w/e/r/d/h
         */
#ifdef IFTABLE_HAS_IFSPECIFIC
        oid             ifSpecific[128];
        size_t          ifSpecific_len; /* # of oid elements, not bytes */
#endif

#ifdef USING_IF_MIB_IFXTABLE_IFXTABLE_MODULE
        /*
         * ifXTable stuff
         */
        /*
         * ifName(1)/DisplayString/ASN_OCTET_STR/char(char)//L/A/w/e/R/d/H
         */

        /*
         * ifInMulticastPkts(2)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h
         */

        /*
         * ifInBroadcastPkts(3)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h
         */

        /*
         * ifOutMulticastPkts(4)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h
         */

        /*
         * ifOutBroadcastPkts(5)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h
         */

        /*
         * ifHCInOctets(6)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h
         */

        /*
         * ifHCInUcastPkts(7)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h
         */

        /*
         * ifHCInMulticastPkts(8)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h
         */

        /*
         * ifHCInBroadcastPkts(9)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h
         */

        /*
         * ifHCOutOctets(10)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h
         */

        /*
         * ifHCOutUcastPkts(11)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h
         */

        /*
         * ifHCOutMulticastPkts(12)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h
         */

        /*
         * ifHCOutBroadcastPkts(13)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h
         */

        /*
         * ifLinkUpDownTrapEnable(14)/INTEGER/ASN_INTEGER/long(u_long)//l/A/W/E/r/d/h
         */
        u_long          ifLinkUpDownTrapEnable;

        /*
         * ifHighSpeed(15)/GAUGE/ASN_GAUGE/u_long(u_long)//l/A/w/e/r/d/h
         */

        /*
         * ifPromiscuousMode(16)/TruthValue/ASN_INTEGER/long(u_long)//l/A/W/E/r/d/h
         */

        /*
         * ifConnectorPresent(17)/TruthValue/ASN_INTEGER/long(u_long)//l/A/w/E/r/d/h
         */

        /*
         * ifAlias(18)/DisplayString/ASN_OCTET_STR/char(char)//L/A/W/e/R/d/H
         */
        char            ifAlias[64];
        size_t          ifAlias_len;    /* # of char elements, not bytes */

        /*
         * ifCounterDiscontinuityTime(19)/TimeStamp/ASN_TIMETICKS/u_long(u_long)//l/A/w/e/r/d/h
         */
        u_long          ifCounterDiscontinuityTime;
#endif                          /* USING_IF_MIB_IFXTABLE_IFXTABLE_MODULE */


        /*
         * some data kept externally 
         */
        netsnmp_interface_entry *ifentry;
    } ifTable_data;


    /*
     *********************************************************************
     * TODO:115:o: |-> Review ifTable undo context.
     * We're just going to use the same data structure for our
     * undo_context. If you want to do something more efficent,
     * define your typedef here.
     */
    typedef ifTable_data ifTable_undo_data;

    /*
     * TODO:120:r: |-> Review ifTable mib index.
     * This structure is used to represent the index for ifTable.
     */
    typedef struct ifTable_mib_index_s {

        /*
         * ifIndex(1)/InterfaceIndex/ASN_INTEGER/long(long)//l/A/w/e/R/d/H
         */
        long            ifIndex;


    } ifTable_mib_index;

    /*
     * TODO:121:r: |   |-> Review ifTable max index length.
     * If you KNOW that your indexes will never exceed a certain
     * length, update this macro to that length.
     */
#define MAX_ifTable_IDX_LEN     1


    /*
     *********************************************************************
     * TODO:130:o: |-> Review ifTable Row request (rowreq) context.
     * When your functions are called, you will be passed a
     * ifTable_rowreq_ctx pointer.
     */
    typedef struct ifTable_rowreq_ctx_s {

    /** this must be first for container compare to work */
        netsnmp_index   oid_idx;
        oid             oid_tmp[MAX_ifTable_IDX_LEN];

        ifTable_mib_index tbl_idx;

        ifTable_data    data;
        ifTable_undo_data *undo;
        unsigned int    column_set_flags;       /* flags for set columns */


        /*
         * flags per row. Currently, the first (lower) 8 bits are reserved
         * for the user. See mfd.h for other flags.
         */
        u_int           rowreq_flags;

        /*
         * TODO:131:o: |   |-> Add useful data to ifTable rowreq context.
         */
        char            known_missing;
	u_char          undo_ref_count;

        /*
         * storage for future expansion
         */
        netsnmp_data_list *ifTable_data_list;

    } ifTable_rowreq_ctx;

    typedef struct ifTable_ref_rowreq_ctx_s {
        ifTable_rowreq_ctx *rowreq_ctx;
    } ifTable_ref_rowreq_ctx;

    /*
     *********************************************************************
     * function prototypes
     */
    int             ifTable_pre_request(ifTable_registration *
                                        user_context);
    int             ifTable_post_request(ifTable_registration *
                                         user_context, int rc);

    int             ifTable_rowreq_ctx_init(ifTable_rowreq_ctx *
                                            rowreq_ctx,
                                            void *user_init_ctx);
    void            ifTable_rowreq_ctx_cleanup(ifTable_rowreq_ctx *
                                               rowreq_ctx);

    int             ifTable_check_dependencies(ifTable_rowreq_ctx *
                                               rowreq_ctx);
    int             ifTable_commit(ifTable_rowreq_ctx * rowreq_ctx);

    ifTable_rowreq_ctx *ifTable_row_find_by_mib_index(ifTable_mib_index *
                                                      mib_idx);

    extern const oid ifTable_oid[];
    extern const int ifTable_oid_size;


#include "ifTable_interface.h"
#include "ifTable_data_access.h"
    /*
     *********************************************************************
     * GET function declarations
     */

    /*
     *********************************************************************
     * GET Table declarations
     */
/**********************************************************************
 **********************************************************************
 ***
 *** Table ifTable
 ***
 **********************************************************************
 **********************************************************************/
    /*
     * IF-MIB::ifTable is subid 2 of interfaces.
     * Its status is Current.
     * OID: .1.3.6.1.2.1.2.2, length: 8
     */
    /*
     * indexes
     */

    int             ifDescr_get(ifTable_rowreq_ctx * rowreq_ctx,
                                char **ifDescr_val_ptr_ptr,
                                size_t * ifDescr_val_ptr_len_ptr);
    int             ifType_get(ifTable_rowreq_ctx * rowreq_ctx,
                               u_long * ifType_val_ptr);
    int             ifMtu_get(ifTable_rowreq_ctx * rowreq_ctx,
                              long *ifMtu_val_ptr);
    int             ifSpeed_get(ifTable_rowreq_ctx * rowreq_ctx,
                                u_long * ifSpeed_val_ptr);
    int             ifPhysAddress_get(ifTable_rowreq_ctx * rowreq_ctx,
                                      char **ifPhysAddress_val_ptr_ptr,
                                      size_t
                                      * ifPhysAddress_val_ptr_len_ptr);
    int             ifAdminStatus_get(ifTable_rowreq_ctx * rowreq_ctx,
                                      u_long * ifAdminStatus_val_ptr);
    int             ifOperStatus_get(ifTable_rowreq_ctx * rowreq_ctx,
                                     u_long * ifOperStatus_val_ptr);
    int             ifLastChange_get(ifTable_rowreq_ctx * rowreq_ctx,
                                     u_long * ifLastChange_val_ptr);
    int             ifInOctets_get(ifTable_rowreq_ctx * rowreq_ctx,
                                   u_long * ifInOctets_val_ptr);
    int             ifInUcastPkts_get(ifTable_rowreq_ctx * rowreq_ctx,
                                      u_long * ifInUcastPkts_val_ptr);
    int             ifInNUcastPkts_get(ifTable_rowreq_ctx * rowreq_ctx,
                                       u_long * ifInNUcastPkts_val_ptr);
    int             ifInDiscards_get(ifTable_rowreq_ctx * rowreq_ctx,
                                     u_long * ifInDiscards_val_ptr);
    int             ifInErrors_get(ifTable_rowreq_ctx * rowreq_ctx,
                                   u_long * ifInErrors_val_ptr);
    int             ifInUnknownProtos_get(ifTable_rowreq_ctx * rowreq_ctx,
                                          u_long *
                                          ifInUnknownProtos_val_ptr);
    int             ifOutOctets_get(ifTable_rowreq_ctx * rowreq_ctx,
                                    u_long * ifOutOctets_val_ptr);
    int             ifOutUcastPkts_get(ifTable_rowreq_ctx * rowreq_ctx,
                                       u_long * ifOutUcastPkts_val_ptr);
    int             ifOutNUcastPkts_get(ifTable_rowreq_ctx * rowreq_ctx,
                                        u_long * ifOutNUcastPkts_val_ptr);
    int             ifOutDiscards_get(ifTable_rowreq_ctx * rowreq_ctx,
                                      u_long * ifOutDiscards_val_ptr);
    int             ifOutErrors_get(ifTable_rowreq_ctx * rowreq_ctx,
                                    u_long * ifOutErrors_val_ptr);
    int             ifOutQLen_get(ifTable_rowreq_ctx * rowreq_ctx,
                                  u_long * ifOutQLen_val_ptr);
    int             ifSpecific_get(ifTable_rowreq_ctx * rowreq_ctx,
                                   oid ** ifSpecific_val_ptr_ptr,
                                   size_t * ifSpecific_val_ptr_len_ptr);


    int             ifTable_indexes_set_tbl_idx(ifTable_mib_index *
                                                tbl_idx, long ifIndex_val);
    int             ifTable_indexes_set(ifTable_rowreq_ctx * rowreq_ctx,
                                        long ifIndex_val);



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

    /*
     *********************************************************************
     * SET Table declarations
     */
/**********************************************************************
 **********************************************************************
 ***
 *** Table ifTable
 ***
 **********************************************************************
 **********************************************************************/
    /*
     * IF-MIB::ifTable is subid 2 of interfaces.
     * Its status is Current.
     * OID: .1.3.6.1.2.1.2.2, length: 8
     */


    int             ifTable_undo_setup(ifTable_rowreq_ctx * rowreq_ctx);
    int             ifTable_undo_cleanup(ifTable_rowreq_ctx * rowreq_ctx);
    int             ifTable_undo(ifTable_rowreq_ctx * rowreq_ctx);
    int             ifTable_commit(ifTable_rowreq_ctx * rowreq_ctx);
    int             ifTable_undo_commit(ifTable_rowreq_ctx * rowreq_ctx);


    int             ifDescr_check_value(ifTable_rowreq_ctx * rowreq_ctx,
                                        char *ifDescr_val_ptr,
                                        size_t ifDescr_val_ptr_len);
    int             ifDescr_undo_setup(ifTable_rowreq_ctx * rowreq_ctx);
    int             ifDescr_set(ifTable_rowreq_ctx * rowreq_ctx,
                                char *ifDescr_val_ptr,
                                size_t ifDescr_val_ptr_len);
    int             ifDescr_undo(ifTable_rowreq_ctx * rowreq_ctx);

    int             ifType_check_value(ifTable_rowreq_ctx * rowreq_ctx,
                                       u_long ifType_val);
    int             ifType_undo_setup(ifTable_rowreq_ctx * rowreq_ctx);
    int             ifType_set(ifTable_rowreq_ctx * rowreq_ctx,
                               u_long ifType_val);
    int             ifType_undo(ifTable_rowreq_ctx * rowreq_ctx);

    int             ifMtu_check_value(ifTable_rowreq_ctx * rowreq_ctx,
                                      long ifMtu_val);
    int             ifMtu_undo_setup(ifTable_rowreq_ctx * rowreq_ctx);
    int             ifMtu_set(ifTable_rowreq_ctx * rowreq_ctx,
                              long ifMtu_val);
    int             ifMtu_undo(ifTable_rowreq_ctx * rowreq_ctx);

    int             ifSpeed_check_value(ifTable_rowreq_ctx * rowreq_ctx,
                                        u_long ifSpeed_val);
    int             ifSpeed_undo_setup(ifTable_rowreq_ctx * rowreq_ctx);
    int             ifSpeed_set(ifTable_rowreq_ctx * rowreq_ctx,
                                u_long ifSpeed_val);
    int             ifSpeed_undo(ifTable_rowreq_ctx * rowreq_ctx);

    int             ifPhysAddress_check_value(ifTable_rowreq_ctx *
                                              rowreq_ctx,
                                              char *ifPhysAddress_val_ptr,
                                              size_t
                                              ifPhysAddress_val_ptr_len);
    int             ifPhysAddress_undo_setup(ifTable_rowreq_ctx *
                                             rowreq_ctx);
    int             ifPhysAddress_set(ifTable_rowreq_ctx * rowreq_ctx,
                                      char *ifPhysAddress_val_ptr,
                                      size_t ifPhysAddress_val_ptr_len);
    int             ifPhysAddress_undo(ifTable_rowreq_ctx * rowreq_ctx);

    int             ifAdminStatus_check_value(ifTable_rowreq_ctx *
                                              rowreq_ctx,
                                              u_long ifAdminStatus_val);
    int             ifAdminStatus_undo_setup(ifTable_rowreq_ctx *
                                             rowreq_ctx);
    int             ifAdminStatus_set(ifTable_rowreq_ctx * rowreq_ctx,
                                      u_long ifAdminStatus_val);
    int             ifAdminStatus_undo(ifTable_rowreq_ctx * rowreq_ctx);

    int             ifOperStatus_check_value(ifTable_rowreq_ctx *
                                             rowreq_ctx,
                                             u_long ifOperStatus_val);
    int             ifOperStatus_undo_setup(ifTable_rowreq_ctx *
                                            rowreq_ctx);
    int             ifOperStatus_set(ifTable_rowreq_ctx * rowreq_ctx,
                                     u_long ifOperStatus_val);
    int             ifOperStatus_undo(ifTable_rowreq_ctx * rowreq_ctx);

    int             ifLastChange_check_value(ifTable_rowreq_ctx *
                                             rowreq_ctx,
                                             u_long ifLastChange_val);
    int             ifLastChange_undo_setup(ifTable_rowreq_ctx *
                                            rowreq_ctx);
    int             ifLastChange_set(ifTable_rowreq_ctx * rowreq_ctx,
                                     u_long ifLastChange_val);
    int             ifLastChange_undo(ifTable_rowreq_ctx * rowreq_ctx);

    int             ifInOctets_check_value(ifTable_rowreq_ctx * rowreq_ctx,
                                           u_long ifInOctets_val);
    int             ifInOctets_undo_setup(ifTable_rowreq_ctx * rowreq_ctx);
    int             ifInOctets_set(ifTable_rowreq_ctx * rowreq_ctx,
                                   u_long ifInOctets_val);
    int             ifInOctets_undo(ifTable_rowreq_ctx * rowreq_ctx);

    int             ifInUcastPkts_check_value(ifTable_rowreq_ctx *
                                              rowreq_ctx,
                                              u_long ifInUcastPkts_val);
    int             ifInUcastPkts_undo_setup(ifTable_rowreq_ctx *
                                             rowreq_ctx);
    int             ifInUcastPkts_set(ifTable_rowreq_ctx * rowreq_ctx,
                                      u_long ifInUcastPkts_val);
    int             ifInUcastPkts_undo(ifTable_rowreq_ctx * rowreq_ctx);

    int             ifInNUcastPkts_check_value(ifTable_rowreq_ctx *
                                               rowreq_ctx,
                                               u_long ifInNUcastPkts_val);
    int             ifInNUcastPkts_undo_setup(ifTable_rowreq_ctx *
                                              rowreq_ctx);
    int             ifInNUcastPkts_set(ifTable_rowreq_ctx * rowreq_ctx,
                                       u_long ifInNUcastPkts_val);
    int             ifInNUcastPkts_undo(ifTable_rowreq_ctx * rowreq_ctx);

    int             ifInDiscards_check_value(ifTable_rowreq_ctx *
                                             rowreq_ctx,
                                             u_long ifInDiscards_val);
    int             ifInDiscards_undo_setup(ifTable_rowreq_ctx *
                                            rowreq_ctx);
    int             ifInDiscards_set(ifTable_rowreq_ctx * rowreq_ctx,
                                     u_long ifInDiscards_val);
    int             ifInDiscards_undo(ifTable_rowreq_ctx * rowreq_ctx);

    int             ifInErrors_check_value(ifTable_rowreq_ctx * rowreq_ctx,
                                           u_long ifInErrors_val);
    int             ifInErrors_undo_setup(ifTable_rowreq_ctx * rowreq_ctx);
    int             ifInErrors_set(ifTable_rowreq_ctx * rowreq_ctx,
                                   u_long ifInErrors_val);
    int             ifInErrors_undo(ifTable_rowreq_ctx * rowreq_ctx);

    int             ifInUnknownProtos_check_value(ifTable_rowreq_ctx *
                                                  rowreq_ctx,
                                                  u_long
                                                  ifInUnknownProtos_val);
    int             ifInUnknownProtos_undo_setup(ifTable_rowreq_ctx *
                                                 rowreq_ctx);
    int             ifInUnknownProtos_set(ifTable_rowreq_ctx * rowreq_ctx,
                                          u_long ifInUnknownProtos_val);
    int             ifInUnknownProtos_undo(ifTable_rowreq_ctx *
                                           rowreq_ctx);

    int             ifOutOctets_check_value(ifTable_rowreq_ctx *
                                            rowreq_ctx,
                                            u_long ifOutOctets_val);
    int             ifOutOctets_undo_setup(ifTable_rowreq_ctx *
                                           rowreq_ctx);
    int             ifOutOctets_set(ifTable_rowreq_ctx * rowreq_ctx,
                                    u_long ifOutOctets_val);
    int             ifOutOctets_undo(ifTable_rowreq_ctx * rowreq_ctx);

    int             ifOutUcastPkts_check_value(ifTable_rowreq_ctx *
                                               rowreq_ctx,
                                               u_long ifOutUcastPkts_val);
    int             ifOutUcastPkts_undo_setup(ifTable_rowreq_ctx *
                                              rowreq_ctx);
    int             ifOutUcastPkts_set(ifTable_rowreq_ctx * rowreq_ctx,
                                       u_long ifOutUcastPkts_val);
    int             ifOutUcastPkts_undo(ifTable_rowreq_ctx * rowreq_ctx);

    int             ifOutNUcastPkts_check_value(ifTable_rowreq_ctx *
                                                rowreq_ctx,
                                                u_long
                                                ifOutNUcastPkts_val);
    int             ifOutNUcastPkts_undo_setup(ifTable_rowreq_ctx *
                                               rowreq_ctx);
    int             ifOutNUcastPkts_set(ifTable_rowreq_ctx * rowreq_ctx,
                                        u_long ifOutNUcastPkts_val);
    int             ifOutNUcastPkts_undo(ifTable_rowreq_ctx * rowreq_ctx);

    int             ifOutDiscards_check_value(ifTable_rowreq_ctx *
                                              rowreq_ctx,
                                              u_long ifOutDiscards_val);
    int             ifOutDiscards_undo_setup(ifTable_rowreq_ctx *
                                             rowreq_ctx);
    int             ifOutDiscards_set(ifTable_rowreq_ctx * rowreq_ctx,
                                      u_long ifOutDiscards_val);
    int             ifOutDiscards_undo(ifTable_rowreq_ctx * rowreq_ctx);

    int             ifOutErrors_check_value(ifTable_rowreq_ctx *
                                            rowreq_ctx,
                                            u_long ifOutErrors_val);
    int             ifOutErrors_undo_setup(ifTable_rowreq_ctx *
                                           rowreq_ctx);
    int             ifOutErrors_set(ifTable_rowreq_ctx * rowreq_ctx,
                                    u_long ifOutErrors_val);
    int             ifOutErrors_undo(ifTable_rowreq_ctx * rowreq_ctx);

    int             ifOutQLen_check_value(ifTable_rowreq_ctx * rowreq_ctx,
                                          u_long ifOutQLen_val);
    int             ifOutQLen_undo_setup(ifTable_rowreq_ctx * rowreq_ctx);
    int             ifOutQLen_set(ifTable_rowreq_ctx * rowreq_ctx,
                                  u_long ifOutQLen_val);
    int             ifOutQLen_undo(ifTable_rowreq_ctx * rowreq_ctx);

    int             ifSpecific_check_value(ifTable_rowreq_ctx * rowreq_ctx,
                                           oid * ifSpecific_val_ptr,
                                           size_t ifSpecific_val_ptr_len);
    int             ifSpecific_undo_setup(ifTable_rowreq_ctx * rowreq_ctx);
    int             ifSpecific_set(ifTable_rowreq_ctx * rowreq_ctx,
                                   oid * ifSpecific_val_ptr,
                                   size_t ifSpecific_val_ptr_len);
    int             ifSpecific_undo(ifTable_rowreq_ctx * rowreq_ctx);


    int             ifTable_check_dependencies(ifTable_rowreq_ctx * ctx);


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

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

