/*
 * Note: this file originally auto-generated by mib2c using
 *       version : 14170 $ of $
 *
 * $Id:$
 */
#ifndef IPDEFAULTROUTERTABLE_H
#define IPDEFAULTROUTERTABLE_H

#ifdef __cplusplus
extern          "C" {
#endif


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

    /*
     * other required module components 
     */
    /* *INDENT-OFF*  */
config_require(ip-mib/data_access/defaultrouter)
config_require(ip-mib/ipDefaultRouterTable/ipDefaultRouterTable_interface)
config_require(ip-mib/ipDefaultRouterTable/ipDefaultRouterTable_data_access)
config_require(ip-mib/ipDefaultRouterTable/ipDefaultRouterTable_data_get)
    /* *INDENT-ON*  */

    /*
     * OID and column number definitions for ipDefaultRouterTable 
     */
#include "ipDefaultRouterTable_oids.h"

    /*
     * enum definions 
     */
#include "ipDefaultRouterTable_enums.h"

    /*
     *********************************************************************
     * function declarations
     */
    void            init_ipDefaultRouterTable(void);
    void            shutdown_ipDefaultRouterTable(void);

    /*
     *********************************************************************
     * Table declarations
     */
/**********************************************************************
 **********************************************************************
 ***
 *** Table ipDefaultRouterTable
 ***
 **********************************************************************
 **********************************************************************/
    /*
     * IP-MIB::ipDefaultRouterTable is subid 37 of ip.
     * Its status is Current.
     * OID: .1.3.6.1.2.1.4.37, 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 ipDefaultRouterTable registration context.
     */
    typedef netsnmp_data_list ipDefaultRouterTable_registration;

/**********************************************************************/
    /*
     * TODO:110:r: |-> Review ipDefaultRouterTable data context structure.
     * This structure is used to represent the data for ipDefaultRouterTable.
     */
    typedef netsnmp_defaultrouter_entry ipDefaultRouterTable_data;


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

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

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

        /*
         * ipDefaultRouterIfIndex(3)/InterfaceIndex/ASN_INTEGER/long(long)//l/a/w/e/R/d/H
         */
        long            ipDefaultRouterIfIndex;


    } ipDefaultRouterTable_mib_index;

    /*
     * TODO:121:r: |   |-> Review ipDefaultRouterTable 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_ipDefaultRouterTable_IDX_LEN     118


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

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

        ipDefaultRouterTable_mib_index tbl_idx;

        ipDefaultRouterTable_data *data;

        /*
         * 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 ipDefaultRouterTable rowreq context.
         */

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

    } ipDefaultRouterTable_rowreq_ctx;

    typedef struct ipDefaultRouterTable_ref_rowreq_ctx_s {
        ipDefaultRouterTable_rowreq_ctx *rowreq_ctx;
    } ipDefaultRouterTable_ref_rowreq_ctx;

    /*
     *********************************************************************
     * function prototypes
     */
    int            
        ipDefaultRouterTable_pre_request(ipDefaultRouterTable_registration
                                         * user_context);
    int            
        ipDefaultRouterTable_post_request(ipDefaultRouterTable_registration
                                          * user_context, int rc);

    int            
        ipDefaultRouterTable_rowreq_ctx_init
        (ipDefaultRouterTable_rowreq_ctx * rowreq_ctx,
         void *user_init_ctx);
    void           
        ipDefaultRouterTable_rowreq_ctx_cleanup
        (ipDefaultRouterTable_rowreq_ctx * rowreq_ctx);

    ipDefaultRouterTable_data *ipDefaultRouterTable_allocate_data(void);
    void           
        ipDefaultRouterTable_release_data(ipDefaultRouterTable_data *
                                          data);


    ipDefaultRouterTable_rowreq_ctx
        *ipDefaultRouterTable_row_find_by_mib_index
        (ipDefaultRouterTable_mib_index * mib_idx);

    extern const oid      ipDefaultRouterTable_oid[];
    extern const int      ipDefaultRouterTable_oid_size;


#include "ipDefaultRouterTable_interface.h"
#include "ipDefaultRouterTable_data_access.h"
#include "ipDefaultRouterTable_data_get.h"

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

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