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

#ifdef __cplusplus
extern          "C" {
#endif


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

    /*
     * other required module components 
     */
    /* *INDENT-OFF*  */
config_require(ip-mib/data_access/arp)
config_require(ip-mib/inetNetToMediaTable/inetNetToMediaTable_interface)
config_require(ip-mib/inetNetToMediaTable/inetNetToMediaTable_data_access)
    /* *INDENT-ON*  */

    /*
     * OID, column number and enum definions for inetNetToMediaTable 
     */
#include "inetNetToMediaTable_constants.h"

    /*
     *********************************************************************
     * function declarations
     */
    void            init_inetNetToMediaTable(void);
    void            shutdown_inetNetToMediaTable(void);

    /*
     *********************************************************************
     * Table declarations
     */
/**********************************************************************
 **********************************************************************
 ***
 *** Table inetNetToMediaTable
 ***
 **********************************************************************
 **********************************************************************/
    /*
     * IP-MIB::inetNetToMediaTable is subid 35 of ip.
     * Its status is Current.
     * OID: .1.3.6.1.2.1.4.35, 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 inetNetToMediaTable registration context.
     */
    typedef netsnmp_data_list inetNetToMediaTable_registration;

/**********************************************************************/
    /*
     * TODO:110:r: |-> Review inetNetToMediaTable data context structure.
     * This structure is used to represent the data for inetNetToMediaTable.
     */
    typedef netsnmp_arp_entry inetNetToMediaTable_data;


    /*
     *********************************************************************
     * TODO:115:o: |-> Review inetNetToMediaTable 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 inetNetToMediaTable_data inetNetToMediaTable_undo_data;

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

        /*
         * inetNetToMediaIfIndex(1)/InterfaceIndex/ASN_INTEGER/long(long)//l/a/w/e/R/d/H
         */
        long            inetNetToMediaIfIndex;

        /*
         * inetNetToMediaNetAddressType(2)/InetAddressType/ASN_INTEGER/long(u_long)//l/a/w/E/r/d/h
         */
        u_long          inetNetToMediaNetAddressType;

        /*
         * inetNetToMediaNetAddress(3)/InetAddress/ASN_OCTET_STR/char(char)//L/a/w/e/R/d/h
         */
        /** 128 - 2(other indexes) - oid length(10) = 115 */
        char            inetNetToMediaNetAddress[115];
        size_t          inetNetToMediaNetAddress_len;


    } inetNetToMediaTable_mib_index;

    /*
     * TODO:121:r: |   |-> Review inetNetToMediaTable max index length.
     * If you KNOW that your indexes will never exceed a certain
     * length, update this macro to that length.
     *
     * BE VERY CAREFUL TO TAKE INTO ACCOUNT THE MAXIMUM
     * POSSIBLE LENGHT FOR EVERY VARIABLE LENGTH INDEX!
     * Guessing 128 - col/entry(2)  - oid len(8)
     */
#define MAX_inetNetToMediaTable_IDX_LEN     118


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

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

        inetNetToMediaTable_mib_index tbl_idx;

        inetNetToMediaTable_data *data;
        inetNetToMediaTable_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 inetNetToMediaTable rowreq context.
         */
        int             inetNetToMediaRowStatus,
            inetNetToMediaRowStatus_undo;

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

    } inetNetToMediaTable_rowreq_ctx;

    typedef struct inetNetToMediaTable_ref_rowreq_ctx_s {
        inetNetToMediaTable_rowreq_ctx *rowreq_ctx;
    } inetNetToMediaTable_ref_rowreq_ctx;

    /*
     *********************************************************************
     * function prototypes
     */
    int
        inetNetToMediaTable_pre_request(inetNetToMediaTable_registration *
                                        user_context);
    int
        inetNetToMediaTable_post_request(inetNetToMediaTable_registration *
                                         user_context, int rc);

    int
        inetNetToMediaTable_rowreq_ctx_init(inetNetToMediaTable_rowreq_ctx
                                            * rowreq_ctx,
                                            void *user_init_ctx);
    void
        inetNetToMediaTable_rowreq_ctx_cleanup
        (inetNetToMediaTable_rowreq_ctx * rowreq_ctx);

    inetNetToMediaTable_data *inetNetToMediaTable_allocate_data(void);
    void
         inetNetToMediaTable_release_data(inetNetToMediaTable_data * data);

    int
        inetNetToMediaTable_check_dependencies
        (inetNetToMediaTable_rowreq_ctx * rowreq_ctx);
    int
        inetNetToMediaTable_commit(inetNetToMediaTable_rowreq_ctx *
                                   rowreq_ctx);

        inetNetToMediaTable_rowreq_ctx
        * inetNetToMediaTable_row_find_by_mib_index
        (inetNetToMediaTable_mib_index * mib_idx);

    extern const oid      inetNetToMediaTable_oid[];
    extern const int      inetNetToMediaTable_oid_size;


#include "inetNetToMediaTable_interface.h"
#include "inetNetToMediaTable_data_access.h"
    /*
     *********************************************************************
     * GET function declarations
     */

    /*
     *********************************************************************
     * GET Table declarations
     */
/**********************************************************************
 **********************************************************************
 ***
 *** Table inetNetToMediaTable
 ***
 **********************************************************************
 **********************************************************************/
    /*
     * IP-MIB::inetNetToMediaTable is subid 35 of ip.
     * Its status is Current.
     * OID: .1.3.6.1.2.1.4.35, length: 8
     */
    /*
     * indexes
     */

    int
        inetNetToMediaPhysAddress_get(inetNetToMediaTable_rowreq_ctx *
                                      rowreq_ctx, char
                                      **inetNetToMediaPhysAddress_val_ptr_ptr,
                                      size_t *
                                      inetNetToMediaPhysAddress_val_ptr_len_ptr);
    int
        inetNetToMediaLastUpdated_get(inetNetToMediaTable_rowreq_ctx *
                                      rowreq_ctx,
                                      u_long *
                                      inetNetToMediaLastUpdated_val_ptr);
    int             inetNetToMediaType_get(inetNetToMediaTable_rowreq_ctx *
                                           rowreq_ctx,
                                           u_long *
                                           inetNetToMediaType_val_ptr);
    int             inetNetToMediaState_get(inetNetToMediaTable_rowreq_ctx
                                            * rowreq_ctx,
                                            u_long *
                                            inetNetToMediaState_val_ptr);

    int
        inetNetToMediaRowStatus_get(inetNetToMediaTable_rowreq_ctx *
                                    rowreq_ctx,
                                    u_long *
                                    inetNetToMediaRowStatus_val_ptr);

    int
        inetNetToMediaRowStatus_set(inetNetToMediaTable_rowreq_ctx *
                                    rowreq_ctx,
                                    u_long
                                    inetNetToMediaRowStatus_val);


    int
        inetNetToMediaTable_indexes_set_tbl_idx
        (inetNetToMediaTable_mib_index * tbl_idx,
         long inetNetToMediaIfIndex_val,
         u_long inetNetToMediaNetAddressType_val,
         char *inetNetToMediaNetAddress_val_ptr,
         size_t inetNetToMediaNetAddress_val_ptr_len);
    int
        inetNetToMediaTable_indexes_set(inetNetToMediaTable_rowreq_ctx *
                                        rowreq_ctx,
                                        long inetNetToMediaIfIndex_val,
                                        u_long
                                        inetNetToMediaNetAddressType_val,
                                        char
                                        *inetNetToMediaNetAddress_val_ptr,
                                        size_t
                                        inetNetToMediaNetAddress_val_ptr_len);



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

    /*
     *********************************************************************
     * SET Table declarations
     */
/**********************************************************************
 **********************************************************************
 ***
 *** Table inetNetToMediaTable
 ***
 **********************************************************************
 **********************************************************************/
    /*
     * IP-MIB::inetNetToMediaTable is subid 35 of ip.
     * Its status is Current.
     * OID: .1.3.6.1.2.1.4.35, length: 8
     */


    int
        inetNetToMediaTable_undo_setup(inetNetToMediaTable_rowreq_ctx *
                                       rowreq_ctx);
    int
        inetNetToMediaTable_undo_cleanup(inetNetToMediaTable_rowreq_ctx *
                                         rowreq_ctx);
    int             inetNetToMediaTable_undo(inetNetToMediaTable_rowreq_ctx
                                             * rowreq_ctx);
    int
        inetNetToMediaTable_commit(inetNetToMediaTable_rowreq_ctx *
                                   rowreq_ctx);
    int
        inetNetToMediaTable_undo_commit(inetNetToMediaTable_rowreq_ctx *
                                        rowreq_ctx);


    int
        inetNetToMediaPhysAddress_check_value
        (inetNetToMediaTable_rowreq_ctx * rowreq_ctx,
         char *inetNetToMediaPhysAddress_val_ptr,
         size_t inetNetToMediaPhysAddress_val_ptr_len);
    int
        inetNetToMediaPhysAddress_undo_setup(inetNetToMediaTable_rowreq_ctx
                                             * rowreq_ctx);
    int
        inetNetToMediaPhysAddress_set(inetNetToMediaTable_rowreq_ctx *
                                      rowreq_ctx, char
                                      *inetNetToMediaPhysAddress_val_ptr,
                                      size_t
                                      inetNetToMediaPhysAddress_val_ptr_len);
    int
        inetNetToMediaPhysAddress_undo(inetNetToMediaTable_rowreq_ctx *
                                       rowreq_ctx);

    int
        inetNetToMediaLastUpdated_check_value
        (inetNetToMediaTable_rowreq_ctx * rowreq_ctx,
         u_long inetNetToMediaLastUpdated_val);
    int
        inetNetToMediaLastUpdated_undo_setup(inetNetToMediaTable_rowreq_ctx
                                             * rowreq_ctx);
    int
        inetNetToMediaLastUpdated_set(inetNetToMediaTable_rowreq_ctx *
                                      rowreq_ctx,
                                      u_long
                                      inetNetToMediaLastUpdated_val);
    int
        inetNetToMediaLastUpdated_undo(inetNetToMediaTable_rowreq_ctx *
                                       rowreq_ctx);

    int
        inetNetToMediaType_check_value(inetNetToMediaTable_rowreq_ctx *
                                       rowreq_ctx,
                                       u_long inetNetToMediaType_val);
    int
        inetNetToMediaType_undo_setup(inetNetToMediaTable_rowreq_ctx *
                                      rowreq_ctx);
    int             inetNetToMediaType_set(inetNetToMediaTable_rowreq_ctx *
                                           rowreq_ctx,
                                           u_long inetNetToMediaType_val);
    int             inetNetToMediaType_undo(inetNetToMediaTable_rowreq_ctx
                                            * rowreq_ctx);

    int
        inetNetToMediaState_check_value(inetNetToMediaTable_rowreq_ctx *
                                        rowreq_ctx,
                                        u_long inetNetToMediaState_val);
    int
        inetNetToMediaState_undo_setup(inetNetToMediaTable_rowreq_ctx *
                                       rowreq_ctx);
    int             inetNetToMediaState_set(inetNetToMediaTable_rowreq_ctx
                                            * rowreq_ctx,
                                            u_long
                                            inetNetToMediaState_val);
    int             inetNetToMediaState_undo(inetNetToMediaTable_rowreq_ctx
                                             * rowreq_ctx);

    int
        inetNetToMediaRowStatus_check_value(inetNetToMediaTable_rowreq_ctx
                                            * rowreq_ctx,
                                            u_long
                                            inetNetToMediaRowStatus_val);
    int
        inetNetToMediaRowStatus_undo_setup(inetNetToMediaTable_rowreq_ctx *
                                           rowreq_ctx);
    int
        inetNetToMediaRowStatus_undo(inetNetToMediaTable_rowreq_ctx *
                                     rowreq_ctx);


    int
        inetNetToMediaTable_check_dependencies
        (inetNetToMediaTable_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                          /* INETNETTOMEDIATABLE_H */
/**  @} */

